From 62fb386d57a0080881c756000e42a2c873372eb8 Mon Sep 17 00:00:00 2001 From: Damian Gryski Date: Fri, 28 Apr 2023 23:01:51 -0700 Subject: compiler,reflect: add tagged pointers for **T etc --- compiler/interface.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'compiler') diff --git a/compiler/interface.go b/compiler/interface.go index 6a9e638b5..7b49a81d4 100644 --- a/compiler/interface.go +++ b/compiler/interface.go @@ -127,6 +127,18 @@ func (c *compilerContext) getTypeCode(typ types.Type) llvm.Value { if _, ok := typ.Underlying().(*types.Interface); ok { hasMethodSet = false } + + // Short-circuit all the global pointer logic here for pointers to pointers. + if typ, ok := typ.(*types.Pointer); ok { + if _, ok := typ.Elem().(*types.Pointer); ok { + // For a pointer to a pointer, we just increase the pointer by 1 + ptr := c.getTypeCode(typ.Elem()) + return llvm.ConstGEP(c.ctx.Int8Type(), ptr, []llvm.Value{ + llvm.ConstInt(llvm.Int32Type(), 1, false), + }) + } + } + typeCodeName, isLocal := getTypeCodeName(typ) globalName := "reflect/types.type:" + typeCodeName var global llvm.Value @@ -391,6 +403,9 @@ func (c *compilerContext) getTypeCode(typ types.Type) llvm.Value { }, typeFields...) } alignment := c.targetData.TypeAllocSize(c.i8ptrType) + if alignment < 4 { + alignment = 4 + } globalValue := c.ctx.ConstStruct(typeFields, false) global.SetInitializer(globalValue) if isLocal { -- cgit v1.2.3