diff --git a/internal/abi/llgo_autogen.ll b/internal/abi/llgo_autogen.ll new file mode 100644 index 00000000..0671895b --- /dev/null +++ b/internal/abi/llgo_autogen.ll @@ -0,0 +1,636 @@ +; ModuleID = 'github.com/goplus/llgo/internal/abi' +source_filename = "github.com/goplus/llgo/internal/abi" + +%"github.com/goplus/llgo/internal/abi.ArrayType" = type { %"github.com/goplus/llgo/internal/abi.Type", ptr, ptr, i64 } +%"github.com/goplus/llgo/internal/abi.Type" = type { i64, i64, i32, i8, i8, i8, i8, ptr, ptr, i32, i32 } +%"github.com/goplus/llgo/internal/abi.ChanType" = type { %"github.com/goplus/llgo/internal/abi.Type", ptr, i64 } +%"github.com/goplus/llgo/internal/abi.FuncType" = type { %"github.com/goplus/llgo/internal/abi.Type", i16, i16 } +%"github.com/goplus/llgo/internal/abi.InterfaceType" = type { %"github.com/goplus/llgo/internal/abi.Type", %"github.com/goplus/llgo/internal/abi.Name", %"github.com/goplus/llgo/internal/runtime.Slice" } +%"github.com/goplus/llgo/internal/abi.Name" = type { ptr } +%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 } +%"github.com/goplus/llgo/internal/abi.MapType" = type { %"github.com/goplus/llgo/internal/abi.Type", ptr, ptr, ptr, ptr, i8, i8, i16, i32 } +%"github.com/goplus/llgo/internal/abi.PtrType" = type { %"github.com/goplus/llgo/internal/abi.Type", ptr } +%"github.com/goplus/llgo/internal/abi.SliceType" = type { %"github.com/goplus/llgo/internal/abi.Type", ptr } +%"github.com/goplus/llgo/internal/abi.StructType" = type { %"github.com/goplus/llgo/internal/abi.Type", %"github.com/goplus/llgo/internal/abi.Name", %"github.com/goplus/llgo/internal/runtime.Slice" } + +@"github.com/goplus/llgo/internal/abi.init$guard" = global ptr null + +define ptr @"(*github.com/goplus/llgo/internal/abi.ArrayType).ArrayType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ArrayType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).ArrayType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.ArrayType).Common"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ArrayType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).Common"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.ArrayType).FuncType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ArrayType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).FuncType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.ArrayType).InterfaceType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ArrayType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).InterfaceType"(ptr %1) + ret ptr %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.ArrayType).Kind"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ArrayType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %1) + ret i64 %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.ArrayType).MapType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ArrayType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).MapType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.ArrayType).StructType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ArrayType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).StructType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.ChanType).ArrayType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ChanType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).ArrayType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.ChanType).Common"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ChanType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).Common"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.ChanType).FuncType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ChanType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).FuncType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.ChanType).InterfaceType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ChanType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).InterfaceType"(ptr %1) + ret ptr %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.ChanType).Kind"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ChanType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %1) + ret i64 %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.ChanType).Len"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ChanType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Len"(ptr %1) + ret i64 %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.ChanType).MapType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ChanType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).MapType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.ChanType).StructType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ChanType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).StructType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.FuncType).ArrayType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.FuncType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).ArrayType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.FuncType).Common"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.FuncType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).Common"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.FuncType).Elem"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.FuncType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).Elem"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.FuncType).FuncType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.FuncType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).FuncType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.FuncType).InterfaceType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.FuncType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).InterfaceType"(ptr %1) + ret ptr %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.FuncType).Kind"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.FuncType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %1) + ret i64 %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.FuncType).Len"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.FuncType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Len"(ptr %1) + ret i64 %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.FuncType).MapType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.FuncType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).MapType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.FuncType).StructType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.FuncType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).StructType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.InterfaceType).ArrayType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.InterfaceType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).ArrayType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.InterfaceType).Common"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.InterfaceType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).Common"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.InterfaceType).Elem"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.InterfaceType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).Elem"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.InterfaceType).FuncType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.InterfaceType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).FuncType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.InterfaceType).InterfaceType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.InterfaceType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).InterfaceType"(ptr %1) + ret ptr %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.InterfaceType).Kind"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.InterfaceType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %1) + ret i64 %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.InterfaceType).Len"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.InterfaceType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Len"(ptr %1) + ret i64 %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.InterfaceType).MapType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.InterfaceType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).MapType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.InterfaceType).StructType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.InterfaceType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).StructType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.MapType).ArrayType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.MapType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).ArrayType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.MapType).Common"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.MapType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).Common"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.MapType).FuncType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.MapType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).FuncType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.MapType).InterfaceType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.MapType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).InterfaceType"(ptr %1) + ret ptr %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.MapType).Kind"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.MapType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %1) + ret i64 %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.MapType).Len"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.MapType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Len"(ptr %1) + ret i64 %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.MapType).MapType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.MapType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).MapType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.MapType).StructType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.MapType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).StructType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.PtrType).ArrayType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.PtrType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).ArrayType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.PtrType).Common"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.PtrType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).Common"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.PtrType).FuncType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.PtrType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).FuncType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.PtrType).InterfaceType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.PtrType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).InterfaceType"(ptr %1) + ret ptr %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.PtrType).Kind"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.PtrType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %1) + ret i64 %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.PtrType).Len"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.PtrType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Len"(ptr %1) + ret i64 %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.PtrType).MapType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.PtrType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).MapType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.PtrType).StructType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.PtrType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).StructType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.SliceType).ArrayType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.SliceType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).ArrayType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.SliceType).Common"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.SliceType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).Common"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.SliceType).FuncType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.SliceType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).FuncType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.SliceType).InterfaceType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.SliceType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).InterfaceType"(ptr %1) + ret ptr %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.SliceType).Kind"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.SliceType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %1) + ret i64 %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.SliceType).Len"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.SliceType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Len"(ptr %1) + ret i64 %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.SliceType).MapType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.SliceType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).MapType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.SliceType).StructType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.SliceType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).StructType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.StructType).ArrayType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.StructType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).ArrayType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.StructType).Common"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.StructType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).Common"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.StructType).Elem"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.StructType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).Elem"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.StructType).FuncType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.StructType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).FuncType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.StructType).InterfaceType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.StructType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).InterfaceType"(ptr %1) + ret ptr %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.StructType).Kind"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.StructType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %1) + ret i64 %2 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.StructType).Len"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.StructType", ptr %0, i32 0, i32 0 + %2 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Len"(ptr %1) + ret i64 %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.StructType).MapType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.StructType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).MapType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.StructType).StructType"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.StructType", ptr %0, i32 0, i32 0 + %2 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).StructType"(ptr %1) + ret ptr %2 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.Type).ArrayType"(ptr %0) { +_llgo_0: + %1 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %0) + %2 = icmp ne i64 %1, 17 + br i1 %2, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + ret ptr null + +_llgo_2: ; preds = %_llgo_0 + ret ptr %0 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.Type).Common"(ptr %0) { +_llgo_0: + ret ptr %0 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.Type).Elem"(ptr %0) { +_llgo_0: + %1 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %0) + %2 = icmp eq i64 %1, 17 + br i1 %2, label %_llgo_1, label %_llgo_3 + +_llgo_1: ; preds = %_llgo_0 + %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ArrayType", ptr %0, i32 0, i32 1 + %4 = load ptr, ptr %3, align 8 + ret ptr %4 + +_llgo_2: ; preds = %_llgo_3 + %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ChanType", ptr %0, i32 0, i32 1 + %6 = load ptr, ptr %5, align 8 + ret ptr %6 + +_llgo_3: ; preds = %_llgo_0 + %7 = icmp eq i64 %1, 18 + br i1 %7, label %_llgo_2, label %_llgo_5 + +_llgo_4: ; preds = %_llgo_5 + %8 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.MapType", ptr %0, i32 0, i32 2 + %9 = load ptr, ptr %8, align 8 + ret ptr %9 + +_llgo_5: ; preds = %_llgo_3 + %10 = icmp eq i64 %1, 21 + br i1 %10, label %_llgo_4, label %_llgo_7 + +_llgo_6: ; preds = %_llgo_7 + %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.PtrType", ptr %0, i32 0, i32 1 + %12 = load ptr, ptr %11, align 8 + ret ptr %12 + +_llgo_7: ; preds = %_llgo_5 + %13 = icmp eq i64 %1, 22 + br i1 %13, label %_llgo_6, label %_llgo_9 + +_llgo_8: ; preds = %_llgo_9 + %14 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.SliceType", ptr %0, i32 0, i32 1 + %15 = load ptr, ptr %14, align 8 + ret ptr %15 + +_llgo_9: ; preds = %_llgo_7 + %16 = icmp eq i64 %1, 23 + br i1 %16, label %_llgo_8, label %_llgo_10 + +_llgo_10: ; preds = %_llgo_9 + ret ptr null +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.Type).FuncType"(ptr %0) { +_llgo_0: + %1 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %0) + %2 = icmp ne i64 %1, 19 + br i1 %2, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + ret ptr null + +_llgo_2: ; preds = %_llgo_0 + ret ptr %0 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.Type).InterfaceType"(ptr %0) { +_llgo_0: + %1 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %0) + %2 = icmp ne i64 %1, 20 + br i1 %2, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + ret ptr null + +_llgo_2: ; preds = %_llgo_0 + ret ptr %0 +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %0) { +_llgo_0: + %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %0, i32 0, i32 6 + %2 = load i8, ptr %1, align 1 + %3 = and i8 %2, 31 + %castInt = sext i8 %3 to i64 + ret i64 %castInt +} + +define i64 @"(*github.com/goplus/llgo/internal/abi.Type).Len"(ptr %0) { +_llgo_0: + %1 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %0) + %2 = icmp eq i64 %1, 17 + br i1 %2, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.ArrayType", ptr %0, i32 0, i32 3 + %4 = load i64, ptr %3, align 4 + ret i64 %4 + +_llgo_2: ; preds = %_llgo_0 + ret i64 0 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.Type).MapType"(ptr %0) { +_llgo_0: + %1 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %0) + %2 = icmp ne i64 %1, 21 + br i1 %2, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + ret ptr null + +_llgo_2: ; preds = %_llgo_0 + ret ptr %0 +} + +define ptr @"(*github.com/goplus/llgo/internal/abi.Type).StructType"(ptr %0) { +_llgo_0: + %1 = call i64 @"(*github.com/goplus/llgo/internal/abi.Type).Kind"(ptr %0) + %2 = icmp ne i64 %1, 25 + br i1 %2, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + ret ptr null + +_llgo_2: ; preds = %_llgo_0 + ret ptr %0 +} + +define void @"github.com/goplus/llgo/internal/abi.init"() { +_llgo_0: + %0 = load i1, ptr @"github.com/goplus/llgo/internal/abi.init$guard", align 1 + br i1 %0, label %_llgo_2, label %_llgo_1 + +_llgo_1: ; preds = %_llgo_0 + store i1 true, ptr @"github.com/goplus/llgo/internal/abi.init$guard", align 1 + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} diff --git a/internal/build/build.go b/internal/build/build.go index f55a0adf..7868025c 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -20,7 +20,6 @@ import ( "fmt" "go/token" "go/types" - "log" "os" "os/exec" "path" @@ -89,7 +88,7 @@ const ( func Do(args []string, conf *Config) { flags, patterns, verbose := ParseArgs(args, buildFlags) cfg := &packages.Config{ - Mode: loadSyntax | packages.NeedDeps | packages.NeedExportFile, + Mode: loadSyntax | packages.NeedDeps | packages.NeedModule | packages.NeedExportFile, BuildFlags: flags, } @@ -99,6 +98,20 @@ func Do(args []string, conf *Config) { initial, err := packages.Load(cfg, patterns...) check(err) + mode := conf.Mode + if len(initial) == 1 && len(initial[0].CompiledGoFiles) > 0 { + if mode == ModeBuild { + mode = ModeInstall + } + } else if mode == ModeRun { + if len(initial) > 1 { + fmt.Fprintln(os.Stderr, "cannot run multiple packages") + } else { + fmt.Fprintln(os.Stderr, "no Go files in matched packages") + } + return + } + llssa.Initialize(llssa.InitAll) if verbose { llssa.SetDebug(llssa.DbgFlagAll) @@ -113,40 +126,50 @@ func Do(args []string, conf *Config) { return rt[0].Types }) - mode := conf.Mode - if mode == ModeBuild && len(initial) == 1 { - mode = ModeInstall - } buildAllPkgs(prog, initial, mode, verbose) - var runtime *packages.Package + var runtimeFiles []string if rt != nil { - buildAllPkgs(prog, rt, mode, verbose) - runtime = rt[0] + runtimeFiles = allLinkFiles(rt) } - if mode != ModeBuild { + nErr := 0 for _, pkg := range initial { if pkg.Name == "main" { - linkMainPkg(pkg, runtime, conf, mode, verbose) + nErr += linkMainPkg(pkg, runtimeFiles, conf, mode, verbose) } } + if nErr > 0 { + fmt.Fprintf(os.Stderr, "%d errors occurred\n", nErr) + os.Exit(1) + } } } +func setNeedRuntime(pkg *packages.Package) { + pkg.ID = "" // just use pkg.Module to mark it needs runtime +} + +func isNeedRuntime(pkg *packages.Package) bool { + return pkg.ID == "" +} + func buildAllPkgs(prog llssa.Program, initial []*packages.Package, mode Mode, verbose bool) { // Create SSA-form program representation. ssaProg, pkgs, errPkgs := allPkgs(initial, ssa.SanityCheckFunctions) ssaProg.Build() for _, errPkg := range errPkgs { - log.Println("cannot build SSA for package", errPkg) + fmt.Fprintln(os.Stderr, "cannot build SSA for package", errPkg) } for _, pkg := range pkgs { buildPkg(prog, pkg, mode, verbose) + if prog.NeedRuntime() { + setNeedRuntime(pkg.Package) + } } } -func linkMainPkg(pkg, runtime *packages.Package, conf *Config, mode Mode, verbose bool) { +func linkMainPkg(pkg *packages.Package, runtimeFiles []string, conf *Config, mode Mode, verbose bool) (nErr int) { pkgPath := pkg.PkgPath name := path.Base(pkgPath) app := conf.OutFile @@ -154,24 +177,34 @@ func linkMainPkg(pkg, runtime *packages.Package, conf *Config, mode Mode, verbos app = filepath.Join(conf.BinPath, name+conf.AppExt) } const N = 3 - args := make([]string, N, len(pkg.Imports)+(N+2)) + args := make([]string, N, len(pkg.Imports)+len(runtimeFiles)+(N+1)) args[0] = "-o" args[1] = app args[2] = "-Wno-override-module" - if runtime != nil { - args = append(args, runtime.ExportFile+".ll") - } + needRuntime := false packages.Visit([]*packages.Package{pkg}, nil, func(p *packages.Package) { if p.PkgPath != "unsafe" { // TODO(xsw): maybe can remove this special case args = append(args, p.ExportFile+".ll") + if !needRuntime { + needRuntime = isNeedRuntime(p) + } } }) + if needRuntime && runtimeFiles != nil { + args = append(args, runtimeFiles...) + } + + if verbose || mode != ModeRun { + fmt.Fprintln(os.Stderr, "#", pkgPath) + } + defer func() { + if e := recover(); e != nil { + nErr = 1 + } + }() // TODO(xsw): show work // fmt.Fprintln(os.Stderr, "clang", args) - if verbose { - fmt.Fprintln(os.Stderr, "#", pkgPath) - } err := clang.New("").Exec(args...) check(err) @@ -182,6 +215,7 @@ func linkMainPkg(pkg, runtime *packages.Package, conf *Config, mode Mode, verbos cmd.Stderr = os.Stderr cmd.Run() } + return } func buildPkg(prog llssa.Program, aPkg aPackage, mode Mode, verbose bool) { @@ -282,6 +316,39 @@ func checkFlag(arg string, i *int, verbose *bool, swflags map[string]bool) { } } +func allLinkFiles(rt []*packages.Package) (outFiles []string) { + outFiles = make([]string, 0, len(rt)) + root := rootLLGo(rt[0]) + packages.Visit(rt, nil, func(p *packages.Package) { + if isPkgInLLGo(p.PkgPath) { + outFile := filepath.Join(root+p.PkgPath[len(llgoModPath):], "llgo_autogen.ll") + outFiles = append(outFiles, outFile) + } + }) + return +} + +// TODO(xsw): llgo root dir +func rootLLGo(runtime *packages.Package) string { + return runtime.Module.Dir +} + +const ( + llgoModPath = "github.com/goplus/llgo" +) + +func isPkgInLLGo(pkgPath string) bool { + return isPkgInMod(pkgPath, llgoModPath) +} + +func isPkgInMod(pkgPath, modPath string) bool { + if strings.HasPrefix(pkgPath, modPath) { + suffix := pkgPath[len(modPath):] + return suffix == "" || suffix[0] == '/' + } + return false +} + func check(err error) { if err != nil { panic(err) diff --git a/internal/runtime/llgo_autogen.ll b/internal/runtime/llgo_autogen.ll index 476cbb58..bb922a98 100644 --- a/internal/runtime/llgo_autogen.ll +++ b/internal/runtime/llgo_autogen.ll @@ -5,7 +5,7 @@ source_filename = "github.com/goplus/llgo/internal/runtime" %"github.com/goplus/llgo/internal/runtime.itab" = type { ptr, ptr, i32, [4 x i8], [1 x i64] } %"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } %"github.com/goplus/llgo/internal/abi.InterfaceType" = type { %"github.com/goplus/llgo/internal/abi.Type", %"github.com/goplus/llgo/internal/abi.Name", %"github.com/goplus/llgo/internal/runtime.Slice" } -%"github.com/goplus/llgo/internal/abi.Type" = type { i64, i64, i32, i8, i8, i8, i8, i1 (ptr, ptr), ptr, i32, i32 } +%"github.com/goplus/llgo/internal/abi.Type" = type { i64, i64, i32, i8, i8, i8, i8, ptr, ptr, i32, i32 } %"github.com/goplus/llgo/internal/abi.Name" = type { ptr } %"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 } @@ -41,8 +41,8 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 %8 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %2, i32 0, i32 1 %9 = load ptr, ptr %8, align 8 - %castInt = sext ptr %9 to i64 - %mrv = insertvalue { i64, i1 } poison, i64 %castInt, 0 + %ptr2int = ptrtoint ptr %9 to i64 + %mrv = insertvalue { i64, i1 } poison, i64 %ptr2int, 0 %mrv1 = insertvalue { i64, i1 } %mrv, i1 true, 1 ret { i64, i1 } %mrv1 @@ -75,8 +75,8 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 %8 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %2, i32 0, i32 1 %9 = load ptr, ptr %8, align 8 - %castInt = sext ptr %9 to i64 - ret i64 %castInt + %ptr2int = ptrtoint ptr %9 to i64 + ret i64 %ptr2int _llgo_2: ; preds = %_llgo_0 %10 = call %"github.com/goplus/llgo/internal/runtime.iface" @"github.com/goplus/llgo/internal/runtime.MakeAnyString"([21 x i8] c"I2Int: type mismatch\00") @@ -229,9 +229,9 @@ _llgo_0: store i32 0, ptr %8, align 4 store i64 0, ptr %10, align 4 %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %2, i32 0, i32 1 - %castPtr = addrspacecast i64 %1 to ptr + %int2ptr = inttoptr i64 %1 to ptr store ptr %4, ptr %3, align 8 - store ptr %castPtr, ptr %11, align 8 + store ptr %int2ptr, ptr %11, align 8 %12 = load %"github.com/goplus/llgo/internal/runtime.iface", ptr %2, align 8 ret %"github.com/goplus/llgo/internal/runtime.iface" %12 } @@ -322,9 +322,9 @@ _llgo_0: %3 = getelementptr inbounds i64, ptr @"github.com/goplus/llgo/internal/runtime.sizeBasicTypes", i64 %0 %4 = load i64, ptr %3, align 4 %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %1, i32 0, i32 6 - %castInt = trunc i64 %0 to i8 + %truncInt = trunc i64 %0 to i8 store i64 %4, ptr %2, align 4 - store i8 %castInt, ptr %5, align 1 + store i8 %truncInt, ptr %5, align 1 ret ptr %1 } diff --git a/ssa/cl_test.go b/ssa/cl_test.go index ab36b123..8690bc6c 100644 --- a/ssa/cl_test.go +++ b/ssa/cl_test.go @@ -20,7 +20,6 @@ import ( "testing" "github.com/goplus/llgo/cl/cltest" - "github.com/goplus/llgo/ssa" ) func TestFromTestcgo(t *testing.T) { @@ -32,5 +31,6 @@ func TestFromTestdata(t *testing.T) { } func TestRuntime(t *testing.T) { - cltest.Pkg(t, ssa.PkgRuntime, "../internal/runtime/llgo_autogen.ll") + cltest.Pkg(t, "github.com/goplus/llgo/internal/runtime", "../internal/runtime/llgo_autogen.ll") + cltest.Pkg(t, "github.com/goplus/llgo/internal/abi", "../internal/abi/llgo_autogen.ll") } diff --git a/ssa/expr.go b/ssa/expr.go index 108c2d3e..54f781f8 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -494,19 +494,37 @@ func (b Builder) Convert(t Type, x Expr) (ret Expr) { kind := und.Kind() switch { case kind >= types.Int && kind <= types.Uintptr: - ret.impl = b.impl.CreateIntCast(x.impl, t.ll, "castInt") + ret.impl = castInt(b.impl, x.impl, t.ll) return case kind == types.UnsafePointer: - ret.impl = b.impl.CreatePointerCast(x.impl, t.ll, "castPtr") + ret.impl = castPtr(b.impl, x.impl, t.ll) return } case *types.Pointer: - ret.impl = b.impl.CreatePointerCast(x.impl, t.ll, "castPtr") + ret.impl = castPtr(b.impl, x.impl, t.ll) return } panic("todo") } +func castInt(b llvm.Builder, x llvm.Value, t llvm.Type) llvm.Value { + xt := x.Type() + if xt.TypeKind() == llvm.PointerTypeKind { + return b.CreatePtrToInt(x, t, "ptr2int") + } + if xt.IntTypeWidth() <= t.IntTypeWidth() { + return b.CreateIntCast(x, t, "castInt") + } + return b.CreateTrunc(x, t, "truncInt") +} + +func castPtr(b llvm.Builder, x llvm.Value, t llvm.Type) llvm.Value { + if x.Type().TypeKind() == llvm.PointerTypeKind { + return b.CreatePointerCast(x, t, "castPtr") + } + return b.CreateIntToPtr(x, t, "int2ptr") +} + // MakeInterface constructs an instance of an interface type from a // value of a concrete type. // diff --git a/ssa/package.go b/ssa/package.go index 5b5bd224..4512ca25 100644 --- a/ssa/package.go +++ b/ssa/package.go @@ -126,6 +126,8 @@ type aProgram struct { uintptrTy Type intTy Type f64Ty Type + + needRuntime bool } // A Program presents a program. @@ -154,10 +156,16 @@ func (p Program) SetRuntime(runtime any) { } } +// NeedRuntime returns if the current package needs runtime. +func (p Program) NeedRuntime() bool { + return p.needRuntime +} + func (p Program) runtime() *types.Package { if p.rt == nil { p.rt = p.rtget() } + p.needRuntime = true return p.rt } @@ -197,6 +205,7 @@ func (p Program) NewPackage(name, pkgPath string) Package { // mod.Finalize() fns := make(map[string]Function) gbls := make(map[string]Global) + p.needRuntime = false return &aPackage{mod, fns, gbls, p} } @@ -305,7 +314,7 @@ func (p Package) NewFunc(name string, sig *types.Signature) Function { if v, ok := p.fns[name]; ok { return v } - t := p.prog.llvmSignature(sig) + t := p.prog.llvmSignature(sig, false) fn := llvm.AddFunction(p.mod, name, t.ll) ret := newFunction(fn, t, p, p.prog) p.fns[name] = ret diff --git a/ssa/ssa_test.go b/ssa/ssa_test.go index c6977054..f15992bd 100644 --- a/ssa/ssa_test.go +++ b/ssa/ssa_test.go @@ -104,6 +104,9 @@ source_filename = "foo/bar" @a = external global {} `) + if prog.NeedRuntime() { + t.Fatal("NeedRuntime?") + } } func TestNamedStruct(t *testing.T) { diff --git a/ssa/type.go b/ssa/type.go index f265d215..6b02513a 100644 --- a/ssa/type.go +++ b/ssa/type.go @@ -124,7 +124,7 @@ func (p Program) Field(typ Type, i int) Type { func (p Program) Type(typ types.Type) Type { if sig, ok := typ.(*types.Signature); ok { // should methodToFunc - return p.llvmSignature(sig) + return p.llvmSignature(sig, true) } if v := p.typs.At(typ); v != nil { return v.(Type) @@ -134,12 +134,12 @@ func (p Program) Type(typ types.Type) Type { return ret } -func (p Program) llvmSignature(sig *types.Signature) Type { +func (p Program) llvmSignature(sig *types.Signature, isPtr bool) Type { sig = methodToFunc(sig) if v := p.typs.At(sig); v != nil { return v.(Type) } - ret := p.toLLVMFunc(sig) + ret := p.toLLVMFunc(sig, isPtr) p.typs.Set(sig, ret) return ret } @@ -301,7 +301,7 @@ func (p Program) toLLVMTypes(t *types.Tuple, n int) (ret []llvm.Type) { return } -func (p Program) toLLVMFunc(sig *types.Signature) Type { +func (p Program) toLLVMFunc(sig *types.Signature, isPtr bool) Type { tParams := sig.Params() n := tParams.Len() hasVArg := HasVArg(tParams, n) @@ -320,6 +320,9 @@ func (p Program) toLLVMFunc(sig *types.Signature) Type { ret = p.toLLVMTuple(out) } ft := llvm.FunctionType(ret, params, hasVArg) + if isPtr { + ft = llvm.PointerType(ft, 0) + } return &aType{ft, sig, vkFunc} } diff --git a/x/clang/clang.go b/x/clang/clang.go index eeda4758..a87739d1 100644 --- a/x/clang/clang.go +++ b/x/clang/clang.go @@ -17,6 +17,7 @@ package clang import ( + "io" "os" "os/exec" ) @@ -26,6 +27,9 @@ import ( // Cmd represents a nm command. type Cmd struct { app string + + Stdout io.Writer + Stderr io.Writer } // New creates a new nm command. @@ -33,13 +37,13 @@ func New(app string) *Cmd { if app == "" { app = "clang" } - return &Cmd{app} + return &Cmd{app, os.Stdout, os.Stderr} } func (p *Cmd) Exec(args ...string) error { cmd := exec.Command(p.app, args...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr + cmd.Stdout = p.Stdout + cmd.Stderr = p.Stderr return cmd.Run() }