compiler: move NonConstGlobals pass to transform package
Этот коммит содержится в:
родитель
b6314fa6ab
коммит
c5cb2cec9b
6 изменённых файлов: 31 добавлений и 12 удалений
|
@ -98,7 +98,7 @@ func Build(pkgName, outpath string, config *compileopts.Config, action func(stri
|
||||||
// pointers are flash and which are in RAM so that pointers can have a
|
// pointers are flash and which are in RAM so that pointers can have a
|
||||||
// correct address space parameter (address space 1 is for flash).
|
// correct address space parameter (address space 1 is for flash).
|
||||||
if strings.HasPrefix(config.Triple(), "avr") {
|
if strings.HasPrefix(config.Triple(), "avr") {
|
||||||
c.NonConstGlobals()
|
transform.NonConstGlobals(c.Module())
|
||||||
if err := c.Verify(); err != nil {
|
if err := c.Verify(); err != nil {
|
||||||
return errors.New("verification error after making all globals non-constant on AVR")
|
return errors.New("verification error after making all globals non-constant on AVR")
|
||||||
}
|
}
|
||||||
|
|
|
@ -2585,17 +2585,6 @@ func (c *Compiler) Verify() error {
|
||||||
return llvm.VerifyModule(c.mod, llvm.PrintMessageAction)
|
return llvm.VerifyModule(c.mod, llvm.PrintMessageAction)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Emit object file (.o).
|
// Emit object file (.o).
|
||||||
func (c *Compiler) EmitObject(path string) error {
|
func (c *Compiler) EmitObject(path string) error {
|
||||||
llvmBuf, err := c.machine.EmitToMemoryBuffer(c.mod, llvm.ObjectFile)
|
llvmBuf, err := c.machine.EmitToMemoryBuffer(c.mod, llvm.ObjectFile)
|
||||||
|
|
|
@ -18,3 +18,16 @@ func ApplyFunctionSections(mod llvm.Module) {
|
||||||
llvmFn = llvm.NextFunction(llvmFn)
|
llvmFn = llvm.NextFunction(llvmFn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NonConstGlobals turns 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. Normal pointer
|
||||||
|
// behavior is restored by using the data space only, at the cost of RAM for
|
||||||
|
// constant global variables.
|
||||||
|
func NonConstGlobals(mod llvm.Module) {
|
||||||
|
global := mod.FirstGlobal()
|
||||||
|
for !global.IsNil() {
|
||||||
|
global.SetGlobalConstant(false)
|
||||||
|
global = llvm.NextGlobal(global)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -12,3 +12,10 @@ func TestApplyFunctionSections(t *testing.T) {
|
||||||
ApplyFunctionSections(mod)
|
ApplyFunctionSections(mod)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNonConstGlobals(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
testTransform(t, "testdata/globals-non-const", func(mod llvm.Module) {
|
||||||
|
NonConstGlobals(mod)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
5
transform/testdata/globals-non-const.ll
предоставленный
Обычный файл
5
transform/testdata/globals-non-const.ll
предоставленный
Обычный файл
|
@ -0,0 +1,5 @@
|
||||||
|
target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
|
||||||
|
target triple = "armv7em-none-eabi"
|
||||||
|
|
||||||
|
@globalIntConst = constant i32 3
|
||||||
|
@globalIntVar = global i32 5
|
5
transform/testdata/globals-non-const.out.ll
предоставленный
Обычный файл
5
transform/testdata/globals-non-const.out.ll
предоставленный
Обычный файл
|
@ -0,0 +1,5 @@
|
||||||
|
target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
|
||||||
|
target triple = "armv7em-none-eabi"
|
||||||
|
|
||||||
|
@globalIntConst = global i32 3
|
||||||
|
@globalIntVar = global i32 5
|
Загрузка…
Создание таблицы
Сослаться в новой задаче