compiler: move NonConstGlobals pass to transform package

Этот коммит содержится в:
Ayke van Laethem 2020-03-18 20:41:19 +01:00 коммит произвёл Ron Evans
родитель 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 предоставленный Обычный файл
Просмотреть файл

@ -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 предоставленный Обычный файл
Просмотреть файл

@ -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