From b79bf29c110191140b2f9ac0b1085127d66c36c7 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Tue, 20 Sep 2022 23:59:22 +0200 Subject: [PATCH] compiler: return a FunctionType (not a PointerType) in getRawFuncType This is necessary for opaque pointer support (in LLVM 15). --- compiler/func.go | 4 ++-- compiler/interface.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/compiler/func.go b/compiler/func.go index 75656cb7..a8b2874e 100644 --- a/compiler/func.go +++ b/compiler/func.go @@ -62,7 +62,7 @@ func (b *builder) decodeFuncValue(funcValue llvm.Value, sig *types.Signature) (f funcPtr = bitcast.Operand(0) return } - llvmSig := b.getRawFuncType(sig) + llvmSig := llvm.PointerType(b.getRawFuncType(sig), b.funcPtrAddrSpace) funcPtr = b.CreateBitCast(bitcast, llvmSig, "") return } @@ -117,7 +117,7 @@ func (c *compilerContext) getRawFuncType(typ *types.Signature) llvm.Type { paramTypes = append(paramTypes, c.i8ptrType) // context // Make a func type out of the signature. - return llvm.PointerType(llvm.FunctionType(returnType, paramTypes, false), c.funcPtrAddrSpace) + return llvm.FunctionType(returnType, paramTypes, false) } // parseMakeClosure makes a function value (with context) from the given diff --git a/compiler/interface.go b/compiler/interface.go index c59a9ade..b0ea71e3 100644 --- a/compiler/interface.go +++ b/compiler/interface.go @@ -465,7 +465,7 @@ func (c *compilerContext) getInvokeFunction(instr *ssa.CallCommon) llvm.Value { paramTuple = append(paramTuple, sig.Params().At(i)) } paramTuple = append(paramTuple, types.NewVar(token.NoPos, nil, "$typecode", types.Typ[types.Uintptr])) - llvmFnType := c.getRawFuncType(types.NewSignature(sig.Recv(), types.NewTuple(paramTuple...), sig.Results(), false)).ElementType() + llvmFnType := c.getRawFuncType(types.NewSignature(sig.Recv(), types.NewTuple(paramTuple...), sig.Results(), false)) llvmFn = llvm.AddFunction(c.mod, fnName, llvmFnType) c.addStandardDeclaredAttributes(llvmFn) llvmFn.AddFunctionAttr(c.ctx.CreateStringAttribute("tinygo-invoke", c.getMethodSignatureName(instr.Method)))