tgo: Remove getGlobalName from Compiler object

Этот коммит содержится в:
Ayke van Laethem 2018-06-03 23:37:15 +02:00
родитель b4e60deacd
коммит 315e39b164
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: E97FF5335DFDFDED

16
tgo.go
Просмотреть файл

@ -350,7 +350,7 @@ func getFunctionName(fn *ssa.Function) string {
} }
} }
func (c *Compiler) getGlobalName(global *ssa.Global) string { func getGlobalName(global *ssa.Global) string {
if strings.HasPrefix(global.Name(), "_extern_") { if strings.HasPrefix(global.Name(), "_extern_") {
return global.Name()[len("_extern_"):] return global.Name()[len("_extern_"):]
} else { } else {
@ -414,10 +414,10 @@ func (c *Compiler) parsePackage(program *ssa.Program, pkg *ssa.Package) error {
if err != nil { if err != nil {
return err return err
} }
global := llvm.AddGlobal(c.mod, llvmType, c.getGlobalName(member)) global := llvm.AddGlobal(c.mod, llvmType, getGlobalName(member))
if !strings.HasPrefix(member.Name(), "_extern_") { if !strings.HasPrefix(member.Name(), "_extern_") {
global.SetLinkage(llvm.PrivateLinkage) global.SetLinkage(llvm.PrivateLinkage)
if c.getGlobalName(member) == "runtime.TargetBits" { if getGlobalName(member) == "runtime.TargetBits" {
bitness := c.targetData.PointerSize() bitness := c.targetData.PointerSize()
if bitness < 32 { if bitness < 32 {
// Only 8 and 32+ architectures supported at the moment. // Only 8 and 32+ architectures supported at the moment.
@ -561,7 +561,7 @@ func (c *Compiler) parseInitFunc(frame *Frame, f *ssa.Function) error {
if err != nil { if err != nil {
return err return err
} }
llvmAddr := c.mod.NamedGlobal(c.getGlobalName(addr)) llvmAddr := c.mod.NamedGlobal(getGlobalName(addr))
llvmAddr.SetInitializer(val) llvmAddr.SetInitializer(val)
case *ssa.FieldAddr: case *ssa.FieldAddr:
// Initialize field of a global struct. // Initialize field of a global struct.
@ -574,7 +574,7 @@ func (c *Compiler) parseInitFunc(frame *Frame, f *ssa.Function) error {
return err return err
} }
global := addr.X.(*ssa.Global) global := addr.X.(*ssa.Global)
llvmAddr := c.mod.NamedGlobal(c.getGlobalName(global)) llvmAddr := c.mod.NamedGlobal(getGlobalName(global))
llvmValue := llvmAddr.Initializer() llvmValue := llvmAddr.Initializer()
if llvmValue.IsNil() { if llvmValue.IsNil() {
llvmValue, err = c.getZeroValue(llvmAddr.Type().ElementType()) llvmValue, err = c.getZeroValue(llvmAddr.Type().ElementType())
@ -596,7 +596,7 @@ func (c *Compiler) parseInitFunc(frame *Frame, f *ssa.Function) error {
} }
fieldAddr := addr.X.(*ssa.FieldAddr) fieldAddr := addr.X.(*ssa.FieldAddr)
global := fieldAddr.X.(*ssa.Global) global := fieldAddr.X.(*ssa.Global)
llvmAddr := c.mod.NamedGlobal(c.getGlobalName(global)) llvmAddr := c.mod.NamedGlobal(getGlobalName(global))
llvmValue := llvmAddr.Initializer() llvmValue := llvmAddr.Initializer()
if llvmValue.IsNil() { if llvmValue.IsNil() {
llvmValue, err = c.getZeroValue(llvmAddr.Type().ElementType()) llvmValue, err = c.getZeroValue(llvmAddr.Type().ElementType())
@ -904,7 +904,7 @@ func (c *Compiler) parseExpr(frame *Frame, expr ssa.Value) (llvm.Value, error) {
} }
return c.builder.CreateGEP(val, indices, ""), nil return c.builder.CreateGEP(val, indices, ""), nil
case *ssa.Global: case *ssa.Global:
fullName := c.getGlobalName(expr) fullName := getGlobalName(expr)
value := c.mod.NamedGlobal(fullName) value := c.mod.NamedGlobal(fullName)
if value.IsNil() { if value.IsNil() {
return llvm.Value{}, errors.New("global not found: " + fullName) return llvm.Value{}, errors.New("global not found: " + fullName)
@ -1256,7 +1256,7 @@ func (c *Compiler) parseUnOp(frame *Frame, unop *ssa.UnOp) (llvm.Value, error) {
// Magic type name: treat the value as a register pointer. // Magic type name: treat the value as a register pointer.
register := unop.X.(*ssa.FieldAddr) register := unop.X.(*ssa.FieldAddr)
global := register.X.(*ssa.Global) global := register.X.(*ssa.Global)
llvmGlobal := c.mod.NamedGlobal(c.getGlobalName(global)) llvmGlobal := c.mod.NamedGlobal(getGlobalName(global))
llvmAddr := c.builder.CreateExtractValue(llvmGlobal.Initializer(), register.Field, "") llvmAddr := c.builder.CreateExtractValue(llvmGlobal.Initializer(), register.Field, "")
ptr := llvm.ConstIntToPtr(llvmAddr, x.Type()) ptr := llvm.ConstIntToPtr(llvmAddr, x.Type())
load := c.builder.CreateLoad(ptr, "") load := c.builder.CreateLoad(ptr, "")