
This commit adds object layout information to new heap allocations. It is not yet used anywhere: the next commit will make use of it. Object layout information will eventually be used for a (mostly) precise garbage collector. This is what the data is made for. However, it is also useful in the interp package which can work better if it knows the memory layout and thus the approximate LLVM type of heap-allocated objects.
147 строки
5 КиБ
LLVM
147 строки
5 КиБ
LLVM
; ModuleID = 'go1.17.go'
|
|
source_filename = "go1.17.go"
|
|
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
|
|
target triple = "wasm32-unknown-wasi"
|
|
|
|
declare noalias nonnull i8* @runtime.alloc(i32, i8*, i8*, i8*)
|
|
|
|
; Function Attrs: nounwind
|
|
define hidden void @main.init(i8* %context, i8* %parentHandle) unnamed_addr #0 {
|
|
entry:
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define hidden i8* @main.Add32(i8* %p, i32 %len, i8* %context, i8* %parentHandle) unnamed_addr #0 {
|
|
entry:
|
|
%0 = getelementptr i8, i8* %p, i32 %len
|
|
ret i8* %0
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define hidden i8* @main.Add64(i8* %p, i64 %len, i8* %context, i8* %parentHandle) unnamed_addr #0 {
|
|
entry:
|
|
%0 = trunc i64 %len to i32
|
|
%1 = getelementptr i8, i8* %p, i32 %0
|
|
ret i8* %1
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define hidden [4 x i32]* @main.SliceToArray(i32* %s.data, i32 %s.len, i32 %s.cap, i8* %context, i8* %parentHandle) unnamed_addr #0 {
|
|
entry:
|
|
%0 = icmp ult i32 %s.len, 4
|
|
br i1 %0, label %slicetoarray.throw, label %slicetoarray.next
|
|
|
|
slicetoarray.throw: ; preds = %entry
|
|
call void @runtime.sliceToArrayPointerPanic(i8* undef, i8* null) #0
|
|
unreachable
|
|
|
|
slicetoarray.next: ; preds = %entry
|
|
%1 = bitcast i32* %s.data to [4 x i32]*
|
|
ret [4 x i32]* %1
|
|
}
|
|
|
|
declare void @runtime.sliceToArrayPointerPanic(i8*, i8*)
|
|
|
|
; Function Attrs: nounwind
|
|
define hidden [4 x i32]* @main.SliceToArrayConst(i8* %context, i8* %parentHandle) unnamed_addr #0 {
|
|
entry:
|
|
%makeslice = call i8* @runtime.alloc(i32 24, i8* nonnull inttoptr (i32 3 to i8*), i8* undef, i8* null) #0
|
|
br i1 false, label %slicetoarray.throw, label %slicetoarray.next
|
|
|
|
slicetoarray.throw: ; preds = %entry
|
|
unreachable
|
|
|
|
slicetoarray.next: ; preds = %entry
|
|
%0 = bitcast i8* %makeslice to [4 x i32]*
|
|
ret [4 x i32]* %0
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define hidden { i32*, i32, i32 } @main.SliceInt(i32* dereferenceable_or_null(4) %ptr, i32 %len, i8* %context, i8* %parentHandle) unnamed_addr #0 {
|
|
entry:
|
|
%0 = icmp ugt i32 %len, 1073741823
|
|
%1 = icmp eq i32* %ptr, null
|
|
%2 = icmp ne i32 %len, 0
|
|
%3 = and i1 %1, %2
|
|
%4 = or i1 %3, %0
|
|
br i1 %4, label %unsafe.Slice.throw, label %unsafe.Slice.next
|
|
|
|
unsafe.Slice.throw: ; preds = %entry
|
|
call void @runtime.unsafeSlicePanic(i8* undef, i8* null) #0
|
|
unreachable
|
|
|
|
unsafe.Slice.next: ; preds = %entry
|
|
%5 = insertvalue { i32*, i32, i32 } undef, i32* %ptr, 0
|
|
%6 = insertvalue { i32*, i32, i32 } %5, i32 %len, 1
|
|
%7 = insertvalue { i32*, i32, i32 } %6, i32 %len, 2
|
|
ret { i32*, i32, i32 } %7
|
|
}
|
|
|
|
declare void @runtime.unsafeSlicePanic(i8*, i8*)
|
|
|
|
; Function Attrs: nounwind
|
|
define hidden { i8*, i32, i32 } @main.SliceUint16(i8* dereferenceable_or_null(1) %ptr, i16 %len, i8* %context, i8* %parentHandle) unnamed_addr #0 {
|
|
entry:
|
|
%0 = icmp eq i8* %ptr, null
|
|
%1 = icmp ne i16 %len, 0
|
|
%2 = and i1 %0, %1
|
|
br i1 %2, label %unsafe.Slice.throw, label %unsafe.Slice.next
|
|
|
|
unsafe.Slice.throw: ; preds = %entry
|
|
call void @runtime.unsafeSlicePanic(i8* undef, i8* null) #0
|
|
unreachable
|
|
|
|
unsafe.Slice.next: ; preds = %entry
|
|
%3 = zext i16 %len to i32
|
|
%4 = insertvalue { i8*, i32, i32 } undef, i8* %ptr, 0
|
|
%5 = insertvalue { i8*, i32, i32 } %4, i32 %3, 1
|
|
%6 = insertvalue { i8*, i32, i32 } %5, i32 %3, 2
|
|
ret { i8*, i32, i32 } %6
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define hidden { i32*, i32, i32 } @main.SliceUint64(i32* dereferenceable_or_null(4) %ptr, i64 %len, i8* %context, i8* %parentHandle) unnamed_addr #0 {
|
|
entry:
|
|
%0 = icmp ugt i64 %len, 1073741823
|
|
%1 = icmp eq i32* %ptr, null
|
|
%2 = icmp ne i64 %len, 0
|
|
%3 = and i1 %1, %2
|
|
%4 = or i1 %3, %0
|
|
br i1 %4, label %unsafe.Slice.throw, label %unsafe.Slice.next
|
|
|
|
unsafe.Slice.throw: ; preds = %entry
|
|
call void @runtime.unsafeSlicePanic(i8* undef, i8* null) #0
|
|
unreachable
|
|
|
|
unsafe.Slice.next: ; preds = %entry
|
|
%5 = trunc i64 %len to i32
|
|
%6 = insertvalue { i32*, i32, i32 } undef, i32* %ptr, 0
|
|
%7 = insertvalue { i32*, i32, i32 } %6, i32 %5, 1
|
|
%8 = insertvalue { i32*, i32, i32 } %7, i32 %5, 2
|
|
ret { i32*, i32, i32 } %8
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define hidden { i32*, i32, i32 } @main.SliceInt64(i32* dereferenceable_or_null(4) %ptr, i64 %len, i8* %context, i8* %parentHandle) unnamed_addr #0 {
|
|
entry:
|
|
%0 = icmp ugt i64 %len, 1073741823
|
|
%1 = icmp eq i32* %ptr, null
|
|
%2 = icmp ne i64 %len, 0
|
|
%3 = and i1 %1, %2
|
|
%4 = or i1 %3, %0
|
|
br i1 %4, label %unsafe.Slice.throw, label %unsafe.Slice.next
|
|
|
|
unsafe.Slice.throw: ; preds = %entry
|
|
call void @runtime.unsafeSlicePanic(i8* undef, i8* null) #0
|
|
unreachable
|
|
|
|
unsafe.Slice.next: ; preds = %entry
|
|
%5 = trunc i64 %len to i32
|
|
%6 = insertvalue { i32*, i32, i32 } undef, i32* %ptr, 0
|
|
%7 = insertvalue { i32*, i32, i32 } %6, i32 %5, 1
|
|
%8 = insertvalue { i32*, i32, i32 } %7, i32 %5, 2
|
|
ret { i32*, i32, i32 } %8
|
|
}
|
|
|
|
attributes #0 = { nounwind }
|