Browse Source

compiler: fix constant globals on AVR

Turn const globals into non-const globals, at least until pointers have
the correct address space attribute.
pull/8/merge
Ayke van Laethem 6 years ago
parent
commit
e04f0868ed
No known key found for this signature in database GPG Key ID: E97FF5335DFDFDED
  1. 11
      compiler.go
  2. 12
      main.go

11
compiler.go

@ -3129,6 +3129,17 @@ func (c *Compiler) ApplyFunctionSections() {
}
}
// Turn all global constants into global variables. This works around a
// limitation on Harvard architectures (e.g. AVR), where constant and
// non-constant pointers point to a different address space.
func (c *Compiler) NonConstGlobals() {
global := c.mod.FirstGlobal()
for !global.IsNil() {
global.SetGlobalConstant(false)
global = llvm.NextGlobal(global)
}
}
func (c *Compiler) Optimize(optLevel, sizeLevel int, inlinerThreshold uint) {
builder := llvm.NewPassManagerBuilder()
defer builder.Dispose()

12
main.go

@ -49,6 +49,18 @@ func Compile(pkgName, outpath string, spec *TargetSpec, printIR, dumpSSA bool, a
return err
}
// On the AVR, pointers can point either to flash or to RAM, but we don't
// know. As a temporary fix, load all global variables in RAM.
// In the future, there should be a compiler pass that determines which
// pointers are flash and which are in RAM so that pointers can have a
// correct address space parameter (address space 1 is for flash).
if strings.HasPrefix(spec.Triple, "avr") {
c.NonConstGlobals()
if err := c.Verify(); err != nil {
return err
}
}
// Generate output.
if strings.HasSuffix(outpath, ".o") {
return c.EmitObject(outpath)

Loading…
Cancel
Save