github.com/tinygo-org/tinygo@v0.31.3-0.20240404173401-90b0bf646c27/transform/transform.go (about)

     1  // Package transform contains transformation passes for the TinyGo compiler.
     2  // These transformation passes may be optimization passes or lowering passes.
     3  //
     4  // Optimization passes transform the IR in such a way that they increase the
     5  // performance of the generated code and/or help the LLVM optimizer better do
     6  // its job by simplifying the IR. This usually means that certain
     7  // TinyGo-specific runtime calls are removed or replaced with something simpler
     8  // if that is a valid operation.
     9  //
    10  // Lowering passes are usually required to run. One example is the interface
    11  // lowering pass, which replaces stub runtime calls to get an interface method
    12  // with the method implementation (either a direct call or a thunk).
    13  package transform
    14  
    15  import (
    16  	"github.com/tinygo-org/tinygo/compileopts"
    17  	"tinygo.org/x/go-llvm"
    18  )
    19  
    20  // AddStandardAttributes is a helper function to add standard function
    21  // attributes to a function. For example, it adds optsize when requested from
    22  // the -opt= compiler flag.
    23  func AddStandardAttributes(fn llvm.Value, config *compileopts.Config) {
    24  	ctx := fn.Type().Context()
    25  	_, _, sizeLevel := config.OptLevel()
    26  	if sizeLevel >= 1 {
    27  		fn.AddFunctionAttr(ctx.CreateEnumAttribute(llvm.AttributeKindID("optsize"), 0))
    28  	}
    29  	if sizeLevel >= 2 {
    30  		fn.AddFunctionAttr(ctx.CreateEnumAttribute(llvm.AttributeKindID("minsize"), 0))
    31  	}
    32  	if config.CPU() != "" {
    33  		fn.AddFunctionAttr(ctx.CreateStringAttribute("target-cpu", config.CPU()))
    34  	}
    35  	if config.Features() != "" {
    36  		fn.AddFunctionAttr(ctx.CreateStringAttribute("target-features", config.Features()))
    37  	}
    38  }