diff options
author | Ayke van Laethem <[email protected]> | 2019-04-21 14:34:37 +0200 |
---|---|---|
committer | Ron Evans <[email protected]> | 2019-04-26 08:52:10 +0200 |
commit | c25fe609a9d1431e43c39fa8f0816b83ee6e7f1e (patch) | |
tree | eea8e51a051e24346c7cc0270064d422b2060406 /compiler/func.go | |
parent | 6d2380921818fdbbdbca0db6c1ef732654792d58 (diff) | |
download | tinygo-c25fe609a9d1431e43c39fa8f0816b83ee6e7f1e.tar.gz tinygo-c25fe609a9d1431e43c39fa8f0816b83ee6e7f1e.zip |
compiler: do not return an error from getLLVMType
This commit replaces "unknown type" errors in getLLVMType with panics.
The main reason this is done is that it simplifies the code *a lot*.
Many `if err != nil` lines were there just because of type information.
Additionally, simply panicking is probably a better approach as the only
way this error can be produced is either with big new language features
or a serious compiler bug. Panicking is probably a better way to handle
this error anyway.
Diffstat (limited to 'compiler/func.go')
-rw-r--r-- | compiler/func.go | 53 |
1 files changed, 15 insertions, 38 deletions
diff --git a/compiler/func.go b/compiler/func.go index 29ceb6131..f10da1152 100644 --- a/compiler/func.go +++ b/compiler/func.go @@ -41,7 +41,7 @@ func (c *Compiler) funcImplementation() funcValueImplementation { // createFuncValue creates a function value from a raw function pointer with no // context. -func (c *Compiler) createFuncValue(funcPtr, context llvm.Value, sig *types.Signature) (llvm.Value, error) { +func (c *Compiler) createFuncValue(funcPtr, context llvm.Value, sig *types.Signature) llvm.Value { var funcValueScalar llvm.Value switch c.funcImplementation() { case funcValueDoubleword: @@ -66,14 +66,11 @@ func (c *Compiler) createFuncValue(funcPtr, context llvm.Value, sig *types.Signa default: panic("unimplemented func value variant") } - funcValueType, err := c.getFuncType(sig) - if err != nil { - return llvm.Value{}, err - } + funcValueType := c.getFuncType(sig) funcValue := llvm.Undef(funcValueType) funcValue = c.builder.CreateInsertValue(funcValue, context, 0, "") funcValue = c.builder.CreateInsertValue(funcValue, funcValueScalar, 1, "") - return funcValue, nil + return funcValue } // getFuncSignature returns a global for identification of a particular function @@ -112,10 +109,7 @@ func (c *Compiler) decodeFuncValue(funcValue llvm.Value, sig *types.Signature) ( case funcValueDoubleword: funcPtr = c.builder.CreateExtractValue(funcValue, 1, "") case funcValueSwitch: - llvmSig, err := c.getRawFuncType(sig) - if err != nil { - return llvm.Value{}, llvm.Value{}, err - } + llvmSig := c.getRawFuncType(sig) sigGlobal := c.getFuncSignature(sig) funcPtr = c.createRuntimeCall("getFuncPtr", []llvm.Value{funcValue, sigGlobal}, "") funcPtr = c.builder.CreateIntToPtr(funcPtr, llvmSig, "") @@ -126,25 +120,21 @@ func (c *Compiler) decodeFuncValue(funcValue llvm.Value, sig *types.Signature) ( } // getFuncType returns the type of a func value given a signature. -func (c *Compiler) getFuncType(typ *types.Signature) (llvm.Type, error) { +func (c *Compiler) getFuncType(typ *types.Signature) llvm.Type { switch c.funcImplementation() { case funcValueDoubleword: - rawPtr, err := c.getRawFuncType(typ) - if err != nil { - return llvm.Type{}, err - } - return c.ctx.StructType([]llvm.Type{c.i8ptrType, rawPtr}, false), nil + rawPtr := c.getRawFuncType(typ) + return c.ctx.StructType([]llvm.Type{c.i8ptrType, rawPtr}, false) case funcValueSwitch: - return c.mod.GetTypeByName("runtime.funcValue"), nil + return c.mod.GetTypeByName("runtime.funcValue") default: panic("unimplemented func value variant") } } // getRawFuncType returns a LLVM function pointer type for a given signature. -func (c *Compiler) getRawFuncType(typ *types.Signature) (llvm.Type, error) { +func (c *Compiler) getRawFuncType(typ *types.Signature) llvm.Type { // Get the return type. - var err error var returnType llvm.Type switch typ.Results().Len() { case 0: @@ -152,21 +142,14 @@ func (c *Compiler) getRawFuncType(typ *types.Signature) (llvm.Type, error) { returnType = c.ctx.VoidType() case 1: // Just one return value. - returnType, err = c.getLLVMType(typ.Results().At(0).Type()) - if err != nil { - return llvm.Type{}, err - } + returnType = c.getLLVMType(typ.Results().At(0).Type()) default: // Multiple return values. Put them together in a struct. // This appears to be the common way to handle multiple return values in // LLVM. members := make([]llvm.Type, typ.Results().Len()) for i := 0; i < typ.Results().Len(); i++ { - returnType, err := c.getLLVMType(typ.Results().At(i).Type()) - if err != nil { - return llvm.Type{}, err - } - members[i] = returnType + members[i] = c.getLLVMType(typ.Results().At(i).Type()) } returnType = c.ctx.StructType(members, false) } @@ -174,10 +157,7 @@ func (c *Compiler) getRawFuncType(typ *types.Signature) (llvm.Type, error) { // Get the parameter types. var paramTypes []llvm.Type if typ.Recv() != nil { - recv, err := c.getLLVMType(typ.Recv().Type()) - if err != nil { - return llvm.Type{}, err - } + recv := c.getLLVMType(typ.Recv().Type()) if recv.StructName() == "runtime._interface" { // This is a call on an interface, not a concrete type. // The receiver is not an interface, but a i8* type. @@ -186,10 +166,7 @@ func (c *Compiler) getRawFuncType(typ *types.Signature) (llvm.Type, error) { paramTypes = append(paramTypes, c.expandFormalParamType(recv)...) } for i := 0; i < typ.Params().Len(); i++ { - subType, err := c.getLLVMType(typ.Params().At(i).Type()) - if err != nil { - return llvm.Type{}, err - } + subType := c.getLLVMType(typ.Params().At(i).Type()) paramTypes = append(paramTypes, c.expandFormalParamType(subType)...) } // All functions take these parameters at the end. @@ -197,7 +174,7 @@ func (c *Compiler) getRawFuncType(typ *types.Signature) (llvm.Type, error) { paramTypes = append(paramTypes, c.i8ptrType) // parent coroutine // Make a func type out of the signature. - return llvm.PointerType(llvm.FunctionType(returnType, paramTypes, false), c.funcPtrAddrSpace), nil + return llvm.PointerType(llvm.FunctionType(returnType, paramTypes, false), c.funcPtrAddrSpace) } // parseMakeClosure makes a function value (with context) from the given @@ -261,5 +238,5 @@ func (c *Compiler) parseMakeClosure(frame *Frame, expr *ssa.MakeClosure) (llvm.V } // Create the closure. - return c.createFuncValue(f.LLVMFn, context, f.Signature) + return c.createFuncValue(f.LLVMFn, context, f.Signature), nil } |