ssa: fix llvm named in func
This commit is contained in:
@@ -112,7 +112,8 @@ type aProgram struct {
|
||||
target *Target
|
||||
td llvm.TargetData
|
||||
// tm llvm.TargetMachine
|
||||
named map[string]llvm.Type
|
||||
named map[string]llvm.Type
|
||||
fnnamed map[string]int
|
||||
|
||||
intType llvm.Type
|
||||
int1Type llvm.Type
|
||||
@@ -195,7 +196,7 @@ func NewProgram(target *Target) Program {
|
||||
return &aProgram{
|
||||
ctx: ctx, gocvt: newGoTypes(),
|
||||
target: target, td: td, is32Bits: is32Bits,
|
||||
ptrSize: td.PointerSize(), named: make(map[string]llvm.Type),
|
||||
ptrSize: td.PointerSize(), named: make(map[string]llvm.Type), fnnamed: make(map[string]int),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
12
ssa/type.go
12
ssa/type.go
@@ -451,10 +451,20 @@ func (p Program) retType(raw *types.Signature) Type {
|
||||
}
|
||||
}
|
||||
|
||||
func (p Program) llvmNameOf(named *types.Named) (name string) {
|
||||
name = NameOf(named)
|
||||
if obj := named.Obj(); obj != nil && obj.Parent() != nil && obj.Parent() != obj.Pkg().Scope() {
|
||||
index := p.fnnamed[name]
|
||||
p.fnnamed[name] = index + 1
|
||||
name += fmt.Sprintf("#%v", index)
|
||||
}
|
||||
return name
|
||||
}
|
||||
|
||||
func (p Program) toNamed(raw *types.Named) Type {
|
||||
switch t := raw.Underlying().(type) {
|
||||
case *types.Struct:
|
||||
name := NameOf(raw)
|
||||
name := p.llvmNameOf(raw)
|
||||
return &aType{p.toLLVMNamedStruct(name, t), rawType{raw}, vkStruct}
|
||||
default:
|
||||
typ := p.rawType(t)
|
||||
|
||||
@@ -27,12 +27,12 @@ import (
|
||||
|
||||
type goTypes struct {
|
||||
typs map[unsafe.Pointer]unsafe.Pointer
|
||||
named map[string]*types.Named
|
||||
named map[*types.Named]*types.Named // named => raw
|
||||
}
|
||||
|
||||
func newGoTypes() goTypes {
|
||||
typs := make(map[unsafe.Pointer]unsafe.Pointer)
|
||||
named := make(map[string]*types.Named)
|
||||
named := make(map[*types.Named]*types.Named)
|
||||
return goTypes{typs, named}
|
||||
}
|
||||
|
||||
@@ -121,8 +121,7 @@ func (p goTypes) cvtNamed(t *types.Named) (raw *types.Named, cvt bool) {
|
||||
defer func() {
|
||||
p.typs[unsafe.Pointer(t)] = unsafe.Pointer(raw)
|
||||
}()
|
||||
id := t.String()
|
||||
if named, ok := p.named[id]; ok {
|
||||
if named, ok := p.named[t]; ok {
|
||||
return named, false
|
||||
}
|
||||
|
||||
@@ -133,8 +132,8 @@ func (p goTypes) cvtNamed(t *types.Named) (raw *types.Named, cvt bool) {
|
||||
methods[i] = m
|
||||
}
|
||||
named := types.NewNamed(t.Obj(), types.Typ[types.Int], methods)
|
||||
p.named[id] = named
|
||||
defer delete(p.named, id)
|
||||
p.named[t] = named
|
||||
defer delete(p.named, t)
|
||||
if tund, cvt := p.cvtType(t.Underlying()); cvt {
|
||||
named.SetUnderlying(tund)
|
||||
return named, true
|
||||
|
||||
Reference in New Issue
Block a user