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
|
||||
}
|
||||
|
||||
// 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 (
|
||||
"github.com/tinygo-org/tinygo/compileopts"
|
||||
"github.com/tinygo-org/tinygo/compiler/llvmutil"
|
||||
"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))
|
||||
|
||||
// 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.
|
||||
irbuilder := ctx.NewBuilder()
|
||||
|
@ -72,22 +73,3 @@ func CreateStackSizeLoads(mod llvm.Module, config *compileopts.Config) []string
|
|||
|
||||
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)
|
||||
}
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче