mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-17 03:03:27 +00:00
compiler: move NonConstGlobals pass to transform package
This commit is contained in:
committed by
Ron Evans
parent
b6314fa6ab
commit
c5cb2cec9b
+1
-1
@@ -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
@@ -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
@@ -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
|
||||||
Reference in New Issue
Block a user