diff --git a/ssa/package.go b/ssa/package.go index 12bc7df4..5410a302 100644 --- a/ssa/package.go +++ b/ssa/package.go @@ -110,6 +110,9 @@ type aProgram struct { voidType llvm.Type voidPtrTy llvm.Type + rtIfaceTy llvm.Type + rtSliceTy llvm.Type + anyTy Type voidTy Type boolTy Type @@ -144,10 +147,28 @@ func (p Program) runtime() *types.Scope { return p.rt } -func (p Program) rtType(name string) *types.Named { +func (p Program) rtNamed(name string) *types.Named { return p.runtime().Lookup(name).Type().(*types.Named) } +func (p Program) rtType(name string) Type { + return p.Type(p.rtNamed(name)) +} + +func (p Program) rtIface() llvm.Type { + if p.rtIfaceTy.IsNil() { + p.rtIfaceTy = p.rtType("Interface").ll + } + return p.rtIfaceTy +} + +func (p Program) rtSlice() llvm.Type { + if p.rtSliceTy.IsNil() { + p.rtSliceTy = p.rtType("Slice").ll + } + return p.rtSliceTy +} + // NewPackage creates a new package. func (p Program) NewPackage(name, pkgPath string) Package { mod := p.ctx.NewModule(pkgPath) diff --git a/ssa/type.go b/ssa/type.go index 6e5030f4..90978212 100644 --- a/ssa/type.go +++ b/ssa/type.go @@ -242,9 +242,9 @@ func (p Program) toLLVMType(typ types.Type) Type { elem := p.Type(t.Elem()) return &aType{llvm.PointerType(elem.ll, 0), typ, vkInvalid} case *types.Interface: - return p.toLLVMNamed(p.rtType("Interface")) + return &aType{p.rtIface(), typ, vkInvalid} case *types.Slice: - return p.toLLVMNamed(p.rtType("Slice")) + return &aType{p.rtSlice(), typ, vkInvalid} case *types.Map: case *types.Struct: return p.toLLVMStruct(t)