compiler: fix constant globals on AVR
Turn const globals into non-const globals, at least until pointers have the correct address space attribute.
Этот коммит содержится в:
родитель
a02426948b
коммит
e04f0868ed
2 изменённых файлов: 23 добавлений и 0 удалений
11
compiler.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
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)
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче