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..86f3b815 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -89,7 +89,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, } @@ -119,16 +119,14 @@ func Do(args []string, conf *Config) { } 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 { for _, pkg := range initial { if pkg.Name == "main" { - linkMainPkg(pkg, runtime, conf, mode, verbose) + linkMainPkg(pkg, runtimeFiles, conf, mode, verbose) } } } @@ -146,7 +144,7 @@ func buildAllPkgs(prog llssa.Program, initial []*packages.Package, mode Mode, ve } } -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) { pkgPath := pkg.PkgPath name := path.Base(pkgPath) app := conf.OutFile @@ -154,12 +152,12 @@ 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") + if runtimeFiles != nil { + args = append(args, runtimeFiles...) } packages.Visit([]*packages.Package{pkg}, nil, func(p *packages.Package) { if p.PkgPath != "unsafe" { // TODO(xsw): maybe can remove this special case @@ -282,6 +280,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/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..5640de1b 100644 --- a/ssa/package.go +++ b/ssa/package.go @@ -305,7 +305,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/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} }