diff --git a/compiler/compiler.go b/compiler/compiler.go index 4c252d8d..8b430083 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -30,6 +30,7 @@ func init() { type Config struct { Triple string // LLVM target triple, e.g. x86_64-unknown-linux-gnu (empty string means default) CPU string // LLVM CPU name, e.g. atmega328p (empty string means default) + Features []string // LLVM CPU features GOOS string // GOARCH string // GC string // garbage collection strategy @@ -101,7 +102,11 @@ func NewCompiler(pkgName string, config Config) (*Compiler, error) { if err != nil { return nil, err } - c.machine = target.CreateTargetMachine(config.Triple, config.CPU, "", llvm.CodeGenLevelDefault, llvm.RelocStatic, llvm.CodeModelDefault) + features := "" + if len(config.Features) > 0 { + features = strings.Join(config.Features, `,`) + } + c.machine = target.CreateTargetMachine(config.Triple, config.CPU, features, llvm.CodeGenLevelDefault, llvm.RelocStatic, llvm.CodeModelDefault) c.targetData = c.machine.CreateTargetData() c.ctx = llvm.NewContext() diff --git a/main.go b/main.go index d08f3957..6f732b9e 100644 --- a/main.go +++ b/main.go @@ -94,6 +94,7 @@ func Compile(pkgName, outpath string, spec *TargetSpec, config *BuildConfig, act compilerConfig := compiler.Config{ Triple: spec.Triple, CPU: spec.CPU, + Features: spec.Features, GOOS: spec.GOOS, GOARCH: spec.GOARCH, GC: config.gc, diff --git a/target.go b/target.go index f842a1e4..c389b653 100644 --- a/target.go +++ b/target.go @@ -24,6 +24,7 @@ type TargetSpec struct { Inherits []string `json:"inherits"` Triple string `json:"llvm-target"` CPU string `json:"cpu"` + Features []string `json:"features"` GOOS string `json:"goos"` GOARCH string `json:"goarch"` BuildTags []string `json:"build-tags"` @@ -52,6 +53,7 @@ func (spec *TargetSpec) copyProperties(spec2 *TargetSpec) { if spec2.CPU != "" { spec.CPU = spec2.CPU } + spec.Features = append(spec.Features, spec2.Features...) if spec2.GOOS != "" { spec.GOOS = spec2.GOOS }