compiler: refactor some code for the next commit
This is a pure refactor, it doesn't change the behavior of anything. It's separate from the next commit so that the actual changes are easier to read.
Этот коммит содержится в:
		
							родитель
							
								
									783c6a813a
								
							
						
					
					
						коммит
						5c622cfc43
					
				
					 2 изменённых файлов: 21 добавлений и 20 удалений
				
			
		|  | @ -195,3 +195,22 @@ func SplitBasicBlock(builder llvm.Builder, afterInst llvm.Value, insertAfter llv | ||||||
| 
 | 
 | ||||||
| 	return newBlock | 	return newBlock | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // Append the given values to the llvm.used array. The values can be any pointer | ||||||
|  | // type, they will be bitcast to i8*. | ||||||
|  | func AppendToUsedGlobals(mod llvm.Module, values ...llvm.Value) { | ||||||
|  | 	if !mod.NamedGlobal("llvm.used").IsNil() { | ||||||
|  | 		// Sanity check. TODO: we don't emit such a global at the moment, but | ||||||
|  | 		// when we do we should append to it instead. | ||||||
|  | 		panic("todo: append to existing llvm.used") | ||||||
|  | 	} | ||||||
|  | 	i8ptrType := llvm.PointerType(mod.Context().Int8Type(), 0) | ||||||
|  | 	var castValues []llvm.Value | ||||||
|  | 	for _, value := range values { | ||||||
|  | 		castValues = append(castValues, llvm.ConstBitCast(value, i8ptrType)) | ||||||
|  | 	} | ||||||
|  | 	usedInitializer := llvm.ConstArray(i8ptrType, castValues) | ||||||
|  | 	used := llvm.AddGlobal(mod, usedInitializer.Type(), "llvm.used") | ||||||
|  | 	used.SetInitializer(usedInitializer) | ||||||
|  | 	used.SetLinkage(llvm.AppendingLinkage) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ package transform | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"github.com/tinygo-org/tinygo/compileopts" | 	"github.com/tinygo-org/tinygo/compileopts" | ||||||
|  | 	"github.com/tinygo-org/tinygo/compiler/llvmutil" | ||||||
| 	"tinygo.org/x/go-llvm" | 	"tinygo.org/x/go-llvm" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -52,7 +53,7 @@ func CreateStackSizeLoads(mod llvm.Module, config *compileopts.Config) []string | ||||||
| 	stackSizesGlobal.SetInitializer(llvm.ConstArray(functions[0].Type(), defaultStackSizes)) | 	stackSizesGlobal.SetInitializer(llvm.ConstArray(functions[0].Type(), defaultStackSizes)) | ||||||
| 
 | 
 | ||||||
| 	// Add all relevant values to llvm.used (for LTO). | 	// Add all relevant values to llvm.used (for LTO). | ||||||
| 	appendToUsedGlobals(mod, append([]llvm.Value{stackSizesGlobal}, functionValues...)...) | 	llvmutil.AppendToUsedGlobals(mod, append([]llvm.Value{stackSizesGlobal}, functionValues...)...) | ||||||
| 
 | 
 | ||||||
| 	// Replace the calls with loads from the new global with stack sizes. | 	// Replace the calls with loads from the new global with stack sizes. | ||||||
| 	irbuilder := ctx.NewBuilder() | 	irbuilder := ctx.NewBuilder() | ||||||
|  | @ -72,22 +73,3 @@ func CreateStackSizeLoads(mod llvm.Module, config *compileopts.Config) []string | ||||||
| 
 | 
 | ||||||
| 	return functionNames | 	return functionNames | ||||||
| } | } | ||||||
| 
 |  | ||||||
| // Append the given values to the llvm.used array. The values can be any pointer |  | ||||||
| // type, they will be bitcast to i8*. |  | ||||||
| func appendToUsedGlobals(mod llvm.Module, values ...llvm.Value) { |  | ||||||
| 	if !mod.NamedGlobal("llvm.used").IsNil() { |  | ||||||
| 		// Sanity check. TODO: we don't emit such a global at the moment, but |  | ||||||
| 		// when we do we should append to it instead. |  | ||||||
| 		panic("todo: append to existing llvm.used") |  | ||||||
| 	} |  | ||||||
| 	i8ptrType := llvm.PointerType(mod.Context().Int8Type(), 0) |  | ||||||
| 	var castValues []llvm.Value |  | ||||||
| 	for _, value := range values { |  | ||||||
| 		castValues = append(castValues, llvm.ConstBitCast(value, i8ptrType)) |  | ||||||
| 	} |  | ||||||
| 	usedInitializer := llvm.ConstArray(i8ptrType, castValues) |  | ||||||
| 	used := llvm.AddGlobal(mod, usedInitializer.Type(), "llvm.used") |  | ||||||
| 	used.SetInitializer(usedInitializer) |  | ||||||
| 	used.SetLinkage(llvm.AppendingLinkage) |  | ||||||
| } |  | ||||||
|  |  | ||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 Ayke van Laethem
						Ayke van Laethem