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
|
||||
// correct address space parameter (address space 1 is for flash).
|
||||
if strings.HasPrefix(config.Triple(), "avr") {
|
||||
c.NonConstGlobals()
|
||||
transform.NonConstGlobals(c.Module())
|
||||
if err := c.Verify(); err != nil {
|
||||
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)
|
||||
}
|
||||
|
||||
// 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).
|
||||
func (c *Compiler) EmitObject(path string) error {
|
||||
llvmBuf, err := c.machine.EmitToMemoryBuffer(c.mod, llvm.ObjectFile)
|
||||
|
|
|
@ -18,3 +18,16 @@ func ApplyFunctionSections(mod llvm.Module) {
|
|||
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)
|
||||
})
|
||||
}
|
||||
|
||||
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
|
Загрузка…
Создание таблицы
Сослаться в новой задаче