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 }