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
 | 
			
		||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче