diff --git a/.github/actions/setup-embed-deps/action.yml b/.github/actions/setup-embed-deps/action.yml index fbb02737d5..0e88fe9945 100644 --- a/.github/actions/setup-embed-deps/action.yml +++ b/.github/actions/setup-embed-deps/action.yml @@ -28,6 +28,27 @@ runs: .github/workflows/install-esp-qemu.sh "$QEMU_DIR" echo "${PWD}/${QEMU_DIR}/bin" >> $GITHUB_PATH + - name: Restore ESP Clang cache + id: cache-esp-clang + uses: actions/cache/restore@v5 + with: + path: crosscompile/clang + key: esp-clang-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/workflows/install-esp-clang.sh') }} + + - name: Install ESP Clang + if: steps.cache-esp-clang.outputs.cache-hit != 'true' + shell: bash + run: | + chmod +x .github/workflows/install-esp-clang.sh + .github/workflows/install-esp-clang.sh "crosscompile/clang" + + - name: Save ESP Clang cache + if: steps.cache-esp-clang.outputs.cache-hit != 'true' + uses: actions/cache/save@v5 + with: + path: crosscompile/clang + key: esp-clang-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.github/workflows/install-esp-clang.sh') }} + - name: Verify ESP QEMU installation shell: bash run: | @@ -35,3 +56,9 @@ runs: which qemu-system-xtensa qemu-system-riscv32 --version qemu-system-xtensa --version + + - name: Verify ESP Clang installation + shell: bash + run: | + test -x crosscompile/clang/bin/clang++ + crosscompile/clang/bin/clang++ --version diff --git a/.github/workflows/goroot.yml b/.github/workflows/goroot.yml new file mode 100644 index 0000000000..a328c05e6a --- /dev/null +++ b/.github/workflows/goroot.yml @@ -0,0 +1,133 @@ +name: GOROOT + +on: + push: + branches: + - "**" + - "!dependabot/**" + - "!xgopilot/**" + pull_request: + branches: ["**"] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + goroot: + name: GOROOT (${{ matrix.os }}, Go ${{ matrix.go-version }}, shard ${{ matrix.shard-label }}) + continue-on-error: ${{ matrix.required != 'true' }} + timeout-minutes: 90 + strategy: + fail-fast: false + matrix: + include: + - os: macos-latest + llvm: 19 + go-version: "1.24.11" + shard-index: "0" + shard-total: "2" + shard-label: "0/2" + required: "false" + - os: macos-latest + llvm: 19 + go-version: "1.24.11" + shard-index: "1" + shard-total: "2" + shard-label: "1/2" + required: "false" + - os: ubuntu-latest + llvm: 19 + go-version: "1.24.11" + shard-index: "0" + shard-total: "2" + shard-label: "0/2" + required: "false" + - os: ubuntu-latest + llvm: 19 + go-version: "1.24.11" + shard-index: "1" + shard-total: "2" + shard-label: "1/2" + required: "false" + - os: macos-latest + llvm: 19 + go-version: "1.25.0" + shard-index: "0" + shard-total: "2" + shard-label: "0/2" + required: "true" + - os: macos-latest + llvm: 19 + go-version: "1.25.0" + shard-index: "1" + shard-total: "2" + shard-label: "1/2" + required: "true" + - os: ubuntu-latest + llvm: 19 + go-version: "1.25.0" + shard-index: "0" + shard-total: "2" + shard-label: "0/2" + required: "true" + - os: ubuntu-latest + llvm: 19 + go-version: "1.25.0" + shard-index: "1" + shard-total: "2" + shard-label: "1/2" + required: "true" + - os: macos-latest + llvm: 19 + go-version: "1.26.0" + shard-index: "0" + shard-total: "2" + shard-label: "0/2" + required: "false" + - os: macos-latest + llvm: 19 + go-version: "1.26.0" + shard-index: "1" + shard-total: "2" + shard-label: "1/2" + required: "false" + - os: ubuntu-latest + llvm: 19 + go-version: "1.26.0" + shard-index: "0" + shard-total: "2" + shard-label: "0/2" + required: "false" + - os: ubuntu-latest + llvm: 19 + go-version: "1.26.0" + shard-index: "1" + shard-total: "2" + shard-label: "1/2" + required: "false" + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v6 + + - name: Install dependencies + uses: ./.github/actions/setup-deps + with: + llvm-version: ${{ matrix.llvm }} + + - name: Set up Go + uses: ./.github/actions/setup-go + with: + go-version: ${{ matrix.go-version }} + + - name: Show toolchain versions + run: | + go version + clang --version + + - name: Run GOROOT runner + run: | + bash dev/test_goroot.sh -- \ + -directive-mode ci \ + -shard-index "${{ matrix.shard-index }}" \ + -shard-total "${{ matrix.shard-total }}" diff --git a/.github/workflows/install-esp-clang.sh b/.github/workflows/install-esp-clang.sh new file mode 100644 index 0000000000..bd0c34305f --- /dev/null +++ b/.github/workflows/install-esp-clang.sh @@ -0,0 +1,53 @@ +#!/bin/bash +set -euo pipefail + +INSTALL_DIR="${1:-crosscompile/clang}" +ESP_CLANG_VERSION="19.1.2_20250905-3" +BASE_URL="https://github.com/goplus/espressif-llvm-project-prebuilt/releases/download/${ESP_CLANG_VERSION}" + +OS=$(uname -s | tr '[:upper:]' '[:lower:]') +ARCH=$(uname -m) + +case "$ARCH" in + x86_64|amd64) + ARCH="x86_64" + ;; + aarch64|arm64) + ARCH="aarch64" + ;; + *) + echo "Unsupported architecture: $ARCH" + exit 1 + ;; +esac + +case "$OS" in + darwin) + PLATFORM="${ARCH}-apple-darwin" + ;; + linux) + PLATFORM="${ARCH}-linux-gnu" + ;; + *) + echo "Unsupported OS: $OS" + exit 1 + ;; +esac + +FILENAME="clang-esp-${ESP_CLANG_VERSION}-${PLATFORM}.tar.xz" +URL="${BASE_URL}/${FILENAME}" + +echo "Detected platform: ${PLATFORM}" +echo "Installing ESP Clang to: ${INSTALL_DIR}" +echo "Downloading: ${URL}" + +rm -rf "${INSTALL_DIR}" +mkdir -p "${INSTALL_DIR}" +curl -fsSL "${URL}" | tar -xJ -C "${INSTALL_DIR}" --strip-components=1 + +if [ ! -x "${INSTALL_DIR}/bin/clang++" ]; then + echo "Error: clang++ not found after extraction" + exit 1 +fi + +echo "ESP Clang installed successfully to: ${INSTALL_DIR}" diff --git a/_demo/embed/targetsbuild/build.sh b/_demo/embed/targetsbuild/build.sh index 23171f9014..5832d6fce3 100755 --- a/_demo/embed/targetsbuild/build.sh +++ b/_demo/embed/targetsbuild/build.sh @@ -111,6 +111,50 @@ case "$test_dir" in "riscv32" "riscv64" "rp2040" + + # :0: error: out of range branch target (expected an integer in the range -4096 to 4095) + # error: cannot compile inline asm + "digispark" + + # In file included from /home/runner/work/llgo/llgo/runtime/internal/clite/debug/_wrap/debug.c:9: + # In file included from /usr/include/dlfcn.h:22: + # In file included from /usr/include/features.h:394: + # /usr/include/features-time64.h:20:10: fatal error: 'bits/wordsize.h' file not found + # 20 | #include + # | ^~~~~~~~~~~~~~~~~ + # 1 error generated. + # panic: exit status 1 + "nintendoswitch" + + # ld.lld: error: /home/runner/.cache/llgo/crosscompile/picolibc-v0.1.0/libc-avr.a(...): cannot link object files with incompatible target ISA + "simavr" + + # libc symbol lack + "arduino-leonardo" + "arduino-mega1280" + "arduino-mega2560" + "arduino-nano-new" + "arduino-nano" + "arduino" + "atmega1284p" + "atmega328pb" + "attiny1616" + "cortex-m0" + "cortex-m0plus" + "cortex-m3" + "cortex-m33" + "cortex-m4" + "cortex-m7" + "d1mini" + "esp8266" + "gameboy-advance" + "hifive1b" + "maixbit" + "nodemcu" + "riscv-qemu" + "riscv32-esp" + "stm32l0x2" + "tkey" ) ;; defer) diff --git a/_demo/embed/test_esp32c3_startup.sh b/_demo/embed/test_esp32c3_startup.sh index cf54adc2e8..c761a20d17 100755 --- a/_demo/embed/test_esp32c3_startup.sh +++ b/_demo/embed/test_esp32c3_startup.sh @@ -230,7 +230,7 @@ fi echo "" echo "=== Test 4: ESP32-C3 float output regressions (temporary) ===" pushd "$SCRIPT_DIR" > /dev/null -run_case_and_compare "./esp32c3/float-1664" $'+5.000000e+00 +8.000000e+00\n1 +2.000000e+00\n0x0 +0.000000e+00 notOk: true\n0x0 +0.000000e+00 true\n3 +6.280000e+00' +run_case_and_compare "./esp32c3/float-1664" $'+5.000000e+000 +8.000000e+000\n1 +2.000000e+000\n0x0 +0.000000e+000 notOk: true\n0x0 +0.000000e+000 true\n3 +6.280000e+000' # Mixed Go println + C printf(%f) regression tracking for issue #1723. run_case_and_compare "./esp32c3/print-float-1723" $'go 0\nf=1.100000' popd > /dev/null diff --git a/cl/_testdata/cpkgimp/expect.txt b/cl/_testdata/cpkgimp/expect.txt index c782422f29..f24b75b5e5 100644 --- a/cl/_testdata/cpkgimp/expect.txt +++ b/cl/_testdata/cpkgimp/expect.txt @@ -1 +1 @@ -3 +6.280000e+00 +3 +6.280000e+000 diff --git a/cl/_testdata/embedunexport/out.ll b/cl/_testdata/embedunexport/out.ll index 986d419641..92b874e47c 100644 --- a/cl/_testdata/embedunexport/out.ll +++ b/cl/_testdata/embedunexport/out.ll @@ -7,26 +7,35 @@ source_filename = "github.com/goplus/llgo/cl/_testdata/embedunexport" @"github.com/goplus/llgo/cl/_testdata/embedunexport.init$guard" = global i1 false, align 1 @0 = private unnamed_addr constant [8 x i8] c"modified", align 1 +@llvm.compiler.used = appending global [2 x ptr] [ptr @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).Name", ptr @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).setName"], section "llvm.metadata" define %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).Name"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/embedunexport.Base", ptr %0, i32 0, i32 0 - %2 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %1, align 8 - ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/embedunexport.Base", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %2, align 8 + ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %4 } define void @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).setName"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/embedunexport.Base", ptr %0, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" %1, ptr %2, align 8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/embedunexport.Base", ptr %0, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" %1, ptr %3, align 8 ret void } define ptr @"github.com/goplus/llgo/cl/_testdata/embedunexport.NewBase"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %0) { _llgo_0: %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/embedunexport.Base", ptr %1, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" %0, ptr %2, align 8 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/embedunexport.Base", ptr %1, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" %0, ptr %3, align 8 ret ptr %1 } @@ -57,6 +66,8 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface") diff --git a/cl/_testdata/foo/out.ll b/cl/_testdata/foo/out.ll index 2deb0f303e..c159c2e18b 100644 --- a/cl/_testdata/foo/out.ll +++ b/cl/_testdata/foo/out.ll @@ -11,46 +11,59 @@ source_filename = "github.com/goplus/llgo/cl/_testdata/foo" %"github.com/goplus/llgo/cl/_testdata/foo.Foo" = type { ptr, float } @"github.com/goplus/llgo/cl/_testdata/foo.init$guard" = global i1 false, align 1 -@"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 588020711, i8 8, i8 8, i8 8, i8 57, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 16 }, ptr @"*_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk$fields", i64 1, i64 1 } }, align 8 +@"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 588020711, i8 8, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 16 }, ptr @"*_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk$fields", i64 1, i64 1 } }, align 8 @0 = private unnamed_addr constant [16 x i8] c"struct { V int }", align 1 @"*_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 2112228924, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 16 }, ptr null }, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" }, align 8 @1 = private unnamed_addr constant [1 x i8] c"V", align 1 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 3 }, ptr @"*_llgo_int" }, align 8 @2 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk$fields" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 1 }, ptr @_llgo_int, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 -@"github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 835978208, i8 8, i8 8, i8 8, i8 57, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 16 }, ptr @"*github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 39 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields", i64 1, i64 1 } }, align 8 +@"github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 835978208, i8 8, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 16 }, ptr @"*github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 39 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields", i64 1, i64 1 } }, align 8 @3 = private unnamed_addr constant [16 x i8] c"struct { v int }", align 1 @"*github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -837270651, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 16 }, ptr null }, ptr @"github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" }, align 8 @4 = private unnamed_addr constant [39 x i8] c"github.com/goplus/llgo/cl/_testdata/foo", align 1 @5 = private unnamed_addr constant [1 x i8] c"v", align 1 @"github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 1 }, ptr @_llgo_int, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @6 = private unnamed_addr constant [4 x i8] c"load", align 1 +@llvm.compiler.used = appending global [4 x ptr] [ptr @"github.com/goplus/llgo/cl/_testdata/foo.Foo.Pb", ptr @"github.com/goplus/llgo/cl/_testdata/foo.(*Foo).Pb", ptr @"github.com/goplus/llgo/cl/_testdata/foo.(*Game).Load", ptr @"github.com/goplus/llgo/cl/_testdata/foo.(*Game).initGame"], section "llvm.metadata" define %"github.com/goplus/llgo/runtime/internal/runtime.eface" @"github.com/goplus/llgo/cl/_testdata/foo.Bar"() { _llgo_0: %0 = alloca { i64 }, align 8 call void @llvm.memset(ptr %0, i8 0, i64 8, i1 false) - %1 = getelementptr inbounds { i64 }, ptr %0, i32 0, i32 0 - store i64 1, ptr %1, align 4 - %2 = load { i64 }, ptr %0, align 4 - %3 = extractvalue { i64 } %2, 0 - %4 = inttoptr i64 %3 to ptr - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", ptr undef }, ptr %4, 1 - ret %"github.com/goplus/llgo/runtime/internal/runtime.eface" %5 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64 }, ptr %0, i32 0, i32 0 + store i64 1, ptr %2, align 4 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load { i64 }, ptr %0, align 4 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", ptr %6, ptr %0) + %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", ptr undef }, ptr %6, 1 + ret %"github.com/goplus/llgo/runtime/internal/runtime.eface" %7 } define %"github.com/goplus/llgo/runtime/internal/runtime.eface" @"github.com/goplus/llgo/cl/_testdata/foo.F"() { _llgo_0: %0 = alloca { i64 }, align 8 call void @llvm.memset(ptr %0, i8 0, i64 8, i1 false) - %1 = getelementptr inbounds { i64 }, ptr %0, i32 0, i32 0 - store i64 1, ptr %1, align 4 - %2 = load { i64 }, ptr %0, align 4 - %3 = extractvalue { i64 } %2, 0 - %4 = inttoptr i64 %3 to ptr - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", ptr undef }, ptr %4, 1 - ret %"github.com/goplus/llgo/runtime/internal/runtime.eface" %5 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64 }, ptr %0, i32 0, i32 0 + store i64 1, ptr %2, align 4 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load { i64 }, ptr %0, align 4 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", ptr %6, ptr %0) + %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"github.com/goplus/llgo/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", ptr undef }, ptr %6, 1 + ret %"github.com/goplus/llgo/runtime/internal/runtime.eface" %7 } define ptr @"github.com/goplus/llgo/cl/_testdata/foo.Foo.Pb"(%"github.com/goplus/llgo/cl/_testdata/foo.Foo" %0) { @@ -58,16 +71,22 @@ _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testdata/foo.Foo", align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store %"github.com/goplus/llgo/cl/_testdata/foo.Foo" %0, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/foo.Foo", ptr %1, i32 0, i32 0 - %3 = load ptr, ptr %2, align 8 - ret ptr %3 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/foo.Foo", ptr %1, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + ret ptr %5 } define ptr @"github.com/goplus/llgo/cl/_testdata/foo.(*Foo).Pb"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testdata/foo.Foo", ptr %0, align 8 - %2 = call ptr @"github.com/goplus/llgo/cl/_testdata/foo.Foo.Pb"(%"github.com/goplus/llgo/cl/_testdata/foo.Foo" %1) - ret ptr %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testdata/foo.Foo", ptr %0, align 8 + %3 = call ptr @"github.com/goplus/llgo/cl/_testdata/foo.Foo.Pb"(%"github.com/goplus/llgo/cl/_testdata/foo.Foo" %2) + ret ptr %3 } define void @"github.com/goplus/llgo/cl/_testdata/foo.(*Game).Load"(ptr %0) { @@ -98,6 +117,8 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.structequal"(ptr, ptr, ptr) declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequalptr"(ptr, ptr) @@ -116,6 +137,10 @@ _llgo_0: ret i1 %3 } +declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) + +declare void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr, ptr, ptr) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String") declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) diff --git a/cl/_testdata/geometry1370/out.ll b/cl/_testdata/geometry1370/out.ll index 0651810645..907be2d405 100644 --- a/cl/_testdata/geometry1370/out.ll +++ b/cl/_testdata/geometry1370/out.ll @@ -5,57 +5,84 @@ source_filename = "github.com/goplus/llgo/cl/_testdata/geometry1370" %"github.com/goplus/llgo/runtime/internal/runtime.iface" = type { ptr, ptr } @"github.com/goplus/llgo/cl/_testdata/geometry1370.init$guard" = global i1 false, align 1 +@llvm.compiler.used = appending global [4 x ptr] [ptr @"github.com/goplus/llgo/cl/_testdata/geometry1370.(*Rectangle).Area", ptr @"github.com/goplus/llgo/cl/_testdata/geometry1370.(*Rectangle).GetID", ptr @"github.com/goplus/llgo/cl/_testdata/geometry1370.(*Rectangle).setID", ptr @"github.com/goplus/llgo/cl/_testdata/geometry1370.(*Rectangle).validate"], section "llvm.metadata" define ptr @"github.com/goplus/llgo/cl/_testdata/geometry1370.NewRectangle"(double %0, double %1) { _llgo_0: %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %2, i32 0, i32 0 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %2, i32 0, i32 1 - store double %0, ptr %3, align 8 - store double %1, ptr %4, align 8 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %2, i32 0, i32 0 + %5 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %2, i32 0, i32 1 + store double %0, ptr %4, align 8 + store double %1, ptr %6, align 8 ret ptr %2 } define double @"github.com/goplus/llgo/cl/_testdata/geometry1370.(*Rectangle).Area"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 0 - %2 = load double, ptr %1, align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 1 - %4 = load double, ptr %3, align 8 - %5 = fmul double %2, %4 - ret double %5 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load double, ptr %2, align 8 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 1 + %7 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = load double, ptr %6, align 8 + %9 = fmul double %4, %8 + ret double %9 } define i64 @"github.com/goplus/llgo/cl/_testdata/geometry1370.(*Rectangle).GetID"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 2 - %2 = load i64, ptr %1, align 4 - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 2 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + ret i64 %4 } define void @"github.com/goplus/llgo/cl/_testdata/geometry1370.(*Rectangle).setID"(ptr %0, i64 %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 2 - store i64 %1, ptr %2, align 4 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 2 + store i64 %1, ptr %3, align 4 ret void } define i1 @"github.com/goplus/llgo/cl/_testdata/geometry1370.(*Rectangle).validate"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 0 - %2 = load double, ptr %1, align 8 - %3 = fcmp ogt double %2, 0.000000e+00 - br i1 %3, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load double, ptr %2, align 8 + %5 = fcmp ogt double %4, 0.000000e+00 + br i1 %5, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 1 - %5 = load double, ptr %4, align 8 - %6 = fcmp ogt double %5, 0.000000e+00 + %6 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 1 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load double, ptr %7, align 8 + %10 = fcmp ogt double %9, 0.000000e+00 br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 - %7 = phi i1 [ false, %_llgo_0 ], [ %6, %_llgo_1 ] - ret i1 %7 + %11 = phi i1 [ false, %_llgo_0 ], [ %10, %_llgo_1 ] + ret i1 %11 } define void @"github.com/goplus/llgo/cl/_testdata/geometry1370.RegisterShape"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %0, i64 %1) { @@ -87,4 +114,6 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface") diff --git a/cl/_testdata/importpkg/out.ll b/cl/_testdata/importpkg/out.ll index 1567703d01..5bf43b6258 100644 --- a/cl/_testdata/importpkg/out.ll +++ b/cl/_testdata/importpkg/out.ll @@ -12,6 +12,13 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"github.com/goplus/llgo/cl/_testdata/importpkg.init$guard", align 1 call void @"github.com/goplus/llgo/cl/_testdata/importpkg/stdio.init"() + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) store i8 72, ptr @"github.com/goplus/llgo/cl/_testdata/importpkg.hello", align 1 store i8 101, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testdata/importpkg.hello", i64 1), align 1 store i8 108, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testdata/importpkg.hello", i64 2), align 1 @@ -28,12 +35,15 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testdata/importpkg.main"() { _llgo_0: %0 = call i64 @"github.com/goplus/llgo/cl/_testdata/importpkg/stdio.Max"(i64 2, i64 100) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) call void (ptr, ...) @printf(ptr @"github.com/goplus/llgo/cl/_testdata/importpkg.hello") ret void } declare void @"github.com/goplus/llgo/cl/_testdata/importpkg/stdio.init"() +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i64 @"github.com/goplus/llgo/cl/_testdata/importpkg/stdio.Max"(i64, i64) declare void @printf(ptr, ...) diff --git a/cl/_testdata/llgointrinsics/out.ll b/cl/_testdata/llgointrinsics/out.ll index 9155074b55..0f4703ee76 100644 --- a/cl/_testdata/llgointrinsics/out.ll +++ b/cl/_testdata/llgointrinsics/out.ll @@ -32,10 +32,12 @@ define void @"github.com/goplus/llgo/cl/_testdata/llgointrinsics.UseClosure$1"(p _llgo_0: %1 = load { ptr }, ptr %0, align 8 %2 = extractvalue { ptr } %1, 0 - %3 = load i64, ptr %2, align 4 - %4 = add i64 %3, 1 - %5 = extractvalue { ptr } %1, 0 - store i64 %4, ptr %5, align 4 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + %5 = add i64 %4, 1 + %6 = extractvalue { ptr } %1, 0 + store i64 %5, ptr %6, align 4 ret void } @@ -83,6 +85,8 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i64 @foo(...) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64) diff --git a/cl/_testdata/method/out.ll b/cl/_testdata/method/out.ll index 084879510a..29b856e07d 100644 --- a/cl/_testdata/method/out.ll +++ b/cl/_testdata/method/out.ll @@ -3,6 +3,7 @@ source_filename = "github.com/goplus/llgo/cl/_testdata/method" @"github.com/goplus/llgo/cl/_testdata/method.format" = global [10 x i8] zeroinitializer, align 1 @"github.com/goplus/llgo/cl/_testdata/method.init$guard" = global i1 false, align 1 +@llvm.compiler.used = appending global [2 x ptr] [ptr @"github.com/goplus/llgo/cl/_testdata/method.T.Add", ptr @"github.com/goplus/llgo/cl/_testdata/method.(*T).Add"], section "llvm.metadata" define i64 @"github.com/goplus/llgo/cl/_testdata/method.T.Add"(i64 %0, i64 %1) { _llgo_0: @@ -12,9 +13,11 @@ _llgo_0: define i64 @"github.com/goplus/llgo/cl/_testdata/method.(*T).Add"(ptr %0, i64 %1) { _llgo_0: - %2 = load i64, ptr %0, align 4 - %3 = call i64 @"github.com/goplus/llgo/cl/_testdata/method.T.Add"(i64 %2, i64 %1) - ret i64 %3 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load i64, ptr %0, align 4 + %4 = call i64 @"github.com/goplus/llgo/cl/_testdata/method.T.Add"(i64 %3, i64 %1) + ret i64 %4 } define void @"github.com/goplus/llgo/cl/_testdata/method.init"() { @@ -24,6 +27,16 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"github.com/goplus/llgo/cl/_testdata/method.init$guard", align 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) store i8 72, ptr @"github.com/goplus/llgo/cl/_testdata/method.format", align 1 store i8 101, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testdata/method.format", i64 1), align 1 store i8 108, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testdata/method.format", i64 2), align 1 @@ -42,9 +55,12 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testdata/method.main"() { _llgo_0: + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) %0 = call i64 @"github.com/goplus/llgo/cl/_testdata/method.T.Add"(i64 1, i64 2) call void (ptr, ...) @printf(ptr @"github.com/goplus/llgo/cl/_testdata/method.format", i64 %0) ret void } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @printf(ptr, ...) diff --git a/cl/_testdata/print/out.ll b/cl/_testdata/print/out.ll index 9219560bd0..1b804f7f20 100644 --- a/cl/_testdata/print/out.ll +++ b/cl/_testdata/print/out.ll @@ -13,54 +13,54 @@ source_filename = "github.com/goplus/llgo/cl/_testdata/print" @"github.com/goplus/llgo/cl/_testdata/print.minhexdigits" = global i64 0, align 8 @0 = private unnamed_addr constant [3 x i8] c"%c\00", align 1 @1 = private unnamed_addr constant [4 x i8] c"llgo", align 1 -@_llgo_float32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 62173712, i8 4, i8 4, i8 4, i8 45, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f32equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 7 }, ptr @"*_llgo_float32" }, align 8 +@_llgo_float32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 62173712, i8 4, i8 4, i8 4, i8 13, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f32equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 7 }, ptr @"*_llgo_float32" }, align 8 @2 = private unnamed_addr constant [7 x i8] c"float32", align 1 @"*_llgo_float32" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1426958587, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 7 }, ptr null }, ptr @_llgo_float32 }, align 8 -@_llgo_float64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1233032631, i8 4, i8 8, i8 8, i8 46, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f64equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 7 }, ptr @"*_llgo_float64" }, align 8 +@_llgo_float64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1233032631, i8 4, i8 8, i8 8, i8 14, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f64equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 7 }, ptr @"*_llgo_float64" }, align 8 @3 = private unnamed_addr constant [7 x i8] c"float64", align 1 @"*_llgo_float64" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1664509894, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 7 }, ptr null }, ptr @_llgo_float64 }, align 8 @4 = private unnamed_addr constant [10 x i8] c"check bool", align 1 @_llgo_string = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 8, i32 1749264893, i8 4, i8 8, i8 8, i8 24, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.strequal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 6 }, ptr @"*_llgo_string" }, align 8 @5 = private unnamed_addr constant [6 x i8] c"string", align 1 @"*_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1323879264, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 6 }, ptr null }, ptr @_llgo_string }, align 8 -@_llgo_bool = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 554183389, i8 12, i8 1, i8 1, i8 33, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 4 }, ptr @"*_llgo_bool" }, align 8 +@_llgo_bool = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 554183389, i8 12, i8 1, i8 1, i8 1, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 4 }, ptr @"*_llgo_bool" }, align 8 @6 = private unnamed_addr constant [4 x i8] c"bool", align 1 @"*_llgo_bool" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1896950390, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 4 }, ptr null }, ptr @_llgo_bool }, align 8 @7 = private unnamed_addr constant [8 x i8] c"check &^", align 1 -@_llgo_int32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 1448558410, i8 12, i8 4, i8 4, i8 37, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr @"*_llgo_int32" }, align 8 +@_llgo_int32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 1448558410, i8 12, i8 4, i8 4, i8 5, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr @"*_llgo_int32" }, align 8 @8 = private unnamed_addr constant [5 x i8] c"int32", align 1 @"*_llgo_int32" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -38689692, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr null }, ptr @_llgo_int32 }, align 8 -@_llgo_int8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 1444672578, i8 12, i8 1, i8 1, i8 35, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 4 }, ptr @"*_llgo_int8" }, align 8 +@_llgo_int8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 1444672578, i8 12, i8 1, i8 1, i8 3, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 4 }, ptr @"*_llgo_int8" }, align 8 @9 = private unnamed_addr constant [4 x i8] c"int8", align 1 @"*_llgo_int8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1399554408, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 4 }, ptr null }, ptr @_llgo_int8 }, align 8 -@_llgo_int16 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 2, i64 0, i32 1041867489, i8 12, i8 2, i8 2, i8 36, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal16", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 5 }, ptr @"*_llgo_int16" }, align 8 +@_llgo_int16 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 2, i64 0, i32 1041867489, i8 12, i8 2, i8 2, i8 4, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal16", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 5 }, ptr @"*_llgo_int16" }, align 8 @10 = private unnamed_addr constant [5 x i8] c"int16", align 1 @"*_llgo_int16" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 575772759, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 5 }, ptr null }, ptr @_llgo_int16 }, align 8 -@_llgo_int64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 394795202, i8 12, i8 8, i8 8, i8 38, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 5 }, ptr @"*_llgo_int64" }, align 8 +@_llgo_int64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 394795202, i8 12, i8 8, i8 8, i8 6, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 5 }, ptr @"*_llgo_int64" }, align 8 @11 = private unnamed_addr constant [5 x i8] c"int64", align 1 @"*_llgo_int64" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1901231210, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 5 }, ptr null }, ptr @_llgo_int64 }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 3 }, ptr @"*_llgo_int" }, align 8 @12 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @13 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 -@_llgo_uint16 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 2, i64 0, i32 -75471123, i8 12, i8 2, i8 2, i8 41, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal16", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 6 }, ptr @"*_llgo_uint16" }, align 8 +@_llgo_uint16 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 2, i64 0, i32 -75471123, i8 12, i8 2, i8 2, i8 9, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal16", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 6 }, ptr @"*_llgo_uint16" }, align 8 @14 = private unnamed_addr constant [6 x i8] c"uint16", align 1 @"*_llgo_uint16" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 530818523, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 6 }, ptr null }, ptr @_llgo_uint16 }, align 8 -@_llgo_uint32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 -625909322, i8 12, i8 4, i8 4, i8 42, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 6 }, ptr @"*_llgo_uint32" }, align 8 +@_llgo_uint32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 -625909322, i8 12, i8 4, i8 4, i8 10, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 6 }, ptr @"*_llgo_uint32" }, align 8 @15 = private unnamed_addr constant [6 x i8] c"uint32", align 1 @"*_llgo_uint32" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1605480511, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 6 }, ptr null }, ptr @_llgo_uint32 }, align 8 -@_llgo_uint64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1994022077, i8 12, i8 8, i8 8, i8 43, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 6 }, ptr @"*_llgo_uint64" }, align 8 +@_llgo_uint64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1994022077, i8 12, i8 8, i8 8, i8 11, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 6 }, ptr @"*_llgo_uint64" }, align 8 @16 = private unnamed_addr constant [6 x i8] c"uint64", align 1 @"*_llgo_uint64" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 89591114, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 6 }, ptr null }, ptr @_llgo_uint64 }, align 8 -@_llgo_uintptr = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1268343028, i8 12, i8 8, i8 8, i8 44, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 7 }, ptr @"*_llgo_uintptr" }, align 8 +@_llgo_uintptr = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1268343028, i8 12, i8 8, i8 8, i8 12, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 7 }, ptr @"*_llgo_uintptr" }, align 8 @17 = private unnamed_addr constant [7 x i8] c"uintptr", align 1 @"*_llgo_uintptr" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1684891952, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 7 }, ptr null }, ptr @_llgo_uintptr }, align 8 @_llgo_complex128 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 0, i32 -185553283, i8 4, i8 8, i8 8, i8 16, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.c128equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 10 }, ptr @"*_llgo_complex128" }, align 8 @18 = private unnamed_addr constant [10 x i8] c"complex128", align 1 @"*_llgo_complex128" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -210097625, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 10 }, ptr null }, ptr @_llgo_complex128 }, align 8 -@_llgo_uint = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 172771804, i8 12, i8 8, i8 8, i8 39, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @19, i64 4 }, ptr @"*_llgo_uint" }, align 8 +@_llgo_uint = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 172771804, i8 12, i8 8, i8 8, i8 7, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @19, i64 4 }, ptr @"*_llgo_uint" }, align 8 @19 = private unnamed_addr constant [4 x i8] c"uint", align 1 @"*_llgo_uint" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1001256076, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @19, i64 4 }, ptr null }, ptr @_llgo_uint }, align 8 @_llgo_complex64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1545857875, i8 4, i8 4, i8 4, i8 15, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.c64equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 9 }, ptr @"*_llgo_complex64" }, align 8 @@ -84,20 +84,40 @@ _llgo_0: store %"github.com/goplus/llgo/runtime/internal/runtime.String" %0, ptr %1, align 8 %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) %3 = call ptr @"github.com/goplus/llgo/cl/_testdata/print.stringStructOf"(ptr %1) - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/print.stringStruct", ptr %3, i32 0, i32 0 - %5 = load ptr, ptr %4, align 8 - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/print.slice", ptr %2, i32 0, i32 0 - store ptr %5, ptr %6, align 8 - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/print.stringStruct", ptr %3, i32 0, i32 1 - %8 = load i64, ptr %7, align 4 - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/print.slice", ptr %2, i32 0, i32 1 - store i64 %8, ptr %9, align 4 - %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/print.stringStruct", ptr %3, i32 0, i32 1 - %11 = load i64, ptr %10, align 4 - %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/print.slice", ptr %2, i32 0, i32 2 - store i64 %11, ptr %12, align 4 - %13 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %2, align 8 - ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %13 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/print.stringStruct", ptr %3, i32 0, i32 0 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load ptr, ptr %5, align 8 + %8 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/print.slice", ptr %2, i32 0, i32 0 + store ptr %7, ptr %9, align 8 + %10 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/print.stringStruct", ptr %3, i32 0, i32 1 + %12 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = load i64, ptr %11, align 4 + %14 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/print.slice", ptr %2, i32 0, i32 1 + store i64 %13, ptr %15, align 4 + %16 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/print.stringStruct", ptr %3, i32 0, i32 1 + %18 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = load i64, ptr %17, align 4 + %20 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/print.slice", ptr %2, i32 0, i32 2 + store i64 %19, ptr %21, align 4 + %22 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %22) + %23 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %2, align 8 + ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23 } define void @"github.com/goplus/llgo/cl/_testdata/print.gwrite"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %0) { @@ -127,8 +147,10 @@ _llgo_4: ; preds = %_llgo_3 %11 = or i1 %10, %9 call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %11) %12 = getelementptr inbounds i8, ptr %7, i64 %5 - %13 = load i8, ptr %12, align 1 - %14 = call i32 (ptr, ...) @printf(ptr @0, i8 %13) + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load i8, ptr %12, align 1 + %15 = call i32 (ptr, ...) @printf(ptr @0, i8 %14) br label %_llgo_3 _llgo_5: ; preds = %_llgo_3 @@ -165,92 +187,196 @@ _llgo_0: call void @"github.com/goplus/llgo/cl/_testdata/print.printnl"() call void @"github.com/goplus/llgo/cl/_testdata/print.prinfsub"(double 1.001000e+02) call void @"github.com/goplus/llgo/cl/_testdata/print.printnl"() - call void @"github.com/goplus/llgo/cl/_testdata/print.printany"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr inttoptr (i32 1315859240 to ptr) }) + %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 4) + store float 1.000000e+09, ptr %0, align 4 + %1 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %0, 1 + call void @"github.com/goplus/llgo/cl/_testdata/print.printany"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %1) call void @"github.com/goplus/llgo/cl/_testdata/print.printnl"() - call void @"github.com/goplus/llgo/cl/_testdata/print.printany"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr inttoptr (i64 4746175415993761792 to ptr) }) + %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store double 2.000000e+09, ptr %2, align 8 + %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2, 1 + call void @"github.com/goplus/llgo/cl/_testdata/print.printany"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %3) call void @"github.com/goplus/llgo/cl/_testdata/print.printnl"() br i1 true, label %_llgo_3, label %_llgo_2 _llgo_1: ; preds = %_llgo_3 - %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %1 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %0, i64 0 - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 10 }, ptr %2, align 8 - %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %3, ptr %1, align 8 - %4 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %0, i64 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr inttoptr (i64 -1 to ptr) }, ptr %4, align 8 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, i64 2, 1 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, i64 2, 2 - call void @"github.com/goplus/llgo/cl/_testdata/print.println"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7) + %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %4, i64 0 + %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 10 }, ptr %7, align 8 + %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %7, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %8, ptr %6, align 8 + %9 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %4, i64 1 + %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 1) + store i1 true, ptr %11, align 1 + %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %11, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %12, ptr %10, align 8 + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %4, 0 + %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %13, i64 2, 1 + %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %14, i64 2, 2 + call void @"github.com/goplus/llgo/cl/_testdata/print.println"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %15) br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_3, %_llgo_0 - %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 48) - %9 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %8, i64 0 - %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 8 }, ptr %10, align 8 - %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %10, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %11, ptr %9, align 8 - %12 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %8, i64 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr inttoptr (i64 -1 to ptr) }, ptr %12, align 8 - %13 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %8, i64 2 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr inttoptr (i64 -1 to ptr) }, ptr %13, align 8 - %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %8, 0 - %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %14, i64 3, 1 - %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %15, i64 3, 2 - call void @"github.com/goplus/llgo/cl/_testdata/print.println"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %16) - %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 256) - %18 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr inttoptr (i64 -1 to ptr) }, ptr %18, align 8 - %19 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr null }, ptr %19, align 8 - %20 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 2 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr inttoptr (i64 97 to ptr) }, ptr %20, align 8 - %21 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 3 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr inttoptr (i64 65 to ptr) }, ptr %21, align 8 - %22 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 4 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr inttoptr (i64 20013 to ptr) }, ptr %22, align 8 - %23 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 5 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr inttoptr (i64 1 to ptr) }, ptr %23, align 8 - %24 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 6 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr inttoptr (i64 2 to ptr) }, ptr %24, align 8 - %25 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 7 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr inttoptr (i64 3 to ptr) }, ptr %25, align 8 - %26 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 8 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr inttoptr (i64 4 to ptr) }, ptr %26, align 8 - %27 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 9 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 5 to ptr) }, ptr %27, align 8 - %28 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 10 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr inttoptr (i64 1 to ptr) }, ptr %28, align 8 - %29 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 11 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr inttoptr (i64 2 to ptr) }, ptr %29, align 8 - %30 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 12 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr inttoptr (i64 3 to ptr) }, ptr %30, align 8 - %31 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 13 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr inttoptr (i64 4 to ptr) }, ptr %31, align 8 - %32 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 14 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr inttoptr (i64 5 to ptr) }, ptr %32, align 8 - %33 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %17, i64 15 - %34 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 4 }, ptr %34, align 8 - %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %34, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %35, ptr %33, align 8 - %36 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %17, 0 - %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %36, i64 16, 1 - %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %37, i64 16, 2 - call void @"github.com/goplus/llgo/cl/_testdata/print.println"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %38) - %39 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %40 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %39, i64 0 - %41 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store { double, double } { double 1.000000e+00, double 2.000000e+00 }, ptr %41, align 8 - %42 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_complex128, ptr undef }, ptr %41, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %42, ptr %40, align 8 - %43 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %39, 0 - %44 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %43, i64 1, 1 - %45 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %44, i64 1, 2 - call void @"github.com/goplus/llgo/cl/_testdata/print.println"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %45) + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 48) + %17 = icmp eq ptr %16, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %17) + %18 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %16, i64 0 + %19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 8 }, ptr %19, align 8 + %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %19, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %20, ptr %18, align 8 + %21 = icmp eq ptr %16, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %21) + %22 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %16, i64 1 + %23 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 1) + store i1 true, ptr %23, align 1 + %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %23, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %24, ptr %22, align 8 + %25 = icmp eq ptr %16, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %25) + %26 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %16, i64 2 + %27 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 1) + store i1 true, ptr %27, align 1 + %28 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %27, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %28, ptr %26, align 8 + %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %16, 0 + %30 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %29, i64 3, 1 + %31 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %30, i64 3, 2 + call void @"github.com/goplus/llgo/cl/_testdata/print.println"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %31) + %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 256) + %33 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %33) + %34 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 0 + %35 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 1) + store i1 true, ptr %35, align 1 + %36 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %35, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %36, ptr %34, align 8 + %37 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %37) + %38 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 1 + %39 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 1) + store i1 false, ptr %39, align 1 + %40 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %39, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %40, ptr %38, align 8 + %41 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %41) + %42 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 2 + %43 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 4) + store i32 97, ptr %43, align 4 + %44 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %43, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %44, ptr %42, align 8 + %45 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %45) + %46 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 3 + %47 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 4) + store i32 65, ptr %47, align 4 + %48 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %47, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %48, ptr %46, align 8 + %49 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %49) + %50 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 4 + %51 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 4) + store i32 20013, ptr %51, align 4 + %52 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %51, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %52, ptr %50, align 8 + %53 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %53) + %54 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 5 + %55 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 1) + store i8 1, ptr %55, align 1 + %56 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %55, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %56, ptr %54, align 8 + %57 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %57) + %58 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 6 + %59 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 2) + store i16 2, ptr %59, align 2 + %60 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %59, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %60, ptr %58, align 8 + %61 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %61) + %62 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 7 + %63 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 4) + store i32 3, ptr %63, align 4 + %64 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %63, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %64, ptr %62, align 8 + %65 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %65) + %66 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 8 + %67 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 4, ptr %67, align 4 + %68 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %67, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %68, ptr %66, align 8 + %69 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %69) + %70 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 9 + %71 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 5, ptr %71, align 4 + %72 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %71, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %72, ptr %70, align 8 + %73 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %73) + %74 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 10 + %75 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 1) + store i8 1, ptr %75, align 1 + %76 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %75, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %76, ptr %74, align 8 + %77 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %77) + %78 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 11 + %79 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 2) + store i16 2, ptr %79, align 2 + %80 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %79, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %80, ptr %78, align 8 + %81 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %81) + %82 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 12 + %83 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 4) + store i32 3, ptr %83, align 4 + %84 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %83, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %84, ptr %82, align 8 + %85 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %85) + %86 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 13 + %87 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 4, ptr %87, align 4 + %88 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %87, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %88, ptr %86, align 8 + %89 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %89) + %90 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 14 + %91 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 5, ptr %91, align 4 + %92 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %91, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %92, ptr %90, align 8 + %93 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %93) + %94 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 15 + %95 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 4 }, ptr %95, align 8 + %96 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %95, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %96, ptr %94, align 8 + %97 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %32, 0 + %98 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %97, i64 16, 1 + %99 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %98, i64 16, 2 + call void @"github.com/goplus/llgo/cl/_testdata/print.println"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %99) + %100 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %101 = icmp eq ptr %100, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %101) + %102 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %100, i64 0 + %103 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store { double, double } { double 1.000000e+00, double 2.000000e+00 }, ptr %103, align 8 + %104 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_complex128, ptr undef }, ptr %103, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %104, ptr %102, align 8 + %105 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %100, 0 + %106 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %105, i64 1, 1 + %107 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %106, i64 1, 2 + call void @"github.com/goplus/llgo/cl/_testdata/print.println"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %107) ret void _llgo_3: ; preds = %_llgo_0 @@ -281,7 +407,7 @@ _llgo_1: ; preds = %_llgo_34, %_llgo_85 ret void _llgo_2: ; preds = %_llgo_37 - call void @"github.com/goplus/llgo/cl/_testdata/print.printbool"(i1 %54) + call void @"github.com/goplus/llgo/cl/_testdata/print.printbool"(i1 %53) br label %_llgo_1 _llgo_3: ; preds = %_llgo_37 @@ -290,7 +416,7 @@ _llgo_3: ; preds = %_llgo_37 br i1 %4, label %_llgo_38, label %_llgo_39 _llgo_4: ; preds = %_llgo_40 - call void @"github.com/goplus/llgo/cl/_testdata/print.printint"(i64 %61) + call void @"github.com/goplus/llgo/cl/_testdata/print.printint"(i64 %60) br label %_llgo_1 _llgo_5: ; preds = %_llgo_40 @@ -299,7 +425,7 @@ _llgo_5: ; preds = %_llgo_40 br i1 %6, label %_llgo_41, label %_llgo_42 _llgo_6: ; preds = %_llgo_43 - %7 = sext i8 %69 to i64 + %7 = sext i8 %67 to i64 call void @"github.com/goplus/llgo/cl/_testdata/print.printint"(i64 %7) br label %_llgo_1 @@ -309,7 +435,7 @@ _llgo_7: ; preds = %_llgo_43 br i1 %9, label %_llgo_44, label %_llgo_45 _llgo_8: ; preds = %_llgo_46 - %10 = sext i16 %77 to i64 + %10 = sext i16 %74 to i64 call void @"github.com/goplus/llgo/cl/_testdata/print.printint"(i64 %10) br label %_llgo_1 @@ -319,7 +445,7 @@ _llgo_9: ; preds = %_llgo_46 br i1 %12, label %_llgo_47, label %_llgo_48 _llgo_10: ; preds = %_llgo_49 - %13 = sext i32 %85 to i64 + %13 = sext i32 %81 to i64 call void @"github.com/goplus/llgo/cl/_testdata/print.printint"(i64 %13) br label %_llgo_1 @@ -329,7 +455,7 @@ _llgo_11: ; preds = %_llgo_49 br i1 %15, label %_llgo_50, label %_llgo_51 _llgo_12: ; preds = %_llgo_52 - call void @"github.com/goplus/llgo/cl/_testdata/print.printint"(i64 %92) + call void @"github.com/goplus/llgo/cl/_testdata/print.printint"(i64 %88) br label %_llgo_1 _llgo_13: ; preds = %_llgo_52 @@ -338,7 +464,7 @@ _llgo_13: ; preds = %_llgo_52 br i1 %17, label %_llgo_53, label %_llgo_54 _llgo_14: ; preds = %_llgo_55 - call void @"github.com/goplus/llgo/cl/_testdata/print.printuint"(i64 %99) + call void @"github.com/goplus/llgo/cl/_testdata/print.printuint"(i64 %95) br label %_llgo_1 _llgo_15: ; preds = %_llgo_55 @@ -347,7 +473,7 @@ _llgo_15: ; preds = %_llgo_55 br i1 %19, label %_llgo_56, label %_llgo_57 _llgo_16: ; preds = %_llgo_58 - %20 = zext i8 %107 to i64 + %20 = zext i8 %102 to i64 call void @"github.com/goplus/llgo/cl/_testdata/print.printuint"(i64 %20) br label %_llgo_1 @@ -357,7 +483,7 @@ _llgo_17: ; preds = %_llgo_58 br i1 %22, label %_llgo_59, label %_llgo_60 _llgo_18: ; preds = %_llgo_61 - %23 = zext i16 %115 to i64 + %23 = zext i16 %109 to i64 call void @"github.com/goplus/llgo/cl/_testdata/print.printuint"(i64 %23) br label %_llgo_1 @@ -367,7 +493,7 @@ _llgo_19: ; preds = %_llgo_61 br i1 %25, label %_llgo_62, label %_llgo_63 _llgo_20: ; preds = %_llgo_64 - %26 = zext i32 %123 to i64 + %26 = zext i32 %116 to i64 call void @"github.com/goplus/llgo/cl/_testdata/print.printuint"(i64 %26) br label %_llgo_1 @@ -377,7 +503,7 @@ _llgo_21: ; preds = %_llgo_64 br i1 %28, label %_llgo_65, label %_llgo_66 _llgo_22: ; preds = %_llgo_67 - call void @"github.com/goplus/llgo/cl/_testdata/print.printuint"(i64 %130) + call void @"github.com/goplus/llgo/cl/_testdata/print.printuint"(i64 %123) br label %_llgo_1 _llgo_23: ; preds = %_llgo_67 @@ -386,7 +512,7 @@ _llgo_23: ; preds = %_llgo_67 br i1 %30, label %_llgo_68, label %_llgo_69 _llgo_24: ; preds = %_llgo_70 - call void @"github.com/goplus/llgo/cl/_testdata/print.printuint"(i64 %137) + call void @"github.com/goplus/llgo/cl/_testdata/print.printuint"(i64 %130) br label %_llgo_1 _llgo_25: ; preds = %_llgo_70 @@ -395,7 +521,7 @@ _llgo_25: ; preds = %_llgo_70 br i1 %32, label %_llgo_71, label %_llgo_72 _llgo_26: ; preds = %_llgo_73 - %33 = fpext float %146 to double + %33 = fpext float %137 to double call void @"github.com/goplus/llgo/cl/_testdata/print.printfloat"(double %33) br label %_llgo_1 @@ -405,7 +531,7 @@ _llgo_27: ; preds = %_llgo_73 br i1 %35, label %_llgo_74, label %_llgo_75 _llgo_28: ; preds = %_llgo_76 - call void @"github.com/goplus/llgo/cl/_testdata/print.printfloat"(double %154) + call void @"github.com/goplus/llgo/cl/_testdata/print.printfloat"(double %144) br label %_llgo_1 _llgo_29: ; preds = %_llgo_76 @@ -415,10 +541,10 @@ _llgo_29: ; preds = %_llgo_76 _llgo_30: ; preds = %_llgo_79 call void @"github.com/goplus/llgo/cl/_testdata/print.printstring"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @21, i64 1 }) - %38 = extractvalue { float, float } %161, 0 + %38 = extractvalue { float, float } %151, 0 %39 = fpext float %38 to double call void @"github.com/goplus/llgo/cl/_testdata/print.printfloat"(double %39) - %40 = extractvalue { float, float } %161, 1 + %40 = extractvalue { float, float } %151, 1 %41 = fpext float %40 to double call void @"github.com/goplus/llgo/cl/_testdata/print.printfloat"(double %41) call void @"github.com/goplus/llgo/cl/_testdata/print.printstring"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @22, i64 2 }) @@ -431,9 +557,9 @@ _llgo_31: ; preds = %_llgo_79 _llgo_32: ; preds = %_llgo_82 call void @"github.com/goplus/llgo/cl/_testdata/print.printstring"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @21, i64 1 }) - %44 = extractvalue { double, double } %168, 0 + %44 = extractvalue { double, double } %158, 0 call void @"github.com/goplus/llgo/cl/_testdata/print.printfloat"(double %44) - %45 = extractvalue { double, double } %168, 1 + %45 = extractvalue { double, double } %158, 1 call void @"github.com/goplus/llgo/cl/_testdata/print.printfloat"(double %45) call void @"github.com/goplus/llgo/cl/_testdata/print.printstring"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @22, i64 2 }) br label %_llgo_1 @@ -444,290 +570,280 @@ _llgo_33: ; preds = %_llgo_82 br i1 %47, label %_llgo_83, label %_llgo_84 _llgo_34: ; preds = %_llgo_85 - call void @"github.com/goplus/llgo/cl/_testdata/print.printstring"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %175) + call void @"github.com/goplus/llgo/cl/_testdata/print.printstring"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %165) br label %_llgo_1 _llgo_35: ; preds = %_llgo_0 %48 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %49 = ptrtoint ptr %48 to i64 - %50 = trunc i64 %49 to i1 - %51 = insertvalue { i1, i1 } undef, i1 %50, 0 - %52 = insertvalue { i1, i1 } %51, i1 true, 1 + %49 = load i1, ptr %48, align 1 + %50 = insertvalue { i1, i1 } undef, i1 %49, 0 + %51 = insertvalue { i1, i1 } %50, i1 true, 1 br label %_llgo_37 _llgo_36: ; preds = %_llgo_0 br label %_llgo_37 _llgo_37: ; preds = %_llgo_36, %_llgo_35 - %53 = phi { i1, i1 } [ %52, %_llgo_35 ], [ zeroinitializer, %_llgo_36 ] - %54 = extractvalue { i1, i1 } %53, 0 - %55 = extractvalue { i1, i1 } %53, 1 - br i1 %55, label %_llgo_2, label %_llgo_3 + %52 = phi { i1, i1 } [ %51, %_llgo_35 ], [ zeroinitializer, %_llgo_36 ] + %53 = extractvalue { i1, i1 } %52, 0 + %54 = extractvalue { i1, i1 } %52, 1 + br i1 %54, label %_llgo_2, label %_llgo_3 _llgo_38: ; preds = %_llgo_3 - %56 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %57 = ptrtoint ptr %56 to i64 - %58 = insertvalue { i64, i1 } undef, i64 %57, 0 - %59 = insertvalue { i64, i1 } %58, i1 true, 1 + %55 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %56 = load i64, ptr %55, align 4 + %57 = insertvalue { i64, i1 } undef, i64 %56, 0 + %58 = insertvalue { i64, i1 } %57, i1 true, 1 br label %_llgo_40 _llgo_39: ; preds = %_llgo_3 br label %_llgo_40 _llgo_40: ; preds = %_llgo_39, %_llgo_38 - %60 = phi { i64, i1 } [ %59, %_llgo_38 ], [ zeroinitializer, %_llgo_39 ] - %61 = extractvalue { i64, i1 } %60, 0 - %62 = extractvalue { i64, i1 } %60, 1 - br i1 %62, label %_llgo_4, label %_llgo_5 + %59 = phi { i64, i1 } [ %58, %_llgo_38 ], [ zeroinitializer, %_llgo_39 ] + %60 = extractvalue { i64, i1 } %59, 0 + %61 = extractvalue { i64, i1 } %59, 1 + br i1 %61, label %_llgo_4, label %_llgo_5 _llgo_41: ; preds = %_llgo_5 - %63 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %64 = ptrtoint ptr %63 to i64 - %65 = trunc i64 %64 to i8 - %66 = insertvalue { i8, i1 } undef, i8 %65, 0 - %67 = insertvalue { i8, i1 } %66, i1 true, 1 + %62 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %63 = load i8, ptr %62, align 1 + %64 = insertvalue { i8, i1 } undef, i8 %63, 0 + %65 = insertvalue { i8, i1 } %64, i1 true, 1 br label %_llgo_43 _llgo_42: ; preds = %_llgo_5 br label %_llgo_43 _llgo_43: ; preds = %_llgo_42, %_llgo_41 - %68 = phi { i8, i1 } [ %67, %_llgo_41 ], [ zeroinitializer, %_llgo_42 ] - %69 = extractvalue { i8, i1 } %68, 0 - %70 = extractvalue { i8, i1 } %68, 1 - br i1 %70, label %_llgo_6, label %_llgo_7 + %66 = phi { i8, i1 } [ %65, %_llgo_41 ], [ zeroinitializer, %_llgo_42 ] + %67 = extractvalue { i8, i1 } %66, 0 + %68 = extractvalue { i8, i1 } %66, 1 + br i1 %68, label %_llgo_6, label %_llgo_7 _llgo_44: ; preds = %_llgo_7 - %71 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %72 = ptrtoint ptr %71 to i64 - %73 = trunc i64 %72 to i16 - %74 = insertvalue { i16, i1 } undef, i16 %73, 0 - %75 = insertvalue { i16, i1 } %74, i1 true, 1 + %69 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %70 = load i16, ptr %69, align 2 + %71 = insertvalue { i16, i1 } undef, i16 %70, 0 + %72 = insertvalue { i16, i1 } %71, i1 true, 1 br label %_llgo_46 _llgo_45: ; preds = %_llgo_7 br label %_llgo_46 _llgo_46: ; preds = %_llgo_45, %_llgo_44 - %76 = phi { i16, i1 } [ %75, %_llgo_44 ], [ zeroinitializer, %_llgo_45 ] - %77 = extractvalue { i16, i1 } %76, 0 - %78 = extractvalue { i16, i1 } %76, 1 - br i1 %78, label %_llgo_8, label %_llgo_9 + %73 = phi { i16, i1 } [ %72, %_llgo_44 ], [ zeroinitializer, %_llgo_45 ] + %74 = extractvalue { i16, i1 } %73, 0 + %75 = extractvalue { i16, i1 } %73, 1 + br i1 %75, label %_llgo_8, label %_llgo_9 _llgo_47: ; preds = %_llgo_9 - %79 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %80 = ptrtoint ptr %79 to i64 - %81 = trunc i64 %80 to i32 - %82 = insertvalue { i32, i1 } undef, i32 %81, 0 - %83 = insertvalue { i32, i1 } %82, i1 true, 1 + %76 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %77 = load i32, ptr %76, align 4 + %78 = insertvalue { i32, i1 } undef, i32 %77, 0 + %79 = insertvalue { i32, i1 } %78, i1 true, 1 br label %_llgo_49 _llgo_48: ; preds = %_llgo_9 br label %_llgo_49 _llgo_49: ; preds = %_llgo_48, %_llgo_47 - %84 = phi { i32, i1 } [ %83, %_llgo_47 ], [ zeroinitializer, %_llgo_48 ] - %85 = extractvalue { i32, i1 } %84, 0 - %86 = extractvalue { i32, i1 } %84, 1 - br i1 %86, label %_llgo_10, label %_llgo_11 + %80 = phi { i32, i1 } [ %79, %_llgo_47 ], [ zeroinitializer, %_llgo_48 ] + %81 = extractvalue { i32, i1 } %80, 0 + %82 = extractvalue { i32, i1 } %80, 1 + br i1 %82, label %_llgo_10, label %_llgo_11 _llgo_50: ; preds = %_llgo_11 - %87 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %88 = ptrtoint ptr %87 to i64 - %89 = insertvalue { i64, i1 } undef, i64 %88, 0 - %90 = insertvalue { i64, i1 } %89, i1 true, 1 + %83 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %84 = load i64, ptr %83, align 4 + %85 = insertvalue { i64, i1 } undef, i64 %84, 0 + %86 = insertvalue { i64, i1 } %85, i1 true, 1 br label %_llgo_52 _llgo_51: ; preds = %_llgo_11 br label %_llgo_52 _llgo_52: ; preds = %_llgo_51, %_llgo_50 - %91 = phi { i64, i1 } [ %90, %_llgo_50 ], [ zeroinitializer, %_llgo_51 ] - %92 = extractvalue { i64, i1 } %91, 0 - %93 = extractvalue { i64, i1 } %91, 1 - br i1 %93, label %_llgo_12, label %_llgo_13 + %87 = phi { i64, i1 } [ %86, %_llgo_50 ], [ zeroinitializer, %_llgo_51 ] + %88 = extractvalue { i64, i1 } %87, 0 + %89 = extractvalue { i64, i1 } %87, 1 + br i1 %89, label %_llgo_12, label %_llgo_13 _llgo_53: ; preds = %_llgo_13 - %94 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %95 = ptrtoint ptr %94 to i64 - %96 = insertvalue { i64, i1 } undef, i64 %95, 0 - %97 = insertvalue { i64, i1 } %96, i1 true, 1 + %90 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %91 = load i64, ptr %90, align 4 + %92 = insertvalue { i64, i1 } undef, i64 %91, 0 + %93 = insertvalue { i64, i1 } %92, i1 true, 1 br label %_llgo_55 _llgo_54: ; preds = %_llgo_13 br label %_llgo_55 _llgo_55: ; preds = %_llgo_54, %_llgo_53 - %98 = phi { i64, i1 } [ %97, %_llgo_53 ], [ zeroinitializer, %_llgo_54 ] - %99 = extractvalue { i64, i1 } %98, 0 - %100 = extractvalue { i64, i1 } %98, 1 - br i1 %100, label %_llgo_14, label %_llgo_15 + %94 = phi { i64, i1 } [ %93, %_llgo_53 ], [ zeroinitializer, %_llgo_54 ] + %95 = extractvalue { i64, i1 } %94, 0 + %96 = extractvalue { i64, i1 } %94, 1 + br i1 %96, label %_llgo_14, label %_llgo_15 _llgo_56: ; preds = %_llgo_15 - %101 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %102 = ptrtoint ptr %101 to i64 - %103 = trunc i64 %102 to i8 - %104 = insertvalue { i8, i1 } undef, i8 %103, 0 - %105 = insertvalue { i8, i1 } %104, i1 true, 1 + %97 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %98 = load i8, ptr %97, align 1 + %99 = insertvalue { i8, i1 } undef, i8 %98, 0 + %100 = insertvalue { i8, i1 } %99, i1 true, 1 br label %_llgo_58 _llgo_57: ; preds = %_llgo_15 br label %_llgo_58 _llgo_58: ; preds = %_llgo_57, %_llgo_56 - %106 = phi { i8, i1 } [ %105, %_llgo_56 ], [ zeroinitializer, %_llgo_57 ] - %107 = extractvalue { i8, i1 } %106, 0 - %108 = extractvalue { i8, i1 } %106, 1 - br i1 %108, label %_llgo_16, label %_llgo_17 + %101 = phi { i8, i1 } [ %100, %_llgo_56 ], [ zeroinitializer, %_llgo_57 ] + %102 = extractvalue { i8, i1 } %101, 0 + %103 = extractvalue { i8, i1 } %101, 1 + br i1 %103, label %_llgo_16, label %_llgo_17 _llgo_59: ; preds = %_llgo_17 - %109 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %110 = ptrtoint ptr %109 to i64 - %111 = trunc i64 %110 to i16 - %112 = insertvalue { i16, i1 } undef, i16 %111, 0 - %113 = insertvalue { i16, i1 } %112, i1 true, 1 + %104 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %105 = load i16, ptr %104, align 2 + %106 = insertvalue { i16, i1 } undef, i16 %105, 0 + %107 = insertvalue { i16, i1 } %106, i1 true, 1 br label %_llgo_61 _llgo_60: ; preds = %_llgo_17 br label %_llgo_61 _llgo_61: ; preds = %_llgo_60, %_llgo_59 - %114 = phi { i16, i1 } [ %113, %_llgo_59 ], [ zeroinitializer, %_llgo_60 ] - %115 = extractvalue { i16, i1 } %114, 0 - %116 = extractvalue { i16, i1 } %114, 1 - br i1 %116, label %_llgo_18, label %_llgo_19 + %108 = phi { i16, i1 } [ %107, %_llgo_59 ], [ zeroinitializer, %_llgo_60 ] + %109 = extractvalue { i16, i1 } %108, 0 + %110 = extractvalue { i16, i1 } %108, 1 + br i1 %110, label %_llgo_18, label %_llgo_19 _llgo_62: ; preds = %_llgo_19 - %117 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %118 = ptrtoint ptr %117 to i64 - %119 = trunc i64 %118 to i32 - %120 = insertvalue { i32, i1 } undef, i32 %119, 0 - %121 = insertvalue { i32, i1 } %120, i1 true, 1 + %111 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %112 = load i32, ptr %111, align 4 + %113 = insertvalue { i32, i1 } undef, i32 %112, 0 + %114 = insertvalue { i32, i1 } %113, i1 true, 1 br label %_llgo_64 _llgo_63: ; preds = %_llgo_19 br label %_llgo_64 _llgo_64: ; preds = %_llgo_63, %_llgo_62 - %122 = phi { i32, i1 } [ %121, %_llgo_62 ], [ zeroinitializer, %_llgo_63 ] - %123 = extractvalue { i32, i1 } %122, 0 - %124 = extractvalue { i32, i1 } %122, 1 - br i1 %124, label %_llgo_20, label %_llgo_21 + %115 = phi { i32, i1 } [ %114, %_llgo_62 ], [ zeroinitializer, %_llgo_63 ] + %116 = extractvalue { i32, i1 } %115, 0 + %117 = extractvalue { i32, i1 } %115, 1 + br i1 %117, label %_llgo_20, label %_llgo_21 _llgo_65: ; preds = %_llgo_21 - %125 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %126 = ptrtoint ptr %125 to i64 - %127 = insertvalue { i64, i1 } undef, i64 %126, 0 - %128 = insertvalue { i64, i1 } %127, i1 true, 1 + %118 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %119 = load i64, ptr %118, align 4 + %120 = insertvalue { i64, i1 } undef, i64 %119, 0 + %121 = insertvalue { i64, i1 } %120, i1 true, 1 br label %_llgo_67 _llgo_66: ; preds = %_llgo_21 br label %_llgo_67 _llgo_67: ; preds = %_llgo_66, %_llgo_65 - %129 = phi { i64, i1 } [ %128, %_llgo_65 ], [ zeroinitializer, %_llgo_66 ] - %130 = extractvalue { i64, i1 } %129, 0 - %131 = extractvalue { i64, i1 } %129, 1 - br i1 %131, label %_llgo_22, label %_llgo_23 + %122 = phi { i64, i1 } [ %121, %_llgo_65 ], [ zeroinitializer, %_llgo_66 ] + %123 = extractvalue { i64, i1 } %122, 0 + %124 = extractvalue { i64, i1 } %122, 1 + br i1 %124, label %_llgo_22, label %_llgo_23 _llgo_68: ; preds = %_llgo_23 - %132 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %133 = ptrtoint ptr %132 to i64 - %134 = insertvalue { i64, i1 } undef, i64 %133, 0 - %135 = insertvalue { i64, i1 } %134, i1 true, 1 + %125 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %126 = load i64, ptr %125, align 4 + %127 = insertvalue { i64, i1 } undef, i64 %126, 0 + %128 = insertvalue { i64, i1 } %127, i1 true, 1 br label %_llgo_70 _llgo_69: ; preds = %_llgo_23 br label %_llgo_70 _llgo_70: ; preds = %_llgo_69, %_llgo_68 - %136 = phi { i64, i1 } [ %135, %_llgo_68 ], [ zeroinitializer, %_llgo_69 ] - %137 = extractvalue { i64, i1 } %136, 0 - %138 = extractvalue { i64, i1 } %136, 1 - br i1 %138, label %_llgo_24, label %_llgo_25 + %129 = phi { i64, i1 } [ %128, %_llgo_68 ], [ zeroinitializer, %_llgo_69 ] + %130 = extractvalue { i64, i1 } %129, 0 + %131 = extractvalue { i64, i1 } %129, 1 + br i1 %131, label %_llgo_24, label %_llgo_25 _llgo_71: ; preds = %_llgo_25 - %139 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %140 = ptrtoint ptr %139 to i64 - %141 = trunc i64 %140 to i32 - %142 = bitcast i32 %141 to float - %143 = insertvalue { float, i1 } undef, float %142, 0 - %144 = insertvalue { float, i1 } %143, i1 true, 1 + %132 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %133 = load float, ptr %132, align 4 + %134 = insertvalue { float, i1 } undef, float %133, 0 + %135 = insertvalue { float, i1 } %134, i1 true, 1 br label %_llgo_73 _llgo_72: ; preds = %_llgo_25 br label %_llgo_73 _llgo_73: ; preds = %_llgo_72, %_llgo_71 - %145 = phi { float, i1 } [ %144, %_llgo_71 ], [ zeroinitializer, %_llgo_72 ] - %146 = extractvalue { float, i1 } %145, 0 - %147 = extractvalue { float, i1 } %145, 1 - br i1 %147, label %_llgo_26, label %_llgo_27 + %136 = phi { float, i1 } [ %135, %_llgo_71 ], [ zeroinitializer, %_llgo_72 ] + %137 = extractvalue { float, i1 } %136, 0 + %138 = extractvalue { float, i1 } %136, 1 + br i1 %138, label %_llgo_26, label %_llgo_27 _llgo_74: ; preds = %_llgo_27 - %148 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %149 = ptrtoint ptr %148 to i64 - %150 = bitcast i64 %149 to double - %151 = insertvalue { double, i1 } undef, double %150, 0 - %152 = insertvalue { double, i1 } %151, i1 true, 1 + %139 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %140 = load double, ptr %139, align 8 + %141 = insertvalue { double, i1 } undef, double %140, 0 + %142 = insertvalue { double, i1 } %141, i1 true, 1 br label %_llgo_76 _llgo_75: ; preds = %_llgo_27 br label %_llgo_76 _llgo_76: ; preds = %_llgo_75, %_llgo_74 - %153 = phi { double, i1 } [ %152, %_llgo_74 ], [ zeroinitializer, %_llgo_75 ] - %154 = extractvalue { double, i1 } %153, 0 - %155 = extractvalue { double, i1 } %153, 1 - br i1 %155, label %_llgo_28, label %_llgo_29 + %143 = phi { double, i1 } [ %142, %_llgo_74 ], [ zeroinitializer, %_llgo_75 ] + %144 = extractvalue { double, i1 } %143, 0 + %145 = extractvalue { double, i1 } %143, 1 + br i1 %145, label %_llgo_28, label %_llgo_29 _llgo_77: ; preds = %_llgo_29 - %156 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %157 = load { float, float }, ptr %156, align 4 - %158 = insertvalue { { float, float }, i1 } undef, { float, float } %157, 0 - %159 = insertvalue { { float, float }, i1 } %158, i1 true, 1 + %146 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %147 = load { float, float }, ptr %146, align 4 + %148 = insertvalue { { float, float }, i1 } undef, { float, float } %147, 0 + %149 = insertvalue { { float, float }, i1 } %148, i1 true, 1 br label %_llgo_79 _llgo_78: ; preds = %_llgo_29 br label %_llgo_79 _llgo_79: ; preds = %_llgo_78, %_llgo_77 - %160 = phi { { float, float }, i1 } [ %159, %_llgo_77 ], [ zeroinitializer, %_llgo_78 ] - %161 = extractvalue { { float, float }, i1 } %160, 0 - %162 = extractvalue { { float, float }, i1 } %160, 1 - br i1 %162, label %_llgo_30, label %_llgo_31 + %150 = phi { { float, float }, i1 } [ %149, %_llgo_77 ], [ zeroinitializer, %_llgo_78 ] + %151 = extractvalue { { float, float }, i1 } %150, 0 + %152 = extractvalue { { float, float }, i1 } %150, 1 + br i1 %152, label %_llgo_30, label %_llgo_31 _llgo_80: ; preds = %_llgo_31 - %163 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %164 = load { double, double }, ptr %163, align 8 - %165 = insertvalue { { double, double }, i1 } undef, { double, double } %164, 0 - %166 = insertvalue { { double, double }, i1 } %165, i1 true, 1 + %153 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %154 = load { double, double }, ptr %153, align 8 + %155 = insertvalue { { double, double }, i1 } undef, { double, double } %154, 0 + %156 = insertvalue { { double, double }, i1 } %155, i1 true, 1 br label %_llgo_82 _llgo_81: ; preds = %_llgo_31 br label %_llgo_82 _llgo_82: ; preds = %_llgo_81, %_llgo_80 - %167 = phi { { double, double }, i1 } [ %166, %_llgo_80 ], [ zeroinitializer, %_llgo_81 ] - %168 = extractvalue { { double, double }, i1 } %167, 0 - %169 = extractvalue { { double, double }, i1 } %167, 1 - br i1 %169, label %_llgo_32, label %_llgo_33 + %157 = phi { { double, double }, i1 } [ %156, %_llgo_80 ], [ zeroinitializer, %_llgo_81 ] + %158 = extractvalue { { double, double }, i1 } %157, 0 + %159 = extractvalue { { double, double }, i1 } %157, 1 + br i1 %159, label %_llgo_32, label %_llgo_33 _llgo_83: ; preds = %_llgo_33 - %170 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %171 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %170, align 8 - %172 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.String" %171, 0 - %173 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } %172, i1 true, 1 + %160 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %161 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %160, align 8 + %162 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.String" %161, 0 + %163 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } %162, i1 true, 1 br label %_llgo_85 _llgo_84: ; preds = %_llgo_33 br label %_llgo_85 _llgo_85: ; preds = %_llgo_84, %_llgo_83 - %174 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } [ %173, %_llgo_83 ], [ zeroinitializer, %_llgo_84 ] - %175 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } %174, 0 - %176 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } %174, 1 - br i1 %176, label %_llgo_34, label %_llgo_1 + %164 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } [ %163, %_llgo_83 ], [ zeroinitializer, %_llgo_84 ] + %165 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } %164, 0 + %166 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } %164, 1 + br i1 %166, label %_llgo_34, label %_llgo_1 } define void @"github.com/goplus/llgo/cl/_testdata/print.printbool"(i1 %0) { @@ -783,155 +899,198 @@ _llgo_7: ; preds = %_llgo_6, %_llgo_3 _llgo_8: ; preds = %_llgo_10 %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 14) - %9 = getelementptr inbounds i8, ptr %8, i64 0 - store i8 43, ptr %9, align 1 - %10 = fcmp oeq double %0, 0.000000e+00 - br i1 %10, label %_llgo_11, label %_llgo_13 + %9 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds i8, ptr %8, i64 0 + store i8 43, ptr %10, align 1 + %11 = fcmp oeq double %0, 0.000000e+00 + br i1 %11, label %_llgo_11, label %_llgo_13 _llgo_9: ; preds = %_llgo_5 - %11 = fcmp olt double %0, 0.000000e+00 + %12 = fcmp olt double %0, 0.000000e+00 br label %_llgo_10 _llgo_10: ; preds = %_llgo_9, %_llgo_5 - %12 = phi i1 [ false, %_llgo_5 ], [ %11, %_llgo_9 ] - br i1 %12, label %_llgo_4, label %_llgo_8 + %13 = phi i1 [ false, %_llgo_5 ], [ %12, %_llgo_9 ] + br i1 %13, label %_llgo_4, label %_llgo_8 _llgo_11: ; preds = %_llgo_8 - %13 = fdiv double 1.000000e+00, %0 - %14 = fcmp olt double %13, 0.000000e+00 - br i1 %14, label %_llgo_14, label %_llgo_12 + %14 = fdiv double 1.000000e+00, %0 + %15 = fcmp olt double %14, 0.000000e+00 + br i1 %15, label %_llgo_14, label %_llgo_12 _llgo_12: ; preds = %_llgo_24, %_llgo_23, %_llgo_14, %_llgo_11 - %15 = phi double [ %0, %_llgo_11 ], [ %36, %_llgo_23 ], [ %0, %_llgo_14 ], [ %39, %_llgo_24 ] - %16 = phi i64 [ 0, %_llgo_11 ], [ %29, %_llgo_23 ], [ 0, %_llgo_14 ], [ %38, %_llgo_24 ] + %16 = phi double [ %0, %_llgo_11 ], [ %39, %_llgo_23 ], [ %0, %_llgo_14 ], [ %42, %_llgo_24 ] + %17 = phi i64 [ 0, %_llgo_11 ], [ %32, %_llgo_23 ], [ 0, %_llgo_14 ], [ %41, %_llgo_24 ] br label %_llgo_25 _llgo_13: ; preds = %_llgo_8 - %17 = fcmp olt double %0, 0.000000e+00 - br i1 %17, label %_llgo_15, label %_llgo_17 + %18 = fcmp olt double %0, 0.000000e+00 + br i1 %18, label %_llgo_15, label %_llgo_17 _llgo_14: ; preds = %_llgo_11 - %18 = getelementptr inbounds i8, ptr %8, i64 0 - store i8 45, ptr %18, align 1 + %19 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %19) + %20 = getelementptr inbounds i8, ptr %8, i64 0 + store i8 45, ptr %20, align 1 br label %_llgo_12 _llgo_15: ; preds = %_llgo_13 - %19 = fneg double %0 - %20 = getelementptr inbounds i8, ptr %8, i64 0 - store i8 45, ptr %20, align 1 + %21 = fneg double %0 + %22 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %22) + %23 = getelementptr inbounds i8, ptr %8, i64 0 + store i8 45, ptr %23, align 1 br label %_llgo_17 _llgo_16: ; preds = %_llgo_17 - %21 = add i64 %24, 1 - %22 = fdiv double %23, 1.000000e+01 + %24 = add i64 %27, 1 + %25 = fdiv double %26, 1.000000e+01 br label %_llgo_17 _llgo_17: ; preds = %_llgo_16, %_llgo_15, %_llgo_13 - %23 = phi double [ %0, %_llgo_13 ], [ %22, %_llgo_16 ], [ %19, %_llgo_15 ] - %24 = phi i64 [ 0, %_llgo_13 ], [ %21, %_llgo_16 ], [ 0, %_llgo_15 ] - %25 = fcmp oge double %23, 1.000000e+01 - br i1 %25, label %_llgo_16, label %_llgo_20 + %26 = phi double [ %0, %_llgo_13 ], [ %25, %_llgo_16 ], [ %21, %_llgo_15 ] + %27 = phi i64 [ 0, %_llgo_13 ], [ %24, %_llgo_16 ], [ 0, %_llgo_15 ] + %28 = fcmp oge double %26, 1.000000e+01 + br i1 %28, label %_llgo_16, label %_llgo_20 _llgo_18: ; preds = %_llgo_20 - %26 = sub i64 %29, 1 - %27 = fmul double %28, 1.000000e+01 + %29 = sub i64 %32, 1 + %30 = fmul double %31, 1.000000e+01 br label %_llgo_20 _llgo_19: ; preds = %_llgo_20 br label %_llgo_21 _llgo_20: ; preds = %_llgo_18, %_llgo_17 - %28 = phi double [ %23, %_llgo_17 ], [ %27, %_llgo_18 ] - %29 = phi i64 [ %24, %_llgo_17 ], [ %26, %_llgo_18 ] - %30 = fcmp olt double %28, 1.000000e+00 - br i1 %30, label %_llgo_18, label %_llgo_19 + %31 = phi double [ %26, %_llgo_17 ], [ %30, %_llgo_18 ] + %32 = phi i64 [ %27, %_llgo_17 ], [ %29, %_llgo_18 ] + %33 = fcmp olt double %31, 1.000000e+00 + br i1 %33, label %_llgo_18, label %_llgo_19 _llgo_21: ; preds = %_llgo_22, %_llgo_19 - %31 = phi double [ 5.000000e+00, %_llgo_19 ], [ %34, %_llgo_22 ] - %32 = phi i64 [ 0, %_llgo_19 ], [ %35, %_llgo_22 ] - %33 = icmp slt i64 %32, 7 - br i1 %33, label %_llgo_22, label %_llgo_23 + %34 = phi double [ 5.000000e+00, %_llgo_19 ], [ %37, %_llgo_22 ] + %35 = phi i64 [ 0, %_llgo_19 ], [ %38, %_llgo_22 ] + %36 = icmp slt i64 %35, 7 + br i1 %36, label %_llgo_22, label %_llgo_23 _llgo_22: ; preds = %_llgo_21 - %34 = fdiv double %31, 1.000000e+01 - %35 = add i64 %32, 1 + %37 = fdiv double %34, 1.000000e+01 + %38 = add i64 %35, 1 br label %_llgo_21 _llgo_23: ; preds = %_llgo_21 - %36 = fadd double %28, %31 - %37 = fcmp oge double %36, 1.000000e+01 - br i1 %37, label %_llgo_24, label %_llgo_12 + %39 = fadd double %31, %34 + %40 = fcmp oge double %39, 1.000000e+01 + br i1 %40, label %_llgo_24, label %_llgo_12 _llgo_24: ; preds = %_llgo_23 - %38 = add i64 %29, 1 - %39 = fdiv double %36, 1.000000e+01 + %41 = add i64 %32, 1 + %42 = fdiv double %39, 1.000000e+01 br label %_llgo_12 _llgo_25: ; preds = %_llgo_26, %_llgo_12 - %40 = phi double [ %15, %_llgo_12 ], [ %53, %_llgo_26 ] - %41 = phi i64 [ 0, %_llgo_12 ], [ %54, %_llgo_26 ] - %42 = icmp slt i64 %41, 7 - br i1 %42, label %_llgo_26, label %_llgo_27 + %43 = phi double [ %16, %_llgo_12 ], [ %57, %_llgo_26 ] + %44 = phi i64 [ 0, %_llgo_12 ], [ %58, %_llgo_26 ] + %45 = icmp slt i64 %44, 7 + br i1 %45, label %_llgo_26, label %_llgo_27 _llgo_26: ; preds = %_llgo_25 - %43 = fptosi double %40 to i64 - %44 = add i64 %41, 2 - %45 = add i64 %43, 48 - %46 = trunc i64 %45 to i8 - %47 = icmp slt i64 %44, 0 - %48 = icmp sge i64 %44, 14 - %49 = or i1 %48, %47 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %49) - %50 = getelementptr inbounds i8, ptr %8, i64 %44 - store i8 %46, ptr %50, align 1 - %51 = sitofp i64 %43 to double - %52 = fsub double %40, %51 - %53 = fmul double %52, 1.000000e+01 - %54 = add i64 %41, 1 + %46 = fptosi double %43 to i64 + %47 = add i64 %44, 2 + %48 = add i64 %46, 48 + %49 = trunc i64 %48 to i8 + %50 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %50) + %51 = icmp slt i64 %47, 0 + %52 = icmp sge i64 %47, 14 + %53 = or i1 %52, %51 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %53) + %54 = getelementptr inbounds i8, ptr %8, i64 %47 + store i8 %49, ptr %54, align 1 + %55 = sitofp i64 %46 to double + %56 = fsub double %43, %55 + %57 = fmul double %56, 1.000000e+01 + %58 = add i64 %44, 1 br label %_llgo_25 _llgo_27: ; preds = %_llgo_25 - %55 = getelementptr inbounds i8, ptr %8, i64 2 - %56 = load i8, ptr %55, align 1 - %57 = getelementptr inbounds i8, ptr %8, i64 1 - store i8 %56, ptr %57, align 1 - %58 = getelementptr inbounds i8, ptr %8, i64 2 - store i8 46, ptr %58, align 1 - %59 = getelementptr inbounds i8, ptr %8, i64 9 - store i8 101, ptr %59, align 1 - %60 = getelementptr inbounds i8, ptr %8, i64 10 - store i8 43, ptr %60, align 1 - %61 = icmp slt i64 %16, 0 - br i1 %61, label %_llgo_28, label %_llgo_29 + %59 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %59) + %60 = getelementptr inbounds i8, ptr %8, i64 2 + %61 = icmp eq ptr %60, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %61) + %62 = load i8, ptr %60, align 1 + %63 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %63) + %64 = getelementptr inbounds i8, ptr %8, i64 1 + store i8 %62, ptr %64, align 1 + %65 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %65) + %66 = getelementptr inbounds i8, ptr %8, i64 2 + store i8 46, ptr %66, align 1 + %67 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %67) + %68 = getelementptr inbounds i8, ptr %8, i64 9 + store i8 101, ptr %68, align 1 + %69 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %69) + %70 = getelementptr inbounds i8, ptr %8, i64 10 + store i8 43, ptr %70, align 1 + %71 = icmp slt i64 %17, 0 + br i1 %71, label %_llgo_28, label %_llgo_29 _llgo_28: ; preds = %_llgo_27 - %62 = sub i64 0, %16 - %63 = getelementptr inbounds i8, ptr %8, i64 10 - store i8 45, ptr %63, align 1 + %72 = sub i64 0, %17 + %73 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %73) + %74 = getelementptr inbounds i8, ptr %8, i64 10 + store i8 45, ptr %74, align 1 br label %_llgo_29 _llgo_29: ; preds = %_llgo_28, %_llgo_27 - %64 = phi i64 [ %16, %_llgo_27 ], [ %62, %_llgo_28 ] - %65 = sdiv i64 %64, 100 - %66 = trunc i64 %65 to i8 - %67 = add i8 %66, 48 - %68 = getelementptr inbounds i8, ptr %8, i64 11 - store i8 %67, ptr %68, align 1 - %69 = sdiv i64 %64, 10 - %70 = trunc i64 %69 to i8 - %71 = urem i8 %70, 10 - %72 = add i8 %71, 48 - %73 = getelementptr inbounds i8, ptr %8, i64 12 - store i8 %72, ptr %73, align 1 - %74 = srem i64 %64, 10 - %75 = trunc i64 %74 to i8 - %76 = add i8 %75, 48 - %77 = getelementptr inbounds i8, ptr %8, i64 13 - store i8 %76, ptr %77, align 1 - %78 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %8, 0 - %79 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %78, i64 14, 1 - %80 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %79, i64 14, 2 - call void @"github.com/goplus/llgo/cl/_testdata/print.gwrite"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %80) + %75 = phi i64 [ %17, %_llgo_27 ], [ %72, %_llgo_28 ] + %76 = icmp eq i64 %75, -9223372036854775808 + %77 = and i1 %76, false + %78 = select i1 %77, i64 0, i64 %75 + %79 = select i1 %77, i64 1, i64 100 + %80 = sdiv i64 %78, %79 + %81 = select i1 %77, i64 %75, i64 %80 + %82 = trunc i64 %81 to i8 + %83 = add i8 %82, 48 + %84 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %84) + %85 = getelementptr inbounds i8, ptr %8, i64 11 + store i8 %83, ptr %85, align 1 + %86 = icmp eq i64 %75, -9223372036854775808 + %87 = and i1 %86, false + %88 = select i1 %87, i64 0, i64 %75 + %89 = select i1 %87, i64 1, i64 10 + %90 = sdiv i64 %88, %89 + %91 = select i1 %87, i64 %75, i64 %90 + %92 = trunc i64 %91 to i8 + %93 = urem i8 %92, 10 + %94 = add i8 %93, 48 + %95 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %95) + %96 = getelementptr inbounds i8, ptr %8, i64 12 + store i8 %94, ptr %96, align 1 + %97 = icmp eq i64 %75, -9223372036854775808 + %98 = and i1 %97, false + %99 = select i1 %98, i64 0, i64 %75 + %100 = select i1 %98, i64 1, i64 10 + %101 = srem i64 %99, %100 + %102 = select i1 %98, i64 0, i64 %101 + %103 = trunc i64 %102 to i8 + %104 = add i8 %103, 48 + %105 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %105) + %106 = getelementptr inbounds i8, ptr %8, i64 13 + store i8 %104, ptr %106, align 1 + %107 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %8, 0 + %108 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %107, i64 14, 1 + %109 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %108, i64 14, 2 + call void @"github.com/goplus/llgo/cl/_testdata/print.gwrite"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %109) ret void } @@ -941,55 +1100,61 @@ _llgo_0: br label %_llgo_3 _llgo_1: ; preds = %_llgo_3 - %2 = urem i64 %22, 16 + %2 = urem i64 %25, 16 %3 = icmp sge i64 %2, 16 call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %3) %4 = getelementptr inbounds i8, ptr @28, i64 %2 %5 = load i8, ptr %4, align 1 - %6 = icmp slt i64 %23, 0 - %7 = icmp sge i64 %23, 100 - %8 = or i1 %7, %6 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %8) - %9 = getelementptr inbounds i8, ptr %1, i64 %23 - store i8 %5, ptr %9, align 1 - %10 = icmp ult i64 %22, 16 - br i1 %10, label %_llgo_5, label %_llgo_4 + %6 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = icmp slt i64 %26, 0 + %8 = icmp sge i64 %26, 100 + %9 = or i1 %8, %7 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %9) + %10 = getelementptr inbounds i8, ptr %1, i64 %26 + store i8 %5, ptr %10, align 1 + %11 = icmp ult i64 %25, 16 + br i1 %11, label %_llgo_5, label %_llgo_4 _llgo_2: ; preds = %_llgo_5, %_llgo_3 - %11 = sub i64 %23, 1 - %12 = icmp slt i64 %11, 0 - %13 = icmp sge i64 %11, 100 - %14 = or i1 %13, %12 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %14) - %15 = getelementptr inbounds i8, ptr %1, i64 %11 - store i8 120, ptr %15, align 1 - %16 = sub i64 %11, 1 - %17 = icmp slt i64 %16, 0 - %18 = icmp sge i64 %16, 100 - %19 = or i1 %18, %17 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %19) - %20 = getelementptr inbounds i8, ptr %1, i64 %16 - store i8 48, ptr %20, align 1 - %21 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %1, i64 1, i64 100, i64 %16, i64 100, i64 100) - call void @"github.com/goplus/llgo/cl/_testdata/print.gwrite"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %21) + %12 = sub i64 %26, 1 + %13 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = icmp slt i64 %12, 0 + %15 = icmp sge i64 %12, 100 + %16 = or i1 %15, %14 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %16) + %17 = getelementptr inbounds i8, ptr %1, i64 %12 + store i8 120, ptr %17, align 1 + %18 = sub i64 %12, 1 + %19 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %19) + %20 = icmp slt i64 %18, 0 + %21 = icmp sge i64 %18, 100 + %22 = or i1 %21, %20 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %22) + %23 = getelementptr inbounds i8, ptr %1, i64 %18 + store i8 48, ptr %23, align 1 + %24 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %1, i64 1, i64 100, i64 %18, i64 100, i64 100) + call void @"github.com/goplus/llgo/cl/_testdata/print.gwrite"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24) ret void _llgo_3: ; preds = %_llgo_4, %_llgo_0 - %22 = phi i64 [ %0, %_llgo_0 ], [ %25, %_llgo_4 ] - %23 = phi i64 [ 99, %_llgo_0 ], [ %26, %_llgo_4 ] - %24 = icmp sgt i64 %23, 0 - br i1 %24, label %_llgo_1, label %_llgo_2 + %25 = phi i64 [ %0, %_llgo_0 ], [ %28, %_llgo_4 ] + %26 = phi i64 [ 99, %_llgo_0 ], [ %29, %_llgo_4 ] + %27 = icmp sgt i64 %26, 0 + br i1 %27, label %_llgo_1, label %_llgo_2 _llgo_4: ; preds = %_llgo_5, %_llgo_1 - %25 = udiv i64 %22, 16 - %26 = sub i64 %23, 1 + %28 = udiv i64 %25, 16 + %29 = sub i64 %26, 1 br label %_llgo_3 _llgo_5: ; preds = %_llgo_1 - %27 = sub i64 100, %23 - %28 = load i64, ptr @"github.com/goplus/llgo/cl/_testdata/print.minhexdigits", align 4 - %29 = icmp sge i64 %27, %28 - br i1 %29, label %_llgo_2, label %_llgo_4 + %30 = sub i64 100, %26 + %31 = load i64, ptr @"github.com/goplus/llgo/cl/_testdata/print.minhexdigits", align 4 + %32 = icmp sge i64 %30, %31 + br i1 %32, label %_llgo_2, label %_llgo_4 } define void @"github.com/goplus/llgo/cl/_testdata/print.printint"(i64 %0) { @@ -1027,9 +1192,11 @@ _llgo_2: ; preds = %_llgo_1 %9 = or i1 %8, %7 call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %9) %10 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %5, i64 %3 - %11 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %10, align 8 - %12 = icmp ne i64 %3, 0 - br i1 %12, label %_llgo_4, label %_llgo_5 + %11 = icmp eq ptr %10, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %10, align 8 + %13 = icmp ne i64 %3, 0 + br i1 %13, label %_llgo_4, label %_llgo_5 _llgo_3: ; preds = %_llgo_1 call void @"github.com/goplus/llgo/cl/_testdata/print.printnl"() @@ -1040,7 +1207,7 @@ _llgo_4: ; preds = %_llgo_2 br label %_llgo_5 _llgo_5: ; preds = %_llgo_4, %_llgo_2 - call void @"github.com/goplus/llgo/cl/_testdata/print.printany"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %11) + call void @"github.com/goplus/llgo/cl/_testdata/print.printany"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %12) br label %_llgo_1 } @@ -1069,32 +1236,34 @@ _llgo_0: br label %_llgo_3 _llgo_1: ; preds = %_llgo_3 - %2 = urem i64 %11, 10 + %2 = urem i64 %12, 10 %3 = add i64 %2, 48 %4 = trunc i64 %3 to i8 - %5 = icmp slt i64 %12, 0 - %6 = icmp sge i64 %12, 100 - %7 = or i1 %6, %5 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %7) - %8 = getelementptr inbounds i8, ptr %1, i64 %12 - store i8 %4, ptr %8, align 1 - %9 = icmp ult i64 %11, 10 - br i1 %9, label %_llgo_2, label %_llgo_4 + %5 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = icmp slt i64 %13, 0 + %7 = icmp sge i64 %13, 100 + %8 = or i1 %7, %6 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %8) + %9 = getelementptr inbounds i8, ptr %1, i64 %13 + store i8 %4, ptr %9, align 1 + %10 = icmp ult i64 %12, 10 + br i1 %10, label %_llgo_2, label %_llgo_4 _llgo_2: ; preds = %_llgo_1, %_llgo_3 - %10 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %1, i64 1, i64 100, i64 %12, i64 100, i64 100) - call void @"github.com/goplus/llgo/cl/_testdata/print.gwrite"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %10) + %11 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %1, i64 1, i64 100, i64 %13, i64 100, i64 100) + call void @"github.com/goplus/llgo/cl/_testdata/print.gwrite"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11) ret void _llgo_3: ; preds = %_llgo_4, %_llgo_0 - %11 = phi i64 [ %0, %_llgo_0 ], [ %14, %_llgo_4 ] - %12 = phi i64 [ 99, %_llgo_0 ], [ %15, %_llgo_4 ] - %13 = icmp sgt i64 %12, 0 - br i1 %13, label %_llgo_1, label %_llgo_2 + %12 = phi i64 [ %0, %_llgo_0 ], [ %15, %_llgo_4 ] + %13 = phi i64 [ 99, %_llgo_0 ], [ %16, %_llgo_4 ] + %14 = icmp sgt i64 %13, 0 + br i1 %14, label %_llgo_1, label %_llgo_2 _llgo_4: ; preds = %_llgo_1 - %14 = udiv i64 %11, 10 - %15 = sub i64 %12, 1 + %15 = udiv i64 %12, 10 + %16 = sub i64 %13, 1 br label %_llgo_3 } @@ -1119,6 +1288,8 @@ _llgo_0: declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1) declare i32 @printf(ptr, ...) @@ -1139,6 +1310,8 @@ _llgo_0: ret i1 %3 } +declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.f64equal"(ptr, ptr) define linkonce i1 @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f64equal"(ptr %0, ptr %1, ptr %2) { @@ -1155,8 +1328,6 @@ _llgo_0: ret i1 %3 } -declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) - declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequal8"(ptr, ptr) define linkonce i1 @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8"(ptr %0, ptr %1, ptr %2) { diff --git a/cl/_testdata/printf/out.ll b/cl/_testdata/printf/out.ll index b54151d4d3..b3bccb59a6 100644 --- a/cl/_testdata/printf/out.ll +++ b/cl/_testdata/printf/out.ll @@ -11,6 +11,13 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"github.com/goplus/llgo/cl/_testdata/printf.init$guard", align 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) store i8 72, ptr @"github.com/goplus/llgo/cl/_testdata/printf.hello", align 1 store i8 101, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testdata/printf.hello", i64 1), align 1 store i8 108, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testdata/printf.hello", i64 2), align 1 @@ -26,8 +33,11 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testdata/printf.main"() { _llgo_0: + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) call void (ptr, ...) @printf(ptr @"github.com/goplus/llgo/cl/_testdata/printf.hello") ret void } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @printf(ptr, ...) diff --git a/cl/_testdata/printval/out.ll b/cl/_testdata/printval/out.ll index 549b0809f8..89fee658eb 100644 --- a/cl/_testdata/printval/out.ll +++ b/cl/_testdata/printval/out.ll @@ -11,6 +11,16 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"github.com/goplus/llgo/cl/_testdata/printval.init$guard", align 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) store i8 72, ptr @"github.com/goplus/llgo/cl/_testdata/printval.format", align 1 store i8 101, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testdata/printval.format", i64 1), align 1 store i8 108, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testdata/printval.format", i64 2), align 1 @@ -29,8 +39,11 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testdata/printval.main"() { _llgo_0: + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) call void (ptr, ...) @printf(ptr @"github.com/goplus/llgo/cl/_testdata/printval.format", i64 100) ret void } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @printf(ptr, ...) diff --git a/cl/_testdata/ptrmthd/out.ll b/cl/_testdata/ptrmthd/out.ll index 8ea0af9a5d..a5ad45cc00 100644 --- a/cl/_testdata/ptrmthd/out.ll +++ b/cl/_testdata/ptrmthd/out.ll @@ -3,6 +3,7 @@ source_filename = "github.com/goplus/llgo/cl/_testdata/ptrmthd" @"github.com/goplus/llgo/cl/_testdata/ptrmthd.format" = global [10 x i8] zeroinitializer, align 1 @"github.com/goplus/llgo/cl/_testdata/ptrmthd.init$guard" = global i1 false, align 1 +@llvm.compiler.used = appending global [1 x ptr] [ptr @"github.com/goplus/llgo/cl/_testdata/ptrmthd.(*T).Print"], section "llvm.metadata" define void @"github.com/goplus/llgo/cl/_testdata/ptrmthd.(*T).Print"(ptr %0, i64 %1) { _llgo_0: @@ -17,6 +18,16 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"github.com/goplus/llgo/cl/_testdata/ptrmthd.init$guard", align 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) store i8 72, ptr @"github.com/goplus/llgo/cl/_testdata/ptrmthd.format", align 1 store i8 101, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testdata/ptrmthd.format", i64 1), align 1 store i8 108, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testdata/ptrmthd.format", i64 2), align 1 @@ -35,8 +46,11 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testdata/ptrmthd.main"() { _llgo_0: + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) call void @"github.com/goplus/llgo/cl/_testdata/ptrmthd.(*T).Print"(ptr @"github.com/goplus/llgo/cl/_testdata/ptrmthd.format", i64 100) ret void } declare void @printf(ptr, ...) + +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) diff --git a/cl/_testdata/utf8/out.ll b/cl/_testdata/utf8/out.ll index 9c1379adf0..9124c42b5c 100644 --- a/cl/_testdata/utf8/out.ll +++ b/cl/_testdata/utf8/out.ll @@ -9,14 +9,17 @@ source_filename = "github.com/goplus/llgo/cl/_testdata/utf8" define i8 @"github.com/goplus/llgo/cl/_testdata/utf8.index"(i8 %0) { _llgo_0: + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) %1 = sext i8 %0 to i64 %2 = icmp slt i64 %1, 0 %3 = icmp sge i64 %1, 8 %4 = or i1 %3, %2 call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %4) %5 = getelementptr inbounds i8, ptr @"github.com/goplus/llgo/cl/_testdata/utf8.array", i64 %1 - %6 = load i8, ptr %5, align 1 - ret i8 %6 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load i8, ptr %5, align 1 + ret i8 %7 } define void @"github.com/goplus/llgo/cl/_testdata/utf8.init"() { @@ -27,6 +30,14 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"github.com/goplus/llgo/cl/_testdata/utf8.init$guard", align 1 call void @"unicode/utf8.init"() + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) store i8 1, ptr @"github.com/goplus/llgo/cl/_testdata/utf8.array", align 1 store i8 2, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testdata/utf8.array", i64 1), align 1 store i8 3, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testdata/utf8.array", i64 2), align 1 @@ -69,6 +80,8 @@ _llgo_3: ; preds = %_llgo_1 ret void } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1) declare void @"unicode/utf8.init"() diff --git a/cl/_testdata/vargs/out.ll b/cl/_testdata/vargs/out.ll index 31ab5878f8..4f6821ae2e 100644 --- a/cl/_testdata/vargs/out.ll +++ b/cl/_testdata/vargs/out.ll @@ -8,7 +8,7 @@ source_filename = "github.com/goplus/llgo/cl/_testdata/vargs" %"github.com/goplus/llgo/runtime/internal/runtime.Slice" = type { ptr, i64, i64 } @"github.com/goplus/llgo/cl/_testdata/vargs.init$guard" = global i1 false, align 1 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 3 }, ptr @"*_llgo_int" }, align 8 @0 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @1 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 @@ -33,16 +33,31 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testdata/vargs.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 48) - %1 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %0, i64 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 1 to ptr) }, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %0, i64 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 2 to ptr) }, ptr %2, align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %0, i64 2 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 3 to ptr) }, ptr %3, align 8 - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %4, i64 3, 1 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, i64 3, 2 - call void @"github.com/goplus/llgo/cl/_testdata/vargs.test"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %0, i64 0 + %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 1, ptr %3, align 4 + %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %3, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %4, ptr %2, align 8 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %0, i64 1 + %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 2, ptr %7, align 4 + %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %7, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %8, ptr %6, align 8 + %9 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %0, i64 2 + %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 3, ptr %11, align 4 + %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %11, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %12, ptr %10, align 8 + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 + %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %13, i64 3, 1 + %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %14, i64 3, 2 + call void @"github.com/goplus/llgo/cl/_testdata/vargs.test"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %15) ret void } @@ -65,30 +80,34 @@ _llgo_2: ; preds = %_llgo_1 %9 = or i1 %8, %7 call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %9) %10 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %5, i64 %3 - %11 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %10, align 8 - %12 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %11, 0 - %13 = icmp eq ptr %12, @_llgo_int - br i1 %13, label %_llgo_4, label %_llgo_5 + %11 = icmp eq ptr %10, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %10, align 8 + %13 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %12, 0 + %14 = icmp eq ptr %13, @_llgo_int + br i1 %14, label %_llgo_4, label %_llgo_5 _llgo_3: ; preds = %_llgo_1 ret void _llgo_4: ; preds = %_llgo_2 - %14 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %11, 1 - %15 = ptrtoint ptr %14 to i64 - %16 = call i32 (ptr, ...) @printf(ptr @1, i64 %15) + %15 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %12, 1 + %16 = load i64, ptr %15, align 4 + %17 = call i32 (ptr, ...) @printf(ptr @1, i64 %16) br label %_llgo_1 _llgo_5: ; preds = %_llgo_2 - %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 32 }, ptr %17, align 8 - %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %17, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %18) + %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 32 }, ptr %18, align 8 + %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %18, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %19) unreachable } declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequal64"(ptr, ptr) define linkonce i1 @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64"(ptr %0, ptr %1, ptr %2) { @@ -105,6 +124,8 @@ _llgo_0: ret i1 %3 } +declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1) declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.strequal"(ptr, ptr) @@ -115,8 +136,6 @@ _llgo_0: ret i1 %3 } -declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) - declare void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface") declare i32 @printf(ptr, ...) diff --git a/cl/_testgo/abimethod/out.ll b/cl/_testgo/abimethod/out.ll index f227a1be3d..13c48fa05e 100644 --- a/cl/_testgo/abimethod/out.ll +++ b/cl/_testgo/abimethod/out.ll @@ -25,13 +25,13 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/abimethod" @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [3 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 16, i32 235980794, i8 9, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 25 }, ptr @"*github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 43 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8$fields", i64 2, i64 2 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 43 }, i16 3, i16 2, i32 24 }, [3 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo1", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo1" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 5 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo2", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo2" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 49 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.demo3", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.demo3" }] }, align 8 @1 = private unnamed_addr constant [43 x i8] c"github.com/goplus/llgo/cl/_testgo/abimethod", align 1 @2 = private unnamed_addr constant [1 x i8] c"m", align 1 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr @"*_llgo_int" }, align 8 @3 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @4 = private unnamed_addr constant [1 x i8] c"T", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [3 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -908752194, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 6 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 43 }, i16 3, i16 2, i32 24 }, [3 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo1", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo1" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 5 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo2", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo2" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 49 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).demo3", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).demo3" }] }, align 8 @5 = private unnamed_addr constant [6 x i8] c"main.T", align 1 -@"_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -666093743, i8 13, i8 8, i8 8, i8 57, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 6 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 43 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$eovYmOhZg4X0zMSsuscSshndnbbAGvB2E3cyG8E7Y4U$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 43 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo1", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.T.Demo1" }] }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -666093743, i8 13, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 6 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 43 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$eovYmOhZg4X0zMSsuscSshndnbbAGvB2E3cyG8E7Y4U$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 43 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo1", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.T.Demo1" }] }, align 8 @6 = private unnamed_addr constant [1 x i8] c"n", align 1 @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$eovYmOhZg4X0zMSsuscSshndnbbAGvB2E3cyG8E7Y4U$fields" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 1 }, ptr @_llgo_int, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @7 = private unnamed_addr constant [5 x i8] c"Demo1", align 1 @@ -87,12 +87,12 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/abimethod" @"[]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 370346748, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @32, i64 7 }, ptr @"*[]_llgo_uint8" }, ptr @_llgo_uint8 }, align 8 @32 = private unnamed_addr constant [7 x i8] c"[]uint8", align 1 @"*[]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -2143776929, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @32, i64 7 }, ptr null }, ptr @"[]_llgo_uint8" }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @33, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @33, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @33 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @33, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @34 = private unnamed_addr constant [3 x i8] c"off", align 1 @35 = private unnamed_addr constant [8 x i8] c"lastRead", align 1 -@_llgo_bytes.readOp = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 1507423333, i8 13, i8 1, i8 1, i8 35, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @36, i64 12 }, ptr @"*_llgo_bytes.readOp" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @30, i64 5 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@_llgo_bytes.readOp = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 1507423333, i8 13, i8 1, i8 1, i8 3, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @36, i64 12 }, ptr @"*_llgo_bytes.readOp" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @30, i64 5 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @36 = private unnamed_addr constant [12 x i8] c"bytes.readOp", align 1 @"*_llgo_bytes.readOp" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1082688598, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @36, i64 12 }, ptr null }, ptr @_llgo_bytes.readOp }, align 8 @"bytes.struct$8M6lRFZ7Fk2XCr2laNI9Y7uQtk2A8VDBrezMuq2Fkuo$fields" = weak_odr constant [3 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @31, i64 3 }, ptr @"[]_llgo_uint8", i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @34, i64 3 }, ptr @_llgo_int, i64 24, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @35, i64 8 }, ptr @_llgo_bytes.readOp, i64 32, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @@ -151,7 +151,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/abimethod" @"*_llgo_io.Reader" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 760453616, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @58, i64 9 }, ptr null }, ptr @_llgo_io.Reader }, align 8 @"_llgo_iface$uycIKA3bbxRhudEjW1hHKWKdLqHQsCVy8NdW1bkQmNw$imethods" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.Imethod"] [%"github.com/goplus/llgo/runtime/abi.Imethod" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @47, i64 4 }, ptr @"_llgo_func$G2hch9Iy9DrhKKsg70PbL54bK-XSl-1IUUORN17J2Dk" }], align 8 @"_llgo_func$uVmBDI0DMcrui3Q9y-g_hbtVN8JckQ18V2wmO5_G7A8$in" = weak_odr constant [1 x ptr] [ptr @_llgo_io.Reader], align 8 -@_llgo_int64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 394795202, i8 12, i8 8, i8 8, i8 38, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @59, i64 5 }, ptr @"*_llgo_int64" }, align 8 +@_llgo_int64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 394795202, i8 12, i8 8, i8 8, i8 6, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @59, i64 5 }, ptr @"*_llgo_int64" }, align 8 @59 = private unnamed_addr constant [5 x i8] c"int64", align 1 @"*_llgo_int64" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1901231210, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @59, i64 5 }, ptr null }, ptr @_llgo_int64 }, align 8 @"_llgo_func$uVmBDI0DMcrui3Q9y-g_hbtVN8JckQ18V2wmO5_G7A8$out" = weak_odr constant [2 x ptr] [ptr @_llgo_int64, ptr @_llgo_error], align 8 @@ -159,7 +159,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/abimethod" @"_llgo_func$q-bw-_pPYBCXnr1TXIF8sOD4fVVzzIlpHqD-A13AB4Y" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1043083527, i8 0, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @61, i64 26 }, ptr @"*_llgo_func$q-bw-_pPYBCXnr1TXIF8sOD4fVVzzIlpHqD-A13AB4Y" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$q-bw-_pPYBCXnr1TXIF8sOD4fVVzzIlpHqD-A13AB4Y$out", i64 3, i64 3 } }, align 8 @61 = private unnamed_addr constant [26 x i8] c"func() (int32, int, error)", align 1 @"*_llgo_func$q-bw-_pPYBCXnr1TXIF8sOD4fVVzzIlpHqD-A13AB4Y" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 746645372, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @61, i64 26 }, ptr null }, ptr @"_llgo_func$q-bw-_pPYBCXnr1TXIF8sOD4fVVzzIlpHqD-A13AB4Y" }, align 8 -@_llgo_int32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 1448558410, i8 12, i8 4, i8 4, i8 37, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @62, i64 5 }, ptr @"*_llgo_int32" }, align 8 +@_llgo_int32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 1448558410, i8 12, i8 4, i8 4, i8 5, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @62, i64 5 }, ptr @"*_llgo_int32" }, align 8 @62 = private unnamed_addr constant [5 x i8] c"int32", align 1 @"*_llgo_int32" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -38689692, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @62, i64 5 }, ptr null }, ptr @_llgo_int32 }, align 8 @"_llgo_func$q-bw-_pPYBCXnr1TXIF8sOD4fVVzzIlpHqD-A13AB4Y$out" = weak_odr constant [3 x ptr] [ptr @_llgo_int32, ptr @_llgo_int, ptr @_llgo_error], align 8 @@ -215,7 +215,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/abimethod" @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -541022001, i8 0, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @84, i64 11 }, ptr @"*_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk$out", i64 1, i64 1 } }, align 8 @84 = private unnamed_addr constant [11 x i8] c"func() bool", align 1 @"*_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -367308996, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @84, i64 11 }, ptr null }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk" }, align 8 -@_llgo_bool = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 554183389, i8 12, i8 1, i8 1, i8 33, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @85, i64 4 }, ptr @"*_llgo_bool" }, align 8 +@_llgo_bool = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 554183389, i8 12, i8 1, i8 1, i8 1, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @85, i64 4 }, ptr @"*_llgo_bool" }, align 8 @85 = private unnamed_addr constant [4 x i8] c"bool", align 1 @"*_llgo_bool" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1896950390, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @85, i64 4 }, ptr null }, ptr @_llgo_bool }, align 8 @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk$out" = weak_odr constant [1 x ptr] [ptr @_llgo_bool], align 8 @@ -278,36 +278,51 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/abimethod" @110 = private unnamed_addr constant [16 x i8] c"testNamed1 error", align 1 @111 = private unnamed_addr constant [16 x i8] c"testNamed2 error", align 1 @112 = private unnamed_addr constant [16 x i8] c"testNamed4 error", align 1 +@llvm.compiler.used = appending global [70 x ptr] [ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.T.Demo1", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo1", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo2", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).demo3", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo1", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo2", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.demo3", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo1", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo2", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.demo3", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo1", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo1", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo2", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; github.com/goplus/llgo/cl/_testgo/abimethod.T}.demo3", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Available", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.AvailableBuffer", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Bytes", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Cap", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Grow", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Len", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Next", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Read", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.ReadByte", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.ReadBytes", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.ReadFrom", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.ReadRune", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.ReadString", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Reset", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.String", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Truncate", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.UnreadByte", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.UnreadRune", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Write", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.WriteByte", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.WriteRune", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.WriteString", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.WriteTo", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.empty", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.grow", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.readSlice", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.tryGrowByReslice", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Available", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.AvailableBuffer", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Bytes", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Cap", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Grow", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Len", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Next", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Read", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.ReadByte", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.ReadBytes", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.ReadFrom", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.ReadRune", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.ReadString", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Reset", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.String", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Truncate", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.UnreadByte", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.UnreadRune", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Write", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.WriteByte", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.WriteRune", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.WriteString", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.WriteTo", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.empty", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.grow", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.readSlice", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.tryGrowByReslice", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.(*Pointer[any]).Load", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.(*Pointer[any]).Store"], section "llvm.metadata" define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.T.Demo1"(%"github.com/goplus/llgo/cl/_testgo/abimethod.T" %0) { _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testgo/abimethod.T", align 8 call void @llvm.memset(ptr %1, i8 0, i64 8, i1 false) store %"github.com/goplus/llgo/cl/_testgo/abimethod.T" %0, ptr %1, align 4 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %1, i32 0, i32 0 - %3 = load i64, ptr %2, align 4 - ret i64 %3 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %1, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %3, align 4 + ret i64 %5 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo1"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %0, align 4 - %2 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.T.Demo1"(%"github.com/goplus/llgo/cl/_testgo/abimethod.T" %1) - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %0, align 4 + %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.T.Demo1"(%"github.com/goplus/llgo/cl/_testgo/abimethod.T" %2) + ret i64 %3 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo2"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %0, i32 0, i32 0 - %2 = load i64, ptr %1, align 4 - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + ret i64 %4 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).demo3"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %0, i32 0, i32 0 - %2 = load i64, ptr %1, align 4 - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + ret i64 %4 } define void @"github.com/goplus/llgo/cl/_testgo/abimethod.init"() { @@ -347,33 +362,39 @@ _llgo_0: define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testAnonymous1"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %3, i32 0, i32 0 - store i64 100, ptr %4, align 4 - store i64 10, ptr %1, align 4 - store ptr %3, ptr %2, align 8 - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$WkyTd7mXEW0USaC6FIo7OG9IdUUyjAJl_h3PFrMEtHc", ptr @"*github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8") - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %5, 0 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, ptr %0, 1 - %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %7) - %9 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 0 - %10 = getelementptr ptr, ptr %9, i64 3 - %11 = load ptr, ptr %10, align 8 - %12 = insertvalue { ptr, ptr } undef, ptr %11, 0 - %13 = insertvalue { ptr, ptr } %12, ptr %8, 1 - %14 = extractvalue { ptr, ptr } %13, 1 - %15 = extractvalue { ptr, ptr } %13, 0 - %16 = call i64 %15(ptr %14) - %17 = icmp ne i64 %16, 100 - br i1 %17, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %5, i32 0, i32 0 + store i64 100, ptr %7, align 4 + store i64 10, ptr %2, align 4 + store ptr %5, ptr %4, align 8 + %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$WkyTd7mXEW0USaC6FIo7OG9IdUUyjAJl_h3PFrMEtHc", ptr @"*github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8") + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %8, 0 + %10 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, ptr %0, 1 + %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %10) + %12 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %10, 0 + %13 = getelementptr ptr, ptr %12, i64 3 + %14 = load ptr, ptr %13, align 8 + %15 = insertvalue { ptr, ptr } undef, ptr %14, 0 + %16 = insertvalue { ptr, ptr } %15, ptr %11, 1 + %17 = extractvalue { ptr, ptr } %16, 1 + %18 = extractvalue { ptr, ptr } %16, 0 + %19 = call i64 %18(ptr %17) + %20 = icmp ne i64 %19, 100 + br i1 %20, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 20 }, ptr %18, align 8 - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %18, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %19) + %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 20 }, ptr %21, align 8 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %21, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %22) unreachable _llgo_2: ; preds = %_llgo_0 @@ -384,36 +405,46 @@ define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testAnonymous2"() { _llgo_0: %0 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %0, i8 0, i64 16, i1 false) - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %3, i32 0, i32 0 - store i64 100, ptr %4, align 4 - store i64 10, ptr %1, align 4 - store ptr %3, ptr %2, align 8 - %5 = load { i64, ptr }, ptr %0, align 8 - %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store { i64, ptr } %5, ptr %6, align 8 - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$WkyTd7mXEW0USaC6FIo7OG9IdUUyjAJl_h3PFrMEtHc", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8") - %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %7, 0 - %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, ptr %6, 1 - %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %9) - %11 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 0 - %12 = getelementptr ptr, ptr %11, i64 3 - %13 = load ptr, ptr %12, align 8 - %14 = insertvalue { ptr, ptr } undef, ptr %13, 0 - %15 = insertvalue { ptr, ptr } %14, ptr %10, 1 - %16 = extractvalue { ptr, ptr } %15, 1 - %17 = extractvalue { ptr, ptr } %15, 0 - %18 = call i64 %17(ptr %16) - %19 = icmp ne i64 %18, 100 - br i1 %19, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %5, i32 0, i32 0 + store i64 100, ptr %7, align 4 + store i64 10, ptr %2, align 4 + store ptr %5, ptr %4, align 8 + %8 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load { i64, ptr }, ptr %0, align 8 + %10 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8", ptr %11, ptr %0) + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$WkyTd7mXEW0USaC6FIo7OG9IdUUyjAJl_h3PFrMEtHc", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8") + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %12, 0 + %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %13, ptr %11, 1 + %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %14) + %16 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %14, 0 + %17 = getelementptr ptr, ptr %16, i64 3 + %18 = load ptr, ptr %17, align 8 + %19 = insertvalue { ptr, ptr } undef, ptr %18, 0 + %20 = insertvalue { ptr, ptr } %19, ptr %15, 1 + %21 = extractvalue { ptr, ptr } %20, 1 + %22 = extractvalue { ptr, ptr } %20, 0 + %23 = call i64 %22(ptr %21) + %24 = icmp ne i64 %23, 100 + br i1 %24, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 20 }, ptr %20, align 8 - %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %21) + %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 20 }, ptr %25, align 8 + %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %25, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %26) unreachable _llgo_2: ; preds = %_llgo_0 @@ -424,34 +455,44 @@ define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testAnonymous3"() { _llgo_0: %0 = alloca { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, align 8 call void @llvm.memset(ptr %0, i8 0, i64 16, i1 false) - %1 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 1 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %2, i32 0, i32 0 - store i64 10, ptr %1, align 4 - store i64 100, ptr %3, align 4 - %4 = load { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, align 4 - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" } %4, ptr %5, align 4 - %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$WkyTd7mXEW0USaC6FIo7OG9IdUUyjAJl_h3PFrMEtHc", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$F3FioEGWwXQRUdV6xoxVUEDjRNgBQIpL0XIyBECp088") - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %6, 0 - %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, ptr %5, 1 - %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %8) - %10 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 0 - %11 = getelementptr ptr, ptr %10, i64 3 - %12 = load ptr, ptr %11, align 8 - %13 = insertvalue { ptr, ptr } undef, ptr %12, 0 - %14 = insertvalue { ptr, ptr } %13, ptr %9, 1 - %15 = extractvalue { ptr, ptr } %14, 1 - %16 = extractvalue { ptr, ptr } %14, 0 - %17 = call i64 %16(ptr %15) - %18 = icmp ne i64 %17, 100 - br i1 %18, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %4, i32 0, i32 0 + store i64 10, ptr %2, align 4 + store i64 100, ptr %6, align 4 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = load { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, align 4 + %9 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$F3FioEGWwXQRUdV6xoxVUEDjRNgBQIpL0XIyBECp088", ptr %10, ptr %0) + %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$WkyTd7mXEW0USaC6FIo7OG9IdUUyjAJl_h3PFrMEtHc", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$F3FioEGWwXQRUdV6xoxVUEDjRNgBQIpL0XIyBECp088") + %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %11, 0 + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %12, ptr %10, 1 + %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %13) + %15 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %13, 0 + %16 = getelementptr ptr, ptr %15, i64 3 + %17 = load ptr, ptr %16, align 8 + %18 = insertvalue { ptr, ptr } undef, ptr %17, 0 + %19 = insertvalue { ptr, ptr } %18, ptr %14, 1 + %20 = extractvalue { ptr, ptr } %19, 1 + %21 = extractvalue { ptr, ptr } %19, 0 + %22 = call i64 %21(ptr %20) + %23 = icmp ne i64 %22, 100 + br i1 %23, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 20 }, ptr %19, align 8 - %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %19, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %20) + %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 20 }, ptr %24, align 8 + %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %24, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %25) unreachable _llgo_2: ; preds = %_llgo_0 @@ -461,88 +502,20 @@ _llgo_2: ; preds = %_llgo_0 define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testAnonymous4"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %1 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 1 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %2, i32 0, i32 0 - store i64 10, ptr %1, align 4 - store i64 100, ptr %3, align 4 - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$WkyTd7mXEW0USaC6FIo7OG9IdUUyjAJl_h3PFrMEtHc", ptr @"*github.com/goplus/llgo/cl/_testgo/abimethod.struct$F3FioEGWwXQRUdV6xoxVUEDjRNgBQIpL0XIyBECp088") - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %4, 0 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, ptr %0, 1 - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %6) - %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 0 - %9 = getelementptr ptr, ptr %8, i64 3 - %10 = load ptr, ptr %9, align 8 - %11 = insertvalue { ptr, ptr } undef, ptr %10, 0 - %12 = insertvalue { ptr, ptr } %11, ptr %7, 1 - %13 = extractvalue { ptr, ptr } %12, 1 - %14 = extractvalue { ptr, ptr } %12, 0 - %15 = call i64 %14(ptr %13) - %16 = icmp ne i64 %15, 100 - br i1 %16, label %_llgo_1, label %_llgo_2 - -_llgo_1: ; preds = %_llgo_0 - %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 20 }, ptr %17, align 8 - %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %17, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %18) - unreachable - -_llgo_2: ; preds = %_llgo_0 - ret void -} - -define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testAnonymous5"() { -_llgo_0: - %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %1 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 1 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %2, i32 0, i32 0 - store i64 10, ptr %1, align 4 - store i64 100, ptr %3, align 4 - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$GIQLduxo5T_xLwYbboAKy8LzikHgsGzb7WxrkOH3Lr4", ptr @"*github.com/goplus/llgo/cl/_testgo/abimethod.struct$F3FioEGWwXQRUdV6xoxVUEDjRNgBQIpL0XIyBECp088") - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %4, 0 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, ptr %0, 1 - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %6) - %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 0 - %9 = getelementptr ptr, ptr %8, i64 3 - %10 = load ptr, ptr %9, align 8 - %11 = insertvalue { ptr, ptr } undef, ptr %10, 0 - %12 = insertvalue { ptr, ptr } %11, ptr %7, 1 - %13 = extractvalue { ptr, ptr } %12, 1 - %14 = extractvalue { ptr, ptr } %12, 0 - %15 = call i64 %14(ptr %13) - %16 = icmp ne i64 %15, 100 - br i1 %16, label %_llgo_1, label %_llgo_2 - -_llgo_1: ; preds = %_llgo_0 - %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 20 }, ptr %17, align 8 - %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %17, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %18) - unreachable - -_llgo_2: ; preds = %_llgo_0 - ret void -} - -define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testAnonymous6"() { -_llgo_0: - %0 = alloca { i64, ptr }, align 8 - call void @llvm.memset(ptr %0, i8 0, i64 16, i1 false) - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %3, i32 0, i32 0 - store i64 100, ptr %4, align 4 - store i64 10, ptr %1, align 4 - store ptr %3, ptr %2, align 8 - %5 = load { i64, ptr }, ptr %0, align 8 - %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store { i64, ptr } %5, ptr %6, align 8 - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$GIQLduxo5T_xLwYbboAKy8LzikHgsGzb7WxrkOH3Lr4", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8") + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %4, i32 0, i32 0 + store i64 10, ptr %2, align 4 + store i64 100, ptr %6, align 4 + %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$WkyTd7mXEW0USaC6FIo7OG9IdUUyjAJl_h3PFrMEtHc", ptr @"*github.com/goplus/llgo/cl/_testgo/abimethod.struct$F3FioEGWwXQRUdV6xoxVUEDjRNgBQIpL0XIyBECp088") %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %7, 0 - %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, ptr %6, 1 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, ptr %0, 1 %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %9) %11 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 0 %12 = getelementptr ptr, ptr %11, i64 3 @@ -557,7 +530,7 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @21, i64 20 }, ptr %20, align 8 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 20 }, ptr %20, align 8 %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %21) unreachable @@ -566,23 +539,23 @@ _llgo_2: ; preds = %_llgo_0 ret void } -define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testAnonymous7"() { +define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testAnonymous5"() { _llgo_0: - %0 = alloca { i64, ptr }, align 8 - call void @llvm.memset(ptr %0, i8 0, i64 16, i1 false) - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %3, i32 0, i32 0 - store i64 100, ptr %4, align 4 - store i64 10, ptr %1, align 4 - store ptr %3, ptr %2, align 8 - %5 = load { i64, ptr }, ptr %0, align 8 - %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store { i64, ptr } %5, ptr %6, align 8 - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$58AxoxqQ6sGUOM73FOqFrXsMlgxkU4HGd-S1Wl-ssYw", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8") + %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %4, i32 0, i32 0 + store i64 10, ptr %2, align 4 + store i64 100, ptr %6, align 4 + %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$GIQLduxo5T_xLwYbboAKy8LzikHgsGzb7WxrkOH3Lr4", ptr @"*github.com/goplus/llgo/cl/_testgo/abimethod.struct$F3FioEGWwXQRUdV6xoxVUEDjRNgBQIpL0XIyBECp088") %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %7, 0 - %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, ptr %6, 1 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, ptr %0, 1 %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %9) %11 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 0 %12 = getelementptr ptr, ptr %11, i64 3 @@ -597,29 +570,129 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @23, i64 20 }, ptr %20, align 8 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 20 }, ptr %20, align 8 %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %21) unreachable _llgo_2: ; preds = %_llgo_0 - %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %9) - %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 0 - %24 = getelementptr ptr, ptr %23, i64 4 - %25 = load ptr, ptr %24, align 8 - %26 = insertvalue { ptr, ptr } undef, ptr %25, 0 - %27 = insertvalue { ptr, ptr } %26, ptr %22, 1 - %28 = extractvalue { ptr, ptr } %27, 1 - %29 = extractvalue { ptr, ptr } %27, 0 - %30 = call i64 %29(ptr %28) - %31 = icmp ne i64 %30, 100 - br i1 %31, label %_llgo_3, label %_llgo_4 + ret void +} + +define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testAnonymous6"() { +_llgo_0: + %0 = alloca { i64, ptr }, align 8 + call void @llvm.memset(ptr %0, i8 0, i64 16, i1 false) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %5, i32 0, i32 0 + store i64 100, ptr %7, align 4 + store i64 10, ptr %2, align 4 + store ptr %5, ptr %4, align 8 + %8 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load { i64, ptr }, ptr %0, align 8 + %10 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8", ptr %11, ptr %0) + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$GIQLduxo5T_xLwYbboAKy8LzikHgsGzb7WxrkOH3Lr4", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8") + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %12, 0 + %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %13, ptr %11, 1 + %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %14) + %16 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %14, 0 + %17 = getelementptr ptr, ptr %16, i64 3 + %18 = load ptr, ptr %17, align 8 + %19 = insertvalue { ptr, ptr } undef, ptr %18, 0 + %20 = insertvalue { ptr, ptr } %19, ptr %15, 1 + %21 = extractvalue { ptr, ptr } %20, 1 + %22 = extractvalue { ptr, ptr } %20, 0 + %23 = call i64 %22(ptr %21) + %24 = icmp ne i64 %23, 100 + br i1 %24, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @21, i64 20 }, ptr %25, align 8 + %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %25, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %26) + unreachable + +_llgo_2: ; preds = %_llgo_0 + ret void +} + +define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testAnonymous7"() { +_llgo_0: + %0 = alloca { i64, ptr }, align 8 + call void @llvm.memset(ptr %0, i8 0, i64 16, i1 false) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %5, i32 0, i32 0 + store i64 100, ptr %7, align 4 + store i64 10, ptr %2, align 4 + store ptr %5, ptr %4, align 8 + %8 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load { i64, ptr }, ptr %0, align 8 + %10 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8", ptr %11, ptr %0) + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$58AxoxqQ6sGUOM73FOqFrXsMlgxkU4HGd-S1Wl-ssYw", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8") + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %12, 0 + %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %13, ptr %11, 1 + %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %14) + %16 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %14, 0 + %17 = getelementptr ptr, ptr %16, i64 3 + %18 = load ptr, ptr %17, align 8 + %19 = insertvalue { ptr, ptr } undef, ptr %18, 0 + %20 = insertvalue { ptr, ptr } %19, ptr %15, 1 + %21 = extractvalue { ptr, ptr } %20, 1 + %22 = extractvalue { ptr, ptr } %20, 0 + %23 = call i64 %22(ptr %21) + %24 = icmp ne i64 %23, 100 + br i1 %24, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @23, i64 20 }, ptr %25, align 8 + %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %25, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %26) + unreachable + +_llgo_2: ; preds = %_llgo_0 + %27 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %14) + %28 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %14, 0 + %29 = getelementptr ptr, ptr %28, i64 4 + %30 = load ptr, ptr %29, align 8 + %31 = insertvalue { ptr, ptr } undef, ptr %30, 0 + %32 = insertvalue { ptr, ptr } %31, ptr %27, 1 + %33 = extractvalue { ptr, ptr } %32, 1 + %34 = extractvalue { ptr, ptr } %32, 0 + %35 = call i64 %34(ptr %33) + %36 = icmp ne i64 %35, 100 + br i1 %36, label %_llgo_3, label %_llgo_4 _llgo_3: ; preds = %_llgo_2 - %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @23, i64 20 }, ptr %32, align 8 - %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %32, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %33) + %37 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @23, i64 20 }, ptr %37, align 8 + %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %37, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %38) unreachable _llgo_4: ; preds = %_llgo_2 @@ -630,76 +703,86 @@ define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testAnonymous8"() { _llgo_0: %0 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %0, i8 0, i64 16, i1 false) - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %3, i32 0, i32 0 - store i64 100, ptr %4, align 4 - store i64 10, ptr %1, align 4 - store ptr %3, ptr %2, align 8 - %5 = load { i64, ptr }, ptr %0, align 8 - %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store { i64, ptr } %5, ptr %6, align 8 - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.iface$kT5SIXt45Cspjl04Bof3DZVSOIltlDo-njpk6KqtZvA", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8") - %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %7, 0 - %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, ptr %6, 1 - %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %9) - %11 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 0 - %12 = getelementptr ptr, ptr %11, i64 3 - %13 = load ptr, ptr %12, align 8 - %14 = insertvalue { ptr, ptr } undef, ptr %13, 0 - %15 = insertvalue { ptr, ptr } %14, ptr %10, 1 - %16 = extractvalue { ptr, ptr } %15, 1 - %17 = extractvalue { ptr, ptr } %15, 0 - %18 = call i64 %17(ptr %16) - %19 = icmp ne i64 %18, 100 - br i1 %19, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %5, i32 0, i32 0 + store i64 100, ptr %7, align 4 + store i64 10, ptr %2, align 4 + store ptr %5, ptr %4, align 8 + %8 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load { i64, ptr }, ptr %0, align 8 + %10 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8", ptr %11, ptr %0) + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.iface$kT5SIXt45Cspjl04Bof3DZVSOIltlDo-njpk6KqtZvA", ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.struct$mRfo5gQx8vKF1DvrL24XRoyvI_ttVDcwc1JYMRxWfb8") + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %12, 0 + %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %13, ptr %11, 1 + %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %14) + %16 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %14, 0 + %17 = getelementptr ptr, ptr %16, i64 3 + %18 = load ptr, ptr %17, align 8 + %19 = insertvalue { ptr, ptr } undef, ptr %18, 0 + %20 = insertvalue { ptr, ptr } %19, ptr %15, 1 + %21 = extractvalue { ptr, ptr } %20, 1 + %22 = extractvalue { ptr, ptr } %20, 0 + %23 = call i64 %22(ptr %21) + %24 = icmp ne i64 %23, 100 + br i1 %24, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @25, i64 20 }, ptr %20, align 8 - %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %21) + %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @25, i64 20 }, ptr %25, align 8 + %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %25, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %26) unreachable _llgo_2: ; preds = %_llgo_0 - %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %9) - %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 0 - %24 = getelementptr ptr, ptr %23, i64 4 - %25 = load ptr, ptr %24, align 8 - %26 = insertvalue { ptr, ptr } undef, ptr %25, 0 - %27 = insertvalue { ptr, ptr } %26, ptr %22, 1 - %28 = extractvalue { ptr, ptr } %27, 1 - %29 = extractvalue { ptr, ptr } %27, 0 - %30 = call i64 %29(ptr %28) - %31 = icmp ne i64 %30, 100 - br i1 %31, label %_llgo_3, label %_llgo_4 + %27 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %14) + %28 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %14, 0 + %29 = getelementptr ptr, ptr %28, i64 4 + %30 = load ptr, ptr %29, align 8 + %31 = insertvalue { ptr, ptr } undef, ptr %30, 0 + %32 = insertvalue { ptr, ptr } %31, ptr %27, 1 + %33 = extractvalue { ptr, ptr } %32, 1 + %34 = extractvalue { ptr, ptr } %32, 0 + %35 = call i64 %34(ptr %33) + %36 = icmp ne i64 %35, 100 + br i1 %36, label %_llgo_3, label %_llgo_4 _llgo_3: ; preds = %_llgo_2 - %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @25, i64 20 }, ptr %32, align 8 - %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %32, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %33) + %37 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @25, i64 20 }, ptr %37, align 8 + %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %37, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %38) unreachable _llgo_4: ; preds = %_llgo_2 - %34 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %9) - %35 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 0 - %36 = getelementptr ptr, ptr %35, i64 5 - %37 = load ptr, ptr %36, align 8 - %38 = insertvalue { ptr, ptr } undef, ptr %37, 0 - %39 = insertvalue { ptr, ptr } %38, ptr %34, 1 - %40 = extractvalue { ptr, ptr } %39, 1 - %41 = extractvalue { ptr, ptr } %39, 0 - %42 = call i64 %41(ptr %40) - %43 = icmp ne i64 %42, 100 - br i1 %43, label %_llgo_5, label %_llgo_6 + %39 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %14) + %40 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %14, 0 + %41 = getelementptr ptr, ptr %40, i64 5 + %42 = load ptr, ptr %41, align 8 + %43 = insertvalue { ptr, ptr } undef, ptr %42, 0 + %44 = insertvalue { ptr, ptr } %43, ptr %39, 1 + %45 = extractvalue { ptr, ptr } %44, 1 + %46 = extractvalue { ptr, ptr } %44, 0 + %47 = call i64 %46(ptr %45) + %48 = icmp ne i64 %47, 100 + br i1 %48, label %_llgo_5, label %_llgo_6 _llgo_5: ; preds = %_llgo_4 - %44 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @25, i64 20 }, ptr %44, align 8 - %45 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %44, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %45) + %49 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @25, i64 20 }, ptr %49, align 8 + %50 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %49, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %50) unreachable _llgo_6: ; preds = %_llgo_4 @@ -709,32 +792,36 @@ _llgo_6: ; preds = %_llgo_4 define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testAnonymousBuffer"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = call ptr @bytes.NewBufferString(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @26, i64 5 }) - store i64 10, ptr %1, align 4 - store ptr %3, ptr %2, align 8 - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$O6rEVxIuA5O1E0KWpQBCgGx26X5gYhJ_nnJnHVL8_7U", ptr @"*github.com/goplus/llgo/cl/_testgo/abimethod.struct$RGW016k7zllXgGPm1CvD5-IBe-9lphOOTCFtYyDGLjY") - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %4, 0 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, ptr %0, 1 - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %6) - %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 0 - %9 = getelementptr ptr, ptr %8, i64 3 - %10 = load ptr, ptr %9, align 8 - %11 = insertvalue { ptr, ptr } undef, ptr %10, 0 - %12 = insertvalue { ptr, ptr } %11, ptr %7, 1 - %13 = extractvalue { ptr, ptr } %12, 1 - %14 = extractvalue { ptr, ptr } %12, 0 - %15 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %14(ptr %13) - %16 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %15, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @26, i64 5 }) - %17 = xor i1 %16, true - br i1 %17, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %5 = call ptr @bytes.NewBufferString(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @26, i64 5 }) + store i64 10, ptr %2, align 4 + store ptr %5, ptr %4, align 8 + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$O6rEVxIuA5O1E0KWpQBCgGx26X5gYhJ_nnJnHVL8_7U", ptr @"*github.com/goplus/llgo/cl/_testgo/abimethod.struct$RGW016k7zllXgGPm1CvD5-IBe-9lphOOTCFtYyDGLjY") + %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %6, 0 + %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, ptr %0, 1 + %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %8) + %10 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 0 + %11 = getelementptr ptr, ptr %10, i64 3 + %12 = load ptr, ptr %11, align 8 + %13 = insertvalue { ptr, ptr } undef, ptr %12, 0 + %14 = insertvalue { ptr, ptr } %13, ptr %9, 1 + %15 = extractvalue { ptr, ptr } %14, 1 + %16 = extractvalue { ptr, ptr } %14, 0 + %17 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %16(ptr %15) + %18 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %17, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @26, i64 5 }) + %19 = xor i1 %18, true + br i1 %19, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @95, i64 25 }, ptr %18, align 8 - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %18, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %19) + %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @95, i64 25 }, ptr %20, align 8 + %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %21) unreachable _llgo_2: ; preds = %_llgo_0 @@ -766,67 +853,74 @@ _llgo_0: %19 = extractvalue { ptr, ptr } %18, 1 %20 = extractvalue { ptr, ptr } %18, 0 %21 = call ptr %20(ptr %19) - %22 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %21, align 8 - %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %22, 0 - %24 = icmp eq ptr %23, @_llgo_int - br i1 %24, label %_llgo_3, label %_llgo_4 + %22 = icmp eq ptr %21, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %22) + %23 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %21, align 8 + %24 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %23, 0 + %25 = icmp eq ptr %24, @_llgo_int + br i1 %25, label %_llgo_3, label %_llgo_4 _llgo_1: ; preds = %_llgo_3 - %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @109, i64 17 }, ptr %25, align 8 - %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %25, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %26) + %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @109, i64 17 }, ptr %26, align 8 + %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %26, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %27) unreachable _llgo_2: ; preds = %_llgo_3 ret void _llgo_3: ; preds = %_llgo_0 - %27 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %22, 1 - %28 = ptrtoint ptr %27 to i64 - %29 = icmp ne i64 %28, 100 - br i1 %29, label %_llgo_1, label %_llgo_2 + %28 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %23, 1 + %29 = load i64, ptr %28, align 4 + %30 = icmp ne i64 %29, 100 + br i1 %30, label %_llgo_1, label %_llgo_2 _llgo_4: ; preds = %_llgo_0 - %30 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @108, i64 40 }, ptr %30, align 8 - %31 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %30, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %31) + %31 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @108, i64 40 }, ptr %31, align 8 + %32 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %31, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %32) unreachable } define ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.testGeneric$1"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 100 to ptr) }, ptr %0, align 8 + %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 100, ptr %1, align 4 + %2 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %1, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %2, ptr %0, align 8 ret ptr %0 } define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testNamed1"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %0, i32 0, i32 0 - store i64 100, ptr %1, align 4 - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$WkyTd7mXEW0USaC6FIo7OG9IdUUyjAJl_h3PFrMEtHc", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T") - %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %2, 0 - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3, ptr %0, 1 - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %4) - %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, 0 - %7 = getelementptr ptr, ptr %6, i64 3 - %8 = load ptr, ptr %7, align 8 - %9 = insertvalue { ptr, ptr } undef, ptr %8, 0 - %10 = insertvalue { ptr, ptr } %9, ptr %5, 1 - %11 = extractvalue { ptr, ptr } %10, 1 - %12 = extractvalue { ptr, ptr } %10, 0 - %13 = call i64 %12(ptr %11) - %14 = icmp ne i64 %13, 100 - br i1 %14, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %0, i32 0, i32 0 + store i64 100, ptr %2, align 4 + %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$WkyTd7mXEW0USaC6FIo7OG9IdUUyjAJl_h3PFrMEtHc", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T") + %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %3, 0 + %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %0, 1 + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %5) + %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, 0 + %8 = getelementptr ptr, ptr %7, i64 3 + %9 = load ptr, ptr %8, align 8 + %10 = insertvalue { ptr, ptr } undef, ptr %9, 0 + %11 = insertvalue { ptr, ptr } %10, ptr %6, 1 + %12 = extractvalue { ptr, ptr } %11, 1 + %13 = extractvalue { ptr, ptr } %11, 0 + %14 = call i64 %13(ptr %12) + %15 = icmp ne i64 %14, 100 + br i1 %15, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @110, i64 16 }, ptr %15, align 8 - %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %15, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %16) + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @110, i64 16 }, ptr %16, align 8 + %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %16, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %17) unreachable _llgo_2: ; preds = %_llgo_0 @@ -837,31 +931,37 @@ define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testNamed2"() { _llgo_0: %0 = alloca %"github.com/goplus/llgo/cl/_testgo/abimethod.T", align 8 call void @llvm.memset(ptr %0, i8 0, i64 8, i1 false) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %0, i32 0, i32 0 - store i64 100, ptr %1, align 4 - %2 = load %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %0, align 4 - %3 = extractvalue %"github.com/goplus/llgo/cl/_testgo/abimethod.T" %2, 0 - %4 = inttoptr i64 %3 to ptr - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$WkyTd7mXEW0USaC6FIo7OG9IdUUyjAJl_h3PFrMEtHc", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T") - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %5, 0 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, ptr %4, 1 - %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %7) - %9 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 0 - %10 = getelementptr ptr, ptr %9, i64 3 - %11 = load ptr, ptr %10, align 8 - %12 = insertvalue { ptr, ptr } undef, ptr %11, 0 - %13 = insertvalue { ptr, ptr } %12, ptr %8, 1 - %14 = extractvalue { ptr, ptr } %13, 1 - %15 = extractvalue { ptr, ptr } %13, 0 - %16 = call i64 %15(ptr %14) - %17 = icmp ne i64 %16, 100 - br i1 %17, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %0, i32 0, i32 0 + store i64 100, ptr %2, align 4 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %0, align 4 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %6, ptr %0) + %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$WkyTd7mXEW0USaC6FIo7OG9IdUUyjAJl_h3PFrMEtHc", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T") + %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %7, 0 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, ptr %6, 1 + %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %9) + %11 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 0 + %12 = getelementptr ptr, ptr %11, i64 3 + %13 = load ptr, ptr %12, align 8 + %14 = insertvalue { ptr, ptr } undef, ptr %13, 0 + %15 = insertvalue { ptr, ptr } %14, ptr %10, 1 + %16 = extractvalue { ptr, ptr } %15, 1 + %17 = extractvalue { ptr, ptr } %15, 0 + %18 = call i64 %17(ptr %16) + %19 = icmp ne i64 %18, 100 + br i1 %19, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @111, i64 16 }, ptr %18, align 8 - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %18, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %19) + %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @111, i64 16 }, ptr %20, align 8 + %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %21) unreachable _llgo_2: ; preds = %_llgo_0 @@ -871,28 +971,30 @@ _llgo_2: ; preds = %_llgo_0 define void @"github.com/goplus/llgo/cl/_testgo/abimethod.testNamed3"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %0, i32 0, i32 0 - store i64 100, ptr %1, align 4 - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$GIQLduxo5T_xLwYbboAKy8LzikHgsGzb7WxrkOH3Lr4", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T") - %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %2, 0 - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3, ptr %0, 1 - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %4) - %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, 0 - %7 = getelementptr ptr, ptr %6, i64 3 - %8 = load ptr, ptr %7, align 8 - %9 = insertvalue { ptr, ptr } undef, ptr %8, 0 - %10 = insertvalue { ptr, ptr } %9, ptr %5, 1 - %11 = extractvalue { ptr, ptr } %10, 1 - %12 = extractvalue { ptr, ptr } %10, 0 - %13 = call i64 %12(ptr %11) - %14 = icmp ne i64 %13, 100 - br i1 %14, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %0, i32 0, i32 0 + store i64 100, ptr %2, align 4 + %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$GIQLduxo5T_xLwYbboAKy8LzikHgsGzb7WxrkOH3Lr4", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/abimethod.T") + %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %3, 0 + %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %0, 1 + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %5) + %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, 0 + %8 = getelementptr ptr, ptr %7, i64 3 + %9 = load ptr, ptr %8, align 8 + %10 = insertvalue { ptr, ptr } undef, ptr %9, 0 + %11 = insertvalue { ptr, ptr } %10, ptr %6, 1 + %12 = extractvalue { ptr, ptr } %11, 1 + %13 = extractvalue { ptr, ptr } %11, 0 + %14 = call i64 %13(ptr %12) + %15 = icmp ne i64 %14, 100 + br i1 %15, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @112, i64 16 }, ptr %15, align 8 - %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %15, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %16) + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @112, i64 16 }, ptr %16, align 8 + %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %16, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %17) unreachable _llgo_2: ; preds = %_llgo_0 @@ -902,6 +1004,8 @@ _llgo_2: ; preds = %_llgo_0 ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @bytes.init() declare void @fmt.init() @@ -912,27 +1016,41 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo1"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - %3 = load %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %2, align 4 - %4 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.T.Demo1"(%"github.com/goplus/llgo/cl/_testgo/abimethod.T" %3) - ret i64 %4 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %4, align 4 + %7 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.T.Demo1"(%"github.com/goplus/llgo/cl/_testgo/abimethod.T" %6) + ret i64 %7 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo2"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo2"(ptr %2) - ret i64 %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo2"(ptr %4) + ret i64 %5 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.demo3"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).demo3"(ptr %2) - ret i64 %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).demo3"(ptr %4) + ret i64 %5 } declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequalptr"(ptr, ptr) @@ -948,11 +1066,17 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = load %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %3, align 4 - %5 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.T.Demo1"(%"github.com/goplus/llgo/cl/_testgo/abimethod.T" %4) - ret i64 %5 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %5, align 4 + %8 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.T.Demo1"(%"github.com/goplus/llgo/cl/_testgo/abimethod.T" %7) + ret i64 %8 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo2"({ i64, ptr } %0) { @@ -960,10 +1084,14 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo2"(ptr %3) - ret i64 %4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo2"(ptr %5) + ret i64 %6 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *github.com/goplus/llgo/cl/_testgo/abimethod.T}.demo3"({ i64, ptr } %0) { @@ -971,10 +1099,14 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).demo3"(ptr %3) - ret i64 %4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).demo3"(ptr %5) + ret i64 %6 } declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.structequal"(ptr, ptr, ptr) @@ -1011,305 +1143,427 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) declare void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface") +declare void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr, ptr, ptr) + define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo1"({ i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" } %0) { _llgo_0: %1 = alloca { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" } %0, ptr %1, align 4 - %2 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %1, i32 0, i32 1 - %3 = load %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %2, align 4 - %4 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.T.Demo1"(%"github.com/goplus/llgo/cl/_testgo/abimethod.T" %3) - ret i64 %4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %3, align 4 + %6 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.T.Demo1"(%"github.com/goplus/llgo/cl/_testgo/abimethod.T" %5) + ret i64 %6 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo1"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 1 - %2 = load %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %1, align 4 - %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.T.Demo1"(%"github.com/goplus/llgo/cl/_testgo/abimethod.T" %2) - ret i64 %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load %"github.com/goplus/llgo/cl/_testgo/abimethod.T", ptr %2, align 4 + %5 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.T.Demo1"(%"github.com/goplus/llgo/cl/_testgo/abimethod.T" %4) + ret i64 %5 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; github.com/goplus/llgo/cl/_testgo/abimethod.T}.Demo2"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 1 - %2 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo2"(ptr %1) - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 1 + %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).Demo2"(ptr %2) + ret i64 %3 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; github.com/goplus/llgo/cl/_testgo/abimethod.T}.demo3"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 1 - %2 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).demo3"(ptr %1) - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, %"github.com/goplus/llgo/cl/_testgo/abimethod.T" }, ptr %0, i32 0, i32 1 + %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.(*T).demo3"(ptr %2) + ret i64 %3 } declare ptr @bytes.NewBufferString(%"github.com/goplus/llgo/runtime/internal/runtime.String") define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Available"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - %3 = call i64 @"bytes.(*Buffer).Available"(ptr %2) - ret i64 %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call i64 @"bytes.(*Buffer).Available"(ptr %4) + ret i64 %5 } define %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.AvailableBuffer"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - %3 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).AvailableBuffer"(ptr %2) - ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).AvailableBuffer"(ptr %4) + ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5 } define %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Bytes"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - %3 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Bytes"(ptr %2) - ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Bytes"(ptr %4) + ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Cap"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - %3 = call i64 @"bytes.(*Buffer).Cap"(ptr %2) - ret i64 %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call i64 @"bytes.(*Buffer).Cap"(ptr %4) + ret i64 %5 } define void @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Grow"(ptr %0, i64 %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - call void @"bytes.(*Buffer).Grow"(ptr %3, i64 %1) + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + call void @"bytes.(*Buffer).Grow"(ptr %5, i64 %1) ret void } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Len"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - %3 = call i64 @"bytes.(*Buffer).Len"(ptr %2) - ret i64 %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call i64 @"bytes.(*Buffer).Len"(ptr %4) + ret i64 %5 } define %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Next"(ptr %0, i64 %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Next"(ptr %3, i64 %1) - ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %4 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Next"(ptr %5, i64 %1) + ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Read"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Read"(ptr %3, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) - %5 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 0 - %6 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 1 - %7 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %5, 0 - %8 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Read"(ptr %5, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) + %7 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 0 + %8 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 1 + %9 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %7, 0 + %10 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10 } define { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.ReadByte"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - %3 = call { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadByte"(ptr %2) - %4 = extractvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %3, 0 - %5 = extractvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %3, 1 - %6 = insertvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i8 %4, 0 - %7 = insertvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, 1 - ret { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadByte"(ptr %4) + %6 = extractvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 0 + %7 = extractvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 1 + %8 = insertvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i8 %6, 0 + %9 = insertvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 1 + ret { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9 } define { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.ReadBytes"(ptr %0, i8 %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadBytes"(ptr %3, i8 %1) - %5 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 0 - %6 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 1 - %7 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, 0 - %8 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 1 - ret { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadBytes"(ptr %5, i8 %1) + %7 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 0 + %8 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 1 + %9 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 0 + %10 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 1 + ret { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.ReadFrom"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadFrom"(ptr %3, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) - %5 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 0 - %6 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 1 - %7 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %5, 0 - %8 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadFrom"(ptr %5, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) + %7 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 0 + %8 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 1 + %9 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %7, 0 + %10 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10 } define { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.ReadRune"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - %3 = call { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadRune"(ptr %2) - %4 = extractvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %3, 0 - %5 = extractvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %3, 1 - %6 = extractvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %3, 2 - %7 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i32 %4, 0 - %8 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, i64 %5, 1 - %9 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 2 - ret { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadRune"(ptr %4) + %6 = extractvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 0 + %7 = extractvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 1 + %8 = extractvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 2 + %9 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i32 %6, 0 + %10 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9, i64 %7, 1 + %11 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 2 + ret { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %11 } define { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.ReadString"(ptr %0, i8 %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadString"(ptr %3, i8 %1) - %5 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 0 - %6 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 1 - %7 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, %"github.com/goplus/llgo/runtime/internal/runtime.String" %5, 0 - %8 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 1 - ret { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadString"(ptr %5, i8 %1) + %7 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 0 + %8 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 1 + %9 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, %"github.com/goplus/llgo/runtime/internal/runtime.String" %7, 0 + %10 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 1 + ret { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10 } define void @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Reset"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - call void @"bytes.(*Buffer).Reset"(ptr %2) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + call void @"bytes.(*Buffer).Reset"(ptr %4) ret void } define %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.String"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - %3 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"bytes.(*Buffer).String"(ptr %2) - ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"bytes.(*Buffer).String"(ptr %4) + ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %5 } define void @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Truncate"(ptr %0, i64 %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - call void @"bytes.(*Buffer).Truncate"(ptr %3, i64 %1) + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + call void @"bytes.(*Buffer).Truncate"(ptr %5, i64 %1) ret void } define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.UnreadByte"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - %3 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadByte"(ptr %2) - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadByte"(ptr %4) + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5 } define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.UnreadRune"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - %3 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadRune"(ptr %2) - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadRune"(ptr %4) + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.Write"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Write"(ptr %3, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) - %5 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 0 - %6 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 1 - %7 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %5, 0 - %8 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Write"(ptr %5, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) + %7 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 0 + %8 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 1 + %9 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %7, 0 + %10 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10 } define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.WriteByte"(ptr %0, i8 %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).WriteByte"(ptr %3, i8 %1) - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).WriteByte"(ptr %5, i8 %1) + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.WriteRune"(ptr %0, i32 %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteRune"(ptr %3, i32 %1) - %5 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 0 - %6 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 1 - %7 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %5, 0 - %8 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteRune"(ptr %5, i32 %1) + %7 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 0 + %8 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 1 + %9 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %7, 0 + %10 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.WriteString"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteString"(ptr %3, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) - %5 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 0 - %6 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 1 - %7 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %5, 0 - %8 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteString"(ptr %5, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) + %7 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 0 + %8 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 1 + %9 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %7, 0 + %10 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.WriteTo"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteTo"(ptr %3, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) - %5 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 0 - %6 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 1 - %7 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %5, 0 - %8 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteTo"(ptr %5, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) + %7 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 0 + %8 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 1 + %9 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %7, 0 + %10 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10 } define i1 @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.empty"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %2 = load ptr, ptr %1, align 8 - %3 = call i1 @"bytes.(*Buffer).empty"(ptr %2) - ret i1 %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call i1 @"bytes.(*Buffer).empty"(ptr %4) + ret i1 %5 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.grow"(ptr %0, i64 %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call i64 @"bytes.(*Buffer).grow"(ptr %3, i64 %1) - ret i64 %4 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call i64 @"bytes.(*Buffer).grow"(ptr %5, i64 %1) + ret i64 %6 } define { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.readSlice"(ptr %0, i8 %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).readSlice"(ptr %3, i8 %1) - %5 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 0 - %6 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 1 - %7 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, 0 - %8 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 1 - ret { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).readSlice"(ptr %5, i8 %1) + %7 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 0 + %8 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 1 + %9 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 0 + %10 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 1 + ret { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10 } define { i64, i1 } @"github.com/goplus/llgo/cl/_testgo/abimethod.*struct{m int; *bytes.Buffer}.tryGrowByReslice"(ptr %0, i64 %1) { _llgo_0: - %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call { i64, i1 } @"bytes.(*Buffer).tryGrowByReslice"(ptr %3, i64 %1) - %5 = extractvalue { i64, i1 } %4, 0 - %6 = extractvalue { i64, i1 } %4, 1 - %7 = insertvalue { i64, i1 } undef, i64 %5, 0 - %8 = insertvalue { i64, i1 } %7, i1 %6, 1 - ret { i64, i1 } %8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call { i64, i1 } @"bytes.(*Buffer).tryGrowByReslice"(ptr %5, i64 %1) + %7 = extractvalue { i64, i1 } %6, 0 + %8 = extractvalue { i64, i1 } %6, 1 + %9 = insertvalue { i64, i1 } undef, i64 %7, 0 + %10 = insertvalue { i64, i1 } %9, i1 %8, 1 + ret { i64, i1 } %10 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Available"({ i64, ptr } %0) { @@ -1317,10 +1571,14 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call i64 @"bytes.(*Buffer).Available"(ptr %3) - ret i64 %4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call i64 @"bytes.(*Buffer).Available"(ptr %5) + ret i64 %6 } define %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.AvailableBuffer"({ i64, ptr } %0) { @@ -1328,10 +1586,14 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).AvailableBuffer"(ptr %3) - ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).AvailableBuffer"(ptr %5) + ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6 } define %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Bytes"({ i64, ptr } %0) { @@ -1339,10 +1601,14 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Bytes"(ptr %3) - ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Bytes"(ptr %5) + ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Cap"({ i64, ptr } %0) { @@ -1350,10 +1616,14 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call i64 @"bytes.(*Buffer).Cap"(ptr %3) - ret i64 %4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call i64 @"bytes.(*Buffer).Cap"(ptr %5) + ret i64 %6 } define void @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Grow"({ i64, ptr } %0, i64 %1) { @@ -1361,9 +1631,13 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - call void @"bytes.(*Buffer).Grow"(ptr %4, i64 %1) + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + call void @"bytes.(*Buffer).Grow"(ptr %6, i64 %1) ret void } @@ -1372,10 +1646,14 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call i64 @"bytes.(*Buffer).Len"(ptr %3) - ret i64 %4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call i64 @"bytes.(*Buffer).Len"(ptr %5) + ret i64 %6 } define %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Next"({ i64, ptr } %0, i64 %1) { @@ -1383,10 +1661,14 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - %5 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Next"(ptr %4, i64 %1) - ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + %7 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Next"(ptr %6, i64 %1) + ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Read"({ i64, ptr } %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) { @@ -1394,14 +1676,18 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - %5 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Read"(ptr %4, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) - %6 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 0 - %7 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 1 - %8 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %6, 0 - %9 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + %7 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Read"(ptr %6, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) + %8 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 0 + %9 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 1 + %10 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %8, 0 + %11 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %11 } define { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.ReadByte"({ i64, ptr } %0) { @@ -1409,14 +1695,18 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadByte"(ptr %3) - %5 = extractvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 0 - %6 = extractvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 1 - %7 = insertvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i8 %5, 0 - %8 = insertvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 1 - ret { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadByte"(ptr %5) + %7 = extractvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 0 + %8 = extractvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 1 + %9 = insertvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i8 %7, 0 + %10 = insertvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 1 + ret { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10 } define { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.ReadBytes"({ i64, ptr } %0, i8 %1) { @@ -1424,14 +1714,18 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - %5 = call { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadBytes"(ptr %4, i8 %1) - %6 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 0 - %7 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 1 - %8 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, 0 - %9 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 1 - ret { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + %7 = call { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadBytes"(ptr %6, i8 %1) + %8 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 0 + %9 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 1 + %10 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, 0 + %11 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 1 + ret { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %11 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.ReadFrom"({ i64, ptr } %0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) { @@ -1439,14 +1733,18 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - %5 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadFrom"(ptr %4, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) - %6 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 0 - %7 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 1 - %8 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %6, 0 - %9 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + %7 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadFrom"(ptr %6, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) + %8 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 0 + %9 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 1 + %10 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %8, 0 + %11 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %11 } define { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.ReadRune"({ i64, ptr } %0) { @@ -1454,16 +1752,20 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadRune"(ptr %3) - %5 = extractvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 0 - %6 = extractvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 1 - %7 = extractvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 2 - %8 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i32 %5, 0 - %9 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8, i64 %6, 1 - %10 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 2 - ret { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadRune"(ptr %5) + %7 = extractvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 0 + %8 = extractvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 1 + %9 = extractvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 2 + %10 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i32 %7, 0 + %11 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10, i64 %8, 1 + %12 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %11, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 2 + ret { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %12 } define { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.ReadString"({ i64, ptr } %0, i8 %1) { @@ -1471,14 +1773,18 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - %5 = call { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadString"(ptr %4, i8 %1) - %6 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 0 - %7 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 1 - %8 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, %"github.com/goplus/llgo/runtime/internal/runtime.String" %6, 0 - %9 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 1 - ret { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + %7 = call { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadString"(ptr %6, i8 %1) + %8 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 0 + %9 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 1 + %10 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, %"github.com/goplus/llgo/runtime/internal/runtime.String" %8, 0 + %11 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 1 + ret { %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %11 } define void @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Reset"({ i64, ptr } %0) { @@ -1486,9 +1792,13 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - call void @"bytes.(*Buffer).Reset"(ptr %3) + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + call void @"bytes.(*Buffer).Reset"(ptr %5) ret void } @@ -1497,10 +1807,14 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"bytes.(*Buffer).String"(ptr %3) - ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"bytes.(*Buffer).String"(ptr %5) + ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %6 } define void @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Truncate"({ i64, ptr } %0, i64 %1) { @@ -1508,9 +1822,13 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - call void @"bytes.(*Buffer).Truncate"(ptr %4, i64 %1) + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + call void @"bytes.(*Buffer).Truncate"(ptr %6, i64 %1) ret void } @@ -1519,10 +1837,14 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadByte"(ptr %3) - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadByte"(ptr %5) + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6 } define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.UnreadRune"({ i64, ptr } %0) { @@ -1530,10 +1852,14 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadRune"(ptr %3) - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadRune"(ptr %5) + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.Write"({ i64, ptr } %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) { @@ -1541,14 +1867,18 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - %5 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Write"(ptr %4, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) - %6 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 0 - %7 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 1 - %8 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %6, 0 - %9 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + %7 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Write"(ptr %6, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) + %8 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 0 + %9 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 1 + %10 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %8, 0 + %11 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %11 } define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.WriteByte"({ i64, ptr } %0, i8 %1) { @@ -1556,10 +1886,14 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - %5 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).WriteByte"(ptr %4, i8 %1) - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + %7 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"bytes.(*Buffer).WriteByte"(ptr %6, i8 %1) + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.WriteRune"({ i64, ptr } %0, i32 %1) { @@ -1567,14 +1901,18 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - %5 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteRune"(ptr %4, i32 %1) - %6 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 0 - %7 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 1 - %8 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %6, 0 - %9 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + %7 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteRune"(ptr %6, i32 %1) + %8 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 0 + %9 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 1 + %10 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %8, 0 + %11 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %11 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.WriteString"({ i64, ptr } %0, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) { @@ -1582,14 +1920,18 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - %5 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteString"(ptr %4, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) - %6 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 0 - %7 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 1 - %8 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %6, 0 - %9 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + %7 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteString"(ptr %6, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) + %8 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 0 + %9 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 1 + %10 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %8, 0 + %11 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %11 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.WriteTo"({ i64, ptr } %0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) { @@ -1597,14 +1939,18 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - %5 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteTo"(ptr %4, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) - %6 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 0 - %7 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 1 - %8 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %6, 0 - %9 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + %7 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteTo"(ptr %6, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) + %8 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 0 + %9 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 1 + %10 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %8, 0 + %11 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %11 } define i1 @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.empty"({ i64, ptr } %0) { @@ -1612,10 +1958,14 @@ _llgo_0: %1 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = call i1 @"bytes.(*Buffer).empty"(ptr %3) - ret i1 %4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call i1 @"bytes.(*Buffer).empty"(ptr %5) + ret i1 %6 } define i64 @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.grow"({ i64, ptr } %0, i64 %1) { @@ -1623,10 +1973,14 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - %5 = call i64 @"bytes.(*Buffer).grow"(ptr %4, i64 %1) - ret i64 %5 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + %7 = call i64 @"bytes.(*Buffer).grow"(ptr %6, i64 %1) + ret i64 %7 } define { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.readSlice"({ i64, ptr } %0, i8 %1) { @@ -1634,14 +1988,18 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - %5 = call { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).readSlice"(ptr %4, i8 %1) - %6 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 0 - %7 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 1 - %8 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, 0 - %9 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 1 - ret { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + %7 = call { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"bytes.(*Buffer).readSlice"(ptr %6, i8 %1) + %8 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 0 + %9 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, 1 + %10 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, 0 + %11 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %10, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 1 + ret { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %11 } define { i64, i1 } @"github.com/goplus/llgo/cl/_testgo/abimethod.struct{m int; *bytes.Buffer}.tryGrowByReslice"({ i64, ptr } %0, i64 %1) { @@ -1649,14 +2007,18 @@ _llgo_0: %2 = alloca { i64, ptr }, align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store { i64, ptr } %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 - %4 = load ptr, ptr %3, align 8 - %5 = call { i64, i1 } @"bytes.(*Buffer).tryGrowByReslice"(ptr %4, i64 %1) - %6 = extractvalue { i64, i1 } %5, 0 - %7 = extractvalue { i64, i1 } %5, 1 - %8 = insertvalue { i64, i1 } undef, i64 %6, 0 - %9 = insertvalue { i64, i1 } %8, i1 %7, 1 - ret { i64, i1 } %9 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + %7 = call { i64, i1 } @"bytes.(*Buffer).tryGrowByReslice"(ptr %6, i64 %1) + %8 = extractvalue { i64, i1 } %7, 0 + %9 = extractvalue { i64, i1 } %7, 1 + %10 = insertvalue { i64, i1 } undef, i64 %8, 0 + %11 = insertvalue { i64, i1 } %10, i1 %9, 1 + ret { i64, i1 } %11 } declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequal8"(ptr, ptr) @@ -1733,15 +2095,19 @@ declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"gith define linkonce ptr @"github.com/goplus/llgo/cl/_testgo/abimethod.(*Pointer[any]).Load"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.Pointer[any]", ptr %0, i32 0, i32 1 - %2 = load atomic ptr, ptr %1 seq_cst, align 8 - ret ptr %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.Pointer[any]", ptr %0, i32 0, i32 1 + %3 = load atomic ptr, ptr %2 seq_cst, align 8 + ret ptr %3 } define linkonce void @"github.com/goplus/llgo/cl/_testgo/abimethod.(*Pointer[any]).Store"(ptr %0, ptr %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.Pointer[any]", ptr %0, i32 0, i32 1 - store atomic ptr %1, ptr %2 seq_cst, align 8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/abimethod.Pointer[any]", ptr %0, i32 0, i32 1 + store atomic ptr %1, ptr %3 seq_cst, align 8 ret void } diff --git a/cl/_testgo/alias/expect.txt b/cl/_testgo/alias/expect.txt index e8d37e7568..b7439ff8ef 100644 --- a/cl/_testgo/alias/expect.txt +++ b/cl/_testgo/alias/expect.txt @@ -1 +1 @@ -+5.000000e+00 +8.000000e+00 ++5.000000e+000 +8.000000e+000 diff --git a/cl/_testgo/alias/out.ll b/cl/_testgo/alias/out.ll index 4fa20a64c8..fdc6038198 100644 --- a/cl/_testgo/alias/out.ll +++ b/cl/_testgo/alias/out.ll @@ -4,34 +4,59 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/alias" %"github.com/goplus/llgo/cl/_testgo/alias.Point" = type { double, double } @"github.com/goplus/llgo/cl/_testgo/alias.init$guard" = global i1 false, align 1 +@llvm.compiler.used = appending global [2 x ptr] [ptr @"github.com/goplus/llgo/cl/_testgo/alias.(*Point).Move", ptr @"github.com/goplus/llgo/cl/_testgo/alias.(*Point).Scale"], section "llvm.metadata" define void @"github.com/goplus/llgo/cl/_testgo/alias.(*Point).Move"(ptr %0, double %1, double %2) { _llgo_0: - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 0 - %4 = load double, ptr %3, align 8 - %5 = fadd double %4, %1 - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 0 - store double %5, ptr %6, align 8 - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 1 - %8 = load double, ptr %7, align 8 - %9 = fadd double %8, %2 - %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 1 - store double %9, ptr %10, align 8 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 0 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load double, ptr %4, align 8 + %7 = fadd double %6, %1 + %8 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 0 + store double %7, ptr %9, align 8 + %10 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 1 + %12 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = load double, ptr %11, align 8 + %14 = fadd double %13, %2 + %15 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 1 + store double %14, ptr %16, align 8 ret void } define void @"github.com/goplus/llgo/cl/_testgo/alias.(*Point).Scale"(ptr %0, double %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 0 - %3 = load double, ptr %2, align 8 - %4 = fmul double %3, %1 - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 0 - store double %4, ptr %5, align 8 - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 1 - %7 = load double, ptr %6, align 8 - %8 = fmul double %7, %1 - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 1 - store double %8, ptr %9, align 8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load double, ptr %3, align 8 + %6 = fmul double %5, %1 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 0 + store double %6, ptr %8, align 8 + %9 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 1 + %11 = icmp eq ptr %10, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = load double, ptr %10, align 8 + %13 = fmul double %12, %1 + %14 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 1 + store double %13, ptr %15, align 8 ret void } @@ -51,23 +76,37 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testgo/alias.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 1 - store double 1.000000e+00, ptr %1, align 8 - store double 2.000000e+00, ptr %2, align 8 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 1 + store double 1.000000e+00, ptr %2, align 8 + store double 2.000000e+00, ptr %4, align 8 call void @"github.com/goplus/llgo/cl/_testgo/alias.(*Point).Scale"(ptr %0, double 2.000000e+00) call void @"github.com/goplus/llgo/cl/_testgo/alias.(*Point).Move"(ptr %0, double 3.000000e+00, double 4.000000e+00) - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 0 - %4 = load double, ptr %3, align 8 - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 1 - %6 = load double, ptr %5, align 8 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double %4) + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 0 + %7 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = load double, ptr %6, align 8 + %9 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/alias.Point", ptr %0, i32 0, i32 1 + %11 = icmp eq ptr %10, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = load double, ptr %10, align 8 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double %8) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double %6) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double %12) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double) diff --git a/cl/_testgo/closure/out.ll b/cl/_testgo/closure/out.ll index 229ab59b15..8af13c3860 100644 --- a/cl/_testgo/closure/out.ll +++ b/cl/_testgo/closure/out.ll @@ -53,12 +53,14 @@ define void @"github.com/goplus/llgo/cl/_testgo/closure.main$2"(ptr %0, i64 %1) _llgo_0: %2 = load { ptr }, ptr %0, align 8 %3 = extractvalue { ptr } %2, 0 - %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %3, align 8 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %3, align 8 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 7 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %1) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %4) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %5) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -78,3 +80,5 @@ declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"gi declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64) + +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) diff --git a/cl/_testgo/closure2/out.ll b/cl/_testgo/closure2/out.ll index bdb333b0df..ea194fe3c8 100644 --- a/cl/_testgo/closure2/out.ll +++ b/cl/_testgo/closure2/out.ll @@ -51,12 +51,14 @@ define void @"github.com/goplus/llgo/cl/_testgo/closure2.main$1$1"(ptr %0, i64 % _llgo_0: %2 = load { ptr }, ptr %0, align 8 %3 = extractvalue { ptr } %2, 0 - %4 = load i64, ptr %3, align 4 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %3, align 4 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 7 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %1) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %4) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %5) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -65,6 +67,8 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String") declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) diff --git a/cl/_testgo/closureall/out.ll b/cl/_testgo/closureall/out.ll index 0d1f779163..e8e00fcf03 100644 --- a/cl/_testgo/closureall/out.ll +++ b/cl/_testgo/closureall/out.ll @@ -20,10 +20,10 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/closureall" @"github.com/goplus/llgo/cl/_testgo/closureall.init$guard" = global i1 false, align 1 @"*_llgo_github.com/goplus/llgo/cl/_testgo/closureall.S" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [2 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -744503389, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 6 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/closureall.S" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 44 }, i16 2, i16 2, i32 24 }, [2 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, ptr @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU", ptr @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Add", ptr @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Add" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 3 }, ptr @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU", ptr @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Inc", ptr @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Inc" }] }, align 8 @0 = private unnamed_addr constant [6 x i8] c"main.S", align 1 -@"_llgo_github.com/goplus/llgo/cl/_testgo/closureall.S" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 147929472, i8 13, i8 8, i8 8, i8 57, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/closureall.S" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 6 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/closureall.S" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 44 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/closureall.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 44 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 3 }, ptr @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU", ptr @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Inc", ptr @"github.com/goplus/llgo/cl/_testgo/closureall.S.Inc" }] }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testgo/closureall.S" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 147929472, i8 13, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/closureall.S" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 6 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/closureall.S" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 44 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/closureall.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 44 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 3 }, ptr @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU", ptr @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Inc", ptr @"github.com/goplus/llgo/cl/_testgo/closureall.S.Inc" }] }, align 8 @1 = private unnamed_addr constant [44 x i8] c"github.com/goplus/llgo/cl/_testgo/closureall", align 1 @2 = private unnamed_addr constant [1 x i8] c"v", align 1 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr @"*_llgo_int" }, align 8 @3 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"github.com/goplus/llgo/cl/_testgo/closureall.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 1 }, ptr @_llgo_int, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @@ -42,31 +42,42 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/closureall" @_llgo_string = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 8, i32 1749264893, i8 4, i8 8, i8 8, i8 24, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.strequal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 6 }, ptr @"*_llgo_string" }, align 8 @9 = private unnamed_addr constant [6 x i8] c"string", align 1 @"*_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1323879264, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 6 }, ptr null }, ptr @_llgo_string }, align 8 +@llvm.compiler.used = appending global [3 x ptr] [ptr @"github.com/goplus/llgo/cl/_testgo/closureall.S.Inc", ptr @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Add", ptr @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Inc"], section "llvm.metadata" define i64 @"github.com/goplus/llgo/cl/_testgo/closureall.S.Inc"(%"github.com/goplus/llgo/cl/_testgo/closureall.S" %0, i64 %1) { _llgo_0: %2 = alloca %"github.com/goplus/llgo/cl/_testgo/closureall.S", align 8 call void @llvm.memset(ptr %2, i8 0, i64 8, i1 false) store %"github.com/goplus/llgo/cl/_testgo/closureall.S" %0, ptr %2, align 4 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/closureall.S", ptr %2, i32 0, i32 0 - %4 = load i64, ptr %3, align 4 - %5 = add i64 %4, %1 - ret i64 %5 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/closureall.S", ptr %2, i32 0, i32 0 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load i64, ptr %4, align 4 + %7 = add i64 %6, %1 + ret i64 %7 } define i64 @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Add"(ptr %0, i64 %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/closureall.S", ptr %0, i32 0, i32 0 - %3 = load i64, ptr %2, align 4 - %4 = add i64 %3, %1 - ret i64 %4 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/closureall.S", ptr %0, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %3, align 4 + %6 = add i64 %5, %1 + ret i64 %6 } define i64 @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Inc"(ptr %0, i64 %1) { _llgo_0: - %2 = load %"github.com/goplus/llgo/cl/_testgo/closureall.S", ptr %0, align 4 - %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/closureall.S.Inc"(%"github.com/goplus/llgo/cl/_testgo/closureall.S" %2, i64 %1) - ret i64 %3 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load %"github.com/goplus/llgo/cl/_testgo/closureall.S", ptr %0, align 4 + %4 = call i64 @"github.com/goplus/llgo/cl/_testgo/closureall.S.Inc"(%"github.com/goplus/llgo/cl/_testgo/closureall.S" %3, i64 %1) + ret i64 %4 } define i32 @"github.com/goplus/llgo/cl/_testgo/closureall.callCallback"(ptr %0, i32 %1) { @@ -106,41 +117,43 @@ _llgo_0: %7 = call i64 %6(ptr %5, i64 2) %8 = call i64 @"github.com/goplus/llgo/cl/_testgo/closureall.globalAdd"(i64 1, i64 2) %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/closureall.S", ptr %9, i32 0, i32 0 - store i64 5, ptr %10, align 4 - %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) - %12 = getelementptr inbounds { ptr }, ptr %11, i32 0, i32 0 - store ptr %9, ptr %12, align 8 - %13 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Add$bound", ptr undef }, ptr %11, 1 - %14 = extractvalue { ptr, ptr } %13, 1 - %15 = extractvalue { ptr, ptr } %13, 0 - %16 = call i64 %15(ptr %14, i64 7) - %17 = call i64 @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Add$thunk"(ptr %9, i64 8) - %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$VdBKYV8-gcMjZtZfcf-u2oKoj9Lu3VXwuG8TGCW2S4A", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/closureall.S") - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %18, 0 - %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %19, ptr %9, 1 - %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %20) - %22 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %20, 1 - br i1 true, label %_llgo_1, label %_llgo_2 + %10 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/closureall.S", ptr %9, i32 0, i32 0 + store i64 5, ptr %11, align 4 + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + %13 = getelementptr inbounds { ptr }, ptr %12, i32 0, i32 0 + store ptr %9, ptr %13, align 8 + %14 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Add$bound", ptr undef }, ptr %12, 1 + %15 = extractvalue { ptr, ptr } %14, 1 + %16 = extractvalue { ptr, ptr } %14, 0 + %17 = call i64 %16(ptr %15, i64 7) + %18 = call i64 @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Add$thunk"(ptr %9, i64 8) + %19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$VdBKYV8-gcMjZtZfcf-u2oKoj9Lu3VXwuG8TGCW2S4A", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/closureall.S") + %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %19, 0 + %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %20, ptr %9, 1 + %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %21) + %23 = icmp ne ptr %22, null + br i1 %23, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %23 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - %24 = getelementptr inbounds { %"github.com/goplus/llgo/runtime/internal/runtime.iface" }, ptr %23, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %20, ptr %24, align 8 - %25 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/closureall.interface{Add(int) int}.Add$bound", ptr undef }, ptr %23, 1 - %26 = extractvalue { ptr, ptr } %25, 1 - %27 = extractvalue { ptr, ptr } %25, 0 - %28 = call i64 %27(ptr %26, i64 9) - %29 = call double @sqrt(double 4.000000e+00) - %30 = call i32 @abs(i32 -3) - %31 = call i32 @"github.com/goplus/llgo/cl/_testgo/closureall.callCallback"(ptr @"github.com/goplus/llgo/cl/_testgo/closureall.main$1", i32 7) + %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + %25 = getelementptr inbounds { %"github.com/goplus/llgo/runtime/internal/runtime.iface" }, ptr %24, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, ptr %25, align 8 + %26 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/closureall.interface{Add(int) int}.Add$bound", ptr undef }, ptr %24, 1 + %27 = extractvalue { ptr, ptr } %26, 1 + %28 = extractvalue { ptr, ptr } %26, 0 + %29 = call i64 %28(ptr %27, i64 9) + %30 = call double @sqrt(double 4.000000e+00) + %31 = call i32 @abs(i32 -3) + %32 = call i32 @"github.com/goplus/llgo/cl/_testgo/closureall.callCallback"(ptr @"github.com/goplus/llgo/cl/_testgo/closureall.main$1", i32 7) ret void _llgo_2: ; preds = %_llgo_0 - %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 72 }, ptr %32, align 8 - %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %32, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %33) + %33 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 72 }, ptr %33, align 8 + %34 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %33, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %34) unreachable } @@ -179,14 +192,18 @@ define i64 @"github.com/goplus/llgo/cl/_testgo/closureall.makeWithFree$1"(ptr %0 _llgo_0: %2 = load { ptr }, ptr %0, align 8 %3 = extractvalue { ptr } %2, 0 - %4 = load i64, ptr %3, align 4 - %5 = add i64 %1, %4 - ret i64 %5 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %3, align 4 + %6 = add i64 %1, %5 + ret i64 %6 } ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) define i64 @"github.com/goplus/llgo/cl/_testgo/closureall.(*S).Add$bound"(ptr %0, i64 %1) { diff --git a/cl/_testgo/cursor/out.ll b/cl/_testgo/cursor/out.ll index bc18f282f4..be8fbf8db1 100644 --- a/cl/_testgo/cursor/out.ll +++ b/cl/_testgo/cursor/out.ll @@ -32,7 +32,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/cursor" @3 = private unnamed_addr constant [9 x i8] c"ast.Ident", align 1 @"_llgo_go/ast.Ident" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 32, i64 32, i32 223651489, i8 5, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_go/ast.Ident" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 9 }, ptr @"*_llgo_go/ast.Ident" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_struct$ERhAAXQWPbqC1-_yiLvvpFhGaPd1HWshKDb-_H5Nm3M$fields", i64 3, i64 3 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 6 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @4 = private unnamed_addr constant [7 x i8] c"NamePos", align 1 -@"_llgo_go/token.Pos" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1285526538, i8 13, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 9 }, ptr @"*_llgo_go/token.Pos" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 8 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 7 }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk", ptr @"go/token.(*Pos).IsValid", ptr @"go/token.Pos.IsValid" }] }, align 8 +@"_llgo_go/token.Pos" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1285526538, i8 13, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 9 }, ptr @"*_llgo_go/token.Pos" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 8 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 7 }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk", ptr @"go/token.(*Pos).IsValid", ptr @"go/token.Pos.IsValid" }] }, align 8 @5 = private unnamed_addr constant [9 x i8] c"token.Pos", align 1 @"*_llgo_go/token.Pos" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1298747093, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 9 }, ptr null }, ptr @"_llgo_go/token.Pos" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 8 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 7 }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk", ptr @"go/token.(*Pos).IsValid", ptr @"go/token.(*Pos).IsValid" }] }, align 8 @6 = private unnamed_addr constant [8 x i8] c"go/token", align 1 @@ -40,7 +40,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/cursor" @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -541022001, i8 0, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 11 }, ptr @"*_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk$out", i64 1, i64 1 } }, align 8 @8 = private unnamed_addr constant [11 x i8] c"func() bool", align 1 @"*_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -367308996, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 11 }, ptr null }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk" }, align 8 -@_llgo_bool = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 554183389, i8 12, i8 1, i8 1, i8 33, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 4 }, ptr @"*_llgo_bool" }, align 8 +@_llgo_bool = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 554183389, i8 12, i8 1, i8 1, i8 1, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 4 }, ptr @"*_llgo_bool" }, align 8 @9 = private unnamed_addr constant [4 x i8] c"bool", align 1 @"*_llgo_bool" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1896950390, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 4 }, ptr null }, ptr @_llgo_bool }, align 8 @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk$out" = weak_odr constant [1 x ptr] [ptr @_llgo_bool], align 8 @@ -50,7 +50,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/cursor" @12 = private unnamed_addr constant [10 x i8] c"ast.Object", align 1 @"_llgo_go/ast.Object" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 72, i64 72, i32 -345899940, i8 5, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_go/ast.Object" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 10 }, ptr @"*_llgo_go/ast.Object" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_struct$PpBVodhNoYSyuTvVSvUg9Ezb8mKNNTWg_RwGYFq0KPA$fields", i64 5, i64 5 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 6 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @13 = private unnamed_addr constant [4 x i8] c"Kind", align 1 -@"_llgo_go/ast.ObjKind" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 118841177, i8 13, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 11 }, ptr @"*_llgo_go/ast.ObjKind" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 6 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 6 }, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", ptr @"go/ast.(*ObjKind).String", ptr @"go/ast.ObjKind.String" }] }, align 8 +@"_llgo_go/ast.ObjKind" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 118841177, i8 13, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 11 }, ptr @"*_llgo_go/ast.ObjKind" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 6 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 6 }, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", ptr @"go/ast.(*ObjKind).String", ptr @"go/ast.ObjKind.String" }] }, align 8 @14 = private unnamed_addr constant [11 x i8] c"ast.ObjKind", align 1 @"*_llgo_go/ast.ObjKind" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1144452934, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 11 }, ptr null }, ptr @"_llgo_go/ast.ObjKind" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 6 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 6 }, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", ptr @"go/ast.(*ObjKind).String", ptr @"go/ast.(*ObjKind).String" }] }, align 8 @15 = private unnamed_addr constant [6 x i8] c"go/ast", align 1 @@ -100,7 +100,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/cursor" @"*[]_llgo_go/ast.Expr" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 2140595147, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @37, i64 10 }, ptr null }, ptr @"[]_llgo_go/ast.Expr" }, align 8 @38 = private unnamed_addr constant [6 x i8] c"TokPos", align 1 @39 = private unnamed_addr constant [3 x i8] c"Tok", align 1 -@"_llgo_go/token.Token" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [5 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -289315828, i8 13, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @40, i64 11 }, ptr @"*_llgo_go/token.Token" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 8 }, i16 5, i16 5, i32 24 }, [5 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @41, i64 9 }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk", ptr @"go/token.(*Token).IsKeyword", ptr @"go/token.Token.IsKeyword" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 9 }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk", ptr @"go/token.(*Token).IsLiteral", ptr @"go/token.Token.IsLiteral" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @43, i64 10 }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk", ptr @"go/token.(*Token).IsOperator", ptr @"go/token.Token.IsOperator" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @44, i64 10 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"go/token.(*Token).Precedence", ptr @"go/token.Token.Precedence" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 6 }, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", ptr @"go/token.(*Token).String", ptr @"go/token.Token.String" }] }, align 8 +@"_llgo_go/token.Token" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [5 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -289315828, i8 13, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @40, i64 11 }, ptr @"*_llgo_go/token.Token" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 8 }, i16 5, i16 5, i32 24 }, [5 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @41, i64 9 }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk", ptr @"go/token.(*Token).IsKeyword", ptr @"go/token.Token.IsKeyword" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 9 }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk", ptr @"go/token.(*Token).IsLiteral", ptr @"go/token.Token.IsLiteral" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @43, i64 10 }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk", ptr @"go/token.(*Token).IsOperator", ptr @"go/token.Token.IsOperator" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @44, i64 10 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"go/token.(*Token).Precedence", ptr @"go/token.Token.Precedence" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 6 }, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", ptr @"go/token.(*Token).String", ptr @"go/token.Token.String" }] }, align 8 @40 = private unnamed_addr constant [11 x i8] c"token.Token", align 1 @"*_llgo_go/token.Token" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [5 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -419138858, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @40, i64 11 }, ptr null }, ptr @"_llgo_go/token.Token" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 8 }, i16 5, i16 5, i32 24 }, [5 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @41, i64 9 }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk", ptr @"go/token.(*Token).IsKeyword", ptr @"go/token.(*Token).IsKeyword" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 9 }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk", ptr @"go/token.(*Token).IsLiteral", ptr @"go/token.(*Token).IsLiteral" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @43, i64 10 }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk", ptr @"go/token.(*Token).IsOperator", ptr @"go/token.(*Token).IsOperator" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @44, i64 10 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"go/token.(*Token).Precedence", ptr @"go/token.(*Token).Precedence" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 6 }, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", ptr @"go/token.(*Token).String", ptr @"go/token.(*Token).String" }] }, align 8 @41 = private unnamed_addr constant [9 x i8] c"IsKeyword", align 1 @@ -110,7 +110,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/cursor" @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 2131144854, i8 0, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @45, i64 10 }, ptr @"*_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA$out", i64 1, i64 1 } }, align 8 @45 = private unnamed_addr constant [10 x i8] c"func() int", align 1 @"*_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1805835775, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @45, i64 10 }, ptr null }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @46, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @46, i64 3 }, ptr @"*_llgo_int" }, align 8 @46 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @46, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA$out" = weak_odr constant [1 x ptr] [ptr @_llgo_int], align 8 @@ -187,7 +187,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/cursor" @84 = private unnamed_addr constant [5 x i8] c"Begin", align 1 @85 = private unnamed_addr constant [5 x i8] c"Arrow", align 1 @86 = private unnamed_addr constant [3 x i8] c"Dir", align 1 -@"_llgo_go/ast.ChanDir" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1370288072, i8 13, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @87, i64 11 }, ptr @"*_llgo_go/ast.ChanDir" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 6 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@"_llgo_go/ast.ChanDir" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1370288072, i8 13, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @87, i64 11 }, ptr @"*_llgo_go/ast.ChanDir" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 6 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @87 = private unnamed_addr constant [11 x i8] c"ast.ChanDir", align 1 @"*_llgo_go/ast.ChanDir" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1839689125, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @87, i64 11 }, ptr null }, ptr @"_llgo_go/ast.ChanDir" }, align 8 @"_llgo_struct$jNLpgFf8Fpzmg_7soMAPb94sUL7fIThqs7gJ1FySkcg$fields" = weak_odr constant [4 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @84, i64 5 }, ptr @"_llgo_go/token.Pos", i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @85, i64 5 }, ptr @"_llgo_go/token.Pos", i64 8, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @86, i64 3 }, ptr @"_llgo_go/ast.ChanDir", i64 16, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @59, i64 5 }, ptr @"_llgo_go/ast.Expr", i64 24, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @@ -290,7 +290,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/cursor" @"[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 307038632, i8 8, i8 1, i8 1, i8 17, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"[8]_llgo_uint8" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @132, i64 8 }, ptr @"*[8]_llgo_uint8" }, ptr @_llgo_uint8, ptr @"[]_llgo_uint8", i64 8 }, align 8 @132 = private unnamed_addr constant [8 x i8] c"[8]uint8", align 1 @"*[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -566230779, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @132, i64 8 }, ptr null }, ptr @"[8]_llgo_uint8" }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @133, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @133, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @133 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @133, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @"[]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 370346748, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @134, i64 7 }, ptr @"*[]_llgo_uint8" }, ptr @_llgo_uint8 }, align 8 @@ -524,6 +524,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/cursor" @"_llgo_go/ast.ValueSpec" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 80, i64 80, i32 1801997620, i8 5, i8 8, i8 8, i8 25, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @229, i64 13 }, ptr @"*_llgo_go/ast.ValueSpec" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_struct$sOcAC_ZOq0zUTjfUC4WQUDA-kMpBFrGHc6qNh-82d-Q$fields", i64 5, i64 5 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 6 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @230 = private unnamed_addr constant [6 x i8] c"Values", align 1 @"_llgo_struct$sOcAC_ZOq0zUTjfUC4WQUDA-kMpBFrGHc6qNh-82d-Q$fields" = weak_odr constant [5 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @109, i64 3 }, ptr @"*_llgo_go/ast.CommentGroup", i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @110, i64 5 }, ptr @"[]*_llgo_go/ast.Ident", i64 8, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @22, i64 4 }, ptr @"_llgo_go/ast.Expr", i64 32, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @230, i64 6 }, ptr @"[]_llgo_go/ast.Expr", i64 48, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @113, i64 7 }, ptr @"*_llgo_go/ast.CommentGroup", i64 72, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 +@llvm.compiler.used = appending global [8 x ptr] [ptr @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.FindNode", ptr @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.Node", ptr @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.Preorder", ptr @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.indices", ptr @"github.com/goplus/llgo/cl/_testgo/cursor.(*Cursor).FindNode", ptr @"github.com/goplus/llgo/cl/_testgo/cursor.(*Cursor).Node", ptr @"github.com/goplus/llgo/cl/_testgo/cursor.(*Cursor).Preorder", ptr @"github.com/goplus/llgo/cl/_testgo/cursor.(*Cursor).indices"], section "llvm.metadata" define { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.FindNode"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) { _llgo_0: @@ -537,180 +538,252 @@ _llgo_0: br i1 false, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %6 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %2, align 8 - %7 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %3, align 8 - %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %9 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %8, i64 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, ptr %9, align 8 - %10 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %8, 0 - %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %10, i64 1, 1 - %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, i64 1, 2 - %13 = call %"iter.Seq[github.com/goplus/llgo/cl/_testgo/cursor.Cursor]" @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.Preorder"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %6, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %12) - %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 32) - %16 = getelementptr inbounds { ptr, ptr, ptr, ptr }, ptr %15, i32 0, i32 0 - store ptr %14, ptr %16, align 8 - %17 = getelementptr inbounds { ptr, ptr, ptr, ptr }, ptr %15, i32 0, i32 1 - store ptr %3, ptr %17, align 8 - %18 = getelementptr inbounds { ptr, ptr, ptr, ptr }, ptr %15, i32 0, i32 2 - store ptr %4, ptr %18, align 8 - %19 = getelementptr inbounds { ptr, ptr, ptr, ptr }, ptr %15, i32 0, i32 3 - store ptr %5, ptr %19, align 8 - %20 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.FindNode$1", ptr undef }, ptr %15, 1 - %21 = extractvalue %"iter.Seq[github.com/goplus/llgo/cl/_testgo/cursor.Cursor]" %13, 1 - %22 = extractvalue %"iter.Seq[github.com/goplus/llgo/cl/_testgo/cursor.Cursor]" %13, 0 - call void %22(ptr %21, { ptr, ptr } %20) - %23 = load i64, ptr %14, align 4 - %24 = icmp eq i64 %23, -1 - br i1 %24, label %_llgo_4, label %_llgo_5 + %6 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %2, align 8 + %8 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %3, align 8 + %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %11 = icmp eq ptr %10, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %10, i64 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, ptr %12, align 8 + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %10, 0 + %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %13, i64 1, 1 + %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %14, i64 1, 2 + %16 = call %"iter.Seq[github.com/goplus/llgo/cl/_testgo/cursor.Cursor]" @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.Preorder"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %7, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %15) + %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) + %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 32) + %19 = getelementptr inbounds { ptr, ptr, ptr, ptr }, ptr %18, i32 0, i32 0 + store ptr %17, ptr %19, align 8 + %20 = getelementptr inbounds { ptr, ptr, ptr, ptr }, ptr %18, i32 0, i32 1 + store ptr %3, ptr %20, align 8 + %21 = getelementptr inbounds { ptr, ptr, ptr, ptr }, ptr %18, i32 0, i32 2 + store ptr %4, ptr %21, align 8 + %22 = getelementptr inbounds { ptr, ptr, ptr, ptr }, ptr %18, i32 0, i32 3 + store ptr %5, ptr %22, align 8 + %23 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.FindNode$1", ptr undef }, ptr %18, 1 + %24 = extractvalue %"iter.Seq[github.com/goplus/llgo/cl/_testgo/cursor.Cursor]" %16, 1 + %25 = extractvalue %"iter.Seq[github.com/goplus/llgo/cl/_testgo/cursor.Cursor]" %16, 0 + call void %25(ptr %24, { ptr, ptr } %23) + %26 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %26) + %27 = load i64, ptr %17, align 4 + %28 = icmp eq i64 %27, -1 + br i1 %28, label %_llgo_4, label %_llgo_5 _llgo_2: ; preds = %_llgo_0 - %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %26 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %25, i64 0 - %27 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %3, align 8 - store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %27, ptr %26, align 8 - %28 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %25, 0 - %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %28, i64 1, 1 - %30 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %29, i64 1, 2 - %31 = call i64 @"github.com/goplus/llgo/cl/_testgo/cursor.maskOf"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %30) - %32 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %2, i32 0, i32 0 - %33 = load ptr, ptr %32, align 8 - %34 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Inspector", ptr %33, i32 0, i32 0 - %35 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %34, align 8 - %36 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %2, align 8 - %37 = call { i32, i32 } @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.indices"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %36) - %38 = extractvalue { i32, i32 } %37, 0 - %39 = extractvalue { i32, i32 } %37, 1 + %29 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %30 = icmp eq ptr %29, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %30) + %31 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %29, i64 0 + %32 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %32) + %33 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %3, align 8 + store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %33, ptr %31, align 8 + %34 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %29, 0 + %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %34, i64 1, 1 + %36 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %35, i64 1, 2 + %37 = call i64 @"github.com/goplus/llgo/cl/_testgo/cursor.maskOf"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %36) + %38 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %38) + %39 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %2, i32 0, i32 0 + %40 = icmp eq ptr %39, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %40) + %41 = load ptr, ptr %39, align 8 + %42 = icmp eq ptr %41, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %42) + %43 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Inspector", ptr %41, i32 0, i32 0 + %44 = icmp eq ptr %43, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %44) + %45 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %43, align 8 + %46 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %46) + %47 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %2, align 8 + %48 = call { i32, i32 } @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.indices"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %47) + %49 = extractvalue { i32, i32 } %48, 0 + %50 = extractvalue { i32, i32 } %48, 1 br label %_llgo_9 _llgo_3: ; preds = %_llgo_7, %_llgo_6 store %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" zeroinitializer, ptr %4, align 8 store i1 false, ptr %5, align 1 - %40 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %4, align 8 - %41 = load i1, ptr %5, align 1 - %42 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } undef, %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %40, 0 - %43 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %42, i1 %41, 1 - ret { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %43 + %51 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %51) + %52 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %4, align 8 + %53 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %53) + %54 = load i1, ptr %5, align 1 + %55 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } undef, %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %52, 0 + %56 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %55, i1 %54, 1 + ret { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %56 _llgo_4: ; preds = %_llgo_1 - %44 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 36 }, ptr %44, align 8 - %45 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %44, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %45) + %57 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 36 }, ptr %57, align 8 + %58 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %57, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %58) unreachable _llgo_5: ; preds = %_llgo_1 - %46 = icmp eq i64 %23, 0 - br i1 %46, label %_llgo_6, label %_llgo_7 + %59 = icmp eq i64 %27, 0 + br i1 %59, label %_llgo_6, label %_llgo_7 _llgo_6: ; preds = %_llgo_5 - store i64 -2, ptr %14, align 4 + store i64 -2, ptr %17, align 4 br label %_llgo_3 _llgo_7: ; preds = %_llgo_5 - %47 = icmp eq i64 %23, 1 - br i1 %47, label %_llgo_8, label %_llgo_3 + %60 = icmp eq i64 %27, 1 + br i1 %60, label %_llgo_8, label %_llgo_3 _llgo_8: ; preds = %_llgo_7 - %48 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %4, align 8 - %49 = load i1, ptr %5, align 1 - %50 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } undef, %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %48, 0 - %51 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %50, i1 %49, 1 - ret { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %51 + %61 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %61) + %62 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %4, align 8 + %63 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %63) + %64 = load i1, ptr %5, align 1 + %65 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } undef, %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %62, 0 + %66 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %65, i1 %64, 1 + ret { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %66 _llgo_9: ; preds = %_llgo_13, %_llgo_2 - %52 = phi i32 [ %38, %_llgo_2 ], [ %75, %_llgo_13 ] - %53 = icmp slt i32 %52, %39 - br i1 %53, label %_llgo_10, label %_llgo_11 + %67 = phi i32 [ %49, %_llgo_2 ], [ %97, %_llgo_13 ] + %68 = icmp slt i32 %67, %50 + br i1 %68, label %_llgo_10, label %_llgo_11 _llgo_10: ; preds = %_llgo_9 - %54 = alloca %"github.com/goplus/llgo/cl/_testgo/cursor.event", align 8 - call void @llvm.memset(ptr %54, i8 0, i64 32, i1 false) - %55 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %35, 0 - %56 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %35, 1 - %57 = sext i32 %52 to i64 - %58 = icmp slt i64 %57, 0 - %59 = icmp sge i64 %57, %56 - %60 = or i1 %59, %58 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %60) - %61 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %55, i64 %57 - %62 = load %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %61, align 8 - store %"github.com/goplus/llgo/cl/_testgo/cursor.event" %62, ptr %54, align 8 - %63 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %54, i32 0, i32 2 - %64 = load i32, ptr %63, align 4 - %65 = icmp sgt i32 %64, %52 - br i1 %65, label %_llgo_12, label %_llgo_13 + %69 = alloca %"github.com/goplus/llgo/cl/_testgo/cursor.event", align 8 + call void @llvm.memset(ptr %69, i8 0, i64 32, i1 false) + %70 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %45, 0 + %71 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %45, 1 + %72 = sext i32 %67 to i64 + %73 = icmp slt i64 %72, 0 + %74 = icmp sge i64 %72, %71 + %75 = or i1 %74, %73 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %75) + %76 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %70, i64 %72 + %77 = icmp eq ptr %76, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %77) + %78 = load %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %76, align 8 + store %"github.com/goplus/llgo/cl/_testgo/cursor.event" %78, ptr %69, align 8 + %79 = icmp eq ptr %69, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %79) + %80 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %69, i32 0, i32 2 + %81 = icmp eq ptr %80, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %81) + %82 = load i32, ptr %80, align 4 + %83 = icmp sgt i32 %82, %67 + br i1 %83, label %_llgo_12, label %_llgo_13 _llgo_11: ; preds = %_llgo_9 store %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" zeroinitializer, ptr %4, align 8 store i1 false, ptr %5, align 1 - %66 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %4, align 8 - %67 = load i1, ptr %5, align 1 - %68 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } undef, %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %66, 0 - %69 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %68, i1 %67, 1 - ret { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %69 + %84 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %84) + %85 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %4, align 8 + %86 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %86) + %87 = load i1, ptr %5, align 1 + %88 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } undef, %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %85, 0 + %89 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %88, i1 %87, 1 + ret { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %89 _llgo_12: ; preds = %_llgo_10 - %70 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %54, i32 0, i32 1 - %71 = load i64, ptr %70, align 4 - %72 = and i64 %71, %31 - %73 = icmp ne i64 %72, 0 - br i1 %73, label %_llgo_16, label %_llgo_15 + %90 = icmp eq ptr %69, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %90) + %91 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %69, i32 0, i32 1 + %92 = icmp eq ptr %91, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %92) + %93 = load i64, ptr %91, align 4 + %94 = and i64 %93, %37 + %95 = icmp ne i64 %94, 0 + br i1 %95, label %_llgo_16, label %_llgo_15 _llgo_13: ; preds = %_llgo_17, %_llgo_15, %_llgo_10 - %74 = phi i32 [ %52, %_llgo_10 ], [ %52, %_llgo_15 ], [ %87, %_llgo_17 ] - %75 = add i32 %74, 1 + %96 = phi i32 [ %67, %_llgo_10 ], [ %67, %_llgo_15 ], [ %118, %_llgo_17 ] + %97 = add i32 %96, 1 br label %_llgo_9 _llgo_14: ; preds = %_llgo_16 - %76 = alloca %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", align 8 - call void @llvm.memset(ptr %76, i8 0, i64 16, i1 false) - %77 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %76, i32 0, i32 0 - %78 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %2, i32 0, i32 0 - %79 = load ptr, ptr %78, align 8 - %80 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %76, i32 0, i32 1 - store ptr %79, ptr %77, align 8 - store i32 %52, ptr %80, align 4 - %81 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %76, align 8 - store %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %81, ptr %4, align 8 + %98 = alloca %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", align 8 + call void @llvm.memset(ptr %98, i8 0, i64 16, i1 false) + %99 = icmp eq ptr %98, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %99) + %100 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %98, i32 0, i32 0 + %101 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %101) + %102 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %2, i32 0, i32 0 + %103 = icmp eq ptr %102, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %103) + %104 = load ptr, ptr %102, align 8 + %105 = icmp eq ptr %98, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %105) + %106 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %98, i32 0, i32 1 + store ptr %104, ptr %100, align 8 + store i32 %67, ptr %106, align 4 + %107 = icmp eq ptr %98, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %107) + %108 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %98, align 8 + store %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %108, ptr %4, align 8 store i1 true, ptr %5, align 1 - %82 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %4, align 8 - %83 = load i1, ptr %5, align 1 - %84 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } undef, %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %82, 0 - %85 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %84, i1 %83, 1 - ret { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %85 + %109 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %109) + %110 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %4, align 8 + %111 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %111) + %112 = load i1, ptr %5, align 1 + %113 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } undef, %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %110, 0 + %114 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %113, i1 %112, 1 + ret { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %114 _llgo_15: ; preds = %_llgo_16, %_llgo_12 - %86 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %54, i32 0, i32 2 - %87 = load i32, ptr %86, align 4 - %88 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %35, 0 - %89 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %35, 1 - %90 = sext i32 %87 to i64 - %91 = icmp slt i64 %90, 0 - %92 = icmp sge i64 %90, %89 - %93 = or i1 %92, %91 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %93) - %94 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %88, i64 %90 - %95 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %94, i32 0, i32 1 - %96 = load i64, ptr %95, align 4 - %97 = and i64 %96, %31 - %98 = icmp eq i64 %97, 0 - br i1 %98, label %_llgo_17, label %_llgo_13 + %115 = icmp eq ptr %69, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %115) + %116 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %69, i32 0, i32 2 + %117 = icmp eq ptr %116, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %117) + %118 = load i32, ptr %116, align 4 + %119 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %45, 0 + %120 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %45, 1 + %121 = sext i32 %118 to i64 + %122 = icmp slt i64 %121, 0 + %123 = icmp sge i64 %121, %120 + %124 = or i1 %123, %122 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %124) + %125 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %119, i64 %121 + %126 = icmp eq ptr %125, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %126) + %127 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %125, i32 0, i32 1 + %128 = icmp eq ptr %127, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %128) + %129 = load i64, ptr %127, align 4 + %130 = and i64 %129, %37 + %131 = icmp eq i64 %130, 0 + br i1 %131, label %_llgo_17, label %_llgo_13 _llgo_16: ; preds = %_llgo_12 - %99 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %54, i32 0, i32 0 - %100 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %99, align 8 - %101 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %3, align 8 - %102 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %100) - %103 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %100, 1 - %104 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %102, 0 - %105 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %104, ptr %103, 1 - %106 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %101) - %107 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %101, 1 - %108 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %106, 0 - %109 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %108, ptr %107, 1 - %110 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %105, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %109) - br i1 %110, label %_llgo_14, label %_llgo_15 + %132 = icmp eq ptr %69, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %132) + %133 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %69, i32 0, i32 0 + %134 = icmp eq ptr %133, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %134) + %135 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %133, align 8 + %136 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %136) + %137 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %3, align 8 + %138 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %135) + %139 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %135, 1 + %140 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %138, 0 + %141 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %140, ptr %139, 1 + %142 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %137) + %143 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %137, 1 + %144 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %142, 0 + %145 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %144, ptr %143, 1 + %146 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %141, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %145) + br i1 %146, label %_llgo_14, label %_llgo_15 _llgo_17: ; preds = %_llgo_15 br label %_llgo_13 @@ -720,46 +793,50 @@ define i1 @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.FindNode$1"(ptr %0, _llgo_0: %2 = load { ptr, ptr, ptr, ptr }, ptr %0, align 8 %3 = extractvalue { ptr, ptr, ptr, ptr } %2, 0 - %4 = load i64, ptr %3, align 4 - %5 = icmp eq i64 %4, 0 - br i1 %5, label %_llgo_1, label %_llgo_2 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %3, align 4 + %6 = icmp eq i64 %5, 0 + br i1 %6, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %6 = extractvalue { ptr, ptr, ptr, ptr } %2, 0 - store i64 -1, ptr %6, align 4 - %7 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.Node"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %1) - %8 = extractvalue { ptr, ptr, ptr, ptr } %2, 1 - %9 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %8, align 8 - %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %7) - %11 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 1 - %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %10, 0 - %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %12, ptr %11, 1 - %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %9) - %15 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, 1 - %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %14, 0 - %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %16, ptr %15, 1 - %18 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %13, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %17) - br i1 %18, label %_llgo_3, label %_llgo_4 + %7 = extractvalue { ptr, ptr, ptr, ptr } %2, 0 + store i64 -1, ptr %7, align 4 + %8 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.Node"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %1) + %9 = extractvalue { ptr, ptr, ptr, ptr } %2, 1 + %10 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %9, align 8 + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %8) + %13 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 1 + %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %12, 0 + %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %14, ptr %13, 1 + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %11) + %17 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %11, 1 + %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %16, 0 + %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %18, ptr %17, 1 + %20 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %15, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %19) + br i1 %20, label %_llgo_3, label %_llgo_4 _llgo_2: ; preds = %_llgo_0 - %19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 43 }, ptr %19, align 8 - %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %19, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %20) + %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 43 }, ptr %21, align 8 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %21, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %22) unreachable _llgo_3: ; preds = %_llgo_1 - %21 = extractvalue { ptr, ptr, ptr, ptr } %2, 2 - store %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %1, ptr %21, align 8 - %22 = extractvalue { ptr, ptr, ptr, ptr } %2, 3 - store i1 true, ptr %22, align 1 - %23 = extractvalue { ptr, ptr, ptr, ptr } %2, 0 - store i64 1, ptr %23, align 4 + %23 = extractvalue { ptr, ptr, ptr, ptr } %2, 2 + store %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %1, ptr %23, align 8 + %24 = extractvalue { ptr, ptr, ptr, ptr } %2, 3 + store i1 true, ptr %24, align 1 + %25 = extractvalue { ptr, ptr, ptr, ptr } %2, 0 + store i64 1, ptr %25, align 4 ret i1 false _llgo_4: ; preds = %_llgo_1 - %24 = extractvalue { ptr, ptr, ptr, ptr } %2, 0 - store i64 0, ptr %24, align 4 + %26 = extractvalue { ptr, ptr, ptr, ptr } %2, 0 + store i64 0, ptr %26, align 4 ret i1 true } @@ -768,32 +845,52 @@ _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %0, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 1 - %3 = load i32, ptr %2, align 4 - %4 = icmp slt i32 %3, 0 - br i1 %4, label %_llgo_1, label %_llgo_2 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i32, ptr %3, align 4 + %6 = icmp slt i32 %5, 0 + br i1 %6, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer _llgo_2: ; preds = %_llgo_0 - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 0 - %6 = load ptr, ptr %5, align 8 - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Inspector", ptr %6, i32 0, i32 0 - %8 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %7, align 8 - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 1 - %10 = load i32, ptr %9, align 4 - %11 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, 0 - %12 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, 1 - %13 = sext i32 %10 to i64 - %14 = icmp slt i64 %13, 0 - %15 = icmp sge i64 %13, %12 - %16 = or i1 %15, %14 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %16) - %17 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %11, i64 %13 - %18 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %17, i32 0, i32 0 - %19 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %18, align 8 - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %19 + %7 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 0 + %9 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = load ptr, ptr %8, align 8 + %11 = icmp eq ptr %10, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Inspector", ptr %10, i32 0, i32 0 + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %12, align 8 + %15 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 1 + %17 = icmp eq ptr %16, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %17) + %18 = load i32, ptr %16, align 4 + %19 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %14, 0 + %20 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %14, 1 + %21 = sext i32 %18 to i64 + %22 = icmp slt i64 %21, 0 + %23 = icmp sge i64 %21, %20 + %24 = or i1 %23, %22 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %24) + %25 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %19, i64 %21 + %26 = icmp eq ptr %25, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %26) + %27 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %25, i32 0, i32 0 + %28 = icmp eq ptr %27, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %28) + %29 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %27, align 8 + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %29 } define %"iter.Seq[github.com/goplus/llgo/cl/_testgo/cursor.Cursor]" @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.Preorder"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) { @@ -819,93 +916,135 @@ define void @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.Preorder$1"(ptr %0 _llgo_0: %2 = load { ptr, ptr }, ptr %0, align 8 %3 = extractvalue { ptr, ptr } %2, 0 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %3, i32 0, i32 0 - %5 = load ptr, ptr %4, align 8 - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Inspector", ptr %5, i32 0, i32 0 - %7 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %6, align 8 - %8 = extractvalue { ptr, ptr } %2, 0 - %9 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %8, align 8 - %10 = call { i32, i32 } @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.indices"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %9) - %11 = extractvalue { i32, i32 } %10, 0 - %12 = extractvalue { i32, i32 } %10, 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %3, i32 0, i32 0 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load ptr, ptr %5, align 8 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Inspector", ptr %7, i32 0, i32 0 + %10 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %9, align 8 + %12 = extractvalue { ptr, ptr } %2, 0 + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %12, align 8 + %15 = call { i32, i32 } @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.indices"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %14) + %16 = extractvalue { i32, i32 } %15, 0 + %17 = extractvalue { i32, i32 } %15, 1 br label %_llgo_1 _llgo_1: ; preds = %_llgo_5, %_llgo_8, %_llgo_0 - %13 = phi i32 [ %11, %_llgo_0 ], [ %59, %_llgo_8 ], [ %33, %_llgo_5 ] - %14 = icmp slt i32 %13, %12 - br i1 %14, label %_llgo_2, label %_llgo_3 + %18 = phi i32 [ %16, %_llgo_0 ], [ %80, %_llgo_8 ], [ %44, %_llgo_5 ] + %19 = icmp slt i32 %18, %17 + br i1 %19, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %15 = alloca %"github.com/goplus/llgo/cl/_testgo/cursor.event", align 8 - call void @llvm.memset(ptr %15, i8 0, i64 32, i1 false) - %16 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 0 - %17 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 1 - %18 = sext i32 %13 to i64 - %19 = icmp slt i64 %18, 0 - %20 = icmp sge i64 %18, %17 - %21 = or i1 %20, %19 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %21) - %22 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %16, i64 %18 - %23 = load %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %22, align 8 - store %"github.com/goplus/llgo/cl/_testgo/cursor.event" %23, ptr %15, align 8 - %24 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %15, i32 0, i32 2 - %25 = load i32, ptr %24, align 4 - %26 = icmp sgt i32 %25, %13 - br i1 %26, label %_llgo_4, label %_llgo_5 + %20 = alloca %"github.com/goplus/llgo/cl/_testgo/cursor.event", align 8 + call void @llvm.memset(ptr %20, i8 0, i64 32, i1 false) + %21 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 0 + %22 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 1 + %23 = sext i32 %18 to i64 + %24 = icmp slt i64 %23, 0 + %25 = icmp sge i64 %23, %22 + %26 = or i1 %25, %24 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %26) + %27 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %21, i64 %23 + %28 = icmp eq ptr %27, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %28) + %29 = load %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %27, align 8 + store %"github.com/goplus/llgo/cl/_testgo/cursor.event" %29, ptr %20, align 8 + %30 = icmp eq ptr %20, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %30) + %31 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %20, i32 0, i32 2 + %32 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %32) + %33 = load i32, ptr %31, align 4 + %34 = icmp sgt i32 %33, %18 + br i1 %34, label %_llgo_4, label %_llgo_5 _llgo_3: ; preds = %_llgo_7, %_llgo_1 ret void _llgo_4: ; preds = %_llgo_2 - %27 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %15, i32 0, i32 1 - %28 = load i64, ptr %27, align 4 - %29 = extractvalue { ptr, ptr } %2, 1 - %30 = load i64, ptr %29, align 4 - %31 = and i64 %28, %30 - %32 = icmp ne i64 %31, 0 - br i1 %32, label %_llgo_7, label %_llgo_6 + %35 = icmp eq ptr %20, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %35) + %36 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %20, i32 0, i32 1 + %37 = icmp eq ptr %36, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %37) + %38 = load i64, ptr %36, align 4 + %39 = extractvalue { ptr, ptr } %2, 1 + %40 = icmp eq ptr %39, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %40) + %41 = load i64, ptr %39, align 4 + %42 = and i64 %38, %41 + %43 = icmp ne i64 %42, 0 + br i1 %43, label %_llgo_7, label %_llgo_6 _llgo_5: ; preds = %_llgo_6, %_llgo_2 - %33 = add i32 %13, 1 + %44 = add i32 %18, 1 br label %_llgo_1 _llgo_6: ; preds = %_llgo_7, %_llgo_4 - %34 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %15, i32 0, i32 2 - %35 = load i32, ptr %34, align 4 - %36 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 0 - %37 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 1 - %38 = sext i32 %35 to i64 - %39 = icmp slt i64 %38, 0 - %40 = icmp sge i64 %38, %37 - %41 = or i1 %40, %39 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %41) - %42 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %36, i64 %38 - %43 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %42, i32 0, i32 1 - %44 = load i64, ptr %43, align 4 - %45 = extractvalue { ptr, ptr } %2, 1 - %46 = load i64, ptr %45, align 4 - %47 = and i64 %44, %46 - %48 = icmp eq i64 %47, 0 - br i1 %48, label %_llgo_8, label %_llgo_5 + %45 = icmp eq ptr %20, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %45) + %46 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %20, i32 0, i32 2 + %47 = icmp eq ptr %46, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %47) + %48 = load i32, ptr %46, align 4 + %49 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 0 + %50 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 1 + %51 = sext i32 %48 to i64 + %52 = icmp slt i64 %51, 0 + %53 = icmp sge i64 %51, %50 + %54 = or i1 %53, %52 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %54) + %55 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %49, i64 %51 + %56 = icmp eq ptr %55, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %56) + %57 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %55, i32 0, i32 1 + %58 = icmp eq ptr %57, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %58) + %59 = load i64, ptr %57, align 4 + %60 = extractvalue { ptr, ptr } %2, 1 + %61 = icmp eq ptr %60, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %61) + %62 = load i64, ptr %60, align 4 + %63 = and i64 %59, %62 + %64 = icmp eq i64 %63, 0 + br i1 %64, label %_llgo_8, label %_llgo_5 _llgo_7: ; preds = %_llgo_4 - %49 = alloca %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", align 8 - call void @llvm.memset(ptr %49, i8 0, i64 16, i1 false) - %50 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %49, i32 0, i32 0 - %51 = extractvalue { ptr, ptr } %2, 0 - %52 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %51, i32 0, i32 0 - %53 = load ptr, ptr %52, align 8 - %54 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %49, i32 0, i32 1 - store ptr %53, ptr %50, align 8 - store i32 %13, ptr %54, align 4 - %55 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %49, align 8 - %56 = extractvalue { ptr, ptr } %1, 1 - %57 = extractvalue { ptr, ptr } %1, 0 - %58 = call i1 %57(ptr %56, %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %55) - br i1 %58, label %_llgo_6, label %_llgo_3 + %65 = alloca %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", align 8 + call void @llvm.memset(ptr %65, i8 0, i64 16, i1 false) + %66 = icmp eq ptr %65, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %66) + %67 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %65, i32 0, i32 0 + %68 = extractvalue { ptr, ptr } %2, 0 + %69 = icmp eq ptr %68, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %69) + %70 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %68, i32 0, i32 0 + %71 = icmp eq ptr %70, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %71) + %72 = load ptr, ptr %70, align 8 + %73 = icmp eq ptr %65, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %73) + %74 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %65, i32 0, i32 1 + store ptr %72, ptr %67, align 8 + store i32 %18, ptr %74, align 4 + %75 = icmp eq ptr %65, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %75) + %76 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %65, align 8 + %77 = extractvalue { ptr, ptr } %1, 1 + %78 = extractvalue { ptr, ptr } %1, 0 + %79 = call i1 %78(ptr %77, %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %76) + br i1 %79, label %_llgo_6, label %_llgo_3 _llgo_8: ; preds = %_llgo_6 - %59 = add i32 %35, 1 + %80 = add i32 %48, 1 br label %_llgo_1 } @@ -914,80 +1053,120 @@ _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %0, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 1 - %3 = load i32, ptr %2, align 4 - %4 = icmp slt i32 %3, 0 - br i1 %4, label %_llgo_1, label %_llgo_2 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i32, ptr %3, align 4 + %6 = icmp slt i32 %5, 0 + br i1 %6, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 0 - %6 = load ptr, ptr %5, align 8 - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Inspector", ptr %6, i32 0, i32 0 - %8 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %7, align 8 - %9 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, 1 - %10 = trunc i64 %9 to i32 - %11 = insertvalue { i32, i32 } { i32 0, i32 undef }, i32 %10, 1 - ret { i32, i32 } %11 + %7 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 0 + %9 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = load ptr, ptr %8, align 8 + %11 = icmp eq ptr %10, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Inspector", ptr %10, i32 0, i32 0 + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %12, align 8 + %15 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %14, 1 + %16 = trunc i64 %15 to i32 + %17 = insertvalue { i32, i32 } { i32 0, i32 undef }, i32 %16, 1 + ret { i32, i32 } %17 _llgo_2: ; preds = %_llgo_0 - %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 1 - %13 = load i32, ptr %12, align 4 - %14 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 0 - %15 = load ptr, ptr %14, align 8 - %16 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Inspector", ptr %15, i32 0, i32 0 - %17 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %16, align 8 - %18 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 1 - %19 = load i32, ptr %18, align 4 - %20 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %17, 0 - %21 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %17, 1 - %22 = sext i32 %19 to i64 - %23 = icmp slt i64 %22, 0 - %24 = icmp sge i64 %22, %21 - %25 = or i1 %24, %23 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %25) - %26 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %20, i64 %22 - %27 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %26, i32 0, i32 2 - %28 = load i32, ptr %27, align 4 - %29 = add i32 %28, 1 - %30 = insertvalue { i32, i32 } undef, i32 %13, 0 - %31 = insertvalue { i32, i32 } %30, i32 %29, 1 - ret { i32, i32 } %31 + %18 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 1 + %20 = icmp eq ptr %19, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = load i32, ptr %19, align 4 + %22 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %22) + %23 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 0 + %24 = icmp eq ptr %23, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %24) + %25 = load ptr, ptr %23, align 8 + %26 = icmp eq ptr %25, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %26) + %27 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Inspector", ptr %25, i32 0, i32 0 + %28 = icmp eq ptr %27, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %28) + %29 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %27, align 8 + %30 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %30) + %31 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %1, i32 0, i32 1 + %32 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %32) + %33 = load i32, ptr %31, align 4 + %34 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %29, 0 + %35 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %29, 1 + %36 = sext i32 %33 to i64 + %37 = icmp slt i64 %36, 0 + %38 = icmp sge i64 %36, %35 + %39 = or i1 %38, %37 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %39) + %40 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %34, i64 %36 + %41 = icmp eq ptr %40, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %41) + %42 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.event", ptr %40, i32 0, i32 2 + %43 = icmp eq ptr %42, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %43) + %44 = load i32, ptr %42, align 4 + %45 = add i32 %44, 1 + %46 = insertvalue { i32, i32 } undef, i32 %21, 0 + %47 = insertvalue { i32, i32 } %46, i32 %45, 1 + ret { i32, i32 } %47 } define { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } @"github.com/goplus/llgo/cl/_testgo/cursor.(*Cursor).FindNode"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) { _llgo_0: - %2 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %0, align 8 - %3 = call { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.FindNode"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %2, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) - %4 = extractvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %3, 0 - %5 = extractvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %3, 1 - %6 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } undef, %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %4, 0 - %7 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %6, i1 %5, 1 - ret { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %7 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %0, align 8 + %4 = call { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.FindNode"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %3, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) + %5 = extractvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %4, 0 + %6 = extractvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %4, 1 + %7 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } undef, %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %5, 0 + %8 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %7, i1 %6, 1 + ret { %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", i1 } %8 } define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/cursor.(*Cursor).Node"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %0, align 8 - %2 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.Node"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %1) - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %0, align 8 + %3 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.Node"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %2) + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3 } define %"iter.Seq[github.com/goplus/llgo/cl/_testgo/cursor.Cursor]" @"github.com/goplus/llgo/cl/_testgo/cursor.(*Cursor).Preorder"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) { _llgo_0: - %2 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %0, align 8 - %3 = call %"iter.Seq[github.com/goplus/llgo/cl/_testgo/cursor.Cursor]" @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.Preorder"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %2, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) - ret %"iter.Seq[github.com/goplus/llgo/cl/_testgo/cursor.Cursor]" %3 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %0, align 8 + %4 = call %"iter.Seq[github.com/goplus/llgo/cl/_testgo/cursor.Cursor]" @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.Preorder"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %3, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) + ret %"iter.Seq[github.com/goplus/llgo/cl/_testgo/cursor.Cursor]" %4 } define { i32, i32 } @"github.com/goplus/llgo/cl/_testgo/cursor.(*Cursor).indices"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %0, align 8 - %2 = call { i32, i32 } @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.indices"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %1) - %3 = extractvalue { i32, i32 } %2, 0 - %4 = extractvalue { i32, i32 } %2, 1 - %5 = insertvalue { i32, i32 } undef, i32 %3, 0 - %6 = insertvalue { i32, i32 } %5, i32 %4, 1 - ret { i32, i32 } %6 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %0, align 8 + %3 = call { i32, i32 } @"github.com/goplus/llgo/cl/_testgo/cursor.Cursor.indices"(%"github.com/goplus/llgo/cl/_testgo/cursor.Cursor" %2) + %4 = extractvalue { i32, i32 } %3, 0 + %5 = extractvalue { i32, i32 } %3, 1 + %6 = insertvalue { i32, i32 } undef, i32 %4, 0 + %7 = insertvalue { i32, i32 } %6, i32 %5, 1 + ret { i32, i32 } %7 } define void @"github.com/goplus/llgo/cl/_testgo/cursor.init"() { @@ -1009,9 +1188,11 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testgo/cursor.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %0, i32 0, i32 0 - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - store ptr %2, ptr %1, align 8 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/cursor.Cursor", ptr %0, i32 0, i32 0 + %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) + store ptr %3, ptr %2, align 8 ret void } @@ -1029,7 +1210,7 @@ _llgo_2: ; preds = %_llgo_0 br label %_llgo_3 _llgo_3: ; preds = %_llgo_4, %_llgo_2 - %4 = phi i64 [ 0, %_llgo_2 ], [ %16, %_llgo_4 ] + %4 = phi i64 [ 0, %_llgo_2 ], [ %17, %_llgo_4 ] %5 = phi i64 [ -1, %_llgo_2 ], [ %6, %_llgo_4 ] %6 = add i64 %5, 1 %7 = icmp slt i64 %6, %3 @@ -1043,9 +1224,11 @@ _llgo_4: ; preds = %_llgo_3 %12 = or i1 %11, %10 call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %12) %13 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %8, i64 %6 - %14 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %13, align 8 - %15 = call i64 @"github.com/goplus/llgo/cl/_testgo/cursor.typeOf"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %14) - %16 = or i64 %4, %15 + %14 = icmp eq ptr %13, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %13, align 8 + %16 = call i64 @"github.com/goplus/llgo/cl/_testgo/cursor.typeOf"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %15) + %17 = or i64 %4, %16 br label %_llgo_3 _llgo_5: ; preds = %_llgo_3 @@ -2373,6 +2556,8 @@ declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.strequal"(ptr, ptr) diff --git a/cl/_testgo/embedunexport-1598/out.ll b/cl/_testgo/embedunexport-1598/out.ll index 6f08d5e099..70dff88862 100644 --- a/cl/_testgo/embedunexport-1598/out.ll +++ b/cl/_testgo/embedunexport-1598/out.ll @@ -47,16 +47,21 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/embedunexport-1598" @13 = private unnamed_addr constant [58 x i8] c"interface { Name() string; embedunexport.setName(string) }", align 1 @"*github.com/goplus/llgo/cl/_testdata/embedunexport.iface$gGW7PSocDeRlTvk5kuSew8C-TZ8OXQrGkMlj2EUlZ9E" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1886130721, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 58 }, ptr null }, ptr @"github.com/goplus/llgo/cl/_testdata/embedunexport.iface$gGW7PSocDeRlTvk5kuSew8C-TZ8OXQrGkMlj2EUlZ9E" }, align 8 @"github.com/goplus/llgo/cl/_testdata/embedunexport.iface$gGW7PSocDeRlTvk5kuSew8C-TZ8OXQrGkMlj2EUlZ9E$imethods" = weak_odr constant [2 x %"github.com/goplus/llgo/runtime/abi.Imethod"] [%"github.com/goplus/llgo/runtime/abi.Imethod" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 4 }, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to" }, %"github.com/goplus/llgo/runtime/abi.Imethod" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 57 }, ptr @"_llgo_func$dlTgtqQDYoqfVBQYEBE1Fa3ytcia1pdKaKVOnw8ZjkA" }], align 8 +@llvm.compiler.used = appending global [4 x ptr] [ptr @"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped.Name", ptr @"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped.setName", ptr @"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.(*Wrapped).Name", ptr @"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.(*Wrapped).setName"], section "llvm.metadata" define %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped.Name"(%"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped" %0) { _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped", align 8 call void @llvm.memset(ptr %1, i8 0, i64 8, i1 false) store %"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped" %0, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped", ptr %1, i32 0, i32 0 - %3 = load ptr, ptr %2, align 8 - %4 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).Name"(ptr %3) - ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped", ptr %1, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).Name"(ptr %5) + ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %6 } define void @"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped.setName"(%"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped" %0, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) { @@ -64,25 +69,37 @@ _llgo_0: %2 = alloca %"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped", align 8 call void @llvm.memset(ptr %2, i8 0, i64 8, i1 false) store %"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped" %0, ptr %2, align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped", ptr %2, i32 0, i32 0 - %4 = load ptr, ptr %3, align 8 - call void @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).setName"(ptr %4, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped", ptr %2, i32 0, i32 0 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + call void @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).setName"(ptr %6, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) ret void } define %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.(*Wrapped).Name"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped", ptr %0, i32 0, i32 0 - %2 = load ptr, ptr %1, align 8 - %3 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).Name"(ptr %2) - ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).Name"(ptr %4) + ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %5 } define void @"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.(*Wrapped).setName"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped", ptr %0, i32 0, i32 0 - %3 = load ptr, ptr %2, align 8 - call void @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).setName"(ptr %3, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped", ptr %0, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + call void @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).setName"(ptr %5, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) ret void } @@ -104,22 +121,24 @@ define void @"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/cl/_testdata/embedunexport.NewBase"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 4 }) %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped", ptr %1, i32 0, i32 0 - store ptr %0, ptr %2, align 8 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testdata/embedunexport.iface$gGW7PSocDeRlTvk5kuSew8C-TZ8OXQrGkMlj2EUlZ9E", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped") - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %3, 0 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %1, 1 - call void @"github.com/goplus/llgo/cl/_testdata/embedunexport.Use"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %5) - %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %5) - %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, 0 - %8 = getelementptr ptr, ptr %7, i64 3 - %9 = load ptr, ptr %8, align 8 - %10 = insertvalue { ptr, ptr } undef, ptr %9, 0 - %11 = insertvalue { ptr, ptr } %10, ptr %6, 1 - %12 = extractvalue { ptr, ptr } %11, 1 - %13 = extractvalue { ptr, ptr } %11, 0 - %14 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %13(ptr %12) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %14) + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped", ptr %1, i32 0, i32 0 + store ptr %0, ptr %3, align 8 + %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testdata/embedunexport.iface$gGW7PSocDeRlTvk5kuSew8C-TZ8OXQrGkMlj2EUlZ9E", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/embedunexport-1598.Wrapped") + %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %4, 0 + %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, ptr %1, 1 + call void @"github.com/goplus/llgo/cl/_testdata/embedunexport.Use"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %6) + %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %6) + %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 0 + %9 = getelementptr ptr, ptr %8, i64 3 + %10 = load ptr, ptr %9, align 8 + %11 = insertvalue { ptr, ptr } undef, ptr %10, 0 + %12 = insertvalue { ptr, ptr } %11, ptr %7, 1 + %13 = extractvalue { ptr, ptr } %12, 1 + %14 = extractvalue { ptr, ptr } %12, 0 + %15 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %14(ptr %13) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %15) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -127,6 +146,8 @@ _llgo_0: ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).Name"(ptr) declare void @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).setName"(ptr, %"github.com/goplus/llgo/runtime/internal/runtime.String") diff --git a/cl/_testgo/equal/out.ll b/cl/_testgo/equal/out.ll index fbbe0df1ed..17e8baa7e0 100644 --- a/cl/_testgo/equal/out.ll +++ b/cl/_testgo/equal/out.ll @@ -23,7 +23,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/equal" @1 = private unnamed_addr constant [6 x i8] c"string", align 1 @"*_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1323879264, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 6 }, ptr null }, ptr @_llgo_string }, align 8 @2 = private unnamed_addr constant [5 x i8] c"hello", align 1 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr @"*_llgo_int" }, align 8 @3 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @4 = private unnamed_addr constant [2 x i8] c"ok", align 1 @@ -55,7 +55,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/equal" @"[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 307038632, i8 8, i8 1, i8 1, i8 17, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"[8]_llgo_uint8" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 8 }, ptr @"*[8]_llgo_uint8" }, ptr @_llgo_uint8, ptr @"[]_llgo_uint8", i64 8 }, align 8 @17 = private unnamed_addr constant [8 x i8] c"[8]uint8", align 1 @"*[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -566230779, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 8 }, ptr null }, ptr @"[8]_llgo_uint8" }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @18 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @"[]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 370346748, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @19, i64 7 }, ptr @"*[]_llgo_uint8" }, ptr @_llgo_uint8 }, align 8 @@ -150,8 +150,10 @@ define void @"github.com/goplus/llgo/cl/_testgo/equal.init#1$2"(ptr %0) { _llgo_0: %1 = load { ptr }, ptr %0, align 8 %2 = extractvalue { ptr } %1, 0 - %3 = load i64, ptr %2, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %3) + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %4) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -161,53 +163,75 @@ _llgo_0: call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 true) %0 = alloca [3 x i64], align 8 call void @llvm.memset(ptr %0, i8 0, i64 24, i1 false) - %1 = getelementptr inbounds i64, ptr %0, i64 0 - %2 = getelementptr inbounds i64, ptr %0, i64 1 - %3 = getelementptr inbounds i64, ptr %0, i64 2 - store i64 1, ptr %1, align 4 - store i64 2, ptr %2, align 4 - store i64 3, ptr %3, align 4 - %4 = alloca [3 x i64], align 8 - call void @llvm.memset(ptr %4, i8 0, i64 24, i1 false) - %5 = getelementptr inbounds i64, ptr %4, i64 0 - %6 = getelementptr inbounds i64, ptr %4, i64 1 - %7 = getelementptr inbounds i64, ptr %4, i64 2 - store i64 1, ptr %5, align 4 - store i64 2, ptr %6, align 4 - store i64 3, ptr %7, align 4 - %8 = load [3 x i64], ptr %0, align 4 - %9 = load [3 x i64], ptr %4, align 4 - %10 = extractvalue [3 x i64] %8, 0 - %11 = extractvalue [3 x i64] %9, 0 - %12 = icmp eq i64 %10, %11 - %13 = and i1 true, %12 - %14 = extractvalue [3 x i64] %8, 1 - %15 = extractvalue [3 x i64] %9, 1 - %16 = icmp eq i64 %14, %15 - %17 = and i1 %13, %16 - %18 = extractvalue [3 x i64] %8, 2 - %19 = extractvalue [3 x i64] %9, 2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds i64, ptr %0, i64 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds i64, ptr %0, i64 1 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds i64, ptr %0, i64 2 + store i64 1, ptr %2, align 4 + store i64 2, ptr %4, align 4 + store i64 3, ptr %6, align 4 + %7 = alloca [3 x i64], align 8 + call void @llvm.memset(ptr %7, i8 0, i64 24, i1 false) + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds i64, ptr %7, i64 0 + %10 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds i64, ptr %7, i64 1 + %12 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds i64, ptr %7, i64 2 + store i64 1, ptr %9, align 4 + store i64 2, ptr %11, align 4 + store i64 3, ptr %13, align 4 + %14 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load [3 x i64], ptr %0, align 4 + %16 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = load [3 x i64], ptr %7, align 4 + %18 = extractvalue [3 x i64] %15, 0 + %19 = extractvalue [3 x i64] %17, 0 %20 = icmp eq i64 %18, %19 - %21 = and i1 %17, %20 - call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %21) - %22 = getelementptr inbounds i64, ptr %4, i64 1 - store i64 1, ptr %22, align 4 - %23 = load [3 x i64], ptr %0, align 4 - %24 = load [3 x i64], ptr %4, align 4 - %25 = extractvalue [3 x i64] %23, 0 - %26 = extractvalue [3 x i64] %24, 0 - %27 = icmp eq i64 %25, %26 - %28 = and i1 true, %27 - %29 = extractvalue [3 x i64] %23, 1 - %30 = extractvalue [3 x i64] %24, 1 - %31 = icmp eq i64 %29, %30 - %32 = and i1 %28, %31 - %33 = extractvalue [3 x i64] %23, 2 - %34 = extractvalue [3 x i64] %24, 2 - %35 = icmp eq i64 %33, %34 - %36 = and i1 %32, %35 - %37 = xor i1 %36, true - call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %37) + %21 = and i1 true, %20 + %22 = extractvalue [3 x i64] %15, 1 + %23 = extractvalue [3 x i64] %17, 1 + %24 = icmp eq i64 %22, %23 + %25 = and i1 %21, %24 + %26 = extractvalue [3 x i64] %15, 2 + %27 = extractvalue [3 x i64] %17, 2 + %28 = icmp eq i64 %26, %27 + %29 = and i1 %25, %28 + call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %29) + %30 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %30) + %31 = getelementptr inbounds i64, ptr %7, i64 1 + store i64 1, ptr %31, align 4 + %32 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %32) + %33 = load [3 x i64], ptr %0, align 4 + %34 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %34) + %35 = load [3 x i64], ptr %7, align 4 + %36 = extractvalue [3 x i64] %33, 0 + %37 = extractvalue [3 x i64] %35, 0 + %38 = icmp eq i64 %36, %37 + %39 = and i1 true, %38 + %40 = extractvalue [3 x i64] %33, 1 + %41 = extractvalue [3 x i64] %35, 1 + %42 = icmp eq i64 %40, %41 + %43 = and i1 %39, %42 + %44 = extractvalue [3 x i64] %33, 2 + %45 = extractvalue [3 x i64] %35, 2 + %46 = icmp eq i64 %44, %45 + %47 = and i1 %43, %46 + %48 = xor i1 %47, true + call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %48) ret void } @@ -215,203 +239,293 @@ define void @"github.com/goplus/llgo/cl/_testgo/equal.init#3"() { _llgo_0: %0 = alloca %"github.com/goplus/llgo/cl/_testgo/equal.T", align 8 call void @llvm.memset(ptr %0, i8 0, i64 48, i1 false) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %0, i32 0, i32 1 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %0, i32 0, i32 2 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %0, i32 0, i32 3 - store i64 10, ptr %1, align 4 - store i64 20, ptr %2, align 4 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 5 }, ptr %3, align 8 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 1 to ptr) }, ptr %4, align 8 - %5 = alloca %"github.com/goplus/llgo/cl/_testgo/equal.T", align 8 - call void @llvm.memset(ptr %5, i8 0, i64 48, i1 false) - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %5, i32 0, i32 0 - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %5, i32 0, i32 1 - %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %5, i32 0, i32 2 - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %5, i32 0, i32 3 - store i64 10, ptr %6, align 4 - store i64 20, ptr %7, align 4 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 5 }, ptr %8, align 8 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 1 to ptr) }, ptr %9, align 8 - %10 = alloca %"github.com/goplus/llgo/cl/_testgo/equal.T", align 8 - call void @llvm.memset(ptr %10, i8 0, i64 48, i1 false) - %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %10, i32 0, i32 0 - %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %10, i32 0, i32 1 - %13 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %10, i32 0, i32 2 - %14 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %10, i32 0, i32 3 - store i64 10, ptr %11, align 4 - store i64 20, ptr %12, align 4 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 5 }, ptr %13, align 8 - %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 2 }, ptr %15, align 8 - %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %15, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %16, ptr %14, align 8 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %0, i32 0, i32 1 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %0, i32 0, i32 2 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %0, i32 0, i32 3 + store i64 10, ptr %2, align 4 + store i64 20, ptr %4, align 4 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 5 }, ptr %6, align 8 + %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 1, ptr %9, align 4 + %10 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %9, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %10, ptr %8, align 8 + %11 = alloca %"github.com/goplus/llgo/cl/_testgo/equal.T", align 8 + call void @llvm.memset(ptr %11, i8 0, i64 48, i1 false) + %12 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %11, i32 0, i32 0 + %14 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %11, i32 0, i32 1 + %16 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %11, i32 0, i32 2 + %18 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %11, i32 0, i32 3 + store i64 10, ptr %13, align 4 + store i64 20, ptr %15, align 4 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 5 }, ptr %17, align 8 + %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 1, ptr %20, align 4 + %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %20, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %21, ptr %19, align 8 + %22 = alloca %"github.com/goplus/llgo/cl/_testgo/equal.T", align 8 + call void @llvm.memset(ptr %22, i8 0, i64 48, i1 false) + %23 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %23) + %24 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %22, i32 0, i32 0 + %25 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %25) + %26 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %22, i32 0, i32 1 + %27 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %27) + %28 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %22, i32 0, i32 2 + %29 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %29) + %30 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %22, i32 0, i32 3 + store i64 10, ptr %24, align 4 + store i64 20, ptr %26, align 4 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 5 }, ptr %28, align 8 + %31 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 2 }, ptr %31, align 8 + %32 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %31, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %32, ptr %30, align 8 call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 true) - %17 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer) - %18 = and i1 true, %17 - %19 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.eface" zeroinitializer) - %20 = and i1 %18, %19 - call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %20) - %21 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %0, align 8 - %22 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %5, align 8 - %23 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %21, 0 - %24 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %22, 0 - %25 = icmp eq i64 %23, %24 - %26 = and i1 true, %25 - %27 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %21, 1 - %28 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %22, 1 - %29 = icmp eq i64 %27, %28 - %30 = and i1 %26, %29 - %31 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %21, 2 - %32 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %22, 2 - %33 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %31, %"github.com/goplus/llgo/runtime/internal/runtime.String" %32) - %34 = and i1 %30, %33 - %35 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %21, 3 - %36 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %22, 3 - %37 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %35, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %36) - %38 = and i1 %34, %37 - call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %38) - %39 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %0, align 8 - %40 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %10, align 8 - %41 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %39, 0 - %42 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %40, 0 + call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 true) + %33 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %33) + %34 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %0, align 8 + %35 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %35) + %36 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %11, align 8 + %37 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %34, 0 + %38 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %36, 0 + %39 = icmp eq i64 %37, %38 + %40 = and i1 true, %39 + %41 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %34, 1 + %42 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %36, 1 %43 = icmp eq i64 %41, %42 - %44 = and i1 true, %43 - %45 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %39, 1 - %46 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %40, 1 - %47 = icmp eq i64 %45, %46 + %44 = and i1 %40, %43 + %45 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %34, 2 + %46 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %36, 2 + %47 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %45, %"github.com/goplus/llgo/runtime/internal/runtime.String" %46) %48 = and i1 %44, %47 - %49 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %39, 2 - %50 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %40, 2 - %51 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %49, %"github.com/goplus/llgo/runtime/internal/runtime.String" %50) + %49 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %34, 3 + %50 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %36, 3 + %51 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %49, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %50) %52 = and i1 %48, %51 - %53 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %39, 3 - %54 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %40, 3 - %55 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %53, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %54) - %56 = and i1 %52, %55 - %57 = xor i1 %56, true - call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %57) - %58 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %5, align 8 - %59 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %10, align 8 - %60 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %58, 0 - %61 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %59, 0 - %62 = icmp eq i64 %60, %61 - %63 = and i1 true, %62 - %64 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %58, 1 - %65 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %59, 1 - %66 = icmp eq i64 %64, %65 - %67 = and i1 %63, %66 - %68 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %58, 2 - %69 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %59, 2 - %70 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %68, %"github.com/goplus/llgo/runtime/internal/runtime.String" %69) - %71 = and i1 %67, %70 - %72 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %58, 3 - %73 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %59, 3 - %74 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %72, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %73) - %75 = and i1 %71, %74 - %76 = xor i1 %75, true - call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %76) + call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %52) + %53 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %53) + %54 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %0, align 8 + %55 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %55) + %56 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %22, align 8 + %57 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %54, 0 + %58 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %56, 0 + %59 = icmp eq i64 %57, %58 + %60 = and i1 true, %59 + %61 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %54, 1 + %62 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %56, 1 + %63 = icmp eq i64 %61, %62 + %64 = and i1 %60, %63 + %65 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %54, 2 + %66 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %56, 2 + %67 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %65, %"github.com/goplus/llgo/runtime/internal/runtime.String" %66) + %68 = and i1 %64, %67 + %69 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %54, 3 + %70 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %56, 3 + %71 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %69, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %70) + %72 = and i1 %68, %71 + %73 = xor i1 %72, true + call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %73) + %74 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %74) + %75 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %11, align 8 + %76 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %76) + %77 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %22, align 8 + %78 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %75, 0 + %79 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %77, 0 + %80 = icmp eq i64 %78, %79 + %81 = and i1 true, %80 + %82 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %75, 1 + %83 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %77, 1 + %84 = icmp eq i64 %82, %83 + %85 = and i1 %81, %84 + %86 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %75, 2 + %87 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %77, 2 + %88 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %86, %"github.com/goplus/llgo/runtime/internal/runtime.String" %87) + %89 = and i1 %85, %88 + %90 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %75, 3 + %91 = extractvalue %"github.com/goplus/llgo/cl/_testgo/equal.T" %77, 3 + %92 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %90, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %91) + %93 = and i1 %89, %92 + %94 = xor i1 %93, true + call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %94) ret void } define void @"github.com/goplus/llgo/cl/_testgo/equal.init#4"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %1 = getelementptr inbounds i64, ptr %0, i64 0 - store i64 1, ptr %1, align 4 - %2 = getelementptr inbounds i64, ptr %0, i64 1 - store i64 2, ptr %2, align 4 - %3 = getelementptr inbounds i64, ptr %0, i64 2 - store i64 3, ptr %3, align 4 - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %4, i64 3, 1 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, i64 3, 2 - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %8 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %7, i64 8, i64 2, i64 0, i64 2, i64 2) - %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %10 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %9, i64 8, i64 2, i64 0, i64 0, i64 2) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds i64, ptr %0, i64 0 + store i64 1, ptr %2, align 4 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds i64, ptr %0, i64 1 + store i64 2, ptr %4, align 4 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds i64, ptr %0, i64 2 + store i64 3, ptr %6, align 4 + %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 + %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, i64 3, 1 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, i64 3, 2 + %10 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.MakeSlice"(i64 2, i64 2, i64 8) + %11 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.MakeSlice"(i64 0, i64 2, i64 8) call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 true) - %11 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, 0 - %12 = icmp ne ptr %11, null - call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %12) - %13 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, 0 - %14 = icmp ne ptr %13, null - call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %14) - %15 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %10, 0 - %16 = icmp ne ptr %15, null - call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %16) + %12 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9, 0 + %13 = icmp ne ptr %12, null + call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %13) + %14 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %10, 0 + %15 = icmp ne ptr %14, null + call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %15) + %16 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 0 + %17 = icmp ne ptr %16, null + call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %17) call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 true) ret void } define void @"github.com/goplus/llgo/cl/_testgo/equal.init#5"() { _llgo_0: - %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0) - store {} zeroinitializer, ptr %0, align 1 - %1 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", ptr undef }, ptr %0, 1 - %2 = alloca %"github.com/goplus/llgo/cl/_testgo/equal.T", align 8 - call void @llvm.memset(ptr %2, i8 0, i64 48, i1 false) - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %2, i32 0, i32 0 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %2, i32 0, i32 1 - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %2, i32 0, i32 2 - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %2, i32 0, i32 3 - store i64 10, ptr %3, align 4 - store i64 20, ptr %4, align 4 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 5 }, ptr %5, align 8 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 1 to ptr) }, ptr %6, align 8 - %7 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %2, align 8 - %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 48) - store %"github.com/goplus/llgo/cl/_testgo/equal.T" %7, ptr %8, align 8 - %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/equal.T", ptr undef }, ptr %8, 1 - %10 = alloca %"github.com/goplus/llgo/cl/_testgo/equal.T", align 8 - call void @llvm.memset(ptr %10, i8 0, i64 48, i1 false) - %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %10, i32 0, i32 0 - %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %10, i32 0, i32 1 - %13 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %10, i32 0, i32 2 - %14 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %10, i32 0, i32 3 - store i64 10, ptr %11, align 4 - store i64 20, ptr %12, align 4 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 5 }, ptr %13, align 8 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 1 to ptr) }, ptr %14, align 8 - %15 = alloca %"github.com/goplus/llgo/cl/_testgo/equal.T", align 8 - call void @llvm.memset(ptr %15, i8 0, i64 48, i1 false) - %16 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %15, i32 0, i32 0 - %17 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %15, i32 0, i32 1 - %18 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %15, i32 0, i32 2 - %19 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %15, i32 0, i32 3 - store i64 10, ptr %16, align 4 - store i64 20, ptr %17, align 4 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 5 }, ptr %18, align 8 - %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 2 }, ptr %20, align 8 - %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %21, ptr %19, align 8 - %22 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 100 to ptr) }, %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 100 to ptr) }) - call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %22) - %23 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0) - store {} zeroinitializer, ptr %23, align 1 - %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", ptr undef }, ptr %23, 1 - %25 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %1, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %24) - call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %25) - %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0) - store %"github.com/goplus/llgo/cl/_testgo/equal.N" zeroinitializer, ptr %26, align 1 - %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/equal.N", ptr undef }, ptr %26, 1 - %28 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %1, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %27) - %29 = xor i1 %28, true - call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %29) - %30 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %10, align 8 - %31 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 48) - store %"github.com/goplus/llgo/cl/_testgo/equal.T" %30, ptr %31, align 8 - %32 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/equal.T", ptr undef }, ptr %31, 1 - %33 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %9, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %32) - call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %33) - %34 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %15, align 8 - %35 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 48) - store %"github.com/goplus/llgo/cl/_testgo/equal.T" %34, ptr %35, align 8 - %36 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/equal.T", ptr undef }, ptr %35, 1 - %37 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %9, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %36) - %38 = xor i1 %37, true - call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %38) + %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 100, ptr %0, align 4 + %1 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %0, 1 + %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0) + store {} zeroinitializer, ptr %2, align 1 + %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", ptr undef }, ptr %2, 1 + %4 = alloca %"github.com/goplus/llgo/cl/_testgo/equal.T", align 8 + call void @llvm.memset(ptr %4, i8 0, i64 48, i1 false) + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %4, i32 0, i32 0 + %7 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %4, i32 0, i32 1 + %9 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %4, i32 0, i32 2 + %11 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %4, i32 0, i32 3 + store i64 10, ptr %6, align 4 + store i64 20, ptr %8, align 4 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 5 }, ptr %10, align 8 + %13 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 1, ptr %13, align 4 + %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %13, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %14, ptr %12, align 8 + %15 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %4, align 8 + %17 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %17) + %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 48) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/equal.T", ptr %18, ptr %4) + %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/equal.T", ptr undef }, ptr %18, 1 + %20 = alloca %"github.com/goplus/llgo/cl/_testgo/equal.T", align 8 + call void @llvm.memset(ptr %20, i8 0, i64 48, i1 false) + %21 = icmp eq ptr %20, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %21) + %22 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %20, i32 0, i32 0 + %23 = icmp eq ptr %20, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %23) + %24 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %20, i32 0, i32 1 + %25 = icmp eq ptr %20, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %25) + %26 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %20, i32 0, i32 2 + %27 = icmp eq ptr %20, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %27) + %28 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %20, i32 0, i32 3 + store i64 10, ptr %22, align 4 + store i64 20, ptr %24, align 4 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 5 }, ptr %26, align 8 + %29 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 1, ptr %29, align 4 + %30 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %29, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %30, ptr %28, align 8 + %31 = alloca %"github.com/goplus/llgo/cl/_testgo/equal.T", align 8 + call void @llvm.memset(ptr %31, i8 0, i64 48, i1 false) + %32 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %32) + %33 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %31, i32 0, i32 0 + %34 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %34) + %35 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %31, i32 0, i32 1 + %36 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %36) + %37 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %31, i32 0, i32 2 + %38 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %38) + %39 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %31, i32 0, i32 3 + store i64 10, ptr %33, align 4 + store i64 20, ptr %35, align 4 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 5 }, ptr %37, align 8 + %40 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 2 }, ptr %40, align 8 + %41 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %40, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %41, ptr %39, align 8 + %42 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 100, ptr %42, align 4 + %43 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %42, 1 + %44 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %1, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %43) + call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %44) + %45 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0) + store {} zeroinitializer, ptr %45, align 1 + %46 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", ptr undef }, ptr %45, 1 + %47 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %3, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %46) + call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %47) + %48 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0) + store %"github.com/goplus/llgo/cl/_testgo/equal.N" zeroinitializer, ptr %48, align 1 + %49 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/equal.N", ptr undef }, ptr %48, 1 + %50 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %3, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %49) + %51 = xor i1 %50, true + call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %51) + %52 = icmp eq ptr %20, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %52) + %53 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %20, align 8 + %54 = icmp eq ptr %20, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %54) + %55 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 48) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/equal.T", ptr %55, ptr %20) + %56 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/equal.T", ptr undef }, ptr %55, 1 + %57 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %19, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %56) + call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %57) + %58 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %58) + %59 = load %"github.com/goplus/llgo/cl/_testgo/equal.T", ptr %31, align 8 + %60 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %60) + %61 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 48) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/equal.T", ptr %61, ptr %31) + %62 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/equal.T", ptr undef }, ptr %61, 1 + %63 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %19, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %62) + %64 = xor i1 %63, true + call void @"github.com/goplus/llgo/cl/_testgo/equal.assert"(i1 %64) ret void } @@ -469,6 +583,8 @@ declare void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.c declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) @@ -488,7 +604,7 @@ declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"gith declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface", %"github.com/goplus/llgo/runtime/internal/runtime.eface") -declare %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr, i64, i64, i64, i64, i64) +declare %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.MakeSlice"(i64, i64, i64) declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequal0"(ptr, ptr) @@ -508,6 +624,8 @@ _llgo_0: ret i1 %3 } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr, ptr, ptr) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewChan"(i64, i64) declare i64 @"github.com/goplus/llgo/runtime/internal/runtime.typehash"(ptr, ptr, i64) diff --git a/cl/_testgo/errors/out.ll b/cl/_testgo/errors/out.ll index fc7a97faea..3b91818aa2 100644 --- a/cl/_testgo/errors/out.ll +++ b/cl/_testgo/errors/out.ll @@ -35,23 +35,30 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/errors" @"*_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 722800013, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 28 }, ptr null }, ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU" }, align 8 @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU$imethods" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.Imethod"] [%"github.com/goplus/llgo/runtime/abi.Imethod" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 5 }, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to" }], align 8 @7 = private unnamed_addr constant [8 x i8] c"an error", align 1 +@llvm.compiler.used = appending global [1 x ptr] [ptr @"github.com/goplus/llgo/cl/_testgo/errors.(*errorString).Error"], section "llvm.metadata" define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/errors.New"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %0) { _llgo_0: %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/errors.errorString", ptr %1, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" %0, ptr %2, align 8 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/errors.errorString") - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %3, 0 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %1, 1 - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/errors.errorString", ptr %1, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" %0, ptr %3, align 8 + %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/errors.errorString") + %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %4, 0 + %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, ptr %1, 1 + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6 } define %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testgo/errors.(*errorString).Error"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/errors.errorString", ptr %0, i32 0, i32 0 - %2 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %1, align 8 - ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/errors.errorString", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %2, align 8 + ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %4 } define void @"github.com/goplus/llgo/cl/_testgo/errors.init"() { @@ -88,6 +95,8 @@ _llgo_0: declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequalptr"(ptr, ptr) define linkonce i1 @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr"(ptr %0, ptr %1, ptr %2) { diff --git a/cl/_testgo/goroutine/out.ll b/cl/_testgo/goroutine/out.ll index f47ac2c359..cac4a3f2a8 100644 --- a/cl/_testgo/goroutine/out.ll +++ b/cl/_testgo/goroutine/out.ll @@ -25,7 +25,7 @@ define void @"github.com/goplus/llgo/cl/_testgo/goroutine.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 1) store i1 false, ptr %0, align 1 - %1 = call ptr @malloc(i64 16) + %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) %2 = getelementptr inbounds { %"github.com/goplus/llgo/runtime/internal/runtime.String" }, ptr %1, i32 0, i32 0 store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %2, align 8 %3 = alloca i8, i64 8, align 1 @@ -34,7 +34,7 @@ _llgo_0: %6 = getelementptr inbounds { ptr }, ptr %5, i32 0, i32 0 store ptr %0, ptr %6, align 8 %7 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/goroutine.main$1", ptr undef }, ptr %5, 1 - %8 = call ptr @malloc(i64 32) + %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 32) %9 = getelementptr inbounds { { ptr, ptr }, %"github.com/goplus/llgo/runtime/internal/runtime.String" }, ptr %8, i32 0, i32 0 store { ptr, ptr } %7, ptr %9, align 8 %10 = getelementptr inbounds { { ptr, ptr }, %"github.com/goplus/llgo/runtime/internal/runtime.String" }, ptr %8, i32 0, i32 1 @@ -51,8 +51,10 @@ _llgo_2: ; preds = %_llgo_3 ret void _llgo_3: ; preds = %_llgo_1, %_llgo_0 - %13 = load i1, ptr %0, align 1 - br i1 %13, label %_llgo_2, label %_llgo_1 + %13 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load i1, ptr %0, align 1 + br i1 %14, label %_llgo_2, label %_llgo_1 } define void @"github.com/goplus/llgo/cl/_testgo/goroutine.main$1"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) { @@ -67,7 +69,7 @@ _llgo_0: declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) -declare ptr @malloc(i64) +declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) define ptr @"github.com/goplus/llgo/cl/_testgo/goroutine._llgo_routine$1"(ptr %0) { _llgo_0: @@ -75,7 +77,6 @@ _llgo_0: %2 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String" } %1, 0 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %2) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - call void @free(ptr %0) ret ptr null } @@ -83,12 +84,8 @@ declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"gi declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) -declare void @free(ptr) - declare i32 @"github.com/goplus/llgo/runtime/internal/runtime.CreateThread"(ptr, ptr, ptr, ptr) -declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) - define ptr @"github.com/goplus/llgo/cl/_testgo/goroutine._llgo_routine$2"(ptr %0) { _llgo_0: %1 = load { { ptr, ptr }, %"github.com/goplus/llgo/runtime/internal/runtime.String" }, ptr %0, align 8 @@ -97,6 +94,7 @@ _llgo_0: %4 = extractvalue { ptr, ptr } %2, 1 %5 = extractvalue { ptr, ptr } %2, 0 call void %5(ptr %4, %"github.com/goplus/llgo/runtime/internal/runtime.String" %3) - call void @free(ptr %0) ret ptr null } + +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) diff --git a/cl/_testgo/ifaceconv/out.ll b/cl/_testgo/ifaceconv/out.ll index 4a8243f6e5..2e2532589b 100644 --- a/cl/_testgo/ifaceconv/out.ll +++ b/cl/_testgo/ifaceconv/out.ll @@ -63,6 +63,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/ifaceconv" @23 = private unnamed_addr constant [17 x i8] c"C1 I0(i1) was nil", align 1 @24 = private unnamed_addr constant [17 x i8] c"C1 I1(i1) was nil", align 1 @25 = private unnamed_addr constant [4 x i8] c"pass", align 1 +@llvm.compiler.used = appending global [6 x ptr] [ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.C1.f", ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.(*C1).f", ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2.f", ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2.g", ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.(*C2).f", ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.(*C2).g"], section "llvm.metadata" define void @"github.com/goplus/llgo/cl/_testgo/ifaceconv.C1.f"(%"github.com/goplus/llgo/cl/_testgo/ifaceconv.C1" %0) { _llgo_0: @@ -71,8 +72,10 @@ _llgo_0: define void @"github.com/goplus/llgo/cl/_testgo/ifaceconv.(*C1).f"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testgo/ifaceconv.C1", ptr %0, align 1 - call void @"github.com/goplus/llgo/cl/_testgo/ifaceconv.C1.f"(%"github.com/goplus/llgo/cl/_testgo/ifaceconv.C1" %1) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testgo/ifaceconv.C1", ptr %0, align 1 + call void @"github.com/goplus/llgo/cl/_testgo/ifaceconv.C1.f"(%"github.com/goplus/llgo/cl/_testgo/ifaceconv.C1" %2) ret void } @@ -88,15 +91,19 @@ _llgo_0: define void @"github.com/goplus/llgo/cl/_testgo/ifaceconv.(*C2).f"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2", ptr %0, align 1 - call void @"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2.f"(%"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2" %1) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2", ptr %0, align 1 + call void @"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2.f"(%"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2" %2) ret void } define void @"github.com/goplus/llgo/cl/_testgo/ifaceconv.(*C2).g"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2", ptr %0, align 1 - call void @"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2.g"(%"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2" %1) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2", ptr %0, align 1 + call void @"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2.g"(%"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2" %2) ret void } @@ -126,154 +133,156 @@ _llgo_1: ; preds = %_llgo_25 _llgo_2: ; preds = %_llgo_25 %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) - br i1 false, label %_llgo_26, label %_llgo_27 + %3 = icmp ne ptr %2, null + br i1 %3, label %_llgo_26, label %_llgo_27 _llgo_3: ; preds = %_llgo_28 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 21 }, ptr %3, align 8 - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %4) + %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 21 }, ptr %4, align 8 + %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %5) unreachable _llgo_4: ; preds = %_llgo_28 - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) - br i1 false, label %_llgo_29, label %_llgo_30 + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) + %7 = icmp ne ptr %6, null + br i1 %7, label %_llgo_29, label %_llgo_30 _llgo_5: ; preds = %_llgo_31 - %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 21 }, ptr %6, align 8 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %6, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %7) + %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 21 }, ptr %8, align 8 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %8, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %9) unreachable _llgo_6: ; preds = %_llgo_31 - %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) - %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %8, 0 - %10 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %9, ptr null, 1 - %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) - %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %11, 0 - %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %12, ptr null, 1 - %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) - %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.iface$brpgdLtIeRlPi8QUoTgPCXzlehUkncg7v9aITo-GsF4", ptr %14) - %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %15, 0 - %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %16, ptr null, 1 - %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0) - store %"github.com/goplus/llgo/cl/_testgo/ifaceconv.C1" zeroinitializer, ptr %18, align 1 - %19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.iface$brpgdLtIeRlPi8QUoTgPCXzlehUkncg7v9aITo-GsF4", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceconv.C1") - %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %19, 0 - %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %20, ptr %18, 1 - %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %21) - %23 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceconv.I0", ptr %22) - br i1 %23, label %_llgo_32, label %_llgo_33 + %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) + %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %10, 0 + %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %11, ptr null, 1 + %13 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) + %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %13, 0 + %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %14, ptr null, 1 + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) + %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.iface$brpgdLtIeRlPi8QUoTgPCXzlehUkncg7v9aITo-GsF4", ptr %16) + %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %17, 0 + %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %18, ptr null, 1 + %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0) + store %"github.com/goplus/llgo/cl/_testgo/ifaceconv.C1" zeroinitializer, ptr %20, align 1 + %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.iface$brpgdLtIeRlPi8QUoTgPCXzlehUkncg7v9aITo-GsF4", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceconv.C1") + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %21, 0 + %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %22, ptr %20, 1 + %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %23) + %25 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceconv.I0", ptr %24) + br i1 %25, label %_llgo_32, label %_llgo_33 _llgo_7: ; preds = %_llgo_34 - %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 17 }, ptr %24, align 8 - %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %24, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %25) + %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 17 }, ptr %26, align 8 + %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %26, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %27) unreachable _llgo_8: ; preds = %_llgo_34 - %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %21) - %27 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, 1 - br i1 true, label %_llgo_35, label %_llgo_36 + %28 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %23) + %29 = icmp ne ptr %28, null + br i1 %29, label %_llgo_35, label %_llgo_36 _llgo_9: ; preds = %_llgo_37 - %28 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 17 }, ptr %28, align 8 - %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %28, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %29) + %30 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 17 }, ptr %30, align 8 + %31 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %30, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %31) unreachable _llgo_10: ; preds = %_llgo_37 - %30 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %21) - %31 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceconv.I2", ptr %30) - br i1 %31, label %_llgo_38, label %_llgo_39 + %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %23) + %33 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceconv.I2", ptr %32) + br i1 %33, label %_llgo_38, label %_llgo_39 _llgo_11: ; preds = %_llgo_40 - %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 20 }, ptr %32, align 8 - %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %32, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %33) + %34 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 20 }, ptr %34, align 8 + %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %34, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %35) unreachable _llgo_12: ; preds = %_llgo_40 - %34 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0) - store %"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2" zeroinitializer, ptr %34, align 1 - %35 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.iface$brpgdLtIeRlPi8QUoTgPCXzlehUkncg7v9aITo-GsF4", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceconv.C2") - %36 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %35, 0 - %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %36, ptr %34, 1 - %38 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %37) - %39 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceconv.I0", ptr %38) - br i1 %39, label %_llgo_41, label %_llgo_42 + %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0) + store %"github.com/goplus/llgo/cl/_testgo/ifaceconv.C2" zeroinitializer, ptr %36, align 1 + %37 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.iface$brpgdLtIeRlPi8QUoTgPCXzlehUkncg7v9aITo-GsF4", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceconv.C2") + %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %37, 0 + %39 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %38, ptr %36, 1 + %40 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %39) + %41 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceconv.I0", ptr %40) + br i1 %41, label %_llgo_41, label %_llgo_42 _llgo_13: ; preds = %_llgo_43 - %40 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 17 }, ptr %40, align 8 - %41 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %40, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %41) + %42 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 17 }, ptr %42, align 8 + %43 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %42, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %43) unreachable _llgo_14: ; preds = %_llgo_43 - %42 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %37) - %43 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %37, 1 - br i1 true, label %_llgo_44, label %_llgo_45 + %44 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %39) + %45 = icmp ne ptr %44, null + br i1 %45, label %_llgo_44, label %_llgo_45 _llgo_15: ; preds = %_llgo_46 - %44 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @21, i64 17 }, ptr %44, align 8 - %45 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %44, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %45) + %46 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @21, i64 17 }, ptr %46, align 8 + %47 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %46, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %47) unreachable _llgo_16: ; preds = %_llgo_46 - %46 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %37) - %47 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceconv.I2", ptr %46) - br i1 %47, label %_llgo_47, label %_llgo_48 + %48 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %39) + %49 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceconv.I2", ptr %48) + br i1 %49, label %_llgo_47, label %_llgo_48 _llgo_17: ; preds = %_llgo_49 - %48 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @22, i64 17 }, ptr %48, align 8 - %49 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %48, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %49) + %50 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @22, i64 17 }, ptr %50, align 8 + %51 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %50, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %51) unreachable _llgo_18: ; preds = %_llgo_49 - %50 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0) - store %"github.com/goplus/llgo/cl/_testgo/ifaceconv.C1" zeroinitializer, ptr %50, align 1 - %51 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.iface$brpgdLtIeRlPi8QUoTgPCXzlehUkncg7v9aITo-GsF4", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceconv.C1") - %52 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %51, 0 - %53 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %52, ptr %50, 1 - %54 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %53) - %55 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %53, 1 - %56 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %54, 0 - %57 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %56, ptr %55, 1 - %58 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %57, %"github.com/goplus/llgo/runtime/internal/runtime.eface" zeroinitializer) - br i1 %58, label %_llgo_19, label %_llgo_20 + %52 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0) + store %"github.com/goplus/llgo/cl/_testgo/ifaceconv.C1" zeroinitializer, ptr %52, align 1 + %53 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.iface$brpgdLtIeRlPi8QUoTgPCXzlehUkncg7v9aITo-GsF4", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceconv.C1") + %54 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %53, 0 + %55 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %54, ptr %52, 1 + %56 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %55) + %57 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %55, 1 + %58 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %56, 0 + %59 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %58, ptr %57, 1 + %60 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %59, %"github.com/goplus/llgo/runtime/internal/runtime.eface" zeroinitializer) + br i1 %60, label %_llgo_19, label %_llgo_20 _llgo_19: ; preds = %_llgo_18 - %59 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @23, i64 17 }, ptr %59, align 8 - %60 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %59, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %60) + %61 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @23, i64 17 }, ptr %61, align 8 + %62 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %61, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %62) unreachable _llgo_20: ; preds = %_llgo_18 - %61 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %53) - %62 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %53, 1 - %63 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %61, 0 - %64 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %63, ptr %62, 1 - %65 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) - %66 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %65, 0 - %67 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %66, ptr null, 1 - %68 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %64, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %67) - br i1 %68, label %_llgo_21, label %_llgo_22 + %63 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %55) + %64 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %55, 1 + %65 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %63, 0 + %66 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %65, ptr %64, 1 + %67 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) + %68 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %67, 0 + %69 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %68, ptr null, 1 + %70 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %66, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %69) + br i1 %70, label %_llgo_21, label %_llgo_22 _llgo_21: ; preds = %_llgo_20 - %69 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @24, i64 17 }, ptr %69, align 8 - %70 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %69, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %70) + %71 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @24, i64 17 }, ptr %71, align 8 + %72 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %71, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %72) unreachable _llgo_22: ; preds = %_llgo_20 @@ -288,10 +297,10 @@ _llgo_24: ; preds = %_llgo_0 br label %_llgo_25 _llgo_25: ; preds = %_llgo_24, %_llgo_23 - %71 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } [ { %"github.com/goplus/llgo/runtime/internal/runtime.eface" zeroinitializer, i1 true }, %_llgo_23 ], [ zeroinitializer, %_llgo_24 ] - %72 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %71, 0 - %73 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %71, 1 - br i1 %73, label %_llgo_1, label %_llgo_2 + %73 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } [ { %"github.com/goplus/llgo/runtime/internal/runtime.eface" zeroinitializer, i1 true }, %_llgo_23 ], [ zeroinitializer, %_llgo_24 ] + %74 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %73, 0 + %75 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %73, 1 + br i1 %75, label %_llgo_1, label %_llgo_2 _llgo_26: ; preds = %_llgo_2 br label %_llgo_28 @@ -300,10 +309,10 @@ _llgo_27: ; preds = %_llgo_2 br label %_llgo_28 _llgo_28: ; preds = %_llgo_27, %_llgo_26 - %74 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ { %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, i1 true }, %_llgo_26 ], [ zeroinitializer, %_llgo_27 ] - %75 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %74, 0 - %76 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %74, 1 - br i1 %76, label %_llgo_3, label %_llgo_4 + %76 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ { %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, i1 true }, %_llgo_26 ], [ zeroinitializer, %_llgo_27 ] + %77 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %76, 0 + %78 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %76, 1 + br i1 %78, label %_llgo_3, label %_llgo_4 _llgo_29: ; preds = %_llgo_4 br label %_llgo_31 @@ -312,110 +321,112 @@ _llgo_30: ; preds = %_llgo_4 br label %_llgo_31 _llgo_31: ; preds = %_llgo_30, %_llgo_29 - %77 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ { %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, i1 true }, %_llgo_29 ], [ zeroinitializer, %_llgo_30 ] - %78 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %77, 0 - %79 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %77, 1 - br i1 %79, label %_llgo_5, label %_llgo_6 + %79 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ { %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, i1 true }, %_llgo_29 ], [ zeroinitializer, %_llgo_30 ] + %80 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %79, 0 + %81 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %79, 1 + br i1 %81, label %_llgo_5, label %_llgo_6 _llgo_32: ; preds = %_llgo_6 - %80 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, 1 - %81 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %22, 0 - %82 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %81, ptr %80, 1 - %83 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %82, 0 - %84 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %83, i1 true, 1 + %82 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %23, 1 + %83 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %24, 0 + %84 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %83, ptr %82, 1 + %85 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %84, 0 + %86 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %85, i1 true, 1 br label %_llgo_34 _llgo_33: ; preds = %_llgo_6 br label %_llgo_34 _llgo_34: ; preds = %_llgo_33, %_llgo_32 - %85 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } [ %84, %_llgo_32 ], [ zeroinitializer, %_llgo_33 ] - %86 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %85, 0 - %87 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %85, 1 - br i1 %87, label %_llgo_8, label %_llgo_7 + %87 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } [ %86, %_llgo_32 ], [ zeroinitializer, %_llgo_33 ] + %88 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %87, 0 + %89 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %87, 1 + br i1 %89, label %_llgo_8, label %_llgo_7 _llgo_35: ; preds = %_llgo_8 - %88 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, 0 - %89 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %88, i1 true, 1 + %90 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %23, 0 + %91 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %90, i1 true, 1 br label %_llgo_37 _llgo_36: ; preds = %_llgo_8 br label %_llgo_37 _llgo_37: ; preds = %_llgo_36, %_llgo_35 - %90 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %89, %_llgo_35 ], [ zeroinitializer, %_llgo_36 ] - %91 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %90, 0 - %92 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %90, 1 - br i1 %92, label %_llgo_10, label %_llgo_9 + %92 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %91, %_llgo_35 ], [ zeroinitializer, %_llgo_36 ] + %93 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %92, 0 + %94 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %92, 1 + br i1 %94, label %_llgo_10, label %_llgo_9 _llgo_38: ; preds = %_llgo_10 - %93 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, 1 - %94 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.iface$gZBF8fFlqIMZ9M6lT2VWPyc3eu5Co6j0WoKGIEgDPAw", ptr %30) - %95 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %94, 0 - %96 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %95, ptr %93, 1 - %97 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %96, 0 - %98 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %97, i1 true, 1 + %95 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %23, 1 + %96 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.iface$gZBF8fFlqIMZ9M6lT2VWPyc3eu5Co6j0WoKGIEgDPAw", ptr %32) + %97 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %96, 0 + %98 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %97, ptr %95, 1 + %99 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %98, 0 + %100 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %99, i1 true, 1 br label %_llgo_40 _llgo_39: ; preds = %_llgo_10 br label %_llgo_40 _llgo_40: ; preds = %_llgo_39, %_llgo_38 - %99 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %98, %_llgo_38 ], [ zeroinitializer, %_llgo_39 ] - %100 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %99, 0 - %101 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %99, 1 - br i1 %101, label %_llgo_11, label %_llgo_12 + %101 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %100, %_llgo_38 ], [ zeroinitializer, %_llgo_39 ] + %102 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %101, 0 + %103 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %101, 1 + br i1 %103, label %_llgo_11, label %_llgo_12 _llgo_41: ; preds = %_llgo_12 - %102 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %37, 1 - %103 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %38, 0 - %104 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %103, ptr %102, 1 - %105 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %104, 0 - %106 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %105, i1 true, 1 + %104 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %39, 1 + %105 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %40, 0 + %106 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %105, ptr %104, 1 + %107 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %106, 0 + %108 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %107, i1 true, 1 br label %_llgo_43 _llgo_42: ; preds = %_llgo_12 br label %_llgo_43 _llgo_43: ; preds = %_llgo_42, %_llgo_41 - %107 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } [ %106, %_llgo_41 ], [ zeroinitializer, %_llgo_42 ] - %108 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %107, 0 - %109 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %107, 1 - br i1 %109, label %_llgo_14, label %_llgo_13 + %109 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } [ %108, %_llgo_41 ], [ zeroinitializer, %_llgo_42 ] + %110 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %109, 0 + %111 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.eface", i1 } %109, 1 + br i1 %111, label %_llgo_14, label %_llgo_13 _llgo_44: ; preds = %_llgo_14 - %110 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %37, 0 - %111 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %110, i1 true, 1 + %112 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %39, 0 + %113 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %112, i1 true, 1 br label %_llgo_46 _llgo_45: ; preds = %_llgo_14 br label %_llgo_46 _llgo_46: ; preds = %_llgo_45, %_llgo_44 - %112 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %111, %_llgo_44 ], [ zeroinitializer, %_llgo_45 ] - %113 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %112, 0 - %114 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %112, 1 - br i1 %114, label %_llgo_16, label %_llgo_15 + %114 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %113, %_llgo_44 ], [ zeroinitializer, %_llgo_45 ] + %115 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %114, 0 + %116 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %114, 1 + br i1 %116, label %_llgo_16, label %_llgo_15 _llgo_47: ; preds = %_llgo_16 - %115 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %37, 1 - %116 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.iface$gZBF8fFlqIMZ9M6lT2VWPyc3eu5Co6j0WoKGIEgDPAw", ptr %46) - %117 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %116, 0 - %118 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %117, ptr %115, 1 - %119 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %118, 0 - %120 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %119, i1 true, 1 + %117 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %39, 1 + %118 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/ifaceconv.iface$gZBF8fFlqIMZ9M6lT2VWPyc3eu5Co6j0WoKGIEgDPAw", ptr %48) + %119 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %118, 0 + %120 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %119, ptr %117, 1 + %121 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %120, 0 + %122 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %121, i1 true, 1 br label %_llgo_49 _llgo_48: ; preds = %_llgo_16 br label %_llgo_49 _llgo_49: ; preds = %_llgo_48, %_llgo_47 - %121 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %120, %_llgo_47 ], [ zeroinitializer, %_llgo_48 ] - %122 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %121, 0 - %123 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %121, 1 - br i1 %123, label %_llgo_18, label %_llgo_17 + %123 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %122, %_llgo_47 ], [ zeroinitializer, %_llgo_48 ] + %124 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %123, 0 + %125 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %123, 1 + br i1 %125, label %_llgo_18, label %_llgo_17 } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.nilinterequal"(ptr, ptr) define linkonce i1 @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.nilinterequal"(ptr %0, ptr %1, ptr %2) { diff --git a/cl/_testgo/ifaceprom/out.ll b/cl/_testgo/ifaceprom/out.ll index a001d6e3a3..ac78d217f7 100644 --- a/cl/_testgo/ifaceprom/out.ll +++ b/cl/_testgo/ifaceprom/out.ll @@ -27,7 +27,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/ifaceprom" @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 2131144854, i8 0, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 10 }, ptr @"*_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA$out", i64 1, i64 1 } }, align 8 @5 = private unnamed_addr constant [10 x i8] c"func() int", align 1 @"*_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1805835775, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 10 }, ptr null }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, ptr @"*_llgo_int" }, align 8 @6 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA$out" = weak_odr constant [1 x ptr] [ptr @_llgo_int], align 8 @@ -48,24 +48,29 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/ifaceprom" @"*_llgo_github.com/goplus/llgo/cl/_testgo/ifaceprom.I" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 486411694, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 6 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceprom.I" }, align 8 @12 = private unnamed_addr constant [116 x i8] c"type assertion github.com/goplus/llgo/cl/_testgo/ifaceprom.I -> github.com/goplus/llgo/cl/_testgo/ifaceprom.I failed", align 1 @13 = private unnamed_addr constant [4 x i8] c"pass", align 1 +@llvm.compiler.used = appending global [8 x ptr] [ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.S.one", ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.S.two", ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.(*S).one", ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.(*S).two", ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl.one", ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl.two", ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.(*impl).one", ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.(*impl).two"], section "llvm.metadata" define i64 @"github.com/goplus/llgo/cl/_testgo/ifaceprom.S.one"(%"github.com/goplus/llgo/cl/_testgo/ifaceprom.S" %0) { _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S" %0, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %1, i32 0, i32 0 - %3 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %2, align 8 - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %3) - %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3, 0 - %6 = getelementptr ptr, ptr %5, i64 3 - %7 = load ptr, ptr %6, align 8 - %8 = insertvalue { ptr, ptr } undef, ptr %7, 0 - %9 = insertvalue { ptr, ptr } %8, ptr %4, 1 - %10 = extractvalue { ptr, ptr } %9, 1 - %11 = extractvalue { ptr, ptr } %9, 0 - %12 = call i64 %11(ptr %10) - ret i64 %12 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %1, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %3, align 8 + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %5) + %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, 0 + %8 = getelementptr ptr, ptr %7, i64 3 + %9 = load ptr, ptr %8, align 8 + %10 = insertvalue { ptr, ptr } undef, ptr %9, 0 + %11 = insertvalue { ptr, ptr } %10, ptr %6, 1 + %12 = extractvalue { ptr, ptr } %11, 1 + %13 = extractvalue { ptr, ptr } %11, 0 + %14 = call i64 %13(ptr %12) + ret i64 %14 } define %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testgo/ifaceprom.S.two"(%"github.com/goplus/llgo/cl/_testgo/ifaceprom.S" %0) { @@ -73,50 +78,62 @@ _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S" %0, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %1, i32 0, i32 0 - %3 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %2, align 8 - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %3) - %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3, 0 - %6 = getelementptr ptr, ptr %5, i64 4 - %7 = load ptr, ptr %6, align 8 - %8 = insertvalue { ptr, ptr } undef, ptr %7, 0 - %9 = insertvalue { ptr, ptr } %8, ptr %4, 1 - %10 = extractvalue { ptr, ptr } %9, 1 - %11 = extractvalue { ptr, ptr } %9, 0 - %12 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %11(ptr %10) - ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %12 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %1, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %3, align 8 + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %5) + %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, 0 + %8 = getelementptr ptr, ptr %7, i64 4 + %9 = load ptr, ptr %8, align 8 + %10 = insertvalue { ptr, ptr } undef, ptr %9, 0 + %11 = insertvalue { ptr, ptr } %10, ptr %6, 1 + %12 = extractvalue { ptr, ptr } %11, 1 + %13 = extractvalue { ptr, ptr } %11, 0 + %14 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %13(ptr %12) + ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %14 } define i64 @"github.com/goplus/llgo/cl/_testgo/ifaceprom.(*S).one"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, i32 0, i32 0 - %2 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %1, align 8 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %2) - %4 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %2, 0 - %5 = getelementptr ptr, ptr %4, i64 3 - %6 = load ptr, ptr %5, align 8 - %7 = insertvalue { ptr, ptr } undef, ptr %6, 0 - %8 = insertvalue { ptr, ptr } %7, ptr %3, 1 - %9 = extractvalue { ptr, ptr } %8, 1 - %10 = extractvalue { ptr, ptr } %8, 0 - %11 = call i64 %10(ptr %9) - ret i64 %11 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %2, align 8 + %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %4) + %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, 0 + %7 = getelementptr ptr, ptr %6, i64 3 + %8 = load ptr, ptr %7, align 8 + %9 = insertvalue { ptr, ptr } undef, ptr %8, 0 + %10 = insertvalue { ptr, ptr } %9, ptr %5, 1 + %11 = extractvalue { ptr, ptr } %10, 1 + %12 = extractvalue { ptr, ptr } %10, 0 + %13 = call i64 %12(ptr %11) + ret i64 %13 } define %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testgo/ifaceprom.(*S).two"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, i32 0, i32 0 - %2 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %1, align 8 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %2) - %4 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %2, 0 - %5 = getelementptr ptr, ptr %4, i64 4 - %6 = load ptr, ptr %5, align 8 - %7 = insertvalue { ptr, ptr } undef, ptr %6, 0 - %8 = insertvalue { ptr, ptr } %7, ptr %3, 1 - %9 = extractvalue { ptr, ptr } %8, 1 - %10 = extractvalue { ptr, ptr } %8, 0 - %11 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %10(ptr %9) - ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %11 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %2, align 8 + %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %4) + %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, 0 + %7 = getelementptr ptr, ptr %6, i64 4 + %8 = load ptr, ptr %7, align 8 + %9 = insertvalue { ptr, ptr } undef, ptr %8, 0 + %10 = insertvalue { ptr, ptr } %9, ptr %5, 1 + %11 = extractvalue { ptr, ptr } %10, 1 + %12 = extractvalue { ptr, ptr } %10, 0 + %13 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %12(ptr %11) + ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %13 } define i64 @"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl.one"(%"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl" %0) { @@ -131,16 +148,20 @@ _llgo_0: define i64 @"github.com/goplus/llgo/cl/_testgo/ifaceprom.(*impl).one"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl", ptr %0, align 1 - %2 = call i64 @"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl.one"(%"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl" %1) - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl", ptr %0, align 1 + %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl.one"(%"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl" %2) + ret i64 %3 } define %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testgo/ifaceprom.(*impl).two"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl", ptr %0, align 1 - %2 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl.two"(%"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl" %1) - ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl", ptr %0, align 1 + %3 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl.two"(%"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl" %2) + ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %3 } define void @"github.com/goplus/llgo/cl/_testgo/ifaceprom.init"() { @@ -160,152 +181,182 @@ define void @"github.com/goplus/llgo/cl/_testgo/ifaceprom.main"() { _llgo_0: %0 = alloca %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", align 8 call void @llvm.memset(ptr %0, i8 0, i64 16, i1 false) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, i32 0, i32 0 - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0) - store %"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl" zeroinitializer, ptr %2, align 1 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.iface$zZ89tENb5h_KNjvpxf1TXPfaWFYn0IZrZwyVf42lRtA", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceprom.impl") - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %3, 0 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %2, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, ptr %1, align 8 - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, i32 0, i32 0 - %7 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %6, align 8 - %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %7) - %9 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 0 - %10 = getelementptr ptr, ptr %9, i64 3 - %11 = load ptr, ptr %10, align 8 - %12 = insertvalue { ptr, ptr } undef, ptr %11, 0 - %13 = insertvalue { ptr, ptr } %12, ptr %8, 1 - %14 = extractvalue { ptr, ptr } %13, 1 - %15 = extractvalue { ptr, ptr } %13, 0 - %16 = call i64 %15(ptr %14) - %17 = icmp ne i64 %16, 1 - br i1 %17, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, i32 0, i32 0 + %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 0) + store %"github.com/goplus/llgo/cl/_testgo/ifaceprom.impl" zeroinitializer, ptr %3, align 1 + %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.iface$zZ89tENb5h_KNjvpxf1TXPfaWFYn0IZrZwyVf42lRtA", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/ifaceprom.impl") + %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %4, 0 + %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, ptr %3, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, ptr %2, align 8 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, i32 0, i32 0 + %9 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %8, align 8 + %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %10) + %12 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %10, 0 + %13 = getelementptr ptr, ptr %12, i64 3 + %14 = load ptr, ptr %13, align 8 + %15 = insertvalue { ptr, ptr } undef, ptr %14, 0 + %16 = insertvalue { ptr, ptr } %15, ptr %11, 1 + %17 = extractvalue { ptr, ptr } %16, 1 + %18 = extractvalue { ptr, ptr } %16, 0 + %19 = call i64 %18(ptr %17) + %20 = icmp ne i64 %19, 1 + br i1 %20, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %18 = inttoptr i64 %16 to ptr - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %18, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %19) + %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 %19, ptr %21, align 4 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %21, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %22) unreachable _llgo_2: ; preds = %_llgo_0 - %20 = load %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, align 8 - %21 = extractvalue %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S" %20, 0 - %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %21) - %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, 0 - %24 = getelementptr ptr, ptr %23, i64 3 - %25 = load ptr, ptr %24, align 8 - %26 = insertvalue { ptr, ptr } undef, ptr %25, 0 - %27 = insertvalue { ptr, ptr } %26, ptr %22, 1 - %28 = extractvalue { ptr, ptr } %27, 1 - %29 = extractvalue { ptr, ptr } %27, 0 - %30 = call i64 %29(ptr %28) - %31 = icmp ne i64 %30, 1 - br i1 %31, label %_llgo_3, label %_llgo_4 + %23 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %23) + %24 = load %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, align 8 + %25 = extractvalue %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S" %24, 0 + %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %25) + %27 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %25, 0 + %28 = getelementptr ptr, ptr %27, i64 3 + %29 = load ptr, ptr %28, align 8 + %30 = insertvalue { ptr, ptr } undef, ptr %29, 0 + %31 = insertvalue { ptr, ptr } %30, ptr %26, 1 + %32 = extractvalue { ptr, ptr } %31, 1 + %33 = extractvalue { ptr, ptr } %31, 0 + %34 = call i64 %33(ptr %32) + %35 = icmp ne i64 %34, 1 + br i1 %35, label %_llgo_3, label %_llgo_4 _llgo_3: ; preds = %_llgo_2 - %32 = inttoptr i64 %30 to ptr - %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %32, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %33) + %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 %34, ptr %36, align 4 + %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %36, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %37) unreachable _llgo_4: ; preds = %_llgo_2 - %34 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, i32 0, i32 0 - %35 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %34, align 8 - %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %35) - %37 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %35, 1 - br i1 true, label %_llgo_17, label %_llgo_18 + %38 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %38) + %39 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, i32 0, i32 0 + %40 = icmp eq ptr %39, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %40) + %41 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %39, align 8 + %42 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %41) + %43 = icmp ne ptr %42, null + br i1 %43, label %_llgo_17, label %_llgo_18 _llgo_5: ; preds = %_llgo_17 - %38 = inttoptr i64 %93 to ptr - %39 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %38, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %39) + %44 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 %106, ptr %44, align 4 + %45 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %44, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %45) unreachable _llgo_6: ; preds = %_llgo_17 - %40 = load %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, align 8 - %41 = extractvalue %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S" %40, 0 - %42 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %41) - %43 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %41, 1 - br i1 true, label %_llgo_19, label %_llgo_20 + %46 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %46) + %47 = load %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, align 8 + %48 = extractvalue %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S" %47, 0 + %49 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %48) + %50 = icmp ne ptr %49, null + br i1 %50, label %_llgo_19, label %_llgo_20 _llgo_7: ; preds = %_llgo_19 - %44 = inttoptr i64 %102 to ptr - %45 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %44, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %45) + %51 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 %115, ptr %51, align 4 + %52 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %51, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %52) unreachable _llgo_8: ; preds = %_llgo_19 - %46 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, i32 0, i32 0 - %47 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %46, align 8 - %48 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %47) - %49 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %47, 0 - %50 = getelementptr ptr, ptr %49, i64 4 - %51 = load ptr, ptr %50, align 8 - %52 = insertvalue { ptr, ptr } undef, ptr %51, 0 - %53 = insertvalue { ptr, ptr } %52, ptr %48, 1 - %54 = extractvalue { ptr, ptr } %53, 1 - %55 = extractvalue { ptr, ptr } %53, 0 - %56 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %55(ptr %54) - %57 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %56, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 3 }) - %58 = xor i1 %57, true - br i1 %58, label %_llgo_9, label %_llgo_10 + %53 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %53) + %54 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, i32 0, i32 0 + %55 = icmp eq ptr %54, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %55) + %56 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %54, align 8 + %57 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %56) + %58 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %56, 0 + %59 = getelementptr ptr, ptr %58, i64 4 + %60 = load ptr, ptr %59, align 8 + %61 = insertvalue { ptr, ptr } undef, ptr %60, 0 + %62 = insertvalue { ptr, ptr } %61, ptr %57, 1 + %63 = extractvalue { ptr, ptr } %62, 1 + %64 = extractvalue { ptr, ptr } %62, 0 + %65 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %64(ptr %63) + %66 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %65, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 3 }) + %67 = xor i1 %66, true + br i1 %67, label %_llgo_9, label %_llgo_10 _llgo_9: ; preds = %_llgo_8 - %59 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" %56, ptr %59, align 8 - %60 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %59, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %60) + %68 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" %65, ptr %68, align 8 + %69 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %68, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %69) unreachable _llgo_10: ; preds = %_llgo_8 - %61 = load %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, align 8 - %62 = extractvalue %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S" %61, 0 - %63 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %62) - %64 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %62, 0 - %65 = getelementptr ptr, ptr %64, i64 4 - %66 = load ptr, ptr %65, align 8 - %67 = insertvalue { ptr, ptr } undef, ptr %66, 0 - %68 = insertvalue { ptr, ptr } %67, ptr %63, 1 - %69 = extractvalue { ptr, ptr } %68, 1 - %70 = extractvalue { ptr, ptr } %68, 0 - %71 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %70(ptr %69) - %72 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %71, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 3 }) - %73 = xor i1 %72, true - br i1 %73, label %_llgo_11, label %_llgo_12 + %70 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %70) + %71 = load %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, align 8 + %72 = extractvalue %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S" %71, 0 + %73 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %72) + %74 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %72, 0 + %75 = getelementptr ptr, ptr %74, i64 4 + %76 = load ptr, ptr %75, align 8 + %77 = insertvalue { ptr, ptr } undef, ptr %76, 0 + %78 = insertvalue { ptr, ptr } %77, ptr %73, 1 + %79 = extractvalue { ptr, ptr } %78, 1 + %80 = extractvalue { ptr, ptr } %78, 0 + %81 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %80(ptr %79) + %82 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %81, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 3 }) + %83 = xor i1 %82, true + br i1 %83, label %_llgo_11, label %_llgo_12 _llgo_11: ; preds = %_llgo_10 - %74 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" %71, ptr %74, align 8 - %75 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %74, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %75) + %84 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" %81, ptr %84, align 8 + %85 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %84, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %85) unreachable _llgo_12: ; preds = %_llgo_10 - %76 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, i32 0, i32 0 - %77 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %76, align 8 - %78 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %77) - %79 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %77, 1 - br i1 true, label %_llgo_21, label %_llgo_22 + %86 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %86) + %87 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, i32 0, i32 0 + %88 = icmp eq ptr %87, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %88) + %89 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %87, align 8 + %90 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %89) + %91 = icmp ne ptr %90, null + br i1 %91, label %_llgo_21, label %_llgo_22 _llgo_13: ; preds = %_llgo_21 - %80 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" %111, ptr %80, align 8 - %81 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %80, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %81) + %92 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" %124, ptr %92, align 8 + %93 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %92, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %93) unreachable _llgo_14: ; preds = %_llgo_21 - %82 = load %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, align 8 - %83 = extractvalue %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S" %82, 0 - %84 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %83) - %85 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %83, 1 - br i1 true, label %_llgo_23, label %_llgo_24 + %94 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %94) + %95 = load %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S", ptr %0, align 8 + %96 = extractvalue %"github.com/goplus/llgo/cl/_testgo/ifaceprom.S" %95, 0 + %97 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %96) + %98 = icmp ne ptr %97, null + br i1 %98, label %_llgo_23, label %_llgo_24 _llgo_15: ; preds = %_llgo_23 - %86 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" %121, ptr %86, align 8 - %87 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %86, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %87) + %99 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" %134, ptr %99, align 8 + %100 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %99, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %100) unreachable _llgo_16: ; preds = %_llgo_23 @@ -314,83 +365,85 @@ _llgo_16: ; preds = %_llgo_23 ret void _llgo_17: ; preds = %_llgo_4 - %88 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - %89 = getelementptr inbounds { %"github.com/goplus/llgo/runtime/internal/runtime.iface" }, ptr %88, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %35, ptr %89, align 8 - %90 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.I.one$bound", ptr undef }, ptr %88, 1 - %91 = extractvalue { ptr, ptr } %90, 1 - %92 = extractvalue { ptr, ptr } %90, 0 - %93 = call i64 %92(ptr %91) - %94 = icmp ne i64 %93, 1 - br i1 %94, label %_llgo_5, label %_llgo_6 + %101 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + %102 = getelementptr inbounds { %"github.com/goplus/llgo/runtime/internal/runtime.iface" }, ptr %101, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %41, ptr %102, align 8 + %103 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.I.one$bound", ptr undef }, ptr %101, 1 + %104 = extractvalue { ptr, ptr } %103, 1 + %105 = extractvalue { ptr, ptr } %103, 0 + %106 = call i64 %105(ptr %104) + %107 = icmp ne i64 %106, 1 + br i1 %107, label %_llgo_5, label %_llgo_6 _llgo_18: ; preds = %_llgo_4 - %95 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 116 }, ptr %95, align 8 - %96 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %95, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %96) + %108 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 116 }, ptr %108, align 8 + %109 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %108, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %109) unreachable _llgo_19: ; preds = %_llgo_6 - %97 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - %98 = getelementptr inbounds { %"github.com/goplus/llgo/runtime/internal/runtime.iface" }, ptr %97, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %41, ptr %98, align 8 - %99 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.I.one$bound", ptr undef }, ptr %97, 1 - %100 = extractvalue { ptr, ptr } %99, 1 - %101 = extractvalue { ptr, ptr } %99, 0 - %102 = call i64 %101(ptr %100) - %103 = icmp ne i64 %102, 1 - br i1 %103, label %_llgo_7, label %_llgo_8 + %110 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + %111 = getelementptr inbounds { %"github.com/goplus/llgo/runtime/internal/runtime.iface" }, ptr %110, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %48, ptr %111, align 8 + %112 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.I.one$bound", ptr undef }, ptr %110, 1 + %113 = extractvalue { ptr, ptr } %112, 1 + %114 = extractvalue { ptr, ptr } %112, 0 + %115 = call i64 %114(ptr %113) + %116 = icmp ne i64 %115, 1 + br i1 %116, label %_llgo_7, label %_llgo_8 _llgo_20: ; preds = %_llgo_6 - %104 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 116 }, ptr %104, align 8 - %105 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %104, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %105) + %117 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 116 }, ptr %117, align 8 + %118 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %117, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %118) unreachable _llgo_21: ; preds = %_llgo_12 - %106 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - %107 = getelementptr inbounds { %"github.com/goplus/llgo/runtime/internal/runtime.iface" }, ptr %106, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %77, ptr %107, align 8 - %108 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.I.two$bound", ptr undef }, ptr %106, 1 - %109 = extractvalue { ptr, ptr } %108, 1 - %110 = extractvalue { ptr, ptr } %108, 0 - %111 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %110(ptr %109) - %112 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %111, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 3 }) - %113 = xor i1 %112, true - br i1 %113, label %_llgo_13, label %_llgo_14 + %119 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + %120 = getelementptr inbounds { %"github.com/goplus/llgo/runtime/internal/runtime.iface" }, ptr %119, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %89, ptr %120, align 8 + %121 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.I.two$bound", ptr undef }, ptr %119, 1 + %122 = extractvalue { ptr, ptr } %121, 1 + %123 = extractvalue { ptr, ptr } %121, 0 + %124 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %123(ptr %122) + %125 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %124, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 3 }) + %126 = xor i1 %125, true + br i1 %126, label %_llgo_13, label %_llgo_14 _llgo_22: ; preds = %_llgo_12 - %114 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 116 }, ptr %114, align 8 - %115 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %114, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %115) + %127 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 116 }, ptr %127, align 8 + %128 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %127, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %128) unreachable _llgo_23: ; preds = %_llgo_14 - %116 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - %117 = getelementptr inbounds { %"github.com/goplus/llgo/runtime/internal/runtime.iface" }, ptr %116, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %83, ptr %117, align 8 - %118 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.I.two$bound", ptr undef }, ptr %116, 1 - %119 = extractvalue { ptr, ptr } %118, 1 - %120 = extractvalue { ptr, ptr } %118, 0 - %121 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %120(ptr %119) - %122 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %121, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 3 }) - %123 = xor i1 %122, true - br i1 %123, label %_llgo_15, label %_llgo_16 + %129 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + %130 = getelementptr inbounds { %"github.com/goplus/llgo/runtime/internal/runtime.iface" }, ptr %129, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %96, ptr %130, align 8 + %131 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/ifaceprom.I.two$bound", ptr undef }, ptr %129, 1 + %132 = extractvalue { ptr, ptr } %131, 1 + %133 = extractvalue { ptr, ptr } %131, 0 + %134 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %133(ptr %132) + %135 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %134, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 3 }) + %136 = xor i1 %135, true + br i1 %136, label %_llgo_15, label %_llgo_16 _llgo_24: ; preds = %_llgo_14 - %124 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 116 }, ptr %124, align 8 - %125 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %124, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %125) + %137 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 116 }, ptr %137, align 8 + %138 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %137, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %138) unreachable } ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface") declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequal0"(ptr, ptr) diff --git a/cl/_testgo/interface/out.ll b/cl/_testgo/interface/out.ll index 9a6ac02890..b09b680f15 100644 --- a/cl/_testgo/interface/out.ll +++ b/cl/_testgo/interface/out.ll @@ -1,6 +1,7 @@ ; ModuleID = 'github.com/goplus/llgo/cl/_testgo/interface' source_filename = "github.com/goplus/llgo/cl/_testgo/interface" +%"github.com/goplus/llgo/cl/_testdata/foo.Game" = type {} %"github.com/goplus/llgo/runtime/abi.PtrType" = type { %"github.com/goplus/llgo/runtime/abi.Type", ptr } %"github.com/goplus/llgo/runtime/abi.Type" = type { i64, i64, i32, i8, i8, i8, i8, { ptr, ptr }, ptr, %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr } %"github.com/goplus/llgo/runtime/internal/runtime.String" = type { ptr, i64 } @@ -10,6 +11,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/interface" %"github.com/goplus/llgo/runtime/internal/runtime.Slice" = type { ptr, i64, i64 } %"github.com/goplus/llgo/runtime/abi.FuncType" = type { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.Slice" } %"github.com/goplus/llgo/runtime/abi.StructField" = type { %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } +%"github.com/goplus/llgo/cl/_testgo/interface.Game2" = type {} %"github.com/goplus/llgo/runtime/abi.InterfaceType" = type { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.Slice" } %"github.com/goplus/llgo/runtime/abi.Imethod" = type { %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr } %"github.com/goplus/llgo/cl/_testgo/interface.Game1" = type { ptr } @@ -17,6 +19,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/interface" %"github.com/goplus/llgo/runtime/internal/runtime.iface" = type { ptr, ptr } @"github.com/goplus/llgo/cl/_testgo/interface.init$guard" = global i1 false, align 1 +@"__llgo.moduleZeroSizedAlloc$3f8a2b30c61b8a66" = private unnamed_addr global %"github.com/goplus/llgo/cl/_testdata/foo.Game" zeroinitializer @"*_llgo_github.com/goplus/llgo/cl/_testgo/interface.Game1" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [2 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 577263123, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 10 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/interface.Game1" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 43 }, i16 2, i16 1, i32 24 }, [2 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 4 }, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", ptr @"github.com/goplus/llgo/cl/_testgo/interface.(*Game1).Load", ptr @"github.com/goplus/llgo/cl/_testgo/interface.(*Game1).Load" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 48 }, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", ptr @"github.com/goplus/llgo/cl/_testgo/interface.(*Game1).initGame", ptr @"github.com/goplus/llgo/cl/_testgo/interface.(*Game1).initGame" }] }, align 8 @0 = private unnamed_addr constant [10 x i8] c"main.Game1", align 1 @"_llgo_github.com/goplus/llgo/cl/_testgo/interface.Game1" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [2 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1109946175, i8 13, i8 8, i8 8, i8 57, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/interface.Game1" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 10 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/interface.Game1" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_struct$4-TjwxozfgwR2wiuWBRPbxjG2hQENVAzi2bsR9iH62Q$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 43 }, i16 2, i16 1, i32 24 }, [2 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 4 }, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", ptr @"github.com/goplus/llgo/cl/_testgo/interface.(*Game1).Load", ptr @"github.com/goplus/llgo/cl/_testgo/interface.Game1.Load" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 48 }, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", ptr @"github.com/goplus/llgo/cl/_testgo/interface.(*Game1).initGame", ptr @"github.com/goplus/llgo/cl/_testgo/interface.Game1.initGame" }] }, align 8 @@ -33,6 +36,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/interface" @7 = private unnamed_addr constant [48 x i8] c"github.com/goplus/llgo/cl/_testdata/foo.initGame", align 1 @"_llgo_struct$4-TjwxozfgwR2wiuWBRPbxjG2hQENVAzi2bsR9iH62Q$fields" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 4 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testdata/foo.Game", i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 true }], align 8 @8 = private unnamed_addr constant [43 x i8] c"github.com/goplus/llgo/cl/_testgo/interface", align 1 +@"__llgo.moduleZeroSizedAlloc$7f47daf0279219a8" = private unnamed_addr global %"github.com/goplus/llgo/cl/_testgo/interface.Game2" zeroinitializer @"*_llgo_github.com/goplus/llgo/cl/_testgo/interface.Game2" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1593287114, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 10 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/interface.Game2" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 43 }, i16 1, i16 0, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 52 }, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", ptr @"github.com/goplus/llgo/cl/_testgo/interface.(*Game2).initGame", ptr @"github.com/goplus/llgo/cl/_testgo/interface.(*Game2).initGame" }] }, align 8 @9 = private unnamed_addr constant [10 x i8] c"main.Game2", align 1 @"_llgo_github.com/goplus/llgo/cl/_testgo/interface.Game2" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 0, i64 0, i32 985796467, i8 13, i8 1, i8 1, i8 25, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal0", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 10 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/interface.Game2" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" zeroinitializer }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 43 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @@ -46,15 +50,20 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/interface" @"*github.com/goplus/llgo/cl/_testdata/foo.iface$sO8a1LvuUsjXwiwaC6sR9-L4DiYgiOnZi7iosyShJXg" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -535098092, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 36 }, ptr null }, ptr @"github.com/goplus/llgo/cl/_testdata/foo.iface$sO8a1LvuUsjXwiwaC6sR9-L4DiYgiOnZi7iosyShJXg" }, align 8 @13 = private unnamed_addr constant [2 x i8] c"OK", align 1 @14 = private unnamed_addr constant [4 x i8] c"FAIL", align 1 +@llvm.compiler.used = appending global [5 x ptr] [ptr @"github.com/goplus/llgo/cl/_testgo/interface.Game1.Load", ptr @"github.com/goplus/llgo/cl/_testgo/interface.Game1.initGame", ptr @"github.com/goplus/llgo/cl/_testgo/interface.(*Game1).Load", ptr @"github.com/goplus/llgo/cl/_testgo/interface.(*Game1).initGame", ptr @"github.com/goplus/llgo/cl/_testgo/interface.(*Game2).initGame"], section "llvm.metadata" define void @"github.com/goplus/llgo/cl/_testgo/interface.Game1.Load"(%"github.com/goplus/llgo/cl/_testgo/interface.Game1" %0) { _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testgo/interface.Game1", align 8 call void @llvm.memset(ptr %1, i8 0, i64 8, i1 false) store %"github.com/goplus/llgo/cl/_testgo/interface.Game1" %0, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/interface.Game1", ptr %1, i32 0, i32 0 - %3 = load ptr, ptr %2, align 8 - call void @"github.com/goplus/llgo/cl/_testdata/foo.(*Game).Load"(ptr %3) + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/interface.Game1", ptr %1, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + call void @"github.com/goplus/llgo/cl/_testdata/foo.(*Game).Load"(ptr %5) ret void } @@ -63,25 +72,37 @@ _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testgo/interface.Game1", align 8 call void @llvm.memset(ptr %1, i8 0, i64 8, i1 false) store %"github.com/goplus/llgo/cl/_testgo/interface.Game1" %0, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/interface.Game1", ptr %1, i32 0, i32 0 - %3 = load ptr, ptr %2, align 8 - call void @"github.com/goplus/llgo/cl/_testdata/foo.(*Game).initGame"(ptr %3) + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/interface.Game1", ptr %1, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + call void @"github.com/goplus/llgo/cl/_testdata/foo.(*Game).initGame"(ptr %5) ret void } define void @"github.com/goplus/llgo/cl/_testgo/interface.(*Game1).Load"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/interface.Game1", ptr %0, i32 0, i32 0 - %2 = load ptr, ptr %1, align 8 - call void @"github.com/goplus/llgo/cl/_testdata/foo.(*Game).Load"(ptr %2) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/interface.Game1", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + call void @"github.com/goplus/llgo/cl/_testdata/foo.(*Game).Load"(ptr %4) ret void } define void @"github.com/goplus/llgo/cl/_testgo/interface.(*Game1).initGame"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/interface.Game1", ptr %0, i32 0, i32 0 - %2 = load ptr, ptr %1, align 8 - call void @"github.com/goplus/llgo/cl/_testdata/foo.(*Game).initGame"(ptr %2) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/interface.Game1", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + call void @"github.com/goplus/llgo/cl/_testdata/foo.(*Game).initGame"(ptr %4) ret void } @@ -107,78 +128,75 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testgo/interface.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/interface.Game1", ptr %0, i32 0, i32 0 - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 0) - store ptr %2, ptr %1, align 8 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/interface.Game1", ptr %0, i32 0, i32 0 + store ptr @"__llgo.moduleZeroSizedAlloc$3f8a2b30c61b8a66", ptr %2, align 8 %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/interface.Game1", ptr undef }, ptr %0, 1 - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 0) - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/interface.Game2", ptr undef }, ptr %4, 1 - %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %3, 0 - %7 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testdata/foo.Gamer", ptr %6) - br i1 %7, label %_llgo_3, label %_llgo_4 + %4 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %3, 0 + %5 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testdata/foo.Gamer", ptr %4) + br i1 %5, label %_llgo_3, label %_llgo_4 _llgo_1: ; preds = %_llgo_5 - %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %25) - %9 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %25, 0 - %10 = getelementptr ptr, ptr %9, i64 3 - %11 = load ptr, ptr %10, align 8 - %12 = insertvalue { ptr, ptr } undef, ptr %11, 0 - %13 = insertvalue { ptr, ptr } %12, ptr %8, 1 - %14 = extractvalue { ptr, ptr } %13, 1 - %15 = extractvalue { ptr, ptr } %13, 0 - call void %15(ptr %14) + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %22) + %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %22, 0 + %8 = getelementptr ptr, ptr %7, i64 3 + %9 = load ptr, ptr %8, align 8 + %10 = insertvalue { ptr, ptr } undef, ptr %9, 0 + %11 = insertvalue { ptr, ptr } %10, ptr %6, 1 + %12 = extractvalue { ptr, ptr } %11, 1 + %13 = extractvalue { ptr, ptr } %11, 0 + call void %13(ptr %12) br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_5 - %16 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %5, 0 - %17 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testdata/foo.Gamer", ptr %16) - br i1 %17, label %_llgo_6, label %_llgo_7 + %14 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testdata/foo.Gamer", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/interface.Game2") + br i1 %14, label %_llgo_6, label %_llgo_7 _llgo_3: ; preds = %_llgo_0 - %18 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %3, 1 - %19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testdata/foo.iface$sO8a1LvuUsjXwiwaC6sR9-L4DiYgiOnZi7iosyShJXg", ptr %6) - %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %19, 0 - %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %20, ptr %18, 1 - %22 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, 0 - %23 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %22, i1 true, 1 + %15 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %3, 1 + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testdata/foo.iface$sO8a1LvuUsjXwiwaC6sR9-L4DiYgiOnZi7iosyShJXg", ptr %4) + %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %16, 0 + %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %17, ptr %15, 1 + %19 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %18, 0 + %20 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %19, i1 true, 1 br label %_llgo_5 _llgo_4: ; preds = %_llgo_0 br label %_llgo_5 _llgo_5: ; preds = %_llgo_4, %_llgo_3 - %24 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %23, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] - %25 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %24, 0 - %26 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %24, 1 + %21 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %20, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] + %22 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %21, 0 + %23 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %21, 1 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 2 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintIface"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %25) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintIface"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %22) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %26) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %23) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - br i1 %26, label %_llgo_1, label %_llgo_2 + br i1 %23, label %_llgo_1, label %_llgo_2 _llgo_6: ; preds = %_llgo_2 - %27 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %5, 1 - %28 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testdata/foo.iface$sO8a1LvuUsjXwiwaC6sR9-L4DiYgiOnZi7iosyShJXg", ptr %16) - %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %28, 0 - %30 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %29, ptr %27, 1 - %31 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %30, 0 - %32 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %31, i1 true, 1 + %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testdata/foo.iface$sO8a1LvuUsjXwiwaC6sR9-L4DiYgiOnZi7iosyShJXg", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/interface.Game2") + %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %24, 0 + %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %25, ptr @"__llgo.moduleZeroSizedAlloc$7f47daf0279219a8", 1 + %27 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %26, 0 + %28 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %27, i1 true, 1 br label %_llgo_8 _llgo_7: ; preds = %_llgo_2 br label %_llgo_8 _llgo_8: ; preds = %_llgo_7, %_llgo_6 - %33 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %32, %_llgo_6 ], [ zeroinitializer, %_llgo_7 ] - %34 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %33, 0 - %35 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %33, 1 + %29 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %28, %_llgo_6 ], [ zeroinitializer, %_llgo_7 ] + %30 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %29, 0 + %31 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %29, 1 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 4 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintIface"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %34) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintIface"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %30) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %35) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %31) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -186,6 +204,8 @@ _llgo_8: ; preds = %_llgo_7, %_llgo_6 ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/cl/_testdata/foo.(*Game).Load"(ptr) declare void @"github.com/goplus/llgo/cl/_testdata/foo.(*Game).initGame"(ptr) diff --git a/cl/_testgo/interface1370/out.ll b/cl/_testgo/interface1370/out.ll index cfd466948d..0c9d62b878 100644 --- a/cl/_testgo/interface1370/out.ll +++ b/cl/_testgo/interface1370/out.ll @@ -20,12 +20,12 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/interface1370" @"_llgo_github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 0, i32 -121183544, i8 5, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 22 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testdata/geometry1370.Rectangle" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 48 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testdata/geometry1370.struct$EuRbjzGGO7GwkW6RxZGl-8lEjTdEMzAFD8LnY_SpVoQ$fields", i64 3, i64 3 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 48 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @1 = private unnamed_addr constant [48 x i8] c"github.com/goplus/llgo/cl/_testdata/geometry1370", align 1 @2 = private unnamed_addr constant [5 x i8] c"Width", align 1 -@_llgo_float64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1233032631, i8 4, i8 8, i8 8, i8 46, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f64equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 7 }, ptr @"*_llgo_float64" }, align 8 +@_llgo_float64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1233032631, i8 4, i8 8, i8 8, i8 14, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f64equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 7 }, ptr @"*_llgo_float64" }, align 8 @3 = private unnamed_addr constant [7 x i8] c"float64", align 1 @"*_llgo_float64" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1664509894, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 7 }, ptr null }, ptr @_llgo_float64 }, align 8 @4 = private unnamed_addr constant [6 x i8] c"Height", align 1 @5 = private unnamed_addr constant [2 x i8] c"id", align 1 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, ptr @"*_llgo_int" }, align 8 @6 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"github.com/goplus/llgo/cl/_testdata/geometry1370.struct$EuRbjzGGO7GwkW6RxZGl-8lEjTdEMzAFD8LnY_SpVoQ$fields" = weak_odr constant [3 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 5 }, ptr @_llgo_float64, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 6 }, ptr @_llgo_float64, i64 8, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 2 }, ptr @_llgo_int, i64 16, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @@ -50,7 +50,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/interface1370" @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -541022001, i8 0, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 11 }, ptr @"*_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk$out", i64 1, i64 1 } }, align 8 @16 = private unnamed_addr constant [11 x i8] c"func() bool", align 1 @"*_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -367308996, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 11 }, ptr null }, ptr @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk" }, align 8 -@_llgo_bool = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 554183389, i8 12, i8 1, i8 1, i8 33, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 4 }, ptr @"*_llgo_bool" }, align 8 +@_llgo_bool = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 554183389, i8 12, i8 1, i8 1, i8 1, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 4 }, ptr @"*_llgo_bool" }, align 8 @17 = private unnamed_addr constant [4 x i8] c"bool", align 1 @"*_llgo_bool" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1896950390, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 4 }, ptr null }, ptr @_llgo_bool }, align 8 @"_llgo_func$YHeRw3AOvQtzv982-ZO3Yn8vh3Fx89RM3VvI8E4iKVk$out" = weak_odr constant [1 x ptr] [ptr @_llgo_bool], align 8 diff --git a/cl/_testgo/invoke/expect.txt b/cl/_testgo/invoke/expect.txt index 6855244cae..ef19a01071 100644 --- a/cl/_testgo/invoke/expect.txt +++ b/cl/_testgo/invoke/expect.txt @@ -6,9 +6,9 @@ invoke1 100 1 invoke1 100 1 -invoke2 +1.001000e+02 +invoke2 +1.001000e+002 2 -invoke2 +1.001000e+02 +invoke2 +1.001000e+002 2 invoke3 127 3 diff --git a/cl/_testgo/invoke/out.ll b/cl/_testgo/invoke/out.ll index 1cdd95e85f..3ca8ab7961 100644 --- a/cl/_testgo/invoke/out.ll +++ b/cl/_testgo/invoke/out.ll @@ -37,7 +37,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/invoke" @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 2131144854, i8 0, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 10 }, ptr @"*_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA$out", i64 1, i64 1 } }, align 8 @11 = private unnamed_addr constant [10 x i8] c"func() int", align 1 @"*_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1805835775, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 10 }, ptr null }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 3 }, ptr @"*_llgo_int" }, align 8 @12 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA$out" = weak_odr constant [1 x ptr] [ptr @_llgo_int], align 8 @@ -54,22 +54,22 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/invoke" @17 = private unnamed_addr constant [26 x i8] c"interface { Invoke() int }", align 1 @"*_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1358691488, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 26 }, ptr null }, ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0" }, align 8 @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0$imethods" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.Imethod"] [%"github.com/goplus/llgo/runtime/abi.Imethod" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" }], align 8 -@"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T1" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 747982523, i8 13, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T1" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T1).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.T1.Invoke" }] }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T1" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 747982523, i8 13, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T1" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T1).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.T1.Invoke" }] }, align 8 @18 = private unnamed_addr constant [7 x i8] c"main.T1", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T1" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1933429878, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 7 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T1" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T1).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T1).Invoke" }] }, align 8 -@"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T2" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1664000404, i8 5, i8 8, i8 8, i8 46, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f64equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @19, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T2" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T2).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.T2.Invoke" }] }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T2" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1664000404, i8 5, i8 8, i8 8, i8 14, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f64equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @19, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T2" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T2).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.T2.Invoke" }] }, align 8 @19 = private unnamed_addr constant [7 x i8] c"main.T2", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T2" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -629524883, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @19, i64 7 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T2" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T2).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T2).Invoke" }] }, align 8 @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T3" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1030757803, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 7 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T3" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T3).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T3).Invoke" }] }, align 8 @20 = private unnamed_addr constant [7 x i8] c"main.T3", align 1 -@"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T3" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 -1524720381, i8 13, i8 1, i8 1, i8 35, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T3" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 -@"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T4" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.ArrayType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -404804171, i8 13, i8 8, i8 8, i8 49, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T4" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @21, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T4" }, ptr @_llgo_int, ptr @"[]_llgo_int", i64 1 }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T4).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.T4.Invoke" }] }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T3" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 -1524720381, i8 13, i8 1, i8 1, i8 3, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T3" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T4" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.ArrayType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -404804171, i8 13, i8 8, i8 8, i8 17, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T4" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @21, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T4" }, ptr @_llgo_int, ptr @"[]_llgo_int", i64 1 }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T4).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.T4.Invoke" }] }, align 8 @21 = private unnamed_addr constant [7 x i8] c"main.T4", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T4" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1496326536, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @21, i64 7 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T4" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T4).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T4).Invoke" }] }, align 8 @"[]_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 -1129561019, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @22, i64 5 }, ptr @"*[]_llgo_int" }, ptr @_llgo_int }, align 8 @22 = private unnamed_addr constant [5 x i8] c"[]int", align 1 @"*[]_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1428175521, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @22, i64 5 }, ptr null }, ptr @"[]_llgo_int" }, align 8 -@"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T5" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1908790280, i8 13, i8 8, i8 8, i8 57, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T5" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @23, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T5" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/invoke.struct$eovYmOhZg4X0zMSsuscSshndnbbAGvB2E3cyG8E7Y4U$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T5).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.T5.Invoke" }] }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T5" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1908790280, i8 13, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T5" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @23, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T5" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/invoke.struct$eovYmOhZg4X0zMSsuscSshndnbbAGvB2E3cyG8E7Y4U$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T5).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.T5.Invoke" }] }, align 8 @23 = private unnamed_addr constant [7 x i8] c"main.T5", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T5" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -656389711, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @23, i64 7 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T5" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 40 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T5).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T5).Invoke" }] }, align 8 @24 = private unnamed_addr constant [1 x i8] c"n", align 1 @@ -97,26 +97,33 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/invoke" @"*_llgo_any" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1741196194, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @33, i64 12 }, ptr null }, ptr @_llgo_any }, align 8 @34 = private unnamed_addr constant [32 x i8] c"type assertion any -> any failed", align 1 @35 = private unnamed_addr constant [52 x i8] c"type assertion any -> interface{Invoke() int} failed", align 1 +@llvm.compiler.used = appending global [14 x ptr] [ptr @"github.com/goplus/llgo/cl/_testgo/invoke.T.Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T).Method", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.T1.Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T1).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.T2.Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T2).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T3).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.T4.Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T4).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.T5.Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T5).Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.T6.Invoke", ptr @"github.com/goplus/llgo/cl/_testgo/invoke.(*T6).Invoke"], section "llvm.metadata" define i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T.Invoke"(%"github.com/goplus/llgo/cl/_testgo/invoke.T" %0) { _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testgo/invoke.T", align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store %"github.com/goplus/llgo/cl/_testgo/invoke.T" %0, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/invoke.T", ptr %1, i32 0, i32 0 - %3 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %2, align 8 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/invoke.T", ptr %1, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %3, align 8 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 6 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %3) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %5) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret i64 0 } define i64 @"github.com/goplus/llgo/cl/_testgo/invoke.(*T).Invoke"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testgo/invoke.T", ptr %0, align 8 - %2 = call i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T.Invoke"(%"github.com/goplus/llgo/cl/_testgo/invoke.T" %1) - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testgo/invoke.T", ptr %0, align 8 + %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T.Invoke"(%"github.com/goplus/llgo/cl/_testgo/invoke.T" %2) + ret i64 %3 } define void @"github.com/goplus/llgo/cl/_testgo/invoke.(*T).Method"(ptr %0) { @@ -135,9 +142,11 @@ _llgo_0: define i64 @"github.com/goplus/llgo/cl/_testgo/invoke.(*T1).Invoke"(ptr %0) { _llgo_0: - %1 = load i64, ptr %0, align 4 - %2 = call i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T1.Invoke"(i64 %1) - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load i64, ptr %0, align 4 + %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T1.Invoke"(i64 %2) + ret i64 %3 } define i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T2.Invoke"(double %0) { @@ -151,18 +160,22 @@ _llgo_0: define i64 @"github.com/goplus/llgo/cl/_testgo/invoke.(*T2).Invoke"(ptr %0) { _llgo_0: - %1 = load double, ptr %0, align 8 - %2 = call i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T2.Invoke"(double %1) - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load double, ptr %0, align 8 + %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T2.Invoke"(double %2) + ret i64 %3 } define i64 @"github.com/goplus/llgo/cl/_testgo/invoke.(*T3).Invoke"(ptr %0) { _llgo_0: - %1 = load i8, ptr %0, align 1 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load i8, ptr %0, align 1 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 7 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %2 = sext i8 %1 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %2) + %3 = sext i8 %2 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %3) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret i64 3 } @@ -172,20 +185,26 @@ _llgo_0: %1 = alloca [1 x i64], align 8 call void @llvm.memset(ptr %1, i8 0, i64 8, i1 false) store [1 x i64] %0, ptr %1, align 4 - %2 = getelementptr inbounds i64, ptr %1, i64 0 - %3 = load i64, ptr %2, align 4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds i64, ptr %1, i64 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %3, align 4 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %3) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %5) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret i64 4 } define i64 @"github.com/goplus/llgo/cl/_testgo/invoke.(*T4).Invoke"(ptr %0) { _llgo_0: - %1 = load [1 x i64], ptr %0, align 4 - %2 = call i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T4.Invoke"([1 x i64] %1) - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load [1 x i64], ptr %0, align 4 + %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T4.Invoke"([1 x i64] %2) + ret i64 %3 } define i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T5.Invoke"(%"github.com/goplus/llgo/cl/_testgo/invoke.T5" %0) { @@ -193,20 +212,26 @@ _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testgo/invoke.T5", align 8 call void @llvm.memset(ptr %1, i8 0, i64 8, i1 false) store %"github.com/goplus/llgo/cl/_testgo/invoke.T5" %0, ptr %1, align 4 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/invoke.T5", ptr %1, i32 0, i32 0 - %3 = load i64, ptr %2, align 4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/invoke.T5", ptr %1, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %3, align 4 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 7 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %3) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %5) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret i64 5 } define i64 @"github.com/goplus/llgo/cl/_testgo/invoke.(*T5).Invoke"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testgo/invoke.T5", ptr %0, align 4 - %2 = call i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T5.Invoke"(%"github.com/goplus/llgo/cl/_testgo/invoke.T5" %1) - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testgo/invoke.T5", ptr %0, align 4 + %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T5.Invoke"(%"github.com/goplus/llgo/cl/_testgo/invoke.T5" %2) + ret i64 %3 } define i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T6.Invoke"(%"github.com/goplus/llgo/cl/_testgo/invoke.T6" %0) { @@ -223,9 +248,11 @@ _llgo_0: define i64 @"github.com/goplus/llgo/cl/_testgo/invoke.(*T6).Invoke"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testgo/invoke.T6", ptr %0, align 8 - %2 = call i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T6.Invoke"(%"github.com/goplus/llgo/cl/_testgo/invoke.T6" %1) - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testgo/invoke.T6", ptr %0, align 8 + %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/invoke.T6.Invoke"(%"github.com/goplus/llgo/cl/_testgo/invoke.T6" %2) + ret i64 %3 } define void @"github.com/goplus/llgo/cl/_testgo/invoke.init"() { @@ -260,162 +287,199 @@ _llgo_0: define void @"github.com/goplus/llgo/cl/_testgo/invoke.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/invoke.T", ptr %0, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr %1, align 8 - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - store i64 100, ptr %2, align 4 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/invoke.T", ptr %0, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr %2, align 8 %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - store double 1.001000e+02, ptr %3, align 8 - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 1) - store i8 127, ptr %4, align 1 - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %6 = getelementptr inbounds i64, ptr %5, i64 0 - store i64 200, ptr %6, align 4 - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/invoke.T5", ptr %7, i32 0, i32 0 - store i64 300, ptr %8, align 4 - %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - store %"github.com/goplus/llgo/cl/_testgo/invoke.T6" { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/invoke.main$1", ptr null }, ptr %9, align 8 - %10 = load %"github.com/goplus/llgo/cl/_testgo/invoke.T", ptr %0, align 8 - %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/cl/_testgo/invoke.T" %10, ptr %11, align 8 - %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T") - %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %12, 0 - %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %13, ptr %11, 1 - call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %14) - %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T") - %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %15, 0 - %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %16, ptr %0, 1 - call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %17) - %18 = load i64, ptr %2, align 4 - %19 = inttoptr i64 %18 to ptr - %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T1") + store i64 100, ptr %3, align 4 + %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) + store double 1.001000e+02, ptr %4, align 8 + %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 1) + store i8 127, ptr %5, align 1 + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) + %7 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds i64, ptr %6, i64 0 + store i64 200, ptr %8, align 4 + %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) + %10 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/invoke.T5", ptr %9, i32 0, i32 0 + store i64 300, ptr %11, align 4 + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + store %"github.com/goplus/llgo/cl/_testgo/invoke.T6" { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/invoke.main$1", ptr null }, ptr %12, align 8 + %13 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load %"github.com/goplus/llgo/cl/_testgo/invoke.T", ptr %0, align 8 + %15 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T", ptr %16, ptr %0) + %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T") + %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %17, 0 + %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %18, ptr %16, 1 + call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %19) + %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T") %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %20, 0 - %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, ptr %19, 1 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, ptr %0, 1 call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %22) - %23 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T1") - %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %23, 0 - %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %24, ptr %2, 1 - call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %25) - %26 = load double, ptr %3, align 8 - %27 = bitcast double %26 to i64 - %28 = inttoptr i64 %27 to ptr - %29 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T2") - %30 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %29, 0 - %31 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %30, ptr %28, 1 - call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %31) - %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T2") - %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %32, 0 - %34 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %33, ptr %3, 1 - call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %34) - %35 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T3") - %36 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %35, 0 - %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %36, ptr %4, 1 - call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %37) - %38 = load [1 x i64], ptr %5, align 4 - %39 = extractvalue [1 x i64] %38, 0 - %40 = inttoptr i64 %39 to ptr - %41 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T4") - %42 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %41, 0 - %43 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %42, ptr %40, 1 - call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %43) - %44 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T4") - %45 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %44, 0 - %46 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %45, ptr %5, 1 - call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %46) - %47 = load %"github.com/goplus/llgo/cl/_testgo/invoke.T5", ptr %7, align 4 - %48 = extractvalue %"github.com/goplus/llgo/cl/_testgo/invoke.T5" %47, 0 - %49 = inttoptr i64 %48 to ptr - %50 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T5") + %23 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %23) + %24 = load i64, ptr %3, align 4 + %25 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %25) + %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T1", ptr %26, ptr %3) + %27 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T1") + %28 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %27, 0 + %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %28, ptr %26, 1 + call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %29) + %30 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T1") + %31 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %30, 0 + %32 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %31, ptr %3, 1 + call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %32) + %33 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %33) + %34 = load double, ptr %4, align 8 + %35 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %35) + %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T2", ptr %36, ptr %4) + %37 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T2") + %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %37, 0 + %39 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %38, ptr %36, 1 + call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %39) + %40 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T2") + %41 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %40, 0 + %42 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %41, ptr %4, 1 + call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %42) + %43 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T3") + %44 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %43, 0 + %45 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %44, ptr %5, 1 + call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %45) + %46 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %46) + %47 = load [1 x i64], ptr %6, align 4 + %48 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %48) + %49 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T4", ptr %49, ptr %6) + %50 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T4") %51 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %50, 0 %52 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %51, ptr %49, 1 call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %52) - %53 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T5") + %53 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T4") %54 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %53, 0 - %55 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %54, ptr %7, 1 + %55 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %54, ptr %6, 1 call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %55) - %56 = load %"github.com/goplus/llgo/cl/_testgo/invoke.T6", ptr %9, align 8 - %57 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/cl/_testgo/invoke.T6" %56, ptr %57, align 8 - %58 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T6") - %59 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %58, 0 - %60 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %59, ptr %57, 1 - call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %60) - %61 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T6") - %62 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %61, 0 - %63 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %62, ptr %9, 1 - call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %63) - %64 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) - %65 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr %64) - %66 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %65, 0 - %67 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %66, ptr null, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintIface"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %67) + %56 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %56) + %57 = load %"github.com/goplus/llgo/cl/_testgo/invoke.T5", ptr %9, align 4 + %58 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %58) + %59 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T5", ptr %59, ptr %9) + %60 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T5") + %61 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %60, 0 + %62 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %61, ptr %59, 1 + call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %62) + %63 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T5") + %64 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %63, 0 + %65 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %64, ptr %9, 1 + call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %65) + %66 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %66) + %67 = load %"github.com/goplus/llgo/cl/_testgo/invoke.T6", ptr %12, align 8 + %68 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %68) + %69 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T6", ptr %69, ptr %12) + %70 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T6") + %71 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %70, 0 + %72 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %71, ptr %69, 1 + call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %72) + %73 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T6") + %74 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %73, 0 + %75 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %74, ptr %12, 1 + call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %75) + %76 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) + %77 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr %76) + %78 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %77, 0 + %79 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %78, ptr null, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintIface"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %79) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintIface"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %68 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$jwmSdgh1zvY_TDIgLzCkvkbiyrdwl9N806DH0JGcyMI", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T") - %69 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %68, 0 - %70 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %69, ptr %0, 1 - %71 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %70) - %72 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %70, 1 - %73 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr %71) - %74 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %73, 0 - %75 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %74, ptr %72, 1 - call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %75) - %76 = alloca %"github.com/goplus/llgo/cl/_testgo/invoke.T", align 8 - call void @llvm.memset(ptr %76, i8 0, i64 16, i1 false) - %77 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/invoke.T", ptr %76, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @30, i64 5 }, ptr %77, align 8 - %78 = load %"github.com/goplus/llgo/cl/_testgo/invoke.T", ptr %76, align 8 - %79 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/cl/_testgo/invoke.T" %78, ptr %79, align 8 - %80 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T", ptr undef }, ptr %79, 1 - %81 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %80, 0 - %82 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.I", ptr %81) - br i1 %82, label %_llgo_1, label %_llgo_2 + %80 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$jwmSdgh1zvY_TDIgLzCkvkbiyrdwl9N806DH0JGcyMI", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T") + %81 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %80, 0 + %82 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %81, ptr %0, 1 + %83 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %82) + %84 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %82, 1 + %85 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr %83) + %86 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %85, 0 + %87 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %86, ptr %84, 1 + call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %87) + %88 = alloca %"github.com/goplus/llgo/cl/_testgo/invoke.T", align 8 + call void @llvm.memset(ptr %88, i8 0, i64 16, i1 false) + %89 = icmp eq ptr %88, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %89) + %90 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/invoke.T", ptr %88, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @30, i64 5 }, ptr %90, align 8 + %91 = icmp eq ptr %88, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %91) + %92 = load %"github.com/goplus/llgo/cl/_testgo/invoke.T", ptr %88, align 8 + %93 = icmp eq ptr %88, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %93) + %94 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T", ptr %94, ptr %88) + %95 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.T", ptr undef }, ptr %94, 1 + %96 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %95, 0 + %97 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/invoke.I", ptr %96) + br i1 %97, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %83 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %80, 1 - %84 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr %81) - %85 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %84, 0 - %86 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %85, ptr %83, 1 - call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %86) - %87 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %80, 0 - %88 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %80, 1 - br i1 true, label %_llgo_3, label %_llgo_4 + %98 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %95, 1 + %99 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr %96) + %100 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %99, 0 + %101 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %100, ptr %98, 1 + call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %101) + %102 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %95, 0 + %103 = icmp ne ptr %102, null + br i1 %103, label %_llgo_3, label %_llgo_4 _llgo_2: ; preds = %_llgo_0 - %89 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @32, i64 71 }, ptr %89, align 8 - %90 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %89, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %90) + %104 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @32, i64 71 }, ptr %104, align 8 + %105 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %104, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %105) unreachable _llgo_3: ; preds = %_llgo_1 - %91 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %80, 0 - %92 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr %91) - br i1 %92, label %_llgo_5, label %_llgo_6 + %106 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %95, 0 + %107 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr %106) + br i1 %107, label %_llgo_5, label %_llgo_6 _llgo_4: ; preds = %_llgo_1 - %93 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @34, i64 32 }, ptr %93, align 8 - %94 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %93, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %94) + %108 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @34, i64 32 }, ptr %108, align 8 + %109 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %108, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %109) unreachable _llgo_5: ; preds = %_llgo_3 - %95 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %80, 1 - %96 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr %91) - %97 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %96, 0 - %98 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %97, ptr %95, 1 - call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %98) + %110 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %95, 1 + %111 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uRUteI7wmSy7y7ODhGzk0FdDaxGKMhVSSu6HZEv9aa0", ptr %106) + %112 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %111, 0 + %113 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %112, ptr %110, 1 + call void @"github.com/goplus/llgo/cl/_testgo/invoke.invoke"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %113) ret void _llgo_6: ; preds = %_llgo_3 - %99 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @35, i64 52 }, ptr %99, align 8 - %100 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %99, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %100) + %114 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @35, i64 52 }, ptr %114, align 8 + %115 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %114, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %115) unreachable } @@ -427,6 +491,8 @@ _llgo_0: ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String") declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) @@ -473,6 +539,8 @@ _llgo_0: declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr, ptr, ptr) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.interequal"(ptr, ptr) define linkonce i1 @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.interequal"(ptr %0, ptr %1, ptr %2) { diff --git a/cl/_testgo/multiret/expect.txt b/cl/_testgo/multiret/expect.txt index 5c6815bbfd..66a7d8b120 100644 --- a/cl/_testgo/multiret/expect.txt +++ b/cl/_testgo/multiret/expect.txt @@ -1 +1 @@ -1 +2.000000e+00 +1 +2.000000e+000 diff --git a/cl/_testgo/reader/out.ll b/cl/_testgo/reader/out.ll index 49ad7ec3a2..e13623d354 100644 --- a/cl/_testgo/reader/out.ll +++ b/cl/_testgo/reader/out.ll @@ -41,11 +41,11 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/reader" @"[]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 370346748, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 7 }, ptr @"*[]_llgo_uint8" }, ptr @_llgo_uint8 }, align 8 @7 = private unnamed_addr constant [7 x i8] c"[]uint8", align 1 @"*[]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -2143776929, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 7 }, ptr null }, ptr @"[]_llgo_uint8" }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @8 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @"_llgo_func$G2hch9Iy9DrhKKsg70PbL54bK-XSl-1IUUORN17J2Dk$in" = weak_odr constant [1 x ptr] [ptr @"[]_llgo_uint8"], align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 3 }, ptr @"*_llgo_int" }, align 8 @9 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @_llgo_error = weak_odr constant %"github.com/goplus/llgo/runtime/abi.InterfaceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 16, i32 -1462738452, i8 4, i8 8, i8 8, i8 20, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.interequal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 5 }, ptr @"*_llgo_error" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 40 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU$imethods", i64 1, i64 1 } }, align 8 @@ -63,7 +63,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/reader" @"_llgo_func$G2hch9Iy9DrhKKsg70PbL54bK-XSl-1IUUORN17J2Dk$out" = weak_odr constant [2 x ptr] [ptr @_llgo_int, ptr @_llgo_error], align 8 @"_llgo_iface$kr1iSWwMezh0B9LdQN0MhEZUNZvBlHPhlst95jAyxE0$imethods" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.Imethod"] [%"github.com/goplus/llgo/runtime/abi.Imethod" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 5 }, ptr @"_llgo_func$G2hch9Iy9DrhKKsg70PbL54bK-XSl-1IUUORN17J2Dk" }], align 8 @"_llgo_func$V_kP-r1nn8Ij-G2jGIm9ROLn4CjtLBch-g3Ha7pGJo4$in" = weak_odr constant [1 x ptr] [ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/reader.Writer"], align 8 -@_llgo_int64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 394795202, i8 12, i8 8, i8 8, i8 38, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 5 }, ptr @"*_llgo_int64" }, align 8 +@_llgo_int64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 394795202, i8 12, i8 8, i8 8, i8 6, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 5 }, ptr @"*_llgo_int64" }, align 8 @14 = private unnamed_addr constant [5 x i8] c"int64", align 1 @"*_llgo_int64" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1901231210, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 5 }, ptr null }, ptr @_llgo_int64 }, align 8 @"_llgo_func$V_kP-r1nn8Ij-G2jGIm9ROLn4CjtLBch-g3Ha7pGJo4$out" = weak_odr constant [2 x ptr] [ptr @_llgo_int64, ptr @_llgo_error], align 8 @@ -136,7 +136,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/reader" @"_llgo_func$q-bw-_pPYBCXnr1TXIF8sOD4fVVzzIlpHqD-A13AB4Y" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1043083527, i8 0, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 26 }, ptr @"*_llgo_func$q-bw-_pPYBCXnr1TXIF8sOD4fVVzzIlpHqD-A13AB4Y" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$q-bw-_pPYBCXnr1TXIF8sOD4fVVzzIlpHqD-A13AB4Y$out", i64 3, i64 3 } }, align 8 @42 = private unnamed_addr constant [26 x i8] c"func() (int32, int, error)", align 1 @"*_llgo_func$q-bw-_pPYBCXnr1TXIF8sOD4fVVzzIlpHqD-A13AB4Y" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 746645372, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 26 }, ptr null }, ptr @"_llgo_func$q-bw-_pPYBCXnr1TXIF8sOD4fVVzzIlpHqD-A13AB4Y" }, align 8 -@_llgo_int32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 1448558410, i8 12, i8 4, i8 4, i8 37, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @43, i64 5 }, ptr @"*_llgo_int32" }, align 8 +@_llgo_int32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 1448558410, i8 12, i8 4, i8 4, i8 5, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @43, i64 5 }, ptr @"*_llgo_int32" }, align 8 @43 = private unnamed_addr constant [5 x i8] c"int32", align 1 @"*_llgo_int32" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -38689692, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @43, i64 5 }, ptr null }, ptr @_llgo_int32 }, align 8 @"_llgo_func$q-bw-_pPYBCXnr1TXIF8sOD4fVVzzIlpHqD-A13AB4Y$out" = weak_odr constant [3 x ptr] [ptr @_llgo_int32, ptr @_llgo_int, ptr @_llgo_error], align 8 @@ -171,6 +171,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/reader" @58 = private unnamed_addr constant [49 x i8] c"strings.Reader.UnreadRune: at beginning of string", align 1 @59 = private unnamed_addr constant [62 x i8] c"strings.Reader.UnreadRune: previous operation was not ReadRune", align 1 @60 = private unnamed_addr constant [48 x i8] c"stringsReader.WriteTo: invalid WriteString count", align 1 +@llvm.compiler.used = appending global [21 x ptr] [ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*errorString).Error", ptr @"github.com/goplus/llgo/cl/_testgo/reader.nopCloser.Close", ptr @"github.com/goplus/llgo/cl/_testgo/reader.nopCloser.Read", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*nopCloser).Close", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*nopCloser).Read", ptr @"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo.Close", ptr @"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo.Read", ptr @"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo.WriteTo", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*nopCloserWriterTo).Close", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*nopCloserWriterTo).Read", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*nopCloserWriterTo).WriteTo", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).Len", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).Read", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).ReadAt", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).ReadByte", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).ReadRune", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).Seek", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).Size", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).UnreadByte", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).UnreadRune", ptr @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).WriteTo"], section "llvm.metadata" define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.NopCloser"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %0) { _llgo_0: @@ -181,127 +182,140 @@ _llgo_0: _llgo_1: ; preds = %_llgo_5 %3 = alloca %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", align 8 call void @llvm.memset(ptr %3, i8 0, i64 16, i1 false) - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %3, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %0, ptr %4, align 8 - %5 = load %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %3, align 8 - %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo" %5, ptr %6, align 8 - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$2bmbYDBStAIdmbXPPn7qIaCcpVcj2I5k6AqgqwAfh84", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo") - %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %7, 0 - %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, ptr %6, 1 - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %3, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %0, ptr %5, align 8 + %6 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %3, align 8 + %8 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %9, ptr %3) + %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$2bmbYDBStAIdmbXPPn7qIaCcpVcj2I5k6AqgqwAfh84", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo") + %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %10, 0 + %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %11, ptr %9, 1 + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %12 _llgo_2: ; preds = %_llgo_5 - %10 = alloca %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser", align 8 - call void @llvm.memset(ptr %10, i8 0, i64 16, i1 false) - %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser", ptr %10, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %0, ptr %11, align 8 - %12 = load %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser", ptr %10, align 8 - %13 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser" %12, ptr %13, align 8 - %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$2bmbYDBStAIdmbXPPn7qIaCcpVcj2I5k6AqgqwAfh84", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/reader.nopCloser") - %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %14, 0 - %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %15, ptr %13, 1 - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %16 + %13 = alloca %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser", align 8 + call void @llvm.memset(ptr %13, i8 0, i64 16, i1 false) + %14 = icmp eq ptr %13, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser", ptr %13, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %0, ptr %15, align 8 + %16 = icmp eq ptr %13, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = load %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser", ptr %13, align 8 + %18 = icmp eq ptr %13, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/reader.nopCloser", ptr %19, ptr %13) + %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$2bmbYDBStAIdmbXPPn7qIaCcpVcj2I5k6AqgqwAfh84", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/reader.nopCloser") + %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %20, 0 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, ptr %19, 1 + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %22 _llgo_3: ; preds = %_llgo_0 - %17 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %0, 1 - %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$p5Bo_emI1h8acs1rFbUxZTrpeDbIQ34gFcsbwK9YIgs", ptr %1) - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %18, 0 - %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %19, ptr %17, 1 - %21 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %20, 0 - %22 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %21, i1 true, 1 + %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %0, 1 + %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$p5Bo_emI1h8acs1rFbUxZTrpeDbIQ34gFcsbwK9YIgs", ptr %1) + %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %24, 0 + %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %25, ptr %23, 1 + %27 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %26, 0 + %28 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %27, i1 true, 1 br label %_llgo_5 _llgo_4: ; preds = %_llgo_0 br label %_llgo_5 _llgo_5: ; preds = %_llgo_4, %_llgo_3 - %23 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %22, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] - %24 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %23, 0 - %25 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %23, 1 - br i1 %25, label %_llgo_1, label %_llgo_2 + %29 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %28, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] + %30 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %29, 0 + %31 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %29, 1 + br i1 %31, label %_llgo_1, label %_llgo_2 } define { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.ReadAll"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %0) { _llgo_0: - %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 512) - %2 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %1, i64 1, i64 512, i64 0, i64 0, i64 512) + %1 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.MakeSlice"(i64 0, i64 512, i64 1) br label %_llgo_1 _llgo_1: ; preds = %_llgo_6, %_llgo_3, %_llgo_0 - %3 = phi %"github.com/goplus/llgo/runtime/internal/runtime.Slice" [ %2, %_llgo_0 ], [ %24, %_llgo_3 ], [ %61, %_llgo_6 ] - %4 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3, 1 - %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3, 2 - %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3, 2 - %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3, 0 - %8 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %7, i64 1, i64 %6, i64 %4, i64 %5, i64 %6) - %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %0) - %10 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %0, 0 - %11 = getelementptr ptr, ptr %10, i64 3 - %12 = load ptr, ptr %11, align 8 - %13 = insertvalue { ptr, ptr } undef, ptr %12, 0 - %14 = insertvalue { ptr, ptr } %13, ptr %9, 1 - %15 = extractvalue { ptr, ptr } %14, 1 - %16 = extractvalue { ptr, ptr } %14, 0 - %17 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %16(ptr %15, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8) - %18 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %17, 0 - %19 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %17, 1 - %20 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3, 1 - %21 = add i64 %20, %18 - %22 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3, 2 - %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3, 0 - %24 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %23, i64 1, i64 %22, i64 0, i64 %21, i64 %22) - %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %19) - %26 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %19, 1 - %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %25, 0 - %28 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %27, ptr %26, 1 - %29 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) - %30 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %29, 0 - %31 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %30, ptr null, 1 - %32 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %28, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %31) - %33 = xor i1 %32, true - br i1 %33, label %_llgo_2, label %_llgo_3 + %2 = phi %"github.com/goplus/llgo/runtime/internal/runtime.Slice" [ %1, %_llgo_0 ], [ %23, %_llgo_3 ], [ %61, %_llgo_6 ] + %3 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %2, 1 + %4 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %2, 2 + %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %2, 2 + %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %2, 0 + %7 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %6, i64 1, i64 %5, i64 %3, i64 %4, i64 %5) + %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %0) + %9 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %0, 0 + %10 = getelementptr ptr, ptr %9, i64 3 + %11 = load ptr, ptr %10, align 8 + %12 = insertvalue { ptr, ptr } undef, ptr %11, 0 + %13 = insertvalue { ptr, ptr } %12, ptr %8, 1 + %14 = extractvalue { ptr, ptr } %13, 1 + %15 = extractvalue { ptr, ptr } %13, 0 + %16 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %15(ptr %14, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7) + %17 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %16, 0 + %18 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %16, 1 + %19 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %2, 1 + %20 = add i64 %19, %17 + %21 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %2, 2 + %22 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %2, 0 + %23 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %22, i64 1, i64 %21, i64 0, i64 %20, i64 %21) + %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %18) + %25 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %18, 1 + %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %24, 0 + %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %26, ptr %25, 1 + %28 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) + %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %28, 0 + %30 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %29, ptr null, 1 + %31 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %27, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %30) + %32 = xor i1 %31, true + br i1 %32, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %34 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr @"github.com/goplus/llgo/cl/_testgo/reader.EOF", align 8 - %35 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %19) - %36 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %19, 1 - %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %35, 0 - %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %37, ptr %36, 1 - %39 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %34) - %40 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %34, 1 - %41 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %39, 0 - %42 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %41, ptr %40, 1 - %43 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %38, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %42) - br i1 %43, label %_llgo_4, label %_llgo_5 + %33 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr @"github.com/goplus/llgo/cl/_testgo/reader.EOF", align 8 + %34 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %18) + %35 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %18, 1 + %36 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %34, 0 + %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %36, ptr %35, 1 + %38 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %33) + %39 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %33, 1 + %40 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %38, 0 + %41 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %40, ptr %39, 1 + %42 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %37, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %41) + br i1 %42, label %_llgo_4, label %_llgo_5 _llgo_3: ; preds = %_llgo_1 - %44 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24, 1 - %45 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24, 2 - %46 = icmp eq i64 %44, %45 - br i1 %46, label %_llgo_6, label %_llgo_1 + %43 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, 1 + %44 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, 2 + %45 = icmp eq i64 %43, %44 + br i1 %45, label %_llgo_6, label %_llgo_1 _llgo_4: ; preds = %_llgo_2 br label %_llgo_5 _llgo_5: ; preds = %_llgo_4, %_llgo_2 - %47 = phi %"github.com/goplus/llgo/runtime/internal/runtime.iface" [ %19, %_llgo_2 ], [ zeroinitializer, %_llgo_4 ] - %48 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24, 0 - %49 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %48, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %47, 1 - ret { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %49 + %46 = phi %"github.com/goplus/llgo/runtime/internal/runtime.iface" [ %18, %_llgo_2 ], [ zeroinitializer, %_llgo_4 ] + %47 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, 0 + %48 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %47, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %46, 1 + ret { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %48 _llgo_6: ; preds = %_llgo_3 - %50 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 1) - %51 = getelementptr inbounds i8, ptr %50, i64 0 + %49 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 1) + %50 = icmp eq ptr %49, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %50) + %51 = getelementptr inbounds i8, ptr %49, i64 0 store i8 0, ptr %51, align 1 - %52 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %50, 0 + %52 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %49, 0 %53 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %52, i64 1, 1 %54 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %53, i64 1, 2 %55 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %54, 0 %56 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %54, 1 - %57 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24, ptr %55, i64 %56, i64 1) - %58 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24, 1 + %57 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, ptr %55, i64 %56, i64 1) + %58 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, 1 %59 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %57, 2 %60 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %57, 0 %61 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %60, i64 1, i64 %59, i64 0, i64 %58, i64 %59) @@ -368,9 +382,13 @@ _llgo_5: ; preds = %_llgo_4, %_llgo_3 define %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testgo/reader.(*errorString).Error"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.errorString", ptr %0, i32 0, i32 0 - %2 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %1, align 8 - ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.errorString", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %2, align 8 + ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %4 } define void @"github.com/goplus/llgo/cl/_testgo/reader.init"() { @@ -394,18 +412,20 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testgo/reader.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @30, i64 11 }, ptr %1, align 8 - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uycIKA3bbxRhudEjW1hHKWKdLqHQsCVy8NdW1bkQmNw", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/reader.stringReader") - %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %2, 0 - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3, ptr %0, 1 - %5 = call { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.ReadAll"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %4) - %6 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 0 - %7 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5, 1 - %8 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringFromBytes"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %8) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @30, i64 11 }, ptr %2, align 8 + %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$uycIKA3bbxRhudEjW1hHKWKdLqHQsCVy8NdW1bkQmNw", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/reader.stringReader") + %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %3, 0 + %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %0, 1 + %6 = call { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.ReadAll"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %5) + %7 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 0 + %8 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, 1 + %9 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringFromBytes"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %9) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintIface"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %7) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintIface"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %8) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -413,12 +433,14 @@ _llgo_0: define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.newError"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %0) { _llgo_0: %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.errorString", ptr %1, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" %0, ptr %2, align 8 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/reader.errorString") - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %3, 0 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %1, 1 - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.errorString", ptr %1, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" %0, ptr %3, align 8 + %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/reader.errorString") + %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %4, 0 + %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, ptr %1, 1 + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6 } define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.nopCloser.Close"(%"github.com/goplus/llgo/cl/_testgo/reader.nopCloser" %0) { @@ -431,49 +453,59 @@ _llgo_0: %2 = alloca %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser", align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser" %0, ptr %2, align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser", ptr %2, i32 0, i32 0 - %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %3, align 8 - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %4) - %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, 0 - %7 = getelementptr ptr, ptr %6, i64 3 - %8 = load ptr, ptr %7, align 8 - %9 = insertvalue { ptr, ptr } undef, ptr %8, 0 - %10 = insertvalue { ptr, ptr } %9, ptr %5, 1 - %11 = extractvalue { ptr, ptr } %10, 1 - %12 = extractvalue { ptr, ptr } %10, 0 - %13 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %12(ptr %11, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) - %14 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %13, 0 - %15 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %13, 1 - %16 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %14, 0 - %17 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %16, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %15, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %17 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser", ptr %2, i32 0, i32 0 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %4, align 8 + %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %6) + %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 0 + %9 = getelementptr ptr, ptr %8, i64 3 + %10 = load ptr, ptr %9, align 8 + %11 = insertvalue { ptr, ptr } undef, ptr %10, 0 + %12 = insertvalue { ptr, ptr } %11, ptr %7, 1 + %13 = extractvalue { ptr, ptr } %12, 1 + %14 = extractvalue { ptr, ptr } %12, 0 + %15 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %14(ptr %13, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) + %16 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %15, 0 + %17 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %15, 1 + %18 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %16, 0 + %19 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %18, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %17, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %19 } define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.(*nopCloser).Close"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser", ptr %0, align 8 - %2 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.nopCloser.Close"(%"github.com/goplus/llgo/cl/_testgo/reader.nopCloser" %1) - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser", ptr %0, align 8 + %3 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.nopCloser.Close"(%"github.com/goplus/llgo/cl/_testgo/reader.nopCloser" %2) + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.(*nopCloser).Read"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser", ptr %0, i32 0, i32 0 - %3 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %2, align 8 - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %3) - %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3, 0 - %6 = getelementptr ptr, ptr %5, i64 3 - %7 = load ptr, ptr %6, align 8 - %8 = insertvalue { ptr, ptr } undef, ptr %7, 0 - %9 = insertvalue { ptr, ptr } %8, ptr %4, 1 - %10 = extractvalue { ptr, ptr } %9, 1 - %11 = extractvalue { ptr, ptr } %9, 0 - %12 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %11(ptr %10, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) - %13 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %12, 0 - %14 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %12, 1 - %15 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %13, 0 - %16 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %15, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %14, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %16 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.nopCloser", ptr %0, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %3, align 8 + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %5) + %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, 0 + %8 = getelementptr ptr, ptr %7, i64 3 + %9 = load ptr, ptr %8, align 8 + %10 = insertvalue { ptr, ptr } undef, ptr %9, 0 + %11 = insertvalue { ptr, ptr } %10, ptr %6, 1 + %12 = extractvalue { ptr, ptr } %11, 1 + %13 = extractvalue { ptr, ptr } %11, 0 + %14 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %13(ptr %12, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) + %15 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %14, 0 + %16 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %14, 1 + %17 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %15, 0 + %18 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %17, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %16, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %18 } define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo.Close"(%"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo" %0) { @@ -486,22 +518,26 @@ _llgo_0: %2 = alloca %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo" %0, ptr %2, align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %2, i32 0, i32 0 - %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %3, align 8 - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %4) - %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, 0 - %7 = getelementptr ptr, ptr %6, i64 3 - %8 = load ptr, ptr %7, align 8 - %9 = insertvalue { ptr, ptr } undef, ptr %8, 0 - %10 = insertvalue { ptr, ptr } %9, ptr %5, 1 - %11 = extractvalue { ptr, ptr } %10, 1 - %12 = extractvalue { ptr, ptr } %10, 0 - %13 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %12(ptr %11, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) - %14 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %13, 0 - %15 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %13, 1 - %16 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %14, 0 - %17 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %16, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %15, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %17 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %2, i32 0, i32 0 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %4, align 8 + %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %6) + %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 0 + %9 = getelementptr ptr, ptr %8, i64 3 + %10 = load ptr, ptr %9, align 8 + %11 = insertvalue { ptr, ptr } undef, ptr %10, 0 + %12 = insertvalue { ptr, ptr } %11, ptr %7, 1 + %13 = extractvalue { ptr, ptr } %12, 1 + %14 = extractvalue { ptr, ptr } %12, 0 + %15 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %14(ptr %13, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) + %16 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %15, 0 + %17 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %15, 1 + %18 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %16, 0 + %19 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %18, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %17, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %19 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo.WriteTo"(%"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo" %0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) { @@ -509,136 +545,188 @@ _llgo_0: %2 = alloca %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", align 8 call void @llvm.memset(ptr %2, i8 0, i64 16, i1 false) store %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo" %0, ptr %2, align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %2, i32 0, i32 0 - %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %3, align 8 - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %4) - %6 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/reader.WriterTo", ptr %5) - br i1 %6, label %_llgo_1, label %_llgo_2 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %2, i32 0, i32 0 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %4, align 8 + %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %6) + %8 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/reader.WriterTo", ptr %7) + br i1 %8, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, 1 - %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$p5Bo_emI1h8acs1rFbUxZTrpeDbIQ34gFcsbwK9YIgs", ptr %5) - %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %8, 0 - %10 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %9, ptr %7, 1 - %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %10) - %12 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %10, 0 - %13 = getelementptr ptr, ptr %12, i64 3 - %14 = load ptr, ptr %13, align 8 - %15 = insertvalue { ptr, ptr } undef, ptr %14, 0 - %16 = insertvalue { ptr, ptr } %15, ptr %11, 1 - %17 = extractvalue { ptr, ptr } %16, 1 - %18 = extractvalue { ptr, ptr } %16, 0 - %19 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %18(ptr %17, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) - %20 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %19, 0 - %21 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %19, 1 - %22 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %20, 0 - %23 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %22, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %23 + %9 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 1 + %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$p5Bo_emI1h8acs1rFbUxZTrpeDbIQ34gFcsbwK9YIgs", ptr %7) + %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %10, 0 + %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %11, ptr %9, 1 + %13 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %12) + %14 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %12, 0 + %15 = getelementptr ptr, ptr %14, i64 3 + %16 = load ptr, ptr %15, align 8 + %17 = insertvalue { ptr, ptr } undef, ptr %16, 0 + %18 = insertvalue { ptr, ptr } %17, ptr %13, 1 + %19 = extractvalue { ptr, ptr } %18, 1 + %20 = extractvalue { ptr, ptr } %18, 0 + %21 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %20(ptr %19, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) + %22 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %21, 0 + %23 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %21, 1 + %24 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %22, 0 + %25 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %24, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %23, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %25 _llgo_2: ; preds = %_llgo_0 - %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @53, i64 122 }, ptr %24, align 8 - %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %24, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %25) + %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @53, i64 122 }, ptr %26, align 8 + %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %26, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %27) unreachable } define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.(*nopCloserWriterTo).Close"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %0, align 8 - %2 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo.Close"(%"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo" %1) - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %0, align 8 + %3 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo.Close"(%"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo" %2) + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.(*nopCloserWriterTo).Read"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %0, i32 0, i32 0 - %3 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %2, align 8 - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %3) - %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3, 0 - %6 = getelementptr ptr, ptr %5, i64 3 - %7 = load ptr, ptr %6, align 8 - %8 = insertvalue { ptr, ptr } undef, ptr %7, 0 - %9 = insertvalue { ptr, ptr } %8, ptr %4, 1 - %10 = extractvalue { ptr, ptr } %9, 1 - %11 = extractvalue { ptr, ptr } %9, 0 - %12 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %11(ptr %10, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) - %13 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %12, 0 - %14 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %12, 1 - %15 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %13, 0 - %16 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %15, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %14, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %16 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %0, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %3, align 8 + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %5) + %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, 0 + %8 = getelementptr ptr, ptr %7, i64 3 + %9 = load ptr, ptr %8, align 8 + %10 = insertvalue { ptr, ptr } undef, ptr %9, 0 + %11 = insertvalue { ptr, ptr } %10, ptr %6, 1 + %12 = extractvalue { ptr, ptr } %11, 1 + %13 = extractvalue { ptr, ptr } %11, 0 + %14 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %13(ptr %12, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) + %15 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %14, 0 + %16 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %14, 1 + %17 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %15, 0 + %18 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %17, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %16, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %18 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.(*nopCloserWriterTo).WriteTo"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) { _llgo_0: - %2 = load %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %0, align 8 - %3 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo.WriteTo"(%"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo" %2, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) - %4 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %3, 0 - %5 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %3, 1 - %6 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %4, 0 - %7 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %6, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load %"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo", ptr %0, align 8 + %4 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo.WriteTo"(%"github.com/goplus/llgo/cl/_testgo/reader.nopCloserWriterTo" %3, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) + %5 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 0 + %6 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %4, 1 + %7 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %5, 0 + %8 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %7, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %8 } define i64 @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).Len"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %2 = load i64, ptr %1, align 4 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %3, align 8 - %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %4, 1 - %6 = icmp sge i64 %2, %5 - br i1 %6, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %7 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %6, align 8 + %9 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %8, 1 + %10 = icmp sge i64 %4, %9 + br i1 %10, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 ret i64 0 _llgo_2: ; preds = %_llgo_0 - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %8 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %7, align 8 - %9 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %8, 1 - %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %11 = load i64, ptr %10, align 4 - %12 = sub i64 %9, %11 - ret i64 %12 + %11 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %12, align 8 + %15 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %14, 1 + %16 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %18 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = load i64, ptr %17, align 4 + %20 = sub i64 %15, %19 + ret i64 %20 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).Read"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %3 = load i64, ptr %2, align 4 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %5 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %4, align 8 - %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %5, 1 - %7 = icmp sge i64 %3, %6 - br i1 %7, label %_llgo_1, label %_llgo_2 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %3, align 4 + %6 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %7, align 8 + %10 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %9, 1 + %11 = icmp sge i64 %5, %10 + br i1 %11, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %8 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr @"github.com/goplus/llgo/cl/_testgo/reader.EOF", align 8 - %9 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } { i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef }, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9 + %12 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr @"github.com/goplus/llgo/cl/_testgo/reader.EOF", align 8 + %13 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } { i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef }, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %12, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %13 _llgo_2: ; preds = %_llgo_0 - %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 - store i64 -1, ptr %10, align 4 - %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %12 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %11, align 8 - %13 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %14 = load i64, ptr %13, align 4 - %15 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %12, 1 - %16 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %12, i64 %14, i64 %15) - %17 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %16, 0 - %18 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %16, 1 - %19 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.SliceCopy"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, ptr %17, i64 %18, i64 1) - %20 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %21 = load i64, ptr %20, align 4 - %22 = add i64 %21, %19 - %23 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - store i64 %22, ptr %23, align 4 - %24 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %19, 0 - %25 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %24, %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %25 + %14 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 + store i64 -1, ptr %15, align 4 + %16 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %18 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %17, align 8 + %20 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %22 = icmp eq ptr %21, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %22) + %23 = load i64, ptr %21, align 4 + %24 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %19, 1 + %25 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %19, i64 %23, i64 %24) + %26 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %25, 0 + %27 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %25, 1 + %28 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.SliceCopy"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, ptr %26, i64 %27, i64 1) + %29 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %29) + %30 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %31 = icmp eq ptr %30, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %31) + %32 = load i64, ptr %30, align 4 + %33 = add i64 %32, %28 + %34 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %34) + %35 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + store i64 %33, ptr %35, align 4 + %36 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %28, 0 + %37 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %36, %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %37 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).ReadAt"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, i64 %2) { @@ -652,331 +740,475 @@ _llgo_1: ; preds = %_llgo_0 ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %5 _llgo_2: ; preds = %_llgo_0 - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %7 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %6, align 8 - %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %7, 1 - %9 = icmp sge i64 %2, %8 - br i1 %9, label %_llgo_3, label %_llgo_4 + %6 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %7, align 8 + %10 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %9, 1 + %11 = icmp sge i64 %2, %10 + br i1 %11, label %_llgo_3, label %_llgo_4 _llgo_3: ; preds = %_llgo_2 - %10 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr @"github.com/goplus/llgo/cl/_testgo/reader.EOF", align 8 - %11 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } { i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef }, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %10, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %11 + %12 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr @"github.com/goplus/llgo/cl/_testgo/reader.EOF", align 8 + %13 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } { i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef }, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %12, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %13 _llgo_4: ; preds = %_llgo_2 - %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %13 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %12, align 8 - %14 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %13, 1 - %15 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %13, i64 %2, i64 %14) - %16 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %15, 0 - %17 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %15, 1 - %18 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.SliceCopy"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, ptr %16, i64 %17, i64 1) - %19 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 1 - %20 = icmp slt i64 %18, %19 - br i1 %20, label %_llgo_5, label %_llgo_6 + %14 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %16 = icmp eq ptr %15, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %15, align 8 + %18 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %17, 1 + %19 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %17, i64 %2, i64 %18) + %20 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %19, 0 + %21 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %19, 1 + %22 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.SliceCopy"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, ptr %20, i64 %21, i64 1) + %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 1 + %24 = icmp slt i64 %22, %23 + br i1 %24, label %_llgo_5, label %_llgo_6 _llgo_5: ; preds = %_llgo_4 - %21 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr @"github.com/goplus/llgo/cl/_testgo/reader.EOF", align 8 + %25 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr @"github.com/goplus/llgo/cl/_testgo/reader.EOF", align 8 br label %_llgo_6 _llgo_6: ; preds = %_llgo_5, %_llgo_4 - %22 = phi %"github.com/goplus/llgo/runtime/internal/runtime.iface" [ zeroinitializer, %_llgo_4 ], [ %21, %_llgo_5 ] - %23 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %18, 0 - %24 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %23, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %22, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %24 + %26 = phi %"github.com/goplus/llgo/runtime/internal/runtime.iface" [ zeroinitializer, %_llgo_4 ], [ %25, %_llgo_5 ] + %27 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %22, 0 + %28 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %27, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %26, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %28 } define { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).ReadByte"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 - store i64 -1, ptr %1, align 4 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %3 = load i64, ptr %2, align 4 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %5 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %4, align 8 - %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %5, 1 - %7 = icmp sge i64 %3, %6 - br i1 %7, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 + store i64 -1, ptr %2, align 4 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load i64, ptr %4, align 4 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %9 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %8, align 8 + %11 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %10, 1 + %12 = icmp sge i64 %6, %11 + br i1 %12, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %8 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr @"github.com/goplus/llgo/cl/_testgo/reader.EOF", align 8 - %9 = insertvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } { i8 0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef }, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 1 - ret { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9 + %13 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr @"github.com/goplus/llgo/cl/_testgo/reader.EOF", align 8 + %14 = insertvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } { i8 0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef }, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %13, 1 + ret { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %14 _llgo_2: ; preds = %_llgo_0 - %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %11 = load i64, ptr %10, align 4 - %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %13 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %12, align 8 - %14 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %13, 0 - %15 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %13, 1 - %16 = icmp slt i64 %11, 0 - %17 = icmp sge i64 %11, %15 - %18 = or i1 %17, %16 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %18) - %19 = getelementptr inbounds i8, ptr %14, i64 %11 - %20 = load i8, ptr %19, align 1 - %21 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %22 = load i64, ptr %21, align 4 - %23 = add i64 %22, 1 - %24 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - store i64 %23, ptr %24, align 4 - %25 = insertvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i8 %20, 0 - %26 = insertvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %25, %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, 1 - ret { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %26 + %15 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %17 = icmp eq ptr %16, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %17) + %18 = load i64, ptr %16, align 4 + %19 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %19) + %20 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %21 = icmp eq ptr %20, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %21) + %22 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %20, align 8 + %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %22, 0 + %24 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %22, 1 + %25 = icmp slt i64 %18, 0 + %26 = icmp sge i64 %18, %24 + %27 = or i1 %26, %25 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %27) + %28 = getelementptr inbounds i8, ptr %23, i64 %18 + %29 = load i8, ptr %28, align 1 + %30 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %30) + %31 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %32 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %32) + %33 = load i64, ptr %31, align 4 + %34 = add i64 %33, 1 + %35 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %35) + %36 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + store i64 %34, ptr %36, align 4 + %37 = insertvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i8 %29, 0 + %38 = insertvalue { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %37, %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, 1 + ret { i8, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %38 } define { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).ReadRune"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %2 = load i64, ptr %1, align 4 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %3, align 8 - %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %4, 1 - %6 = icmp sge i64 %2, %5 - br i1 %6, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %7 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %6, align 8 + %9 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %8, 1 + %10 = icmp sge i64 %4, %9 + br i1 %10, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 - store i64 -1, ptr %7, align 4 - %8 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr @"github.com/goplus/llgo/cl/_testgo/reader.EOF", align 8 - %9 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } { i32 0, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef }, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8, 2 - ret { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %9 + %11 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 + store i64 -1, ptr %12, align 4 + %13 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr @"github.com/goplus/llgo/cl/_testgo/reader.EOF", align 8 + %14 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } { i32 0, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef }, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %13, 2 + ret { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %14 _llgo_2: ; preds = %_llgo_0 - %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %11 = load i64, ptr %10, align 4 - %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 - store i64 %11, ptr %12, align 4 - %13 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %14 = load i64, ptr %13, align 4 - %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %16 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %15, align 8 - %17 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %16, 0 - %18 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %16, 1 - %19 = icmp slt i64 %14, 0 - %20 = icmp sge i64 %14, %18 - %21 = or i1 %20, %19 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %21) - %22 = getelementptr inbounds i8, ptr %17, i64 %14 - %23 = load i8, ptr %22, align 1 - %24 = icmp ult i8 %23, -128 - br i1 %24, label %_llgo_3, label %_llgo_4 + %15 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %17 = icmp eq ptr %16, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %17) + %18 = load i64, ptr %16, align 4 + %19 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %19) + %20 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 + store i64 %18, ptr %20, align 4 + %21 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %21) + %22 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %23 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %23) + %24 = load i64, ptr %22, align 4 + %25 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %25) + %26 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %27 = icmp eq ptr %26, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %27) + %28 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %26, align 8 + %29 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %28, 0 + %30 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %28, 1 + %31 = icmp slt i64 %24, 0 + %32 = icmp sge i64 %24, %30 + %33 = or i1 %32, %31 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %33) + %34 = getelementptr inbounds i8, ptr %29, i64 %24 + %35 = load i8, ptr %34, align 1 + %36 = icmp ult i8 %35, -128 + br i1 %36, label %_llgo_3, label %_llgo_4 _llgo_3: ; preds = %_llgo_2 - %25 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %26 = load i64, ptr %25, align 4 - %27 = add i64 %26, 1 - %28 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - store i64 %27, ptr %28, align 4 - %29 = zext i8 %23 to i32 - %30 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i32 %29, 0 - %31 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %30, i64 1, 1 - %32 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %31, %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, 2 - ret { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %32 + %37 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %37) + %38 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %39 = icmp eq ptr %38, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %39) + %40 = load i64, ptr %38, align 4 + %41 = add i64 %40, 1 + %42 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %42) + %43 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + store i64 %41, ptr %43, align 4 + %44 = zext i8 %35 to i32 + %45 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i32 %44, 0 + %46 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %45, i64 1, 1 + %47 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %46, %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, 2 + ret { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %47 _llgo_4: ; preds = %_llgo_2 - %33 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %34 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %33, align 8 - %35 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %36 = load i64, ptr %35, align 4 - %37 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %34, 1 - %38 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %34, i64 %36, i64 %37) - %39 = call { i32, i64 } @"unicode/utf8.DecodeRuneInString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %38) - %40 = extractvalue { i32, i64 } %39, 0 - %41 = extractvalue { i32, i64 } %39, 1 - %42 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %43 = load i64, ptr %42, align 4 - %44 = add i64 %43, %41 - %45 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - store i64 %44, ptr %45, align 4 - %46 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i32 %40, 0 - %47 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %46, i64 %41, 1 - %48 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %47, %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, 2 - ret { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %48 + %48 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %48) + %49 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %50 = icmp eq ptr %49, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %50) + %51 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %49, align 8 + %52 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %52) + %53 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %54 = icmp eq ptr %53, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %54) + %55 = load i64, ptr %53, align 4 + %56 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %51, 1 + %57 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %51, i64 %55, i64 %56) + %58 = call { i32, i64 } @"unicode/utf8.DecodeRuneInString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %57) + %59 = extractvalue { i32, i64 } %58, 0 + %60 = extractvalue { i32, i64 } %58, 1 + %61 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %61) + %62 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %63 = icmp eq ptr %62, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %63) + %64 = load i64, ptr %62, align 4 + %65 = add i64 %64, %60 + %66 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %66) + %67 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + store i64 %65, ptr %67, align 4 + %68 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i32 %59, 0 + %69 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %68, i64 %60, 1 + %70 = insertvalue { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %69, %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, 2 + ret { i32, i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %70 } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).Seek"(ptr %0, i64 %1, i64 %2) { _llgo_0: - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 - store i64 -1, ptr %3, align 4 - %4 = icmp eq i64 %2, 0 - br i1 %4, label %_llgo_2, label %_llgo_4 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 + store i64 -1, ptr %4, align 4 + %5 = icmp eq i64 %2, 0 + br i1 %5, label %_llgo_2, label %_llgo_4 _llgo_1: ; preds = %_llgo_5, %_llgo_3, %_llgo_2 - %5 = phi i64 [ %1, %_llgo_2 ], [ %9, %_llgo_3 ], [ %14, %_llgo_5 ] - %6 = icmp slt i64 %5, 0 - br i1 %6, label %_llgo_8, label %_llgo_9 + %6 = phi i64 [ %1, %_llgo_2 ], [ %12, %_llgo_3 ], [ %19, %_llgo_5 ] + %7 = icmp slt i64 %6, 0 + br i1 %7, label %_llgo_8, label %_llgo_9 _llgo_2: ; preds = %_llgo_0 br label %_llgo_1 _llgo_3: ; preds = %_llgo_4 - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %8 = load i64, ptr %7, align 4 - %9 = add i64 %8, %1 + %8 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %10 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = load i64, ptr %9, align 4 + %12 = add i64 %11, %1 br label %_llgo_1 _llgo_4: ; preds = %_llgo_0 - %10 = icmp eq i64 %2, 1 - br i1 %10, label %_llgo_3, label %_llgo_6 + %13 = icmp eq i64 %2, 1 + br i1 %13, label %_llgo_3, label %_llgo_6 _llgo_5: ; preds = %_llgo_6 - %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %12 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %11, align 8 - %13 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %12, 1 - %14 = add i64 %13, %1 + %14 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %16 = icmp eq ptr %15, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %15, align 8 + %18 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %17, 1 + %19 = add i64 %18, %1 br label %_llgo_1 _llgo_6: ; preds = %_llgo_4 - %15 = icmp eq i64 %2, 2 - br i1 %15, label %_llgo_5, label %_llgo_7 + %20 = icmp eq i64 %2, 2 + br i1 %20, label %_llgo_5, label %_llgo_7 _llgo_7: ; preds = %_llgo_6 - %16 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.newError"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @55, i64 34 }) - %17 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } { i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef }, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %16, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %17 + %21 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.newError"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @55, i64 34 }) + %22 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } { i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef }, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %22 _llgo_8: ; preds = %_llgo_1 - %18 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.newError"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @56, i64 37 }) - %19 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } { i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef }, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %18, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %19 + %23 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.newError"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @56, i64 37 }) + %24 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } { i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef }, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %23, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %24 _llgo_9: ; preds = %_llgo_1 - %20 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - store i64 %5, ptr %20, align 4 - %21 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %5, 0 - %22 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %21, %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %22 + %25 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %25) + %26 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + store i64 %6, ptr %26, align 4 + %27 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %6, 0 + %28 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %27, %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %28 } define i64 @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).Size"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %2 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %1, align 8 - %3 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %2, 1 - ret i64 %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %2, align 8 + %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %4, 1 + ret i64 %5 } define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).UnreadByte"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %2 = load i64, ptr %1, align 4 - %3 = icmp sle i64 %2, 0 - br i1 %3, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + %5 = icmp sle i64 %4, 0 + br i1 %5, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %4 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.newError"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @57, i64 48 }) - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4 + %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.newError"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @57, i64 48 }) + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6 _llgo_2: ; preds = %_llgo_0 - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 - store i64 -1, ptr %5, align 4 - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %7 = load i64, ptr %6, align 4 - %8 = sub i64 %7, 1 - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - store i64 %8, ptr %9, align 4 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 + store i64 -1, ptr %8, align 4 + %9 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %11 = icmp eq ptr %10, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = load i64, ptr %10, align 4 + %13 = sub i64 %12, 1 + %14 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + store i64 %13, ptr %15, align 4 ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer } define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).UnreadRune"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %2 = load i64, ptr %1, align 4 - %3 = icmp sle i64 %2, 0 - br i1 %3, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + %5 = icmp sle i64 %4, 0 + br i1 %5, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %4 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.newError"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @58, i64 49 }) - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4 + %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.newError"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @58, i64 49 }) + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6 _llgo_2: ; preds = %_llgo_0 - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 - %6 = load i64, ptr %5, align 4 - %7 = icmp slt i64 %6, 0 - br i1 %7, label %_llgo_3, label %_llgo_4 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 + %9 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = load i64, ptr %8, align 4 + %11 = icmp slt i64 %10, 0 + br i1 %11, label %_llgo_3, label %_llgo_4 _llgo_3: ; preds = %_llgo_2 - %8 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.newError"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @59, i64 62 }) - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %8 + %12 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testgo/reader.newError"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @59, i64 62 }) + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %12 _llgo_4: ; preds = %_llgo_2 - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 - %10 = load i64, ptr %9, align 4 - %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - store i64 %10, ptr %11, align 4 - %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 - store i64 -1, ptr %12, align 4 + %13 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 + %15 = icmp eq ptr %14, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = load i64, ptr %14, align 4 + %17 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %17) + %18 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + store i64 %16, ptr %18, align 4 + %19 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %19) + %20 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 + store i64 -1, ptr %20, align 4 ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer } define { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.(*stringReader).WriteTo"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 - store i64 -1, ptr %2, align 4 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %4 = load i64, ptr %3, align 4 - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %6 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %5, align 8 - %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %6, 1 - %8 = icmp sge i64 %4, %7 - br i1 %8, label %_llgo_1, label %_llgo_2 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 2 + store i64 -1, ptr %3, align 4 + %4 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load i64, ptr %5, align 4 + %8 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %10 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %9, align 8 + %12 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %11, 1 + %13 = icmp sge i64 %7, %12 + br i1 %13, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } zeroinitializer _llgo_2: ; preds = %_llgo_0 - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 - %10 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %9, align 8 - %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %12 = load i64, ptr %11, align 4 - %13 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %10, 1 - %14 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %10, i64 %12, i64 %13) - %15 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.WriteString"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %1, %"github.com/goplus/llgo/runtime/internal/runtime.String" %14) - %16 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %15, 0 - %17 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %15, 1 - %18 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %14, 1 - %19 = icmp sgt i64 %16, %18 - br i1 %19, label %_llgo_3, label %_llgo_4 + %14 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 + %16 = icmp eq ptr %15, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %15, align 8 + %18 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %20 = icmp eq ptr %19, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = load i64, ptr %19, align 4 + %22 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %17, 1 + %23 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %17, i64 %21, i64 %22) + %24 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @"github.com/goplus/llgo/cl/_testgo/reader.WriteString"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %1, %"github.com/goplus/llgo/runtime/internal/runtime.String" %23) + %25 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %24, 0 + %26 = extractvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %24, 1 + %27 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %23, 1 + %28 = icmp sgt i64 %25, %27 + br i1 %28, label %_llgo_3, label %_llgo_4 _llgo_3: ; preds = %_llgo_2 - %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @60, i64 48 }, ptr %20, align 8 - %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %21) + %29 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @60, i64 48 }, ptr %29, align 8 + %30 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %29, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %30) unreachable _llgo_4: ; preds = %_llgo_2 - %22 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - %23 = load i64, ptr %22, align 4 - %24 = add i64 %23, %16 - %25 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 - store i64 %24, ptr %25, align 4 - %26 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %14, 1 - %27 = icmp ne i64 %16, %26 - br i1 %27, label %_llgo_7, label %_llgo_6 + %31 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %31) + %32 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + %33 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %33) + %34 = load i64, ptr %32, align 4 + %35 = add i64 %34, %25 + %36 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %36) + %37 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 + store i64 %35, ptr %37, align 4 + %38 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %23, 1 + %39 = icmp ne i64 %25, %38 + br i1 %39, label %_llgo_7, label %_llgo_6 _llgo_5: ; preds = %_llgo_7 - %28 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr @"github.com/goplus/llgo/cl/_testgo/reader.ErrShortWrite", align 8 + %40 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr @"github.com/goplus/llgo/cl/_testgo/reader.ErrShortWrite", align 8 br label %_llgo_6 _llgo_6: ; preds = %_llgo_5, %_llgo_7, %_llgo_4 - %29 = phi %"github.com/goplus/llgo/runtime/internal/runtime.iface" [ %17, %_llgo_4 ], [ %17, %_llgo_7 ], [ %28, %_llgo_5 ] - %30 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %16, 0 - %31 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %30, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %29, 1 - ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %31 + %41 = phi %"github.com/goplus/llgo/runtime/internal/runtime.iface" [ %26, %_llgo_4 ], [ %26, %_llgo_7 ], [ %40, %_llgo_5 ] + %42 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } undef, i64 %25, 0 + %43 = insertvalue { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %42, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %41, 1 + ret { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } %43 _llgo_7: ; preds = %_llgo_4 - %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %17) - %33 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %17, 1 - %34 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %32, 0 - %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %34, ptr %33, 1 - %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) - %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %36, 0 - %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %37, ptr null, 1 - %39 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %35, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %38) - br i1 %39, label %_llgo_5, label %_llgo_6 + %44 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %26) + %45 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %26, 1 + %46 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %44, 0 + %47 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %46, ptr %45, 1 + %48 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) + %49 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %48, 0 + %50 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %49, ptr null, 1 + %51 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %47, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %50) + br i1 %51, label %_llgo_5, label %_llgo_6 } declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface") @@ -1028,11 +1260,15 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr, ptr) ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.structequal"(ptr, ptr, ptr) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) -declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr, ptr, ptr) + +declare %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.MakeSlice"(i64, i64, i64) declare %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr, i64, i64, i64, i64, i64) @@ -1040,6 +1276,8 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"gi declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface", %"github.com/goplus/llgo/runtime/internal/runtime.eface") +declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) + declare %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr, i64, i64) declare %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.StringToBytes"(%"github.com/goplus/llgo/runtime/internal/runtime.String") diff --git a/cl/_testgo/reflect/out.ll b/cl/_testgo/reflect/out.ll index 7db6230448..ba5dc763bc 100644 --- a/cl/_testgo/reflect/out.ll +++ b/cl/_testgo/reflect/out.ll @@ -29,7 +29,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/reflect" @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1134531106, i8 0, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 13 }, ptr @"*_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU$in", i64 1, i64 1 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU$out", i64 1, i64 1 } }, align 8 @3 = private unnamed_addr constant [13 x i8] c"func(int) int", align 1 @"*_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1763581361, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 13 }, ptr null }, ptr @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU" }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 3 }, ptr @"*_llgo_int" }, align 8 @4 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU$in" = weak_odr constant [1 x ptr] [ptr @_llgo_int], align 8 @@ -49,7 +49,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/reflect" @12 = private unnamed_addr constant [9 x i8] c"call.func", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testgo/reflect.T" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1206070585, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 6 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/reflect.T" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 41 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 3 }, ptr @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU", ptr @"github.com/goplus/llgo/cl/_testgo/reflect.(*T).Add", ptr @"github.com/goplus/llgo/cl/_testgo/reflect.(*T).Add" }] }, align 8 @13 = private unnamed_addr constant [6 x i8] c"main.T", align 1 -@"_llgo_github.com/goplus/llgo/cl/_testgo/reflect.T" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -325780477, i8 13, i8 8, i8 8, i8 57, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/reflect.T" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 6 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/reflect.T" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 41 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/reflect.struct$eovYmOhZg4X0zMSsuscSshndnbbAGvB2E3cyG8E7Y4U$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 41 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testgo/reflect.T" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -325780477, i8 13, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/reflect.T" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 6 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/reflect.T" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 41 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/reflect.struct$eovYmOhZg4X0zMSsuscSshndnbbAGvB2E3cyG8E7Y4U$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 41 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @14 = private unnamed_addr constant [41 x i8] c"github.com/goplus/llgo/cl/_testgo/reflect", align 1 @15 = private unnamed_addr constant [1 x i8] c"n", align 1 @"github.com/goplus/llgo/cl/_testgo/reflect.struct$eovYmOhZg4X0zMSsuscSshndnbbAGvB2E3cyG8E7Y4U$fields" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 1 }, ptr @_llgo_int, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @@ -87,7 +87,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/reflect" @"[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 307038632, i8 8, i8 1, i8 1, i8 17, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"[8]_llgo_uint8" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @29, i64 8 }, ptr @"*[8]_llgo_uint8" }, ptr @_llgo_uint8, ptr @"[]_llgo_uint8", i64 8 }, align 8 @29 = private unnamed_addr constant [8 x i8] c"[8]uint8", align 1 @"*[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -566230779, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @29, i64 8 }, ptr null }, ptr @"[8]_llgo_uint8" }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @30, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @30, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @30 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @30, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @"[]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 370346748, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @31, i64 7 }, ptr @"*[]_llgo_uint8" }, ptr @_llgo_uint8 }, align 8 @@ -115,19 +115,30 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/reflect" @42 = private unnamed_addr constant [4 x i8] c"todo", align 1 @43 = private unnamed_addr constant [12 x i8] c"must invalid", align 1 @44 = private unnamed_addr constant [13 x i8] c"MapIter error", align 1 +@llvm.compiler.used = appending global [1 x ptr] [ptr @"github.com/goplus/llgo/cl/_testgo/reflect.(*T).Add"], section "llvm.metadata" define i64 @"github.com/goplus/llgo/cl/_testgo/reflect.(*T).Add"(ptr %0, i64 %1) { _llgo_0: call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 11 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reflect.T", ptr %0, i32 0, i32 0 - %3 = load i64, ptr %2, align 4 - %4 = add i64 %3, %1 - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reflect.T", ptr %0, i32 0, i32 0 - store i64 %4, ptr %5, align 4 - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reflect.T", ptr %0, i32 0, i32 0 - %7 = load i64, ptr %6, align 4 - ret i64 %7 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reflect.T", ptr %0, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %3, align 4 + %6 = add i64 %5, %1 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reflect.T", ptr %0, i32 0, i32 0 + store i64 %6, ptr %8, align 4 + %9 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reflect.T", ptr %0, i32 0, i32 0 + %11 = icmp eq ptr %10, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = load i64, ptr %10, align 4 + ret i64 %12 } define void @"github.com/goplus/llgo/cl/_testgo/reflect.callClosure"() { @@ -160,55 +171,62 @@ _llgo_0: call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %17) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %19 = getelementptr inbounds %reflect.Value, ptr %18, i64 0 - %20 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 100 to ptr) }) - store %reflect.Value %20, ptr %19, align 8 - %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %18, 0 - %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %21, i64 1, 1 - %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %22, i64 1, 2 - %24 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %6, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23) - %25 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24, 0 - %26 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24, 1 - %27 = icmp sge i64 0, %26 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %27) - %28 = getelementptr inbounds %reflect.Value, ptr %25, i64 0 - %29 = load %reflect.Value, ptr %28, align 8 - %30 = call i64 @reflect.Value.Int(%reflect.Value %29) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %30) + %19 = icmp eq ptr %18, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %19) + %20 = getelementptr inbounds %reflect.Value, ptr %18, i64 0 + %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 100, ptr %21, align 4 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %21, 1 + %23 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %22) + store %reflect.Value %23, ptr %20, align 8 + %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %18, 0 + %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24, i64 1, 1 + %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %25, i64 1, 2 + %27 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %6, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %26) + %28 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %27, 0 + %29 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %27, 1 + %30 = icmp sge i64 0, %29 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %30) + %31 = getelementptr inbounds %reflect.Value, ptr %28, i64 0 + %32 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %32) + %33 = load %reflect.Value, ptr %31, align 8 + %34 = call i64 @reflect.Value.Int(%reflect.Value %33) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %34) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %31 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %6) - %32 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %31, 0 - %33 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %32) - br i1 %33, label %_llgo_3, label %_llgo_4 + %35 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %6) + %36 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %35, 0 + %37 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %36) + br i1 %37, label %_llgo_3, label %_llgo_4 _llgo_1: ; preds = %_llgo_5 - %34 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr %34, align 8 - %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %34, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %35) + %38 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr %38, align 8 + %39 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %38, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %39) unreachable _llgo_2: ; preds = %_llgo_5 - %36 = extractvalue { ptr, ptr } %44, 1 - %37 = extractvalue { ptr, ptr } %44, 0 - %38 = call i64 %37(ptr %36, i64 100) + %40 = extractvalue { ptr, ptr } %48, 1 + %41 = extractvalue { ptr, ptr } %48, 0 + %42 = call i64 %41(ptr %40, i64 100) ret void _llgo_3: ; preds = %_llgo_0 - %39 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %31, 1 - %40 = load { ptr, ptr }, ptr %39, align 8 - %41 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %40, 0 - %42 = insertvalue { { ptr, ptr }, i1 } %41, i1 true, 1 + %43 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %35, 1 + %44 = load { ptr, ptr }, ptr %43, align 8 + %45 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %44, 0 + %46 = insertvalue { { ptr, ptr }, i1 } %45, i1 true, 1 br label %_llgo_5 _llgo_4: ; preds = %_llgo_0 br label %_llgo_5 _llgo_5: ; preds = %_llgo_4, %_llgo_3 - %43 = phi { { ptr, ptr }, i1 } [ %42, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] - %44 = extractvalue { { ptr, ptr }, i1 } %43, 0 - %45 = extractvalue { { ptr, ptr }, i1 } %43, 1 - br i1 %45, label %_llgo_2, label %_llgo_1 + %47 = phi { { ptr, ptr }, i1 } [ %46, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] + %48 = extractvalue { { ptr, ptr }, i1 } %47, 0 + %49 = extractvalue { { ptr, ptr }, i1 } %47, 1 + br i1 %49, label %_llgo_2, label %_llgo_1 } define i64 @"github.com/goplus/llgo/cl/_testgo/reflect.callClosure$1"(ptr %0, i64 %1) { @@ -217,10 +235,12 @@ _llgo_0: call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) %2 = load { ptr }, ptr %0, align 8 %3 = extractvalue { ptr } %2, 0 - %4 = load i64, ptr %3, align 4 - %5 = add i64 %4, %1 - %6 = add i64 %5, 1 - ret i64 %6 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %3, align 4 + %6 = add i64 %5, %1 + %7 = add i64 %6, 1 + ret i64 %7 } define void @"github.com/goplus/llgo/cl/_testgo/reflect.callFunc"() { @@ -247,55 +267,62 @@ _llgo_0: call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %13) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %15 = getelementptr inbounds %reflect.Value, ptr %14, i64 0 - %16 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 100 to ptr) }) - store %reflect.Value %16, ptr %15, align 8 - %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %14, 0 - %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %17, i64 1, 1 - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %18, i64 1, 2 - %20 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %2, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %19) - %21 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %20, 0 - %22 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %20, 1 - %23 = icmp sge i64 0, %22 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %23) - %24 = getelementptr inbounds %reflect.Value, ptr %21, i64 0 - %25 = load %reflect.Value, ptr %24, align 8 - %26 = call i64 @reflect.Value.Int(%reflect.Value %25) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %26) + %15 = icmp eq ptr %14, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = getelementptr inbounds %reflect.Value, ptr %14, i64 0 + %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 100, ptr %17, align 4 + %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %17, 1 + %19 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %18) + store %reflect.Value %19, ptr %16, align 8 + %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %14, 0 + %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %20, i64 1, 1 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %21, i64 1, 2 + %23 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %2, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %22) + %24 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, 0 + %25 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, 1 + %26 = icmp sge i64 0, %25 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %26) + %27 = getelementptr inbounds %reflect.Value, ptr %24, i64 0 + %28 = icmp eq ptr %27, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %28) + %29 = load %reflect.Value, ptr %27, align 8 + %30 = call i64 @reflect.Value.Int(%reflect.Value %29) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %30) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %27 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %2) - %28 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %27, 0 - %29 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %28) - br i1 %29, label %_llgo_3, label %_llgo_4 + %31 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %2) + %32 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %31, 0 + %33 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %32) + br i1 %33, label %_llgo_3, label %_llgo_4 _llgo_1: ; preds = %_llgo_5 - %30 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr %30, align 8 - %31 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %30, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %31) + %34 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr %34, align 8 + %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %34, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %35) unreachable _llgo_2: ; preds = %_llgo_5 - %32 = extractvalue { ptr, ptr } %40, 1 - %33 = extractvalue { ptr, ptr } %40, 0 - %34 = call i64 %33(ptr %32, i64 100) + %36 = extractvalue { ptr, ptr } %44, 1 + %37 = extractvalue { ptr, ptr } %44, 0 + %38 = call i64 %37(ptr %36, i64 100) ret void _llgo_3: ; preds = %_llgo_0 - %35 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %27, 1 - %36 = load { ptr, ptr }, ptr %35, align 8 - %37 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %36, 0 - %38 = insertvalue { { ptr, ptr }, i1 } %37, i1 true, 1 + %39 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %31, 1 + %40 = load { ptr, ptr }, ptr %39, align 8 + %41 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %40, 0 + %42 = insertvalue { { ptr, ptr }, i1 } %41, i1 true, 1 br label %_llgo_5 _llgo_4: ; preds = %_llgo_0 br label %_llgo_5 _llgo_5: ; preds = %_llgo_4, %_llgo_3 - %39 = phi { { ptr, ptr }, i1 } [ %38, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] - %40 = extractvalue { { ptr, ptr }, i1 } %39, 0 - %41 = extractvalue { { ptr, ptr }, i1 } %39, 1 - br i1 %41, label %_llgo_2, label %_llgo_1 + %43 = phi { { ptr, ptr }, i1 } [ %42, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] + %44 = extractvalue { { ptr, ptr }, i1 } %43, 0 + %45 = extractvalue { { ptr, ptr }, i1 } %43, 1 + br i1 %45, label %_llgo_2, label %_llgo_1 } define i64 @"github.com/goplus/llgo/cl/_testgo/reflect.callFunc$1"(i64 %0) { @@ -309,199 +336,231 @@ _llgo_0: define void @"github.com/goplus/llgo/cl/_testgo/reflect.callIMethod"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reflect.T", ptr %0, i32 0, i32 0 - store i64 1, ptr %1, align 4 - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$VdBKYV8-gcMjZtZfcf-u2oKoj9Lu3VXwuG8TGCW2S4A", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/reflect.T") - %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %2, 0 - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3, ptr %0, 1 - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %4) - %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, 1 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %5, 0 - %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %7, ptr %6, 1 - %9 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %8) - %10 = call %reflect.Value @reflect.Value.Method(%reflect.Value %9, i64 0) - %11 = call i64 @reflect.Value.Kind(%reflect.Value %10) - %12 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %10) - %13 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %12) - %14 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %12, 0 - %15 = getelementptr ptr, ptr %14, i64 37 - %16 = load ptr, ptr %15, align 8 - %17 = insertvalue { ptr, ptr } undef, ptr %16, 0 - %18 = insertvalue { ptr, ptr } %17, ptr %13, 1 - %19 = extractvalue { ptr, ptr } %18, 1 - %20 = extractvalue { ptr, ptr } %18, 0 - %21 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %20(ptr %19) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reflect.T", ptr %0, i32 0, i32 0 + store i64 1, ptr %2, align 4 + %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$VdBKYV8-gcMjZtZfcf-u2oKoj9Lu3VXwuG8TGCW2S4A", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/reflect.T") + %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %3, 0 + %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %0, 1 + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %5) + %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, 1 + %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, ptr %6, 0 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %8, ptr %7, 1 + %10 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %9) + %11 = call %reflect.Value @reflect.Value.Method(%reflect.Value %10, i64 0) + %12 = call i64 @reflect.Value.Kind(%reflect.Value %11) + %13 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %11) + %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %13) + %15 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %13, 0 + %16 = getelementptr ptr, ptr %15, i64 37 + %17 = load ptr, ptr %16, align 8 + %18 = insertvalue { ptr, ptr } undef, ptr %17, 0 + %19 = insertvalue { ptr, ptr } %18, ptr %14, 1 + %20 = extractvalue { ptr, ptr } %19, 1 + %21 = extractvalue { ptr, ptr } %19, 0 + %22 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %21(ptr %20) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 7 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %11) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %12) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %21) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %22) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %23 = getelementptr inbounds %reflect.Value, ptr %22, i64 0 - %24 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 100 to ptr) }) - store %reflect.Value %24, ptr %23, align 8 - %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %22, 0 - %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %25, i64 1, 1 - %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %26, i64 1, 2 - %28 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %10, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %27) - %29 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %28, 0 - %30 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %28, 1 - %31 = icmp sge i64 0, %30 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %31) - %32 = getelementptr inbounds %reflect.Value, ptr %29, i64 0 - %33 = load %reflect.Value, ptr %32, align 8 - %34 = call i64 @reflect.Value.Int(%reflect.Value %33) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %34) + %23 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) + %24 = icmp eq ptr %23, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %24) + %25 = getelementptr inbounds %reflect.Value, ptr %23, i64 0 + %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 100, ptr %26, align 4 + %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %26, 1 + %28 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %27) + store %reflect.Value %28, ptr %25, align 8 + %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %23, 0 + %30 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %29, i64 1, 1 + %31 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %30, i64 1, 2 + %32 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %11, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %31) + %33 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %32, 0 + %34 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %32, 1 + %35 = icmp sge i64 0, %34 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %35) + %36 = getelementptr inbounds %reflect.Value, ptr %33, i64 0 + %37 = icmp eq ptr %36, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %37) + %38 = load %reflect.Value, ptr %36, align 8 + %39 = call i64 @reflect.Value.Int(%reflect.Value %38) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %39) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %35 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %10) - %36 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %35, 0 - %37 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %36) - br i1 %37, label %_llgo_3, label %_llgo_4 + %40 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %11) + %41 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %40, 0 + %42 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %41) + br i1 %42, label %_llgo_3, label %_llgo_4 _llgo_1: ; preds = %_llgo_5 - %38 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr %38, align 8 - %39 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %38, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %39) + %43 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr %43, align 8 + %44 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %43, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %44) unreachable _llgo_2: ; preds = %_llgo_5 - %40 = extractvalue { ptr, ptr } %63, 1 - %41 = extractvalue { ptr, ptr } %63, 0 - %42 = call i64 %41(ptr %40, i64 1) - %43 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %10) - %44 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %43) - %45 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %46 = getelementptr inbounds %reflect.Value, ptr %45, i64 0 - %47 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 100 to ptr) }) - store %reflect.Value %47, ptr %46, align 8 - %48 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %45, 0 - %49 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %48, i64 1, 1 - %50 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %49, i64 1, 2 - %51 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %44, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %50) - %52 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %51, 0 - %53 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %51, 1 - %54 = icmp sge i64 0, %53 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %54) - %55 = getelementptr inbounds %reflect.Value, ptr %52, i64 0 - %56 = load %reflect.Value, ptr %55, align 8 - %57 = call i64 @reflect.Value.Int(%reflect.Value %56) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %57) + %45 = extractvalue { ptr, ptr } %72, 1 + %46 = extractvalue { ptr, ptr } %72, 0 + %47 = call i64 %46(ptr %45, i64 1) + %48 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %11) + %49 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %48) + %50 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) + %51 = icmp eq ptr %50, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %51) + %52 = getelementptr inbounds %reflect.Value, ptr %50, i64 0 + %53 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 100, ptr %53, align 4 + %54 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %53, 1 + %55 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %54) + store %reflect.Value %55, ptr %52, align 8 + %56 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %50, 0 + %57 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %56, i64 1, 1 + %58 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %57, i64 1, 2 + %59 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %49, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %58) + %60 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %59, 0 + %61 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %59, 1 + %62 = icmp sge i64 0, %61 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %62) + %63 = getelementptr inbounds %reflect.Value, ptr %60, i64 0 + %64 = icmp eq ptr %63, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %64) + %65 = load %reflect.Value, ptr %63, align 8 + %66 = call i64 @reflect.Value.Int(%reflect.Value %65) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %66) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void _llgo_3: ; preds = %_llgo_0 - %58 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %35, 1 - %59 = load { ptr, ptr }, ptr %58, align 8 - %60 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %59, 0 - %61 = insertvalue { { ptr, ptr }, i1 } %60, i1 true, 1 + %67 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %40, 1 + %68 = load { ptr, ptr }, ptr %67, align 8 + %69 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %68, 0 + %70 = insertvalue { { ptr, ptr }, i1 } %69, i1 true, 1 br label %_llgo_5 _llgo_4: ; preds = %_llgo_0 br label %_llgo_5 _llgo_5: ; preds = %_llgo_4, %_llgo_3 - %62 = phi { { ptr, ptr }, i1 } [ %61, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] - %63 = extractvalue { { ptr, ptr }, i1 } %62, 0 - %64 = extractvalue { { ptr, ptr }, i1 } %62, 1 - br i1 %64, label %_llgo_2, label %_llgo_1 + %71 = phi { { ptr, ptr }, i1 } [ %70, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] + %72 = extractvalue { { ptr, ptr }, i1 } %71, 0 + %73 = extractvalue { { ptr, ptr }, i1 } %71, 1 + br i1 %73, label %_llgo_2, label %_llgo_1 } define void @"github.com/goplus/llgo/cl/_testgo/reflect.callMethod"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reflect.T", ptr %0, i32 0, i32 0 - store i64 1, ptr %1, align 4 - %2 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/reflect.T", ptr undef }, ptr %0, 1 - %3 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %2) - %4 = call %reflect.Value @reflect.Value.Method(%reflect.Value %3, i64 0) - %5 = call i64 @reflect.Value.Kind(%reflect.Value %4) - %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %4) - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %6) - %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, 0 - %9 = getelementptr ptr, ptr %8, i64 37 - %10 = load ptr, ptr %9, align 8 - %11 = insertvalue { ptr, ptr } undef, ptr %10, 0 - %12 = insertvalue { ptr, ptr } %11, ptr %7, 1 - %13 = extractvalue { ptr, ptr } %12, 1 - %14 = extractvalue { ptr, ptr } %12, 0 - %15 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %14(ptr %13) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/reflect.T", ptr %0, i32 0, i32 0 + store i64 1, ptr %2, align 4 + %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/reflect.T", ptr undef }, ptr %0, 1 + %4 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %3) + %5 = call %reflect.Value @reflect.Value.Method(%reflect.Value %4, i64 0) + %6 = call i64 @reflect.Value.Kind(%reflect.Value %5) + %7 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %5) + %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %7) + %9 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %7, 0 + %10 = getelementptr ptr, ptr %9, i64 37 + %11 = load ptr, ptr %10, align 8 + %12 = insertvalue { ptr, ptr } undef, ptr %11, 0 + %13 = insertvalue { ptr, ptr } %12, ptr %8, 1 + %14 = extractvalue { ptr, ptr } %13, 1 + %15 = extractvalue { ptr, ptr } %13, 0 + %16 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %15(ptr %14) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @19, i64 6 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %5) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %6) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %15) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %16) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %17 = getelementptr inbounds %reflect.Value, ptr %16, i64 0 - %18 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 100 to ptr) }) - store %reflect.Value %18, ptr %17, align 8 - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %16, 0 - %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %19, i64 1, 1 - %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %20, i64 1, 2 - %22 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %4, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %21) - %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %22, 0 - %24 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %22, 1 - %25 = icmp sge i64 0, %24 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %25) - %26 = getelementptr inbounds %reflect.Value, ptr %23, i64 0 - %27 = load %reflect.Value, ptr %26, align 8 - %28 = call i64 @reflect.Value.Int(%reflect.Value %27) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %28) + %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) + %18 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = getelementptr inbounds %reflect.Value, ptr %17, i64 0 + %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 100, ptr %20, align 4 + %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %20, 1 + %22 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %21) + store %reflect.Value %22, ptr %19, align 8 + %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %17, 0 + %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, i64 1, 1 + %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24, i64 1, 2 + %26 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %5, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %25) + %27 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %26, 0 + %28 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %26, 1 + %29 = icmp sge i64 0, %28 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %29) + %30 = getelementptr inbounds %reflect.Value, ptr %27, i64 0 + %31 = icmp eq ptr %30, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %31) + %32 = load %reflect.Value, ptr %30, align 8 + %33 = call i64 @reflect.Value.Int(%reflect.Value %32) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %33) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %29 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %4) - %30 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %29, 0 - %31 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %30) - br i1 %31, label %_llgo_3, label %_llgo_4 + %34 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %5) + %35 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %34, 0 + %36 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %35) + br i1 %36, label %_llgo_3, label %_llgo_4 _llgo_1: ; preds = %_llgo_5 - %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr %32, align 8 - %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %32, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %33) + %37 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr %37, align 8 + %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %37, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %38) unreachable _llgo_2: ; preds = %_llgo_5 - %34 = extractvalue { ptr, ptr } %57, 1 - %35 = extractvalue { ptr, ptr } %57, 0 - %36 = call i64 %35(ptr %34, i64 1) - %37 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %4) - %38 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %37) - %39 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %40 = getelementptr inbounds %reflect.Value, ptr %39, i64 0 - %41 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 100 to ptr) }) - store %reflect.Value %41, ptr %40, align 8 - %42 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %39, 0 - %43 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %42, i64 1, 1 - %44 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %43, i64 1, 2 - %45 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %38, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %44) - %46 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %45, 0 - %47 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %45, 1 - %48 = icmp sge i64 0, %47 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %48) - %49 = getelementptr inbounds %reflect.Value, ptr %46, i64 0 - %50 = load %reflect.Value, ptr %49, align 8 - %51 = call i64 @reflect.Value.Int(%reflect.Value %50) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %51) + %39 = extractvalue { ptr, ptr } %66, 1 + %40 = extractvalue { ptr, ptr } %66, 0 + %41 = call i64 %40(ptr %39, i64 1) + %42 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %5) + %43 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %42) + %44 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) + %45 = icmp eq ptr %44, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %45) + %46 = getelementptr inbounds %reflect.Value, ptr %44, i64 0 + %47 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 100, ptr %47, align 4 + %48 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %47, 1 + %49 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %48) + store %reflect.Value %49, ptr %46, align 8 + %50 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %44, 0 + %51 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %50, i64 1, 1 + %52 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %51, i64 1, 2 + %53 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %43, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %52) + %54 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %53, 0 + %55 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %53, 1 + %56 = icmp sge i64 0, %55 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %56) + %57 = getelementptr inbounds %reflect.Value, ptr %54, i64 0 + %58 = icmp eq ptr %57, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %58) + %59 = load %reflect.Value, ptr %57, align 8 + %60 = call i64 @reflect.Value.Int(%reflect.Value %59) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %60) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void _llgo_3: ; preds = %_llgo_0 - %52 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %29, 1 - %53 = load { ptr, ptr }, ptr %52, align 8 - %54 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %53, 0 - %55 = insertvalue { { ptr, ptr }, i1 } %54, i1 true, 1 + %61 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %34, 1 + %62 = load { ptr, ptr }, ptr %61, align 8 + %63 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %62, 0 + %64 = insertvalue { { ptr, ptr }, i1 } %63, i1 true, 1 br label %_llgo_5 _llgo_4: ; preds = %_llgo_0 br label %_llgo_5 _llgo_5: ; preds = %_llgo_4, %_llgo_3 - %56 = phi { { ptr, ptr }, i1 } [ %55, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] - %57 = extractvalue { { ptr, ptr }, i1 } %56, 0 - %58 = extractvalue { { ptr, ptr }, i1 } %56, 1 - br i1 %58, label %_llgo_2, label %_llgo_1 + %65 = phi { { ptr, ptr }, i1 } [ %64, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] + %66 = extractvalue { { ptr, ptr }, i1 } %65, 0 + %67 = extractvalue { { ptr, ptr }, i1 } %65, 1 + br i1 %67, label %_llgo_2, label %_llgo_1 } define void @"github.com/goplus/llgo/cl/_testgo/reflect.callSlice"() { @@ -510,117 +569,196 @@ _llgo_0: store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/reflect.demo", ptr null }, ptr %0, align 8 %1 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$FjMjjQr3-2iTiWyZP1IIQFOz0hUCa0OS6pEm5uVV6Pk", ptr undef }, ptr %0, 1 %2 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %1) - %3 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 1 to ptr) }) - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 288) - %5 = getelementptr inbounds %reflect.Value, ptr %4, i64 0 - store %reflect.Value %3, ptr %5, align 8 - %6 = getelementptr inbounds %reflect.Value, ptr %4, i64 1 - store %reflect.Value %3, ptr %6, align 8 - %7 = getelementptr inbounds %reflect.Value, ptr %4, i64 2 - store %reflect.Value %3, ptr %7, align 8 - %8 = getelementptr inbounds %reflect.Value, ptr %4, i64 3 - store %reflect.Value %3, ptr %8, align 8 - %9 = getelementptr inbounds %reflect.Value, ptr %4, i64 4 - store %reflect.Value %3, ptr %9, align 8 - %10 = getelementptr inbounds %reflect.Value, ptr %4, i64 5 - store %reflect.Value %3, ptr %10, align 8 - %11 = getelementptr inbounds %reflect.Value, ptr %4, i64 6 - store %reflect.Value %3, ptr %11, align 8 - %12 = getelementptr inbounds %reflect.Value, ptr %4, i64 7 - store %reflect.Value %3, ptr %12, align 8 - %13 = getelementptr inbounds %reflect.Value, ptr %4, i64 8 - store %reflect.Value %3, ptr %13, align 8 - %14 = getelementptr inbounds %reflect.Value, ptr %4, i64 9 - %15 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 1 to ptr) }) - store %reflect.Value %15, ptr %14, align 8 - %16 = getelementptr inbounds %reflect.Value, ptr %4, i64 10 - %17 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 2 to ptr) }) - store %reflect.Value %17, ptr %16, align 8 - %18 = getelementptr inbounds %reflect.Value, ptr %4, i64 11 - %19 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 3 to ptr) }) - store %reflect.Value %19, ptr %18, align 8 - %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %4, 0 - %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %20, i64 12, 1 - %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %21, i64 12, 2 - %23 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %2, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %22) - %24 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, 0 - %25 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, 1 - %26 = icmp sge i64 0, %25 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %26) - %27 = getelementptr inbounds %reflect.Value, ptr %24, i64 0 - %28 = load %reflect.Value, ptr %27, align 8 - %29 = call i64 @reflect.Value.Int(%reflect.Value %28) - %30 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, 0 - %31 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, 1 - %32 = icmp sge i64 1, %31 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %32) - %33 = getelementptr inbounds %reflect.Value, ptr %30, i64 1 - %34 = load %reflect.Value, ptr %33, align 8 - %35 = call i64 @reflect.Value.Int(%reflect.Value %34) + %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 1, ptr %3, align 4 + %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %3, 1 + %5 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %4) + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 288) + %7 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds %reflect.Value, ptr %6, i64 0 + store %reflect.Value %5, ptr %8, align 8 + %9 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds %reflect.Value, ptr %6, i64 1 + store %reflect.Value %5, ptr %10, align 8 + %11 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %reflect.Value, ptr %6, i64 2 + store %reflect.Value %5, ptr %12, align 8 + %13 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = getelementptr inbounds %reflect.Value, ptr %6, i64 3 + store %reflect.Value %5, ptr %14, align 8 + %15 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = getelementptr inbounds %reflect.Value, ptr %6, i64 4 + store %reflect.Value %5, ptr %16, align 8 + %17 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %17) + %18 = getelementptr inbounds %reflect.Value, ptr %6, i64 5 + store %reflect.Value %5, ptr %18, align 8 + %19 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %19) + %20 = getelementptr inbounds %reflect.Value, ptr %6, i64 6 + store %reflect.Value %5, ptr %20, align 8 + %21 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %21) + %22 = getelementptr inbounds %reflect.Value, ptr %6, i64 7 + store %reflect.Value %5, ptr %22, align 8 + %23 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %23) + %24 = getelementptr inbounds %reflect.Value, ptr %6, i64 8 + store %reflect.Value %5, ptr %24, align 8 + %25 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %25) + %26 = getelementptr inbounds %reflect.Value, ptr %6, i64 9 + %27 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 1, ptr %27, align 4 + %28 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %27, 1 + %29 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %28) + store %reflect.Value %29, ptr %26, align 8 + %30 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %30) + %31 = getelementptr inbounds %reflect.Value, ptr %6, i64 10 + %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 2, ptr %32, align 4 + %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %32, 1 + %34 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %33) + store %reflect.Value %34, ptr %31, align 8 + %35 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %35) + %36 = getelementptr inbounds %reflect.Value, ptr %6, i64 11 + %37 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 3, ptr %37, align 4 + %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %37, 1 + %39 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %38) + store %reflect.Value %39, ptr %36, align 8 + %40 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %6, 0 + %41 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %40, i64 12, 1 + %42 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %41, i64 12, 2 + %43 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %2, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %42) + %44 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %43, 0 + %45 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %43, 1 + %46 = icmp sge i64 0, %45 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %46) + %47 = getelementptr inbounds %reflect.Value, ptr %44, i64 0 + %48 = icmp eq ptr %47, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %48) + %49 = load %reflect.Value, ptr %47, align 8 + %50 = call i64 @reflect.Value.Int(%reflect.Value %49) + %51 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %43, 0 + %52 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %43, 1 + %53 = icmp sge i64 1, %52 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %53) + %54 = getelementptr inbounds %reflect.Value, ptr %51, i64 1 + %55 = icmp eq ptr %54, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %55) + %56 = load %reflect.Value, ptr %54, align 8 + %57 = call i64 @reflect.Value.Int(%reflect.Value %56) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @24, i64 10 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %29) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %50) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %35) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %57) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 240) - %37 = getelementptr inbounds %reflect.Value, ptr %36, i64 0 - store %reflect.Value %3, ptr %37, align 8 - %38 = getelementptr inbounds %reflect.Value, ptr %36, i64 1 - store %reflect.Value %3, ptr %38, align 8 - %39 = getelementptr inbounds %reflect.Value, ptr %36, i64 2 - store %reflect.Value %3, ptr %39, align 8 - %40 = getelementptr inbounds %reflect.Value, ptr %36, i64 3 - store %reflect.Value %3, ptr %40, align 8 - %41 = getelementptr inbounds %reflect.Value, ptr %36, i64 4 - store %reflect.Value %3, ptr %41, align 8 - %42 = getelementptr inbounds %reflect.Value, ptr %36, i64 5 - store %reflect.Value %3, ptr %42, align 8 - %43 = getelementptr inbounds %reflect.Value, ptr %36, i64 6 - store %reflect.Value %3, ptr %43, align 8 - %44 = getelementptr inbounds %reflect.Value, ptr %36, i64 7 - store %reflect.Value %3, ptr %44, align 8 - %45 = getelementptr inbounds %reflect.Value, ptr %36, i64 8 - store %reflect.Value %3, ptr %45, align 8 - %46 = getelementptr inbounds %reflect.Value, ptr %36, i64 9 - %47 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 48) - %48 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %47, i64 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 1 to ptr) }, ptr %48, align 8 - %49 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %47, i64 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 2 to ptr) }, ptr %49, align 8 - %50 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %47, i64 2 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 3 to ptr) }, ptr %50, align 8 - %51 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %47, 0 - %52 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %51, i64 3, 1 - %53 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %52, i64 3, 2 - %54 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 24) - store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %53, ptr %54, align 8 - %55 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"[]_llgo_any", ptr undef }, ptr %54, 1 - %56 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %55) - store %reflect.Value %56, ptr %46, align 8 - %57 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %36, 0 - %58 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %57, i64 10, 1 - %59 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %58, i64 10, 2 - %60 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.CallSlice(%reflect.Value %2, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %59) - %61 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %60, 0 - %62 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %60, 1 - %63 = icmp sge i64 0, %62 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %63) - %64 = getelementptr inbounds %reflect.Value, ptr %61, i64 0 - %65 = load %reflect.Value, ptr %64, align 8 - %66 = call i64 @reflect.Value.Int(%reflect.Value %65) - %67 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %60, 0 - %68 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %60, 1 - %69 = icmp sge i64 1, %68 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %69) - %70 = getelementptr inbounds %reflect.Value, ptr %67, i64 1 - %71 = load %reflect.Value, ptr %70, align 8 - %72 = call i64 @reflect.Value.Int(%reflect.Value %71) + %58 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 240) + %59 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %59) + %60 = getelementptr inbounds %reflect.Value, ptr %58, i64 0 + store %reflect.Value %5, ptr %60, align 8 + %61 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %61) + %62 = getelementptr inbounds %reflect.Value, ptr %58, i64 1 + store %reflect.Value %5, ptr %62, align 8 + %63 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %63) + %64 = getelementptr inbounds %reflect.Value, ptr %58, i64 2 + store %reflect.Value %5, ptr %64, align 8 + %65 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %65) + %66 = getelementptr inbounds %reflect.Value, ptr %58, i64 3 + store %reflect.Value %5, ptr %66, align 8 + %67 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %67) + %68 = getelementptr inbounds %reflect.Value, ptr %58, i64 4 + store %reflect.Value %5, ptr %68, align 8 + %69 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %69) + %70 = getelementptr inbounds %reflect.Value, ptr %58, i64 5 + store %reflect.Value %5, ptr %70, align 8 + %71 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %71) + %72 = getelementptr inbounds %reflect.Value, ptr %58, i64 6 + store %reflect.Value %5, ptr %72, align 8 + %73 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %73) + %74 = getelementptr inbounds %reflect.Value, ptr %58, i64 7 + store %reflect.Value %5, ptr %74, align 8 + %75 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %75) + %76 = getelementptr inbounds %reflect.Value, ptr %58, i64 8 + store %reflect.Value %5, ptr %76, align 8 + %77 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %77) + %78 = getelementptr inbounds %reflect.Value, ptr %58, i64 9 + %79 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 48) + %80 = icmp eq ptr %79, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %80) + %81 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %79, i64 0 + %82 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 1, ptr %82, align 4 + %83 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %82, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %83, ptr %81, align 8 + %84 = icmp eq ptr %79, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %84) + %85 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %79, i64 1 + %86 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 2, ptr %86, align 4 + %87 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %86, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %87, ptr %85, align 8 + %88 = icmp eq ptr %79, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %88) + %89 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %79, i64 2 + %90 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 3, ptr %90, align 4 + %91 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %90, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %91, ptr %89, align 8 + %92 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %79, 0 + %93 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %92, i64 3, 1 + %94 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %93, i64 3, 2 + %95 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 24) + store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %94, ptr %95, align 8 + %96 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"[]_llgo_any", ptr undef }, ptr %95, 1 + %97 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %96) + store %reflect.Value %97, ptr %78, align 8 + %98 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %58, 0 + %99 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %98, i64 10, 1 + %100 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %99, i64 10, 2 + %101 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.CallSlice(%reflect.Value %2, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %100) + %102 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %101, 0 + %103 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %101, 1 + %104 = icmp sge i64 0, %103 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %104) + %105 = getelementptr inbounds %reflect.Value, ptr %102, i64 0 + %106 = icmp eq ptr %105, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %106) + %107 = load %reflect.Value, ptr %105, align 8 + %108 = call i64 @reflect.Value.Int(%reflect.Value %107) + %109 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %101, 0 + %110 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %101, 1 + %111 = icmp sge i64 1, %110 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %111) + %112 = getelementptr inbounds %reflect.Value, ptr %109, i64 1 + %113 = icmp eq ptr %112, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %113) + %114 = load %reflect.Value, ptr %112, align 8 + %115 = call i64 @reflect.Value.Int(%reflect.Value %114) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @24, i64 10 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %66) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %108) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %72) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %115) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -631,7 +769,7 @@ _llgo_0: br label %_llgo_1 _llgo_1: ; preds = %_llgo_4, %_llgo_0 - %11 = phi i64 [ 0, %_llgo_0 ], [ %36, %_llgo_4 ] + %11 = phi i64 [ 0, %_llgo_0 ], [ %37, %_llgo_4 ] %12 = phi i64 [ -1, %_llgo_0 ], [ %13, %_llgo_4 ] %13 = add i64 %12, 1 %14 = icmp slt i64 %13, %10 @@ -645,35 +783,37 @@ _llgo_2: ; preds = %_llgo_1 %19 = or i1 %18, %17 call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %19) %20 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %15, i64 %13 - %21 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %20, align 8 - %22 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %21, 0 - %23 = icmp eq ptr %22, @_llgo_int - br i1 %23, label %_llgo_4, label %_llgo_5 + %21 = icmp eq ptr %20, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %21) + %22 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %20, align 8 + %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %22, 0 + %24 = icmp eq ptr %23, @_llgo_int + br i1 %24, label %_llgo_4, label %_llgo_5 _llgo_3: ; preds = %_llgo_1 - %24 = add i64 %0, %1 - %25 = add i64 %24, %2 - %26 = add i64 %25, %3 - %27 = add i64 %26, %4 - %28 = add i64 %27, %5 - %29 = add i64 %28, %6 - %30 = add i64 %29, %7 - %31 = add i64 %30, %8 - %32 = insertvalue { i64, i64 } undef, i64 %31, 0 - %33 = insertvalue { i64, i64 } %32, i64 %11, 1 - ret { i64, i64 } %33 + %25 = add i64 %0, %1 + %26 = add i64 %25, %2 + %27 = add i64 %26, %3 + %28 = add i64 %27, %4 + %29 = add i64 %28, %5 + %30 = add i64 %29, %6 + %31 = add i64 %30, %7 + %32 = add i64 %31, %8 + %33 = insertvalue { i64, i64 } undef, i64 %32, 0 + %34 = insertvalue { i64, i64 } %33, i64 %11, 1 + ret { i64, i64 } %34 _llgo_4: ; preds = %_llgo_2 - %34 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %21, 1 - %35 = ptrtoint ptr %34 to i64 - %36 = add i64 %11, %35 + %35 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %22, 1 + %36 = load i64, ptr %35, align 4 + %37 = add i64 %11, %36 br label %_llgo_1 _llgo_5: ; preds = %_llgo_2 - %37 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @25, i64 40 }, ptr %37, align 8 - %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %37, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %38) + %38 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @25, i64 40 }, ptr %38, align 8 + %39 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %38, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %39) unreachable } @@ -728,52 +868,64 @@ _llgo_1: ; preds = %_llgo_3, %_llgo_0 unreachable _llgo_2: ; preds = %_llgo_3 - %11 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 2 to ptr) }) - %12 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %6, %reflect.Value %11) - %13 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %12) - %14 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %13, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @40, i64 5 }) - %15 = xor i1 %14, true - br i1 %15, label %_llgo_4, label %_llgo_5 + %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 2, ptr %11, align 4 + %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %11, 1 + %13 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %12) + %14 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %6, %reflect.Value %13) + %15 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %14) + %16 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %15, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @40, i64 5 }) + %17 = xor i1 %16, true + br i1 %17, label %_llgo_4, label %_llgo_5 _llgo_3: ; preds = %_llgo_0 - %16 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.MapKeys(%reflect.Value %6) - %17 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %16, 1 - %18 = icmp ne i64 %17, 2 - br i1 %18, label %_llgo_1, label %_llgo_2 + %18 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.MapKeys(%reflect.Value %6) + %19 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %18, 1 + %20 = icmp ne i64 %19, 2 + br i1 %20, label %_llgo_1, label %_llgo_2 _llgo_4: ; preds = %_llgo_2 - %19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @41, i64 14 }, ptr %19, align 8 - %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %19, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %20) + %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @41, i64 14 }, ptr %21, align 8 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %21, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %22) unreachable _llgo_5: ; preds = %_llgo_2 - %21 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 2 to ptr) }) - %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 4 }, ptr %22, align 8 - %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %22, 1 - %24 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %23) - call void @reflect.Value.SetMapIndex(%reflect.Value %6, %reflect.Value %21, %reflect.Value %24) - %25 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 2 to ptr) }) - %26 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %6, %reflect.Value %25) - %27 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %26) - %28 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %27, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 4 }) - %29 = xor i1 %28, true - br i1 %29, label %_llgo_6, label %_llgo_7 + %23 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 2, ptr %23, align 4 + %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %23, 1 + %25 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %24) + %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 4 }, ptr %26, align 8 + %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %26, 1 + %28 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %27) + call void @reflect.Value.SetMapIndex(%reflect.Value %6, %reflect.Value %25, %reflect.Value %28) + %29 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 2, ptr %29, align 4 + %30 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %29, 1 + %31 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %30) + %32 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %6, %reflect.Value %31) + %33 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %32) + %34 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %33, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 4 }) + %35 = xor i1 %34, true + br i1 %35, label %_llgo_6, label %_llgo_7 _llgo_6: ; preds = %_llgo_5 - %30 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @41, i64 14 }, ptr %30, align 8 - %31 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %30, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %31) + %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @41, i64 14 }, ptr %36, align 8 + %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %36, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %37) unreachable _llgo_7: ; preds = %_llgo_5 - %32 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr null }) - %33 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %6, %reflect.Value %32) - %34 = call i1 @reflect.Value.IsValid(%reflect.Value %33) - br i1 %34, label %_llgo_8, label %_llgo_9 + %38 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 0, ptr %38, align 4 + %39 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %38, 1 + %40 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %39) + %41 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %6, %reflect.Value %40) + %42 = call i1 @reflect.Value.IsValid(%reflect.Value %41) + br i1 %42, label %_llgo_8, label %_llgo_9 _llgo_8: ; preds = %_llgo_7 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @43, i64 12 }) @@ -781,144 +933,165 @@ _llgo_8: ; preds = %_llgo_7 br label %_llgo_9 _llgo_9: ; preds = %_llgo_8, %_llgo_7 - %35 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %6) - %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %35) - %37 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %35, 0 - %38 = getelementptr ptr, ptr %37, i64 20 - %39 = load ptr, ptr %38, align 8 - %40 = insertvalue { ptr, ptr } undef, ptr %39, 0 - %41 = insertvalue { ptr, ptr } %40, ptr %36, 1 - %42 = extractvalue { ptr, ptr } %41, 1 - %43 = extractvalue { ptr, ptr } %41, 0 - %44 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" %43(ptr %42) - %45 = call %reflect.Value @reflect.New(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %44) - %46 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %45) - %47 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %6) - %48 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %47) - %49 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %47, 0 - %50 = getelementptr ptr, ptr %49, i64 11 - %51 = load ptr, ptr %50, align 8 - %52 = insertvalue { ptr, ptr } undef, ptr %51, 0 - %53 = insertvalue { ptr, ptr } %52, ptr %48, 1 - %54 = extractvalue { ptr, ptr } %53, 1 - %55 = extractvalue { ptr, ptr } %53, 0 - %56 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" %55(ptr %54) - %57 = call %reflect.Value @reflect.New(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %56) - %58 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %57) - %59 = call ptr @reflect.Value.MapRange(%reflect.Value %6) + %43 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %6) + %44 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %43) + %45 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %43, 0 + %46 = getelementptr ptr, ptr %45, i64 20 + %47 = load ptr, ptr %46, align 8 + %48 = insertvalue { ptr, ptr } undef, ptr %47, 0 + %49 = insertvalue { ptr, ptr } %48, ptr %44, 1 + %50 = extractvalue { ptr, ptr } %49, 1 + %51 = extractvalue { ptr, ptr } %49, 0 + %52 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" %51(ptr %50) + %53 = call %reflect.Value @reflect.New(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %52) + %54 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %53) + %55 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %6) + %56 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %55) + %57 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %55, 0 + %58 = getelementptr ptr, ptr %57, i64 11 + %59 = load ptr, ptr %58, align 8 + %60 = insertvalue { ptr, ptr } undef, ptr %59, 0 + %61 = insertvalue { ptr, ptr } %60, ptr %56, 1 + %62 = extractvalue { ptr, ptr } %61, 1 + %63 = extractvalue { ptr, ptr } %61, 0 + %64 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" %63(ptr %62) + %65 = call %reflect.Value @reflect.New(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %64) + %66 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %65) + %67 = call ptr @reflect.Value.MapRange(%reflect.Value %6) br label %_llgo_12 _llgo_10: ; preds = %_llgo_12 - call void @reflect.Value.SetIterKey(%reflect.Value %46, ptr %59) - call void @reflect.Value.SetIterValue(%reflect.Value %58, ptr %59) - %60 = call i64 @reflect.Value.Int(%reflect.Value %46) - %61 = call %reflect.Value @"reflect.(*MapIter).Key"(ptr %59) - %62 = call i64 @reflect.Value.Int(%reflect.Value %61) - %63 = icmp ne i64 %60, %62 - br i1 %63, label %_llgo_13, label %_llgo_14 + call void @reflect.Value.SetIterKey(%reflect.Value %54, ptr %67) + call void @reflect.Value.SetIterValue(%reflect.Value %66, ptr %67) + %68 = call i64 @reflect.Value.Int(%reflect.Value %54) + %69 = call %reflect.Value @"reflect.(*MapIter).Key"(ptr %67) + %70 = call i64 @reflect.Value.Int(%reflect.Value %69) + %71 = icmp ne i64 %68, %70 + br i1 %71, label %_llgo_13, label %_llgo_14 _llgo_11: ; preds = %_llgo_12 ret void _llgo_12: ; preds = %_llgo_14, %_llgo_9 - %64 = call i1 @"reflect.(*MapIter).Next"(ptr %59) - br i1 %64, label %_llgo_10, label %_llgo_11 + %72 = call i1 @"reflect.(*MapIter).Next"(ptr %67) + br i1 %72, label %_llgo_10, label %_llgo_11 _llgo_13: ; preds = %_llgo_14, %_llgo_10 - %65 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @44, i64 13 }, ptr %65, align 8 - %66 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %65, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %66) + %73 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @44, i64 13 }, ptr %73, align 8 + %74 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %73, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %74) unreachable _llgo_14: ; preds = %_llgo_10 - %67 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %58) - %68 = call %reflect.Value @"reflect.(*MapIter).Value"(ptr %59) - %69 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %68) - %70 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %67, %"github.com/goplus/llgo/runtime/internal/runtime.String" %69) - %71 = xor i1 %70, true - br i1 %71, label %_llgo_13, label %_llgo_12 + %75 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %66) + %76 = call %reflect.Value @"reflect.(*MapIter).Value"(ptr %67) + %77 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %76) + %78 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %75, %"github.com/goplus/llgo/runtime/internal/runtime.String" %77) + %79 = xor i1 %78, true + br i1 %79, label %_llgo_13, label %_llgo_12 } define void @"github.com/goplus/llgo/cl/_testgo/reflect.mapDemo2"() { _llgo_0: - %0 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.TypeOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr null }) - %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, ptr %1, align 8 - %2 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %1, 1 - %3 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.TypeOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %2) - %4 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.MapOf(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %0, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3) - %5 = call %reflect.Value @reflect.MakeMap(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %4) - %6 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 1 to ptr) }) - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @39, i64 5 }, ptr %7, align 8 - %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %7, 1 - %9 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %8) - call void @reflect.Value.SetMapIndex(%reflect.Value %5, %reflect.Value %6, %reflect.Value %9) - %10 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 2 to ptr) }) + %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 0, ptr %0, align 4 + %1 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %0, 1 + %2 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.TypeOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %1) + %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, ptr %3, align 8 + %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 + %5 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.TypeOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %4) + %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.MapOf(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %2, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5) + %7 = call %reflect.Value @reflect.MakeMap(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %6) + %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 1, ptr %8, align 4 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %8, 1 + %10 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %9) %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @40, i64 5 }, ptr %11, align 8 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @39, i64 5 }, ptr %11, align 8 %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %11, 1 %13 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %12) - call void @reflect.Value.SetMapIndex(%reflect.Value %5, %reflect.Value %10, %reflect.Value %13) - %14 = call i64 @reflect.Value.Len(%reflect.Value %5) - %15 = icmp ne i64 %14, 2 - br i1 %15, label %_llgo_1, label %_llgo_3 + call void @reflect.Value.SetMapIndex(%reflect.Value %7, %reflect.Value %10, %reflect.Value %13) + %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 2, ptr %14, align 4 + %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %14, 1 + %16 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %15) + %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @40, i64 5 }, ptr %17, align 8 + %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %17, 1 + %19 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %18) + call void @reflect.Value.SetMapIndex(%reflect.Value %7, %reflect.Value %16, %reflect.Value %19) + %20 = call i64 @reflect.Value.Len(%reflect.Value %7) + %21 = icmp ne i64 %20, 2 + br i1 %21, label %_llgo_1, label %_llgo_3 _llgo_1: ; preds = %_llgo_3, %_llgo_0 - %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr %16, align 8 - %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %16, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %17) + %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr %22, align 8 + %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %22, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %23) unreachable _llgo_2: ; preds = %_llgo_3 - %18 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 2 to ptr) }) - %19 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %5, %reflect.Value %18) - %20 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %19) - %21 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %20, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @40, i64 5 }) - %22 = xor i1 %21, true - br i1 %22, label %_llgo_4, label %_llgo_5 + %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 2, ptr %24, align 4 + %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %24, 1 + %26 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %25) + %27 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %7, %reflect.Value %26) + %28 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %27) + %29 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %28, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @40, i64 5 }) + %30 = xor i1 %29, true + br i1 %30, label %_llgo_4, label %_llgo_5 _llgo_3: ; preds = %_llgo_0 - %23 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.MapKeys(%reflect.Value %5) - %24 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, 1 - %25 = icmp ne i64 %24, 2 - br i1 %25, label %_llgo_1, label %_llgo_2 + %31 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @reflect.Value.MapKeys(%reflect.Value %7) + %32 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %31, 1 + %33 = icmp ne i64 %32, 2 + br i1 %33, label %_llgo_1, label %_llgo_2 _llgo_4: ; preds = %_llgo_2 - %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @41, i64 14 }, ptr %26, align 8 - %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %26, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %27) + %34 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @41, i64 14 }, ptr %34, align 8 + %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %34, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %35) unreachable _llgo_5: ; preds = %_llgo_2 - %28 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 2 to ptr) }) - %29 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 4 }, ptr %29, align 8 - %30 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %29, 1 - %31 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %30) - call void @reflect.Value.SetMapIndex(%reflect.Value %5, %reflect.Value %28, %reflect.Value %31) - %32 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 2 to ptr) }) - %33 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %5, %reflect.Value %32) - %34 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %33) - %35 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %34, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 4 }) - %36 = xor i1 %35, true - br i1 %36, label %_llgo_6, label %_llgo_7 + %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 2, ptr %36, align 4 + %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %36, 1 + %38 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %37) + %39 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 4 }, ptr %39, align 8 + %40 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %39, 1 + %41 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %40) + call void @reflect.Value.SetMapIndex(%reflect.Value %7, %reflect.Value %38, %reflect.Value %41) + %42 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 2, ptr %42, align 4 + %43 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %42, 1 + %44 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %43) + %45 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %7, %reflect.Value %44) + %46 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %45) + %47 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %46, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 4 }) + %48 = xor i1 %47, true + br i1 %48, label %_llgo_6, label %_llgo_7 _llgo_6: ; preds = %_llgo_5 - %37 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @41, i64 14 }, ptr %37, align 8 - %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %37, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %38) + %49 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @41, i64 14 }, ptr %49, align 8 + %50 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %49, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %50) unreachable _llgo_7: ; preds = %_llgo_5 - %39 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr null }) - %40 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %5, %reflect.Value %39) - %41 = call i1 @reflect.Value.IsValid(%reflect.Value %40) - br i1 %41, label %_llgo_8, label %_llgo_9 + %51 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 0, ptr %51, align 4 + %52 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %51, 1 + %53 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %52) + %54 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %7, %reflect.Value %53) + %55 = call i1 @reflect.Value.IsValid(%reflect.Value %54) + br i1 %55, label %_llgo_8, label %_llgo_9 _llgo_8: ; preds = %_llgo_7 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @43, i64 12 }) @@ -926,69 +1099,71 @@ _llgo_8: ; preds = %_llgo_7 br label %_llgo_9 _llgo_9: ; preds = %_llgo_8, %_llgo_7 - %42 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %5) - %43 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %42) - %44 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %42, 0 - %45 = getelementptr ptr, ptr %44, i64 20 - %46 = load ptr, ptr %45, align 8 - %47 = insertvalue { ptr, ptr } undef, ptr %46, 0 - %48 = insertvalue { ptr, ptr } %47, ptr %43, 1 - %49 = extractvalue { ptr, ptr } %48, 1 - %50 = extractvalue { ptr, ptr } %48, 0 - %51 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" %50(ptr %49) - %52 = call %reflect.Value @reflect.New(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %51) - %53 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %52) - %54 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %5) - %55 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %54) - %56 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %54, 0 - %57 = getelementptr ptr, ptr %56, i64 11 - %58 = load ptr, ptr %57, align 8 - %59 = insertvalue { ptr, ptr } undef, ptr %58, 0 - %60 = insertvalue { ptr, ptr } %59, ptr %55, 1 - %61 = extractvalue { ptr, ptr } %60, 1 - %62 = extractvalue { ptr, ptr } %60, 0 - %63 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" %62(ptr %61) - %64 = call %reflect.Value @reflect.New(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %63) - %65 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %64) - %66 = call ptr @reflect.Value.MapRange(%reflect.Value %5) + %56 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %7) + %57 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %56) + %58 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %56, 0 + %59 = getelementptr ptr, ptr %58, i64 20 + %60 = load ptr, ptr %59, align 8 + %61 = insertvalue { ptr, ptr } undef, ptr %60, 0 + %62 = insertvalue { ptr, ptr } %61, ptr %57, 1 + %63 = extractvalue { ptr, ptr } %62, 1 + %64 = extractvalue { ptr, ptr } %62, 0 + %65 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" %64(ptr %63) + %66 = call %reflect.Value @reflect.New(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %65) + %67 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %66) + %68 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %7) + %69 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %68) + %70 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %68, 0 + %71 = getelementptr ptr, ptr %70, i64 11 + %72 = load ptr, ptr %71, align 8 + %73 = insertvalue { ptr, ptr } undef, ptr %72, 0 + %74 = insertvalue { ptr, ptr } %73, ptr %69, 1 + %75 = extractvalue { ptr, ptr } %74, 1 + %76 = extractvalue { ptr, ptr } %74, 0 + %77 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" %76(ptr %75) + %78 = call %reflect.Value @reflect.New(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %77) + %79 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %78) + %80 = call ptr @reflect.Value.MapRange(%reflect.Value %7) br label %_llgo_12 _llgo_10: ; preds = %_llgo_12 - call void @reflect.Value.SetIterKey(%reflect.Value %53, ptr %66) - call void @reflect.Value.SetIterValue(%reflect.Value %65, ptr %66) - %67 = call i64 @reflect.Value.Int(%reflect.Value %53) - %68 = call %reflect.Value @"reflect.(*MapIter).Key"(ptr %66) - %69 = call i64 @reflect.Value.Int(%reflect.Value %68) - %70 = icmp ne i64 %67, %69 - br i1 %70, label %_llgo_13, label %_llgo_14 + call void @reflect.Value.SetIterKey(%reflect.Value %67, ptr %80) + call void @reflect.Value.SetIterValue(%reflect.Value %79, ptr %80) + %81 = call i64 @reflect.Value.Int(%reflect.Value %67) + %82 = call %reflect.Value @"reflect.(*MapIter).Key"(ptr %80) + %83 = call i64 @reflect.Value.Int(%reflect.Value %82) + %84 = icmp ne i64 %81, %83 + br i1 %84, label %_llgo_13, label %_llgo_14 _llgo_11: ; preds = %_llgo_12 ret void _llgo_12: ; preds = %_llgo_14, %_llgo_9 - %71 = call i1 @"reflect.(*MapIter).Next"(ptr %66) - br i1 %71, label %_llgo_10, label %_llgo_11 + %85 = call i1 @"reflect.(*MapIter).Next"(ptr %80) + br i1 %85, label %_llgo_10, label %_llgo_11 _llgo_13: ; preds = %_llgo_14, %_llgo_10 - %72 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @44, i64 13 }, ptr %72, align 8 - %73 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %72, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %73) + %86 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @44, i64 13 }, ptr %86, align 8 + %87 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %86, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %87) unreachable _llgo_14: ; preds = %_llgo_10 - %74 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %65) - %75 = call %reflect.Value @"reflect.(*MapIter).Value"(ptr %66) - %76 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %75) - %77 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %74, %"github.com/goplus/llgo/runtime/internal/runtime.String" %76) - %78 = xor i1 %77, true - br i1 %78, label %_llgo_13, label %_llgo_12 + %88 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %79) + %89 = call %reflect.Value @"reflect.(*MapIter).Value"(ptr %80) + %90 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %89) + %91 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %88, %"github.com/goplus/llgo/runtime/internal/runtime.String" %90) + %92 = xor i1 %91, true + br i1 %92, label %_llgo_13, label %_llgo_12 } declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String") declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) diff --git a/cl/_testgo/reflectfn/out.ll b/cl/_testgo/reflectfn/out.ll index 5d229b8573..f8e8662327 100644 --- a/cl/_testgo/reflectfn/out.ll +++ b/cl/_testgo/reflectfn/out.ll @@ -58,74 +58,86 @@ _llgo_0: store ptr %0, ptr %2, align 8 %3 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/reflectfn.main$1", ptr undef }, ptr %1, 1 %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %5 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %4, i64 0 - %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store { ptr, ptr } %3, ptr %6, align 8 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %6, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %7, ptr %5, align 8 - %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %4, 0 - %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, i64 1, 1 - %10 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9, i64 1, 2 - %11 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @fmt.Println(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %10) - %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %13 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %12, i64 0 - %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/reflectfn.demo", ptr null }, ptr %14, align 8 - %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %14, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %15, ptr %13, align 8 - %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %12, 0 - %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %16, i64 1, 1 - %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %17, i64 1, 2 - %19 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @fmt.Println(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %18) - %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %21 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %20, i64 0 - %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/reflectfn.demo", ptr null }, ptr %22, align 8 - %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %22, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %23, ptr %21, align 8 - %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %20, 0 - %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24, i64 1, 1 - %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %25, i64 1, 2 - %27 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @fmt.Println(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %26) - %28 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store { ptr, ptr } %3, ptr %28, align 8 - %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %28, 1 - %30 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %29) - %31 = call ptr @reflect.Value.UnsafePointer(%reflect.Value %30) - %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %33 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %32, i64 0 - %34 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %31, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %34, ptr %33, align 8 - %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %32, 0 - %36 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %35, i64 1, 1 - %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %36, i64 1, 2 - %38 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @fmt.Println(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %37) - %39 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/reflectfn.demo", ptr null }, ptr %39, align 8 - %40 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %39, 1 - %41 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %40) - %42 = call ptr @reflect.Value.UnsafePointer(%reflect.Value %41) - %43 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %44 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %43, i64 0 - %45 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %42, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %45, ptr %44, align 8 - %46 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %43, 0 - %47 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %46, i64 1, 1 - %48 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %47, i64 1, 2 - %49 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @fmt.Println(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %48) - %50 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/reflectfn.demo", ptr null }, ptr %50, align 8 - %51 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %50, 1 - %52 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %51) - %53 = call ptr @reflect.Value.UnsafePointer(%reflect.Value %52) - %54 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %55 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %54, i64 0 - %56 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %53, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %56, ptr %55, align 8 - %57 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %54, 0 - %58 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %57, i64 1, 1 - %59 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %58, i64 1, 2 - %60 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @fmt.Println(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %59) + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %4, i64 0 + %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store { ptr, ptr } %3, ptr %7, align 8 + %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %7, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %8, ptr %6, align 8 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %4, 0 + %10 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9, i64 1, 1 + %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %10, i64 1, 2 + %12 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @fmt.Println(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11) + %13 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %14 = icmp eq ptr %13, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %13, i64 0 + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/reflectfn.demo", ptr null }, ptr %16, align 8 + %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %16, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %17, ptr %15, align 8 + %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %13, 0 + %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %18, i64 1, 1 + %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %19, i64 1, 2 + %21 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @fmt.Println(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %20) + %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %23 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %23) + %24 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %22, i64 0 + %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/reflectfn.demo", ptr null }, ptr %25, align 8 + %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %25, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %26, ptr %24, align 8 + %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %22, 0 + %28 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %27, i64 1, 1 + %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %28, i64 1, 2 + %30 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @fmt.Println(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %29) + %31 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store { ptr, ptr } %3, ptr %31, align 8 + %32 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %31, 1 + %33 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %32) + %34 = call ptr @reflect.Value.UnsafePointer(%reflect.Value %33) + %35 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %36 = icmp eq ptr %35, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %36) + %37 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %35, i64 0 + %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %34, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %38, ptr %37, align 8 + %39 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %35, 0 + %40 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %39, i64 1, 1 + %41 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %40, i64 1, 2 + %42 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @fmt.Println(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %41) + %43 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/reflectfn.demo", ptr null }, ptr %43, align 8 + %44 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %43, 1 + %45 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %44) + %46 = call ptr @reflect.Value.UnsafePointer(%reflect.Value %45) + %47 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %48 = icmp eq ptr %47, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %48) + %49 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %47, i64 0 + %50 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %46, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %50, ptr %49, align 8 + %51 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %47, 0 + %52 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %51, i64 1, 1 + %53 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %52, i64 1, 2 + %54 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @fmt.Println(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %53) + %55 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/reflectfn.demo", ptr null }, ptr %55, align 8 + %56 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %55, 1 + %57 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %56) + %58 = call ptr @reflect.Value.UnsafePointer(%reflect.Value %57) + %59 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %60 = icmp eq ptr %59, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %60) + %61 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %59, i64 0 + %62 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %58, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %62, ptr %61, align 8 + %63 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %59, 0 + %64 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %63, i64 1, 1 + %65 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %64, i64 1, 2 + %66 = call { i64, %"github.com/goplus/llgo/runtime/internal/runtime.iface" } @fmt.Println(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %65) ret void } @@ -133,8 +145,10 @@ define void @"github.com/goplus/llgo/cl/_testgo/reflectfn.main$1"(ptr %0) { _llgo_0: %1 = load { ptr }, ptr %0, align 8 %2 = extractvalue { ptr } %1, 0 - %3 = load i64, ptr %2, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %3) + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %4) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -151,6 +165,8 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequalptr"(ptr, ptr) define linkonce i1 @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr"(ptr %0, ptr %1, ptr %2) { diff --git a/cl/_testgo/reflectmkfn/out.ll b/cl/_testgo/reflectmkfn/out.ll index b620b7806d..ef94fc237a 100644 --- a/cl/_testgo/reflectmkfn/out.ll +++ b/cl/_testgo/reflectmkfn/out.ll @@ -16,7 +16,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/reflectmkfn" @_llgo_string = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 8, i32 1749264893, i8 4, i8 8, i8 8, i8 24, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.strequal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 6 }, ptr @"*_llgo_string" }, align 8 @0 = private unnamed_addr constant [6 x i8] c"string", align 1 @"*_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1323879264, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 6 }, ptr null }, ptr @_llgo_string }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr @"*_llgo_int" }, align 8 @1 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"_llgo_closure$XBbb2Vd9fa-WWUcWFPjreitD8Eex4qtMIsPbz__3VQU" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 16, i32 -1385668625, i8 32, i8 8, i8 8, i8 25, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 60 }, ptr @"*_llgo_closure$XBbb2Vd9fa-WWUcWFPjreitD8Eex4qtMIsPbz__3VQU" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_closure$XBbb2Vd9fa-WWUcWFPjreitD8Eex4qtMIsPbz__3VQU$fields", i64 2, i64 2 } }, align 8 @@ -56,60 +56,69 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testgo/reflectmkfn.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %1 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %0, i64 0 - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, ptr %2, align 8 - %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2, 1 - %4 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.TypeOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %3) - store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %1, align 8 - %5 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %0, i64 1 - %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.TypeOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr null }) - store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6, ptr %5, align 8 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 - %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, i64 2, 1 - %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, i64 2, 2 - %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %11 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %10, i64 0 - %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, ptr %12, align 8 - %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %12, 1 - %14 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.TypeOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %13) - store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %14, ptr %11, align 8 - %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %10, 0 - %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %15, i64 1, 1 - %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %16, i64 1, 2 - %18 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.FuncOf(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %17, i1 false) - %19 = call %reflect.Value @reflect.MakeFunc(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %18, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/reflectmkfn.main$1", ptr null }) - %20 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %19) - %21 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %20, 0 - %22 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$XBbb2Vd9fa-WWUcWFPjreitD8Eex4qtMIsPbz__3VQU", ptr %21) - br i1 %22, label %_llgo_3, label %_llgo_4 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %0, i64 0 + %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, ptr %3, align 8 + %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 + %5 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.TypeOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %4) + store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, ptr %2, align 8 + %6 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %0, i64 1 + %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 0, ptr %8, align 4 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %8, 1 + %10 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.TypeOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %9) + store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %10, ptr %7, align 8 + %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 + %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, i64 2, 1 + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %12, i64 2, 2 + %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %15 = icmp eq ptr %14, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %14, i64 0 + %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, ptr %17, align 8 + %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %17, 1 + %19 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.TypeOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %18) + store %"github.com/goplus/llgo/runtime/internal/runtime.iface" %19, ptr %16, align 8 + %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %14, 0 + %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %20, i64 1, 1 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %21, i64 1, 2 + %23 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.FuncOf(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %13, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %22, i1 false) + %24 = call %reflect.Value @reflect.MakeFunc(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %23, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/reflectmkfn.main$1", ptr null }) + %25 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %24) + %26 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %25, 0 + %27 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$XBbb2Vd9fa-WWUcWFPjreitD8Eex4qtMIsPbz__3VQU", ptr %26) + br i1 %27, label %_llgo_3, label %_llgo_4 _llgo_1: ; preds = %_llgo_3 - %23 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 5 }, ptr %23, align 8 - %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %23, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %24) + %28 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 5 }, ptr %28, align 8 + %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %28, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %29) unreachable _llgo_2: ; preds = %_llgo_3 ret void _llgo_3: ; preds = %_llgo_0 - %25 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %20, 1 - %26 = load { ptr, ptr }, ptr %25, align 8 - %27 = extractvalue { ptr, ptr } %26, 1 - %28 = extractvalue { ptr, ptr } %26, 0 - %29 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %28(ptr %27, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 3 }, i64 2) - %30 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %29, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 6 }) - %31 = xor i1 %30, true - br i1 %31, label %_llgo_1, label %_llgo_2 + %30 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %25, 1 + %31 = load { ptr, ptr }, ptr %30, align 8 + %32 = extractvalue { ptr, ptr } %31, 1 + %33 = extractvalue { ptr, ptr } %31, 0 + %34 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %33(ptr %32, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 3 }, i64 2) + %35 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %34, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 6 }) + %36 = xor i1 %35, true + br i1 %36, label %_llgo_1, label %_llgo_2 _llgo_4: ; preds = %_llgo_0 - %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 94 }, ptr %32, align 8 - %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %32, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %33) + %37 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 94 }, ptr %37, align 8 + %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %37, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %38) unreachable } @@ -120,27 +129,33 @@ _llgo_0: %3 = icmp sge i64 0, %2 call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %3) %4 = getelementptr inbounds %reflect.Value, ptr %1, i64 0 - %5 = load %reflect.Value, ptr %4, align 8 - %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %5) - %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %0, 0 - %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %0, 1 - %9 = icmp sge i64 1, %8 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %9) - %10 = getelementptr inbounds %reflect.Value, ptr %7, i64 1 - %11 = load %reflect.Value, ptr %10, align 8 - %12 = call i64 @reflect.Value.Int(%reflect.Value %11) - %13 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @strings.Repeat(%"github.com/goplus/llgo/runtime/internal/runtime.String" %6, i64 %12) - %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %15 = getelementptr inbounds %reflect.Value, ptr %14, i64 0 - %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" %13, ptr %16, align 8 - %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %16, 1 - %18 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %17) - store %reflect.Value %18, ptr %15, align 8 - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %14, 0 - %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %19, i64 1, 1 - %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %20, i64 1, 2 - ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %21 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load %reflect.Value, ptr %4, align 8 + %7 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %6) + %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %0, 0 + %9 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %0, 1 + %10 = icmp sge i64 1, %9 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %10) + %11 = getelementptr inbounds %reflect.Value, ptr %8, i64 1 + %12 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = load %reflect.Value, ptr %11, align 8 + %14 = call i64 @reflect.Value.Int(%reflect.Value %13) + %15 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @strings.Repeat(%"github.com/goplus/llgo/runtime/internal/runtime.String" %7, i64 %14) + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) + %17 = icmp eq ptr %16, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %17) + %18 = getelementptr inbounds %reflect.Value, ptr %16, i64 0 + %19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" %15, ptr %19, align 8 + %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %19, 1 + %21 = call %reflect.Value @reflect.ValueOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %20) + store %reflect.Value %21, ptr %18, align 8 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %16, 0 + %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %22, i64 1, 1 + %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, i64 1, 2 + ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24 } declare void @reflect.init() @@ -149,6 +164,8 @@ declare void @strings.init() declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare %"github.com/goplus/llgo/runtime/internal/runtime.iface" @reflect.TypeOf(%"github.com/goplus/llgo/runtime/internal/runtime.eface") declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.strequal"(ptr, ptr) diff --git a/cl/_testgo/returnorder/out.ll b/cl/_testgo/returnorder/out.ll index 07635e5ad9..ccddfbfd17 100644 --- a/cl/_testgo/returnorder/out.ll +++ b/cl/_testgo/returnorder/out.ll @@ -9,7 +9,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/returnorder" %"github.com/goplus/llgo/runtime/internal/runtime.Slice" = type { ptr, i64, i64 } @"github.com/goplus/llgo/cl/_testgo/returnorder.init$guard" = global i1 false, align 1 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 3 }, ptr @"*_llgo_int" }, align 8 @0 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @1 = private unnamed_addr constant [46 x i8] c"return order mismatch: got (%d,%d), want (2,2)", align 1 @@ -17,6 +17,7 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/returnorder" @2 = private unnamed_addr constant [6 x i8] c"string", align 1 @"*_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1323879264, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 6 }, ptr null }, ptr @_llgo_string }, align 8 @3 = private unnamed_addr constant [2 x i8] c"ok", align 1 +@llvm.compiler.used = appending global [1 x ptr] [ptr @"github.com/goplus/llgo/cl/_testgo/returnorder.(*state).mutate"], section "llvm.metadata" define void @"github.com/goplus/llgo/cl/_testgo/returnorder.init"() { _llgo_0: @@ -40,31 +41,47 @@ _llgo_0: %2 = extractvalue { %"github.com/goplus/llgo/cl/_testgo/returnorder.state", i64 } %1, 0 store %"github.com/goplus/llgo/cl/_testgo/returnorder.state" %2, ptr %0, align 4 %3 = extractvalue { %"github.com/goplus/llgo/cl/_testgo/returnorder.state", i64 } %1, 1 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/returnorder.state", ptr %0, i32 0, i32 0 - %5 = load i64, ptr %4, align 4 - %6 = icmp ne i64 %5, 2 - br i1 %6, label %_llgo_1, label %_llgo_3 + %4 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/returnorder.state", ptr %0, i32 0, i32 0 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load i64, ptr %5, align 4 + %8 = icmp ne i64 %7, 2 + br i1 %8, label %_llgo_1, label %_llgo_3 _llgo_1: ; preds = %_llgo_3, %_llgo_0 - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/returnorder.state", ptr %0, i32 0, i32 0 - %8 = load i64, ptr %7, align 4 - %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %10 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %9, i64 0 - %11 = inttoptr i64 %8 to ptr - %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %11, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %12, ptr %10, align 8 - %13 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %9, i64 1 - %14 = inttoptr i64 %3 to ptr - %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %14, 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %15, ptr %13, align 8 - %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %9, 0 - %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %16, i64 2, 1 - %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %17, i64 2, 2 - %19 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @fmt.Sprintf(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 46 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %18) - %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" %19, ptr %20, align 8 - %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %21) + %9 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/returnorder.state", ptr %0, i32 0, i32 0 + %11 = icmp eq ptr %10, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = load i64, ptr %10, align 4 + %13 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) + %14 = icmp eq ptr %13, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %13, i64 0 + %16 = icmp eq ptr %10, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @_llgo_int, ptr %17, ptr %10) + %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %17, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %18, ptr %15, align 8 + %19 = icmp eq ptr %13, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %19) + %20 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %13, i64 1 + %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 %3, ptr %21, align 4 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %21, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %22, ptr %20, align 8 + %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %13, 0 + %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, i64 2, 1 + %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24, i64 2, 2 + %26 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @fmt.Sprintf(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 46 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %25) + %27 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" %26, ptr %27, align 8 + %28 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %27, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %28) unreachable _llgo_2: ; preds = %_llgo_3 @@ -73,29 +90,39 @@ _llgo_2: ; preds = %_llgo_3 ret void _llgo_3: ; preds = %_llgo_0 - %22 = icmp ne i64 %3, 2 - br i1 %22, label %_llgo_1, label %_llgo_2 + %29 = icmp ne i64 %3, 2 + br i1 %29, label %_llgo_1, label %_llgo_2 } define { %"github.com/goplus/llgo/cl/_testgo/returnorder.state", i64 } @"github.com/goplus/llgo/cl/_testgo/returnorder.returnStateAndMut"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/returnorder.state", ptr %0, i32 0, i32 0 - store i64 1, ptr %1, align 4 - %2 = call i64 @"github.com/goplus/llgo/cl/_testgo/returnorder.(*state).mutate"(ptr %0, i64 2) - %3 = load %"github.com/goplus/llgo/cl/_testgo/returnorder.state", ptr %0, align 4 - %4 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/returnorder.state", i64 } undef, %"github.com/goplus/llgo/cl/_testgo/returnorder.state" %3, 0 - %5 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/returnorder.state", i64 } %4, i64 %2, 1 - ret { %"github.com/goplus/llgo/cl/_testgo/returnorder.state", i64 } %5 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/returnorder.state", ptr %0, i32 0, i32 0 + store i64 1, ptr %2, align 4 + %3 = call i64 @"github.com/goplus/llgo/cl/_testgo/returnorder.(*state).mutate"(ptr %0, i64 2) + %4 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/cl/_testgo/returnorder.state", ptr %0, align 4 + %6 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/returnorder.state", i64 } undef, %"github.com/goplus/llgo/cl/_testgo/returnorder.state" %5, 0 + %7 = insertvalue { %"github.com/goplus/llgo/cl/_testgo/returnorder.state", i64 } %6, i64 %3, 1 + ret { %"github.com/goplus/llgo/cl/_testgo/returnorder.state", i64 } %7 } define i64 @"github.com/goplus/llgo/cl/_testgo/returnorder.(*state).mutate"(ptr %0, i64 %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/returnorder.state", ptr %0, i32 0, i32 0 - store i64 %1, ptr %2, align 4 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/returnorder.state", ptr %0, i32 0, i32 0 - %4 = load i64, ptr %3, align 4 - ret i64 %4 + store i64 %1, ptr %3, align 4 + %4 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/returnorder.state", ptr %0, i32 0, i32 0 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load i64, ptr %5, align 4 + ret i64 %7 } declare void @fmt.init() @@ -103,6 +130,8 @@ declare void @fmt.init() ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequal64"(ptr, ptr) @@ -121,6 +150,10 @@ _llgo_0: ret i1 %3 } +declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) + +declare void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr, ptr, ptr) + declare %"github.com/goplus/llgo/runtime/internal/runtime.String" @fmt.Sprintf(%"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.Slice") declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.strequal"(ptr, ptr) @@ -131,8 +164,6 @@ _llgo_0: ret i1 %3 } -declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) - declare void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface") declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String") diff --git a/cl/_testgo/selects/out.ll b/cl/_testgo/selects/out.ll index fd4c4b5786..679be0ce58 100644 --- a/cl/_testgo/selects/out.ll +++ b/cl/_testgo/selects/out.ll @@ -53,53 +53,57 @@ _llgo_0: %10 = getelementptr inbounds { ptr, ptr, ptr }, ptr %7, i32 0, i32 2 store ptr %4, ptr %10, align 8 %11 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testgo/selects.main$1", ptr undef }, ptr %7, 1 - %12 = call ptr @malloc(i64 16) + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) %13 = getelementptr inbounds { { ptr, ptr } }, ptr %12, i32 0, i32 0 store { ptr, ptr } %11, ptr %13, align 8 %14 = alloca i8, i64 8, align 1 %15 = call i32 @"github.com/goplus/llgo/runtime/internal/runtime.CreateThread"(ptr %14, ptr null, ptr @"github.com/goplus/llgo/cl/_testgo/selects._llgo_routine$1", ptr %12) - %16 = load ptr, ptr %0, align 8 - %17 = alloca {}, align 8 - call void @llvm.memset(ptr %17, i8 0, i64 0, i1 false) - store {} zeroinitializer, ptr %17, align 1 - %18 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.ChanSend"(ptr %16, ptr %17, i64 0) + %16 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = load ptr, ptr %0, align 8 + %18 = alloca {}, align 8 + call void @llvm.memset(ptr %18, i8 0, i64 0, i1 false) + store {} zeroinitializer, ptr %18, align 1 + %19 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.ChanSend"(ptr %17, ptr %18, i64 0) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 4 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %19 = load ptr, ptr %2, align 8 - %20 = alloca {}, align 8 - call void @llvm.memset(ptr %20, i8 0, i64 0, i1 false) - %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" undef, ptr %19, 0 - %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %21, ptr %20, 1 - %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %22, i32 0, 2 - %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %23, i1 false, 3 - %25 = alloca {}, align 8 - call void @llvm.memset(ptr %25, i8 0, i64 0, i1 false) - %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" undef, ptr %6, 0 - %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %26, ptr %25, 1 - %28 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %27, i32 0, 2 - %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %28, i1 false, 3 - %30 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 48) - %31 = getelementptr %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp", ptr %30, i64 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %24, ptr %31, align 8 - %32 = getelementptr %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp", ptr %30, i64 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %29, ptr %32, align 8 - %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %30, 0 - %34 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %33, i64 2, 1 - %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %34, i64 2, 2 - %36 = call { i64, i1 } @"github.com/goplus/llgo/runtime/internal/runtime.Select"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %35) - %37 = extractvalue { i64, i1 } %36, 0 - %38 = extractvalue { i64, i1 } %36, 1 - %39 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %24, 1 - %40 = load {}, ptr %39, align 1 - %41 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %29, 1 + %20 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = load ptr, ptr %2, align 8 + %22 = alloca {}, align 8 + call void @llvm.memset(ptr %22, i8 0, i64 0, i1 false) + %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" undef, ptr %21, 0 + %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %23, ptr %22, 1 + %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %24, i32 0, 2 + %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %25, i1 false, 3 + %27 = alloca {}, align 8 + call void @llvm.memset(ptr %27, i8 0, i64 0, i1 false) + %28 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" undef, ptr %6, 0 + %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %28, ptr %27, 1 + %30 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %29, i32 0, 2 + %31 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %30, i1 false, 3 + %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 48) + %33 = getelementptr %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp", ptr %32, i64 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %26, ptr %33, align 8 + %34 = getelementptr %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp", ptr %32, i64 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %31, ptr %34, align 8 + %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %32, 0 + %36 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %35, i64 2, 1 + %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %36, i64 2, 2 + %38 = call { i64, i1 } @"github.com/goplus/llgo/runtime/internal/runtime.Select"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %37) + %39 = extractvalue { i64, i1 } %38, 0 + %40 = extractvalue { i64, i1 } %38, 1 + %41 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %26, 1 %42 = load {}, ptr %41, align 1 - %43 = insertvalue { i64, i1, {}, {} } undef, i64 %37, 0 - %44 = insertvalue { i64, i1, {}, {} } %43, i1 %38, 1 - %45 = insertvalue { i64, i1, {}, {} } %44, {} %40, 2 - %46 = insertvalue { i64, i1, {}, {} } %45, {} %42, 3 - %47 = extractvalue { i64, i1, {}, {} } %46, 0 - %48 = icmp eq i64 %47, 0 - br i1 %48, label %_llgo_2, label %_llgo_3 + %43 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %31, 1 + %44 = load {}, ptr %43, align 1 + %45 = insertvalue { i64, i1, {}, {} } undef, i64 %39, 0 + %46 = insertvalue { i64, i1, {}, {} } %45, i1 %40, 1 + %47 = insertvalue { i64, i1, {}, {} } %46, {} %42, 2 + %48 = insertvalue { i64, i1, {}, {} } %47, {} %44, 3 + %49 = extractvalue { i64, i1, {}, {} } %48, 0 + %50 = icmp eq i64 %49, 0 + br i1 %50, label %_llgo_2, label %_llgo_3 _llgo_1: ; preds = %_llgo_4, %_llgo_2 ret void @@ -110,8 +114,8 @@ _llgo_2: ; preds = %_llgo_0 br label %_llgo_1 _llgo_3: ; preds = %_llgo_0 - %49 = icmp eq i64 %47, 1 - br i1 %49, label %_llgo_4, label %_llgo_5 + %51 = icmp eq i64 %49, 1 + br i1 %51, label %_llgo_4, label %_llgo_5 _llgo_4: ; preds = %_llgo_3 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 4 }) @@ -119,10 +123,10 @@ _llgo_4: ; preds = %_llgo_3 br label %_llgo_1 _llgo_5: ; preds = %_llgo_3 - %50 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 31 }, ptr %50, align 8 - %51 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %50, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %51) + %52 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 31 }, ptr %52, align 8 + %53 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %52, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %53) unreachable } @@ -130,49 +134,55 @@ define void @"github.com/goplus/llgo/cl/_testgo/selects.main$1"(ptr %0) { _llgo_0: %1 = load { ptr, ptr, ptr }, ptr %0, align 8 %2 = extractvalue { ptr, ptr, ptr } %1, 0 - %3 = load ptr, ptr %2, align 8 - %4 = alloca {}, align 8 - call void @llvm.memset(ptr %4, i8 0, i64 0, i1 false) - %5 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.ChanRecv"(ptr %3, ptr %4, i64 0) - %6 = load {}, ptr %4, align 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = alloca {}, align 8 + call void @llvm.memset(ptr %5, i8 0, i64 0, i1 false) + %6 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.ChanRecv"(ptr %4, ptr %5, i64 0) + %7 = load {}, ptr %5, align 1 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 4 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %7 = extractvalue { ptr, ptr, ptr } %1, 1 - %8 = load ptr, ptr %7, align 8 - %9 = extractvalue { ptr, ptr, ptr } %1, 2 - %10 = load ptr, ptr %9, align 8 - %11 = alloca {}, align 8 - call void @llvm.memset(ptr %11, i8 0, i64 0, i1 false) - store {} zeroinitializer, ptr %11, align 1 - %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" undef, ptr %8, 0 - %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %12, ptr %11, 1 - %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %13, i32 0, 2 - %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %14, i1 true, 3 - %16 = alloca {}, align 8 - call void @llvm.memset(ptr %16, i8 0, i64 0, i1 false) - %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" undef, ptr %10, 0 - %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %17, ptr %16, 1 - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %18, i32 0, 2 - %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %19, i1 false, 3 - %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 48) - %22 = getelementptr %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp", ptr %21, i64 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %15, ptr %22, align 8 - %23 = getelementptr %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp", ptr %21, i64 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %20, ptr %23, align 8 - %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %21, 0 - %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24, i64 2, 1 - %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %25, i64 2, 2 - %27 = call { i64, i1 } @"github.com/goplus/llgo/runtime/internal/runtime.Select"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %26) - %28 = extractvalue { i64, i1 } %27, 0 - %29 = extractvalue { i64, i1 } %27, 1 - %30 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %20, 1 - %31 = load {}, ptr %30, align 1 - %32 = insertvalue { i64, i1, {} } undef, i64 %28, 0 - %33 = insertvalue { i64, i1, {} } %32, i1 %29, 1 - %34 = insertvalue { i64, i1, {} } %33, {} %31, 2 - %35 = extractvalue { i64, i1, {} } %34, 0 - %36 = icmp eq i64 %35, 0 - br i1 %36, label %_llgo_2, label %_llgo_3 + %8 = extractvalue { ptr, ptr, ptr } %1, 1 + %9 = icmp eq ptr %8, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = load ptr, ptr %8, align 8 + %11 = extractvalue { ptr, ptr, ptr } %1, 2 + %12 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = load ptr, ptr %11, align 8 + %14 = alloca {}, align 8 + call void @llvm.memset(ptr %14, i8 0, i64 0, i1 false) + store {} zeroinitializer, ptr %14, align 1 + %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" undef, ptr %10, 0 + %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %15, ptr %14, 1 + %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %16, i32 0, 2 + %18 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %17, i1 true, 3 + %19 = alloca {}, align 8 + call void @llvm.memset(ptr %19, i8 0, i64 0, i1 false) + %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" undef, ptr %13, 0 + %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %20, ptr %19, 1 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %21, i32 0, 2 + %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %22, i1 false, 3 + %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 48) + %25 = getelementptr %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp", ptr %24, i64 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %18, ptr %25, align 8 + %26 = getelementptr %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp", ptr %24, i64 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %23, ptr %26, align 8 + %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %24, 0 + %28 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %27, i64 2, 1 + %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %28, i64 2, 2 + %30 = call { i64, i1 } @"github.com/goplus/llgo/runtime/internal/runtime.Select"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %29) + %31 = extractvalue { i64, i1 } %30, 0 + %32 = extractvalue { i64, i1 } %30, 1 + %33 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.ChanOp" %23, 1 + %34 = load {}, ptr %33, align 1 + %35 = insertvalue { i64, i1, {} } undef, i64 %31, 0 + %36 = insertvalue { i64, i1, {} } %35, i1 %32, 1 + %37 = insertvalue { i64, i1, {} } %36, {} %34, 2 + %38 = extractvalue { i64, i1, {} } %37, 0 + %39 = icmp eq i64 %38, 0 + br i1 %39, label %_llgo_2, label %_llgo_3 _llgo_1: ; preds = %_llgo_4, %_llgo_2 ret void @@ -183,8 +193,8 @@ _llgo_2: ; preds = %_llgo_0 br label %_llgo_1 _llgo_3: ; preds = %_llgo_0 - %37 = icmp eq i64 %35, 1 - br i1 %37, label %_llgo_4, label %_llgo_5 + %40 = icmp eq i64 %38, 1 + br i1 %40, label %_llgo_4, label %_llgo_5 _llgo_4: ; preds = %_llgo_3 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 4 }) @@ -192,10 +202,10 @@ _llgo_4: ; preds = %_llgo_3 br label %_llgo_1 _llgo_5: ; preds = %_llgo_3 - %38 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 31 }, ptr %38, align 8 - %39 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %38, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %39) + %41 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 31 }, ptr %41, align 8 + %42 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %41, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %42) unreachable } @@ -205,8 +215,6 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewChan"(i64, i64) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) -declare ptr @malloc(i64) - define ptr @"github.com/goplus/llgo/cl/_testgo/selects._llgo_routine$1"(ptr %0) { _llgo_0: %1 = load { { ptr, ptr } }, ptr %0, align 8 @@ -214,14 +222,13 @@ _llgo_0: %3 = extractvalue { ptr, ptr } %2, 1 %4 = extractvalue { ptr, ptr } %2, 0 call void %4(ptr %3) - call void @free(ptr %0) ret ptr null } -declare void @free(ptr) - declare i32 @"github.com/goplus/llgo/runtime/internal/runtime.CreateThread"(ptr, ptr, ptr, ptr) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.ChanSend"(ptr, ptr, i64) ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) diff --git a/cl/_testgo/strucintf/out.ll b/cl/_testgo/strucintf/out.ll index a17d12f06d..c745272544 100644 --- a/cl/_testgo/strucintf/out.ll +++ b/cl/_testgo/strucintf/out.ll @@ -10,17 +10,17 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/strucintf" %"github.com/goplus/llgo/runtime/internal/runtime.eface" = type { ptr, ptr } @"github.com/goplus/llgo/cl/_testgo/strucintf.init$guard" = global i1 false, align 1 -@"github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1455090933, i8 8, i8 8, i8 8, i8 57, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 16 }, ptr @"*github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 43 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields", i64 1, i64 1 } }, align 8 +@"github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1455090933, i8 8, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 16 }, ptr @"*github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 43 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields", i64 1, i64 1 } }, align 8 @0 = private unnamed_addr constant [16 x i8] c"struct { v int }", align 1 @"*github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1267158908, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 16 }, ptr null }, ptr @"github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" }, align 8 @1 = private unnamed_addr constant [43 x i8] c"github.com/goplus/llgo/cl/_testgo/strucintf", align 1 @2 = private unnamed_addr constant [1 x i8] c"v", align 1 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr @"*_llgo_int" }, align 8 @3 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 1 }, ptr @_llgo_int, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @4 = private unnamed_addr constant [11 x i8] c"Foo: not ok", align 1 -@"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 588020711, i8 8, i8 8, i8 8, i8 57, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 16 }, ptr @"*_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk$fields", i64 1, i64 1 } }, align 8 +@"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 588020711, i8 8, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 16 }, ptr @"*_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk$fields", i64 1, i64 1 } }, align 8 @5 = private unnamed_addr constant [16 x i8] c"struct { V int }", align 1 @"*_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 2112228924, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 16 }, ptr null }, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" }, align 8 @6 = private unnamed_addr constant [1 x i8] c"V", align 1 @@ -32,13 +32,19 @@ define %"github.com/goplus/llgo/runtime/internal/runtime.eface" @"github.com/gop _llgo_0: %0 = alloca { i64 }, align 8 call void @llvm.memset(ptr %0, i8 0, i64 8, i1 false) - %1 = getelementptr inbounds { i64 }, ptr %0, i32 0, i32 0 - store i64 1, ptr %1, align 4 - %2 = load { i64 }, ptr %0, align 4 - %3 = extractvalue { i64 } %2, 0 - %4 = inttoptr i64 %3 to ptr - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", ptr undef }, ptr %4, 1 - ret %"github.com/goplus/llgo/runtime/internal/runtime.eface" %5 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i64 }, ptr %0, i32 0, i32 0 + store i64 1, ptr %2, align 4 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load { i64 }, ptr %0, align 4 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", ptr %6, ptr %0) + %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", ptr undef }, ptr %6, 1 + ret %"github.com/goplus/llgo/runtime/internal/runtime.eface" %7 } define void @"github.com/goplus/llgo/cl/_testgo/strucintf.init"() { @@ -65,19 +71,23 @@ _llgo_0: br i1 %3, label %_llgo_10, label %_llgo_11 _llgo_1: ; preds = %_llgo_12 - %4 = getelementptr inbounds { i64 }, ptr %1, i32 0, i32 0 - %5 = load i64, ptr %4, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %5) + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds { i64 }, ptr %1, i32 0, i32 0 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load i64, ptr %5, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %7) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) br label %_llgo_2 _llgo_2: ; preds = %_llgo_3, %_llgo_1 - %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @"github.com/goplus/llgo/cl/_testdata/foo.Bar"() - %7 = alloca { i64 }, align 8 - call void @llvm.memset(ptr %7, i8 0, i64 8, i1 false) - %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %6, 0 - %9 = icmp eq ptr %8, @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" - br i1 %9, label %_llgo_13, label %_llgo_14 + %8 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @"github.com/goplus/llgo/cl/_testdata/foo.Bar"() + %9 = alloca { i64 }, align 8 + call void @llvm.memset(ptr %9, i8 0, i64 8, i1 false) + %10 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %8, 0 + %11 = icmp eq ptr %10, @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" + br i1 %11, label %_llgo_13, label %_llgo_14 _llgo_3: ; preds = %_llgo_12 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 11 }) @@ -85,19 +95,23 @@ _llgo_3: ; preds = %_llgo_12 br label %_llgo_2 _llgo_4: ; preds = %_llgo_15 - %10 = getelementptr inbounds { i64 }, ptr %7, i32 0, i32 0 - %11 = load i64, ptr %10, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %11) + %12 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds { i64 }, ptr %9, i32 0, i32 0 + %14 = icmp eq ptr %13, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load i64, ptr %13, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %15) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) br label %_llgo_5 _llgo_5: ; preds = %_llgo_6, %_llgo_4 - %12 = alloca { i64 }, align 8 - call void @llvm.memset(ptr %12, i8 0, i64 8, i1 false) - %13 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @"github.com/goplus/llgo/cl/_testdata/foo.F"() - %14 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %13, 0 - %15 = icmp eq ptr %14, @"github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" - br i1 %15, label %_llgo_16, label %_llgo_17 + %16 = alloca { i64 }, align 8 + call void @llvm.memset(ptr %16, i8 0, i64 8, i1 false) + %17 = call %"github.com/goplus/llgo/runtime/internal/runtime.eface" @"github.com/goplus/llgo/cl/_testdata/foo.F"() + %18 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %17, 0 + %19 = icmp eq ptr %18, @"github.com/goplus/llgo/cl/_testgo/strucintf.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" + br i1 %19, label %_llgo_16, label %_llgo_17 _llgo_6: ; preds = %_llgo_15 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 11 }) @@ -105,9 +119,13 @@ _llgo_6: ; preds = %_llgo_15 br label %_llgo_5 _llgo_7: ; preds = %_llgo_18 - %16 = getelementptr inbounds { i64 }, ptr %12, i32 0, i32 0 - %17 = load i64, ptr %16, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %17) + %20 = icmp eq ptr %16, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = getelementptr inbounds { i64 }, ptr %16, i32 0, i32 0 + %22 = icmp eq ptr %21, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %22) + %23 = load i64, ptr %21, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %23) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) br label %_llgo_8 @@ -120,63 +138,62 @@ _llgo_9: ; preds = %_llgo_18 br label %_llgo_8 _llgo_10: ; preds = %_llgo_0 - %18 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %19 = ptrtoint ptr %18 to i64 - %20 = insertvalue { i64 } undef, i64 %19, 0 - %21 = insertvalue { { i64 }, i1 } undef, { i64 } %20, 0 - %22 = insertvalue { { i64 }, i1 } %21, i1 true, 1 + %24 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 + %25 = load { i64 }, ptr %24, align 4 + %26 = insertvalue { { i64 }, i1 } undef, { i64 } %25, 0 + %27 = insertvalue { { i64 }, i1 } %26, i1 true, 1 br label %_llgo_12 _llgo_11: ; preds = %_llgo_0 br label %_llgo_12 _llgo_12: ; preds = %_llgo_11, %_llgo_10 - %23 = phi { { i64 }, i1 } [ %22, %_llgo_10 ], [ zeroinitializer, %_llgo_11 ] - %24 = extractvalue { { i64 }, i1 } %23, 0 - store { i64 } %24, ptr %1, align 4 - %25 = extractvalue { { i64 }, i1 } %23, 1 - br i1 %25, label %_llgo_1, label %_llgo_3 + %28 = phi { { i64 }, i1 } [ %27, %_llgo_10 ], [ zeroinitializer, %_llgo_11 ] + %29 = extractvalue { { i64 }, i1 } %28, 0 + store { i64 } %29, ptr %1, align 4 + %30 = extractvalue { { i64 }, i1 } %28, 1 + br i1 %30, label %_llgo_1, label %_llgo_3 _llgo_13: ; preds = %_llgo_2 - %26 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %6, 1 - %27 = ptrtoint ptr %26 to i64 - %28 = insertvalue { i64 } undef, i64 %27, 0 - %29 = insertvalue { { i64 }, i1 } undef, { i64 } %28, 0 - %30 = insertvalue { { i64 }, i1 } %29, i1 true, 1 + %31 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %8, 1 + %32 = load { i64 }, ptr %31, align 4 + %33 = insertvalue { { i64 }, i1 } undef, { i64 } %32, 0 + %34 = insertvalue { { i64 }, i1 } %33, i1 true, 1 br label %_llgo_15 _llgo_14: ; preds = %_llgo_2 br label %_llgo_15 _llgo_15: ; preds = %_llgo_14, %_llgo_13 - %31 = phi { { i64 }, i1 } [ %30, %_llgo_13 ], [ zeroinitializer, %_llgo_14 ] - %32 = extractvalue { { i64 }, i1 } %31, 0 - store { i64 } %32, ptr %7, align 4 - %33 = extractvalue { { i64 }, i1 } %31, 1 - br i1 %33, label %_llgo_4, label %_llgo_6 + %35 = phi { { i64 }, i1 } [ %34, %_llgo_13 ], [ zeroinitializer, %_llgo_14 ] + %36 = extractvalue { { i64 }, i1 } %35, 0 + store { i64 } %36, ptr %9, align 4 + %37 = extractvalue { { i64 }, i1 } %35, 1 + br i1 %37, label %_llgo_4, label %_llgo_6 _llgo_16: ; preds = %_llgo_5 - %34 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %13, 1 - %35 = ptrtoint ptr %34 to i64 - %36 = insertvalue { i64 } undef, i64 %35, 0 - %37 = insertvalue { { i64 }, i1 } undef, { i64 } %36, 0 - %38 = insertvalue { { i64 }, i1 } %37, i1 true, 1 + %38 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %17, 1 + %39 = load { i64 }, ptr %38, align 4 + %40 = insertvalue { { i64 }, i1 } undef, { i64 } %39, 0 + %41 = insertvalue { { i64 }, i1 } %40, i1 true, 1 br label %_llgo_18 _llgo_17: ; preds = %_llgo_5 br label %_llgo_18 _llgo_18: ; preds = %_llgo_17, %_llgo_16 - %39 = phi { { i64 }, i1 } [ %38, %_llgo_16 ], [ zeroinitializer, %_llgo_17 ] - %40 = extractvalue { { i64 }, i1 } %39, 0 - store { i64 } %40, ptr %12, align 4 - %41 = extractvalue { { i64 }, i1 } %39, 1 - br i1 %41, label %_llgo_7, label %_llgo_9 + %42 = phi { { i64 }, i1 } [ %41, %_llgo_16 ], [ zeroinitializer, %_llgo_17 ] + %43 = extractvalue { { i64 }, i1 } %42, 0 + store { i64 } %43, ptr %16, align 4 + %44 = extractvalue { { i64 }, i1 } %42, 1 + br i1 %44, label %_llgo_7, label %_llgo_9 } ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.structequal"(ptr, ptr, ptr) declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequalptr"(ptr, ptr) @@ -195,6 +212,10 @@ _llgo_0: ret i1 %3 } +declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) + +declare void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr, ptr, ptr) + declare void @"github.com/goplus/llgo/cl/_testdata/foo.init"() declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64) diff --git a/cl/_testgo/struczero/expect.txt b/cl/_testgo/struczero/expect.txt index d5341a5d08..bb2ac00c34 100644 --- a/cl/_testgo/struczero/expect.txt +++ b/cl/_testgo/struczero/expect.txt @@ -1,2 +1,2 @@ -0x0 +0.000000e+00 notOk: true -0x0 +0.000000e+00 true +0x0 +0.000000e+000 notOk: true +0x0 +0.000000e+000 true diff --git a/cl/_testgo/struczero/out.ll b/cl/_testgo/struczero/out.ll index 758d2535de..6dbc42209b 100644 --- a/cl/_testgo/struczero/out.ll +++ b/cl/_testgo/struczero/out.ll @@ -25,11 +25,11 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/struczero" @"*_llgo_func$bbS9EKnYgxbrRntc_6WJN6WLF9IKQADblvN_cLtKCqY" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 828247448, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 13 }, ptr null }, ptr @"_llgo_func$bbS9EKnYgxbrRntc_6WJN6WLF9IKQADblvN_cLtKCqY" }, align 8 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @4 = private unnamed_addr constant [5 x i8] c"uint8", align 1 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @"_llgo_func$bbS9EKnYgxbrRntc_6WJN6WLF9IKQADblvN_cLtKCqY$out" = weak_odr constant [1 x ptr] [ptr @"*_llgo_uint8"], align 8 @5 = private unnamed_addr constant [2 x i8] c"pb", align 1 @6 = private unnamed_addr constant [1 x i8] c"F", align 1 -@_llgo_float32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 62173712, i8 4, i8 4, i8 4, i8 45, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f32equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 7 }, ptr @"*_llgo_float32" }, align 8 +@_llgo_float32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 62173712, i8 4, i8 4, i8 4, i8 13, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f32equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 7 }, ptr @"*_llgo_float32" }, align 8 @7 = private unnamed_addr constant [7 x i8] c"float32", align 1 @"*_llgo_float32" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1426958587, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 7 }, ptr null }, ptr @_llgo_float32 }, align 8 @"github.com/goplus/llgo/cl/_testdata/foo.struct$gB-6lDCpZ0V7ma2GTPMARivfSutm75zh84uE5OqxsI4$fields" = weak_odr constant [2 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 2 }, ptr @"*_llgo_uint8", i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 1 }, ptr @_llgo_float32, i64 8, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @@ -113,39 +113,53 @@ _llgo_0: %2 = extractvalue { %"github.com/goplus/llgo/cl/_testgo/struczero.bar", i1 } %1, 0 store %"github.com/goplus/llgo/cl/_testgo/struczero.bar" %2, ptr %0, align 8 %3 = extractvalue { %"github.com/goplus/llgo/cl/_testgo/struczero.bar", i1 } %1, 1 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/struczero.bar", ptr %0, i32 0, i32 0 - %5 = load ptr, ptr %4, align 8 - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/struczero.bar", ptr %0, i32 0, i32 1 - %7 = load float, ptr %6, align 4 - %8 = xor i1 %3, true - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %5) + %4 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/struczero.bar", ptr %0, i32 0, i32 0 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load ptr, ptr %5, align 8 + %8 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/struczero.bar", ptr %0, i32 0, i32 1 + %10 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = load float, ptr %9, align 4 + %12 = xor i1 %3, true + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %7) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %9 = fpext float %7 to double - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double %9) + %13 = fpext float %11 to double + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double %13) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 6 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %12) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %10 = alloca %"github.com/goplus/llgo/cl/_testdata/foo.Foo", align 8 - call void @llvm.memset(ptr %10, i8 0, i64 16, i1 false) - %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/cl/_testdata/foo.Foo" zeroinitializer, ptr %11, align 8 - %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testdata/foo.Foo", ptr undef }, ptr %11, 1 - %13 = call { %"github.com/goplus/llgo/cl/_testdata/foo.Foo", i1 } @"github.com/goplus/llgo/cl/_testgo/struczero.Bar"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %12) - %14 = extractvalue { %"github.com/goplus/llgo/cl/_testdata/foo.Foo", i1 } %13, 0 - store %"github.com/goplus/llgo/cl/_testdata/foo.Foo" %14, ptr %10, align 8 - %15 = extractvalue { %"github.com/goplus/llgo/cl/_testdata/foo.Foo", i1 } %13, 1 - %16 = load %"github.com/goplus/llgo/cl/_testdata/foo.Foo", ptr %10, align 8 - %17 = call ptr @"github.com/goplus/llgo/cl/_testdata/foo.Foo.Pb"(%"github.com/goplus/llgo/cl/_testdata/foo.Foo" %16) - %18 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/foo.Foo", ptr %10, i32 0, i32 1 - %19 = load float, ptr %18, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %17) + %14 = alloca %"github.com/goplus/llgo/cl/_testdata/foo.Foo", align 8 + call void @llvm.memset(ptr %14, i8 0, i64 16, i1 false) + %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/cl/_testdata/foo.Foo" zeroinitializer, ptr %15, align 8 + %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testdata/foo.Foo", ptr undef }, ptr %15, 1 + %17 = call { %"github.com/goplus/llgo/cl/_testdata/foo.Foo", i1 } @"github.com/goplus/llgo/cl/_testgo/struczero.Bar"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %16) + %18 = extractvalue { %"github.com/goplus/llgo/cl/_testdata/foo.Foo", i1 } %17, 0 + store %"github.com/goplus/llgo/cl/_testdata/foo.Foo" %18, ptr %14, align 8 + %19 = extractvalue { %"github.com/goplus/llgo/cl/_testdata/foo.Foo", i1 } %17, 1 + %20 = icmp eq ptr %14, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = load %"github.com/goplus/llgo/cl/_testdata/foo.Foo", ptr %14, align 8 + %22 = call ptr @"github.com/goplus/llgo/cl/_testdata/foo.Foo.Pb"(%"github.com/goplus/llgo/cl/_testdata/foo.Foo" %21) + %23 = icmp eq ptr %14, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %23) + %24 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/foo.Foo", ptr %14, i32 0, i32 1 + %25 = icmp eq ptr %24, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %25) + %26 = load float, ptr %24, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %22) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %20 = fpext float %19 to double - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double %20) + %27 = fpext float %26 to double + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double %27) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %15) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %19) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -185,6 +199,8 @@ declare void @"github.com/goplus/llgo/cl/_testdata/foo.init"() ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) diff --git a/cl/_testgo/tpindex/out.ll b/cl/_testgo/tpindex/out.ll index 5fd236a843..009c7e4a08 100644 --- a/cl/_testgo/tpindex/out.ll +++ b/cl/_testgo/tpindex/out.ll @@ -21,30 +21,42 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testgo/tpindex.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 40) - %1 = getelementptr inbounds i64, ptr %0, i64 0 - store i64 1, ptr %1, align 4 - %2 = getelementptr inbounds i64, ptr %0, i64 1 - store i64 3, ptr %2, align 4 - %3 = getelementptr inbounds i64, ptr %0, i64 2 - store i64 5, ptr %3, align 4 - %4 = getelementptr inbounds i64, ptr %0, i64 3 - store i64 2, ptr %4, align 4 - %5 = getelementptr inbounds i64, ptr %0, i64 4 - store i64 4, ptr %5, align 4 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, i64 5, 1 - %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, i64 5, 2 - %9 = call i64 @"github.com/goplus/llgo/cl/_testgo/tpindex.index[int]"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, i64 3) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %9) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds i64, ptr %0, i64 0 + store i64 1, ptr %2, align 4 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds i64, ptr %0, i64 1 + store i64 3, ptr %4, align 4 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds i64, ptr %0, i64 2 + store i64 5, ptr %6, align 4 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds i64, ptr %0, i64 3 + store i64 2, ptr %8, align 4 + %9 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds i64, ptr %0, i64 4 + store i64 4, ptr %10, align 4 + %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 + %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, i64 5, 1 + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %12, i64 5, 2 + %14 = call i64 @"github.com/goplus/llgo/cl/_testgo/tpindex.index[int]"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %13, i64 3) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %14) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %10 = call i64 @"github.com/goplus/llgo/cl/_testgo/tpindex.index[int]"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, i64 6) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %10) + %15 = call i64 @"github.com/goplus/llgo/cl/_testgo/tpindex.index[int]"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %13, i64 6) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %15) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + define linkonce i64 @"github.com/goplus/llgo/cl/_testgo/tpindex.index[int]"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %0, i64 %1) { _llgo_0: %2 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %0, 1 @@ -64,9 +76,11 @@ _llgo_2: ; preds = %_llgo_1 %10 = or i1 %9, %8 call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %10) %11 = getelementptr inbounds i64, ptr %6, i64 %4 - %12 = load i64, ptr %11, align 4 - %13 = icmp eq i64 %1, %12 - br i1 %13, label %_llgo_4, label %_llgo_1 + %12 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = load i64, ptr %11, align 4 + %14 = icmp eq i64 %1, %13 + br i1 %14, label %_llgo_4, label %_llgo_1 _llgo_3: ; preds = %_llgo_1 ret i64 -1 diff --git a/cl/_testgo/tpinst/out.ll b/cl/_testgo/tpinst/out.ll index 8918c8a929..1c79fea252 100644 --- a/cl/_testgo/tpinst/out.ll +++ b/cl/_testgo/tpinst/out.ll @@ -20,10 +20,10 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/tpinst" @"github.com/goplus/llgo/cl/_testgo/tpinst.init$guard" = global i1 false, align 1 @"*_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[int]" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [2 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 2001801254, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 11 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[int]" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 40 }, i16 2, i16 1, i32 24 }, [2 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 5 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[int]).Value", ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[int]).Value" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 46 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[int]).value", ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[int]).value" }] }, align 8 @0 = private unnamed_addr constant [11 x i8] c"main.M[int]", align 1 -@"_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[int]" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 2506501, i8 13, i8 8, i8 8, i8 57, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[int]" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 11 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[int]" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 40 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 40 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[int]" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 2506501, i8 13, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[int]" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 11 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[int]" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 40 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 40 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @1 = private unnamed_addr constant [40 x i8] c"github.com/goplus/llgo/cl/_testgo/tpinst", align 1 @2 = private unnamed_addr constant [1 x i8] c"v", align 1 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr @"*_llgo_int" }, align 8 @3 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"github.com/goplus/llgo/cl/_testgo/tpinst.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 1 }, ptr @_llgo_int, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @@ -44,8 +44,8 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/tpinst" @"*_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1323879264, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 6 }, ptr null }, ptr @_llgo_string }, align 8 @"*_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [2 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1041065950, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 15 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 40 }, i16 2, i16 1, i32 24 }, [2 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 5 }, ptr @"_llgo_func$UYiLlmcWxoOKZPPzvR4LByitNeKoVGoTrB_5ubdOWW8", ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[float64]).Value", ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[float64]).Value" }, %"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 46 }, ptr @"_llgo_func$UYiLlmcWxoOKZPPzvR4LByitNeKoVGoTrB_5ubdOWW8", ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[float64]).value", ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[float64]).value" }] }, align 8 @11 = private unnamed_addr constant [15 x i8] c"main.M[float64]", align 1 -@"_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1922884649, i8 5, i8 8, i8 8, i8 57, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 15 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 40 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.struct$7SZ-TjG6e68olyGxlMRRIOYuZz2LaKIpOrZH-w4GiTU$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 40 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 -@_llgo_float64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1233032631, i8 4, i8 8, i8 8, i8 46, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f64equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 7 }, ptr @"*_llgo_float64" }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1922884649, i8 5, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 15 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 40 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.struct$7SZ-TjG6e68olyGxlMRRIOYuZz2LaKIpOrZH-w4GiTU$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 40 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@_llgo_float64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1233032631, i8 4, i8 8, i8 8, i8 14, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f64equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 7 }, ptr @"*_llgo_float64" }, align 8 @12 = private unnamed_addr constant [7 x i8] c"float64", align 1 @"*_llgo_float64" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1664509894, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 7 }, ptr null }, ptr @_llgo_float64 }, align 8 @"github.com/goplus/llgo/cl/_testgo/tpinst.struct$7SZ-TjG6e68olyGxlMRRIOYuZz2LaKIpOrZH-w4GiTU$fields" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 1 }, ptr @_llgo_float64, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @@ -62,97 +62,102 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/tpinst" @"*github.com/goplus/llgo/cl/_testgo/tpinst.iface$2sV9fFeqOv1SzesvwIdhTqCFzDT8ZX5buKUSAoHNSww" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -739630974, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 30 }, ptr null }, ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.iface$2sV9fFeqOv1SzesvwIdhTqCFzDT8ZX5buKUSAoHNSww" }, align 8 @"github.com/goplus/llgo/cl/_testgo/tpinst.iface$2sV9fFeqOv1SzesvwIdhTqCFzDT8ZX5buKUSAoHNSww$imethods" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.Imethod"] [%"github.com/goplus/llgo/runtime/abi.Imethod" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 46 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" }], align 8 @16 = private unnamed_addr constant [95 x i8] c"type assertion github.com/goplus/llgo/cl/_testgo/tpinst.I[int] -> interface{value() int} failed", align 1 +@llvm.compiler.used = appending global [4 x ptr] [ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[int]).Value", ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[int]).value", ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[float64]).Value", ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[float64]).value"], section "llvm.metadata" define void @"github.com/goplus/llgo/cl/_testgo/tpinst.demo"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tpinst.M[int]", ptr %0, i32 0, i32 0 - store i64 100, ptr %1, align 4 - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$Jvxc0PCI_drlfK7S5npMGdZkQLeRkQ_x2e2CifPE6w8", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[int]") - %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %2, 0 - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3, ptr %0, 1 - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %4) - %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, 0 - %7 = getelementptr ptr, ptr %6, i64 3 - %8 = load ptr, ptr %7, align 8 - %9 = insertvalue { ptr, ptr } undef, ptr %8, 0 - %10 = insertvalue { ptr, ptr } %9, ptr %5, 1 - %11 = extractvalue { ptr, ptr } %10, 1 - %12 = extractvalue { ptr, ptr } %10, 0 - %13 = call i64 %12(ptr %11) - %14 = icmp ne i64 %13, 100 - br i1 %14, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tpinst.M[int]", ptr %0, i32 0, i32 0 + store i64 100, ptr %2, align 4 + %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$Jvxc0PCI_drlfK7S5npMGdZkQLeRkQ_x2e2CifPE6w8", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[int]") + %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %3, 0 + %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %0, 1 + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %5) + %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, 0 + %8 = getelementptr ptr, ptr %7, i64 3 + %9 = load ptr, ptr %8, align 8 + %10 = insertvalue { ptr, ptr } undef, ptr %9, 0 + %11 = insertvalue { ptr, ptr } %10, ptr %6, 1 + %12 = extractvalue { ptr, ptr } %11, 1 + %13 = extractvalue { ptr, ptr } %11, 0 + %14 = call i64 %13(ptr %12) + %15 = icmp ne i64 %14, 100 + br i1 %15, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 5 }, ptr %15, align 8 - %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %15, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %16) + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 5 }, ptr %16, align 8 + %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %16, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %17) unreachable _llgo_2: ; preds = %_llgo_0 - %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %18 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]", ptr %17, i32 0, i32 0 - store double 1.001000e+02, ptr %18, align 8 - %19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$2dxw6yZ6V86Spb7J0dTDIoWqg7ba7UDXlAlpJv3-HLk", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]") - %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %19, 0 - %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %20, ptr %17, 1 - %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %21) - %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, 0 - %24 = getelementptr ptr, ptr %23, i64 3 - %25 = load ptr, ptr %24, align 8 - %26 = insertvalue { ptr, ptr } undef, ptr %25, 0 - %27 = insertvalue { ptr, ptr } %26, ptr %22, 1 - %28 = extractvalue { ptr, ptr } %27, 1 - %29 = extractvalue { ptr, ptr } %27, 0 - %30 = call double %29(ptr %28) - %31 = fcmp une double %30, 1.001000e+02 - br i1 %31, label %_llgo_3, label %_llgo_4 + %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) + %19 = icmp eq ptr %18, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %19) + %20 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]", ptr %18, i32 0, i32 0 + store double 1.001000e+02, ptr %20, align 8 + %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$2dxw6yZ6V86Spb7J0dTDIoWqg7ba7UDXlAlpJv3-HLk", ptr @"*_llgo_github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]") + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %21, 0 + %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %22, ptr %18, 1 + %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %23) + %25 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %23, 0 + %26 = getelementptr ptr, ptr %25, i64 3 + %27 = load ptr, ptr %26, align 8 + %28 = insertvalue { ptr, ptr } undef, ptr %27, 0 + %29 = insertvalue { ptr, ptr } %28, ptr %24, 1 + %30 = extractvalue { ptr, ptr } %29, 1 + %31 = extractvalue { ptr, ptr } %29, 0 + %32 = call double %31(ptr %30) + %33 = fcmp une double %32, 1.001000e+02 + br i1 %33, label %_llgo_3, label %_llgo_4 _llgo_3: ; preds = %_llgo_2 - %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 5 }, ptr %32, align 8 - %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %32, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %33) + %34 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 5 }, ptr %34, align 8 + %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %34, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %35) unreachable _llgo_4: ; preds = %_llgo_2 - %34 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %4) - %35 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.iface$2sV9fFeqOv1SzesvwIdhTqCFzDT8ZX5buKUSAoHNSww", ptr %34) - br i1 %35, label %_llgo_7, label %_llgo_8 + %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %5) + %37 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.iface$2sV9fFeqOv1SzesvwIdhTqCFzDT8ZX5buKUSAoHNSww", ptr %36) + br i1 %37, label %_llgo_7, label %_llgo_8 _llgo_5: ; preds = %_llgo_7 - %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 5 }, ptr %36, align 8 - %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %36, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %37) + %38 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 5 }, ptr %38, align 8 + %39 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %38, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %39) unreachable _llgo_6: ; preds = %_llgo_7 ret void _llgo_7: ; preds = %_llgo_4 - %38 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, 1 - %39 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.iface$2sV9fFeqOv1SzesvwIdhTqCFzDT8ZX5buKUSAoHNSww", ptr %34) - %40 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %39, 0 - %41 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %40, ptr %38, 1 - %42 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %41) - %43 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %41, 0 - %44 = getelementptr ptr, ptr %43, i64 3 - %45 = load ptr, ptr %44, align 8 - %46 = insertvalue { ptr, ptr } undef, ptr %45, 0 - %47 = insertvalue { ptr, ptr } %46, ptr %42, 1 - %48 = extractvalue { ptr, ptr } %47, 1 - %49 = extractvalue { ptr, ptr } %47, 0 - %50 = call i64 %49(ptr %48) - %51 = icmp ne i64 %50, 100 - br i1 %51, label %_llgo_5, label %_llgo_6 + %40 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, 1 + %41 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"github.com/goplus/llgo/cl/_testgo/tpinst.iface$2sV9fFeqOv1SzesvwIdhTqCFzDT8ZX5buKUSAoHNSww", ptr %36) + %42 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %41, 0 + %43 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %42, ptr %40, 1 + %44 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %43) + %45 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %43, 0 + %46 = getelementptr ptr, ptr %45, i64 3 + %47 = load ptr, ptr %46, align 8 + %48 = insertvalue { ptr, ptr } undef, ptr %47, 0 + %49 = insertvalue { ptr, ptr } %48, ptr %44, 1 + %50 = extractvalue { ptr, ptr } %49, 1 + %51 = extractvalue { ptr, ptr } %49, 0 + %52 = call i64 %51(ptr %50) + %53 = icmp ne i64 %52, 100 + br i1 %53, label %_llgo_5, label %_llgo_6 _llgo_8: ; preds = %_llgo_4 - %52 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 95 }, ptr %52, align 8 - %53 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %52, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %53) + %54 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 95 }, ptr %54, align 8 + %55 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %54, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %55) unreachable } @@ -177,18 +182,28 @@ _llgo_0: declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + define linkonce i64 @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[int]).Value"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tpinst.M[int]", ptr %0, i32 0, i32 0 - %2 = load i64, ptr %1, align 4 - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tpinst.M[int]", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + ret i64 %4 } define linkonce i64 @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[int]).value"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tpinst.M[int]", ptr %0, i32 0, i32 0 - %2 = load i64, ptr %1, align 4 - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tpinst.M[int]", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + ret i64 %4 } declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequalptr"(ptr, ptr) @@ -235,16 +250,24 @@ declare void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.c define linkonce double @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[float64]).Value"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]", ptr %0, i32 0, i32 0 - %2 = load double, ptr %1, align 8 - ret double %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load double, ptr %2, align 8 + ret double %4 } define linkonce double @"github.com/goplus/llgo/cl/_testgo/tpinst.(*M[float64]).value"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]", ptr %0, i32 0, i32 0 - %2 = load double, ptr %1, align 8 - ret double %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tpinst.M[float64]", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load double, ptr %2, align 8 + ret double %4 } declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.f64equal"(ptr, ptr) diff --git a/cl/_testgo/tprecur/out.ll b/cl/_testgo/tprecur/out.ll index 29a138e87e..f0511434a5 100644 --- a/cl/_testgo/tprecur/out.ll +++ b/cl/_testgo/tprecur/out.ll @@ -117,7 +117,7 @@ _llgo_3: ; preds = %_llgo_1 br label %_llgo_4 _llgo_4: ; preds = %_llgo_5, %_llgo_3 - %14 = phi i64 [ 0, %_llgo_3 ], [ %25, %_llgo_5 ] + %14 = phi i64 [ 0, %_llgo_3 ], [ %26, %_llgo_5 ] %15 = phi i64 [ -1, %_llgo_3 ], [ %16, %_llgo_5 ] %16 = add i64 %15, 1 %17 = icmp slt i64 %16, %13 @@ -131,17 +131,21 @@ _llgo_5: ; preds = %_llgo_4 %22 = or i1 %21, %20 call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %22) %23 = getelementptr inbounds i64, ptr %18, i64 %16 - %24 = load i64, ptr %23, align 4 - %25 = add i64 %14, %24 + %24 = icmp eq ptr %23, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %24) + %25 = load i64, ptr %23, align 4 + %26 = add i64 %14, %25 br label %_llgo_4 _llgo_6: ; preds = %_llgo_4 - %26 = sub i64 %0, 1 - %27 = call i64 @"github.com/goplus/llgo/cl/_testgo/tprecur.recur1[github.com/goplus/llgo/cl/_testgo/tprecur.T.1.0]"(i64 %26) - %28 = add i64 %14, %27 - ret i64 %28 + %27 = sub i64 %0, 1 + %28 = call i64 @"github.com/goplus/llgo/cl/_testgo/tprecur.recur1[github.com/goplus/llgo/cl/_testgo/tprecur.T.1.0]"(i64 %27) + %29 = add i64 %14, %28 + ret i64 %29 } declare %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.MakeSlice"(i64, i64, i64) declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1) + +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) diff --git a/cl/_testgo/tprecurfn/out.ll b/cl/_testgo/tprecurfn/out.ll index 403e089a1c..1ab2a952a4 100644 --- a/cl/_testgo/tprecurfn/out.ll +++ b/cl/_testgo/tprecurfn/out.ll @@ -21,18 +21,30 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testgo/tprecurfn.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tprecurfn.My[int]", ptr %0, i32 0, i32 1 - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tprecurfn.My[int]", ptr %2, i32 0, i32 0 - store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/tprecurfn.main$1", ptr null }, ptr %3, align 8 - store ptr %2, ptr %1, align 8 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tprecurfn.My[int]", ptr %0, i32 0, i32 1 - %5 = load ptr, ptr %4, align 8 - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tprecurfn.My[int]", ptr %5, i32 0, i32 0 - %7 = load { ptr, ptr }, ptr %6, align 8 - %8 = extractvalue { ptr, ptr } %7, 1 - %9 = extractvalue { ptr, ptr } %7, 0 - call void %9(ptr %8, i64 100) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tprecurfn.My[int]", ptr %0, i32 0, i32 1 + %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tprecurfn.My[int]", ptr %3, i32 0, i32 0 + store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/tprecurfn.main$1", ptr null }, ptr %5, align 8 + store ptr %3, ptr %2, align 8 + %6 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tprecurfn.My[int]", ptr %0, i32 0, i32 1 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load ptr, ptr %7, align 8 + %10 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tprecurfn.My[int]", ptr %9, i32 0, i32 0 + %12 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = load { ptr, ptr }, ptr %11, align 8 + %14 = extractvalue { ptr, ptr } %13, 1 + %15 = extractvalue { ptr, ptr } %13, 0 + call void %15(ptr %14, i64 100) ret void } @@ -45,6 +57,8 @@ _llgo_0: declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + define linkonce void @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/tprecurfn.main$1"(ptr %0, i64 %1) { _llgo_0: tail call void @"github.com/goplus/llgo/cl/_testgo/tprecurfn.main$1"(i64 %1) diff --git a/cl/_testgo/tptypes/out.ll b/cl/_testgo/tptypes/out.ll index 882cef3423..b89294afac 100644 --- a/cl/_testgo/tptypes/out.ll +++ b/cl/_testgo/tptypes/out.ll @@ -28,122 +28,188 @@ define void @"github.com/goplus/llgo/cl/_testgo/tptypes.main"() { _llgo_0: %0 = alloca %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]", align 8 call void @llvm.memset(ptr %0, i8 0, i64 8, i1 false) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]", ptr %0, i32 0, i32 0 - store i64 1, ptr %1, align 4 - %2 = load %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]", ptr %0, align 4 - %3 = extractvalue %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]" %2, 0 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %3) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]", ptr %0, i32 0, i32 0 + store i64 1, ptr %2, align 4 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]", ptr %0, align 4 + %5 = extractvalue %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]" %4, 0 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %5) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %4 = alloca %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]", align 8 - call void @llvm.memset(ptr %4, i8 0, i64 16, i1 false) - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]", ptr %4, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %5, align 8 - %6 = load %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]", ptr %4, align 8 - %7 = extractvalue %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]" %6, 0 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %7) + %6 = alloca %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]", align 8 + call void @llvm.memset(ptr %6, i8 0, i64 16, i1 false) + %7 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]", ptr %6, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %8, align 8 + %9 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = load %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]", ptr %6, align 8 + %11 = extractvalue %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]" %10, 0 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %11) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %8 = alloca %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]", align 8 - call void @llvm.memset(ptr %8, i8 0, i64 8, i1 false) - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]", ptr %8, i32 0, i32 0 - store i64 100, ptr %9, align 4 - %10 = load %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]", ptr %8, align 4 - %11 = extractvalue %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]" %10, 0 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %11) + %12 = alloca %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]", align 8 + call void @llvm.memset(ptr %12, i8 0, i64 8, i1 false) + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]", ptr %12, i32 0, i32 0 + store i64 100, ptr %14, align 4 + %15 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = load %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]", ptr %12, align 4 + %17 = extractvalue %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[int]" %16, 0 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %17) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %12 = alloca %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]", align 8 - call void @llvm.memset(ptr %12, i8 0, i64 16, i1 false) - %13 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]", ptr %12, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %13, align 8 - %14 = load %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]", ptr %12, align 8 - %15 = extractvalue %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]" %14, 0 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %15) + %18 = alloca %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]", align 8 + call void @llvm.memset(ptr %18, i8 0, i64 16, i1 false) + %19 = icmp eq ptr %18, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %19) + %20 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]", ptr %18, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %20, align 8 + %21 = icmp eq ptr %18, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %21) + %22 = load %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]", ptr %18, align 8 + %23 = extractvalue %"github.com/goplus/llgo/cl/_testgo/tptypes.Data[string]" %22, 0 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %23) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 0) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %18 = getelementptr inbounds i64, ptr %17, i64 0 - store i64 100, ptr %18, align 4 - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %17, 0 - %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %19, i64 1, 1 - %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %20, i64 1, 2 - %22 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/tptypes.(*Slice[[]int,int]).Append"(ptr %16, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %21) - %23 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %25 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %24, i64 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %25, align 8 - %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %24, 0 - %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %26, i64 1, 1 - %28 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %27, i64 1, 2 - %29 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/tptypes.(*Slice[[]string,string]).Append"(ptr %23, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %28) - %30 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %31 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %32 = getelementptr inbounds i64, ptr %31, i64 0 - store i64 1, ptr %32, align 4 - %33 = getelementptr inbounds i64, ptr %31, i64 1 - store i64 2, ptr %33, align 4 - %34 = getelementptr inbounds i64, ptr %31, i64 2 - store i64 3, ptr %34, align 4 - %35 = getelementptr inbounds i64, ptr %31, i64 3 - store i64 4, ptr %35, align 4 - %36 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %31, 0 - %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %36, i64 4, 1 - %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %37, i64 4, 2 - %39 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/tptypes.(*Slice[[]int,int]).Append"(ptr %30, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %38) - %40 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %41 = getelementptr inbounds i64, ptr %40, i64 0 - store i64 1, ptr %41, align 4 - %42 = getelementptr inbounds i64, ptr %40, i64 1 - store i64 2, ptr %42, align 4 - %43 = getelementptr inbounds i64, ptr %40, i64 2 - store i64 3, ptr %43, align 4 - %44 = getelementptr inbounds i64, ptr %40, i64 3 - store i64 4, ptr %44, align 4 - %45 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %40, 0 - %46 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %45, i64 4, 1 - %47 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %46, i64 4, 2 - %48 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/tptypes.(*Slice[[]int,int]).Append2"(ptr %30, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %47) - %49 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %16, i32 0, i32 0 - %50 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %49, align 8 - %51 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %16, i32 0, i32 0 - %52 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %51, align 8 - %53 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %52, 0 - %54 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %52, 1 - %55 = icmp sge i64 0, %54 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %55) - %56 = getelementptr inbounds i64, ptr %53, i64 0 - %57 = load i64, ptr %56, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %50) + %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) + %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) + %26 = icmp eq ptr %25, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %26) + %27 = getelementptr inbounds i64, ptr %25, i64 0 + store i64 100, ptr %27, align 4 + %28 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %25, 0 + %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %28, i64 1, 1 + %30 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %29, i64 1, 2 + %31 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/tptypes.(*Slice[[]int,int]).Append"(ptr %24, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %30) + %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) + %33 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %34 = icmp eq ptr %33, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %34) + %35 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %33, i64 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %35, align 8 + %36 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %33, 0 + %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %36, i64 1, 1 + %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %37, i64 1, 2 + %39 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/tptypes.(*Slice[[]string,string]).Append"(ptr %32, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %38) + %40 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) + %41 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) + %42 = icmp eq ptr %41, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %42) + %43 = getelementptr inbounds i64, ptr %41, i64 0 + store i64 1, ptr %43, align 4 + %44 = icmp eq ptr %41, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %44) + %45 = getelementptr inbounds i64, ptr %41, i64 1 + store i64 2, ptr %45, align 4 + %46 = icmp eq ptr %41, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %46) + %47 = getelementptr inbounds i64, ptr %41, i64 2 + store i64 3, ptr %47, align 4 + %48 = icmp eq ptr %41, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %48) + %49 = getelementptr inbounds i64, ptr %41, i64 3 + store i64 4, ptr %49, align 4 + %50 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %41, 0 + %51 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %50, i64 4, 1 + %52 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %51, i64 4, 2 + %53 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/tptypes.(*Slice[[]int,int]).Append"(ptr %40, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %52) + %54 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) + %55 = icmp eq ptr %54, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %55) + %56 = getelementptr inbounds i64, ptr %54, i64 0 + store i64 1, ptr %56, align 4 + %57 = icmp eq ptr %54, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %57) + %58 = getelementptr inbounds i64, ptr %54, i64 1 + store i64 2, ptr %58, align 4 + %59 = icmp eq ptr %54, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %59) + %60 = getelementptr inbounds i64, ptr %54, i64 2 + store i64 3, ptr %60, align 4 + %61 = icmp eq ptr %54, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %61) + %62 = getelementptr inbounds i64, ptr %54, i64 3 + store i64 4, ptr %62, align 4 + %63 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %54, 0 + %64 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %63, i64 4, 1 + %65 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %64, i64 4, 2 + %66 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/tptypes.(*Slice[[]int,int]).Append2"(ptr %40, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %65) + %67 = icmp eq ptr %24, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %67) + %68 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %24, i32 0, i32 0 + %69 = icmp eq ptr %68, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %69) + %70 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %68, align 8 + %71 = icmp eq ptr %24, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %71) + %72 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %24, i32 0, i32 0 + %73 = icmp eq ptr %72, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %73) + %74 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %72, align 8 + %75 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %74, 0 + %76 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %74, 1 + %77 = icmp sge i64 0, %76 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %77) + %78 = getelementptr inbounds i64, ptr %75, i64 0 + %79 = icmp eq ptr %78, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %79) + %80 = load i64, ptr %78, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %70) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %57) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %80) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %58 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]string,string]", ptr %23, i32 0, i32 0 - %59 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %58, align 8 - %60 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]string,string]", ptr %23, i32 0, i32 0 - %61 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %60, align 8 - %62 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %61, 0 - %63 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %61, 1 - %64 = icmp sge i64 0, %63 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %64) - %65 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %62, i64 0 - %66 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %65, align 8 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %59) + %81 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %81) + %82 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]string,string]", ptr %32, i32 0, i32 0 + %83 = icmp eq ptr %82, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %83) + %84 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %82, align 8 + %85 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %85) + %86 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]string,string]", ptr %32, i32 0, i32 0 + %87 = icmp eq ptr %86, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %87) + %88 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %86, align 8 + %89 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %88, 0 + %90 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %88, 1 + %91 = icmp sge i64 0, %90 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %91) + %92 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %89, i64 0 + %93 = icmp eq ptr %92, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %93) + %94 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %92, align 8 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %84) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %66) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %94) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %67 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %30, i32 0, i32 0 - %68 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %67, align 8 - %69 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %30, i32 0, i32 0 - %70 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %69, align 8 - %71 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %70, 0 - %72 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %70, 1 - %73 = icmp sge i64 0, %72 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %73) - %74 = getelementptr inbounds i64, ptr %71, i64 0 - %75 = load i64, ptr %74, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %68) + %95 = icmp eq ptr %40, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %95) + %96 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %40, i32 0, i32 0 + %97 = icmp eq ptr %96, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %97) + %98 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %96, align 8 + %99 = icmp eq ptr %40, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %99) + %100 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %40, i32 0, i32 0 + %101 = icmp eq ptr %100, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %101) + %102 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %100, align 8 + %103 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %102, 0 + %104 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %102, 1 + %105 = icmp sge i64 0, %104 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %105) + %106 = getelementptr inbounds i64, ptr %103, i64 0 + %107 = icmp eq ptr %106, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %107) + %108 = load i64, ptr %106, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %98) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %75) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %108) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -151,6 +217,8 @@ _llgo_0: ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) @@ -161,44 +229,74 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) define linkonce %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/tptypes.(*Slice[[]int,int]).Append"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %0, i32 0, i32 0 - %3 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %2, align 8 - %4 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 0 - %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 1 - %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3, ptr %4, i64 %5, i64 8) - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %0, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, ptr %7, align 8 - %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %0, i32 0, i32 0 - %9 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %8, align 8 - ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %0, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %3, align 8 + %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 0 + %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 1 + %8 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, ptr %6, i64 %7, i64 8) + %9 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %0, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, ptr %10, align 8 + %11 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %0, i32 0, i32 0 + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %12, align 8 + ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %14 } define linkonce %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/tptypes.(*Slice[[]string,string]).Append"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]string,string]", ptr %0, i32 0, i32 0 - %3 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %2, align 8 - %4 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 0 - %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 1 - %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3, ptr %4, i64 %5, i64 16) - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]string,string]", ptr %0, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, ptr %7, align 8 - %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]string,string]", ptr %0, i32 0, i32 0 - %9 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %8, align 8 - ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]string,string]", ptr %0, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %3, align 8 + %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 0 + %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 1 + %8 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, ptr %6, i64 %7, i64 16) + %9 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]string,string]", ptr %0, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, ptr %10, align 8 + %11 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]string,string]", ptr %0, i32 0, i32 0 + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %12, align 8 + ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %14 } define linkonce %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testgo/tptypes.(*Slice[[]int,int]).Append2"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %0, i32 0, i32 0 - %3 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %2, align 8 - %4 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 0 - %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 1 - %6 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3, ptr %4, i64 %5, i64 8) - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %0, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, ptr %7, align 8 - %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %0, i32 0, i32 0 - %9 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %8, align 8 - ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %0, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %3, align 8 + %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 0 + %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 1 + %8 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, ptr %6, i64 %7, i64 8) + %9 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %0, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, ptr %10, align 8 + %11 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/tptypes.Slice[[]int,int]", ptr %0, i32 0, i32 0 + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %12, align 8 + ret %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %14 } declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1) diff --git a/cl/_testgo/typerecur/out.ll b/cl/_testgo/typerecur/out.ll index 68ea7f9e74..fcbfc5d2d9 100644 --- a/cl/_testgo/typerecur/out.ll +++ b/cl/_testgo/typerecur/out.ll @@ -10,23 +10,41 @@ source_filename = "github.com/goplus/llgo/cl/_testgo/typerecur" define %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn" @"github.com/goplus/llgo/cl/_testgo/typerecur.countState"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 0 - %2 = load i64, ptr %1, align 4 - %3 = add i64 %2, 1 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 0 - store i64 %3, ptr %4, align 4 - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 0 - %6 = load i64, ptr %5, align 4 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + %5 = add i64 %4, 1 + %6 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 0 + store i64 %5, ptr %7, align 4 + %8 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 0 + %10 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = load i64, ptr %9, align 4 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 6 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %6) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %11) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 0 - %8 = load i64, ptr %7, align 4 - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 1 - %10 = load i64, ptr %9, align 4 - %11 = icmp sge i64 %8, %10 - br i1 %11, label %_llgo_1, label %_llgo_2 + %12 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 0 + %14 = icmp eq ptr %13, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load i64, ptr %13, align 4 + %16 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 1 + %18 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = load i64, ptr %17, align 4 + %20 = icmp sge i64 %15, %19 + br i1 %20, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 ret %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn" zeroinitializer @@ -51,33 +69,49 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testgo/typerecur.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 1 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 2 - store i64 5, ptr %1, align 4 - store %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn" { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/typerecur.countState", ptr null }, ptr %2, align 8 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 2 + store i64 5, ptr %2, align 4 + store %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn" { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testgo/typerecur.countState", ptr null }, ptr %4, align 8 br label %_llgo_3 _llgo_1: ; preds = %_llgo_3 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 2 - %4 = load %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn", ptr %3, align 8 - %5 = extractvalue %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn" %4, 1 - %6 = extractvalue %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn" %4, 0 - %7 = call %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn" %6(ptr %5, ptr %0) - %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 2 - store %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn" %7, ptr %8, align 8 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 2 + %7 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = load %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn", ptr %6, align 8 + %9 = extractvalue %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn" %8, 1 + %10 = extractvalue %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn" %8, 0 + %11 = call %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn" %10(ptr %9, ptr %0) + %12 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 2 + store %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn" %11, ptr %13, align 8 br label %_llgo_3 _llgo_2: ; preds = %_llgo_3 ret void _llgo_3: ; preds = %_llgo_1, %_llgo_0 - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 2 - %10 = load %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn", ptr %9, align 8 - %11 = extractvalue %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn" %10, 0 - %12 = icmp ne ptr %11, null - br i1 %12, label %_llgo_1, label %_llgo_2 + %14 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testgo/typerecur.counter", ptr %0, i32 0, i32 2 + %16 = icmp eq ptr %15, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = load %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn", ptr %15, align 8 + %18 = extractvalue %"github.com/goplus/llgo/cl/_testgo/typerecur.stateFn" %17, 0 + %19 = icmp ne ptr %18, null + br i1 %19, label %_llgo_1, label %_llgo_2 } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String") declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) diff --git a/cl/_testlibc/allocacstrs/out.ll b/cl/_testlibc/allocacstrs/out.ll index 9a99e19ae7..1e0777f6f9 100644 --- a/cl/_testlibc/allocacstrs/out.ll +++ b/cl/_testlibc/allocacstrs/out.ll @@ -26,66 +26,76 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testlibc/allocacstrs.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 48) - %1 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %0, i64 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 1 }, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %0, i64 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 1 }, ptr %2, align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %0, i64 2 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 1 }, ptr %3, align 8 - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %4, i64 3, 1 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, i64 3, 2 - %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, 1 - %8 = add i64 %7, 1 - %9 = alloca ptr, i64 %8, align 8 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %0, i64 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 1 }, ptr %2, align 8 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %0, i64 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 1 }, ptr %4, align 8 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %0, i64 2 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 1 }, ptr %6, align 8 + %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 + %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, i64 3, 1 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, i64 3, 2 + %10 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9, 1 + %11 = add i64 %10, 1 + %12 = alloca ptr, i64 %11, align 8 br label %_llgo_4 _llgo_1: ; preds = %_llgo_3, %_llgo_6 - %10 = phi i64 [ 0, %_llgo_6 ], [ %15, %_llgo_3 ] - %11 = getelementptr ptr, ptr %9, i64 %10 - %12 = load ptr, ptr %11, align 8 - %13 = icmp eq ptr %12, null - br i1 %13, label %_llgo_2, label %_llgo_3 + %13 = phi i64 [ 0, %_llgo_6 ], [ %19, %_llgo_3 ] + %14 = getelementptr ptr, ptr %12, i64 %13 + %15 = icmp eq ptr %14, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = load ptr, ptr %14, align 8 + %17 = icmp eq ptr %16, null + br i1 %17, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 ret void _llgo_3: ; preds = %_llgo_1 - %14 = call i32 (ptr, ...) @printf(ptr @3, ptr %12) - %15 = add i64 %10, 1 + %18 = call i32 (ptr, ...) @printf(ptr @3, ptr %16) + %19 = add i64 %13, 1 br label %_llgo_1 _llgo_4: ; preds = %_llgo_5, %_llgo_0 - %16 = phi i64 [ 0, %_llgo_0 ], [ %30, %_llgo_5 ] - %17 = icmp slt i64 %16, %7 - br i1 %17, label %_llgo_5, label %_llgo_6 + %20 = phi i64 [ 0, %_llgo_0 ], [ %34, %_llgo_5 ] + %21 = icmp slt i64 %20, %10 + br i1 %21, label %_llgo_5, label %_llgo_6 _llgo_5: ; preds = %_llgo_4 - %18 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, 0 - %19 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, 1 - %20 = icmp slt i64 %16, 0 - %21 = icmp sge i64 %16, %19 - %22 = or i1 %21, %20 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %22) - %23 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %18, i64 %16 - %24 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %23, align 8 - %25 = getelementptr ptr, ptr %9, i64 %16 - %26 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %24, 1 - %27 = add i64 %26, 1 - %28 = alloca i8, i64 %27, align 1 - %29 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.CStrCopy"(ptr %28, %"github.com/goplus/llgo/runtime/internal/runtime.String" %24) - store ptr %29, ptr %25, align 8 - %30 = add i64 %16, 1 + %22 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9, 0 + %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9, 1 + %24 = icmp slt i64 %20, 0 + %25 = icmp sge i64 %20, %23 + %26 = or i1 %25, %24 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %26) + %27 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %22, i64 %20 + %28 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %27, align 8 + %29 = getelementptr ptr, ptr %12, i64 %20 + %30 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %28, 1 + %31 = add i64 %30, 1 + %32 = alloca i8, i64 %31, align 1 + %33 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.CStrCopy"(ptr %32, %"github.com/goplus/llgo/runtime/internal/runtime.String" %28) + store ptr %33, ptr %29, align 8 + %34 = add i64 %20, 1 br label %_llgo_4 _llgo_6: ; preds = %_llgo_4 - %31 = getelementptr ptr, ptr %9, i64 %7 - store ptr null, ptr %31, align 8 + %35 = getelementptr ptr, ptr %12, i64 %10 + store ptr null, ptr %35, align 8 br label %_llgo_1 } declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.CStrCopy"(ptr, %"github.com/goplus/llgo/runtime/internal/runtime.String") diff --git a/cl/_testlibc/atomic/out.ll b/cl/_testlibc/atomic/out.ll index 213abeef2d..7598139160 100644 --- a/cl/_testlibc/atomic/out.ll +++ b/cl/_testlibc/atomic/out.ll @@ -28,24 +28,34 @@ _llgo_0: %1 = load atomic i64, ptr %0 seq_cst, align 4 %2 = call i32 (ptr, ...) @printf(ptr @0, i64 %1) %3 = atomicrmw add ptr %0, i64 1 seq_cst, align 8 - %4 = load i64, ptr %0, align 4 - %5 = call i32 (ptr, ...) @printf(ptr @1, i64 %3, i64 %4) - %6 = cmpxchg ptr %0, i64 100, i64 102 seq_cst seq_cst, align 8 - %7 = extractvalue { i64, i1 } %6, 0 - %8 = extractvalue { i64, i1 } %6, 1 - %9 = load i64, ptr %0, align 4 - %10 = call i32 (ptr, ...) @printf(ptr @2, i64 %7, i64 %9) - %11 = cmpxchg ptr %0, i64 101, i64 102 seq_cst seq_cst, align 8 - %12 = extractvalue { i64, i1 } %11, 0 - %13 = extractvalue { i64, i1 } %11, 1 - %14 = load i64, ptr %0, align 4 - %15 = call i32 (ptr, ...) @printf(ptr @3, i64 %12, i64 %14) - %16 = atomicrmw sub ptr %0, i64 1 seq_cst, align 8 + %4 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %0, align 4 + %6 = call i32 (ptr, ...) @printf(ptr @1, i64 %3, i64 %5) + %7 = cmpxchg ptr %0, i64 100, i64 102 seq_cst seq_cst, align 8 + %8 = extractvalue { i64, i1 } %7, 0 + %9 = extractvalue { i64, i1 } %7, 1 + %10 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = load i64, ptr %0, align 4 + %12 = call i32 (ptr, ...) @printf(ptr @2, i64 %8, i64 %11) + %13 = cmpxchg ptr %0, i64 101, i64 102 seq_cst seq_cst, align 8 + %14 = extractvalue { i64, i1 } %13, 0 + %15 = extractvalue { i64, i1 } %13, 1 + %16 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) %17 = load i64, ptr %0, align 4 - %18 = call i32 (ptr, ...) @printf(ptr @4, i64 %16, i64 %17) + %18 = call i32 (ptr, ...) @printf(ptr @3, i64 %14, i64 %17) + %19 = atomicrmw sub ptr %0, i64 1 seq_cst, align 8 + %20 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = load i64, ptr %0, align 4 + %22 = call i32 (ptr, ...) @printf(ptr @4, i64 %19, i64 %21) ret void } declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) declare i32 @printf(ptr, ...) + +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) diff --git a/cl/_testlibgo/atomic/out.ll b/cl/_testlibgo/atomic/out.ll index 23c98c6e5a..7e34c9a34b 100644 --- a/cl/_testlibgo/atomic/out.ll +++ b/cl/_testlibgo/atomic/out.ll @@ -34,47 +34,55 @@ _llgo_0: call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) %2 = atomicrmw add ptr %0, i64 1 seq_cst, align 8 %3 = add i64 %2, 1 - %4 = load i64, ptr %0, align 4 + %4 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %0, align 4 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 4 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %3) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 2 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %4) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %5) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %5 = cmpxchg ptr %0, i64 100, i64 102 seq_cst seq_cst, align 8 - %6 = extractvalue { i64, i1 } %5, 1 - %7 = load i64, ptr %0, align 4 + %6 = cmpxchg ptr %0, i64 100, i64 102 seq_cst seq_cst, align 8 + %7 = extractvalue { i64, i1 } %6, 1 + %8 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load i64, ptr %0, align 4 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 4 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %6) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %7) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 2 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %7) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %9) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %8 = cmpxchg ptr %0, i64 101, i64 102 seq_cst seq_cst, align 8 - %9 = extractvalue { i64, i1 } %8, 1 - %10 = load i64, ptr %0, align 4 + %10 = cmpxchg ptr %0, i64 101, i64 102 seq_cst seq_cst, align 8 + %11 = extractvalue { i64, i1 } %10, 1 + %12 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = load i64, ptr %0, align 4 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 4 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %9) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %11) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 2 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %10) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %13) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %11 = atomicrmw add ptr %0, i64 -1 seq_cst, align 8 - %12 = add i64 %11, -1 - %13 = load i64, ptr %0, align 4 + %14 = atomicrmw add ptr %0, i64 -1 seq_cst, align 8 + %15 = add i64 %14, -1 + %16 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = load i64, ptr %0, align 4 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 4 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %12) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %15) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 2 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %13) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %17) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -89,4 +97,6 @@ declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1) diff --git a/cl/_testpy/list/out.ll b/cl/_testpy/list/out.ll index 2841773a8b..a41ac0d2a5 100644 --- a/cl/_testpy/list/out.ll +++ b/cl/_testpy/list/out.ll @@ -39,60 +39,68 @@ _llgo_0: %1 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.StringToBytes"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }) %2 = alloca [3 x i8], align 1 call void @llvm.memset(ptr %2, i8 0, i64 3, i1 false) - %3 = getelementptr inbounds i8, ptr %2, i64 0 - %4 = getelementptr inbounds i8, ptr %2, i64 1 - %5 = getelementptr inbounds i8, ptr %2, i64 2 - store i8 1, ptr %3, align 1 - store i8 2, ptr %4, align 1 - store i8 3, ptr %5, align 1 - %6 = load [3 x i8], ptr %2, align 1 - %7 = call ptr @PyList_New(i64 14) - %8 = call ptr @PyBool_FromLong(i32 -1) - %9 = call i32 @PyList_SetItem(ptr %7, i64 0, ptr %8) - %10 = call ptr @PyBool_FromLong(i32 0) - %11 = call i32 @PyList_SetItem(ptr %7, i64 1, ptr %10) - %12 = call ptr @PyLong_FromLongLong(i64 1) - %13 = call i32 @PyList_SetItem(ptr %7, i64 2, ptr %12) - %14 = call ptr @PyFloat_FromDouble(double 0x4000CCCCC0000000) - %15 = call i32 @PyList_SetItem(ptr %7, i64 3, ptr %14) - %16 = call ptr @PyFloat_FromDouble(double 3.100000e+00) - %17 = call i32 @PyList_SetItem(ptr %7, i64 4, ptr %16) - %18 = call ptr @PyLong_FromUnsignedLongLong(i64 4) - %19 = call i32 @PyList_SetItem(ptr %7, i64 5, ptr %18) - %20 = call ptr @PyComplex_FromDoubles(double 1.000000e+00, double 2.000000e+00) - %21 = call i32 @PyList_SetItem(ptr %7, i64 6, ptr %20) - %22 = call ptr @PyComplex_FromDoubles(double 3.000000e+00, double 4.000000e+00) - %23 = call i32 @PyList_SetItem(ptr %7, i64 7, ptr %22) - %24 = call ptr @PyUnicode_FromStringAndSize(ptr @1, i64 5) - %25 = call i32 @PyList_SetItem(ptr %7, i64 8, ptr %24) - %26 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 0 - %27 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 1 - %28 = call ptr @PyByteArray_FromStringAndSize(ptr %26, i64 %27) - %29 = call i32 @PyList_SetItem(ptr %7, i64 9, ptr %28) - %30 = alloca [3 x i8], align 1 - call void @llvm.memset(ptr %30, i8 0, i64 3, i1 false) - store [3 x i8] %6, ptr %30, align 1 - %31 = getelementptr inbounds ptr, ptr %30, i64 0 - %32 = call ptr @PyBytes_FromStringAndSize(ptr %31, i64 3) - %33 = call i32 @PyList_SetItem(ptr %7, i64 10, ptr %32) - %34 = call ptr @PyBytes_FromStringAndSize(ptr null, i64 0) - %35 = call i32 @PyList_SetItem(ptr %7, i64 11, ptr %34) - %36 = ptrtoint ptr %0 to i64 - %37 = call ptr @PyLong_FromUnsignedLongLong(i64 %36) - %38 = call i32 @PyList_SetItem(ptr %7, i64 12, ptr %37) - %39 = ptrtoint ptr %0 to i64 - %40 = call ptr @PyLong_FromUnsignedLongLong(i64 %39) - %41 = call i32 @PyList_SetItem(ptr %7, i64 13, ptr %40) - %42 = load ptr, ptr @__llgo_py.math, align 8 - %43 = call ptr @PyObject_GetAttrString(ptr %42, ptr @2) - %44 = call ptr @PyList_New(i64 3) - %45 = load ptr, ptr @__llgo_py.builtins.abs, align 8 - %46 = call i32 @PyList_SetItem(ptr %44, i64 0, ptr %45) - %47 = load ptr, ptr @__llgo_py.builtins.print, align 8 - %48 = call i32 @PyList_SetItem(ptr %44, i64 1, ptr %47) - %49 = call i32 @PyList_SetItem(ptr %44, i64 2, ptr %43) - %50 = load ptr, ptr @__llgo_py.builtins.print, align 8 - %51 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %50, ptr %7, ptr %44, ptr null) + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds i8, ptr %2, i64 0 + %5 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds i8, ptr %2, i64 1 + %7 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds i8, ptr %2, i64 2 + store i8 1, ptr %4, align 1 + store i8 2, ptr %6, align 1 + store i8 3, ptr %8, align 1 + %9 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = load [3 x i8], ptr %2, align 1 + %11 = call ptr @PyList_New(i64 14) + %12 = call ptr @PyBool_FromLong(i32 -1) + %13 = call i32 @PyList_SetItem(ptr %11, i64 0, ptr %12) + %14 = call ptr @PyBool_FromLong(i32 0) + %15 = call i32 @PyList_SetItem(ptr %11, i64 1, ptr %14) + %16 = call ptr @PyLong_FromLongLong(i64 1) + %17 = call i32 @PyList_SetItem(ptr %11, i64 2, ptr %16) + %18 = call ptr @PyFloat_FromDouble(double 0x4000CCCCC0000000) + %19 = call i32 @PyList_SetItem(ptr %11, i64 3, ptr %18) + %20 = call ptr @PyFloat_FromDouble(double 3.100000e+00) + %21 = call i32 @PyList_SetItem(ptr %11, i64 4, ptr %20) + %22 = call ptr @PyLong_FromUnsignedLongLong(i64 4) + %23 = call i32 @PyList_SetItem(ptr %11, i64 5, ptr %22) + %24 = call ptr @PyComplex_FromDoubles(double 1.000000e+00, double 2.000000e+00) + %25 = call i32 @PyList_SetItem(ptr %11, i64 6, ptr %24) + %26 = call ptr @PyComplex_FromDoubles(double 3.000000e+00, double 4.000000e+00) + %27 = call i32 @PyList_SetItem(ptr %11, i64 7, ptr %26) + %28 = call ptr @PyUnicode_FromStringAndSize(ptr @1, i64 5) + %29 = call i32 @PyList_SetItem(ptr %11, i64 8, ptr %28) + %30 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 0 + %31 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, 1 + %32 = call ptr @PyByteArray_FromStringAndSize(ptr %30, i64 %31) + %33 = call i32 @PyList_SetItem(ptr %11, i64 9, ptr %32) + %34 = alloca [3 x i8], align 1 + call void @llvm.memset(ptr %34, i8 0, i64 3, i1 false) + store [3 x i8] %10, ptr %34, align 1 + %35 = getelementptr inbounds ptr, ptr %34, i64 0 + %36 = call ptr @PyBytes_FromStringAndSize(ptr %35, i64 3) + %37 = call i32 @PyList_SetItem(ptr %11, i64 10, ptr %36) + %38 = call ptr @PyBytes_FromStringAndSize(ptr null, i64 0) + %39 = call i32 @PyList_SetItem(ptr %11, i64 11, ptr %38) + %40 = ptrtoint ptr %0 to i64 + %41 = call ptr @PyLong_FromUnsignedLongLong(i64 %40) + %42 = call i32 @PyList_SetItem(ptr %11, i64 12, ptr %41) + %43 = ptrtoint ptr %0 to i64 + %44 = call ptr @PyLong_FromUnsignedLongLong(i64 %43) + %45 = call i32 @PyList_SetItem(ptr %11, i64 13, ptr %44) + %46 = load ptr, ptr @__llgo_py.math, align 8 + %47 = call ptr @PyObject_GetAttrString(ptr %46, ptr @2) + %48 = call ptr @PyList_New(i64 3) + %49 = load ptr, ptr @__llgo_py.builtins.abs, align 8 + %50 = call i32 @PyList_SetItem(ptr %48, i64 0, ptr %49) + %51 = load ptr, ptr @__llgo_py.builtins.print, align 8 + %52 = call i32 @PyList_SetItem(ptr %48, i64 1, ptr %51) + %53 = call i32 @PyList_SetItem(ptr %48, i64 2, ptr %47) + %54 = load ptr, ptr @__llgo_py.builtins.print, align 8 + %55 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %54, ptr %11, ptr %48, ptr null) ret void } @@ -107,6 +115,8 @@ declare %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/go ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @PyList_New(i64) declare ptr @PyBool_FromLong(i32) diff --git a/cl/_testrt/abinamed/out.ll b/cl/_testrt/abinamed/out.ll index 115b6a54ac..9ffed636c2 100644 --- a/cl/_testrt/abinamed/out.ll +++ b/cl/_testrt/abinamed/out.ll @@ -26,21 +26,21 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/abinamed" @4 = private unnamed_addr constant [8 x i8] c"abi.Type", align 1 @"_llgo_github.com/goplus/llgo/runtime/abi.Type" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 72, i64 72, i32 -917965754, i8 5, i8 8, i8 8, i8 25, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 8 }, ptr @"*_llgo_github.com/goplus/llgo/runtime/abi.Type" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_struct$2mXuqn9SiezStb0ROUShDkM7v8PjmuD-3YekCy58xL4$fields", i64 11, i64 11 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 34 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @5 = private unnamed_addr constant [5 x i8] c"Size_", align 1 -@_llgo_uintptr = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1268343028, i8 12, i8 8, i8 8, i8 44, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 7 }, ptr @"*_llgo_uintptr" }, align 8 +@_llgo_uintptr = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1268343028, i8 12, i8 8, i8 8, i8 12, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 7 }, ptr @"*_llgo_uintptr" }, align 8 @6 = private unnamed_addr constant [7 x i8] c"uintptr", align 1 @"*_llgo_uintptr" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1684891952, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 7 }, ptr null }, ptr @_llgo_uintptr }, align 8 @7 = private unnamed_addr constant [8 x i8] c"PtrBytes", align 1 @8 = private unnamed_addr constant [4 x i8] c"Hash", align 1 -@_llgo_uint32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 -625909322, i8 12, i8 4, i8 4, i8 42, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 6 }, ptr @"*_llgo_uint32" }, align 8 +@_llgo_uint32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 -625909322, i8 12, i8 4, i8 4, i8 10, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 6 }, ptr @"*_llgo_uint32" }, align 8 @9 = private unnamed_addr constant [6 x i8] c"uint32", align 1 @"*_llgo_uint32" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1605480511, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 6 }, ptr null }, ptr @_llgo_uint32 }, align 8 @10 = private unnamed_addr constant [5 x i8] c"TFlag", align 1 -@"_llgo_github.com/goplus/llgo/runtime/abi.TFlag" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 -970537592, i8 13, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 9 }, ptr @"*_llgo_github.com/goplus/llgo/runtime/abi.TFlag" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 34 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@"_llgo_github.com/goplus/llgo/runtime/abi.TFlag" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 -970537592, i8 13, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 9 }, ptr @"*_llgo_github.com/goplus/llgo/runtime/abi.TFlag" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 34 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @11 = private unnamed_addr constant [9 x i8] c"abi.TFlag", align 1 @"*_llgo_github.com/goplus/llgo/runtime/abi.TFlag" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1505104728, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 9 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/runtime/abi.TFlag" }, align 8 @12 = private unnamed_addr constant [34 x i8] c"github.com/goplus/llgo/runtime/abi", align 1 @13 = private unnamed_addr constant [6 x i8] c"Align_", align 1 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @14 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @15 = private unnamed_addr constant [11 x i8] c"FieldAlign_", align 1 @@ -57,7 +57,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/abinamed" @21 = private unnamed_addr constant [14 x i8] c"unsafe.Pointer", align 1 @"*_llgo_Pointer" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1134390089, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @21, i64 14 }, ptr null }, ptr @_llgo_Pointer }, align 8 @"_llgo_func$fC75jGwF1nV5TF91gEeTF_JCtbG9Z7_yOawHBxqBh6E$in" = weak_odr constant [2 x ptr] [ptr @_llgo_Pointer, ptr @_llgo_Pointer], align 8 -@_llgo_bool = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 554183389, i8 12, i8 1, i8 1, i8 33, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @22, i64 4 }, ptr @"*_llgo_bool" }, align 8 +@_llgo_bool = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 554183389, i8 12, i8 1, i8 1, i8 1, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @22, i64 4 }, ptr @"*_llgo_bool" }, align 8 @22 = private unnamed_addr constant [4 x i8] c"bool", align 1 @"*_llgo_bool" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1896950390, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @22, i64 4 }, ptr null }, ptr @_llgo_bool }, align 8 @"_llgo_func$fC75jGwF1nV5TF91gEeTF_JCtbG9Z7_yOawHBxqBh6E$out" = weak_odr constant [1 x ptr] [ptr @_llgo_bool], align 8 @@ -74,7 +74,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/abinamed" @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 2131144854, i8 0, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @29, i64 10 }, ptr @"*_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA$out", i64 1, i64 1 } }, align 8 @29 = private unnamed_addr constant [10 x i8] c"func() int", align 1 @"*_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1805835775, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @29, i64 10 }, ptr null }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @30, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @30, i64 3 }, ptr @"*_llgo_int" }, align 8 @30 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @30, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA$out" = weak_odr constant [1 x ptr] [ptr @_llgo_int], align 8 @@ -94,7 +94,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/abinamed" @"_llgo_func$Qwe8YykhcqDIDEcT1jS_t1iUv4Im6IdGf17ASgXRQdc" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1945881610, i8 0, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @39, i64 18 }, ptr @"*_llgo_func$Qwe8YykhcqDIDEcT1jS_t1iUv4Im6IdGf17ASgXRQdc" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$Qwe8YykhcqDIDEcT1jS_t1iUv4Im6IdGf17ASgXRQdc$out", i64 1, i64 1 } }, align 8 @39 = private unnamed_addr constant [18 x i8] c"func() abi.ChanDir", align 1 @"*_llgo_func$Qwe8YykhcqDIDEcT1jS_t1iUv4Im6IdGf17ASgXRQdc" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -326435628, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @39, i64 18 }, ptr null }, ptr @"_llgo_func$Qwe8YykhcqDIDEcT1jS_t1iUv4Im6IdGf17ASgXRQdc" }, align 8 -@"_llgo_github.com/goplus/llgo/runtime/abi.ChanDir" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1144193706, i8 13, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @40, i64 11 }, ptr @"*_llgo_github.com/goplus/llgo/runtime/abi.ChanDir" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 34 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@"_llgo_github.com/goplus/llgo/runtime/abi.ChanDir" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1144193706, i8 13, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @40, i64 11 }, ptr @"*_llgo_github.com/goplus/llgo/runtime/abi.ChanDir" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 34 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @40 = private unnamed_addr constant [11 x i8] c"abi.ChanDir", align 1 @"*_llgo_github.com/goplus/llgo/runtime/abi.ChanDir" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -460673264, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @40, i64 11 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/runtime/abi.ChanDir" }, align 8 @"_llgo_func$Qwe8YykhcqDIDEcT1jS_t1iUv4Im6IdGf17ASgXRQdc$out" = weak_odr constant [1 x ptr] [ptr @"_llgo_github.com/goplus/llgo/runtime/abi.ChanDir"], align 8 @@ -177,7 +177,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/abinamed" @"_llgo_func$Hsg8cfKiWmyMHfTCLbUouCMFmF6kp9x3qasAGPBLLfc" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1946464100, i8 0, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @78, i64 15 }, ptr @"*_llgo_func$Hsg8cfKiWmyMHfTCLbUouCMFmF6kp9x3qasAGPBLLfc" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$Hsg8cfKiWmyMHfTCLbUouCMFmF6kp9x3qasAGPBLLfc$out", i64 1, i64 1 } }, align 8 @78 = private unnamed_addr constant [15 x i8] c"func() abi.Kind", align 1 @"*_llgo_func$Hsg8cfKiWmyMHfTCLbUouCMFmF6kp9x3qasAGPBLLfc" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1206160253, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @78, i64 15 }, ptr null }, ptr @"_llgo_func$Hsg8cfKiWmyMHfTCLbUouCMFmF6kp9x3qasAGPBLLfc" }, align 8 -@"_llgo_github.com/goplus/llgo/runtime/abi.Kind" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 563955062, i8 13, i8 8, i8 8, i8 39, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @79, i64 8 }, ptr @"*_llgo_github.com/goplus/llgo/runtime/abi.Kind" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 34 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @80, i64 6 }, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", ptr @"github.com/goplus/llgo/runtime/abi.(*Kind).String", ptr @"github.com/goplus/llgo/runtime/abi.Kind.String" }] }, align 8 +@"_llgo_github.com/goplus/llgo/runtime/abi.Kind" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 563955062, i8 13, i8 8, i8 8, i8 7, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @79, i64 8 }, ptr @"*_llgo_github.com/goplus/llgo/runtime/abi.Kind" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 34 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @80, i64 6 }, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", ptr @"github.com/goplus/llgo/runtime/abi.(*Kind).String", ptr @"github.com/goplus/llgo/runtime/abi.Kind.String" }] }, align 8 @79 = private unnamed_addr constant [8 x i8] c"abi.Kind", align 1 @"*_llgo_github.com/goplus/llgo/runtime/abi.Kind" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1420086957, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @79, i64 8 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/runtime/abi.Kind" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 34 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @80, i64 6 }, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", ptr @"github.com/goplus/llgo/runtime/abi.(*Kind).String", ptr @"github.com/goplus/llgo/runtime/abi.(*Kind).String" }] }, align 8 @80 = private unnamed_addr constant [6 x i8] c"String", align 1 @@ -203,7 +203,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/abinamed" @88 = private unnamed_addr constant [7 x i8] c"KeySize", align 1 @89 = private unnamed_addr constant [9 x i8] c"ValueSize", align 1 @90 = private unnamed_addr constant [10 x i8] c"BucketSize", align 1 -@_llgo_uint16 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 2, i64 0, i32 -75471123, i8 12, i8 2, i8 2, i8 41, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal16", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @91, i64 6 }, ptr @"*_llgo_uint16" }, align 8 +@_llgo_uint16 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 2, i64 0, i32 -75471123, i8 12, i8 2, i8 2, i8 9, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal16", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @91, i64 6 }, ptr @"*_llgo_uint16" }, align 8 @91 = private unnamed_addr constant [6 x i8] c"uint16", align 1 @"*_llgo_uint16" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 530818523, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @91, i64 6 }, ptr null }, ptr @_llgo_uint16 }, align 8 @92 = private unnamed_addr constant [5 x i8] c"Flags", align 1 @@ -299,186 +299,314 @@ _llgo_0: store %"github.com/goplus/llgo/runtime/abi.Type" zeroinitializer, ptr %3, align 8 %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/runtime/abi.Type", ptr undef }, ptr %3, 1 %5 = call ptr @"github.com/goplus/llgo/cl/_testrt/abinamed.toEface"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %4) - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 - %7 = load ptr, ptr %6, align 8 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %7) + %6 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load ptr, ptr %7, align 8 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %9) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 - %9 = load ptr, ptr %8, align 8 - %10 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %9, i32 0, i32 10 - %11 = load ptr, ptr %10, align 8 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %11) + %10 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 + %12 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = load ptr, ptr %11, align 8 + %14 = icmp eq ptr %13, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %13, i32 0, i32 10 + %16 = icmp eq ptr %15, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = load ptr, ptr %15, align 8 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %17) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %5, i32 0, i32 0 - %13 = load ptr, ptr %12, align 8 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %13) + %18 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %5, i32 0, i32 0 + %20 = icmp eq ptr %19, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = load ptr, ptr %19, align 8 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %21) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %14 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %5, i32 0, i32 0 - %15 = load ptr, ptr %14, align 8 - %16 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %15, i32 0, i32 10 - %17 = load ptr, ptr %16, align 8 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %17) + %22 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %22) + %23 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %5, i32 0, i32 0 + %24 = icmp eq ptr %23, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %24) + %25 = load ptr, ptr %23, align 8 + %26 = icmp eq ptr %25, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %26) + %27 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %25, i32 0, i32 10 + %28 = icmp eq ptr %27, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %28) + %29 = load ptr, ptr %27, align 8 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %29) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %18 = alloca %"github.com/goplus/llgo/runtime/abi.StructField", align 8 - call void @llvm.memset(ptr %18, i8 0, i64 56, i1 false) - %19 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 - %20 = load ptr, ptr %19, align 8 - %21 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).StructType"(ptr %20) - %22 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructType", ptr %21, i32 0, i32 2 - %23 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %22, align 8 - %24 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, 0 - %25 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %23, 1 - %26 = icmp sge i64 0, %25 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %26) - %27 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %24, i64 0 - %28 = load %"github.com/goplus/llgo/runtime/abi.StructField", ptr %27, align 8 - store %"github.com/goplus/llgo/runtime/abi.StructField" %28, ptr %18, align 8 - %29 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %18, i32 0, i32 1 - %30 = load ptr, ptr %29, align 8 - %31 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 - %32 = load ptr, ptr %31, align 8 - %33 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %32, i32 0, i32 10 - %34 = load ptr, ptr %33, align 8 - %35 = icmp ne ptr %30, %34 - br i1 %35, label %_llgo_1, label %_llgo_2 + %30 = alloca %"github.com/goplus/llgo/runtime/abi.StructField", align 8 + call void @llvm.memset(ptr %30, i8 0, i64 56, i1 false) + %31 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %31) + %32 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 + %33 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %33) + %34 = load ptr, ptr %32, align 8 + %35 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).StructType"(ptr %34) + %36 = icmp eq ptr %35, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %36) + %37 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructType", ptr %35, i32 0, i32 2 + %38 = icmp eq ptr %37, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %38) + %39 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %37, align 8 + %40 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %39, 0 + %41 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %39, 1 + %42 = icmp sge i64 0, %41 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %42) + %43 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %40, i64 0 + %44 = icmp eq ptr %43, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %44) + %45 = load %"github.com/goplus/llgo/runtime/abi.StructField", ptr %43, align 8 + store %"github.com/goplus/llgo/runtime/abi.StructField" %45, ptr %30, align 8 + %46 = icmp eq ptr %30, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %46) + %47 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %30, i32 0, i32 1 + %48 = icmp eq ptr %47, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %48) + %49 = load ptr, ptr %47, align 8 + %50 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %50) + %51 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 + %52 = icmp eq ptr %51, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %52) + %53 = load ptr, ptr %51, align 8 + %54 = icmp eq ptr %53, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %54) + %55 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %53, i32 0, i32 10 + %56 = icmp eq ptr %55, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %56) + %57 = load ptr, ptr %55, align 8 + %58 = icmp ne ptr %49, %57 + br i1 %58, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @125, i64 13 }, ptr %36, align 8 - %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %36, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %37) + %59 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @125, i64 13 }, ptr %59, align 8 + %60 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %59, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %60) unreachable _llgo_2: ; preds = %_llgo_0 - %38 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %18, i32 0, i32 1 - %39 = load ptr, ptr %38, align 8 - %40 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Elem"(ptr %39) - %41 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 - %42 = load ptr, ptr %41, align 8 - %43 = icmp ne ptr %40, %42 - br i1 %43, label %_llgo_3, label %_llgo_4 + %61 = icmp eq ptr %30, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %61) + %62 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %30, i32 0, i32 1 + %63 = icmp eq ptr %62, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %63) + %64 = load ptr, ptr %62, align 8 + %65 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Elem"(ptr %64) + %66 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %66) + %67 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 + %68 = icmp eq ptr %67, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %68) + %69 = load ptr, ptr %67, align 8 + %70 = icmp ne ptr %65, %69 + br i1 %70, label %_llgo_3, label %_llgo_4 _llgo_3: ; preds = %_llgo_2 - %44 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @126, i64 18 }, ptr %44, align 8 - %45 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %44, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %45) + %71 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @126, i64 18 }, ptr %71, align 8 + %72 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %71, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %72) unreachable _llgo_4: ; preds = %_llgo_2 - %46 = alloca %"github.com/goplus/llgo/runtime/abi.StructField", align 8 - call void @llvm.memset(ptr %46, i8 0, i64 56, i1 false) - %47 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 - %48 = load ptr, ptr %47, align 8 - %49 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).StructType"(ptr %48) - %50 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructType", ptr %49, i32 0, i32 2 - %51 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %50, align 8 - %52 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %51, 0 - %53 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %51, 1 - %54 = icmp sge i64 1, %53 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %54) - %55 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %52, i64 1 - %56 = load %"github.com/goplus/llgo/runtime/abi.StructField", ptr %55, align 8 - store %"github.com/goplus/llgo/runtime/abi.StructField" %56, ptr %46, align 8 - %57 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %46, i32 0, i32 1 - %58 = load ptr, ptr %57, align 8 - %59 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %5, i32 0, i32 0 - %60 = load ptr, ptr %59, align 8 - %61 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %60, i32 0, i32 10 - %62 = load ptr, ptr %61, align 8 - %63 = icmp ne ptr %58, %62 - br i1 %63, label %_llgo_5, label %_llgo_6 + %73 = alloca %"github.com/goplus/llgo/runtime/abi.StructField", align 8 + call void @llvm.memset(ptr %73, i8 0, i64 56, i1 false) + %74 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %74) + %75 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 + %76 = icmp eq ptr %75, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %76) + %77 = load ptr, ptr %75, align 8 + %78 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).StructType"(ptr %77) + %79 = icmp eq ptr %78, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %79) + %80 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructType", ptr %78, i32 0, i32 2 + %81 = icmp eq ptr %80, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %81) + %82 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %80, align 8 + %83 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %82, 0 + %84 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %82, 1 + %85 = icmp sge i64 1, %84 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %85) + %86 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %83, i64 1 + %87 = icmp eq ptr %86, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %87) + %88 = load %"github.com/goplus/llgo/runtime/abi.StructField", ptr %86, align 8 + store %"github.com/goplus/llgo/runtime/abi.StructField" %88, ptr %73, align 8 + %89 = icmp eq ptr %73, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %89) + %90 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %73, i32 0, i32 1 + %91 = icmp eq ptr %90, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %91) + %92 = load ptr, ptr %90, align 8 + %93 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %93) + %94 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %5, i32 0, i32 0 + %95 = icmp eq ptr %94, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %95) + %96 = load ptr, ptr %94, align 8 + %97 = icmp eq ptr %96, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %97) + %98 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %96, i32 0, i32 10 + %99 = icmp eq ptr %98, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %99) + %100 = load ptr, ptr %98, align 8 + %101 = icmp ne ptr %92, %100 + br i1 %101, label %_llgo_5, label %_llgo_6 _llgo_5: ; preds = %_llgo_4 - %64 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @127, i64 13 }, ptr %64, align 8 - %65 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %64, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %65) + %102 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @127, i64 13 }, ptr %102, align 8 + %103 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %102, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %103) unreachable _llgo_6: ; preds = %_llgo_4 - %66 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %46, i32 0, i32 1 - %67 = load ptr, ptr %66, align 8 - %68 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Elem"(ptr %67) - %69 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %5, i32 0, i32 0 - %70 = load ptr, ptr %69, align 8 - %71 = icmp ne ptr %68, %70 - br i1 %71, label %_llgo_7, label %_llgo_8 + %104 = icmp eq ptr %73, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %104) + %105 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %73, i32 0, i32 1 + %106 = icmp eq ptr %105, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %106) + %107 = load ptr, ptr %105, align 8 + %108 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Elem"(ptr %107) + %109 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %109) + %110 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %5, i32 0, i32 0 + %111 = icmp eq ptr %110, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %111) + %112 = load ptr, ptr %110, align 8 + %113 = icmp ne ptr %108, %112 + br i1 %113, label %_llgo_7, label %_llgo_8 _llgo_7: ; preds = %_llgo_6 - %72 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @128, i64 18 }, ptr %72, align 8 - %73 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %72, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %73) + %114 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @128, i64 18 }, ptr %114, align 8 + %115 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %114, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %115) unreachable _llgo_8: ; preds = %_llgo_6 - %74 = alloca %"github.com/goplus/llgo/runtime/abi.StructField", align 8 - call void @llvm.memset(ptr %74, i8 0, i64 56, i1 false) - %75 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 - %76 = load ptr, ptr %75, align 8 - %77 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).StructType"(ptr %76) - %78 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructType", ptr %77, i32 0, i32 2 - %79 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %78, align 8 - %80 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %79, 0 - %81 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %79, 1 - %82 = icmp sge i64 2, %81 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %82) - %83 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %80, i64 2 - %84 = load %"github.com/goplus/llgo/runtime/abi.StructField", ptr %83, align 8 - store %"github.com/goplus/llgo/runtime/abi.StructField" %84, ptr %74, align 8 - %85 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %74, i32 0, i32 1 - %86 = load ptr, ptr %85, align 8 - %87 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %5, i32 0, i32 0 - %88 = load ptr, ptr %87, align 8 - %89 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).StructType"(ptr %88) - %90 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructType", ptr %89, i32 0, i32 2 - %91 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %90, align 8 - %92 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %91, 0 - %93 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %91, 1 - %94 = icmp sge i64 0, %93 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %94) - %95 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %92, i64 0 - %96 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %95, i32 0, i32 1 - %97 = load ptr, ptr %96, align 8 - %98 = icmp ne ptr %86, %97 - br i1 %98, label %_llgo_9, label %_llgo_10 + %116 = alloca %"github.com/goplus/llgo/runtime/abi.StructField", align 8 + call void @llvm.memset(ptr %116, i8 0, i64 56, i1 false) + %117 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %117) + %118 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 + %119 = icmp eq ptr %118, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %119) + %120 = load ptr, ptr %118, align 8 + %121 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).StructType"(ptr %120) + %122 = icmp eq ptr %121, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %122) + %123 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructType", ptr %121, i32 0, i32 2 + %124 = icmp eq ptr %123, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %124) + %125 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %123, align 8 + %126 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %125, 0 + %127 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %125, 1 + %128 = icmp sge i64 2, %127 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %128) + %129 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %126, i64 2 + %130 = icmp eq ptr %129, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %130) + %131 = load %"github.com/goplus/llgo/runtime/abi.StructField", ptr %129, align 8 + store %"github.com/goplus/llgo/runtime/abi.StructField" %131, ptr %116, align 8 + %132 = icmp eq ptr %116, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %132) + %133 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %116, i32 0, i32 1 + %134 = icmp eq ptr %133, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %134) + %135 = load ptr, ptr %133, align 8 + %136 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %136) + %137 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %5, i32 0, i32 0 + %138 = icmp eq ptr %137, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %138) + %139 = load ptr, ptr %137, align 8 + %140 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).StructType"(ptr %139) + %141 = icmp eq ptr %140, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %141) + %142 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructType", ptr %140, i32 0, i32 2 + %143 = icmp eq ptr %142, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %143) + %144 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %142, align 8 + %145 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %144, 0 + %146 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %144, 1 + %147 = icmp sge i64 0, %146 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %147) + %148 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %145, i64 0 + %149 = icmp eq ptr %148, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %149) + %150 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %148, i32 0, i32 1 + %151 = icmp eq ptr %150, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %151) + %152 = load ptr, ptr %150, align 8 + %153 = icmp ne ptr %135, %152 + br i1 %153, label %_llgo_9, label %_llgo_10 _llgo_9: ; preds = %_llgo_8 - %99 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @129, i64 13 }, ptr %99, align 8 - %100 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %99, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %100) + %154 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @129, i64 13 }, ptr %154, align 8 + %155 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %154, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %155) unreachable _llgo_10: ; preds = %_llgo_8 - %101 = alloca %"github.com/goplus/llgo/runtime/abi.StructField", align 8 - call void @llvm.memset(ptr %101, i8 0, i64 56, i1 false) - %102 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 - %103 = load ptr, ptr %102, align 8 - %104 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).StructType"(ptr %103) - %105 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructType", ptr %104, i32 0, i32 2 - %106 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %105, align 8 - %107 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %106, 0 - %108 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %106, 1 - %109 = icmp sge i64 3, %108 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %109) - %110 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %107, i64 3 - %111 = load %"github.com/goplus/llgo/runtime/abi.StructField", ptr %110, align 8 - store %"github.com/goplus/llgo/runtime/abi.StructField" %111, ptr %101, align 8 - %112 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %101, i32 0, i32 1 - %113 = load ptr, ptr %112, align 8 - %114 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Elem"(ptr %113) - %115 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 - %116 = load ptr, ptr %115, align 8 - %117 = icmp ne ptr %114, %116 - br i1 %117, label %_llgo_11, label %_llgo_12 + %156 = alloca %"github.com/goplus/llgo/runtime/abi.StructField", align 8 + call void @llvm.memset(ptr %156, i8 0, i64 56, i1 false) + %157 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %157) + %158 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 + %159 = icmp eq ptr %158, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %159) + %160 = load ptr, ptr %158, align 8 + %161 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).StructType"(ptr %160) + %162 = icmp eq ptr %161, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %162) + %163 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructType", ptr %161, i32 0, i32 2 + %164 = icmp eq ptr %163, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %164) + %165 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %163, align 8 + %166 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %165, 0 + %167 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %165, 1 + %168 = icmp sge i64 3, %167 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %168) + %169 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %166, i64 3 + %170 = icmp eq ptr %169, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %170) + %171 = load %"github.com/goplus/llgo/runtime/abi.StructField", ptr %169, align 8 + store %"github.com/goplus/llgo/runtime/abi.StructField" %171, ptr %156, align 8 + %172 = icmp eq ptr %156, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %172) + %173 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.StructField", ptr %156, i32 0, i32 1 + %174 = icmp eq ptr %173, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %174) + %175 = load ptr, ptr %173, align 8 + %176 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Elem"(ptr %175) + %177 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %177) + %178 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abinamed.eface", ptr %2, i32 0, i32 0 + %179 = icmp eq ptr %178, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %179) + %180 = load ptr, ptr %178, align 8 + %181 = icmp ne ptr %176, %180 + br i1 %181, label %_llgo_11, label %_llgo_12 _llgo_11: ; preds = %_llgo_10 - %118 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @130, i64 13 }, ptr %118, align 8 - %119 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %118, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %119) + %182 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @130, i64 13 }, ptr %182, align 8 + %183 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %182, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %183) unreachable _llgo_12: ; preds = %_llgo_10 @@ -862,6 +990,8 @@ declare ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Uncommon"(ptr) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) diff --git a/cl/_testrt/abitype/out.ll b/cl/_testrt/abitype/out.ll index 4387799496..7a8df86b94 100644 --- a/cl/_testrt/abitype/out.ll +++ b/cl/_testrt/abitype/out.ll @@ -8,14 +8,14 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/abitype" %"github.com/goplus/llgo/cl/_testrt/abitype.eface" = type { ptr, ptr } @"github.com/goplus/llgo/cl/_testrt/abitype.init$guard" = global i1 false, align 1 -@_llgo_int32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 1448558410, i8 12, i8 4, i8 4, i8 37, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr @"*_llgo_int32" }, align 8 +@_llgo_int32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 1448558410, i8 12, i8 4, i8 4, i8 5, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr @"*_llgo_int32" }, align 8 @0 = private unnamed_addr constant [5 x i8] c"int32", align 1 @"*_llgo_int32" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -38689692, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr null }, ptr @_llgo_int32 }, align 8 @1 = private unnamed_addr constant [14 x i8] c"abi rune error", align 1 @_llgo_string = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 8, i32 1749264893, i8 4, i8 8, i8 8, i8 24, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.strequal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 6 }, ptr @"*_llgo_string" }, align 8 @2 = private unnamed_addr constant [6 x i8] c"string", align 1 @"*_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1323879264, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 6 }, ptr null }, ptr @_llgo_string }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @3 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @4 = private unnamed_addr constant [14 x i8] c"abi byte error", align 1 @@ -37,35 +37,49 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/abitype.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr null }, ptr %0, align 8 - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abitype.eface", ptr %0, i32 0, i32 0 - %2 = load ptr, ptr %1, align 8 - %3 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/abi.(*Type).String"(ptr %2) - %4 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %3, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }) - %5 = xor i1 %4, true - br i1 %5, label %_llgo_1, label %_llgo_2 + %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 4) + store i32 0, ptr %1, align 4 + %2 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %2, ptr %0, align 8 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abitype.eface", ptr %0, i32 0, i32 0 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %4, align 8 + %7 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/abi.(*Type).String"(ptr %6) + %8 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %7, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }) + %9 = xor i1 %8, true + br i1 %9, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 14 }, ptr %6, align 8 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %6, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %7) + %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 14 }, ptr %10, align 8 + %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %10, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %11) unreachable _llgo_2: ; preds = %_llgo_0 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr null }, ptr %0, align 8 - %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abitype.eface", ptr %0, i32 0, i32 0 - %9 = load ptr, ptr %8, align 8 - %10 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/abi.(*Type).String"(ptr %9) - %11 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %10, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 5 }) - %12 = xor i1 %11, true - br i1 %12, label %_llgo_3, label %_llgo_4 + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 1) + store i8 0, ptr %12, align 1 + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %12, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %13, ptr %0, align 8 + %14 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/abitype.eface", ptr %0, i32 0, i32 0 + %16 = icmp eq ptr %15, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = load ptr, ptr %15, align 8 + %18 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/abi.(*Type).String"(ptr %17) + %19 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %18, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 5 }) + %20 = xor i1 %19, true + br i1 %20, label %_llgo_3, label %_llgo_4 _llgo_3: ; preds = %_llgo_2 - %13 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 14 }, ptr %13, align 8 - %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %13, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %14) + %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 14 }, ptr %21, align 8 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %21, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %22) unreachable _llgo_4: ; preds = %_llgo_2 @@ -92,6 +106,10 @@ _llgo_0: ret i1 %3 } +declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) + +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/abi.(*Type).String"(ptr) declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.String") @@ -104,8 +122,6 @@ _llgo_0: ret i1 %3 } -declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) - declare void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface") declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequal8"(ptr, ptr) diff --git a/cl/_testrt/any/out.ll b/cl/_testrt/any/out.ll index 3e9de5bb75..3b4b0dd8ac 100644 --- a/cl/_testrt/any/out.ll +++ b/cl/_testrt/any/out.ll @@ -9,12 +9,12 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/any" @"github.com/goplus/llgo/cl/_testrt/any.init$guard" = global i1 false, align 1 @"*_llgo_int8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1399554408, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 4 }, ptr null }, ptr @_llgo_int8 }, align 8 @0 = private unnamed_addr constant [4 x i8] c"int8", align 1 -@_llgo_int8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 1444672578, i8 12, i8 1, i8 1, i8 35, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 4 }, ptr @"*_llgo_int8" }, align 8 +@_llgo_int8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 1444672578, i8 12, i8 1, i8 1, i8 3, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 4 }, ptr @"*_llgo_int8" }, align 8 @1 = private unnamed_addr constant [58 x i8] c"type assertion any -> *github.com/goplus/lib/c.Char failed", align 1 @_llgo_string = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 8, i32 1749264893, i8 4, i8 8, i8 8, i8 24, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.strequal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 6 }, ptr @"*_llgo_string" }, align 8 @2 = private unnamed_addr constant [6 x i8] c"string", align 1 @"*_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1323879264, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 6 }, ptr null }, ptr @_llgo_string }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr @"*_llgo_int" }, align 8 @3 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @4 = private unnamed_addr constant [32 x i8] c"type assertion any -> int failed", align 1 @@ -47,7 +47,7 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 %3 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %4 = ptrtoint ptr %3 to i64 + %4 = load i64, ptr %3, align 4 %5 = add i64 %4, 1 ret i64 %5 @@ -75,8 +75,11 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/any.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/cl/_testrt/any.hi"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"*_llgo_int8", ptr @6 }) - %1 = call i64 @"github.com/goplus/llgo/cl/_testrt/any.incVal"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 100 to ptr) }) - %2 = call i32 (ptr, ...) @printf(ptr @5, ptr %0, i64 %1) + %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 100, ptr %1, align 4 + %2 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %1, 1 + %3 = call i64 @"github.com/goplus/llgo/cl/_testrt/any.incVal"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %2) + %4 = call i32 (ptr, ...) @printf(ptr @5, ptr %0, i64 %3) ret void } diff --git a/cl/_testrt/asmfull/out.ll b/cl/_testrt/asmfull/out.ll index 16f7f2b67c..0dd87ad84d 100644 --- a/cl/_testrt/asmfull/out.ll +++ b/cl/_testrt/asmfull/out.ll @@ -31,7 +31,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/asmfull" @"[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 307038632, i8 8, i8 1, i8 1, i8 17, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"[8]_llgo_uint8" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 8 }, ptr @"*[8]_llgo_uint8" }, ptr @_llgo_uint8, ptr @"[]_llgo_uint8", i64 8 }, align 8 @6 = private unnamed_addr constant [8 x i8] c"[8]uint8", align 1 @"*[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -566230779, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 8 }, ptr null }, ptr @"[8]_llgo_uint8" }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @7 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @"[]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 370346748, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 7 }, ptr @"*[]_llgo_uint8" }, ptr @_llgo_uint8 }, align 8 @@ -56,7 +56,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/asmfull" @16 = private unnamed_addr constant [14 x i8] c"unsafe.Pointer", align 1 @"*_llgo_Pointer" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1134390089, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 14 }, ptr null }, ptr @_llgo_Pointer }, align 8 @"_llgo_struct$tpOdxrfxqAgVfHtyiqa7aoi-mhPR53wxFhkEgsJPL8U$fields" = weak_odr constant [4 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 7 }, ptr @"[8]_llgo_uint8", i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 4 }, ptr @"[8]_llgo_string", i64 8, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 5 }, ptr @"[8]_llgo_any", i64 136, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 8 }, ptr @_llgo_Pointer, i64 264, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 3 }, ptr @"*_llgo_int" }, align 8 @17 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @18 = private unnamed_addr constant [5 x i8] c"value", align 1 @@ -81,34 +81,46 @@ define void @"github.com/goplus/llgo/cl/_testrt/asmfull.main"() { _llgo_0: call void asm sideeffect "nop", ""() %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_string]_llgo_any", i64 1) - %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 5 }, ptr %1, align 8 - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_string]_llgo_any", ptr %0, ptr %1) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 42 to ptr) }, ptr %2, align 8 + %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 42, ptr %1, align 4 + %2 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %1, 1 + %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 5 }, ptr %3, align 8 + %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_string]_llgo_any", ptr %0, ptr %3) + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %2, ptr %4, align 8 call void asm sideeffect "# test value ${0}", "r"(i64 42) - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_string]_llgo_any", i64 1) - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 5 }, ptr %4, align 8 - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_string]_llgo_any", ptr %3, ptr %4) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 42 to ptr) }, ptr %5, align 8 - %6 = call i64 asm sideeffect "mov $0, ${1}", "=&r,r"(i64 42) + %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_string]_llgo_any", i64 1) + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 42, ptr %6, align 4 + %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %6, 1 + %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 5 }, ptr %8, align 8 + %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_string]_llgo_any", ptr %5, ptr %8) + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %7, ptr %9, align 8 + %10 = call i64 asm sideeffect "mov $0, ${1}", "=&r,r"(i64 42) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @19, i64 7 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %6) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %10) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_string]_llgo_any", i64 2) - %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 1 }, ptr %8, align 8 - %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_string]_llgo_any", ptr %7, ptr %8) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 25 to ptr) }, ptr %9, align 8 - %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @21, i64 1 }, ptr %10, align 8 - %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_string]_llgo_any", ptr %7, ptr %10) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 17 to ptr) }, ptr %11, align 8 - %12 = call i64 asm sideeffect "# calc ${1} + ${2} -> $0", "=&r,r,r"(i64 25, i64 17) + %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_string]_llgo_any", i64 2) + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 25, ptr %12, align 4 + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %12, 1 + %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 1 }, ptr %14, align 8 + %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_string]_llgo_any", ptr %11, ptr %14) + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %13, ptr %15, align 8 + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 17, ptr %16, align 4 + %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %16, 1 + %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @21, i64 1 }, ptr %18, align 8 + %19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_string]_llgo_any", ptr %11, ptr %18) + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %17, ptr %19, align 8 + %20 = call i64 asm sideeffect "# calc ${1} + ${2} -> $0", "=&r,r,r"(i64 25, i64 17) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @19, i64 7 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %12) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %20) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } diff --git a/cl/_testrt/builtin/out.ll b/cl/_testrt/builtin/out.ll index d8763d900e..27ccd19cb6 100644 --- a/cl/_testrt/builtin/out.ll +++ b/cl/_testrt/builtin/out.ll @@ -13,7 +13,8 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/builtin" @"github.com/goplus/llgo/cl/_testrt/builtin.n" = global i64 0, align 8 @0 = private unnamed_addr constant [5 x i8] c"hello", align 1 @1 = private unnamed_addr constant [3 x i8] c"def", align 1 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 3 }, ptr @"*_llgo_int" }, align 8 +@"__llgo.moduleZeroSizedAlloc$164d69fd37c81cc1" = private unnamed_addr global [0 x { ptr, ptr }] zeroinitializer +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 3 }, ptr @"*_llgo_int" }, align 8 @2 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @3 = private unnamed_addr constant [4 x i8] c"ABCD", align 1 @@ -26,8 +27,10 @@ define double @"github.com/goplus/llgo/cl/_testrt/builtin.Float64frombits"(i64 % _llgo_0: %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) store i64 %0, ptr %1, align 4 - %2 = load double, ptr %1, align 8 - ret double %2 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load double, ptr %1, align 8 + ret double %3 } define double @"github.com/goplus/llgo/cl/_testrt/builtin.Inf"(i64 %0) { @@ -83,43 +86,58 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/builtin.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %1 = getelementptr inbounds i64, ptr %0, i64 0 - store i64 1, ptr %1, align 4 - %2 = getelementptr inbounds i64, ptr %0, i64 1 - store i64 2, ptr %2, align 4 - %3 = getelementptr inbounds i64, ptr %0, i64 2 - store i64 3, ptr %3, align 4 - %4 = getelementptr inbounds i64, ptr %0, i64 3 - store i64 4, ptr %4, align 4 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, i64 4, 1 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, i64 4, 2 - %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %9 = getelementptr inbounds i64, ptr %8, i64 0 - %10 = getelementptr inbounds i64, ptr %8, i64 1 - %11 = getelementptr inbounds i64, ptr %8, i64 2 - %12 = getelementptr inbounds i64, ptr %8, i64 3 - store i64 1, ptr %9, align 4 - store i64 2, ptr %10, align 4 - store i64 3, ptr %11, align 4 - store i64 4, ptr %12, align 4 - %13 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 10) - %14 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %13, i64 1, i64 10, i64 0, i64 4, i64 10) - %15 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 1 - %16 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 2 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %15) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %16) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds i64, ptr %0, i64 0 + store i64 1, ptr %2, align 4 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds i64, ptr %0, i64 1 + store i64 2, ptr %4, align 4 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds i64, ptr %0, i64 2 + store i64 3, ptr %6, align 4 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds i64, ptr %0, i64 3 + store i64 4, ptr %8, align 4 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 + %10 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9, i64 4, 1 + %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %10, i64 4, 2 + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = getelementptr inbounds i64, ptr %12, i64 0 + %15 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = getelementptr inbounds i64, ptr %12, i64 1 + %17 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %17) + %18 = getelementptr inbounds i64, ptr %12, i64 2 + %19 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %19) + %20 = getelementptr inbounds i64, ptr %12, i64 3 + store i64 1, ptr %14, align 4 + store i64 2, ptr %16, align 4 + store i64 3, ptr %18, align 4 + store i64 4, ptr %20, align 4 + %21 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.MakeSlice"(i64 4, i64 10, i64 1) + %22 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 1 + %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 2 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %22) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %23) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %17 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %14, 1 - %18 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %14, 2 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %14) + %24 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %21, 1 + %25 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %21, 2 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %21) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %17) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %24) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %18) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %25) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 4) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) @@ -129,146 +147,171 @@ _llgo_0: call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 4) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %20 = getelementptr inbounds i64, ptr %19, i64 0 - store i64 1, ptr %20, align 4 - %21 = getelementptr inbounds i64, ptr %19, i64 1 - store i64 2, ptr %21, align 4 - %22 = getelementptr inbounds i64, ptr %19, i64 2 - store i64 3, ptr %22, align 4 - %23 = getelementptr inbounds i64, ptr %19, i64 3 - store i64 4, ptr %23, align 4 - %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %19, 0 - %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %24, i64 4, 1 - %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %25, i64 4, 2 - %27 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %26, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %27) + %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) + %27 = icmp eq ptr %26, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %27) + %28 = getelementptr inbounds i64, ptr %26, i64 0 + store i64 1, ptr %28, align 4 + %29 = icmp eq ptr %26, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %29) + %30 = getelementptr inbounds i64, ptr %26, i64 1 + store i64 2, ptr %30, align 4 + %31 = icmp eq ptr %26, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %31) + %32 = getelementptr inbounds i64, ptr %26, i64 2 + store i64 3, ptr %32, align 4 + %33 = icmp eq ptr %26, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %33) + %34 = getelementptr inbounds i64, ptr %26, i64 3 + store i64 4, ptr %34, align 4 + %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %26, 0 + %36 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %35, i64 4, 1 + %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %36, i64 4, 2 + %38 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %37, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %38) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 4) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %28 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 2 - %29 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 1 - %30 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 0 - %31 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %30, i64 8, i64 %28, i64 1, i64 %29, i64 %28) - %32 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %31, 1 - %33 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 2 - %34 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 1 - %35 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 0 - %36 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %35, i64 8, i64 %33, i64 1, i64 %34, i64 %33) - %37 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %36, 2 - %38 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 2 - %39 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 0 - %40 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %39, i64 8, i64 %38, i64 1, i64 2, i64 %38) - %41 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %40, 1 - %42 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 2 - %43 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 0 - %44 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %43, i64 8, i64 %42, i64 1, i64 2, i64 %42) - %45 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %44, 2 - %46 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 2 - %47 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 0 - %48 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %47, i64 8, i64 %46, i64 1, i64 2, i64 2) - %49 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %48, 1 - %50 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 2 - %51 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 0 - %52 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %51, i64 8, i64 %50, i64 1, i64 2, i64 2) - %53 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %52, 2 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %37) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %41) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %45) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %49) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %53) + %39 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 2 + %40 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 1 + %41 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 0 + %42 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %41, i64 8, i64 %39, i64 1, i64 %40, i64 %39) + %43 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %42, 1 + %44 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 2 + %45 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 1 + %46 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 0 + %47 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %46, i64 8, i64 %44, i64 1, i64 %45, i64 %44) + %48 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %47, 2 + %49 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 2 + %50 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 0 + %51 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %50, i64 8, i64 %49, i64 1, i64 2, i64 %49) + %52 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %51, 1 + %53 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 2 + %54 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 0 + %55 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %54, i64 8, i64 %53, i64 1, i64 2, i64 %53) + %56 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %55, 2 + %57 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 2 + %58 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 0 + %59 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %58, i64 8, i64 %57, i64 1, i64 2, i64 2) + %60 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %59, 1 + %61 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 2 + %62 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 0 + %63 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %62, i64 8, i64 %61, i64 1, i64 2, i64 2) + %64 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %63, 2 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %43) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %48) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %52) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %56) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %60) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %64) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %54 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 4, i64 4) - %55 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %54, 1 - %56 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 4, i64 4) - %57 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %56, 2 - %58 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 4) - %59 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %58, 1 - %60 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 4) - %61 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %60, 2 - %62 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 2) - %63 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %62, 1 - %64 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 2) - %65 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %64, 2 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %55) + %65 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %12, i64 8, i64 4, i64 1, i64 4, i64 4) + %66 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %65, 1 + %67 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %12, i64 8, i64 4, i64 1, i64 4, i64 4) + %68 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %67, 2 + %69 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %12, i64 8, i64 4, i64 1, i64 2, i64 4) + %70 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %69, 1 + %71 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %12, i64 8, i64 4, i64 1, i64 2, i64 4) + %72 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %71, 2 + %73 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %12, i64 8, i64 4, i64 1, i64 2, i64 2) + %74 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %73, 1 + %75 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %12, i64 8, i64 4, i64 1, i64 2, i64 2) + %76 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %75, 2 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %66) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %57) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %68) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %59) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %70) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %61) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %72) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %63) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %74) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %65) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %76) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %66 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, i64 1, i64 5) - %67 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, i64 1, i64 2) - %68 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, i64 5, i64 5) - %69 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %68, 1 + %77 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, i64 1, i64 5) + %78 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, i64 1, i64 2) + %79 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, i64 5, i64 5) + %80 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %79, 1 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %66) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %77) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %67) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %78) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %69) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %80) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %70 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %71 = getelementptr inbounds i64, ptr %70, i64 0 - store i64 5, ptr %71, align 4 - %72 = getelementptr inbounds i64, ptr %70, i64 1 - store i64 6, ptr %72, align 4 - %73 = getelementptr inbounds i64, ptr %70, i64 2 - store i64 7, ptr %73, align 4 - %74 = getelementptr inbounds i64, ptr %70, i64 3 - store i64 8, ptr %74, align 4 - %75 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %70, 0 - %76 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %75, i64 4, 1 - %77 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %76, i64 4, 2 - %78 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %77, 0 - %79 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %77, 1 - %80 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, ptr %78, i64 %79, i64 8) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %80) + %81 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) + %82 = icmp eq ptr %81, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %82) + %83 = getelementptr inbounds i64, ptr %81, i64 0 + store i64 5, ptr %83, align 4 + %84 = icmp eq ptr %81, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %84) + %85 = getelementptr inbounds i64, ptr %81, i64 1 + store i64 6, ptr %85, align 4 + %86 = icmp eq ptr %81, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %86) + %87 = getelementptr inbounds i64, ptr %81, i64 2 + store i64 7, ptr %87, align 4 + %88 = icmp eq ptr %81, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %88) + %89 = getelementptr inbounds i64, ptr %81, i64 3 + store i64 8, ptr %89, align 4 + %90 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %81, 0 + %91 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %90, i64 4, 1 + %92 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %91, i64 4, 2 + %93 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %92, 0 + %94 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %92, 1 + %95 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, ptr %93, i64 %94, i64 8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %95) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %81 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 3) - %82 = getelementptr inbounds i8, ptr %81, i64 0 - store i8 97, ptr %82, align 1 - %83 = getelementptr inbounds i8, ptr %81, i64 1 - store i8 98, ptr %83, align 1 - %84 = getelementptr inbounds i8, ptr %81, i64 2 - store i8 99, ptr %84, align 1 - %85 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %81, 0 - %86 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %85, i64 3, 1 - %87 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %86, i64 3, 2 - %88 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %87, ptr @1, i64 3, i64 1) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %88) + %96 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 3) + %97 = icmp eq ptr %96, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %97) + %98 = getelementptr inbounds i8, ptr %96, i64 0 + store i8 97, ptr %98, align 1 + %99 = icmp eq ptr %96, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %99) + %100 = getelementptr inbounds i8, ptr %96, i64 1 + store i8 98, ptr %100, align 1 + %101 = icmp eq ptr %96, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %101) + %102 = getelementptr inbounds i8, ptr %96, i64 2 + store i8 99, ptr %102, align 1 + %103 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %96, 0 + %104 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %103, i64 3, 1 + %105 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %104, i64 3, 2 + %106 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %105, ptr @1, i64 3, i64 1) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %106) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %89 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 0) - %90 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %89, 0 - %91 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %90, i64 0, 1 - %92 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %91, i64 0, 2 - %93 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %94 = getelementptr inbounds { ptr, ptr }, ptr %93, i64 0 - store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testrt/builtin.main$1", ptr null }, ptr %94, align 8 - %95 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %93, 0 - %96 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %95, i64 1, 1 - %97 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %96, i64 1, 2 - %98 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %97, 0 - %99 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %97, 1 - %100 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %92, ptr %98, i64 %99, i64 16) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %100) + %107 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %108 = icmp eq ptr %107, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %108) + %109 = getelementptr inbounds { ptr, ptr }, ptr %107, i64 0 + store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testrt/builtin.main$1", ptr null }, ptr %109, align 8 + %110 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %107, 0 + %111 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %110, i64 1, 1 + %112 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %111, i64 1, 2 + %113 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %112, 0 + %114 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %112, 1 + %115 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$164d69fd37c81cc1", i64 0, i64 0 }, ptr %113, i64 %114, i64 16) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %115) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %101 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr inttoptr (i64 100 to ptr) }, ptr %101, align 8 - %102 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %101, align 8 - %103 = ptrtoint ptr %101 to i64 + %116 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %117 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 100, ptr %117, align 4 + %118 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %117, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %118, ptr %116, align 8 + %119 = icmp eq ptr %116, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %119) + %120 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %116, align 8 + %121 = ptrtoint ptr %116 to i64 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 true) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 0) @@ -285,162 +328,194 @@ _llgo_0: call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double 1.005000e+02) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintEface"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %102) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintEface"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %120) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %101) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %116) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %103) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %104 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 3) - %105 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %106 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %104, 0 - %107 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %106, i64 3, 1 - %108 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %107, i64 3, 2 - %109 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %88, 0 - %110 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %88, 1 - %111 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.SliceCopy"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %108, ptr %109, i64 %110, i64 1) - store i64 %111, ptr %105, align 4 - %112 = load i64, ptr %105, align 4 - %113 = getelementptr inbounds i8, ptr %104, i64 0 - %114 = load i8, ptr %113, align 1 - %115 = getelementptr inbounds i8, ptr %104, i64 1 - %116 = load i8, ptr %115, align 1 - %117 = getelementptr inbounds i8, ptr %104, i64 2 - %118 = load i8, ptr %117, align 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %112) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %119 = zext i8 %114 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %119) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %120 = zext i8 %116 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %120) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %121 = zext i8 %118 to i64 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %121) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %122 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %104, i64 1, i64 3, i64 1, i64 3, i64 3) - %123 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.SliceCopy"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %122, ptr @3, i64 4, i64 1) - store i64 %123, ptr %105, align 4 - %124 = load i64, ptr %105, align 4 - %125 = getelementptr inbounds i8, ptr %104, i64 0 - %126 = load i8, ptr %125, align 1 - %127 = getelementptr inbounds i8, ptr %104, i64 1 - %128 = load i8, ptr %127, align 1 - %129 = getelementptr inbounds i8, ptr %104, i64 2 - %130 = load i8, ptr %129, align 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %124) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %131 = zext i8 %126 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %131) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %132 = zext i8 %128 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %132) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %133 = zext i8 %130 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %133) + %122 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 3) + %123 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) + %124 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %122, 0 + %125 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %124, i64 3, 1 + %126 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %125, i64 3, 2 + %127 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %106, 0 + %128 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %106, 1 + %129 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.SliceCopy"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %126, ptr %127, i64 %128, i64 1) + store i64 %129, ptr %123, align 4 + %130 = icmp eq ptr %123, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %130) + %131 = load i64, ptr %123, align 4 + %132 = icmp eq ptr %122, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %132) + %133 = getelementptr inbounds i8, ptr %122, i64 0 + %134 = icmp eq ptr %133, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %134) + %135 = load i8, ptr %133, align 1 + %136 = icmp eq ptr %122, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %136) + %137 = getelementptr inbounds i8, ptr %122, i64 1 + %138 = icmp eq ptr %137, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %138) + %139 = load i8, ptr %137, align 1 + %140 = icmp eq ptr %122, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %140) + %141 = getelementptr inbounds i8, ptr %122, i64 2 + %142 = icmp eq ptr %141, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %142) + %143 = load i8, ptr %141, align 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %131) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + %144 = zext i8 %135 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %144) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + %145 = zext i8 %139 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %145) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + %146 = zext i8 %143 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %146) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) + %147 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr %122, i64 1, i64 3, i64 1, i64 3, i64 3) + %148 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.SliceCopy"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %147, ptr @3, i64 4, i64 1) + store i64 %148, ptr %123, align 4 + %149 = icmp eq ptr %123, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %149) + %150 = load i64, ptr %123, align 4 + %151 = icmp eq ptr %122, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %151) + %152 = getelementptr inbounds i8, ptr %122, i64 0 + %153 = icmp eq ptr %152, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %153) + %154 = load i8, ptr %152, align 1 + %155 = icmp eq ptr %122, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %155) + %156 = getelementptr inbounds i8, ptr %122, i64 1 + %157 = icmp eq ptr %156, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %157) + %158 = load i8, ptr %156, align 1 + %159 = icmp eq ptr %122, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %159) + %160 = getelementptr inbounds i8, ptr %122, i64 2 + %161 = icmp eq ptr %160, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %161) + %162 = load i8, ptr %160, align 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %150) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + %163 = zext i8 %154 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %163) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + %164 = zext i8 %158 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %164) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + %165 = zext i8 %162 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %165) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %134 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) - %135 = getelementptr inbounds { ptr }, ptr %134, i32 0, i32 0 - store ptr %105, ptr %135, align 8 - %136 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testrt/builtin.main$3", ptr undef }, ptr %134, 1 + %166 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + %167 = getelementptr inbounds { ptr }, ptr %166, i32 0, i32 0 + store ptr %123, ptr %167, align 8 + %168 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testrt/builtin.main$3", ptr undef }, ptr %166, 1 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr @"github.com/goplus/llgo/cl/_testrt/builtin.demo") call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr @"github.com/goplus/llgo/cl/_testrt/builtin.demo") call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr @"github.com/goplus/llgo/cl/_testrt/builtin.main$2") call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %137 = extractvalue { ptr, ptr } %136, 0 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %137) + %169 = extractvalue { ptr, ptr } %168, 0 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %169) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %138 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewStringIter"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }) + %170 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewStringIter"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }) br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %139 = call { i1, i64, i32 } @"github.com/goplus/llgo/runtime/internal/runtime.StringIterNext"(ptr %138) - %140 = extractvalue { i1, i64, i32 } %139, 0 - br i1 %140, label %_llgo_2, label %_llgo_3 + %171 = call { i1, i64, i32 } @"github.com/goplus/llgo/runtime/internal/runtime.StringIterNext"(ptr %170) + %172 = extractvalue { i1, i64, i32 } %171, 0 + br i1 %172, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %141 = extractvalue { i1, i64, i32 } %139, 1 - %142 = extractvalue { i1, i64, i32 } %139, 2 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %141) + %173 = extractvalue { i1, i64, i32 } %171, 1 + %174 = extractvalue { i1, i64, i32 } %171, 2 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %173) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %143 = sext i32 %142 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %143) + %175 = sext i32 %174 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %175) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 - %144 = call double @"github.com/goplus/llgo/cl/_testrt/builtin.Inf"(i64 1) - %145 = call double @"github.com/goplus/llgo/cl/_testrt/builtin.Inf"(i64 -1) - %146 = call double @"github.com/goplus/llgo/cl/_testrt/builtin.NaN"() - %147 = call double @"github.com/goplus/llgo/cl/_testrt/builtin.NaN"() - %148 = call i1 @"github.com/goplus/llgo/cl/_testrt/builtin.IsNaN"(double %147) - %149 = call i1 @"github.com/goplus/llgo/cl/_testrt/builtin.IsNaN"(double 1.000000e+00) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double %144) + %176 = call double @"github.com/goplus/llgo/cl/_testrt/builtin.Inf"(i64 1) + %177 = call double @"github.com/goplus/llgo/cl/_testrt/builtin.Inf"(i64 -1) + %178 = call double @"github.com/goplus/llgo/cl/_testrt/builtin.NaN"() + %179 = call double @"github.com/goplus/llgo/cl/_testrt/builtin.NaN"() + %180 = call i1 @"github.com/goplus/llgo/cl/_testrt/builtin.IsNaN"(double %179) + %181 = call i1 @"github.com/goplus/llgo/cl/_testrt/builtin.IsNaN"(double 1.000000e+00) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double %176) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double %145) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double %177) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double %146) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintFloat"(double %178) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %148) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %180) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %149) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %181) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %150 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.StringToBytes"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }) - %151 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.StringToRunes"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %150) + %182 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.StringToBytes"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }) + %183 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.StringToRunes"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %182) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %151) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %183) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %152 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringFromBytes"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %150) - %153 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringFromRunes"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %151) - %154 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %150, 0 - %155 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %150, 1 - %156 = icmp sge i64 3, %155 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %156) - %157 = getelementptr inbounds i8, ptr %154, i64 3 - %158 = load i8, ptr %157, align 1 - %159 = zext i8 %158 to i32 - %160 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringFromRune"(i32 %159) - %161 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %151, 0 - %162 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %151, 1 - %163 = icmp sge i64 0, %162 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %163) - %164 = getelementptr inbounds i32, ptr %161, i64 0 - %165 = load i32, ptr %164, align 4 - %166 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringFromRune"(i32 %165) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %152) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %153) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %160) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %166) + %184 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringFromBytes"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %182) + %185 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringFromRunes"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %183) + %186 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %182, 0 + %187 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %182, 1 + %188 = icmp sge i64 3, %187 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %188) + %189 = getelementptr inbounds i8, ptr %186, i64 3 + %190 = icmp eq ptr %189, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %190) + %191 = load i8, ptr %189, align 1 + %192 = zext i8 %191 to i32 + %193 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringFromRune"(i32 %192) + %194 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %183, 0 + %195 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %183, 1 + %196 = icmp sge i64 0, %195 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %196) + %197 = getelementptr inbounds i32, ptr %194, i64 0 + %198 = icmp eq ptr %197, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %198) + %199 = load i32, ptr %197, align 4 + %200 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringFromRune"(i32 %199) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %184) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %185) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %193) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %200) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %167 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }) - %168 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }) - %169 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }) - %170 = xor i1 %169, true - %171 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringLess"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }) - %172 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringLess"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }) - %173 = xor i1 %172, true - %174 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringLess"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }) - %175 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringLess"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }) - %176 = xor i1 %175, true - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %167) + %201 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }) + %202 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }) + %203 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }) + %204 = xor i1 %203, true + %205 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringLess"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }) + %206 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringLess"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }) + %207 = xor i1 %206, true + %208 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringLess"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }) + %209 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringLess"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }) + %210 = xor i1 %209, true + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %201) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %168) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %202) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %170) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %204) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %171) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %205) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %173) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %207) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %174) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %208) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %176) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %210) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -461,15 +536,19 @@ define void @"github.com/goplus/llgo/cl/_testrt/builtin.main$3"(ptr %0) { _llgo_0: %1 = load { ptr }, ptr %0, align 8 %2 = extractvalue { ptr } %1, 0 - %3 = load i64, ptr %2, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %3) + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %4) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) -declare %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr, i64, i64, i64, i64, i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + +declare %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.MakeSlice"(i64, i64, i64) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice") @@ -477,6 +556,8 @@ declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64) +declare %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.NewSlice3"(ptr, i64, i64, i64, i64, i64) + declare %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.String", i64, i64) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String") @@ -505,6 +586,8 @@ _llgo_0: ret i1 %3 } +declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64) @@ -517,8 +600,6 @@ declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr declare i64 @"github.com/goplus/llgo/runtime/internal/runtime.SliceCopy"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr, i64, i64) -declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) - declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewStringIter"(%"github.com/goplus/llgo/runtime/internal/runtime.String") declare { i1, i64, i32 } @"github.com/goplus/llgo/runtime/internal/runtime.StringIterNext"(ptr) diff --git a/cl/_testrt/clear/out.ll b/cl/_testrt/clear/out.ll index c64c607b2b..7ecfaa571b 100644 --- a/cl/_testrt/clear/out.ll +++ b/cl/_testrt/clear/out.ll @@ -15,7 +15,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/clear" @"[]_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 -1129561019, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr @"*[]_llgo_int" }, ptr @_llgo_int }, align 8 @0 = private unnamed_addr constant [5 x i8] c"[]int", align 1 @"*[]_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1428175521, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr null }, ptr @"[]_llgo_int" }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr @"*_llgo_int" }, align 8 @1 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"map[_llgo_int]_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.MapType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1234063919, i8 0, i8 8, i8 8, i8 53, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 11 }, ptr @"*map[_llgo_int]_llgo_int" }, ptr @_llgo_int, ptr @_llgo_int, ptr @"_llgo_struct$RSTTp_pTKglBmcdy0CMmgLp9HSGRvgD8UwNIoMFFyOg", { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.typehash", ptr @_llgo_int }, i8 8, i8 8, i16 144, i32 4 }, align 8 @@ -28,7 +28,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/clear" @"[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 307038632, i8 8, i8 1, i8 1, i8 17, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"[8]_llgo_uint8" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 8 }, ptr @"*[8]_llgo_uint8" }, ptr @_llgo_uint8, ptr @"[]_llgo_uint8", i64 8 }, align 8 @5 = private unnamed_addr constant [8 x i8] c"[8]uint8", align 1 @"*[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -566230779, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 8 }, ptr null }, ptr @"[8]_llgo_uint8" }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @6 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @"[]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 370346748, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 7 }, ptr @"*[]_llgo_uint8" }, ptr @_llgo_uint8 }, align 8 @@ -40,7 +40,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/clear" @"*[8]_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1841254256, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 6 }, ptr null }, ptr @"[8]_llgo_int" }, align 8 @10 = private unnamed_addr constant [5 x i8] c"elems", align 1 @11 = private unnamed_addr constant [8 x i8] c"overflow", align 1 -@_llgo_uintptr = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1268343028, i8 12, i8 8, i8 8, i8 44, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 7 }, ptr @"*_llgo_uintptr" }, align 8 +@_llgo_uintptr = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1268343028, i8 12, i8 8, i8 8, i8 12, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 7 }, ptr @"*_llgo_uintptr" }, align 8 @12 = private unnamed_addr constant [7 x i8] c"uintptr", align 1 @"*_llgo_uintptr" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1684891952, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 7 }, ptr null }, ptr @_llgo_uintptr }, align 8 @"_llgo_struct$RSTTp_pTKglBmcdy0CMmgLp9HSGRvgD8UwNIoMFFyOg$fields" = weak_odr constant [4 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }, ptr @"[8]_llgo_uint8", i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 4 }, ptr @"[8]_llgo_int", i64 8, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 5 }, ptr @"[8]_llgo_int", i64 72, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 8 }, ptr @_llgo_uintptr, i64 136, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @@ -48,39 +48,47 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/clear" define void @"github.com/goplus/llgo/cl/_testrt/clear.Clear"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %1 = getelementptr inbounds i64, ptr %0, i64 0 - store i64 1, ptr %1, align 4 - %2 = getelementptr inbounds i64, ptr %0, i64 1 - store i64 2, ptr %2, align 4 - %3 = getelementptr inbounds i64, ptr %0, i64 2 - store i64 3, ptr %3, align 4 - %4 = getelementptr inbounds i64, ptr %0, i64 3 - store i64 4, ptr %4, align 4 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, i64 4, 1 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, i64 4, 2 - call void @"github.com/goplus/llgo/runtime/internal/runtime.SliceClear"(ptr @"[]_llgo_int", %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds i64, ptr %0, i64 0 + store i64 1, ptr %2, align 4 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds i64, ptr %0, i64 1 + store i64 2, ptr %4, align 4 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds i64, ptr %0, i64 2 + store i64 3, ptr %6, align 4 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds i64, ptr %0, i64 3 + store i64 4, ptr %8, align 4 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 + %10 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9, i64 4, 1 + %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %10, i64 4, 2 + call void @"github.com/goplus/llgo/runtime/internal/runtime.SliceClear"(ptr @"[]_llgo_int", %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_int", i64 4) - %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) - store i64 1, ptr %9, align 4 - %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr %8, ptr %9) - store i64 1, ptr %10, align 4 - %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) - store i64 2, ptr %11, align 4 - %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr %8, ptr %11) - store i64 2, ptr %12, align 4 + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_int", i64 4) %13 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) - store i64 3, ptr %13, align 4 - %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr %8, ptr %13) - store i64 3, ptr %14, align 4 + store i64 1, ptr %13, align 4 + %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr %12, ptr %13) + store i64 1, ptr %14, align 4 %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) - store i64 4, ptr %15, align 4 - %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr %8, ptr %15) - store i64 4, ptr %16, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.MapClear"(ptr @"map[_llgo_int]_llgo_int", ptr %8) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %8) + store i64 2, ptr %15, align 4 + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr %12, ptr %15) + store i64 2, ptr %16, align 4 + %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 3, ptr %17, align 4 + %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr %12, ptr %17) + store i64 3, ptr %18, align 4 + %19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 4, ptr %19, align 4 + %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr %12, ptr %19) + store i64 4, ptr %20, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.MapClear"(ptr @"map[_llgo_int]_llgo_int", ptr %12) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %12) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -100,6 +108,8 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequalptr"(ptr, ptr) define linkonce i1 @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr"(ptr %0, ptr %1, ptr %2) { diff --git a/cl/_testrt/closure/out.ll b/cl/_testrt/closure/out.ll index 137117866e..6247e559be 100644 --- a/cl/_testrt/closure/out.ll +++ b/cl/_testrt/closure/out.ll @@ -49,10 +49,12 @@ define void @"github.com/goplus/llgo/cl/_testrt/closure.main$3"(ptr %0) { _llgo_0: %1 = load { ptr }, ptr %0, align 8 %2 = extractvalue { ptr } %1, 0 - %3 = load { ptr, ptr }, ptr %2, align 8 - %4 = extractvalue { ptr, ptr } %3, 1 - %5 = extractvalue { ptr, ptr } %3, 0 - call void %5(ptr %4, i64 100, i64 200) + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load { ptr, ptr }, ptr %2, align 8 + %5 = extractvalue { ptr, ptr } %4, 1 + %6 = extractvalue { ptr, ptr } %4, 0 + call void %6(ptr %5, i64 100, i64 200) ret void } @@ -67,3 +69,5 @@ _llgo_0: declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) declare i32 @printf(ptr, ...) + +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) diff --git a/cl/_testrt/closurebound/out.ll b/cl/_testrt/closurebound/out.ll index 2f5c3ccca1..4fd1147947 100644 --- a/cl/_testrt/closurebound/out.ll +++ b/cl/_testrt/closurebound/out.ll @@ -14,6 +14,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/closurebound" @_llgo_string = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 8, i32 1749264893, i8 4, i8 8, i8 8, i8 24, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.strequal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 6 }, ptr @"*_llgo_string" }, align 8 @1 = private unnamed_addr constant [6 x i8] c"string", align 1 @"*_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1323879264, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 6 }, ptr null }, ptr @_llgo_string }, align 8 +@llvm.compiler.used = appending global [4 x ptr] [ptr @"github.com/goplus/llgo/cl/_testrt/closurebound.demo1.encode", ptr @"github.com/goplus/llgo/cl/_testrt/closurebound.(*demo1).encode", ptr @"github.com/goplus/llgo/cl/_testrt/closurebound.demo2.encode", ptr @"github.com/goplus/llgo/cl/_testrt/closurebound.(*demo2).encode"], section "llvm.metadata" define i64 @"github.com/goplus/llgo/cl/_testrt/closurebound.demo1.encode"(%"github.com/goplus/llgo/cl/_testrt/closurebound.demo1" %0) { _llgo_0: @@ -22,9 +23,11 @@ _llgo_0: define i64 @"github.com/goplus/llgo/cl/_testrt/closurebound.(*demo1).encode"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testrt/closurebound.demo1", ptr %0, align 1 - %2 = call i64 @"github.com/goplus/llgo/cl/_testrt/closurebound.demo1.encode"(%"github.com/goplus/llgo/cl/_testrt/closurebound.demo1" %1) - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testrt/closurebound.demo1", ptr %0, align 1 + %3 = call i64 @"github.com/goplus/llgo/cl/_testrt/closurebound.demo1.encode"(%"github.com/goplus/llgo/cl/_testrt/closurebound.demo1" %2) + ret i64 %3 } define i64 @"github.com/goplus/llgo/cl/_testrt/closurebound.demo2.encode"(%"github.com/goplus/llgo/cl/_testrt/closurebound.demo2" %0) { @@ -34,9 +37,11 @@ _llgo_0: define i64 @"github.com/goplus/llgo/cl/_testrt/closurebound.(*demo2).encode"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testrt/closurebound.demo2", ptr %0, align 1 - %2 = call i64 @"github.com/goplus/llgo/cl/_testrt/closurebound.demo2.encode"(%"github.com/goplus/llgo/cl/_testrt/closurebound.demo2" %1) - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testrt/closurebound.demo2", ptr %0, align 1 + %3 = call i64 @"github.com/goplus/llgo/cl/_testrt/closurebound.demo2.encode"(%"github.com/goplus/llgo/cl/_testrt/closurebound.demo2" %2) + ret i64 %3 } define void @"github.com/goplus/llgo/cl/_testrt/closurebound.init"() { @@ -80,6 +85,8 @@ _llgo_2: ; preds = %_llgo_0 ret void } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + define i64 @"github.com/goplus/llgo/cl/_testrt/closurebound.demo2.encode$bound"(ptr %0) { _llgo_0: %1 = load { %"github.com/goplus/llgo/cl/_testrt/closurebound.demo2" }, ptr %0, align 1 diff --git a/cl/_testrt/closureconv/out.ll b/cl/_testrt/closureconv/out.ll index 52d8a36bdd..8b2c0a55fa 100644 --- a/cl/_testrt/closureconv/out.ll +++ b/cl/_testrt/closureconv/out.ll @@ -5,14 +5,19 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/closureconv" %"github.com/goplus/llgo/cl/_testrt/closureconv.Func" = type { ptr, ptr } @"github.com/goplus/llgo/cl/_testrt/closureconv.init$guard" = global i1 false, align 1 +@llvm.compiler.used = appending global [1 x ptr] [ptr @"github.com/goplus/llgo/cl/_testrt/closureconv.(*Call).add"], section "llvm.metadata" define i64 @"github.com/goplus/llgo/cl/_testrt/closureconv.(*Call).add"(ptr %0, i64 %1, i64 %2) { _llgo_0: %3 = add i64 %1, %2 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/closureconv.Call", ptr %0, i32 0, i32 1 - %5 = load i64, ptr %4, align 4 - %6 = add i64 %3, %5 - ret i64 %6 + %4 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/closureconv.Call", ptr %0, i32 0, i32 1 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load i64, ptr %5, align 4 + %8 = add i64 %3, %7 + ret i64 %8 } define i64 @"github.com/goplus/llgo/cl/_testrt/closureconv.add"(i64 %0, i64 %1) { @@ -24,20 +29,28 @@ _llgo_0: define %"github.com/goplus/llgo/cl/_testrt/closureconv.Func" @"github.com/goplus/llgo/cl/_testrt/closureconv.demo1"(i64 %0) { _llgo_0: %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/closureconv.Call", ptr %1, i32 0, i32 1 - store i64 %0, ptr %2, align 4 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) - %4 = getelementptr inbounds { ptr }, ptr %3, i32 0, i32 0 - store ptr %1, ptr %4, align 8 - %5 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testrt/closureconv.(*Call).add$bound", ptr undef }, ptr %3, 1 - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/closureconv.Call", ptr %1, i32 0, i32 0 - %7 = alloca %"github.com/goplus/llgo/cl/_testrt/closureconv.Func", align 8 - store { ptr, ptr } %5, ptr %7, align 8 - %8 = load %"github.com/goplus/llgo/cl/_testrt/closureconv.Func", ptr %7, align 8 - store %"github.com/goplus/llgo/cl/_testrt/closureconv.Func" %8, ptr %6, align 8 - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/closureconv.Call", ptr %1, i32 0, i32 0 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/closureconv.Call", ptr %1, i32 0, i32 1 + store i64 %0, ptr %3, align 4 + %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + %5 = getelementptr inbounds { ptr }, ptr %4, i32 0, i32 0 + store ptr %1, ptr %5, align 8 + %6 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testrt/closureconv.(*Call).add$bound", ptr undef }, ptr %4, 1 + %7 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/closureconv.Call", ptr %1, i32 0, i32 0 + %9 = alloca %"github.com/goplus/llgo/cl/_testrt/closureconv.Func", align 8 + store { ptr, ptr } %6, ptr %9, align 8 %10 = load %"github.com/goplus/llgo/cl/_testrt/closureconv.Func", ptr %9, align 8 - ret %"github.com/goplus/llgo/cl/_testrt/closureconv.Func" %10 + store %"github.com/goplus/llgo/cl/_testrt/closureconv.Func" %10, ptr %8, align 8 + %11 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/closureconv.Call", ptr %1, i32 0, i32 0 + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load %"github.com/goplus/llgo/cl/_testrt/closureconv.Func", ptr %12, align 8 + ret %"github.com/goplus/llgo/cl/_testrt/closureconv.Func" %14 } define %"github.com/goplus/llgo/cl/_testrt/closureconv.Func" @"github.com/goplus/llgo/cl/_testrt/closureconv.demo2"() { @@ -88,9 +101,11 @@ _llgo_0: %3 = add i64 %1, %2 %4 = load { ptr }, ptr %0, align 8 %5 = extractvalue { ptr } %4, 0 - %6 = load i64, ptr %5, align 4 - %7 = add i64 %3, %6 - ret i64 %7 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load i64, ptr %5, align 4 + %8 = add i64 %3, %7 + ret i64 %8 } define void @"github.com/goplus/llgo/cl/_testrt/closureconv.init"() { @@ -156,6 +171,8 @@ _llgo_0: ret void } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) define i64 @"github.com/goplus/llgo/cl/_testrt/closureconv.(*Call).add$bound"(ptr %0, i64 %1, i64 %2) { diff --git a/cl/_testrt/closureiface/out.ll b/cl/_testrt/closureiface/out.ll index f72e4e6545..a1b0df4653 100644 --- a/cl/_testrt/closureiface/out.ll +++ b/cl/_testrt/closureiface/out.ll @@ -18,7 +18,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/closureiface" @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1134531106, i8 0, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 13 }, ptr @"*_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU$in", i64 1, i64 1 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU$out", i64 1, i64 1 } }, align 8 @2 = private unnamed_addr constant [13 x i8] c"func(int) int", align 1 @"*_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1763581361, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 13 }, ptr null }, ptr @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU" }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr @"*_llgo_int" }, align 8 @3 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"_llgo_func$ekGNsrYBSzltfAjxbl6T8H6Yq8j16wzqS3nDj2xxGMU$in" = weak_odr constant [1 x ptr] [ptr @_llgo_int], align 8 @@ -97,9 +97,11 @@ define i64 @"github.com/goplus/llgo/cl/_testrt/closureiface.main$1"(ptr %0, i64 _llgo_0: %2 = load { ptr }, ptr %0, align 8 %3 = extractvalue { ptr } %2, 0 - %4 = load i64, ptr %3, align 4 - %5 = add i64 %4, %1 - ret i64 %5 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %3, align 4 + %6 = add i64 %5, %1 + ret i64 %6 } declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) @@ -137,3 +139,5 @@ _llgo_0: } declare void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface") + +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) diff --git a/cl/_testrt/complex/expect.txt b/cl/_testrt/complex/expect.txt index 35ded80c36..d1f994afa1 100644 --- a/cl/_testrt/complex/expect.txt +++ b/cl/_testrt/complex/expect.txt @@ -1,9 +1,9 @@ -+1.000000e+00 +2.000000e+00 -(-1.000000e+00-2.000000e+00i) -(+4.000000e+00+6.000000e+00i) -(-2.000000e+00-2.000000e+00i) -(-5.000000e+00+1.000000e+01i) -(+4.400000e-01+8.000000e-02i) ++1.000000e+000 +2.000000e+000 +(-1.000000e+000-2.000000e+000i) +(+4.000000e+000+6.000000e+000i) +(-2.000000e+000-2.000000e+000i) +(-5.000000e+000+1.000000e+001i) +(+4.400000e-001+8.000000e-002i) (+Inf+Infi) (NaNNaNi) true false diff --git a/cl/_testrt/concat/out.ll b/cl/_testrt/concat/out.ll index d88ea00aa6..6d8d111dfb 100644 --- a/cl/_testrt/concat/out.ll +++ b/cl/_testrt/concat/out.ll @@ -16,7 +16,7 @@ _llgo_0: br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %2 = phi %"github.com/goplus/llgo/runtime/internal/runtime.String" [ zeroinitializer, %_llgo_0 ], [ %13, %_llgo_2 ] + %2 = phi %"github.com/goplus/llgo/runtime/internal/runtime.String" [ zeroinitializer, %_llgo_0 ], [ %14, %_llgo_2 ] %3 = phi i64 [ -1, %_llgo_0 ], [ %4, %_llgo_2 ] %4 = add i64 %3, 1 %5 = icmp slt i64 %4, %1 @@ -30,8 +30,10 @@ _llgo_2: ; preds = %_llgo_1 %10 = or i1 %9, %8 call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %10) %11 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %6, i64 %4 - %12 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %11, align 8 - %13 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringCat"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %2, %"github.com/goplus/llgo/runtime/internal/runtime.String" %12) + %12 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %11, align 8 + %14 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringCat"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %2, %"github.com/goplus/llgo/runtime/internal/runtime.String" %13) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -61,23 +63,31 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/concat.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 48) - %1 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %0, i64 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 5 }, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %0, i64 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 1 }, ptr %2, align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %0, i64 2 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 5 }, ptr %3, align 8 - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %4, i64 3, 1 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, i64 3, 2 - %7 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testrt/concat.concat"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %7) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %0, i64 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 5 }, ptr %2, align 8 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %0, i64 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 1 }, ptr %4, align 8 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %0, i64 2 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 5 }, ptr %6, align 8 + %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 + %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, i64 3, 1 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, i64 3, 2 + %10 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testrt/concat.concat"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %10) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringCat"(%"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.String") declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) diff --git a/cl/_testrt/eface/out.ll b/cl/_testrt/eface/out.ll index c22f938e4a..eb7276a8b6 100644 --- a/cl/_testrt/eface/out.ll +++ b/cl/_testrt/eface/out.ll @@ -19,46 +19,46 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/eface" @0 = private unnamed_addr constant [6 x i8] c"invoke", align 1 @1 = private unnamed_addr constant [7 x i8] c"\09elem: ", align 1 @2 = private unnamed_addr constant [9 x i8] c"\09uncomm: ", align 1 -@_llgo_bool = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 554183389, i8 12, i8 1, i8 1, i8 33, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 4 }, ptr @"*_llgo_bool" }, align 8 +@_llgo_bool = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 554183389, i8 12, i8 1, i8 1, i8 1, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 4 }, ptr @"*_llgo_bool" }, align 8 @3 = private unnamed_addr constant [4 x i8] c"bool", align 1 @"*_llgo_bool" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1896950390, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 4 }, ptr null }, ptr @_llgo_bool }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 3 }, ptr @"*_llgo_int" }, align 8 @4 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 -@_llgo_int8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 1444672578, i8 12, i8 1, i8 1, i8 35, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 4 }, ptr @"*_llgo_int8" }, align 8 +@_llgo_int8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 1444672578, i8 12, i8 1, i8 1, i8 3, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 4 }, ptr @"*_llgo_int8" }, align 8 @5 = private unnamed_addr constant [4 x i8] c"int8", align 1 @"*_llgo_int8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1399554408, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 4 }, ptr null }, ptr @_llgo_int8 }, align 8 -@_llgo_int16 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 2, i64 0, i32 1041867489, i8 12, i8 2, i8 2, i8 36, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal16", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 5 }, ptr @"*_llgo_int16" }, align 8 +@_llgo_int16 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 2, i64 0, i32 1041867489, i8 12, i8 2, i8 2, i8 4, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal16", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 5 }, ptr @"*_llgo_int16" }, align 8 @6 = private unnamed_addr constant [5 x i8] c"int16", align 1 @"*_llgo_int16" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 575772759, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 5 }, ptr null }, ptr @_llgo_int16 }, align 8 -@_llgo_int32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 1448558410, i8 12, i8 4, i8 4, i8 37, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr @"*_llgo_int32" }, align 8 +@_llgo_int32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 1448558410, i8 12, i8 4, i8 4, i8 5, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr @"*_llgo_int32" }, align 8 @7 = private unnamed_addr constant [5 x i8] c"int32", align 1 @"*_llgo_int32" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -38689692, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr null }, ptr @_llgo_int32 }, align 8 -@_llgo_int64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 394795202, i8 12, i8 8, i8 8, i8 38, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr @"*_llgo_int64" }, align 8 +@_llgo_int64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 394795202, i8 12, i8 8, i8 8, i8 6, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr @"*_llgo_int64" }, align 8 @8 = private unnamed_addr constant [5 x i8] c"int64", align 1 @"*_llgo_int64" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1901231210, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr null }, ptr @_llgo_int64 }, align 8 -@_llgo_uint = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 172771804, i8 12, i8 8, i8 8, i8 39, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 4 }, ptr @"*_llgo_uint" }, align 8 +@_llgo_uint = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 172771804, i8 12, i8 8, i8 8, i8 7, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 4 }, ptr @"*_llgo_uint" }, align 8 @9 = private unnamed_addr constant [4 x i8] c"uint", align 1 @"*_llgo_uint" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1001256076, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 4 }, ptr null }, ptr @_llgo_uint }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @10 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 -@_llgo_uint16 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 2, i64 0, i32 -75471123, i8 12, i8 2, i8 2, i8 41, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal16", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 6 }, ptr @"*_llgo_uint16" }, align 8 +@_llgo_uint16 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 2, i64 0, i32 -75471123, i8 12, i8 2, i8 2, i8 9, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal16", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 6 }, ptr @"*_llgo_uint16" }, align 8 @11 = private unnamed_addr constant [6 x i8] c"uint16", align 1 @"*_llgo_uint16" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 530818523, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 6 }, ptr null }, ptr @_llgo_uint16 }, align 8 -@_llgo_uint32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 -625909322, i8 12, i8 4, i8 4, i8 42, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 6 }, ptr @"*_llgo_uint32" }, align 8 +@_llgo_uint32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 -625909322, i8 12, i8 4, i8 4, i8 10, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 6 }, ptr @"*_llgo_uint32" }, align 8 @12 = private unnamed_addr constant [6 x i8] c"uint32", align 1 @"*_llgo_uint32" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1605480511, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 6 }, ptr null }, ptr @_llgo_uint32 }, align 8 -@_llgo_uint64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1994022077, i8 12, i8 8, i8 8, i8 43, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 6 }, ptr @"*_llgo_uint64" }, align 8 +@_llgo_uint64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1994022077, i8 12, i8 8, i8 8, i8 11, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 6 }, ptr @"*_llgo_uint64" }, align 8 @13 = private unnamed_addr constant [6 x i8] c"uint64", align 1 @"*_llgo_uint64" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 89591114, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 6 }, ptr null }, ptr @_llgo_uint64 }, align 8 -@_llgo_uintptr = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1268343028, i8 12, i8 8, i8 8, i8 44, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 7 }, ptr @"*_llgo_uintptr" }, align 8 +@_llgo_uintptr = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1268343028, i8 12, i8 8, i8 8, i8 12, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 7 }, ptr @"*_llgo_uintptr" }, align 8 @14 = private unnamed_addr constant [7 x i8] c"uintptr", align 1 @"*_llgo_uintptr" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1684891952, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 7 }, ptr null }, ptr @_llgo_uintptr }, align 8 -@_llgo_float32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 62173712, i8 4, i8 4, i8 4, i8 45, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f32equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 7 }, ptr @"*_llgo_float32" }, align 8 +@_llgo_float32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 62173712, i8 4, i8 4, i8 4, i8 13, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f32equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 7 }, ptr @"*_llgo_float32" }, align 8 @15 = private unnamed_addr constant [7 x i8] c"float32", align 1 @"*_llgo_float32" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1426958587, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 7 }, ptr null }, ptr @_llgo_float32 }, align 8 -@_llgo_float64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1233032631, i8 4, i8 8, i8 8, i8 46, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f64equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 7 }, ptr @"*_llgo_float64" }, align 8 +@_llgo_float64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1233032631, i8 4, i8 8, i8 8, i8 14, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f64equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 7 }, ptr @"*_llgo_float64" }, align 8 @16 = private unnamed_addr constant [7 x i8] c"float64", align 1 @"*_llgo_float64" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1664509894, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 7 }, ptr null }, ptr @_llgo_float64 }, align 8 @"[10]_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 80, i64 0, i32 -2039641417, i8 8, i8 8, i8 8, i8 17, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"[10]_llgo_int" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 7 }, ptr @"*[10]_llgo_int" }, ptr @_llgo_int, ptr @"[]_llgo_int", i64 10 }, align 8 @@ -79,6 +79,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/eface" @23 = private unnamed_addr constant [14 x i8] c"unsafe.Pointer", align 1 @"*_llgo_Pointer" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1134390089, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @23, i64 14 }, ptr null }, ptr @_llgo_Pointer }, align 8 @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8$fields" = weak_odr constant [2 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 2 }, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @22, i64 5 }, ptr @_llgo_Pointer, i64 8, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 +@"__llgo.moduleZeroSizedAlloc$1129e080579aaf7d" = private unnamed_addr global [0 x i64] zeroinitializer @24 = private unnamed_addr constant [5 x i8] c"hello", align 1 @_llgo_string = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 8, i32 1749264893, i8 4, i8 8, i8 8, i8 24, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.strequal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @25, i64 6 }, ptr @"*_llgo_string" }, align 8 @25 = private unnamed_addr constant [6 x i8] c"string", align 1 @@ -95,6 +96,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/eface" @31 = private unnamed_addr constant [6 x i8] c"main.T", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testrt/eface.T" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1884578979, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @31, i64 6 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/eface.T" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @27, i64 39 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @32, i64 6 }, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", ptr @"github.com/goplus/llgo/cl/_testrt/eface.(*T).Invoke", ptr @"github.com/goplus/llgo/cl/_testrt/eface.(*T).Invoke" }] }, align 8 @32 = private unnamed_addr constant [6 x i8] c"Invoke", align 1 +@llvm.compiler.used = appending global [1 x ptr] [ptr @"github.com/goplus/llgo/cl/_testrt/eface.(*T).Invoke"], section "llvm.metadata" define void @"github.com/goplus/llgo/cl/_testrt/eface.(*T).Invoke"(ptr %0) { _llgo_0: @@ -107,9 +109,13 @@ define void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/ _llgo_0: %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/eface.eface", ptr %1, i32 0, i32 0 - %3 = load ptr, ptr %2, align 8 - call void @"github.com/goplus/llgo/cl/_testrt/eface.dumpTyp"(ptr %3, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer) + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/eface.eface", ptr %1, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dumpTyp"(ptr %5, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer) ret void } @@ -118,92 +124,136 @@ _llgo_0: call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %1) %2 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/abi.(*Type).String"(ptr %0) %3 = call i64 @"github.com/goplus/llgo/runtime/abi.(*Type).Kind"(ptr %0) - %4 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 0 - %5 = load i64, ptr %4, align 4 - %6 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 1 - %7 = load i64, ptr %6, align 4 - %8 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 2 - %9 = load i32, ptr %8, align 4 - %10 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 3 - %11 = load i8, ptr %10, align 1 - %12 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 4 - %13 = load i8, ptr %12, align 1 - %14 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 10 - %15 = load ptr, ptr %14, align 8 - %16 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Uncommon"(ptr %0) + %4 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 0 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load i64, ptr %5, align 4 + %8 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 1 + %10 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = load i64, ptr %9, align 4 + %12 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 2 + %14 = icmp eq ptr %13, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load i32, ptr %13, align 4 + %16 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 3 + %18 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = load i8, ptr %17, align 1 + %20 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 4 + %22 = icmp eq ptr %21, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %22) + %23 = load i8, ptr %21, align 1 + %24 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %24) + %25 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 10 + %26 = icmp eq ptr %25, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %26) + %27 = load ptr, ptr %25, align 8 + %28 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Uncommon"(ptr %0) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %2) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %3) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %5) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %7) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %17 = zext i32 %9 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %17) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %11) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) + %29 = zext i32 %15 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %29) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %18 = zext i8 %11 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %18) + %30 = zext i8 %19 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %30) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %19 = zext i8 %13 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %19) + %31 = zext i8 %23 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %31) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %15) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %27) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %16) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %28) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %20 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Elem"(ptr %0) - %21 = icmp ne ptr %20, null - br i1 %21, label %_llgo_1, label %_llgo_2 + %32 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Elem"(ptr %0) + %33 = icmp ne ptr %32, null + br i1 %33, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %22 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Elem"(ptr %0) - %23 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringCat"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %1, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 7 }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dumpTyp"(ptr %22, %"github.com/goplus/llgo/runtime/internal/runtime.String" %23) + %34 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Elem"(ptr %0) + %35 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringCat"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %1, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 7 }) + call void @"github.com/goplus/llgo/cl/_testrt/eface.dumpTyp"(ptr %34, %"github.com/goplus/llgo/runtime/internal/runtime.String" %35) br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 - %24 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Uncommon"(ptr %0) - %25 = icmp ne ptr %24, null - br i1 %25, label %_llgo_3, label %_llgo_4 + %36 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Uncommon"(ptr %0) + %37 = icmp ne ptr %36, null + br i1 %37, label %_llgo_3, label %_llgo_4 _llgo_3: ; preds = %_llgo_2 - %26 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Uncommon"(ptr %0) - %27 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringCat"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %1, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 9 }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dumpUncommon"(ptr %26, %"github.com/goplus/llgo/runtime/internal/runtime.String" %27) - %28 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 10 - %29 = load ptr, ptr %28, align 8 - %30 = icmp ne ptr %29, null - br i1 %30, label %_llgo_5, label %_llgo_4 + %38 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Uncommon"(ptr %0) + %39 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringCat"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %1, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 9 }) + call void @"github.com/goplus/llgo/cl/_testrt/eface.dumpUncommon"(ptr %38, %"github.com/goplus/llgo/runtime/internal/runtime.String" %39) + %40 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %40) + %41 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 10 + %42 = icmp eq ptr %41, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %42) + %43 = load ptr, ptr %41, align 8 + %44 = icmp ne ptr %43, null + br i1 %44, label %_llgo_5, label %_llgo_4 _llgo_4: ; preds = %_llgo_5, %_llgo_3, %_llgo_2 ret void _llgo_5: ; preds = %_llgo_3 - %31 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 10 - %32 = load ptr, ptr %31, align 8 - %33 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Uncommon"(ptr %32) - %34 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringCat"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %1, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 9 }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dumpUncommon"(ptr %33, %"github.com/goplus/llgo/runtime/internal/runtime.String" %34) + %45 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %45) + %46 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 10 + %47 = icmp eq ptr %46, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %47) + %48 = load ptr, ptr %46, align 8 + %49 = call ptr @"github.com/goplus/llgo/runtime/abi.(*Type).Uncommon"(ptr %48) + %50 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringCat"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %1, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 9 }) + call void @"github.com/goplus/llgo/cl/_testrt/eface.dumpUncommon"(ptr %49, %"github.com/goplus/llgo/runtime/internal/runtime.String" %50) br label %_llgo_4 } define void @"github.com/goplus/llgo/cl/_testrt/eface.dumpUncommon"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) { _llgo_0: call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %1) - %2 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.UncommonType", ptr %0, i32 0, i32 0 - %3 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %2, align 8 - %4 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.UncommonType", ptr %0, i32 0, i32 1 - %5 = load i16, ptr %4, align 2 - %6 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.UncommonType", ptr %0, i32 0, i32 2 - %7 = load i16, ptr %6, align 2 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %3) + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.UncommonType", ptr %0, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %3, align 8 + %6 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.UncommonType", ptr %0, i32 0, i32 1 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load i16, ptr %7, align 2 + %10 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.UncommonType", ptr %0, i32 0, i32 2 + %12 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = load i16, ptr %11, align 2 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %5) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %8 = zext i16 %5 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %8) + %14 = zext i16 %9 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %14) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - %9 = zext i16 %7 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %9) + %15 = zext i16 %13 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %15) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -224,49 +274,87 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/eface.main"() { _llgo_0: - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr inttoptr (i64 -1 to ptr) }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr null }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr null }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr null }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr null }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr null }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr null }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr null }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr null }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr null }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr null }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr null }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr null }) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr null }) - %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 80) - store [10 x i64] zeroinitializer, ptr %0, align 4 - %1 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"[10]_llgo_int", ptr undef }, ptr %0, 1 + %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 1) + store i1 true, ptr %0, align 1 + %1 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %0, 1 call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %1) - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testrt/eface.main$1", ptr null }, ptr %2, align 8 - %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %2, 1 + %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 0, ptr %2, align 4 + %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2, 1 call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %3) - call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"*_llgo_int", ptr null }) - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 0) - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %4, 0 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, i64 0, 1 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, i64 0, 2 - %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 24) - store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, ptr %8, align 8 - %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"[]_llgo_int", ptr undef }, ptr %8, 1 + %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 1) + store i8 0, ptr %4, align 1 + %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %4, 1 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %5) + %6 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 2) + store i16 0, ptr %6, align 2 + %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %6, 1 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %7) + %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 4) + store i32 0, ptr %8, align 4 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %8, 1 call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %9) - %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @24, i64 5 }, ptr %10, align 8 - %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %10, 1 + %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 0, ptr %10, align 4 + %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %10, 1 call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %11) - %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 24) - store { i8, i64, i64 } zeroinitializer, ptr %12, align 4 - %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"github.com/goplus/llgo/cl/_testrt/eface.struct$RKbUG45GE4henGMAdmt0Rju0JptyR8NsX7IZLsOI0OM", ptr undef }, ptr %12, 1 + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 0, ptr %12, align 4 + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %12, 1 call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %13) - %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, ptr %14, align 8 - %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/eface.T", ptr undef }, ptr %14, 1 + %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 1) + store i8 0, ptr %14, align 1 + %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %14, 1 call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %15) + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 2) + store i16 0, ptr %16, align 2 + %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %16, 1 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %17) + %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 4) + store i32 0, ptr %18, align 4 + %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %18, 1 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %19) + %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 0, ptr %20, align 4 + %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %20, 1 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %21) + %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 0, ptr %22, align 4 + %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %22, 1 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %23) + %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 4) + store float 0.000000e+00, ptr %24, align 4 + %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %24, 1 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %25) + %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store double 0.000000e+00, ptr %26, align 8 + %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %26, 1 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %27) + %28 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 80) + store [10 x i64] zeroinitializer, ptr %28, align 4 + %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"[10]_llgo_int", ptr undef }, ptr %28, 1 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %29) + %30 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testrt/eface.main$1", ptr null }, ptr %30, align 8 + %31 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %30, 1 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %31) + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"*_llgo_int", ptr null }) + %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 24) + store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$1129e080579aaf7d", i64 0, i64 0 }, ptr %32, align 8 + %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"[]_llgo_int", ptr undef }, ptr %32, 1 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %33) + %34 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @24, i64 5 }, ptr %34, align 8 + %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %34, 1 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %35) + %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 24) + store { i8, i64, i64 } zeroinitializer, ptr %36, align 4 + %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"github.com/goplus/llgo/cl/_testrt/eface.struct$RKbUG45GE4henGMAdmt0Rju0JptyR8NsX7IZLsOI0OM", ptr undef }, ptr %36, 1 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %37) + %38 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, ptr %38, align 8 + %39 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/eface.T", ptr undef }, ptr %38, 1 + call void @"github.com/goplus/llgo/cl/_testrt/eface.dump"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %39) ret void } @@ -281,6 +369,8 @@ declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/abi.(*Type).String"(ptr) declare i64 @"github.com/goplus/llgo/runtime/abi.(*Type).Kind"(ptr) @@ -313,6 +403,8 @@ _llgo_0: ret i1 %3 } +declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequal64"(ptr, ptr) define linkonce i1 @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64"(ptr %0, ptr %1, ptr %2) { @@ -355,8 +447,6 @@ _llgo_0: declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal"(ptr, ptr, ptr) -declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) - define linkonce void @"__llgo_stub.github.com/goplus/llgo/cl/_testrt/eface.main$1"(ptr %0) { _llgo_0: tail call void @"github.com/goplus/llgo/cl/_testrt/eface.main$1"() diff --git a/cl/_testrt/float2any/out.ll b/cl/_testrt/float2any/out.ll index bdb89f4039..6a3e0ff02f 100644 --- a/cl/_testrt/float2any/out.ll +++ b/cl/_testrt/float2any/out.ll @@ -7,7 +7,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/float2any" %"github.com/goplus/llgo/runtime/internal/runtime.eface" = type { ptr, ptr } @"github.com/goplus/llgo/cl/_testrt/float2any.init$guard" = global i1 false, align 1 -@_llgo_float32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 62173712, i8 4, i8 4, i8 4, i8 45, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f32equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 7 }, ptr @"*_llgo_float32" }, align 8 +@_llgo_float32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 62173712, i8 4, i8 4, i8 4, i8 13, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f32equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 7 }, ptr @"*_llgo_float32" }, align 8 @0 = private unnamed_addr constant [7 x i8] c"float32", align 1 @"*_llgo_float32" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1426958587, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 7 }, ptr null }, ptr @_llgo_float32 }, align 8 @1 = private unnamed_addr constant [36 x i8] c"type assertion any -> float32 failed", align 1 @@ -15,7 +15,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/float2any" @2 = private unnamed_addr constant [6 x i8] c"string", align 1 @"*_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1323879264, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 6 }, ptr null }, ptr @_llgo_string }, align 8 @3 = private unnamed_addr constant [9 x i8] c"error f32", align 1 -@_llgo_float64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1233032631, i8 4, i8 8, i8 8, i8 46, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f64equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }, ptr @"*_llgo_float64" }, align 8 +@_llgo_float64 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1233032631, i8 4, i8 8, i8 8, i8 14, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.f64equal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }, ptr @"*_llgo_float64" }, align 8 @4 = private unnamed_addr constant [7 x i8] c"float64", align 1 @"*_llgo_float64" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1664509894, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }, ptr null }, ptr @_llgo_float64 }, align 8 @5 = private unnamed_addr constant [36 x i8] c"type assertion any -> float64 failed", align 1 @@ -39,17 +39,15 @@ _llgo_2: ; preds = %_llgo_3 _llgo_3: ; preds = %_llgo_0 %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %6 = ptrtoint ptr %5 to i64 - %7 = trunc i64 %6 to i32 - %8 = bitcast i32 %7 to float - %9 = fcmp une float %8, 0x400921FB60000000 - br i1 %9, label %_llgo_1, label %_llgo_2 + %6 = load float, ptr %5, align 4 + %7 = fcmp une float %6, 0x400921FB60000000 + br i1 %7, label %_llgo_1, label %_llgo_2 _llgo_4: ; preds = %_llgo_0 - %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 36 }, ptr %10, align 8 - %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %10, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %11) + %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 36 }, ptr %8, align 8 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %8, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %9) unreachable } @@ -71,16 +69,15 @@ _llgo_2: ; preds = %_llgo_3 _llgo_3: ; preds = %_llgo_0 %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, 1 - %6 = ptrtoint ptr %5 to i64 - %7 = bitcast i64 %6 to double - %8 = fcmp une double %7, 0x400921FB53C8D4F1 - br i1 %8, label %_llgo_1, label %_llgo_2 + %6 = load double, ptr %5, align 8 + %7 = fcmp une double %6, 0x400921FB53C8D4F1 + br i1 %7, label %_llgo_1, label %_llgo_2 _llgo_4: ; preds = %_llgo_0 - %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 36 }, ptr %9, align 8 - %10 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %9, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %10) + %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 36 }, ptr %8, align 8 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %8, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %9) unreachable } @@ -110,15 +107,15 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/float2any.main"() { _llgo_0: %0 = call float @"github.com/goplus/llgo/cl/_testrt/float2any.f32"() - %1 = bitcast float %0 to i32 - %2 = inttoptr i32 %1 to ptr - %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %2, 1 - call void @"github.com/goplus/llgo/cl/_testrt/float2any.check32"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %3) - %4 = call double @"github.com/goplus/llgo/cl/_testrt/float2any.f64"() - %5 = bitcast double %4 to i64 - %6 = inttoptr i64 %5 to ptr - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %6, 1 - call void @"github.com/goplus/llgo/cl/_testrt/float2any.check64"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %7) + %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 4) + store float %0, ptr %1, align 4 + %2 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %1, 1 + call void @"github.com/goplus/llgo/cl/_testrt/float2any.check32"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %2) + %3 = call double @"github.com/goplus/llgo/cl/_testrt/float2any.f64"() + %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store double %3, ptr %4, align 8 + %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %4, 1 + call void @"github.com/goplus/llgo/cl/_testrt/float2any.check64"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %5) ret void } diff --git a/cl/_testrt/freevars/out.ll b/cl/_testrt/freevars/out.ll index bc5f352282..c3902ee922 100644 --- a/cl/_testrt/freevars/out.ll +++ b/cl/_testrt/freevars/out.ll @@ -55,18 +55,22 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 %12 = extractvalue { ptr } %2, 0 - %13 = load { ptr, ptr }, ptr %12, align 8 - %14 = extractvalue { ptr, ptr } %13, 1 - %15 = extractvalue { ptr, ptr } %13, 0 - call void %15(ptr %14, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load { ptr, ptr }, ptr %12, align 8 + %15 = extractvalue { ptr, ptr } %14, 1 + %16 = extractvalue { ptr, ptr } %14, 0 + call void %16(ptr %15, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %1) ret void _llgo_2: ; preds = %_llgo_0 - %16 = extractvalue { ptr } %2, 0 - %17 = load { ptr, ptr }, ptr %16, align 8 - %18 = extractvalue { ptr, ptr } %17, 1 - %19 = extractvalue { ptr, ptr } %17, 0 - call void %19(ptr %18, %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) + %17 = extractvalue { ptr } %2, 0 + %18 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = load { ptr, ptr }, ptr %17, align 8 + %20 = extractvalue { ptr, ptr } %19, 1 + %21 = extractvalue { ptr, ptr } %19, 0 + call void %21(ptr %20, %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer) ret void } @@ -88,3 +92,5 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface", %"github.com/goplus/llgo/runtime/internal/runtime.eface") declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"github.com/goplus/llgo/runtime/internal/runtime.iface") + +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) diff --git a/cl/_testrt/funcaddr/out.ll b/cl/_testrt/funcaddr/out.ll index 5ef9585c4a..57ca487e7e 100644 --- a/cl/_testrt/funcaddr/out.ll +++ b/cl/_testrt/funcaddr/out.ll @@ -28,20 +28,30 @@ _llgo_0: store ptr @"github.com/goplus/llgo/cl/_testrt/funcaddr.add", ptr %0, align 8 %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) store ptr @"github.com/goplus/llgo/cl/_testrt/funcaddr.main$1", ptr %1, align 8 - %2 = load ptr, ptr %0, align 8 - %3 = icmp eq ptr @"github.com/goplus/llgo/cl/_testrt/funcaddr.add", %2 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %3) + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load ptr, ptr %0, align 8 + %4 = icmp eq ptr @"github.com/goplus/llgo/cl/_testrt/funcaddr.add", %3 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %4) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %4 = load ptr, ptr %0, align 8 - %5 = load ptr, ptr %0, align 8 - %6 = icmp eq ptr %4, %5 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %6) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %7 = load ptr, ptr %1, align 8 - %8 = load ptr, ptr %1, align 8 - %9 = icmp eq ptr %7, %8 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load ptr, ptr %0, align 8 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = load ptr, ptr %0, align 8 + %9 = icmp eq ptr %6, %8 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %9) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) + %10 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = load ptr, ptr %1, align 8 + %12 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = load ptr, ptr %1, align 8 + %14 = icmp eq ptr %11, %13 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %14) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -53,6 +63,8 @@ _llgo_0: declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) diff --git a/cl/_testrt/funcdecl/out.ll b/cl/_testrt/funcdecl/out.ll index f14070e0e8..e17083f91b 100644 --- a/cl/_testrt/funcdecl/out.ll +++ b/cl/_testrt/funcdecl/out.ll @@ -94,11 +94,19 @@ define ptr @"github.com/goplus/llgo/cl/_testrt/funcdecl.closurePtr"(%"github.com _llgo_0: %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %0, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/funcdecl.rtype", ptr %1, i32 0, i32 1 - %3 = load ptr, ptr %2, align 8 - %4 = getelementptr inbounds { ptr, ptr }, ptr %3, i32 0, i32 0 - %5 = load ptr, ptr %4, align 8 - ret ptr %5 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/funcdecl.rtype", ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 0 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load ptr, ptr %7, align 8 + ret ptr %9 } define void @"github.com/goplus/llgo/cl/_testrt/funcdecl.demo"() { @@ -167,4 +175,6 @@ declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String") diff --git a/cl/_testrt/gblarray/out.ll b/cl/_testrt/gblarray/out.ll index 5bd05c1c24..2fd57f1900 100644 --- a/cl/_testrt/gblarray/out.ll +++ b/cl/_testrt/gblarray/out.ll @@ -11,28 +11,40 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/gblarray" define ptr @"github.com/goplus/llgo/cl/_testrt/gblarray.Basic"(i64 %0) { _llgo_0: + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) %1 = icmp sge i64 %0, 25 call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %1) %2 = getelementptr inbounds ptr, ptr @"github.com/goplus/llgo/cl/_testrt/gblarray.basicTypes", i64 %0 - %3 = load ptr, ptr %2, align 8 - ret ptr %3 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + ret ptr %4 } define ptr @"github.com/goplus/llgo/cl/_testrt/gblarray.basicType"(i64 %0) { _llgo_0: %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 72) - %2 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %1, i32 0, i32 0 - %3 = icmp sge i64 %0, 25 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %3) - %4 = getelementptr inbounds i64, ptr @"github.com/goplus/llgo/cl/_testrt/gblarray.sizeBasicTypes", i64 %0 - %5 = load i64, ptr %4, align 4 - %6 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %1, i32 0, i32 2 - %7 = trunc i64 %0 to i32 - %8 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %1, i32 0, i32 6 - %9 = trunc i64 %0 to i8 - store i64 %5, ptr %2, align 4 - store i32 %7, ptr %6, align 4 - store i8 %9, ptr %8, align 1 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %1, i32 0, i32 0 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + %4 = icmp sge i64 %0, 25 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %4) + %5 = getelementptr inbounds i64, ptr @"github.com/goplus/llgo/cl/_testrt/gblarray.sizeBasicTypes", i64 %0 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load i64, ptr %5, align 4 + %8 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %1, i32 0, i32 2 + %10 = trunc i64 %0 to i32 + %11 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %1, i32 0, i32 6 + %13 = trunc i64 %0 to i8 + store i64 %7, ptr %3, align 4 + store i32 %10, ptr %9, align 4 + store i8 %13, ptr %12, align 1 ret ptr %1 } @@ -44,7 +56,9 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"github.com/goplus/llgo/cl/_testrt/gblarray.init$guard", align 1 call void @"github.com/goplus/llgo/runtime/abi.init"() + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) store i64 16, ptr getelementptr inbounds (i64, ptr @"github.com/goplus/llgo/cl/_testrt/gblarray.sizeBasicTypes", i64 24), align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) %1 = call ptr @"github.com/goplus/llgo/cl/_testrt/gblarray.basicType"(i64 24) store ptr %1, ptr getelementptr inbounds (ptr, ptr @"github.com/goplus/llgo/cl/_testrt/gblarray.basicTypes", i64 24), align 8 br label %_llgo_2 @@ -56,15 +70,25 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/gblarray.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/cl/_testrt/gblarray.Basic"(i64 24) - %1 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 6 - %2 = load i8, ptr %1, align 1 - %3 = zext i8 %2 to i64 - %4 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 0 - %5 = load i64, ptr %4, align 4 - %6 = call i32 (ptr, ...) @printf(ptr @0, i64 %3, i64 %5) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 6 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i8, ptr %2, align 1 + %5 = zext i8 %4 to i64 + %6 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/runtime/abi.Type", ptr %0, i32 0, i32 0 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load i64, ptr %7, align 4 + %10 = call i32 (ptr, ...) @printf(ptr @0, i64 %5, i64 %9) ret void } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) diff --git a/cl/_testrt/hello/out.ll b/cl/_testrt/hello/out.ll index fa6ffd67ce..83e2e1a319 100644 --- a/cl/_testrt/hello/out.ll +++ b/cl/_testrt/hello/out.ll @@ -11,6 +11,16 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"github.com/goplus/llgo/cl/_testrt/hello.init$guard", align 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) store i8 72, ptr @"github.com/goplus/llgo/cl/_testrt/hello.format", align 1 store i8 101, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testrt/hello.format", i64 1), align 1 store i8 108, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testrt/hello.format", i64 2), align 1 @@ -29,11 +39,14 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/hello.main"() { _llgo_0: + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) %0 = call i32 @strlen(ptr @"github.com/goplus/llgo/cl/_testrt/hello.format") call void (ptr, ...) @printf(ptr @"github.com/goplus/llgo/cl/_testrt/hello.format", i32 %0) ret void } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i32 @strlen(ptr) declare void @printf(ptr, ...) diff --git a/cl/_testrt/index/out.ll b/cl/_testrt/index/out.ll index 49d7c4566b..52dc4a3905 100644 --- a/cl/_testrt/index/out.ll +++ b/cl/_testrt/index/out.ll @@ -27,114 +27,194 @@ _llgo_0: call void @llvm.memset(ptr %0, i8 0, i64 16, i1 false) %1 = alloca [3 x %"github.com/goplus/llgo/cl/_testrt/index.point"], align 8 call void @llvm.memset(ptr %1, i8 0, i64 48, i1 false) - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %1, i64 0 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %2, i32 0, i32 0 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %2, i32 0, i32 1 - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %1, i64 1 - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %5, i32 0, i32 0 - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %5, i32 0, i32 1 - %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %1, i64 2 - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %8, i32 0, i32 0 - %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %8, i32 0, i32 1 - store i64 1, ptr %3, align 4 - store i64 2, ptr %4, align 4 - store i64 3, ptr %6, align 4 - store i64 4, ptr %7, align 4 - store i64 5, ptr %9, align 4 - store i64 6, ptr %10, align 4 - %11 = load [3 x %"github.com/goplus/llgo/cl/_testrt/index.point"], ptr %1, align 4 - %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %1, i64 2 - %13 = load %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %12, align 4 - store %"github.com/goplus/llgo/cl/_testrt/index.point" %13, ptr %0, align 4 - %14 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %0, i32 0, i32 0 - %15 = load i64, ptr %14, align 4 - %16 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %0, i32 0, i32 1 - %17 = load i64, ptr %16, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %15) + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %1, i64 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %3, i32 0, i32 0 + %6 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %3, i32 0, i32 1 + %8 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %1, i64 1 + %10 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %9, i32 0, i32 0 + %12 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %9, i32 0, i32 1 + %14 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %1, i64 2 + %16 = icmp eq ptr %15, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %15, i32 0, i32 0 + %18 = icmp eq ptr %15, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %15, i32 0, i32 1 + store i64 1, ptr %5, align 4 + store i64 2, ptr %7, align 4 + store i64 3, ptr %11, align 4 + store i64 4, ptr %13, align 4 + store i64 5, ptr %17, align 4 + store i64 6, ptr %19, align 4 + %20 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = load [3 x %"github.com/goplus/llgo/cl/_testrt/index.point"], ptr %1, align 4 + %22 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %1, i64 2 + %23 = load %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %22, align 4 + store %"github.com/goplus/llgo/cl/_testrt/index.point" %23, ptr %0, align 4 + %24 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %24) + %25 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %0, i32 0, i32 0 + %26 = icmp eq ptr %25, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %26) + %27 = load i64, ptr %25, align 4 + %28 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %28) + %29 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/index.point", ptr %0, i32 0, i32 1 + %30 = icmp eq ptr %29, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %30) + %31 = load i64, ptr %29, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %27) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %17) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %31) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %18 = alloca [2 x i64], align 8 - call void @llvm.memset(ptr %18, i8 0, i64 16, i1 false) - %19 = alloca [2 x [2 x i64]], align 8 - call void @llvm.memset(ptr %19, i8 0, i64 32, i1 false) - %20 = getelementptr inbounds [2 x i64], ptr %19, i64 0 - %21 = getelementptr inbounds i64, ptr %20, i64 0 - %22 = getelementptr inbounds i64, ptr %20, i64 1 - %23 = getelementptr inbounds [2 x i64], ptr %19, i64 1 - %24 = getelementptr inbounds i64, ptr %23, i64 0 - %25 = getelementptr inbounds i64, ptr %23, i64 1 - store i64 1, ptr %21, align 4 - store i64 2, ptr %22, align 4 - store i64 3, ptr %24, align 4 - store i64 4, ptr %25, align 4 - %26 = load [2 x [2 x i64]], ptr %19, align 4 - %27 = getelementptr inbounds [2 x i64], ptr %19, i64 1 - %28 = load [2 x i64], ptr %27, align 4 - store [2 x i64] %28, ptr %18, align 4 - %29 = getelementptr inbounds i64, ptr %18, i64 0 - %30 = load i64, ptr %29, align 4 - %31 = getelementptr inbounds i64, ptr %18, i64 1 - %32 = load i64, ptr %31, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %30) + %32 = alloca [2 x i64], align 8 + call void @llvm.memset(ptr %32, i8 0, i64 16, i1 false) + %33 = alloca [2 x [2 x i64]], align 8 + call void @llvm.memset(ptr %33, i8 0, i64 32, i1 false) + %34 = icmp eq ptr %33, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %34) + %35 = getelementptr inbounds [2 x i64], ptr %33, i64 0 + %36 = icmp eq ptr %35, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %36) + %37 = getelementptr inbounds i64, ptr %35, i64 0 + %38 = icmp eq ptr %35, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %38) + %39 = getelementptr inbounds i64, ptr %35, i64 1 + %40 = icmp eq ptr %33, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %40) + %41 = getelementptr inbounds [2 x i64], ptr %33, i64 1 + %42 = icmp eq ptr %41, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %42) + %43 = getelementptr inbounds i64, ptr %41, i64 0 + %44 = icmp eq ptr %41, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %44) + %45 = getelementptr inbounds i64, ptr %41, i64 1 + store i64 1, ptr %37, align 4 + store i64 2, ptr %39, align 4 + store i64 3, ptr %43, align 4 + store i64 4, ptr %45, align 4 + %46 = icmp eq ptr %33, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %46) + %47 = load [2 x [2 x i64]], ptr %33, align 4 + %48 = getelementptr inbounds [2 x i64], ptr %33, i64 1 + %49 = load [2 x i64], ptr %48, align 4 + store [2 x i64] %49, ptr %32, align 4 + %50 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %50) + %51 = getelementptr inbounds i64, ptr %32, i64 0 + %52 = icmp eq ptr %51, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %52) + %53 = load i64, ptr %51, align 4 + %54 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %54) + %55 = getelementptr inbounds i64, ptr %32, i64 1 + %56 = icmp eq ptr %55, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %56) + %57 = load i64, ptr %55, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %53) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %32) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %57) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %33 = alloca [5 x i64], align 8 - call void @llvm.memset(ptr %33, i8 0, i64 40, i1 false) - %34 = getelementptr inbounds i64, ptr %33, i64 0 - %35 = getelementptr inbounds i64, ptr %33, i64 1 - %36 = getelementptr inbounds i64, ptr %33, i64 2 - %37 = getelementptr inbounds i64, ptr %33, i64 3 - %38 = getelementptr inbounds i64, ptr %33, i64 4 - store i64 1, ptr %34, align 4 - store i64 2, ptr %35, align 4 - store i64 3, ptr %36, align 4 - store i64 4, ptr %37, align 4 - store i64 5, ptr %38, align 4 - %39 = load [5 x i64], ptr %33, align 4 - %40 = getelementptr inbounds i64, ptr %33, i64 2 - %41 = load i64, ptr %40, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %41) + %58 = alloca [5 x i64], align 8 + call void @llvm.memset(ptr %58, i8 0, i64 40, i1 false) + %59 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %59) + %60 = getelementptr inbounds i64, ptr %58, i64 0 + %61 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %61) + %62 = getelementptr inbounds i64, ptr %58, i64 1 + %63 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %63) + %64 = getelementptr inbounds i64, ptr %58, i64 2 + %65 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %65) + %66 = getelementptr inbounds i64, ptr %58, i64 3 + %67 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %67) + %68 = getelementptr inbounds i64, ptr %58, i64 4 + store i64 1, ptr %60, align 4 + store i64 2, ptr %62, align 4 + store i64 3, ptr %64, align 4 + store i64 4, ptr %66, align 4 + store i64 5, ptr %68, align 4 + %69 = icmp eq ptr %58, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %69) + %70 = load [5 x i64], ptr %58, align 4 + %71 = getelementptr inbounds i64, ptr %58, i64 2 + %72 = load i64, ptr %71, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %72) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %42 = load i8, ptr getelementptr inbounds (i8, ptr @0, i64 2), align 1 - %43 = zext i8 %42 to i32 - %44 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringFromRune"(i32 %43) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %44) + %73 = load i8, ptr getelementptr inbounds (i8, ptr @0, i64 2), align 1 + %74 = zext i8 %73 to i32 + %75 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringFromRune"(i32 %74) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %75) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %45 = load i8, ptr getelementptr inbounds (i8, ptr @0, i64 1), align 1 - %46 = zext i8 %45 to i32 - %47 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringFromRune"(i32 %46) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %47) + %76 = load i8, ptr getelementptr inbounds (i8, ptr @0, i64 1), align 1 + %77 = zext i8 %76 to i32 + %78 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.StringFromRune"(i32 %77) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %78) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %48 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %49 = getelementptr inbounds i64, ptr %48, i64 0 - %50 = getelementptr inbounds i64, ptr %48, i64 1 - store i64 1, ptr %49, align 4 - store i64 2, ptr %50, align 4 - %51 = getelementptr inbounds i64, ptr %48, i64 1 - %52 = load i64, ptr %51, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %52) + %79 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %80 = icmp eq ptr %79, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %80) + %81 = getelementptr inbounds i64, ptr %79, i64 0 + %82 = icmp eq ptr %79, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %82) + %83 = getelementptr inbounds i64, ptr %79, i64 1 + store i64 1, ptr %81, align 4 + store i64 2, ptr %83, align 4 + %84 = icmp eq ptr %79, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %84) + %85 = getelementptr inbounds i64, ptr %79, i64 1 + %86 = icmp eq ptr %85, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %86) + %87 = load i64, ptr %85, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %87) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %53 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %54 = getelementptr inbounds i64, ptr %53, i64 0 - store i64 1, ptr %54, align 4 - %55 = getelementptr inbounds i64, ptr %53, i64 1 - store i64 2, ptr %55, align 4 - %56 = getelementptr inbounds i64, ptr %53, i64 2 - store i64 3, ptr %56, align 4 - %57 = getelementptr inbounds i64, ptr %53, i64 3 - store i64 4, ptr %57, align 4 - %58 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %53, 0 - %59 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %58, i64 4, 1 - %60 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %59, i64 4, 2 - %61 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %60, 0 - %62 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %60, 1 - %63 = icmp sge i64 1, %62 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %63) - %64 = getelementptr inbounds i64, ptr %61, i64 1 - %65 = load i64, ptr %64, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %65) + %88 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) + %89 = icmp eq ptr %88, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %89) + %90 = getelementptr inbounds i64, ptr %88, i64 0 + store i64 1, ptr %90, align 4 + %91 = icmp eq ptr %88, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %91) + %92 = getelementptr inbounds i64, ptr %88, i64 1 + store i64 2, ptr %92, align 4 + %93 = icmp eq ptr %88, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %93) + %94 = getelementptr inbounds i64, ptr %88, i64 2 + store i64 3, ptr %94, align 4 + %95 = icmp eq ptr %88, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %95) + %96 = getelementptr inbounds i64, ptr %88, i64 3 + store i64 4, ptr %96, align 4 + %97 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %88, 0 + %98 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %97, i64 4, 1 + %99 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %98, i64 4, 2 + %100 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %99, 0 + %101 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %99, 1 + %102 = icmp sge i64 1, %101 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %102) + %103 = getelementptr inbounds i64, ptr %100, i64 1 + %104 = icmp eq ptr %103, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %104) + %105 = load i64, ptr %103, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %105) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 0) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) @@ -144,6 +224,8 @@ _llgo_0: ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) diff --git a/cl/_testrt/intgen/out.ll b/cl/_testrt/intgen/out.ll index 2d0b58ec32..02d3e8f8ba 100644 --- a/cl/_testrt/intgen/out.ll +++ b/cl/_testrt/intgen/out.ll @@ -8,6 +8,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/intgen" @0 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 @1 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 @2 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 +@llvm.compiler.used = appending global [1 x ptr] [ptr @"github.com/goplus/llgo/cl/_testrt/intgen.(*generator).next"], section "llvm.metadata" define %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testrt/intgen.genInts"(i64 %0, { ptr, ptr } %1) { _llgo_0: @@ -41,14 +42,24 @@ _llgo_3: ; preds = %_llgo_1 define i32 @"github.com/goplus/llgo/cl/_testrt/intgen.(*generator).next"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/intgen.generator", ptr %0, i32 0, i32 0 - %2 = load i32, ptr %1, align 4 - %3 = add i32 %2, 1 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/intgen.generator", ptr %0, i32 0, i32 0 - store i32 %3, ptr %4, align 4 - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/intgen.generator", ptr %0, i32 0, i32 0 - %6 = load i32, ptr %5, align 4 - ret i32 %6 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/intgen.generator", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i32, ptr %2, align 4 + %5 = add i32 %4, 1 + %6 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/intgen.generator", ptr %0, i32 0, i32 0 + store i32 %5, ptr %7, align 4 + %8 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/intgen.generator", ptr %0, i32 0, i32 0 + %10 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = load i32, ptr %9, align 4 + ret i32 %11 } define void @"github.com/goplus/llgo/cl/_testrt/intgen.init"() { @@ -84,67 +95,75 @@ _llgo_2: ; preds = %_llgo_1 %9 = or i1 %8, %7 call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %9) %10 = getelementptr inbounds i32, ptr %5, i64 %3 - %11 = load i32, ptr %10, align 4 - %12 = call i32 (ptr, ...) @printf(ptr @0, i32 %11) + %11 = icmp eq ptr %10, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = load i32, ptr %10, align 4 + %13 = call i32 (ptr, ...) @printf(ptr @0, i32 %12) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 - %13 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 4) - store i32 1, ptr %13, align 4 - %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) - %15 = getelementptr inbounds { ptr }, ptr %14, i32 0, i32 0 - store ptr %13, ptr %15, align 8 - %16 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testrt/intgen.main$1", ptr undef }, ptr %14, 1 - %17 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testrt/intgen.genInts"(i64 5, { ptr, ptr } %16) - %18 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %17, 1 + %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 4) + store i32 1, ptr %14, align 4 + %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + %16 = getelementptr inbounds { ptr }, ptr %15, i32 0, i32 0 + store ptr %14, ptr %16, align 8 + %17 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testrt/intgen.main$1", ptr undef }, ptr %15, 1 + %18 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testrt/intgen.genInts"(i64 5, { ptr, ptr } %17) + %19 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %18, 1 br label %_llgo_4 _llgo_4: ; preds = %_llgo_5, %_llgo_3 - %19 = phi i64 [ -1, %_llgo_3 ], [ %20, %_llgo_5 ] - %20 = add i64 %19, 1 - %21 = icmp slt i64 %20, %18 - br i1 %21, label %_llgo_5, label %_llgo_6 + %20 = phi i64 [ -1, %_llgo_3 ], [ %21, %_llgo_5 ] + %21 = add i64 %20, 1 + %22 = icmp slt i64 %21, %19 + br i1 %22, label %_llgo_5, label %_llgo_6 _llgo_5: ; preds = %_llgo_4 - %22 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %17, 0 - %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %17, 1 - %24 = icmp slt i64 %20, 0 - %25 = icmp sge i64 %20, %23 - %26 = or i1 %25, %24 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %26) - %27 = getelementptr inbounds i32, ptr %22, i64 %20 - %28 = load i32, ptr %27, align 4 - %29 = call i32 (ptr, ...) @printf(ptr @1, i32 %28) + %23 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %18, 0 + %24 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %18, 1 + %25 = icmp slt i64 %21, 0 + %26 = icmp sge i64 %21, %24 + %27 = or i1 %26, %25 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %27) + %28 = getelementptr inbounds i32, ptr %23, i64 %21 + %29 = icmp eq ptr %28, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %29) + %30 = load i32, ptr %28, align 4 + %31 = call i32 (ptr, ...) @printf(ptr @1, i32 %30) br label %_llgo_4 _llgo_6: ; preds = %_llgo_4 - %30 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 4) - %31 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/intgen.generator", ptr %30, i32 0, i32 0 - store i32 1, ptr %31, align 4 - %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) - %33 = getelementptr inbounds { ptr }, ptr %32, i32 0, i32 0 - store ptr %30, ptr %33, align 8 - %34 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testrt/intgen.(*generator).next$bound", ptr undef }, ptr %32, 1 - %35 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testrt/intgen.genInts"(i64 5, { ptr, ptr } %34) - %36 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %35, 1 + %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 4) + %33 = icmp eq ptr %32, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %33) + %34 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/intgen.generator", ptr %32, i32 0, i32 0 + store i32 1, ptr %34, align 4 + %35 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + %36 = getelementptr inbounds { ptr }, ptr %35, i32 0, i32 0 + store ptr %32, ptr %36, align 8 + %37 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testrt/intgen.(*generator).next$bound", ptr undef }, ptr %35, 1 + %38 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/cl/_testrt/intgen.genInts"(i64 5, { ptr, ptr } %37) + %39 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %38, 1 br label %_llgo_7 _llgo_7: ; preds = %_llgo_8, %_llgo_6 - %37 = phi i64 [ -1, %_llgo_6 ], [ %38, %_llgo_8 ] - %38 = add i64 %37, 1 - %39 = icmp slt i64 %38, %36 - br i1 %39, label %_llgo_8, label %_llgo_9 + %40 = phi i64 [ -1, %_llgo_6 ], [ %41, %_llgo_8 ] + %41 = add i64 %40, 1 + %42 = icmp slt i64 %41, %39 + br i1 %42, label %_llgo_8, label %_llgo_9 _llgo_8: ; preds = %_llgo_7 - %40 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %35, 0 - %41 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %35, 1 - %42 = icmp slt i64 %38, 0 - %43 = icmp sge i64 %38, %41 - %44 = or i1 %43, %42 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %44) - %45 = getelementptr inbounds i32, ptr %40, i64 %38 - %46 = load i32, ptr %45, align 4 - %47 = call i32 (ptr, ...) @printf(ptr @2, i32 %46) + %43 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %38, 0 + %44 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %38, 1 + %45 = icmp slt i64 %41, 0 + %46 = icmp sge i64 %41, %44 + %47 = or i1 %46, %45 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %47) + %48 = getelementptr inbounds i32, ptr %43, i64 %41 + %49 = icmp eq ptr %48, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %49) + %50 = load i32, ptr %48, align 4 + %51 = call i32 (ptr, ...) @printf(ptr @2, i32 %50) br label %_llgo_7 _llgo_9: ; preds = %_llgo_7 @@ -155,19 +174,25 @@ define i32 @"github.com/goplus/llgo/cl/_testrt/intgen.main$1"(ptr %0) { _llgo_0: %1 = load { ptr }, ptr %0, align 8 %2 = extractvalue { ptr } %1, 0 - %3 = load i32, ptr %2, align 4 - %4 = mul i32 %3, 2 - %5 = extractvalue { ptr } %1, 0 - store i32 %4, ptr %5, align 4 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i32, ptr %2, align 4 + %5 = mul i32 %4, 2 %6 = extractvalue { ptr } %1, 0 - %7 = load i32, ptr %6, align 4 - ret i32 %7 + store i32 %5, ptr %6, align 4 + %7 = extractvalue { ptr } %1, 0 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load i32, ptr %7, align 4 + ret i32 %9 } declare %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.MakeSlice"(i64, i64, i64) declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i32 @rand() define linkonce i32 @__llgo_stub.rand(ptr %0) { diff --git a/cl/_testrt/len/out.ll b/cl/_testrt/len/out.ll index defdc841d3..cad07599f6 100644 --- a/cl/_testrt/len/out.ll +++ b/cl/_testrt/len/out.ll @@ -16,7 +16,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/len" @"map[_llgo_int]_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.MapType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -2084636366, i8 0, i8 8, i8 8, i8 53, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 14 }, ptr @"*map[_llgo_int]_llgo_string" }, ptr @_llgo_int, ptr @_llgo_string, ptr @"_llgo_struct$-d5W1oQEguzs9p8l76MbO7RbmjtJYi8DH1vVvnKnZqQ", { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.typehash", ptr @_llgo_int }, i8 8, i8 16, i16 208, i32 4 }, align 8 @0 = private unnamed_addr constant [14 x i8] c"map[int]string", align 1 @"*map[_llgo_int]_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 668541983, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 14 }, ptr null }, ptr @"map[_llgo_int]_llgo_string" }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr @"*_llgo_int" }, align 8 @1 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @_llgo_string = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 8, i32 1749264893, i8 4, i8 8, i8 8, i8 24, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.strequal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 6 }, ptr @"*_llgo_string" }, align 8 @@ -29,7 +29,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/len" @"[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 307038632, i8 8, i8 1, i8 1, i8 17, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"[8]_llgo_uint8" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 8 }, ptr @"*[8]_llgo_uint8" }, ptr @_llgo_uint8, ptr @"[]_llgo_uint8", i64 8 }, align 8 @5 = private unnamed_addr constant [8 x i8] c"[8]uint8", align 1 @"*[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -566230779, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 8 }, ptr null }, ptr @"[8]_llgo_uint8" }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @6 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @"[]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 370346748, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 7 }, ptr @"*[]_llgo_uint8" }, ptr @_llgo_uint8 }, align 8 @@ -72,96 +72,160 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/len.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 56) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %0, i32 0, i32 0 - %2 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %1, align 8 - %3 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %2, 1 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %0, i32 0, i32 1 - %5 = load ptr, ptr %4, align 8 - %6 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.ChanLen"(ptr %5) - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %0, i32 0, i32 2 - %8 = load ptr, ptr %7, align 8 - %9 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.MapLen"(ptr %8) - %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %0, i32 0, i32 3 - %11 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %10, align 8 - %12 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 1 - %13 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %0, i32 0, i32 1 - %14 = load ptr, ptr %13, align 8 - %15 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.ChanCap"(ptr %14) - %16 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %0, i32 0, i32 3 - %17 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %16, align 8 - %18 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %17, 2 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %3) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %2, align 8 + %5 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %4, 1 + %6 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %0, i32 0, i32 1 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load ptr, ptr %7, align 8 + %10 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.ChanLen"(ptr %9) + %11 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %0, i32 0, i32 2 + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load ptr, ptr %12, align 8 + %15 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.MapLen"(ptr %14) + %16 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %0, i32 0, i32 3 + %18 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %17, align 8 + %20 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %19, 1 + %21 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %21) + %22 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %0, i32 0, i32 1 + %23 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %23) + %24 = load ptr, ptr %22, align 8 + %25 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.ChanCap"(ptr %24) + %26 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %26) + %27 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %0, i32 0, i32 3 + %28 = icmp eq ptr %27, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %28) + %29 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %27, align 8 + %30 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %29, 2 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %5) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %6) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %10) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %9) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %15) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %12) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %20) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %15) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %25) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %18) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %30) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %19 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 56) - %20 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %19, i32 0, i32 0 - %21 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %19, i32 0, i32 1 - %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewChan"(i64 8, i64 2) - %23 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %19, i32 0, i32 2 - %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_string", i64 1) - %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) - store i64 1, ptr %25, align 4 - %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_string", ptr %24, ptr %25) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 5 }, ptr %26, align 8 - %27 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %19, i32 0, i32 3 - %28 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %29 = getelementptr inbounds i64, ptr %28, i64 0 - store i64 1, ptr %29, align 4 - %30 = getelementptr inbounds i64, ptr %28, i64 1 - store i64 2, ptr %30, align 4 - %31 = getelementptr inbounds i64, ptr %28, i64 2 - store i64 3, ptr %31, align 4 - %32 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %28, 0 - %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %32, i64 3, 1 - %34 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %33, i64 3, 2 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 5 }, ptr %20, align 8 - store ptr %22, ptr %21, align 8 - store ptr %24, ptr %23, align 8 - store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %34, ptr %27, align 8 - %35 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %19, i32 0, i32 0 - %36 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %35, align 8 - %37 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %36, 1 - %38 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %19, i32 0, i32 1 - %39 = load ptr, ptr %38, align 8 - %40 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.ChanLen"(ptr %39) - %41 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %19, i32 0, i32 2 - %42 = load ptr, ptr %41, align 8 - %43 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.MapLen"(ptr %42) - %44 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %19, i32 0, i32 3 - %45 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %44, align 8 - %46 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %45, 1 - %47 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %19, i32 0, i32 1 - %48 = load ptr, ptr %47, align 8 - %49 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.ChanCap"(ptr %48) - %50 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %19, i32 0, i32 3 - %51 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %50, align 8 - %52 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %51, 2 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %37) + %31 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 56) + %32 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %32) + %33 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %31, i32 0, i32 0 + %34 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %34) + %35 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %31, i32 0, i32 1 + %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewChan"(i64 8, i64 2) + %37 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %37) + %38 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %31, i32 0, i32 2 + %39 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_string", i64 1) + %40 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 1, ptr %40, align 4 + %41 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_string", ptr %39, ptr %40) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 5 }, ptr %41, align 8 + %42 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %42) + %43 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %31, i32 0, i32 3 + %44 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) + %45 = icmp eq ptr %44, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %45) + %46 = getelementptr inbounds i64, ptr %44, i64 0 + store i64 1, ptr %46, align 4 + %47 = icmp eq ptr %44, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %47) + %48 = getelementptr inbounds i64, ptr %44, i64 1 + store i64 2, ptr %48, align 4 + %49 = icmp eq ptr %44, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %49) + %50 = getelementptr inbounds i64, ptr %44, i64 2 + store i64 3, ptr %50, align 4 + %51 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %44, 0 + %52 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %51, i64 3, 1 + %53 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %52, i64 3, 2 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 5 }, ptr %33, align 8 + store ptr %36, ptr %35, align 8 + store ptr %39, ptr %38, align 8 + store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %53, ptr %43, align 8 + %54 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %54) + %55 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %31, i32 0, i32 0 + %56 = icmp eq ptr %55, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %56) + %57 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %55, align 8 + %58 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %57, 1 + %59 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %59) + %60 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %31, i32 0, i32 1 + %61 = icmp eq ptr %60, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %61) + %62 = load ptr, ptr %60, align 8 + %63 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.ChanLen"(ptr %62) + %64 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %64) + %65 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %31, i32 0, i32 2 + %66 = icmp eq ptr %65, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %66) + %67 = load ptr, ptr %65, align 8 + %68 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.MapLen"(ptr %67) + %69 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %69) + %70 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %31, i32 0, i32 3 + %71 = icmp eq ptr %70, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %71) + %72 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %70, align 8 + %73 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %72, 1 + %74 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %74) + %75 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %31, i32 0, i32 1 + %76 = icmp eq ptr %75, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %76) + %77 = load ptr, ptr %75, align 8 + %78 = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.ChanCap"(ptr %77) + %79 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %79) + %80 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/len.data", ptr %31, i32 0, i32 3 + %81 = icmp eq ptr %80, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %81) + %82 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %80, align 8 + %83 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %82, 2 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %58) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %40) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %63) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %43) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %68) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %46) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %73) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %49) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %78) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %52) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %83) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i64 @"github.com/goplus/llgo/runtime/internal/runtime.ChanLen"(ptr) declare i64 @"github.com/goplus/llgo/runtime/internal/runtime.MapLen"(ptr) diff --git a/cl/_testrt/linkname/out.ll b/cl/_testrt/linkname/out.ll index 159a0a4a3a..a95a74d24f 100644 --- a/cl/_testrt/linkname/out.ll +++ b/cl/_testrt/linkname/out.ll @@ -37,9 +37,11 @@ _llgo_0: call void @"github.com/goplus/llgo/cl/_testrt/linkname/linktarget.F"(ptr @4, ptr @5, ptr @6, ptr @7) %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) call void @"github.com/goplus/llgo/cl/_testrt/linkname/linktarget.(*m).setInfo"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 5 }) - %1 = load %"github.com/goplus/llgo/cl/_testrt/linkname.m", ptr %0, align 8 - %2 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testrt/linkname/linktarget.m.info"(%"github.com/goplus/llgo/cl/_testrt/linkname.m" %1) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %2) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testrt/linkname.m", ptr %0, align 8 + %3 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testrt/linkname/linktarget.m.info"(%"github.com/goplus/llgo/cl/_testrt/linkname.m" %2) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %3) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -52,6 +54,8 @@ declare void @"github.com/goplus/llgo/cl/_testrt/linkname/linktarget.init"() declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String") declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) diff --git a/cl/_testrt/makemap/out.ll b/cl/_testrt/makemap/out.ll index 0478ede4eb..c118d2d22b 100644 --- a/cl/_testrt/makemap/out.ll +++ b/cl/_testrt/makemap/out.ll @@ -21,7 +21,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/makemap" @"map[_llgo_int]_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.MapType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -2084636366, i8 0, i8 8, i8 8, i8 53, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 14 }, ptr @"*map[_llgo_int]_llgo_string" }, ptr @_llgo_int, ptr @_llgo_string, ptr @"_llgo_struct$-d5W1oQEguzs9p8l76MbO7RbmjtJYi8DH1vVvnKnZqQ", { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.typehash", ptr @_llgo_int }, i8 8, i8 16, i16 208, i32 4 }, align 8 @0 = private unnamed_addr constant [14 x i8] c"map[int]string", align 1 @"*map[_llgo_int]_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 668541983, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 14 }, ptr null }, ptr @"map[_llgo_int]_llgo_string" }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr @"*_llgo_int" }, align 8 @1 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @_llgo_string = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 8, i32 1749264893, i8 4, i8 8, i8 8, i8 24, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.strequal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 6 }, ptr @"*_llgo_string" }, align 8 @@ -34,7 +34,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/makemap" @"[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 307038632, i8 8, i8 1, i8 1, i8 17, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"[8]_llgo_uint8" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 8 }, ptr @"*[8]_llgo_uint8" }, ptr @_llgo_uint8, ptr @"[]_llgo_uint8", i64 8 }, align 8 @5 = private unnamed_addr constant [8 x i8] c"[8]uint8", align 1 @"*[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -566230779, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 8 }, ptr null }, ptr @"[8]_llgo_uint8" }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @6 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @"[]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 370346748, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 7 }, ptr @"*[]_llgo_uint8" }, ptr @_llgo_uint8 }, align 8 @@ -90,7 +90,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/makemap" @30 = private unnamed_addr constant [14 x i8] c"[]interface {}", align 1 @"*[]_llgo_any" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1171476965, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @30, i64 14 }, ptr null }, ptr @"[]_llgo_any" }, align 8 @"_llgo_struct$9fzK8iv9NREHM30G-Ea6p38YjudCiRiAagptdq1kJbs$fields" = weak_odr constant [4 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }, ptr @"[8]_llgo_uint8", i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 4 }, ptr @"[8]_llgo_any", i64 8, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 5 }, ptr @"[8]_llgo_int", i64 136, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 8 }, ptr @_llgo_Pointer, i64 200, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 -@"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.ArrayType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1575369363, i8 13, i8 8, i8 8, i8 49, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @31, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1" }, ptr @_llgo_int, ptr @"[]_llgo_int", i64 1 }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @27, i64 41 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.ArrayType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1575369363, i8 13, i8 8, i8 8, i8 17, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @31, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1" }, ptr @_llgo_int, ptr @"[]_llgo_int", i64 1 }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @27, i64 41 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @31 = private unnamed_addr constant [7 x i8] c"main.N1", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 180030794, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @31, i64 7 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1" }, align 8 @32 = private unnamed_addr constant [81 x i8] c"type assertion interface{} -> github.com/goplus/llgo/cl/_testrt/makemap.N1 failed", align 1 @@ -101,7 +101,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/makemap" @34 = private unnamed_addr constant [6 x i8] c"main.N", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 274039324, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @34, i64 6 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N" }, align 8 @35 = private unnamed_addr constant [2 x i8] c"n1", align 1 -@_llgo_int8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 1444672578, i8 12, i8 1, i8 1, i8 35, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @36, i64 4 }, ptr @"*_llgo_int8" }, align 8 +@_llgo_int8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 1444672578, i8 12, i8 1, i8 1, i8 3, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @36, i64 4 }, ptr @"*_llgo_int8" }, align 8 @36 = private unnamed_addr constant [4 x i8] c"int8", align 1 @"*_llgo_int8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1399554408, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @36, i64 4 }, ptr null }, ptr @_llgo_int8 }, align 8 @37 = private unnamed_addr constant [2 x i8] c"n2", align 1 @@ -139,7 +139,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/makemap" @"map[_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N.7.0]_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.MapType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1422302973, i8 0, i8 8, i8 8, i8 53, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @49, i64 17 }, ptr @"*map[_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N.7.0]_llgo_string" }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N.7.0", ptr @_llgo_string, ptr @"_llgo_struct$tJooAKjBfWFVdIN3UQAErvHaJ-wlhiEZpoJy2GckluU", { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.typehash", ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N.7.0" }, i8 8, i8 16, i16 208, i32 4 }, align 8 @49 = private unnamed_addr constant [17 x i8] c"map[main.N]string", align 1 @"*map[_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N.7.0]_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -216263446, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @49, i64 17 }, ptr null }, ptr @"map[_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N.7.0]_llgo_string" }, align 8 -@"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N.7.0" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -531504893, i8 13, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @34, i64 6 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N.7.0" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @27, i64 41 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N.7.0" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -531504893, i8 13, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @34, i64 6 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N.7.0" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @27, i64 41 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @"*_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N.7.0" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1451283354, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @34, i64 6 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N.7.0" }, align 8 @"_llgo_struct$tJooAKjBfWFVdIN3UQAErvHaJ-wlhiEZpoJy2GckluU" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 208, i64 208, i32 -1223537830, i8 0, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_struct$tJooAKjBfWFVdIN3UQAErvHaJ-wlhiEZpoJy2GckluU" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @50, i64 85 }, ptr @"*_llgo_struct$tJooAKjBfWFVdIN3UQAErvHaJ-wlhiEZpoJy2GckluU" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_struct$tJooAKjBfWFVdIN3UQAErvHaJ-wlhiEZpoJy2GckluU$fields", i64 4, i64 4 } }, align 8 @50 = private unnamed_addr constant [85 x i8] c"struct { topbits [8]uint8; keys [8]main.N; elems [8]string; overflow unsafe.Pointer }", align 1 @@ -378,101 +378,130 @@ _llgo_0: %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_any]_llgo_int", i64 0) %6 = alloca [1 x i64], align 8 call void @llvm.memset(ptr %6, i8 0, i64 8, i1 false) - %7 = getelementptr inbounds i64, ptr %6, i64 0 - store i64 1, ptr %7, align 4 - %8 = load [1 x i64], ptr %6, align 4 - %9 = extractvalue [1 x i64] %8, 0 - %10 = inttoptr i64 %9 to ptr - %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1", ptr undef }, ptr %10, 1 - %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %11, ptr %12, align 8 - %13 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %5, ptr %12) - store i64 100, ptr %13, align 4 - %14 = alloca [1 x i64], align 8 - call void @llvm.memset(ptr %14, i8 0, i64 8, i1 false) - %15 = getelementptr inbounds i64, ptr %14, i64 0 - store i64 2, ptr %15, align 4 - %16 = load [1 x i64], ptr %14, align 4 - %17 = extractvalue [1 x i64] %16, 0 - %18 = inttoptr i64 %17 to ptr - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1", ptr undef }, ptr %18, 1 - %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %19, ptr %20, align 8 - %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %5, ptr %20) - store i64 200, ptr %21, align 4 - %22 = alloca [1 x i64], align 8 - call void @llvm.memset(ptr %22, i8 0, i64 8, i1 false) - %23 = getelementptr inbounds i64, ptr %22, i64 0 - store i64 3, ptr %23, align 4 - %24 = load [1 x i64], ptr %22, align 4 - %25 = extractvalue [1 x i64] %24, 0 - %26 = inttoptr i64 %25 to ptr - %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1", ptr undef }, ptr %26, 1 - %28 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %27, ptr %28, align 8 - %29 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %5, ptr %28) - store i64 300, ptr %29, align 4 - %30 = alloca [1 x i64], align 8 - call void @llvm.memset(ptr %30, i8 0, i64 8, i1 false) - %31 = getelementptr inbounds i64, ptr %30, i64 0 - store i64 2, ptr %31, align 4 - %32 = load [1 x i64], ptr %30, align 4 - %33 = extractvalue [1 x i64] %32, 0 - %34 = inttoptr i64 %33 to ptr - %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1", ptr undef }, ptr %34, 1 - %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %35, ptr %36, align 8 - %37 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %5, ptr %36) - store i64 -200, ptr %37, align 4 - %38 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_any]_llgo_int", ptr %5) + %7 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds i64, ptr %6, i64 0 + store i64 1, ptr %8, align 4 + %9 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = load [1 x i64], ptr %6, align 4 + %11 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1", ptr %12, ptr %6) + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1", ptr undef }, ptr %12, 1 + %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %13, ptr %14, align 8 + %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %5, ptr %14) + store i64 100, ptr %15, align 4 + %16 = alloca [1 x i64], align 8 + call void @llvm.memset(ptr %16, i8 0, i64 8, i1 false) + %17 = icmp eq ptr %16, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %17) + %18 = getelementptr inbounds i64, ptr %16, i64 0 + store i64 2, ptr %18, align 4 + %19 = icmp eq ptr %16, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %19) + %20 = load [1 x i64], ptr %16, align 4 + %21 = icmp eq ptr %16, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %21) + %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1", ptr %22, ptr %16) + %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1", ptr undef }, ptr %22, 1 + %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %23, ptr %24, align 8 + %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %5, ptr %24) + store i64 200, ptr %25, align 4 + %26 = alloca [1 x i64], align 8 + call void @llvm.memset(ptr %26, i8 0, i64 8, i1 false) + %27 = icmp eq ptr %26, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %27) + %28 = getelementptr inbounds i64, ptr %26, i64 0 + store i64 3, ptr %28, align 4 + %29 = icmp eq ptr %26, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %29) + %30 = load [1 x i64], ptr %26, align 4 + %31 = icmp eq ptr %26, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %31) + %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1", ptr %32, ptr %26) + %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1", ptr undef }, ptr %32, 1 + %34 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %33, ptr %34, align 8 + %35 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %5, ptr %34) + store i64 300, ptr %35, align 4 + %36 = alloca [1 x i64], align 8 + call void @llvm.memset(ptr %36, i8 0, i64 8, i1 false) + %37 = icmp eq ptr %36, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %37) + %38 = getelementptr inbounds i64, ptr %36, i64 0 + store i64 2, ptr %38, align 4 + %39 = icmp eq ptr %36, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %39) + %40 = load [1 x i64], ptr %36, align 4 + %41 = icmp eq ptr %36, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %41) + %42 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1", ptr %42, ptr %36) + %43 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1", ptr undef }, ptr %42, 1 + %44 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %43, ptr %44, align 8 + %45 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %5, ptr %44) + store i64 -200, ptr %45, align 4 + %46 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_any]_llgo_int", ptr %5) br label %_llgo_1 _llgo_1: ; preds = %_llgo_7, %_llgo_0 - %39 = call { i1, ptr, ptr } @"github.com/goplus/llgo/runtime/internal/runtime.MapIterNext"(ptr %38) - %40 = extractvalue { i1, ptr, ptr } %39, 0 - br i1 %40, label %_llgo_4, label %_llgo_5 + %47 = call { i1, ptr, ptr } @"github.com/goplus/llgo/runtime/internal/runtime.MapIterNext"(ptr %46) + %48 = extractvalue { i1, ptr, ptr } %47, 0 + br i1 %48, label %_llgo_4, label %_llgo_5 _llgo_2: ; preds = %_llgo_6 - %41 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %51, 1 - %42 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %51, 2 - %43 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %41, 0 - %44 = icmp eq ptr %43, @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1" - br i1 %44, label %_llgo_7, label %_llgo_8 + %49 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %59, 1 + %50 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %59, 2 + %51 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %49, 0 + %52 = icmp eq ptr %51, @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.N1" + br i1 %52, label %_llgo_7, label %_llgo_8 _llgo_3: ; preds = %_llgo_6 ret void _llgo_4: ; preds = %_llgo_1 - %45 = extractvalue { i1, ptr, ptr } %39, 1 - %46 = extractvalue { i1, ptr, ptr } %39, 2 - %47 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %45, align 8 - %48 = load i64, ptr %46, align 4 - %49 = insertvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } { i1 true, %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, i64 undef }, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %47, 1 - %50 = insertvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %49, i64 %48, 2 + %53 = extractvalue { i1, ptr, ptr } %47, 1 + %54 = extractvalue { i1, ptr, ptr } %47, 2 + %55 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %53, align 8 + %56 = load i64, ptr %54, align 4 + %57 = insertvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } { i1 true, %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, i64 undef }, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %55, 1 + %58 = insertvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %57, i64 %56, 2 br label %_llgo_6 _llgo_5: ; preds = %_llgo_1 br label %_llgo_6 _llgo_6: ; preds = %_llgo_5, %_llgo_4 - %51 = phi { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } [ %50, %_llgo_4 ], [ zeroinitializer, %_llgo_5 ] - %52 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %51, 0 - br i1 %52, label %_llgo_2, label %_llgo_3 + %59 = phi { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } [ %58, %_llgo_4 ], [ zeroinitializer, %_llgo_5 ] + %60 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %59, 0 + br i1 %60, label %_llgo_2, label %_llgo_3 _llgo_7: ; preds = %_llgo_2 - %53 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %41, 1 - %54 = ptrtoint ptr %53 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %54) + %61 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %49, 1 + %62 = load [1 x i64], ptr %61, align 4 + %63 = alloca [1 x i64], align 8 + call void @llvm.memset(ptr %63, i8 0, i64 8, i1 false) + store [1 x i64] %62, ptr %63, align 4 + %64 = getelementptr inbounds i64, ptr %63, i64 0 + %65 = load i64, ptr %64, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %65) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %42) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %50) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) br label %_llgo_1 _llgo_8: ; preds = %_llgo_2 - %55 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @32, i64 81 }, ptr %55, align 8 - %56 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %55, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %56) + %66 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @32, i64 81 }, ptr %66, align 8 + %67 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %66, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %67) unreachable } @@ -480,116 +509,156 @@ define void @"github.com/goplus/llgo/cl/_testrt/makemap.make3"() { _llgo_0: %0 = alloca [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], align 8 call void @llvm.memset(ptr %0, i8 0, i64 2, i1 false) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %0, i64 0 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %1, i32 0, i32 0 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %1, i32 0, i32 1 - store i8 1, ptr %2, align 1 - store i8 2, ptr %3, align 1 - %4 = load [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], ptr %0, align 1 - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 2) - store [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"] %4, ptr %5, align 1 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K", ptr undef }, ptr %5, 1 - %7 = alloca [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], align 8 - call void @llvm.memset(ptr %7, i8 0, i64 2, i1 false) - %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %7, i64 0 - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %8, i32 0, i32 0 - %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %8, i32 0, i32 1 - store i8 1, ptr %9, align 1 - store i8 2, ptr %10, align 1 - %11 = load [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], ptr %7, align 1 - %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 2) - store [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"] %11, ptr %12, align 1 - %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K", ptr undef }, ptr %12, 1 - %14 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %6, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %13) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %14) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %0, i64 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %2, i32 0, i32 0 + %5 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %2, i32 0, i32 1 + store i8 1, ptr %4, align 1 + store i8 2, ptr %6, align 1 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = load [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], ptr %0, align 1 + %9 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 2) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K", ptr %10, ptr %0) + %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K", ptr undef }, ptr %10, 1 + %12 = alloca [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], align 8 + call void @llvm.memset(ptr %12, i8 0, i64 2, i1 false) + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %12, i64 0 + %15 = icmp eq ptr %14, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %14, i32 0, i32 0 + %17 = icmp eq ptr %14, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %17) + %18 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %14, i32 0, i32 1 + store i8 1, ptr %16, align 1 + store i8 2, ptr %18, align 1 + %19 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %19) + %20 = load [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], ptr %12, align 1 + %21 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %21) + %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 2) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K", ptr %22, ptr %12) + %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K", ptr undef }, ptr %22, 1 + %24 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %11, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %23) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %24) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_any]_llgo_int", i64 0) - %16 = alloca [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], align 8 - call void @llvm.memset(ptr %16, i8 0, i64 2, i1 false) - %17 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %16, i64 0 - %18 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %17, i32 0, i32 0 - %19 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %17, i32 0, i32 1 - store i8 1, ptr %18, align 1 - store i8 2, ptr %19, align 1 - %20 = load [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], ptr %16, align 1 - %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 2) - store [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"] %20, ptr %21, align 1 - %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K", ptr undef }, ptr %21, 1 - %23 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %22, ptr %23, align 8 - %24 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %15, ptr %23) - store i64 100, ptr %24, align 4 - %25 = alloca [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], align 8 - call void @llvm.memset(ptr %25, i8 0, i64 2, i1 false) - %26 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %25, i64 0 - %27 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %26, i32 0, i32 0 - %28 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %26, i32 0, i32 1 - store i8 3, ptr %27, align 1 - store i8 4, ptr %28, align 1 - %29 = load [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], ptr %25, align 1 - %30 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 2) - store [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"] %29, ptr %30, align 1 - %31 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K", ptr undef }, ptr %30, 1 - %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %31, ptr %32, align 8 - %33 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %15, ptr %32) - store i64 200, ptr %33, align 4 - %34 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_any]_llgo_int", ptr %15) + %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_any]_llgo_int", i64 0) + %26 = alloca [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], align 8 + call void @llvm.memset(ptr %26, i8 0, i64 2, i1 false) + %27 = icmp eq ptr %26, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %27) + %28 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %26, i64 0 + %29 = icmp eq ptr %28, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %29) + %30 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %28, i32 0, i32 0 + %31 = icmp eq ptr %28, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %31) + %32 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %28, i32 0, i32 1 + store i8 1, ptr %30, align 1 + store i8 2, ptr %32, align 1 + %33 = icmp eq ptr %26, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %33) + %34 = load [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], ptr %26, align 1 + %35 = icmp eq ptr %26, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %35) + %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 2) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K", ptr %36, ptr %26) + %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K", ptr undef }, ptr %36, 1 + %38 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %37, ptr %38, align 8 + %39 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %25, ptr %38) + store i64 100, ptr %39, align 4 + %40 = alloca [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], align 8 + call void @llvm.memset(ptr %40, i8 0, i64 2, i1 false) + %41 = icmp eq ptr %40, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %41) + %42 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %40, i64 0 + %43 = icmp eq ptr %42, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %43) + %44 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %42, i32 0, i32 0 + %45 = icmp eq ptr %42, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %45) + %46 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %42, i32 0, i32 1 + store i8 3, ptr %44, align 1 + store i8 4, ptr %46, align 1 + %47 = icmp eq ptr %40, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %47) + %48 = load [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], ptr %40, align 1 + %49 = icmp eq ptr %40, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %49) + %50 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 2) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K", ptr %50, ptr %40) + %51 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K", ptr undef }, ptr %50, 1 + %52 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %51, ptr %52, align 8 + %53 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %25, ptr %52) + store i64 200, ptr %53, align 4 + %54 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_any]_llgo_int", ptr %25) br label %_llgo_1 _llgo_1: ; preds = %_llgo_7, %_llgo_0 - %35 = call { i1, ptr, ptr } @"github.com/goplus/llgo/runtime/internal/runtime.MapIterNext"(ptr %34) - %36 = extractvalue { i1, ptr, ptr } %35, 0 - br i1 %36, label %_llgo_4, label %_llgo_5 + %55 = call { i1, ptr, ptr } @"github.com/goplus/llgo/runtime/internal/runtime.MapIterNext"(ptr %54) + %56 = extractvalue { i1, ptr, ptr } %55, 0 + br i1 %56, label %_llgo_4, label %_llgo_5 _llgo_2: ; preds = %_llgo_6 - %37 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %47, 1 - %38 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %47, 2 - %39 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %37, 0 - %40 = icmp eq ptr %39, @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K" - br i1 %40, label %_llgo_7, label %_llgo_8 + %57 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %67, 1 + %58 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %67, 2 + %59 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %57, 0 + %60 = icmp eq ptr %59, @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K" + br i1 %60, label %_llgo_7, label %_llgo_8 _llgo_3: ; preds = %_llgo_6 ret void _llgo_4: ; preds = %_llgo_1 - %41 = extractvalue { i1, ptr, ptr } %35, 1 - %42 = extractvalue { i1, ptr, ptr } %35, 2 - %43 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %41, align 8 - %44 = load i64, ptr %42, align 4 - %45 = insertvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } { i1 true, %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, i64 undef }, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %43, 1 - %46 = insertvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %45, i64 %44, 2 + %61 = extractvalue { i1, ptr, ptr } %55, 1 + %62 = extractvalue { i1, ptr, ptr } %55, 2 + %63 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %61, align 8 + %64 = load i64, ptr %62, align 4 + %65 = insertvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } { i1 true, %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, i64 undef }, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %63, 1 + %66 = insertvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %65, i64 %64, 2 br label %_llgo_6 _llgo_5: ; preds = %_llgo_1 br label %_llgo_6 _llgo_6: ; preds = %_llgo_5, %_llgo_4 - %47 = phi { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } [ %46, %_llgo_4 ], [ zeroinitializer, %_llgo_5 ] - %48 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %47, 0 - br i1 %48, label %_llgo_2, label %_llgo_3 + %67 = phi { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } [ %66, %_llgo_4 ], [ zeroinitializer, %_llgo_5 ] + %68 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %67, 0 + br i1 %68, label %_llgo_2, label %_llgo_3 _llgo_7: ; preds = %_llgo_2 - %49 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %37, 1 - %50 = load [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], ptr %49, align 1 - %51 = alloca [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], align 8 - call void @llvm.memset(ptr %51, i8 0, i64 2, i1 false) - store [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"] %50, ptr %51, align 1 - %52 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %51, i64 0 - %53 = load %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %52, align 1 - %54 = extractvalue %"github.com/goplus/llgo/cl/_testrt/makemap.N" %53, 0 - %55 = sext i8 %54 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %55) + %69 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %57, 1 + %70 = load [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], ptr %69, align 1 + %71 = alloca [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"], align 8 + call void @llvm.memset(ptr %71, i8 0, i64 2, i1 false) + store [1 x %"github.com/goplus/llgo/cl/_testrt/makemap.N"] %70, ptr %71, align 1 + %72 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %71, i64 0 + %73 = load %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %72, align 1 + %74 = extractvalue %"github.com/goplus/llgo/cl/_testrt/makemap.N" %73, 0 + %75 = sext i8 %74 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %75) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %38) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %58) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) br label %_llgo_1 _llgo_8: ; preds = %_llgo_2 - %56 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @39, i64 80 }, ptr %56, align 8 - %57 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %56, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %57) + %76 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @39, i64 80 }, ptr %76, align 8 + %77 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %76, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %77) unreachable } @@ -597,115 +666,163 @@ define void @"github.com/goplus/llgo/cl/_testrt/makemap.make4"() { _llgo_0: %0 = alloca [1 x ptr], align 8 call void @llvm.memset(ptr %0, i8 0, i64 8, i1 false) - %1 = getelementptr inbounds ptr, ptr %0, i64 0 - %2 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 2) - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %2, i32 0, i32 0 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %2, i32 0, i32 1 - store i8 1, ptr %3, align 1 - store i8 2, ptr %4, align 1 - store ptr %2, ptr %1, align 8 - %5 = load [1 x ptr], ptr %0, align 8 - %6 = extractvalue [1 x ptr] %5, 0 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K2", ptr undef }, ptr %6, 1 - %8 = alloca [1 x ptr], align 8 - call void @llvm.memset(ptr %8, i8 0, i64 8, i1 false) - %9 = getelementptr inbounds ptr, ptr %8, i64 0 - %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 2) - %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %10, i32 0, i32 0 - %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %10, i32 0, i32 1 - store i8 1, ptr %11, align 1 - store i8 2, ptr %12, align 1 - store ptr %10, ptr %9, align 8 - %13 = load [1 x ptr], ptr %8, align 8 - %14 = extractvalue [1 x ptr] %13, 0 - %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K2", ptr undef }, ptr %14, 1 - %16 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %7, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %15) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %16) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds ptr, ptr %0, i64 0 + %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 2) + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %3, i32 0, i32 0 + %6 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %3, i32 0, i32 1 + store i8 1, ptr %5, align 1 + store i8 2, ptr %7, align 1 + store ptr %3, ptr %2, align 8 + %8 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load [1 x ptr], ptr %0, align 8 + %10 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = load [1 x ptr], ptr %0, align 8 + %12 = extractvalue [1 x ptr] %11, 0 + %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K2", ptr undef }, ptr %12, 1 + %14 = alloca [1 x ptr], align 8 + call void @llvm.memset(ptr %14, i8 0, i64 8, i1 false) + %15 = icmp eq ptr %14, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = getelementptr inbounds ptr, ptr %14, i64 0 + %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 2) + %18 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %17, i32 0, i32 0 + %20 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %17, i32 0, i32 1 + store i8 1, ptr %19, align 1 + store i8 2, ptr %21, align 1 + store ptr %17, ptr %16, align 8 + %22 = icmp eq ptr %14, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %22) + %23 = load [1 x ptr], ptr %14, align 8 + %24 = icmp eq ptr %14, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %24) + %25 = load [1 x ptr], ptr %14, align 8 + %26 = extractvalue [1 x ptr] %25, 0 + %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K2", ptr undef }, ptr %26, 1 + %28 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %13, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %27) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %28) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_any]_llgo_int", i64 0) - %18 = alloca [1 x ptr], align 8 - call void @llvm.memset(ptr %18, i8 0, i64 8, i1 false) - %19 = getelementptr inbounds ptr, ptr %18, i64 0 - %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 2) - %21 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %20, i32 0, i32 0 - %22 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %20, i32 0, i32 1 - store i8 1, ptr %21, align 1 - store i8 2, ptr %22, align 1 - store ptr %20, ptr %19, align 8 - %23 = load [1 x ptr], ptr %18, align 8 - %24 = extractvalue [1 x ptr] %23, 0 - %25 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K2", ptr undef }, ptr %24, 1 - %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %25, ptr %26, align 8 - %27 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %17, ptr %26) - store i64 100, ptr %27, align 4 - %28 = alloca [1 x ptr], align 8 - call void @llvm.memset(ptr %28, i8 0, i64 8, i1 false) - %29 = getelementptr inbounds ptr, ptr %28, i64 0 - %30 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 2) - %31 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %30, i32 0, i32 0 - %32 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %30, i32 0, i32 1 - store i8 3, ptr %31, align 1 - store i8 4, ptr %32, align 1 - store ptr %30, ptr %29, align 8 - %33 = load [1 x ptr], ptr %28, align 8 - %34 = extractvalue [1 x ptr] %33, 0 - %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K2", ptr undef }, ptr %34, 1 - %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %35, ptr %36, align 8 - %37 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %17, ptr %36) - store i64 200, ptr %37, align 4 - %38 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_any]_llgo_int", ptr %17) + %29 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_any]_llgo_int", i64 0) + %30 = alloca [1 x ptr], align 8 + call void @llvm.memset(ptr %30, i8 0, i64 8, i1 false) + %31 = icmp eq ptr %30, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %31) + %32 = getelementptr inbounds ptr, ptr %30, i64 0 + %33 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 2) + %34 = icmp eq ptr %33, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %34) + %35 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %33, i32 0, i32 0 + %36 = icmp eq ptr %33, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %36) + %37 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %33, i32 0, i32 1 + store i8 1, ptr %35, align 1 + store i8 2, ptr %37, align 1 + store ptr %33, ptr %32, align 8 + %38 = icmp eq ptr %30, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %38) + %39 = load [1 x ptr], ptr %30, align 8 + %40 = icmp eq ptr %30, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %40) + %41 = load [1 x ptr], ptr %30, align 8 + %42 = extractvalue [1 x ptr] %41, 0 + %43 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K2", ptr undef }, ptr %42, 1 + %44 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %43, ptr %44, align 8 + %45 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %29, ptr %44) + store i64 100, ptr %45, align 4 + %46 = alloca [1 x ptr], align 8 + call void @llvm.memset(ptr %46, i8 0, i64 8, i1 false) + %47 = icmp eq ptr %46, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %47) + %48 = getelementptr inbounds ptr, ptr %46, i64 0 + %49 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 2) + %50 = icmp eq ptr %49, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %50) + %51 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %49, i32 0, i32 0 + %52 = icmp eq ptr %49, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %52) + %53 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %49, i32 0, i32 1 + store i8 3, ptr %51, align 1 + store i8 4, ptr %53, align 1 + store ptr %49, ptr %48, align 8 + %54 = icmp eq ptr %46, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %54) + %55 = load [1 x ptr], ptr %46, align 8 + %56 = icmp eq ptr %46, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %56) + %57 = load [1 x ptr], ptr %46, align 8 + %58 = extractvalue [1 x ptr] %57, 0 + %59 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K2", ptr undef }, ptr %58, 1 + %60 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %59, ptr %60, align 8 + %61 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %29, ptr %60) + store i64 200, ptr %61, align 4 + %62 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_any]_llgo_int", ptr %29) br label %_llgo_1 _llgo_1: ; preds = %_llgo_7, %_llgo_0 - %39 = call { i1, ptr, ptr } @"github.com/goplus/llgo/runtime/internal/runtime.MapIterNext"(ptr %38) - %40 = extractvalue { i1, ptr, ptr } %39, 0 - br i1 %40, label %_llgo_4, label %_llgo_5 + %63 = call { i1, ptr, ptr } @"github.com/goplus/llgo/runtime/internal/runtime.MapIterNext"(ptr %62) + %64 = extractvalue { i1, ptr, ptr } %63, 0 + br i1 %64, label %_llgo_4, label %_llgo_5 _llgo_2: ; preds = %_llgo_6 - %41 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %51, 1 - %42 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %51, 2 - %43 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %41, 0 - %44 = icmp eq ptr %43, @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K2" - br i1 %44, label %_llgo_7, label %_llgo_8 + %65 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %75, 1 + %66 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %75, 2 + %67 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %65, 0 + %68 = icmp eq ptr %67, @"_llgo_github.com/goplus/llgo/cl/_testrt/makemap.K2" + br i1 %68, label %_llgo_7, label %_llgo_8 _llgo_3: ; preds = %_llgo_6 ret void _llgo_4: ; preds = %_llgo_1 - %45 = extractvalue { i1, ptr, ptr } %39, 1 - %46 = extractvalue { i1, ptr, ptr } %39, 2 - %47 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %45, align 8 - %48 = load i64, ptr %46, align 4 - %49 = insertvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } { i1 true, %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, i64 undef }, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %47, 1 - %50 = insertvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %49, i64 %48, 2 + %69 = extractvalue { i1, ptr, ptr } %63, 1 + %70 = extractvalue { i1, ptr, ptr } %63, 2 + %71 = load %"github.com/goplus/llgo/runtime/internal/runtime.eface", ptr %69, align 8 + %72 = load i64, ptr %70, align 4 + %73 = insertvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } { i1 true, %"github.com/goplus/llgo/runtime/internal/runtime.eface" undef, i64 undef }, %"github.com/goplus/llgo/runtime/internal/runtime.eface" %71, 1 + %74 = insertvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %73, i64 %72, 2 br label %_llgo_6 _llgo_5: ; preds = %_llgo_1 br label %_llgo_6 _llgo_6: ; preds = %_llgo_5, %_llgo_4 - %51 = phi { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } [ %50, %_llgo_4 ], [ zeroinitializer, %_llgo_5 ] - %52 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %51, 0 - br i1 %52, label %_llgo_2, label %_llgo_3 + %75 = phi { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } [ %74, %_llgo_4 ], [ zeroinitializer, %_llgo_5 ] + %76 = extractvalue { i1, %"github.com/goplus/llgo/runtime/internal/runtime.eface", i64 } %75, 0 + br i1 %76, label %_llgo_2, label %_llgo_3 _llgo_7: ; preds = %_llgo_2 - %53 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %41, 1 - %54 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %53, i32 0, i32 0 - %55 = load i8, ptr %54, align 1 - %56 = sext i8 %55 to i64 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %56) + %77 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %65, 1 + %78 = icmp eq ptr %77, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %78) + %79 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/makemap.N", ptr %77, i32 0, i32 0 + %80 = icmp eq ptr %79, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %80) + %81 = load i8, ptr %79, align 1 + %82 = sext i8 %81 to i64 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %82) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %42) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %66) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) br label %_llgo_1 _llgo_8: ; preds = %_llgo_2 - %57 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 81 }, ptr %57, align 8 - %58 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %57, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %58) + %83 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @42, i64 81 }, ptr %83, align 8 + %84 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %83, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %84) unreachable } @@ -943,6 +1060,10 @@ _llgo_0: ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + +declare void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr, ptr, ptr) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.eface", %"github.com/goplus/llgo/runtime/internal/runtime.eface") declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) diff --git a/cl/_testrt/map/out.ll b/cl/_testrt/map/out.ll index 8a368d54e3..a21b9fdf00 100644 --- a/cl/_testrt/map/out.ll +++ b/cl/_testrt/map/out.ll @@ -15,7 +15,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/map" @"map[_llgo_int]_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.MapType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1234063919, i8 0, i8 8, i8 8, i8 53, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 11 }, ptr @"*map[_llgo_int]_llgo_int" }, ptr @_llgo_int, ptr @_llgo_int, ptr @"_llgo_struct$RSTTp_pTKglBmcdy0CMmgLp9HSGRvgD8UwNIoMFFyOg", { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.typehash", ptr @_llgo_int }, i8 8, i8 8, i16 144, i32 4 }, align 8 @0 = private unnamed_addr constant [11 x i8] c"map[int]int", align 1 @"*map[_llgo_int]_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -2028436283, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 11 }, ptr null }, ptr @"map[_llgo_int]_llgo_int" }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr @"*_llgo_int" }, align 8 @1 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"_llgo_struct$RSTTp_pTKglBmcdy0CMmgLp9HSGRvgD8UwNIoMFFyOg" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 144, i64 0, i32 991986166, i8 8, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_struct$RSTTp_pTKglBmcdy0CMmgLp9HSGRvgD8UwNIoMFFyOg" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 72 }, ptr @"*_llgo_struct$RSTTp_pTKglBmcdy0CMmgLp9HSGRvgD8UwNIoMFFyOg" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_struct$RSTTp_pTKglBmcdy0CMmgLp9HSGRvgD8UwNIoMFFyOg$fields", i64 4, i64 4 } }, align 8 @@ -25,7 +25,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/map" @"[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 307038632, i8 8, i8 1, i8 1, i8 17, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"[8]_llgo_uint8" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 8 }, ptr @"*[8]_llgo_uint8" }, ptr @_llgo_uint8, ptr @"[]_llgo_uint8", i64 8 }, align 8 @4 = private unnamed_addr constant [8 x i8] c"[8]uint8", align 1 @"*[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -566230779, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 8 }, ptr null }, ptr @"[8]_llgo_uint8" }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @5 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @"[]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 370346748, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 7 }, ptr @"*[]_llgo_uint8" }, ptr @_llgo_uint8 }, align 8 @@ -40,7 +40,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/map" @"*[]_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1428175521, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 5 }, ptr null }, ptr @"[]_llgo_int" }, align 8 @10 = private unnamed_addr constant [5 x i8] c"elems", align 1 @11 = private unnamed_addr constant [8 x i8] c"overflow", align 1 -@_llgo_uintptr = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1268343028, i8 12, i8 8, i8 8, i8 44, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 7 }, ptr @"*_llgo_uintptr" }, align 8 +@_llgo_uintptr = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1268343028, i8 12, i8 8, i8 8, i8 12, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 7 }, ptr @"*_llgo_uintptr" }, align 8 @12 = private unnamed_addr constant [7 x i8] c"uintptr", align 1 @"*_llgo_uintptr" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1684891952, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 7 }, ptr null }, ptr @_llgo_uintptr }, align 8 @"_llgo_struct$RSTTp_pTKglBmcdy0CMmgLp9HSGRvgD8UwNIoMFFyOg$fields" = weak_odr constant [4 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 7 }, ptr @"[8]_llgo_uint8", i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 4 }, ptr @"[8]_llgo_int", i64 8, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 5 }, ptr @"[8]_llgo_int", i64 72, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 8 }, ptr @_llgo_uintptr, i64 136, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 diff --git a/cl/_testrt/mapclosure/out.ll b/cl/_testrt/mapclosure/out.ll index ecb0094a6b..a0fcdbc950 100644 --- a/cl/_testrt/mapclosure/out.ll +++ b/cl/_testrt/mapclosure/out.ll @@ -59,7 +59,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/mapclosure" @"[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 307038632, i8 8, i8 1, i8 1, i8 17, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"[8]_llgo_uint8" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 8 }, ptr @"*[8]_llgo_uint8" }, ptr @_llgo_uint8, ptr @"[]_llgo_uint8", i64 8 }, align 8 @13 = private unnamed_addr constant [8 x i8] c"[8]uint8", align 1 @"*[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -566230779, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 8 }, ptr null }, ptr @"[8]_llgo_uint8" }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @14 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @"[]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 370346748, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 7 }, ptr @"*[]_llgo_uint8" }, ptr @_llgo_uint8 }, align 8 @@ -92,6 +92,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/mapclosure" @27 = private unnamed_addr constant [29 x i8] c"interface { String() string }", align 1 @"*_llgo_iface$O6rEVxIuA5O1E0KWpQBCgGx26X5gYhJ_nnJnHVL8_7U" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 876051709, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @27, i64 29 }, ptr null }, ptr @"_llgo_iface$O6rEVxIuA5O1E0KWpQBCgGx26X5gYhJ_nnJnHVL8_7U" }, align 8 @28 = private unnamed_addr constant [5 x i8] c"error", align 1 +@llvm.compiler.used = appending global [1 x ptr] [ptr @"github.com/goplus/llgo/cl/_testrt/mapclosure.(*typ).String"], section "llvm.metadata" define %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testrt/mapclosure.demo"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %0) { _llgo_0: @@ -121,12 +122,14 @@ _llgo_1: ; preds = %_llgo_0 store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testrt/mapclosure.demo", ptr null }, ptr %3, align 8 store ptr %1, ptr @"github.com/goplus/llgo/cl/_testrt/mapclosure.op", align 8 %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %5 = getelementptr inbounds { ptr, ptr }, ptr %4, i64 0 - store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testrt/mapclosure.demo", ptr null }, ptr %5, align 8 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %4, 0 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, i64 1, 1 - %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, i64 1, 2 - store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, ptr @"github.com/goplus/llgo/cl/_testrt/mapclosure.list", align 8 + %5 = icmp eq ptr %4, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds { ptr, ptr }, ptr %4, i64 0 + store { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/cl/_testrt/mapclosure.demo", ptr null }, ptr %6, align 8 + %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %4, 0 + %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, i64 1, 1 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %8, i64 1, 2 + store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9, ptr @"github.com/goplus/llgo/cl/_testrt/mapclosure.list", align 8 br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 @@ -136,41 +139,45 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/mapclosure.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/mapclosure.typ", ptr %0, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @24, i64 5 }, ptr %1, align 8 - %2 = load ptr, ptr @"github.com/goplus/llgo/cl/_testrt/mapclosure.op", align 8 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @23, i64 4 }, ptr %3, align 8 - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAccess1"(ptr @"map[_llgo_string]_llgo_closure$vc5ZLfKV4flbpeFUtiJWFVJOxWgjZ8JlkoV1ZmTbVIQ", ptr %2, ptr %3) - %5 = load { ptr, ptr }, ptr %4, align 8 - %6 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr @"github.com/goplus/llgo/cl/_testrt/mapclosure.list", align 8 - %7 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, 0 - %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, 1 - %9 = icmp sge i64 0, %8 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %9) - %10 = getelementptr inbounds { ptr, ptr }, ptr %7, i64 0 - %11 = load { ptr, ptr }, ptr %10, align 8 - %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$O6rEVxIuA5O1E0KWpQBCgGx26X5gYhJ_nnJnHVL8_7U", ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/mapclosure.typ") - %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %12, 0 - %14 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %13, ptr %0, 1 - %15 = extractvalue { ptr, ptr } %5, 1 - %16 = extractvalue { ptr, ptr } %5, 0 - %17 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %16(ptr %15, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %14) - %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$O6rEVxIuA5O1E0KWpQBCgGx26X5gYhJ_nnJnHVL8_7U", ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/mapclosure.typ") - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %18, 0 - %20 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %19, ptr %0, 1 - %21 = extractvalue { ptr, ptr } %11, 1 - %22 = extractvalue { ptr, ptr } %11, 0 - %23 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %22(ptr %21, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %20) - %24 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %17, %"github.com/goplus/llgo/runtime/internal/runtime.String" %23) - %25 = xor i1 %24, true - br i1 %25, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/mapclosure.typ", ptr %0, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @24, i64 5 }, ptr %2, align 8 + %3 = load ptr, ptr @"github.com/goplus/llgo/cl/_testrt/mapclosure.op", align 8 + %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @23, i64 4 }, ptr %4, align 8 + %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAccess1"(ptr @"map[_llgo_string]_llgo_closure$vc5ZLfKV4flbpeFUtiJWFVJOxWgjZ8JlkoV1ZmTbVIQ", ptr %3, ptr %4) + %6 = load { ptr, ptr }, ptr %5, align 8 + %7 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr @"github.com/goplus/llgo/cl/_testrt/mapclosure.list", align 8 + %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 0 + %9 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 1 + %10 = icmp sge i64 0, %9 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %10) + %11 = getelementptr inbounds { ptr, ptr }, ptr %8, i64 0 + %12 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = load { ptr, ptr }, ptr %11, align 8 + %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$O6rEVxIuA5O1E0KWpQBCgGx26X5gYhJ_nnJnHVL8_7U", ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/mapclosure.typ") + %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %14, 0 + %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %15, ptr %0, 1 + %17 = extractvalue { ptr, ptr } %6, 1 + %18 = extractvalue { ptr, ptr } %6, 0 + %19 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %18(ptr %17, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %16) + %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$O6rEVxIuA5O1E0KWpQBCgGx26X5gYhJ_nnJnHVL8_7U", ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/mapclosure.typ") + %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %20, 0 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, ptr %0, 1 + %23 = extractvalue { ptr, ptr } %13, 1 + %24 = extractvalue { ptr, ptr } %13, 0 + %25 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" %24(ptr %23, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %22) + %26 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %19, %"github.com/goplus/llgo/runtime/internal/runtime.String" %25) + %27 = xor i1 %26, true + br i1 %27, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @28, i64 5 }, ptr %26, align 8 - %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %26, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %27) + %28 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @28, i64 5 }, ptr %28, align 8 + %29 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %28, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %29) unreachable _llgo_2: ; preds = %_llgo_0 @@ -179,9 +186,13 @@ _llgo_2: ; preds = %_llgo_0 define %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testrt/mapclosure.(*typ).String"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/mapclosure.typ", ptr %0, i32 0, i32 0 - %2 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %1, align 8 - ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/mapclosure.typ", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %2, align 8 + ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %4 } declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface") @@ -236,6 +247,8 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr, pt declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAccess1"(ptr, ptr, ptr) declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1) diff --git a/cl/_testrt/methodthunk/out.ll b/cl/_testrt/methodthunk/out.ll index 03d85892cd..ae75415629 100644 --- a/cl/_testrt/methodthunk/out.ll +++ b/cl/_testrt/methodthunk/out.ll @@ -27,11 +27,11 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/methodthunk" @"_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.outer" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 0, i32 1545761878, i8 13, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.outer" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 10 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.outer" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 45 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testrt/methodthunk.struct$dWFLkDBIS1Fsuz7s-VaGDEwSLo3CKXMAaaGtssf2rF0$fields", i64 2, i64 2 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 45 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @4 = private unnamed_addr constant [45 x i8] c"github.com/goplus/llgo/cl/_testrt/methodthunk", align 1 @5 = private unnamed_addr constant [1 x i8] c"y", align 1 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, ptr @"*_llgo_int" }, align 8 @6 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @7 = private unnamed_addr constant [5 x i8] c"inner", align 1 -@"_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.inner" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -2074861867, i8 13, i8 8, i8 8, i8 57, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.inner" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 10 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.inner" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 45 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testrt/methodthunk.struct$KyEcQxcVU_tO6DKAbg1htV0IKmLOYbjCHy8CH5BU5aA$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 45 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.inner" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -2074861867, i8 13, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.inner" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 10 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.inner" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 45 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testrt/methodthunk.struct$KyEcQxcVU_tO6DKAbg1htV0IKmLOYbjCHy8CH5BU5aA$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 45 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @8 = private unnamed_addr constant [10 x i8] c"main.inner", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.inner" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 474176774, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 10 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.inner" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 45 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 1 }, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", ptr @"github.com/goplus/llgo/cl/_testrt/methodthunk.(*inner).M", ptr @"github.com/goplus/llgo/cl/_testrt/methodthunk.(*inner).M" }] }, align 8 @9 = private unnamed_addr constant [1 x i8] c"M", align 1 @@ -55,7 +55,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/methodthunk" @"*_llgo_func$FmtsGADozkyQT08ENvP6TWR4cTxBUiTI7qSNCOFeF4s" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1993146843, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 24 }, ptr null }, ptr @"_llgo_func$FmtsGADozkyQT08ENvP6TWR4cTxBUiTI7qSNCOFeF4s" }, align 8 @"*_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.InnerInt" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1157760495, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 13 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.InnerInt" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 45 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 1 }, ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA", ptr @"github.com/goplus/llgo/cl/_testrt/methodthunk.(*InnerInt).M", ptr @"github.com/goplus/llgo/cl/_testrt/methodthunk.(*InnerInt).M" }] }, align 8 @16 = private unnamed_addr constant [13 x i8] c"main.InnerInt", align 1 -@"_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.InnerInt" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1088987572, i8 13, i8 8, i8 8, i8 57, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.InnerInt" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 13 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.InnerInt" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_struct$8LihShjQN68KxgbxkJ8l6tip2BGrW3Tj5i5Q4NqfXHM$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 45 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.InnerInt" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1088987572, i8 13, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.InnerInt" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 13 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/methodthunk.InnerInt" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_struct$8LihShjQN68KxgbxkJ8l6tip2BGrW3Tj5i5Q4NqfXHM$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 45 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @17 = private unnamed_addr constant [1 x i8] c"X", align 1 @"_llgo_struct$8LihShjQN68KxgbxkJ8l6tip2BGrW3Tj5i5Q4NqfXHM$fields" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @17, i64 1 }, ptr @_llgo_int, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 2131144854, i8 0, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 10 }, ptr @"*_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" zeroinitializer, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$ETeB8WwW04JEq0ztcm-XPTJtuYvtpkjIsAc0-2NT9zA$out", i64 1, i64 1 } }, align 8 @@ -69,19 +69,26 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/methodthunk" @_llgo_string = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 8, i32 1749264893, i8 4, i8 8, i8 8, i8 24, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.strequal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 6 }, ptr @"*_llgo_string" }, align 8 @20 = private unnamed_addr constant [6 x i8] c"string", align 1 @"*_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1323879264, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 6 }, ptr null }, ptr @_llgo_string }, align 8 +@llvm.compiler.used = appending global [4 x ptr] [ptr @"github.com/goplus/llgo/cl/_testrt/methodthunk.(*InnerInt).M", ptr @"github.com/goplus/llgo/cl/_testrt/methodthunk.(*OuterInt).M", ptr @"github.com/goplus/llgo/cl/_testrt/methodthunk.(*inner).M", ptr @"github.com/goplus/llgo/cl/_testrt/methodthunk.(*outer).M"], section "llvm.metadata" define i64 @"github.com/goplus/llgo/cl/_testrt/methodthunk.(*InnerInt).M"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/methodthunk.InnerInt", ptr %0, i32 0, i32 0 - %2 = load i64, ptr %1, align 4 - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/methodthunk.InnerInt", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i64, ptr %2, align 4 + ret i64 %4 } define i64 @"github.com/goplus/llgo/cl/_testrt/methodthunk.(*OuterInt).M"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/methodthunk.OuterInt", ptr %0, i32 0, i32 1 - %2 = call i64 @"github.com/goplus/llgo/cl/_testrt/methodthunk.(*InnerInt).M"(ptr %1) - ret i64 %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/methodthunk.OuterInt", ptr %0, i32 0, i32 1 + %3 = call i64 @"github.com/goplus/llgo/cl/_testrt/methodthunk.(*InnerInt).M"(ptr %2) + ret i64 %3 } define void @"github.com/goplus/llgo/cl/_testrt/methodthunk.init"() { @@ -174,6 +181,8 @@ _llgo_0: ret void } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + define void @"github.com/goplus/llgo/cl/_testrt/methodthunk.(*outer).M$thunk"(ptr %0) { _llgo_0: call void @"github.com/goplus/llgo/cl/_testrt/methodthunk.(*outer).M"(ptr %0) diff --git a/cl/_testrt/named/out.ll b/cl/_testrt/named/out.ll index be3ff8d71e..4e0dc61af8 100644 --- a/cl/_testrt/named/out.ll +++ b/cl/_testrt/named/out.ll @@ -26,89 +26,209 @@ _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 64) store ptr %1, ptr %0, align 8 - %2 = load ptr, ptr %0, align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %2, i32 0, i32 4 - store i64 100, ptr %3, align 4 - %4 = load ptr, ptr %0, align 8 - %5 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 64) - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %4, i32 0, i32 0 - store ptr %5, ptr %6, align 8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load ptr, ptr %0, align 8 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %3, i32 0, i32 4 + store i64 100, ptr %5, align 4 + %6 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) %7 = load ptr, ptr %0, align 8 - %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %7, i32 0, i32 0 - %9 = load ptr, ptr %8, align 8 - %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %9, i32 0, i32 4 - store i64 200, ptr %10, align 4 - %11 = load ptr, ptr %0, align 8 - %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %13 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %11, i32 0, i32 2 - store ptr %12, ptr %13, align 8 - %14 = load ptr, ptr %0, align 8 - %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %14, i32 0, i32 2 - %16 = load ptr, ptr %15, align 8 - %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 64) - %18 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mSpanList", ptr %16, i32 0, i32 1 - store ptr %17, ptr %18, align 8 - %19 = load ptr, ptr %0, align 8 - %20 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %19, i32 0, i32 2 - %21 = load ptr, ptr %20, align 8 - %22 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mSpanList", ptr %21, i32 0, i32 1 - %23 = load ptr, ptr %22, align 8 - %24 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %23, i32 0, i32 4 - store i64 300, ptr %24, align 4 + %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 64) + %9 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %7, i32 0, i32 0 + store ptr %8, ptr %10, align 8 + %11 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = load ptr, ptr %0, align 8 + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %12, i32 0, i32 0 + %15 = icmp eq ptr %14, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = load ptr, ptr %14, align 8 + %17 = icmp eq ptr %16, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %17) + %18 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %16, i32 0, i32 4 + store i64 200, ptr %18, align 4 + %19 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %19) + %20 = load ptr, ptr %0, align 8 + %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %22 = icmp eq ptr %20, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %22) + %23 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %20, i32 0, i32 2 + store ptr %21, ptr %23, align 8 + %24 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %24) %25 = load ptr, ptr %0, align 8 - %26 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %25, i32 0, i32 3 - %27 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.minfo", ptr %26, i32 0, i32 1 - store i64 10, ptr %27, align 4 - %28 = load ptr, ptr %0, align 8 - %29 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %28, i32 0, i32 3 - %30 = load ptr, ptr %0, align 8 - %31 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.minfo", ptr %29, i32 0, i32 0 - store ptr %30, ptr %31, align 8 - %32 = load ptr, ptr %0, align 8 - %33 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) - %34 = getelementptr inbounds { ptr }, ptr %33, i32 0, i32 0 - store ptr %0, ptr %34, align 8 - %35 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testrt/named.main$1", ptr undef }, ptr %33, 1 - %36 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %32, i32 0, i32 5 - store { ptr, ptr } %35, ptr %36, align 8 - %37 = load ptr, ptr %0, align 8 - %38 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %37, i32 0, i32 0 - %39 = load ptr, ptr %38, align 8 - %40 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %39, i32 0, i32 4 - %41 = load i64, ptr %40, align 4 - %42 = load ptr, ptr %0, align 8 - %43 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %42, i32 0, i32 2 - %44 = load ptr, ptr %43, align 8 - %45 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mSpanList", ptr %44, i32 0, i32 1 - %46 = load ptr, ptr %45, align 8 - %47 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %46, i32 0, i32 4 - %48 = load i64, ptr %47, align 4 - %49 = load ptr, ptr %0, align 8 - %50 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %49, i32 0, i32 3 - %51 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.minfo", ptr %50, i32 0, i32 1 - %52 = load i64, ptr %51, align 4 - %53 = load ptr, ptr %0, align 8 - %54 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %53, i32 0, i32 3 - %55 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.minfo", ptr %54, i32 0, i32 0 - %56 = load ptr, ptr %55, align 8 - %57 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %56, i32 0, i32 4 - %58 = load i64, ptr %57, align 4 - %59 = load ptr, ptr %0, align 8 - %60 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %59, i32 0, i32 5 - %61 = load { ptr, ptr }, ptr %60, align 8 - %62 = extractvalue { ptr, ptr } %61, 1 - %63 = extractvalue { ptr, ptr } %61, 0 - %64 = call i64 %63(ptr %62, i64 -2) - %65 = load ptr, ptr %0, align 8 - %66 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %65, i32 0, i32 3 - %67 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.minfo", ptr %66, i32 0, i32 0 - %68 = load ptr, ptr %67, align 8 - %69 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %68, i32 0, i32 5 - %70 = load { ptr, ptr }, ptr %69, align 8 - %71 = extractvalue { ptr, ptr } %70, 1 - %72 = extractvalue { ptr, ptr } %70, 0 - %73 = call i64 %72(ptr %71, i64 -3) - %74 = call i32 (ptr, ...) @printf(ptr @0, i64 %41, i64 %48, i64 %52, i64 %58, i64 %64, i64 %73) + %26 = icmp eq ptr %25, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %26) + %27 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %25, i32 0, i32 2 + %28 = icmp eq ptr %27, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %28) + %29 = load ptr, ptr %27, align 8 + %30 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 64) + %31 = icmp eq ptr %29, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %31) + %32 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mSpanList", ptr %29, i32 0, i32 1 + store ptr %30, ptr %32, align 8 + %33 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %33) + %34 = load ptr, ptr %0, align 8 + %35 = icmp eq ptr %34, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %35) + %36 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %34, i32 0, i32 2 + %37 = icmp eq ptr %36, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %37) + %38 = load ptr, ptr %36, align 8 + %39 = icmp eq ptr %38, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %39) + %40 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mSpanList", ptr %38, i32 0, i32 1 + %41 = icmp eq ptr %40, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %41) + %42 = load ptr, ptr %40, align 8 + %43 = icmp eq ptr %42, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %43) + %44 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %42, i32 0, i32 4 + store i64 300, ptr %44, align 4 + %45 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %45) + %46 = load ptr, ptr %0, align 8 + %47 = icmp eq ptr %46, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %47) + %48 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %46, i32 0, i32 3 + %49 = icmp eq ptr %48, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %49) + %50 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.minfo", ptr %48, i32 0, i32 1 + store i64 10, ptr %50, align 4 + %51 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %51) + %52 = load ptr, ptr %0, align 8 + %53 = icmp eq ptr %52, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %53) + %54 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %52, i32 0, i32 3 + %55 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %55) + %56 = load ptr, ptr %0, align 8 + %57 = icmp eq ptr %54, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %57) + %58 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.minfo", ptr %54, i32 0, i32 0 + store ptr %56, ptr %58, align 8 + %59 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %59) + %60 = load ptr, ptr %0, align 8 + %61 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + %62 = getelementptr inbounds { ptr }, ptr %61, i32 0, i32 0 + store ptr %0, ptr %62, align 8 + %63 = insertvalue { ptr, ptr } { ptr @"github.com/goplus/llgo/cl/_testrt/named.main$1", ptr undef }, ptr %61, 1 + %64 = icmp eq ptr %60, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %64) + %65 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %60, i32 0, i32 5 + store { ptr, ptr } %63, ptr %65, align 8 + %66 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %66) + %67 = load ptr, ptr %0, align 8 + %68 = icmp eq ptr %67, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %68) + %69 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %67, i32 0, i32 0 + %70 = icmp eq ptr %69, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %70) + %71 = load ptr, ptr %69, align 8 + %72 = icmp eq ptr %71, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %72) + %73 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %71, i32 0, i32 4 + %74 = icmp eq ptr %73, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %74) + %75 = load i64, ptr %73, align 4 + %76 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %76) + %77 = load ptr, ptr %0, align 8 + %78 = icmp eq ptr %77, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %78) + %79 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %77, i32 0, i32 2 + %80 = icmp eq ptr %79, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %80) + %81 = load ptr, ptr %79, align 8 + %82 = icmp eq ptr %81, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %82) + %83 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mSpanList", ptr %81, i32 0, i32 1 + %84 = icmp eq ptr %83, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %84) + %85 = load ptr, ptr %83, align 8 + %86 = icmp eq ptr %85, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %86) + %87 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %85, i32 0, i32 4 + %88 = icmp eq ptr %87, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %88) + %89 = load i64, ptr %87, align 4 + %90 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %90) + %91 = load ptr, ptr %0, align 8 + %92 = icmp eq ptr %91, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %92) + %93 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %91, i32 0, i32 3 + %94 = icmp eq ptr %93, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %94) + %95 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.minfo", ptr %93, i32 0, i32 1 + %96 = icmp eq ptr %95, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %96) + %97 = load i64, ptr %95, align 4 + %98 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %98) + %99 = load ptr, ptr %0, align 8 + %100 = icmp eq ptr %99, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %100) + %101 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %99, i32 0, i32 3 + %102 = icmp eq ptr %101, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %102) + %103 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.minfo", ptr %101, i32 0, i32 0 + %104 = icmp eq ptr %103, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %104) + %105 = load ptr, ptr %103, align 8 + %106 = icmp eq ptr %105, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %106) + %107 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %105, i32 0, i32 4 + %108 = icmp eq ptr %107, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %108) + %109 = load i64, ptr %107, align 4 + %110 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %110) + %111 = load ptr, ptr %0, align 8 + %112 = icmp eq ptr %111, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %112) + %113 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %111, i32 0, i32 5 + %114 = icmp eq ptr %113, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %114) + %115 = load { ptr, ptr }, ptr %113, align 8 + %116 = extractvalue { ptr, ptr } %115, 1 + %117 = extractvalue { ptr, ptr } %115, 0 + %118 = call i64 %117(ptr %116, i64 -2) + %119 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %119) + %120 = load ptr, ptr %0, align 8 + %121 = icmp eq ptr %120, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %121) + %122 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %120, i32 0, i32 3 + %123 = icmp eq ptr %122, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %123) + %124 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.minfo", ptr %122, i32 0, i32 0 + %125 = icmp eq ptr %124, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %125) + %126 = load ptr, ptr %124, align 8 + %127 = icmp eq ptr %126, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %127) + %128 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %126, i32 0, i32 5 + %129 = icmp eq ptr %128, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %129) + %130 = load { ptr, ptr }, ptr %128, align 8 + %131 = extractvalue { ptr, ptr } %130, 1 + %132 = extractvalue { ptr, ptr } %130, 0 + %133 = call i64 %132(ptr %131, i64 -3) + %134 = call i32 (ptr, ...) @printf(ptr @0, i64 %75, i64 %89, i64 %97, i64 %109, i64 %118, i64 %133) ret void } @@ -116,15 +236,23 @@ define i64 @"github.com/goplus/llgo/cl/_testrt/named.main$1"(ptr %0, i64 %1) { _llgo_0: %2 = load { ptr }, ptr %0, align 8 %3 = extractvalue { ptr } %2, 0 - %4 = load ptr, ptr %3, align 8 - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %4, i32 0, i32 4 - %6 = load i64, ptr %5, align 4 - %7 = mul i64 %6, %1 - ret i64 %7 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/named.mspan", ptr %5, i32 0, i32 4 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load i64, ptr %7, align 4 + %10 = mul i64 %9, %1 + ret i64 %10 } declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) declare i32 @printf(ptr, ...) diff --git a/cl/_testrt/namedslice/out.ll b/cl/_testrt/namedslice/out.ll index 9a077471fd..50f60a7cd0 100644 --- a/cl/_testrt/namedslice/out.ll +++ b/cl/_testrt/namedslice/out.ll @@ -11,10 +11,11 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/namedslice" %"github.com/goplus/llgo/runtime/internal/runtime.eface" = type { ptr, ptr } @"github.com/goplus/llgo/cl/_testrt/namedslice.init$guard" = global i1 false, align 1 +@"__llgo.moduleZeroSizedAlloc$91bb43a83258615a" = private unnamed_addr global [0 x i8] zeroinitializer @"_llgo_github.com/goplus/llgo/cl/_testrt/namedslice.MyBytes" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.SliceType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 -429486748, i8 5, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 12 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/namedslice.MyBytes" }, ptr @_llgo_uint8 }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 44 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @0 = private unnamed_addr constant [12 x i8] c"main.MyBytes", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testrt/namedslice.MyBytes" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1016845880, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 12 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/namedslice.MyBytes" }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @1 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @2 = private unnamed_addr constant [44 x i8] c"github.com/goplus/llgo/cl/_testrt/namedslice", align 1 @@ -38,46 +39,40 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/namedslice.main"() { _llgo_0: - %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 0) - %1 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 - %2 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %1, i64 0, 1 - %3 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %2, i64 0, 2 - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 24) - store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %3, ptr %4, align 8 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/namedslice.MyBytes", ptr undef }, ptr %4, 1 - %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %5, 0 - %7 = icmp eq ptr %6, @"_llgo_github.com/goplus/llgo/cl/_testrt/namedslice.MyBytes" - br i1 %7, label %_llgo_3, label %_llgo_4 + %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 24) + store %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$91bb43a83258615a", i64 0, i64 0 }, ptr %0, align 8 + %1 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/namedslice.MyBytes", ptr undef }, ptr %0, 1 + %2 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %1, 0 + %3 = icmp eq ptr %2, @"_llgo_github.com/goplus/llgo/cl/_testrt/namedslice.MyBytes" + br i1 %3, label %_llgo_3, label %_llgo_4 _llgo_1: ; preds = %_llgo_5 - %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 9 }, ptr %8, align 8 - %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %8, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %9) + %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 9 }, ptr %4, align 8 + %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %5) unreachable _llgo_2: ; preds = %_llgo_5 ret void _llgo_3: ; preds = %_llgo_0 - %10 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %5, 1 - %11 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %10, align 8 - %12 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, 0 - %13 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", i1 } %12, i1 true, 1 + %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %1, 1 + %7 = load %"github.com/goplus/llgo/runtime/internal/runtime.Slice", ptr %6, align 8 + %8 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 0 + %9 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", i1 } %8, i1 true, 1 br label %_llgo_5 _llgo_4: ; preds = %_llgo_0 br label %_llgo_5 _llgo_5: ; preds = %_llgo_4, %_llgo_3 - %14 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", i1 } [ %13, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] - %15 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", i1 } %14, 0 - %16 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", i1 } %14, 1 - br i1 %16, label %_llgo_2, label %_llgo_1 + %10 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", i1 } [ %9, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] + %11 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", i1 } %10, 0 + %12 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.Slice", i1 } %10, 1 + br i1 %12, label %_llgo_2, label %_llgo_1 } -declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) - declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequalptr"(ptr, ptr) define linkonce i1 @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr"(ptr %0, ptr %1, ptr %2) { diff --git a/cl/_testrt/qsort/out.ll b/cl/_testrt/qsort/out.ll index f0649acc11..8d93778ffe 100644 --- a/cl/_testrt/qsort/out.ll +++ b/cl/_testrt/qsort/out.ll @@ -20,35 +20,49 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/qsort.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 40) - %1 = getelementptr inbounds i64, ptr %0, i64 0 - %2 = getelementptr inbounds i64, ptr %0, i64 1 - %3 = getelementptr inbounds i64, ptr %0, i64 2 - %4 = getelementptr inbounds i64, ptr %0, i64 3 - %5 = getelementptr inbounds i64, ptr %0, i64 4 - store i64 100, ptr %1, align 4 - store i64 8, ptr %2, align 4 - store i64 23, ptr %3, align 4 - store i64 2, ptr %4, align 4 - store i64 7, ptr %5, align 4 - %6 = getelementptr inbounds i64, ptr %0, i64 0 - call void @qsort(ptr %6, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsort.main$1") - %7 = load [5 x i64], ptr %0, align 4 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds i64, ptr %0, i64 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds i64, ptr %0, i64 1 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds i64, ptr %0, i64 2 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds i64, ptr %0, i64 3 + %9 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %9) + %10 = getelementptr inbounds i64, ptr %0, i64 4 + store i64 100, ptr %2, align 4 + store i64 8, ptr %4, align 4 + store i64 23, ptr %6, align 4 + store i64 2, ptr %8, align 4 + store i64 7, ptr %10, align 4 + %11 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds i64, ptr %0, i64 0 + call void @qsort(ptr %12, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsort.main$1") + %13 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load [5 x i64], ptr %0, align 4 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %8 = phi i64 [ -1, %_llgo_0 ], [ %9, %_llgo_2 ] - %9 = add i64 %8, 1 - %10 = icmp slt i64 %9, 5 - br i1 %10, label %_llgo_2, label %_llgo_3 + %15 = phi i64 [ -1, %_llgo_0 ], [ %16, %_llgo_2 ] + %16 = add i64 %15, 1 + %17 = icmp slt i64 %16, 5 + br i1 %17, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %11 = icmp slt i64 %9, 0 - %12 = icmp sge i64 %9, 5 - %13 = or i1 %12, %11 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %13) - %14 = getelementptr inbounds i64, ptr %0, i64 %9 - %15 = load i64, ptr %14, align 4 - %16 = call i32 (ptr, ...) @printf(ptr @0, i64 %15) + %18 = icmp slt i64 %16, 0 + %19 = icmp sge i64 %16, 5 + %20 = or i1 %19, %18 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %20) + %21 = getelementptr inbounds i64, ptr %0, i64 %16 + %22 = load i64, ptr %21, align 4 + %23 = call i32 (ptr, ...) @printf(ptr @0, i64 %22) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -57,15 +71,21 @@ _llgo_3: ; preds = %_llgo_1 define i32 @"github.com/goplus/llgo/cl/_testrt/qsort.main$1"(ptr %0, ptr %1) { _llgo_0: - %2 = load i64, ptr %0, align 4 - %3 = load i64, ptr %1, align 4 - %4 = sub i64 %2, %3 - %5 = trunc i64 %4 to i32 - ret i32 %5 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load i64, ptr %0, align 4 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %1, align 4 + %6 = sub i64 %3, %5 + %7 = trunc i64 %6 to i32 + ret i32 %7 } declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @qsort(ptr, i64, i64, ptr) declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1) diff --git a/cl/_testrt/qsortfn/out.ll b/cl/_testrt/qsortfn/out.ll index 674656afdd..78427a1ab0 100644 --- a/cl/_testrt/qsortfn/out.ll +++ b/cl/_testrt/qsortfn/out.ll @@ -55,35 +55,49 @@ define void @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort1a"() { _llgo_0: %0 = call i32 (ptr, ...) @printf(ptr @0) %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 40) - %2 = getelementptr inbounds i64, ptr %1, i64 0 - %3 = getelementptr inbounds i64, ptr %1, i64 1 - %4 = getelementptr inbounds i64, ptr %1, i64 2 - %5 = getelementptr inbounds i64, ptr %1, i64 3 - %6 = getelementptr inbounds i64, ptr %1, i64 4 - store i64 100, ptr %2, align 4 - store i64 8, ptr %3, align 4 - store i64 23, ptr %4, align 4 - store i64 2, ptr %5, align 4 - store i64 7, ptr %6, align 4 - %7 = getelementptr inbounds i64, ptr %1, i64 0 - call void @qsort(ptr %7, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort1a$1") - %8 = load [5 x i64], ptr %1, align 4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds i64, ptr %1, i64 0 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds i64, ptr %1, i64 1 + %6 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds i64, ptr %1, i64 2 + %8 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds i64, ptr %1, i64 3 + %10 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds i64, ptr %1, i64 4 + store i64 100, ptr %3, align 4 + store i64 8, ptr %5, align 4 + store i64 23, ptr %7, align 4 + store i64 2, ptr %9, align 4 + store i64 7, ptr %11, align 4 + %12 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds i64, ptr %1, i64 0 + call void @qsort(ptr %13, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort1a$1") + %14 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load [5 x i64], ptr %1, align 4 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] - %10 = add i64 %9, 1 - %11 = icmp slt i64 %10, 5 - br i1 %11, label %_llgo_2, label %_llgo_3 + %16 = phi i64 [ -1, %_llgo_0 ], [ %17, %_llgo_2 ] + %17 = add i64 %16, 1 + %18 = icmp slt i64 %17, 5 + br i1 %18, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %12 = icmp slt i64 %10, 0 - %13 = icmp sge i64 %10, 5 - %14 = or i1 %13, %12 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %14) - %15 = getelementptr inbounds i64, ptr %1, i64 %10 - %16 = load i64, ptr %15, align 4 - %17 = call i32 (ptr, ...) @printf(ptr @1, i64 %16) + %19 = icmp slt i64 %17, 0 + %20 = icmp sge i64 %17, 5 + %21 = or i1 %20, %19 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %21) + %22 = getelementptr inbounds i64, ptr %1, i64 %17 + %23 = load i64, ptr %22, align 4 + %24 = call i32 (ptr, ...) @printf(ptr @1, i64 %23) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -92,46 +106,64 @@ _llgo_3: ; preds = %_llgo_1 define i32 @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort1a$1"(ptr %0, ptr %1) { _llgo_0: - %2 = load i64, ptr %0, align 4 - %3 = load i64, ptr %1, align 4 - %4 = sub i64 %2, %3 - %5 = trunc i64 %4 to i32 - ret i32 %5 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load i64, ptr %0, align 4 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %1, align 4 + %6 = sub i64 %3, %5 + %7 = trunc i64 %6 to i32 + ret i32 %7 } define void @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort1b"() { _llgo_0: %0 = call i32 (ptr, ...) @printf(ptr @2) %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 40) - %2 = getelementptr inbounds i64, ptr %1, i64 0 - %3 = getelementptr inbounds i64, ptr %1, i64 1 - %4 = getelementptr inbounds i64, ptr %1, i64 2 - %5 = getelementptr inbounds i64, ptr %1, i64 3 - %6 = getelementptr inbounds i64, ptr %1, i64 4 - store i64 100, ptr %2, align 4 - store i64 8, ptr %3, align 4 - store i64 23, ptr %4, align 4 - store i64 2, ptr %5, align 4 - store i64 7, ptr %6, align 4 - %7 = getelementptr inbounds i64, ptr %1, i64 0 - call void @qsort(ptr %7, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort1b$1") - %8 = load [5 x i64], ptr %1, align 4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds i64, ptr %1, i64 0 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds i64, ptr %1, i64 1 + %6 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds i64, ptr %1, i64 2 + %8 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds i64, ptr %1, i64 3 + %10 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds i64, ptr %1, i64 4 + store i64 100, ptr %3, align 4 + store i64 8, ptr %5, align 4 + store i64 23, ptr %7, align 4 + store i64 2, ptr %9, align 4 + store i64 7, ptr %11, align 4 + %12 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds i64, ptr %1, i64 0 + call void @qsort(ptr %13, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort1b$1") + %14 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load [5 x i64], ptr %1, align 4 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] - %10 = add i64 %9, 1 - %11 = icmp slt i64 %10, 5 - br i1 %11, label %_llgo_2, label %_llgo_3 + %16 = phi i64 [ -1, %_llgo_0 ], [ %17, %_llgo_2 ] + %17 = add i64 %16, 1 + %18 = icmp slt i64 %17, 5 + br i1 %18, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %12 = icmp slt i64 %10, 0 - %13 = icmp sge i64 %10, 5 - %14 = or i1 %13, %12 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %14) - %15 = getelementptr inbounds i64, ptr %1, i64 %10 - %16 = load i64, ptr %15, align 4 - %17 = call i32 (ptr, ...) @printf(ptr @3, i64 %16) + %19 = icmp slt i64 %17, 0 + %20 = icmp sge i64 %17, 5 + %21 = or i1 %20, %19 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %21) + %22 = getelementptr inbounds i64, ptr %1, i64 %17 + %23 = load i64, ptr %22, align 4 + %24 = call i32 (ptr, ...) @printf(ptr @3, i64 %23) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -140,46 +172,64 @@ _llgo_3: ; preds = %_llgo_1 define i32 @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort1b$1"(ptr %0, ptr %1) { _llgo_0: - %2 = load i64, ptr %0, align 4 - %3 = load i64, ptr %1, align 4 - %4 = sub i64 %2, %3 - %5 = trunc i64 %4 to i32 - ret i32 %5 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load i64, ptr %0, align 4 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %1, align 4 + %6 = sub i64 %3, %5 + %7 = trunc i64 %6 to i32 + ret i32 %7 } define void @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort2a"() { _llgo_0: %0 = call i32 (ptr, ...) @printf(ptr @4) %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 40) - %2 = getelementptr inbounds i64, ptr %1, i64 0 - %3 = getelementptr inbounds i64, ptr %1, i64 1 - %4 = getelementptr inbounds i64, ptr %1, i64 2 - %5 = getelementptr inbounds i64, ptr %1, i64 3 - %6 = getelementptr inbounds i64, ptr %1, i64 4 - store i64 100, ptr %2, align 4 - store i64 8, ptr %3, align 4 - store i64 23, ptr %4, align 4 - store i64 2, ptr %5, align 4 - store i64 7, ptr %6, align 4 - %7 = getelementptr inbounds i64, ptr %1, i64 0 - call void @qsort(ptr %7, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort2a$1") - %8 = load [5 x i64], ptr %1, align 4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds i64, ptr %1, i64 0 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds i64, ptr %1, i64 1 + %6 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds i64, ptr %1, i64 2 + %8 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds i64, ptr %1, i64 3 + %10 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds i64, ptr %1, i64 4 + store i64 100, ptr %3, align 4 + store i64 8, ptr %5, align 4 + store i64 23, ptr %7, align 4 + store i64 2, ptr %9, align 4 + store i64 7, ptr %11, align 4 + %12 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds i64, ptr %1, i64 0 + call void @qsort(ptr %13, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort2a$1") + %14 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load [5 x i64], ptr %1, align 4 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] - %10 = add i64 %9, 1 - %11 = icmp slt i64 %10, 5 - br i1 %11, label %_llgo_2, label %_llgo_3 + %16 = phi i64 [ -1, %_llgo_0 ], [ %17, %_llgo_2 ] + %17 = add i64 %16, 1 + %18 = icmp slt i64 %17, 5 + br i1 %18, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %12 = icmp slt i64 %10, 0 - %13 = icmp sge i64 %10, 5 - %14 = or i1 %13, %12 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %14) - %15 = getelementptr inbounds i64, ptr %1, i64 %10 - %16 = load i64, ptr %15, align 4 - %17 = call i32 (ptr, ...) @printf(ptr @5, i64 %16) + %19 = icmp slt i64 %17, 0 + %20 = icmp sge i64 %17, 5 + %21 = or i1 %20, %19 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %21) + %22 = getelementptr inbounds i64, ptr %1, i64 %17 + %23 = load i64, ptr %22, align 4 + %24 = call i32 (ptr, ...) @printf(ptr @5, i64 %23) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -188,46 +238,64 @@ _llgo_3: ; preds = %_llgo_1 define i32 @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort2a$1"(ptr %0, ptr %1) { _llgo_0: - %2 = load i64, ptr %0, align 4 - %3 = load i64, ptr %1, align 4 - %4 = sub i64 %2, %3 - %5 = trunc i64 %4 to i32 - ret i32 %5 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load i64, ptr %0, align 4 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %1, align 4 + %6 = sub i64 %3, %5 + %7 = trunc i64 %6 to i32 + ret i32 %7 } define void @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort2b"() { _llgo_0: %0 = call i32 (ptr, ...) @printf(ptr @6) %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 40) - %2 = getelementptr inbounds i64, ptr %1, i64 0 - %3 = getelementptr inbounds i64, ptr %1, i64 1 - %4 = getelementptr inbounds i64, ptr %1, i64 2 - %5 = getelementptr inbounds i64, ptr %1, i64 3 - %6 = getelementptr inbounds i64, ptr %1, i64 4 - store i64 100, ptr %2, align 4 - store i64 8, ptr %3, align 4 - store i64 23, ptr %4, align 4 - store i64 2, ptr %5, align 4 - store i64 7, ptr %6, align 4 - %7 = getelementptr inbounds i64, ptr %1, i64 0 - call void @qsort(ptr %7, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort2b$1") - %8 = load [5 x i64], ptr %1, align 4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds i64, ptr %1, i64 0 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds i64, ptr %1, i64 1 + %6 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds i64, ptr %1, i64 2 + %8 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds i64, ptr %1, i64 3 + %10 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds i64, ptr %1, i64 4 + store i64 100, ptr %3, align 4 + store i64 8, ptr %5, align 4 + store i64 23, ptr %7, align 4 + store i64 2, ptr %9, align 4 + store i64 7, ptr %11, align 4 + %12 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds i64, ptr %1, i64 0 + call void @qsort(ptr %13, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort2b$1") + %14 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load [5 x i64], ptr %1, align 4 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] - %10 = add i64 %9, 1 - %11 = icmp slt i64 %10, 5 - br i1 %11, label %_llgo_2, label %_llgo_3 + %16 = phi i64 [ -1, %_llgo_0 ], [ %17, %_llgo_2 ] + %17 = add i64 %16, 1 + %18 = icmp slt i64 %17, 5 + br i1 %18, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %12 = icmp slt i64 %10, 0 - %13 = icmp sge i64 %10, 5 - %14 = or i1 %13, %12 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %14) - %15 = getelementptr inbounds i64, ptr %1, i64 %10 - %16 = load i64, ptr %15, align 4 - %17 = call i32 (ptr, ...) @printf(ptr @7, i64 %16) + %19 = icmp slt i64 %17, 0 + %20 = icmp sge i64 %17, 5 + %21 = or i1 %20, %19 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %21) + %22 = getelementptr inbounds i64, ptr %1, i64 %17 + %23 = load i64, ptr %22, align 4 + %24 = call i32 (ptr, ...) @printf(ptr @7, i64 %23) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -236,46 +304,64 @@ _llgo_3: ; preds = %_llgo_1 define i32 @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort2b$1"(ptr %0, ptr %1) { _llgo_0: - %2 = load i64, ptr %0, align 4 - %3 = load i64, ptr %1, align 4 - %4 = sub i64 %2, %3 - %5 = trunc i64 %4 to i32 - ret i32 %5 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load i64, ptr %0, align 4 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %1, align 4 + %6 = sub i64 %3, %5 + %7 = trunc i64 %6 to i32 + ret i32 %7 } define void @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort3a"() { _llgo_0: %0 = call i32 (ptr, ...) @printf(ptr @8) %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 40) - %2 = getelementptr inbounds i64, ptr %1, i64 0 - %3 = getelementptr inbounds i64, ptr %1, i64 1 - %4 = getelementptr inbounds i64, ptr %1, i64 2 - %5 = getelementptr inbounds i64, ptr %1, i64 3 - %6 = getelementptr inbounds i64, ptr %1, i64 4 - store i64 100, ptr %2, align 4 - store i64 8, ptr %3, align 4 - store i64 23, ptr %4, align 4 - store i64 2, ptr %5, align 4 - store i64 7, ptr %6, align 4 - %7 = getelementptr inbounds i64, ptr %1, i64 0 - call void @qsort(ptr %7, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort3a$1") - %8 = load [5 x i64], ptr %1, align 4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds i64, ptr %1, i64 0 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds i64, ptr %1, i64 1 + %6 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds i64, ptr %1, i64 2 + %8 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds i64, ptr %1, i64 3 + %10 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds i64, ptr %1, i64 4 + store i64 100, ptr %3, align 4 + store i64 8, ptr %5, align 4 + store i64 23, ptr %7, align 4 + store i64 2, ptr %9, align 4 + store i64 7, ptr %11, align 4 + %12 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds i64, ptr %1, i64 0 + call void @qsort(ptr %13, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort3a$1") + %14 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load [5 x i64], ptr %1, align 4 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] - %10 = add i64 %9, 1 - %11 = icmp slt i64 %10, 5 - br i1 %11, label %_llgo_2, label %_llgo_3 + %16 = phi i64 [ -1, %_llgo_0 ], [ %17, %_llgo_2 ] + %17 = add i64 %16, 1 + %18 = icmp slt i64 %17, 5 + br i1 %18, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %12 = icmp slt i64 %10, 0 - %13 = icmp sge i64 %10, 5 - %14 = or i1 %13, %12 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %14) - %15 = getelementptr inbounds i64, ptr %1, i64 %10 - %16 = load i64, ptr %15, align 4 - %17 = call i32 (ptr, ...) @printf(ptr @9, i64 %16) + %19 = icmp slt i64 %17, 0 + %20 = icmp sge i64 %17, 5 + %21 = or i1 %20, %19 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %21) + %22 = getelementptr inbounds i64, ptr %1, i64 %17 + %23 = load i64, ptr %22, align 4 + %24 = call i32 (ptr, ...) @printf(ptr @9, i64 %23) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -284,46 +370,64 @@ _llgo_3: ; preds = %_llgo_1 define i32 @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort3a$1"(ptr %0, ptr %1) { _llgo_0: - %2 = load i64, ptr %0, align 4 - %3 = load i64, ptr %1, align 4 - %4 = sub i64 %2, %3 - %5 = trunc i64 %4 to i32 - ret i32 %5 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load i64, ptr %0, align 4 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %1, align 4 + %6 = sub i64 %3, %5 + %7 = trunc i64 %6 to i32 + ret i32 %7 } define void @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort3b"() { _llgo_0: %0 = call i32 (ptr, ...) @printf(ptr @10) %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 40) - %2 = getelementptr inbounds i64, ptr %1, i64 0 - %3 = getelementptr inbounds i64, ptr %1, i64 1 - %4 = getelementptr inbounds i64, ptr %1, i64 2 - %5 = getelementptr inbounds i64, ptr %1, i64 3 - %6 = getelementptr inbounds i64, ptr %1, i64 4 - store i64 100, ptr %2, align 4 - store i64 8, ptr %3, align 4 - store i64 23, ptr %4, align 4 - store i64 2, ptr %5, align 4 - store i64 7, ptr %6, align 4 - %7 = getelementptr inbounds i64, ptr %1, i64 0 - call void @qsort(ptr %7, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort3b$1") - %8 = load [5 x i64], ptr %1, align 4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds i64, ptr %1, i64 0 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds i64, ptr %1, i64 1 + %6 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds i64, ptr %1, i64 2 + %8 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds i64, ptr %1, i64 3 + %10 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds i64, ptr %1, i64 4 + store i64 100, ptr %3, align 4 + store i64 8, ptr %5, align 4 + store i64 23, ptr %7, align 4 + store i64 2, ptr %9, align 4 + store i64 7, ptr %11, align 4 + %12 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds i64, ptr %1, i64 0 + call void @qsort(ptr %13, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort3b$1") + %14 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load [5 x i64], ptr %1, align 4 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] - %10 = add i64 %9, 1 - %11 = icmp slt i64 %10, 5 - br i1 %11, label %_llgo_2, label %_llgo_3 + %16 = phi i64 [ -1, %_llgo_0 ], [ %17, %_llgo_2 ] + %17 = add i64 %16, 1 + %18 = icmp slt i64 %17, 5 + br i1 %18, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %12 = icmp slt i64 %10, 0 - %13 = icmp sge i64 %10, 5 - %14 = or i1 %13, %12 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %14) - %15 = getelementptr inbounds i64, ptr %1, i64 %10 - %16 = load i64, ptr %15, align 4 - %17 = call i32 (ptr, ...) @printf(ptr @11, i64 %16) + %19 = icmp slt i64 %17, 0 + %20 = icmp sge i64 %17, 5 + %21 = or i1 %20, %19 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %21) + %22 = getelementptr inbounds i64, ptr %1, i64 %17 + %23 = load i64, ptr %22, align 4 + %24 = call i32 (ptr, ...) @printf(ptr @11, i64 %23) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -332,46 +436,64 @@ _llgo_3: ; preds = %_llgo_1 define i32 @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort3b$1"(ptr %0, ptr %1) { _llgo_0: - %2 = load i64, ptr %0, align 4 - %3 = load i64, ptr %1, align 4 - %4 = sub i64 %2, %3 - %5 = trunc i64 %4 to i32 - ret i32 %5 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load i64, ptr %0, align 4 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %1, align 4 + %6 = sub i64 %3, %5 + %7 = trunc i64 %6 to i32 + ret i32 %7 } define void @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort4a"() { _llgo_0: %0 = call i32 (ptr, ...) @printf(ptr @12) %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 40) - %2 = getelementptr inbounds i64, ptr %1, i64 0 - %3 = getelementptr inbounds i64, ptr %1, i64 1 - %4 = getelementptr inbounds i64, ptr %1, i64 2 - %5 = getelementptr inbounds i64, ptr %1, i64 3 - %6 = getelementptr inbounds i64, ptr %1, i64 4 - store i64 100, ptr %2, align 4 - store i64 8, ptr %3, align 4 - store i64 23, ptr %4, align 4 - store i64 2, ptr %5, align 4 - store i64 7, ptr %6, align 4 - %7 = getelementptr inbounds i64, ptr %1, i64 0 - call void @qsort(ptr %7, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort4a$1") - %8 = load [5 x i64], ptr %1, align 4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds i64, ptr %1, i64 0 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds i64, ptr %1, i64 1 + %6 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds i64, ptr %1, i64 2 + %8 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds i64, ptr %1, i64 3 + %10 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds i64, ptr %1, i64 4 + store i64 100, ptr %3, align 4 + store i64 8, ptr %5, align 4 + store i64 23, ptr %7, align 4 + store i64 2, ptr %9, align 4 + store i64 7, ptr %11, align 4 + %12 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds i64, ptr %1, i64 0 + call void @qsort(ptr %13, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort4a$1") + %14 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load [5 x i64], ptr %1, align 4 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] - %10 = add i64 %9, 1 - %11 = icmp slt i64 %10, 5 - br i1 %11, label %_llgo_2, label %_llgo_3 + %16 = phi i64 [ -1, %_llgo_0 ], [ %17, %_llgo_2 ] + %17 = add i64 %16, 1 + %18 = icmp slt i64 %17, 5 + br i1 %18, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %12 = icmp slt i64 %10, 0 - %13 = icmp sge i64 %10, 5 - %14 = or i1 %13, %12 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %14) - %15 = getelementptr inbounds i64, ptr %1, i64 %10 - %16 = load i64, ptr %15, align 4 - %17 = call i32 (ptr, ...) @printf(ptr @13, i64 %16) + %19 = icmp slt i64 %17, 0 + %20 = icmp sge i64 %17, 5 + %21 = or i1 %20, %19 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %21) + %22 = getelementptr inbounds i64, ptr %1, i64 %17 + %23 = load i64, ptr %22, align 4 + %24 = call i32 (ptr, ...) @printf(ptr @13, i64 %23) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -380,46 +502,64 @@ _llgo_3: ; preds = %_llgo_1 define i32 @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort4a$1"(ptr %0, ptr %1) { _llgo_0: - %2 = load i64, ptr %0, align 4 - %3 = load i64, ptr %1, align 4 - %4 = sub i64 %2, %3 - %5 = trunc i64 %4 to i32 - ret i32 %5 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load i64, ptr %0, align 4 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %1, align 4 + %6 = sub i64 %3, %5 + %7 = trunc i64 %6 to i32 + ret i32 %7 } define void @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort4b"() { _llgo_0: %0 = call i32 (ptr, ...) @printf(ptr @14) %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 40) - %2 = getelementptr inbounds i64, ptr %1, i64 0 - %3 = getelementptr inbounds i64, ptr %1, i64 1 - %4 = getelementptr inbounds i64, ptr %1, i64 2 - %5 = getelementptr inbounds i64, ptr %1, i64 3 - %6 = getelementptr inbounds i64, ptr %1, i64 4 - store i64 100, ptr %2, align 4 - store i64 8, ptr %3, align 4 - store i64 23, ptr %4, align 4 - store i64 2, ptr %5, align 4 - store i64 7, ptr %6, align 4 - %7 = getelementptr inbounds i64, ptr %1, i64 0 - call void @qsort(ptr %7, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort4b$1") - %8 = load [5 x i64], ptr %1, align 4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds i64, ptr %1, i64 0 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds i64, ptr %1, i64 1 + %6 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds i64, ptr %1, i64 2 + %8 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds i64, ptr %1, i64 3 + %10 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds i64, ptr %1, i64 4 + store i64 100, ptr %3, align 4 + store i64 8, ptr %5, align 4 + store i64 23, ptr %7, align 4 + store i64 2, ptr %9, align 4 + store i64 7, ptr %11, align 4 + %12 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds i64, ptr %1, i64 0 + call void @qsort(ptr %13, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort4b$1") + %14 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load [5 x i64], ptr %1, align 4 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] - %10 = add i64 %9, 1 - %11 = icmp slt i64 %10, 5 - br i1 %11, label %_llgo_2, label %_llgo_3 + %16 = phi i64 [ -1, %_llgo_0 ], [ %17, %_llgo_2 ] + %17 = add i64 %16, 1 + %18 = icmp slt i64 %17, 5 + br i1 %18, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %12 = icmp slt i64 %10, 0 - %13 = icmp sge i64 %10, 5 - %14 = or i1 %13, %12 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %14) - %15 = getelementptr inbounds i64, ptr %1, i64 %10 - %16 = load i64, ptr %15, align 4 - %17 = call i32 (ptr, ...) @printf(ptr @15, i64 %16) + %19 = icmp slt i64 %17, 0 + %20 = icmp sge i64 %17, 5 + %21 = or i1 %20, %19 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %21) + %22 = getelementptr inbounds i64, ptr %1, i64 %17 + %23 = load i64, ptr %22, align 4 + %24 = call i32 (ptr, ...) @printf(ptr @15, i64 %23) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -428,46 +568,64 @@ _llgo_3: ; preds = %_llgo_1 define i32 @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort4b$1"(ptr %0, ptr %1) { _llgo_0: - %2 = load i64, ptr %0, align 4 - %3 = load i64, ptr %1, align 4 - %4 = sub i64 %2, %3 - %5 = trunc i64 %4 to i32 - ret i32 %5 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load i64, ptr %0, align 4 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %1, align 4 + %6 = sub i64 %3, %5 + %7 = trunc i64 %6 to i32 + ret i32 %7 } define void @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort5a"() { _llgo_0: %0 = call i32 (ptr, ...) @printf(ptr @16) %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 40) - %2 = getelementptr inbounds i64, ptr %1, i64 0 - %3 = getelementptr inbounds i64, ptr %1, i64 1 - %4 = getelementptr inbounds i64, ptr %1, i64 2 - %5 = getelementptr inbounds i64, ptr %1, i64 3 - %6 = getelementptr inbounds i64, ptr %1, i64 4 - store i64 100, ptr %2, align 4 - store i64 8, ptr %3, align 4 - store i64 23, ptr %4, align 4 - store i64 2, ptr %5, align 4 - store i64 7, ptr %6, align 4 - %7 = getelementptr inbounds i64, ptr %1, i64 0 - call void @qsort(ptr %7, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort5a$1") - %8 = load [5 x i64], ptr %1, align 4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds i64, ptr %1, i64 0 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds i64, ptr %1, i64 1 + %6 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds i64, ptr %1, i64 2 + %8 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds i64, ptr %1, i64 3 + %10 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds i64, ptr %1, i64 4 + store i64 100, ptr %3, align 4 + store i64 8, ptr %5, align 4 + store i64 23, ptr %7, align 4 + store i64 2, ptr %9, align 4 + store i64 7, ptr %11, align 4 + %12 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds i64, ptr %1, i64 0 + call void @qsort(ptr %13, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort5a$1") + %14 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load [5 x i64], ptr %1, align 4 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] - %10 = add i64 %9, 1 - %11 = icmp slt i64 %10, 5 - br i1 %11, label %_llgo_2, label %_llgo_3 + %16 = phi i64 [ -1, %_llgo_0 ], [ %17, %_llgo_2 ] + %17 = add i64 %16, 1 + %18 = icmp slt i64 %17, 5 + br i1 %18, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %12 = icmp slt i64 %10, 0 - %13 = icmp sge i64 %10, 5 - %14 = or i1 %13, %12 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %14) - %15 = getelementptr inbounds i64, ptr %1, i64 %10 - %16 = load i64, ptr %15, align 4 - %17 = call i32 (ptr, ...) @printf(ptr @17, i64 %16) + %19 = icmp slt i64 %17, 0 + %20 = icmp sge i64 %17, 5 + %21 = or i1 %20, %19 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %21) + %22 = getelementptr inbounds i64, ptr %1, i64 %17 + %23 = load i64, ptr %22, align 4 + %24 = call i32 (ptr, ...) @printf(ptr @17, i64 %23) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -476,46 +634,64 @@ _llgo_3: ; preds = %_llgo_1 define i32 @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort5a$1"(ptr %0, ptr %1) { _llgo_0: - %2 = load i64, ptr %0, align 4 - %3 = load i64, ptr %1, align 4 - %4 = sub i64 %2, %3 - %5 = trunc i64 %4 to i32 - ret i32 %5 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load i64, ptr %0, align 4 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %1, align 4 + %6 = sub i64 %3, %5 + %7 = trunc i64 %6 to i32 + ret i32 %7 } define void @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort5b"() { _llgo_0: %0 = call i32 (ptr, ...) @printf(ptr @18) %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 40) - %2 = getelementptr inbounds i64, ptr %1, i64 0 - %3 = getelementptr inbounds i64, ptr %1, i64 1 - %4 = getelementptr inbounds i64, ptr %1, i64 2 - %5 = getelementptr inbounds i64, ptr %1, i64 3 - %6 = getelementptr inbounds i64, ptr %1, i64 4 - store i64 100, ptr %2, align 4 - store i64 8, ptr %3, align 4 - store i64 23, ptr %4, align 4 - store i64 2, ptr %5, align 4 - store i64 7, ptr %6, align 4 - %7 = getelementptr inbounds i64, ptr %1, i64 0 - call void @qsort(ptr %7, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort5b$1") - %8 = load [5 x i64], ptr %1, align 4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds i64, ptr %1, i64 0 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds i64, ptr %1, i64 1 + %6 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds i64, ptr %1, i64 2 + %8 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds i64, ptr %1, i64 3 + %10 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds i64, ptr %1, i64 4 + store i64 100, ptr %3, align 4 + store i64 8, ptr %5, align 4 + store i64 23, ptr %7, align 4 + store i64 2, ptr %9, align 4 + store i64 7, ptr %11, align 4 + %12 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds i64, ptr %1, i64 0 + call void @qsort(ptr %13, i64 5, i64 8, ptr @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort5b$1") + %14 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = load [5 x i64], ptr %1, align 4 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] - %10 = add i64 %9, 1 - %11 = icmp slt i64 %10, 5 - br i1 %11, label %_llgo_2, label %_llgo_3 + %16 = phi i64 [ -1, %_llgo_0 ], [ %17, %_llgo_2 ] + %17 = add i64 %16, 1 + %18 = icmp slt i64 %17, 5 + br i1 %18, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %12 = icmp slt i64 %10, 0 - %13 = icmp sge i64 %10, 5 - %14 = or i1 %13, %12 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %14) - %15 = getelementptr inbounds i64, ptr %1, i64 %10 - %16 = load i64, ptr %15, align 4 - %17 = call i32 (ptr, ...) @printf(ptr @19, i64 %16) + %19 = icmp slt i64 %17, 0 + %20 = icmp sge i64 %17, 5 + %21 = or i1 %20, %19 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %21) + %22 = getelementptr inbounds i64, ptr %1, i64 %17 + %23 = load i64, ptr %22, align 4 + %24 = call i32 (ptr, ...) @printf(ptr @19, i64 %23) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -524,17 +700,23 @@ _llgo_3: ; preds = %_llgo_1 define i32 @"github.com/goplus/llgo/cl/_testrt/qsortfn.sort5b$1"(ptr %0, ptr %1) { _llgo_0: - %2 = load i64, ptr %0, align 4 - %3 = load i64, ptr %1, align 4 - %4 = sub i64 %2, %3 - %5 = trunc i64 %4 to i32 - ret i32 %5 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = load i64, ptr %0, align 4 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i64, ptr %1, align 4 + %6 = sub i64 %3, %5 + %7 = trunc i64 %6 to i32 + ret i32 %7 } declare i32 @printf(ptr, ...) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @qsort(ptr, i64, i64, ptr) declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1) diff --git a/cl/_testrt/slice2array/out.ll b/cl/_testrt/slice2array/out.ll index d2160ff927..98a2750ba0 100644 --- a/cl/_testrt/slice2array/out.ll +++ b/cl/_testrt/slice2array/out.ll @@ -21,86 +21,88 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/slice2array.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 4) - %1 = getelementptr inbounds i8, ptr %0, i64 0 - %2 = getelementptr inbounds i8, ptr %0, i64 1 - %3 = getelementptr inbounds i8, ptr %0, i64 2 - %4 = getelementptr inbounds i8, ptr %0, i64 3 - store i8 1, ptr %1, align 1 - store i8 2, ptr %2, align 1 - store i8 3, ptr %3, align 1 - store i8 4, ptr %4, align 1 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, i64 4, 1 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, i64 4, 2 - %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 1 - %9 = icmp slt i64 %8, 4 - br i1 %9, label %_llgo_1, label %_llgo_2 - -_llgo_1: ; preds = %_llgo_0 - %10 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PanicSliceConvert"(i64 %10, i64 4) - br label %_llgo_2 - -_llgo_2: ; preds = %_llgo_1, %_llgo_0 - %11 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7, 0 - %12 = load [4 x i8], ptr %0, align 1 - %13 = load [4 x i8], ptr %11, align 1 - %14 = extractvalue [4 x i8] %12, 0 - %15 = extractvalue [4 x i8] %13, 0 - %16 = icmp eq i8 %14, %15 - %17 = and i1 true, %16 - %18 = extractvalue [4 x i8] %12, 1 - %19 = extractvalue [4 x i8] %13, 1 - %20 = icmp eq i8 %18, %19 - %21 = and i1 %17, %20 - %22 = extractvalue [4 x i8] %12, 2 - %23 = extractvalue [4 x i8] %13, 2 - %24 = icmp eq i8 %22, %23 - %25 = and i1 %21, %24 - %26 = extractvalue [4 x i8] %12, 3 - %27 = extractvalue [4 x i8] %13, 3 - %28 = icmp eq i8 %26, %27 - %29 = and i1 %25, %28 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %29) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds i8, ptr %0, i64 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds i8, ptr %0, i64 1 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds i8, ptr %0, i64 2 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds i8, ptr %0, i64 3 + store i8 1, ptr %2, align 1 + store i8 2, ptr %4, align 1 + store i8 3, ptr %6, align 1 + store i8 4, ptr %8, align 1 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 + %10 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9, i64 4, 1 + %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %10, i64 4, 2 + %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.SliceToArrayPtr"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11, i64 4) + %13 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load [4 x i8], ptr %0, align 1 + %15 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %15) + %16 = load [4 x i8], ptr %12, align 1 + %17 = extractvalue [4 x i8] %14, 0 + %18 = extractvalue [4 x i8] %16, 0 + %19 = icmp eq i8 %17, %18 + %20 = and i1 true, %19 + %21 = extractvalue [4 x i8] %14, 1 + %22 = extractvalue [4 x i8] %16, 1 + %23 = icmp eq i8 %21, %22 + %24 = and i1 %20, %23 + %25 = extractvalue [4 x i8] %14, 2 + %26 = extractvalue [4 x i8] %16, 2 + %27 = icmp eq i8 %25, %26 + %28 = and i1 %24, %27 + %29 = extractvalue [4 x i8] %14, 3 + %30 = extractvalue [4 x i8] %16, 3 + %31 = icmp eq i8 %29, %30 + %32 = and i1 %28, %31 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %30 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 - %31 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %30, i64 4, 1 - %32 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %31, i64 4, 2 - %33 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %32, 1 - %34 = icmp slt i64 %33, 2 - br i1 %34, label %_llgo_3, label %_llgo_4 - -_llgo_3: ; preds = %_llgo_2 - %35 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %32, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PanicSliceConvert"(i64 %35, i64 2) - br label %_llgo_4 - -_llgo_4: ; preds = %_llgo_3, %_llgo_2 - %36 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %32, 0 - %37 = load [2 x i8], ptr %36, align 1 - %38 = alloca [2 x i8], align 1 - call void @llvm.memset(ptr %38, i8 0, i64 2, i1 false) - %39 = getelementptr inbounds i8, ptr %38, i64 0 - %40 = getelementptr inbounds i8, ptr %38, i64 1 - store i8 1, ptr %39, align 1 - store i8 2, ptr %40, align 1 - %41 = load [2 x i8], ptr %38, align 1 - %42 = extractvalue [2 x i8] %37, 0 - %43 = extractvalue [2 x i8] %41, 0 - %44 = icmp eq i8 %42, %43 - %45 = and i1 true, %44 - %46 = extractvalue [2 x i8] %37, 1 - %47 = extractvalue [2 x i8] %41, 1 + %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 + %34 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %33, i64 4, 1 + %35 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %34, i64 4, 2 + %36 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.SliceToArrayPtr"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %35, i64 2) + %37 = icmp eq ptr %36, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %37) + %38 = load [2 x i8], ptr %36, align 1 + %39 = alloca [2 x i8], align 1 + call void @llvm.memset(ptr %39, i8 0, i64 2, i1 false) + %40 = icmp eq ptr %39, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %40) + %41 = getelementptr inbounds i8, ptr %39, i64 0 + %42 = icmp eq ptr %39, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %42) + %43 = getelementptr inbounds i8, ptr %39, i64 1 + store i8 1, ptr %41, align 1 + store i8 2, ptr %43, align 1 + %44 = icmp eq ptr %39, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %44) + %45 = load [2 x i8], ptr %39, align 1 + %46 = extractvalue [2 x i8] %38, 0 + %47 = extractvalue [2 x i8] %45, 0 %48 = icmp eq i8 %46, %47 - %49 = and i1 %45, %48 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %49) + %49 = and i1 true, %48 + %50 = extractvalue [2 x i8] %38, 1 + %51 = extractvalue [2 x i8] %45, 1 + %52 = icmp eq i8 %50, %51 + %53 = and i1 %49, %52 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %53) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) -declare void @"github.com/goplus/llgo/runtime/internal/runtime.PanicSliceConvert"(i64, i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + +declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.SliceToArrayPtr"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice", i64) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1) diff --git a/cl/_testrt/slicelen/out.ll b/cl/_testrt/slicelen/out.ll index ed227745c9..9a0dc87b5c 100644 --- a/cl/_testrt/slicelen/out.ll +++ b/cl/_testrt/slicelen/out.ll @@ -1,6 +1,7 @@ ; ModuleID = 'github.com/goplus/llgo/cl/_testrt/slicelen' source_filename = "github.com/goplus/llgo/cl/_testrt/slicelen" +%"github.com/goplus/llgo/runtime/internal/runtime.Slice" = type { ptr, i64, i64 } %"github.com/goplus/llgo/runtime/internal/runtime.String" = type { ptr, i64 } @"github.com/goplus/llgo/cl/_testrt/slicelen.init$guard" = global i1 false, align 1 @@ -21,9 +22,12 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/slicelen.main"() { _llgo_0: - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 0) + %0 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.UnsafeSlice"(ptr null, i64 0, i64 8) + %1 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %0, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %1) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - br i1 false, label %_llgo_1, label %_llgo_2 + %2 = icmp sgt i64 %1, 0 + br i1 %2, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 7 }) @@ -34,6 +38,8 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } +declare %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.UnsafeSlice"(ptr, i64, i64) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) diff --git a/cl/_testrt/strlen/out.ll b/cl/_testrt/strlen/out.ll index 39381b7a51..97eaede054 100644 --- a/cl/_testrt/strlen/out.ll +++ b/cl/_testrt/strlen/out.ll @@ -24,6 +24,16 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"github.com/goplus/llgo/cl/_testrt/strlen.init$guard", align 1 call void @syscall.init() + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) store i8 72, ptr @"github.com/goplus/llgo/cl/_testrt/strlen.format", align 1 store i8 101, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testrt/strlen.format", i64 1), align 1 store i8 108, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testrt/strlen.format", i64 2), align 1 @@ -42,6 +52,7 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/strlen.main"() { _llgo_0: + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) %0 = call i32 @strlen(ptr @"github.com/goplus/llgo/cl/_testrt/strlen.format") call void (ptr, ...) @printf(ptr @"github.com/goplus/llgo/cl/_testrt/strlen.format", i32 %0) ret void @@ -49,6 +60,8 @@ _llgo_0: declare void @syscall.init() +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i32 @strlen(ptr) declare void @printf(ptr, ...) diff --git a/cl/_testrt/struct/out.ll b/cl/_testrt/struct/out.ll index 25667c31f9..5bf205f442 100644 --- a/cl/_testrt/struct/out.ll +++ b/cl/_testrt/struct/out.ll @@ -7,20 +7,30 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/struct" @"github.com/goplus/llgo/runtime/internal/runtime.cgoAlwaysFalse" = external global i1, align 1 @"github.com/goplus/llgo/cl/_testrt/struct.format" = global [10 x i8] zeroinitializer, align 1 @"github.com/goplus/llgo/cl/_testrt/struct.init$guard" = global i1 false, align 1 +@llvm.compiler.used = appending global [2 x ptr] [ptr @"github.com/goplus/llgo/cl/_testrt/struct.Foo.Print", ptr @"github.com/goplus/llgo/cl/_testrt/struct.(*Foo).Print"], section "llvm.metadata" define void @"github.com/goplus/llgo/cl/_testrt/struct.Foo.Print"(%"github.com/goplus/llgo/cl/_testrt/struct.Foo" %0) { _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testrt/struct.Foo", align 8 call void @llvm.memset(ptr %1, i8 0, i64 8, i1 false) store %"github.com/goplus/llgo/cl/_testrt/struct.Foo" %0, ptr %1, align 4 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/struct.Foo", ptr %1, i32 0, i32 1 - %3 = load i1, ptr %2, align 1 - br i1 %3, label %_llgo_1, label %_llgo_2 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/struct.Foo", ptr %1, i32 0, i32 1 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load i1, ptr %3, align 1 + br i1 %5, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/struct.Foo", ptr %1, i32 0, i32 0 - %5 = load i32, ptr %4, align 4 - call void (ptr, ...) @printf(ptr @"github.com/goplus/llgo/cl/_testrt/struct.format", i32 %5) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + %6 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/struct.Foo", ptr %1, i32 0, i32 0 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load i32, ptr %7, align 4 + call void (ptr, ...) @printf(ptr @"github.com/goplus/llgo/cl/_testrt/struct.format", i32 %9) br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 @@ -29,8 +39,10 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/struct.(*Foo).Print"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testrt/struct.Foo", ptr %0, align 4 - call void @"github.com/goplus/llgo/cl/_testrt/struct.Foo.Print"(%"github.com/goplus/llgo/cl/_testrt/struct.Foo" %1) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testrt/struct.Foo", ptr %0, align 4 + call void @"github.com/goplus/llgo/cl/_testrt/struct.Foo.Print"(%"github.com/goplus/llgo/cl/_testrt/struct.Foo" %2) ret void } @@ -51,6 +63,16 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"github.com/goplus/llgo/cl/_testrt/struct.init$guard", align 1 call void @syscall.init() + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) store i8 72, ptr @"github.com/goplus/llgo/cl/_testrt/struct.format", align 1 store i8 101, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testrt/struct.format", i64 1), align 1 store i8 108, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testrt/struct.format", i64 2), align 1 @@ -71,18 +93,26 @@ define void @"github.com/goplus/llgo/cl/_testrt/struct.main"() { _llgo_0: %0 = alloca %"github.com/goplus/llgo/cl/_testrt/struct.Foo", align 8 call void @llvm.memset(ptr %0, i8 0, i64 8, i1 false) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/struct.Foo", ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/struct.Foo", ptr %0, i32 0, i32 1 - store i32 100, ptr %1, align 4 - store i1 true, ptr %2, align 1 - %3 = load %"github.com/goplus/llgo/cl/_testrt/struct.Foo", ptr %0, align 4 - call void @"github.com/goplus/llgo/cl/_testrt/struct.Foo.Print"(%"github.com/goplus/llgo/cl/_testrt/struct.Foo" %3) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/struct.Foo", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/struct.Foo", ptr %0, i32 0, i32 1 + store i32 100, ptr %2, align 4 + store i1 true, ptr %4, align 1 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load %"github.com/goplus/llgo/cl/_testrt/struct.Foo", ptr %0, align 4 + call void @"github.com/goplus/llgo/cl/_testrt/struct.Foo.Print"(%"github.com/goplus/llgo/cl/_testrt/struct.Foo" %6) ret void } ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @printf(ptr, ...) declare void @syscall.init() diff --git a/cl/_testrt/sum/out.ll b/cl/_testrt/sum/out.ll index 66cf2dd81b..c488e19a5d 100644 --- a/cl/_testrt/sum/out.ll +++ b/cl/_testrt/sum/out.ll @@ -22,19 +22,27 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/sum.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %1 = getelementptr inbounds i64, ptr %0, i64 0 - store i64 1, ptr %1, align 4 - %2 = getelementptr inbounds i64, ptr %0, i64 1 - store i64 2, ptr %2, align 4 - %3 = getelementptr inbounds i64, ptr %0, i64 2 - store i64 3, ptr %3, align 4 - %4 = getelementptr inbounds i64, ptr %0, i64 3 - store i64 4, ptr %4, align 4 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 - %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %5, i64 4, 1 - %7 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %6, i64 4, 2 - %8 = call i64 @"github.com/goplus/llgo/cl/_testrt/sum.sum"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %7) - %9 = call i32 (ptr, ...) @printf(ptr @0, i64 %8) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds i64, ptr %0, i64 0 + store i64 1, ptr %2, align 4 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds i64, ptr %0, i64 1 + store i64 2, ptr %4, align 4 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds i64, ptr %0, i64 2 + store i64 3, ptr %6, align 4 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = getelementptr inbounds i64, ptr %0, i64 3 + store i64 4, ptr %8, align 4 + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %0, 0 + %10 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %9, i64 4, 1 + %11 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %10, i64 4, 2 + %12 = call i64 @"github.com/goplus/llgo/cl/_testrt/sum.sum"(%"github.com/goplus/llgo/runtime/internal/runtime.Slice" %11) + %13 = call i32 (ptr, ...) @printf(ptr @0, i64 %12) ret void } @@ -44,7 +52,7 @@ _llgo_0: br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %2 = phi i64 [ 0, %_llgo_0 ], [ %13, %_llgo_2 ] + %2 = phi i64 [ 0, %_llgo_0 ], [ %14, %_llgo_2 ] %3 = phi i64 [ -1, %_llgo_0 ], [ %4, %_llgo_2 ] %4 = add i64 %3, 1 %5 = icmp slt i64 %4, %1 @@ -58,8 +66,10 @@ _llgo_2: ; preds = %_llgo_1 %10 = or i1 %9, %8 call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %10) %11 = getelementptr inbounds i64, ptr %6, i64 %4 - %12 = load i64, ptr %11, align 4 - %13 = add i64 %2, %12 + %12 = icmp eq ptr %11, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = load i64, ptr %11, align 4 + %14 = add i64 %2, %13 br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -68,6 +78,8 @@ _llgo_3: ; preds = %_llgo_1 declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i32 @printf(ptr, ...) declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1) diff --git a/cl/_testrt/tpabi/out.ll b/cl/_testrt/tpabi/out.ll index 4b21f43520..795519413d 100644 --- a/cl/_testrt/tpabi/out.ll +++ b/cl/_testrt/tpabi/out.ll @@ -32,7 +32,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/tpabi" @7 = private unnamed_addr constant [6 x i8] c"string", align 1 @"*_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1323879264, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 6 }, ptr null }, ptr @_llgo_string }, align 8 @8 = private unnamed_addr constant [1 x i8] c"n", align 1 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 3 }, ptr @"*_llgo_int" }, align 8 @9 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"github.com/goplus/llgo/cl/_testrt/tpabi.struct$A2OTYqQyUOqOQ-i_F5iXeAKWtxeWGEuyeN7HCfULCDk$fields" = weak_odr constant [2 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 1 }, ptr @_llgo_string, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 1 }, ptr @_llgo_int, i64 16, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @@ -42,6 +42,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/tpabi" @12 = private unnamed_addr constant [20 x i8] c"interface { Demo() }", align 1 @"*_llgo_iface$BP0p_lUsEd-IbbtJVukGmgrdQkqzcoYzSiwgUvgFvUs" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 2055694132, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 20 }, ptr null }, ptr @"_llgo_iface$BP0p_lUsEd-IbbtJVukGmgrdQkqzcoYzSiwgUvgFvUs" }, align 8 @"_llgo_iface$BP0p_lUsEd-IbbtJVukGmgrdQkqzcoYzSiwgUvgFvUs$imethods" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.Imethod"] [%"github.com/goplus/llgo/runtime/abi.Imethod" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 4 }, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac" }], align 8 +@llvm.compiler.used = appending global [3 x ptr] [ptr @"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int].Info", ptr @"github.com/goplus/llgo/cl/_testrt/tpabi.(*T[string,int]).Demo", ptr @"github.com/goplus/llgo/cl/_testrt/tpabi.(*T[string,int]).Info"], section "llvm.metadata" define void @"github.com/goplus/llgo/cl/_testrt/tpabi.init"() { _llgo_0: @@ -60,81 +61,111 @@ define void @"github.com/goplus/llgo/cl/_testrt/tpabi.main"() { _llgo_0: %0 = alloca %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", align 8 call void @llvm.memset(ptr %0, i8 0, i64 24, i1 false) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %0, i32 0, i32 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 1 }, ptr %1, align 8 - store i64 1, ptr %2, align 4 - %3 = load %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %0, align 8 - %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 24) - store %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]" %3, ptr %4, align 8 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr undef }, ptr %4, 1 - %6 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %5, 0 - %7 = icmp eq ptr %6, @"_llgo_github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]" - br i1 %7, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %0, i32 0, i32 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 1 }, ptr %2, align 8 + store i64 1, ptr %4, align 4 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = load %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %0, align 8 + %7 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 24) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %8, ptr %0) + %9 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr undef }, ptr %8, 1 + %10 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %9, 0 + %11 = icmp eq ptr %10, @"_llgo_github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]" + br i1 %11, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %8 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %5, 1 - %9 = load %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %8, align 8 - %10 = extractvalue %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]" %9, 0 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %10) + %12 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %9, 1 + %13 = load %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %12, align 8 + %14 = extractvalue %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]" %13, 0 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %14) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) - %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %11, i32 0, i32 0 - %13 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %11, i32 0, i32 1 - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 5 }, ptr %12, align 8 - store i64 100, ptr %13, align 4 - %14 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$BP0p_lUsEd-IbbtJVukGmgrdQkqzcoYzSiwgUvgFvUs", ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]") - %15 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %14, 0 - %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %15, ptr %11, 1 - %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %16) - %18 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %16, 0 - %19 = getelementptr ptr, ptr %18, i64 3 - %20 = load ptr, ptr %19, align 8 - %21 = insertvalue { ptr, ptr } undef, ptr %20, 0 - %22 = insertvalue { ptr, ptr } %21, ptr %17, 1 - %23 = extractvalue { ptr, ptr } %22, 1 - %24 = extractvalue { ptr, ptr } %22, 0 - call void %24(ptr %23) - %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) - %26 = getelementptr inbounds i64, ptr %25, i64 0 - %27 = getelementptr inbounds i64, ptr %25, i64 1 - %28 = getelementptr inbounds i64, ptr %25, i64 2 - %29 = getelementptr inbounds i64, ptr %25, i64 3 - store i64 1, ptr %26, align 4 - store i64 2, ptr %27, align 4 - store i64 3, ptr %28, align 4 - store i64 4, ptr %29, align 4 - %30 = getelementptr [4 x i64], ptr %25, i64 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %30) + %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 24) + %16 = icmp eq ptr %15, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %16) + %17 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %15, i32 0, i32 0 + %18 = icmp eq ptr %15, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %15, i32 0, i32 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 5 }, ptr %17, align 8 + store i64 100, ptr %19, align 4 + %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$BP0p_lUsEd-IbbtJVukGmgrdQkqzcoYzSiwgUvgFvUs", ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]") + %21 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %20, 0 + %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %21, ptr %15, 1 + %23 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %22) + %24 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %22, 0 + %25 = getelementptr ptr, ptr %24, i64 3 + %26 = load ptr, ptr %25, align 8 + %27 = insertvalue { ptr, ptr } undef, ptr %26, 0 + %28 = insertvalue { ptr, ptr } %27, ptr %23, 1 + %29 = extractvalue { ptr, ptr } %28, 1 + %30 = extractvalue { ptr, ptr } %28, 0 + call void %30(ptr %29) + %31 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 32) + %32 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %32) + %33 = getelementptr inbounds i64, ptr %31, i64 0 + %34 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %34) + %35 = getelementptr inbounds i64, ptr %31, i64 1 + %36 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %36) + %37 = getelementptr inbounds i64, ptr %31, i64 2 + %38 = icmp eq ptr %31, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %38) + %39 = getelementptr inbounds i64, ptr %31, i64 3 + store i64 1, ptr %33, align 4 + store i64 2, ptr %35, align 4 + store i64 3, ptr %37, align 4 + store i64 4, ptr %39, align 4 + %40 = getelementptr [4 x i64], ptr %31, i64 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %40) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %31 = getelementptr [4 x i64], ptr %25, i64 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %31) + %41 = getelementptr [4 x i64], ptr %31, i64 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintPointer"(ptr %41) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void _llgo_2: ; preds = %_llgo_0 - %32 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 83 }, ptr %32, align 8 - %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %32, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %33) + %42 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @10, i64 83 }, ptr %42, align 8 + %43 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %42, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %43) unreachable } ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + define linkonce void @"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int].Info"(%"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]" %0) { _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", align 8 call void @llvm.memset(ptr %1, i8 0, i64 24, i1 false) store %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]" %0, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %1, i32 0, i32 0 - %3 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %2, align 8 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %1, i32 0, i32 1 - %5 = load i64, ptr %4, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %3) + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %1, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %3, align 8 + %6 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %1, i32 0, i32 1 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load i64, ptr %7, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %5) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %5) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %9) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -143,21 +174,31 @@ declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.structequal"(ptr, p define linkonce void @"github.com/goplus/llgo/cl/_testrt/tpabi.(*T[string,int]).Demo"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %0, i32 0, i32 0 - %2 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %1, align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %0, i32 0, i32 1 - %4 = load i64, ptr %3, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %2) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %2, align 8 + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %0, i32 0, i32 1 + %7 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = load i64, ptr %6, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %4) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %4) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %8) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } define linkonce void @"github.com/goplus/llgo/cl/_testrt/tpabi.(*T[string,int]).Info"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %0, align 8 - call void @"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int].Info"(%"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]" %1) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]", ptr %0, align 8 + call void @"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int].Info"(%"github.com/goplus/llgo/cl/_testrt/tpabi.T[string,int]" %2) ret void } @@ -187,6 +228,8 @@ _llgo_0: declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr, ptr, ptr) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface") declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String") diff --git a/cl/_testrt/tpfunc/out.ll b/cl/_testrt/tpfunc/out.ll index 9d7213a5c1..69c21b5019 100644 --- a/cl/_testrt/tpfunc/out.ll +++ b/cl/_testrt/tpfunc/out.ll @@ -29,24 +29,30 @@ _llgo_0: define void @"github.com/goplus/llgo/cl/_testrt/tpfunc.main$1"(ptr %0) { _llgo_0: - %1 = load i64, ptr %0, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %1) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load i64, ptr %0, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %2) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } define void @"github.com/goplus/llgo/cl/_testrt/tpfunc.main$2"(ptr %0) { _llgo_0: - %1 = load i64, ptr %0, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %1) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load i64, ptr %0, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %2) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } define void @"github.com/goplus/llgo/cl/_testrt/tpfunc.main$3"(ptr %0) { _llgo_0: - %1 = load i64, ptr %0, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %1) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load i64, ptr %0, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %2) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -61,4 +67,6 @@ declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64) declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64) diff --git a/cl/_testrt/tpmap/out.ll b/cl/_testrt/tpmap/out.ll index c1000c1607..7af9b87768 100644 --- a/cl/_testrt/tpmap/out.ll +++ b/cl/_testrt/tpmap/out.ll @@ -27,15 +27,15 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/tpmap" @"*_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -2132600452, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @1, i64 13 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey" }, align 8 @2 = private unnamed_addr constant [39 x i8] c"github.com/goplus/llgo/cl/_testrt/tpmap", align 1 @3 = private unnamed_addr constant [2 x i8] c"t1", align 1 -@"_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T1" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1406311802, i8 13, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T1" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 39 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T1" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -1406311802, i8 13, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T1" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 39 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @4 = private unnamed_addr constant [7 x i8] c"main.T1", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T1" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1360547137, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 7 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T1" }, align 8 @5 = private unnamed_addr constant [2 x i8] c"t2", align 1 -@"_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T2" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 335154174, i8 13, i8 8, i8 8, i8 57, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T2" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T2" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 39 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testrt/tpmap.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 39 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T2" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.StructType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.StructType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 335154174, i8 13, i8 8, i8 8, i8 25, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.structequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T2" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 7 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T2" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 39 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"github.com/goplus/llgo/cl/_testrt/tpmap.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields", i64 1, i64 1 } }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 39 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @6 = private unnamed_addr constant [7 x i8] c"main.T2", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T2" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -2100686654, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 7 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T2" }, align 8 @7 = private unnamed_addr constant [1 x i8] c"v", align 1 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 3 }, ptr @"*_llgo_int" }, align 8 @8 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"github.com/goplus/llgo/cl/_testrt/tpmap.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88$fields" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 1 }, ptr @_llgo_int, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @@ -49,7 +49,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/tpmap" @"github.com/goplus/llgo/cl/_testrt/tpmap.struct$op7q0963ur0ih9ul6OteH-C75UVydPxwKOVpX1hUjzo$fields" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 1 }, ptr @_llgo_any, i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @12 = private unnamed_addr constant [2 x i8] c"t4", align 1 @13 = private unnamed_addr constant [2 x i8] c"t5", align 1 -@_llgo_uintptr = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1268343028, i8 12, i8 8, i8 8, i8 44, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 7 }, ptr @"*_llgo_uintptr" }, align 8 +@_llgo_uintptr = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 1268343028, i8 12, i8 8, i8 8, i8 12, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 7 }, ptr @"*_llgo_uintptr" }, align 8 @14 = private unnamed_addr constant [7 x i8] c"uintptr", align 1 @"*_llgo_uintptr" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1684891952, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 7 }, ptr null }, ptr @_llgo_uintptr }, align 8 @"github.com/goplus/llgo/cl/_testrt/tpmap.struct$phCK-T684g3enhknCOfRlq7bWO8q6jPkTysM4zTiUJ8$fields" = weak_odr constant [5 x %"github.com/goplus/llgo/runtime/abi.StructField"] [%"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 2 }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T1", i64 0, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 2 }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T2", i64 8, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 2 }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.T3[any]", i64 16, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 2 }, ptr @"*_llgo_int", i64 32, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }, %"github.com/goplus/llgo/runtime/abi.StructField" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @13, i64 2 }, ptr @_llgo_uintptr, i64 40, %"github.com/goplus/llgo/runtime/internal/runtime.String" zeroinitializer, i1 false }], align 8 @@ -63,7 +63,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/tpmap" @"[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 307038632, i8 8, i8 1, i8 1, i8 17, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"[8]_llgo_uint8" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 8 }, ptr @"*[8]_llgo_uint8" }, ptr @_llgo_uint8, ptr @"[]_llgo_uint8", i64 8 }, align 8 @18 = private unnamed_addr constant [8 x i8] c"[8]uint8", align 1 @"*[8]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -566230779, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @18, i64 8 }, ptr null }, ptr @"[8]_llgo_uint8" }, align 8 -@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 40, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @19, i64 5 }, ptr @"*_llgo_uint8" }, align 8 +@_llgo_uint8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 269156761, i8 12, i8 1, i8 1, i8 8, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @19, i64 5 }, ptr @"*_llgo_uint8" }, align 8 @19 = private unnamed_addr constant [5 x i8] c"uint8", align 1 @"*_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1277858201, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @19, i64 5 }, ptr null }, ptr @_llgo_uint8 }, align 8 @"[]_llgo_uint8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 370346748, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 7 }, ptr @"*[]_llgo_uint8" }, ptr @_llgo_uint8 }, align 8 @@ -108,51 +108,89 @@ _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey]_llgo_string", i64 0) %1 = alloca %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", align 8 call void @llvm.memset(ptr %1, i8 0, i64 48, i1 false) - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %1, i32 0, i32 0 - %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %1, i32 0, i32 1 - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.T2", ptr %3, i32 0, i32 0 - %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %1, i32 0, i32 2 - %6 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.T3[any]", ptr %5, i32 0, i32 0 - %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %1, i32 0, i32 3 - %8 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %1, i32 0, i32 4 - store i64 0, ptr %2, align 4 - store i64 0, ptr %4, align 4 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr null }, ptr %6, align 8 - store ptr null, ptr %7, align 8 - store i64 0, ptr %8, align 4 - %9 = load %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %1, align 8 - %10 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 48) - store %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey" %9, ptr %10, align 8 - %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey]_llgo_string", ptr %0, ptr %10) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @29, i64 5 }, ptr %11, align 8 - %12 = alloca %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", align 8 - call void @llvm.memset(ptr %12, i8 0, i64 48, i1 false) - %13 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %12, i32 0, i32 0 - %14 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %12, i32 0, i32 1 - %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.T2", ptr %14, i32 0, i32 0 - %16 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %12, i32 0, i32 2 - %17 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.T3[any]", ptr %16, i32 0, i32 0 - %18 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %12, i32 0, i32 3 - %19 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %12, i32 0, i32 4 - store i64 0, ptr %13, align 4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %1, i32 0, i32 0 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %1, i32 0, i32 1 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.T2", ptr %5, i32 0, i32 0 + %8 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %1, i32 0, i32 2 + %10 = icmp eq ptr %9, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %10) + %11 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.T3[any]", ptr %9, i32 0, i32 0 + %12 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %12) + %13 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %1, i32 0, i32 3 + %14 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %14) + %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %1, i32 0, i32 4 + store i64 0, ptr %3, align 4 + store i64 0, ptr %7, align 4 + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 0, ptr %16, align 4 + %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %16, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %17, ptr %11, align 8 + store ptr null, ptr %13, align 8 store i64 0, ptr %15, align 4 - store %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr null }, ptr %17, align 8 - store ptr null, ptr %18, align 8 - store i64 0, ptr %19, align 4 - %20 = load %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %12, align 8 - %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 48) - store %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey" %20, ptr %21, align 8 - %22 = call { ptr, i1 } @"github.com/goplus/llgo/runtime/internal/runtime.MapAccess2"(ptr @"map[_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey]_llgo_string", ptr %0, ptr %21) - %23 = extractvalue { ptr, i1 } %22, 0 - %24 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %23, align 8 - %25 = extractvalue { ptr, i1 } %22, 1 - %26 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.String" %24, 0 - %27 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } %26, i1 %25, 1 - %28 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } %27, 0 - %29 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } %27, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %28) + %18 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = load %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %1, align 8 + %20 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 48) + store %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey" %19, ptr %20, align 8 + %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey]_llgo_string", ptr %0, ptr %20) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @29, i64 5 }, ptr %21, align 8 + %22 = alloca %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", align 8 + call void @llvm.memset(ptr %22, i8 0, i64 48, i1 false) + %23 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %23) + %24 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %22, i32 0, i32 0 + %25 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %25) + %26 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %22, i32 0, i32 1 + %27 = icmp eq ptr %26, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %27) + %28 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.T2", ptr %26, i32 0, i32 0 + %29 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %29) + %30 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %22, i32 0, i32 2 + %31 = icmp eq ptr %30, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %31) + %32 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.T3[any]", ptr %30, i32 0, i32 0 + %33 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %33) + %34 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %22, i32 0, i32 3 + %35 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %35) + %36 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %22, i32 0, i32 4 + store i64 0, ptr %24, align 4 + store i64 0, ptr %28, align 4 + %37 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 8) + store i64 0, ptr %37, align 4 + %38 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %37, 1 + store %"github.com/goplus/llgo/runtime/internal/runtime.eface" %38, ptr %32, align 8 + store ptr null, ptr %34, align 8 + store i64 0, ptr %36, align 4 + %39 = icmp eq ptr %22, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %39) + %40 = load %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey", ptr %22, align 8 + %41 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 48) + store %"github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey" %40, ptr %41, align 8 + %42 = call { ptr, i1 } @"github.com/goplus/llgo/runtime/internal/runtime.MapAccess2"(ptr @"map[_llgo_github.com/goplus/llgo/cl/_testrt/tpmap.cacheKey]_llgo_string", ptr %0, ptr %41) + %43 = extractvalue { ptr, i1 } %42, 0 + %44 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %43, align 8 + %45 = extractvalue { ptr, i1 } %42, 1 + %46 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.String" %44, 0 + %47 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } %46, i1 %45, 1 + %48 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } %47, 0 + %49 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.String", i1 } %47, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %48) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %29) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %49) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -208,6 +246,8 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.MakeMap"(ptr, i64) ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAssign"(ptr, ptr, ptr) diff --git a/cl/_testrt/tpmethod/out.ll b/cl/_testrt/tpmethod/out.ll index dafa1b61c9..a51726a038 100644 --- a/cl/_testrt/tpmethod/out.ll +++ b/cl/_testrt/tpmethod/out.ll @@ -72,6 +72,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/tpmethod" @20 = private unnamed_addr constant [79 x i8] c"interface { Then(struct { $f func(main.Tuple[error]); $data unsafe.Pointer }) }", align 1 @"*_llgo_iface$XcsCI4xRViVu44YvSfJySCCik7Xq487CpVScS6LGI70" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1232808231, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 79 }, ptr null }, ptr @"_llgo_iface$XcsCI4xRViVu44YvSfJySCCik7Xq487CpVScS6LGI70" }, align 8 @"_llgo_iface$XcsCI4xRViVu44YvSfJySCCik7Xq487CpVScS6LGI70$imethods" = weak_odr constant [1 x %"github.com/goplus/llgo/runtime/abi.Imethod"] [%"github.com/goplus/llgo/runtime/abi.Imethod" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @19, i64 4 }, ptr @"_llgo_func$YDtAFTesCi1EpIfGs4nqPSJzLIDwkg-8FAbVKMCx8cg" }], align 8 +@llvm.compiler.used = appending global [2 x ptr] [ptr @"github.com/goplus/llgo/cl/_testrt/tpmethod.(*future[github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]]).Then", ptr @"github.com/goplus/llgo/cl/_testrt/tpmethod.(*Tuple[error]).Get"], section "llvm.metadata" define %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testrt/tpmethod.ReadFile"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %0) { _llgo_0: @@ -83,12 +84,16 @@ define void @"github.com/goplus/llgo/cl/_testrt/tpmethod.ReadFile$1"({ ptr, ptr _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]", align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]", ptr %1, i32 0, i32 0 - store %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, ptr %2, align 8 - %3 = load %"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]", ptr %1, align 8 - %4 = extractvalue { ptr, ptr } %0, 1 - %5 = extractvalue { ptr, ptr } %0, 0 - call void %5(ptr %4, %"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]" %3) + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]", ptr %1, i32 0, i32 0 + store %"github.com/goplus/llgo/runtime/internal/runtime.iface" zeroinitializer, ptr %3, align 8 + %4 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]", ptr %1, align 8 + %6 = extractvalue { ptr, ptr } %0, 1 + %7 = extractvalue { ptr, ptr } %0, 0 + call void %7(ptr %6, %"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]" %5) ret void } @@ -131,12 +136,14 @@ _llgo_0: define linkonce %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testrt/tpmethod.Async[github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]]"({ ptr, ptr } %0) { _llgo_0: %1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmethod.future[github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]]", ptr %1, i32 0, i32 0 - store { ptr, ptr } %0, ptr %2, align 8 - %3 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$XcsCI4xRViVu44YvSfJySCCik7Xq487CpVScS6LGI70", ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/tpmethod.future[github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]]") - %4 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %3, 0 - %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %4, ptr %1, 1 - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmethod.future[github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]]", ptr %1, i32 0, i32 0 + store { ptr, ptr } %0, ptr %3, align 8 + %4 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$XcsCI4xRViVu44YvSfJySCCik7Xq487CpVScS6LGI70", ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/tpmethod.future[github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]]") + %5 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %4, 0 + %6 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5, ptr %1, 1 + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %6 } define linkonce void @"__llgo_stub.github.com/goplus/llgo/cl/_testrt/tpmethod.ReadFile$1"(ptr %0, { ptr, ptr } %1) { @@ -148,6 +155,8 @@ _llgo_0: ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface") define linkonce void @"__llgo_stub.github.com/goplus/llgo/cl/_testrt/tpmethod.main$1"(ptr %0, %"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]" %1) { @@ -161,9 +170,13 @@ _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]", align 8 call void @llvm.memset(ptr %1, i8 0, i64 16, i1 false) store %"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]" %0, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]", ptr %1, i32 0, i32 0 - %3 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %2, align 8 - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]", ptr %1, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load %"github.com/goplus/llgo/runtime/internal/runtime.iface", ptr %3, align 8 + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %5 } declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintIface"(%"github.com/goplus/llgo/runtime/internal/runtime.iface") @@ -174,11 +187,15 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) define linkonce void @"github.com/goplus/llgo/cl/_testrt/tpmethod.(*future[github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]]).Then"(ptr %0, { ptr, ptr } %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmethod.future[github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]]", ptr %0, i32 0, i32 0 - %3 = load { ptr, ptr }, ptr %2, align 8 - %4 = extractvalue { ptr, ptr } %3, 1 - %5 = extractvalue { ptr, ptr } %3, 0 - call void %5(ptr %4, { ptr, ptr } %1) + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpmethod.future[github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]]", ptr %0, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load { ptr, ptr }, ptr %3, align 8 + %6 = extractvalue { ptr, ptr } %5, 1 + %7 = extractvalue { ptr, ptr } %5, 0 + call void %7(ptr %6, { ptr, ptr } %1) ret void } @@ -194,9 +211,11 @@ declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.structequal"(ptr, p define linkonce %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testrt/tpmethod.(*Tuple[error]).Get"(ptr %0) { _llgo_0: - %1 = load %"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]", ptr %0, align 8 - %2 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error].Get"(%"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]" %1) - ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = load %"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]", ptr %0, align 8 + %3 = call %"github.com/goplus/llgo/runtime/internal/runtime.iface" @"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error].Get"(%"github.com/goplus/llgo/cl/_testrt/tpmethod.Tuple[error]" %2) + ret %"github.com/goplus/llgo/runtime/internal/runtime.iface" %3 } declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.interequal"(ptr, ptr) diff --git a/cl/_testrt/tpunsafe/out.ll b/cl/_testrt/tpunsafe/out.ll index 8073bf6211..aab5d6adcd 100644 --- a/cl/_testrt/tpunsafe/out.ll +++ b/cl/_testrt/tpunsafe/out.ll @@ -45,10 +45,14 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) define linkonce void @"github.com/goplus/llgo/cl/_testrt/tpunsafe.(*M[bool]).check"(ptr %0, i64 %1, i64 %2, i64 %3) { _llgo_0: - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.M[bool]", ptr %0, i32 0, i32 2 - %5 = load %"github.com/goplus/llgo/cl/_testrt/tpunsafe.N[bool]", ptr %4, align 1 - %6 = icmp ne i64 1, %1 - br i1 %6, label %_llgo_1, label %_llgo_2 + %4 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.M[bool]", ptr %0, i32 0, i32 2 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load %"github.com/goplus/llgo/cl/_testrt/tpunsafe.N[bool]", ptr %5, align 1 + %8 = icmp ne i64 1, %1 + br i1 %8, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 4 }) @@ -59,17 +63,21 @@ _llgo_1: ; preds = %_llgo_0 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %1) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 20 }, ptr %7, align 8 - %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %7, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %8) + %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 20 }, ptr %9, align 8 + %10 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %9, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %10) unreachable _llgo_2: ; preds = %_llgo_0 - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.M[bool]", ptr %0, i32 0, i32 2 - %10 = load %"github.com/goplus/llgo/cl/_testrt/tpunsafe.N[bool]", ptr %9, align 1 - %11 = icmp ne i64 8, %2 - br i1 %11, label %_llgo_3, label %_llgo_4 + %11 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.M[bool]", ptr %0, i32 0, i32 2 + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load %"github.com/goplus/llgo/cl/_testrt/tpunsafe.N[bool]", ptr %12, align 1 + %15 = icmp ne i64 8, %2 + br i1 %15, label %_llgo_3, label %_llgo_4 _llgo_3: ; preds = %_llgo_2 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 4 }) @@ -80,18 +88,24 @@ _llgo_3: ; preds = %_llgo_2 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %2) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 21 }, ptr %12, align 8 - %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %12, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %13) + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 21 }, ptr %16, align 8 + %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %16, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %17) unreachable _llgo_4: ; preds = %_llgo_2 - %14 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.M[bool]", ptr %0, i32 0, i32 2 - %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.N[bool]", ptr %14, i32 0, i32 1 - %16 = load i1, ptr %15, align 1 - %17 = icmp ne i64 1, %3 - br i1 %17, label %_llgo_5, label %_llgo_6 + %18 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.M[bool]", ptr %0, i32 0, i32 2 + %20 = icmp eq ptr %19, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.N[bool]", ptr %19, i32 0, i32 1 + %22 = icmp eq ptr %21, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %22) + %23 = load i1, ptr %21, align 1 + %24 = icmp ne i64 1, %3 + br i1 %24, label %_llgo_5, label %_llgo_6 _llgo_5: ; preds = %_llgo_4 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 4 }) @@ -102,10 +116,10 @@ _llgo_5: ; preds = %_llgo_4 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %3) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 21 }, ptr %18, align 8 - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %18, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %19) + %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 21 }, ptr %25, align 8 + %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %25, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %26) unreachable _llgo_6: ; preds = %_llgo_4 @@ -114,10 +128,14 @@ _llgo_6: ; preds = %_llgo_4 define linkonce void @"github.com/goplus/llgo/cl/_testrt/tpunsafe.(*M[int64]).check"(ptr %0, i64 %1, i64 %2, i64 %3) { _llgo_0: - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.M[int64]", ptr %0, i32 0, i32 2 - %5 = load %"github.com/goplus/llgo/cl/_testrt/tpunsafe.N[int64]", ptr %4, align 4 - %6 = icmp ne i64 8, %1 - br i1 %6, label %_llgo_1, label %_llgo_2 + %4 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.M[int64]", ptr %0, i32 0, i32 2 + %6 = icmp eq ptr %5, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = load %"github.com/goplus/llgo/cl/_testrt/tpunsafe.N[int64]", ptr %5, align 4 + %8 = icmp ne i64 8, %1 + br i1 %8, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 4 }) @@ -128,17 +146,21 @@ _llgo_1: ; preds = %_llgo_0 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %1) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 20 }, ptr %7, align 8 - %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %7, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %8) + %9 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 20 }, ptr %9, align 8 + %10 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %9, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %10) unreachable _llgo_2: ; preds = %_llgo_0 - %9 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.M[int64]", ptr %0, i32 0, i32 2 - %10 = load %"github.com/goplus/llgo/cl/_testrt/tpunsafe.N[int64]", ptr %9, align 4 - %11 = icmp ne i64 16, %2 - br i1 %11, label %_llgo_3, label %_llgo_4 + %11 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %11) + %12 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.M[int64]", ptr %0, i32 0, i32 2 + %13 = icmp eq ptr %12, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %13) + %14 = load %"github.com/goplus/llgo/cl/_testrt/tpunsafe.N[int64]", ptr %12, align 4 + %15 = icmp ne i64 16, %2 + br i1 %15, label %_llgo_3, label %_llgo_4 _llgo_3: ; preds = %_llgo_2 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 4 }) @@ -149,18 +171,24 @@ _llgo_3: ; preds = %_llgo_2 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %2) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %12 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 21 }, ptr %12, align 8 - %13 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %12, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %13) + %16 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 21 }, ptr %16, align 8 + %17 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %16, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %17) unreachable _llgo_4: ; preds = %_llgo_2 - %14 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.M[int64]", ptr %0, i32 0, i32 2 - %15 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.N[int64]", ptr %14, i32 0, i32 1 - %16 = load i64, ptr %15, align 4 - %17 = icmp ne i64 8, %3 - br i1 %17, label %_llgo_5, label %_llgo_6 + %18 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.M[int64]", ptr %0, i32 0, i32 2 + %20 = icmp eq ptr %19, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/tpunsafe.N[int64]", ptr %19, i32 0, i32 1 + %22 = icmp eq ptr %21, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %22) + %23 = load i64, ptr %21, align 4 + %24 = icmp ne i64 8, %3 + br i1 %24, label %_llgo_5, label %_llgo_6 _llgo_5: ; preds = %_llgo_4 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 4 }) @@ -171,16 +199,18 @@ _llgo_5: ; preds = %_llgo_4 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintUint"(i64 %3) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) - %18 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 21 }, ptr %18, align 8 - %19 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %18, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %19) + %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @4, i64 21 }, ptr %25, align 8 + %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %25, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %26) unreachable _llgo_6: ; preds = %_llgo_4 ret void } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintString"(%"github.com/goplus/llgo/runtime/internal/runtime.String") declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8) diff --git a/cl/_testrt/typalias/out.ll b/cl/_testrt/typalias/out.ll index 5ce7a11735..3b4a9fe7f6 100644 --- a/cl/_testrt/typalias/out.ll +++ b/cl/_testrt/typalias/out.ll @@ -9,14 +9,23 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/typalias" define void @"github.com/goplus/llgo/cl/_testrt/typalias.Print"(ptr %0) { _llgo_0: - %1 = getelementptr inbounds { i32, i1 }, ptr %0, i32 0, i32 1 - %2 = load i1, ptr %1, align 1 - br i1 %2, label %_llgo_1, label %_llgo_2 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i32, i1 }, ptr %0, i32 0, i32 1 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load i1, ptr %2, align 1 + br i1 %4, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %3 = getelementptr inbounds { i32, i1 }, ptr %0, i32 0, i32 0 - %4 = load i32, ptr %3, align 4 - call void (ptr, ...) @printf(ptr @"github.com/goplus/llgo/cl/_testrt/typalias.format", i32 %4) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + %5 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %5) + %6 = getelementptr inbounds { i32, i1 }, ptr %0, i32 0, i32 0 + %7 = icmp eq ptr %6, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %7) + %8 = load i32, ptr %6, align 4 + call void (ptr, ...) @printf(ptr @"github.com/goplus/llgo/cl/_testrt/typalias.format", i32 %8) br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 @@ -40,6 +49,16 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"github.com/goplus/llgo/cl/_testrt/typalias.init$guard", align 1 call void @syscall.init() + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 false) store i8 72, ptr @"github.com/goplus/llgo/cl/_testrt/typalias.format", align 1 store i8 101, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testrt/typalias.format", i64 1), align 1 store i8 108, ptr getelementptr inbounds (i8, ptr @"github.com/goplus/llgo/cl/_testrt/typalias.format", i64 2), align 1 @@ -59,14 +78,20 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @"github.com/goplus/llgo/cl/_testrt/typalias.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %1 = getelementptr inbounds { i32, i1 }, ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds { i32, i1 }, ptr %0, i32 0, i32 1 - store i32 100, ptr %1, align 4 - store i1 true, ptr %2, align 1 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds { i32, i1 }, ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = getelementptr inbounds { i32, i1 }, ptr %0, i32 0, i32 1 + store i32 100, ptr %2, align 4 + store i1 true, ptr %4, align 1 call void @"github.com/goplus/llgo/cl/_testrt/typalias.Print"(ptr %0) ret void } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare void @printf(ptr, ...) declare void @syscall.init() diff --git a/cl/_testrt/typed/out.ll b/cl/_testrt/typed/out.ll index 02e99d3eb4..d43febd40a 100644 --- a/cl/_testrt/typed/out.ll +++ b/cl/_testrt/typed/out.ll @@ -23,7 +23,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/typed" @"_llgo_github.com/goplus/llgo/cl/_testrt/typed.A" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.ArrayType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.ArrayType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 0, i32 -516701993, i8 13, i8 8, i8 8, i8 17, { ptr, ptr } { ptr @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal", ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/typed.A" }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 6 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/typed.A" }, ptr @_llgo_int, ptr @"[]_llgo_int", i64 2 }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 39 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @5 = private unnamed_addr constant [6 x i8] c"main.A", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testrt/typed.A" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1349224428, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @5, i64 6 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/typed.A" }, align 8 -@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 34, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, ptr @"*_llgo_int" }, align 8 +@_llgo_int = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 0, i32 -25294021, i8 12, i8 8, i8 8, i8 2, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal64", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, ptr @"*_llgo_int" }, align 8 @6 = private unnamed_addr constant [3 x i8] c"int", align 1 @"*_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -939606833, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 3 }, ptr null }, ptr @_llgo_int }, align 8 @"[]_llgo_int" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.SliceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 24, i64 8, i32 -1129561019, i8 0, i8 8, i8 8, i8 23, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr @"*[]_llgo_int" }, ptr @_llgo_int }, align 8 @@ -88,44 +88,60 @@ _llgo_5: ; preds = %_llgo_4, %_llgo_3 call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) %17 = alloca [2 x i64], align 8 call void @llvm.memset(ptr %17, i8 0, i64 16, i1 false) - %18 = getelementptr inbounds i64, ptr %17, i64 0 - %19 = getelementptr inbounds i64, ptr %17, i64 1 - store i64 1, ptr %18, align 4 - store i64 2, ptr %19, align 4 - %20 = load [2 x i64], ptr %17, align 4 - %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store [2 x i64] %20, ptr %21, align 4 - %22 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/typed.A", ptr undef }, ptr %21, 1 - %23 = alloca [2 x i64], align 8 - call void @llvm.memset(ptr %23, i8 0, i64 16, i1 false) - %24 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %22, 0 - %25 = icmp eq ptr %24, @"_llgo_github.com/goplus/llgo/cl/_testrt/typed.A" - br i1 %25, label %_llgo_6, label %_llgo_7 + %18 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %18) + %19 = getelementptr inbounds i64, ptr %17, i64 0 + %20 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %20) + %21 = getelementptr inbounds i64, ptr %17, i64 1 + store i64 1, ptr %19, align 4 + store i64 2, ptr %21, align 4 + %22 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %22) + %23 = load [2 x i64], ptr %17, align 4 + %24 = icmp eq ptr %17, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %24) + %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + call void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/typed.A", ptr %25, ptr %17) + %26 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/typed.A", ptr undef }, ptr %25, 1 + %27 = alloca [2 x i64], align 8 + call void @llvm.memset(ptr %27, i8 0, i64 16, i1 false) + %28 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %26, 0 + %29 = icmp eq ptr %28, @"_llgo_github.com/goplus/llgo/cl/_testrt/typed.A" + br i1 %29, label %_llgo_6, label %_llgo_7 _llgo_6: ; preds = %_llgo_5 - %26 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %22, 1 - %27 = load [2 x i64], ptr %26, align 4 - %28 = insertvalue { [2 x i64], i1 } undef, [2 x i64] %27, 0 - %29 = insertvalue { [2 x i64], i1 } %28, i1 true, 1 + %30 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %26, 1 + %31 = load [2 x i64], ptr %30, align 4 + %32 = insertvalue { [2 x i64], i1 } undef, [2 x i64] %31, 0 + %33 = insertvalue { [2 x i64], i1 } %32, i1 true, 1 br label %_llgo_8 _llgo_7: ; preds = %_llgo_5 br label %_llgo_8 _llgo_8: ; preds = %_llgo_7, %_llgo_6 - %30 = phi { [2 x i64], i1 } [ %29, %_llgo_6 ], [ zeroinitializer, %_llgo_7 ] - %31 = extractvalue { [2 x i64], i1 } %30, 0 - store [2 x i64] %31, ptr %23, align 4 - %32 = extractvalue { [2 x i64], i1 } %30, 1 - %33 = getelementptr inbounds i64, ptr %23, i64 0 - %34 = load i64, ptr %33, align 4 - %35 = getelementptr inbounds i64, ptr %23, i64 1 - %36 = load i64, ptr %35, align 4 - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %34) + %34 = phi { [2 x i64], i1 } [ %33, %_llgo_6 ], [ zeroinitializer, %_llgo_7 ] + %35 = extractvalue { [2 x i64], i1 } %34, 0 + store [2 x i64] %35, ptr %27, align 4 + %36 = extractvalue { [2 x i64], i1 } %34, 1 + %37 = icmp eq ptr %27, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %37) + %38 = getelementptr inbounds i64, ptr %27, i64 0 + %39 = icmp eq ptr %38, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %39) + %40 = load i64, ptr %38, align 4 + %41 = icmp eq ptr %27, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %41) + %42 = getelementptr inbounds i64, ptr %27, i64 1 + %43 = icmp eq ptr %42, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %43) + %44 = load i64, ptr %42, align 4 + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %40) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %36) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64 %44) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %32) + call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1 %36) call void @"github.com/goplus/llgo/runtime/internal/runtime.PrintByte"(i8 10) ret void } @@ -159,6 +175,8 @@ declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintBool"(i1) ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.arrayequal"(ptr, ptr, ptr) declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.memequal64"(ptr, ptr) @@ -169,6 +187,8 @@ _llgo_0: ret i1 %3 } +declare void @"github.com/goplus/llgo/runtime/internal/runtime.Typedmemmove"(ptr, ptr, ptr) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.PrintInt"(i64) attributes #0 = { nocallback nofree nounwind willreturn memory(argmem: write) } diff --git a/cl/_testrt/unsafe/out.ll b/cl/_testrt/unsafe/out.ll index b06cb5ae90..66f95e4737 100644 --- a/cl/_testrt/unsafe/out.ll +++ b/cl/_testrt/unsafe/out.ll @@ -130,97 +130,124 @@ _llgo_19: ; preds = %_llgo_18 unreachable _llgo_20: ; preds = %_llgo_18 - %20 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @2, i64 3 }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }) - %21 = xor i1 %20, true - br i1 %21, label %_llgo_21, label %_llgo_22 + %20 = call %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.UnsafeString"(ptr @2, i64 3) + %21 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %20, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @3, i64 3 }) + %22 = xor i1 %21, true + br i1 %22, label %_llgo_21, label %_llgo_22 _llgo_21: ; preds = %_llgo_20 - %22 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %22, align 8 - %23 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %22, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %23) + %23 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %23, align 8 + %24 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %23, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %24) unreachable _llgo_22: ; preds = %_llgo_20 - %24 = load i8, ptr @2, align 1 - %25 = icmp ne i8 %24, 97 - br i1 %25, label %_llgo_23, label %_llgo_26 + %25 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.String" %20, 0 + %26 = icmp eq ptr %25, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %26) + %27 = getelementptr inbounds i8, ptr %25, i64 0 + %28 = icmp eq ptr %27, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %28) + %29 = load i8, ptr %27, align 1 + %30 = icmp ne i8 %29, 97 + br i1 %30, label %_llgo_23, label %_llgo_26 _llgo_23: ; preds = %_llgo_25, %_llgo_26, %_llgo_22 - %26 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %26, align 8 - %27 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %26, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %27) + %31 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %31, align 8 + %32 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %31, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %32) unreachable _llgo_24: ; preds = %_llgo_25 - %28 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) - %29 = getelementptr inbounds i64, ptr %28, i64 0 - %30 = getelementptr inbounds i64, ptr %28, i64 1 - store i64 1, ptr %29, align 4 - store i64 2, ptr %30, align 4 - %31 = getelementptr inbounds i64, ptr %28, i64 0 - %32 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" undef, ptr %31, 0 - %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %32, i64 2, 1 - %34 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %33, i64 2, 2 - %35 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %34, 0 - %36 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %34, 1 - %37 = icmp sge i64 0, %36 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %37) - %38 = getelementptr inbounds i64, ptr %35, i64 0 - %39 = load i64, ptr %38, align 4 - %40 = icmp ne i64 %39, 1 - br i1 %40, label %_llgo_27, label %_llgo_29 + %33 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) + %34 = icmp eq ptr %33, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %34) + %35 = getelementptr inbounds i64, ptr %33, i64 0 + %36 = icmp eq ptr %33, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %36) + %37 = getelementptr inbounds i64, ptr %33, i64 1 + store i64 1, ptr %35, align 4 + store i64 2, ptr %37, align 4 + %38 = icmp eq ptr %33, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %38) + %39 = getelementptr inbounds i64, ptr %33, i64 0 + %40 = call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.UnsafeSlice"(ptr %39, i64 2, i64 8) + %41 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %40, 0 + %42 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %40, 1 + %43 = icmp sge i64 0, %42 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %43) + %44 = getelementptr inbounds i64, ptr %41, i64 0 + %45 = icmp eq ptr %44, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %45) + %46 = load i64, ptr %44, align 4 + %47 = icmp ne i64 %46, 1 + br i1 %47, label %_llgo_27, label %_llgo_29 _llgo_25: ; preds = %_llgo_26 - %41 = load i8, ptr getelementptr inbounds (i8, ptr @2, i64 2), align 1 - %42 = icmp ne i8 %41, 99 - br i1 %42, label %_llgo_23, label %_llgo_24 + %48 = icmp eq ptr %25, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %48) + %49 = getelementptr inbounds i8, ptr %25, i64 2 + %50 = icmp eq ptr %49, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %50) + %51 = load i8, ptr %49, align 1 + %52 = icmp ne i8 %51, 99 + br i1 %52, label %_llgo_23, label %_llgo_24 _llgo_26: ; preds = %_llgo_22 - %43 = load i8, ptr getelementptr inbounds (i8, ptr @2, i64 1), align 1 - %44 = icmp ne i8 %43, 98 - br i1 %44, label %_llgo_23, label %_llgo_25 + %53 = icmp eq ptr %25, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %53) + %54 = getelementptr inbounds i8, ptr %25, i64 1 + %55 = icmp eq ptr %54, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %55) + %56 = load i8, ptr %54, align 1 + %57 = icmp ne i8 %56, 98 + br i1 %57, label %_llgo_23, label %_llgo_25 _llgo_27: ; preds = %_llgo_29, %_llgo_24 - %45 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %45, align 8 - %46 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %45, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %46) + %58 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %58, align 8 + %59 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %58, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %59) unreachable _llgo_28: ; preds = %_llgo_29 - %47 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %34, 0 - %48 = load i64, ptr %47, align 4 - %49 = icmp ne i64 %48, 1 - br i1 %49, label %_llgo_30, label %_llgo_31 + %60 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %40, 0 + %61 = icmp eq ptr %60, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %61) + %62 = load i64, ptr %60, align 4 + %63 = icmp ne i64 %62, 1 + br i1 %63, label %_llgo_30, label %_llgo_31 _llgo_29: ; preds = %_llgo_24 - %50 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %34, 0 - %51 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %34, 1 - %52 = icmp sge i64 1, %51 - call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %52) - %53 = getelementptr inbounds i64, ptr %50, i64 1 - %54 = load i64, ptr %53, align 4 - %55 = icmp ne i64 %54, 2 - br i1 %55, label %_llgo_27, label %_llgo_28 + %64 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %40, 0 + %65 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.Slice" %40, 1 + %66 = icmp sge i64 1, %65 + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1 %66) + %67 = getelementptr inbounds i64, ptr %64, i64 1 + %68 = icmp eq ptr %67, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %68) + %69 = load i64, ptr %67, align 4 + %70 = icmp ne i64 %69, 2 + br i1 %70, label %_llgo_27, label %_llgo_28 _llgo_30: ; preds = %_llgo_28 - %56 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %56, align 8 - %57 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %56, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %57) + %71 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %71, align 8 + %72 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %71, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %72) unreachable _llgo_31: ; preds = %_llgo_28 - %58 = icmp ne i64 ptrtoint (ptr getelementptr (i8, ptr null, i64 1) to i64), 1 - br i1 %58, label %_llgo_32, label %_llgo_33 + %73 = icmp ne i64 ptrtoint (ptr getelementptr (i8, ptr null, i64 1) to i64), 1 + br i1 %73, label %_llgo_32, label %_llgo_33 _llgo_32: ; preds = %_llgo_31 - %59 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %59, align 8 - %60 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %59, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %60) + %74 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %74, align 8 + %75 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %74, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %75) unreachable _llgo_33: ; preds = %_llgo_31 @@ -247,8 +274,14 @@ declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64) declare void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface") +declare %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/runtime/internal/runtime.UnsafeString"(ptr, i64) + declare i1 @"github.com/goplus/llgo/runtime/internal/runtime.StringEqual"(%"github.com/goplus/llgo/runtime/internal/runtime.String", %"github.com/goplus/llgo/runtime/internal/runtime.String") +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) +declare %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.UnsafeSlice"(ptr, i64, i64) + declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertIndexRange"(i1) diff --git a/cl/_testrt/vamethod/out.ll b/cl/_testrt/vamethod/out.ll index 4995830cc2..b088f79a7b 100644 --- a/cl/_testrt/vamethod/out.ll +++ b/cl/_testrt/vamethod/out.ll @@ -28,7 +28,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/vamethod" @5 = private unnamed_addr constant [1 x i8] c"T", align 1 @"*_llgo_github.com/goplus/llgo/cl/_testrt/vamethod.T" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.PtrType", %"github.com/goplus/llgo/runtime/abi.UncommonType", [1 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1837201360, i8 11, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 6 }, ptr null }, ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/vamethod.T" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 42 }, i16 1, i16 1, i32 24 }, [1 x %"github.com/goplus/llgo/runtime/abi.Method"] [%"github.com/goplus/llgo/runtime/abi.Method" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @8, i64 6 }, ptr @"_llgo_func$sSO5Bw-E3E7TeJqIJF_OmmojTYyqWBhYrUwNYJNw7Bs", ptr @printf, ptr @printf }] }, align 8 @6 = private unnamed_addr constant [6 x i8] c"main.T", align 1 -@"_llgo_github.com/goplus/llgo/cl/_testrt/vamethod.T" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 1351157490, i8 13, i8 1, i8 1, i8 35, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 6 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/vamethod.T" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 42 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 +@"_llgo_github.com/goplus/llgo/cl/_testrt/vamethod.T" = weak_odr constant { %"github.com/goplus/llgo/runtime/abi.Type", %"github.com/goplus/llgo/runtime/abi.UncommonType", [0 x %"github.com/goplus/llgo/runtime/abi.Method"] } { %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 1351157490, i8 13, i8 1, i8 1, i8 3, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @6, i64 6 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/vamethod.T" }, %"github.com/goplus/llgo/runtime/abi.UncommonType" { %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 42 }, i16 0, i16 0, i32 24 }, [0 x %"github.com/goplus/llgo/runtime/abi.Method"] zeroinitializer }, align 8 @7 = private unnamed_addr constant [42 x i8] c"github.com/goplus/llgo/cl/_testrt/vamethod", align 1 @8 = private unnamed_addr constant [6 x i8] c"Printf", align 1 @"_llgo_func$sSO5Bw-E3E7TeJqIJF_OmmojTYyqWBhYrUwNYJNw7Bs" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.FuncType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 662737340, i8 16, i8 8, i8 8, i8 51, { ptr, ptr } zeroinitializer, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @9, i64 27 }, ptr @"*_llgo_func$sSO5Bw-E3E7TeJqIJF_OmmojTYyqWBhYrUwNYJNw7Bs" }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$sSO5Bw-E3E7TeJqIJF_OmmojTYyqWBhYrUwNYJNw7Bs$in", i64 1, i64 1 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_func$sSO5Bw-E3E7TeJqIJF_OmmojTYyqWBhYrUwNYJNw7Bs$out", i64 1, i64 1 } }, align 8 @@ -41,7 +41,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/vamethod" @11 = private unnamed_addr constant [12 x i8] c"interface {}", align 1 @"*_llgo_any" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 1741196194, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @11, i64 12 }, ptr null }, ptr @_llgo_any }, align 8 @"_llgo_func$sSO5Bw-E3E7TeJqIJF_OmmojTYyqWBhYrUwNYJNw7Bs$in" = weak_odr constant [1 x ptr] [ptr @"[]_llgo_any"], align 8 -@_llgo_int32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 1448558410, i8 12, i8 4, i8 4, i8 37, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 5 }, ptr @"*_llgo_int32" }, align 8 +@_llgo_int32 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 4, i64 0, i32 1448558410, i8 12, i8 4, i8 4, i8 5, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal32", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 5 }, ptr @"*_llgo_int32" }, align 8 @12 = private unnamed_addr constant [5 x i8] c"int32", align 1 @"*_llgo_int32" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -38689692, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @12, i64 5 }, ptr null }, ptr @_llgo_int32 }, align 8 @"_llgo_func$sSO5Bw-E3E7TeJqIJF_OmmojTYyqWBhYrUwNYJNw7Bs$out" = weak_odr constant [1 x ptr] [ptr @_llgo_int32], align 8 @@ -52,7 +52,7 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/vamethod" @"*_llgo_func$vAfTC3ZLX0_lZI-ZNliu0_DkE266FSmKXxj_cqKPPkA" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 296663121, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @14, i64 11 }, ptr null }, ptr @"_llgo_func$vAfTC3ZLX0_lZI-ZNliu0_DkE266FSmKXxj_cqKPPkA" }, align 8 @"*_llgo_int8" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1399554408, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 4 }, ptr null }, ptr @_llgo_int8 }, align 8 @15 = private unnamed_addr constant [4 x i8] c"int8", align 1 -@_llgo_int8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 1444672578, i8 12, i8 1, i8 1, i8 35, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 4 }, ptr @"*_llgo_int8" }, align 8 +@_llgo_int8 = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 1, i64 0, i32 1444672578, i8 12, i8 1, i8 1, i8 3, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequal8", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @15, i64 4 }, ptr @"*_llgo_int8" }, align 8 @"_llgo_func$vAfTC3ZLX0_lZI-ZNliu0_DkE266FSmKXxj_cqKPPkA$in" = weak_odr constant [1 x ptr] [ptr @"*_llgo_int8"], align 8 @"_llgo_github.com/goplus/llgo/cl/_testrt/vamethod.IFmt" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.InterfaceType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 16, i32 2061345303, i8 4, i8 8, i8 8, i8 20, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.interequal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @16, i64 9 }, ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/vamethod.IFmt" }, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @7, i64 42 }, %"github.com/goplus/llgo/runtime/internal/runtime.Slice" { ptr @"_llgo_iface$a85zs5wWQQoPIERm_en8plssh4spdIeeXZPC-E0TDh0$imethods", i64 2, i64 2 } }, align 8 @16 = private unnamed_addr constant [9 x i8] c"main.IFmt", align 1 @@ -67,30 +67,41 @@ source_filename = "github.com/goplus/llgo/cl/_testrt/vamethod" @_llgo_string = weak_odr constant %"github.com/goplus/llgo/runtime/abi.Type" { i64 16, i64 8, i32 1749264893, i8 4, i8 8, i8 8, i8 24, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.strequal", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @21, i64 6 }, ptr @"*_llgo_string" }, align 8 @21 = private unnamed_addr constant [6 x i8] c"string", align 1 @"*_llgo_string" = weak_odr constant %"github.com/goplus/llgo/runtime/abi.PtrType" { %"github.com/goplus/llgo/runtime/abi.Type" { i64 8, i64 8, i32 -1323879264, i8 10, i8 8, i8 8, i8 54, { ptr, ptr } { ptr @"__llgo_stub.github.com/goplus/llgo/runtime/internal/runtime.memequalptr", ptr null }, ptr null, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @21, i64 6 }, ptr null }, ptr @_llgo_string }, align 8 +@llvm.compiler.used = appending global [3 x ptr] [ptr @"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt.Printf", ptr @"github.com/goplus/llgo/cl/_testrt/vamethod.(*CFmt).Printf", ptr @"github.com/goplus/llgo/cl/_testrt/vamethod.(*CFmt).SetFormat"], section "llvm.metadata" define i32 @"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt.Printf"(%"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt" %0, ...) { _llgo_0: %1 = alloca %"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt", align 8 call void @llvm.memset(ptr %1, i8 0, i64 8, i1 false) store %"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt" %0, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt", ptr %1, i32 0, i32 0 - %3 = load ptr, ptr %2, align 8 - %4 = call i32 (ptr, ...) @printf(ptr %3) - ret i32 %4 + %2 = icmp eq ptr %1, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt", ptr %1, i32 0, i32 0 + %4 = icmp eq ptr %3, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %4) + %5 = load ptr, ptr %3, align 8 + %6 = call i32 (ptr, ...) @printf(ptr %5) + ret i32 %6 } define i32 @"github.com/goplus/llgo/cl/_testrt/vamethod.(*CFmt).Printf"(ptr %0, ...) { _llgo_0: - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt", ptr %0, i32 0, i32 0 - %2 = load ptr, ptr %1, align 8 - %3 = call i32 (ptr, ...) @printf(ptr %2) - ret i32 %3 + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call i32 (ptr, ...) @printf(ptr %4) + ret i32 %5 } define void @"github.com/goplus/llgo/cl/_testrt/vamethod.(*CFmt).SetFormat"(ptr %0, ptr %1) { _llgo_0: - %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt", ptr %0, i32 0, i32 0 - store ptr %1, ptr %2, align 8 + %2 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %2) + %3 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt", ptr %0, i32 0, i32 0 + store ptr %1, ptr %3, align 8 ret void } @@ -111,69 +122,79 @@ define void @"github.com/goplus/llgo/cl/_testrt/vamethod.main"() { _llgo_0: %0 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) call void @"github.com/goplus/llgo/cl/_testrt/vamethod.(*CFmt).SetFormat"(ptr %0, ptr @0) - %1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt", ptr %0, i32 0, i32 0 - %2 = load ptr, ptr %1, align 8 - %3 = call i32 (ptr, ...) @printf(ptr %2, ptr @1, i64 100) + %1 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %1) + %2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt", ptr %0, i32 0, i32 0 + %3 = icmp eq ptr %2, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %3) + %4 = load ptr, ptr %2, align 8 + %5 = call i32 (ptr, ...) @printf(ptr %4, ptr @1, i64 100) call void @"github.com/goplus/llgo/cl/_testrt/vamethod.(*CFmt).SetFormat"(ptr %0, ptr @2) - %4 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt", ptr %0, i32 0, i32 0 - %5 = load ptr, ptr %4, align 8 - %6 = call i32 (ptr, ...) @printf(ptr %5, i64 200, ptr @3) - %7 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) - %8 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/vamethod.CFmt", ptr undef }, ptr %7, 1 - %9 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %8, 0 - %10 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/vamethod.IFmt", ptr %9) - br i1 %10, label %_llgo_3, label %_llgo_4 + %6 = icmp eq ptr %0, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %6) + %7 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testrt/vamethod.CFmt", ptr %0, i32 0, i32 0 + %8 = icmp eq ptr %7, null + call void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1 %8) + %9 = load ptr, ptr %7, align 8 + %10 = call i32 (ptr, ...) @printf(ptr %9, i64 200, ptr @3) + %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) + %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/vamethod.CFmt", ptr undef }, ptr %11, 1 + %13 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %12, 0 + %14 = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.Implements"(ptr @"_llgo_github.com/goplus/llgo/cl/_testrt/vamethod.IFmt", ptr %13) + br i1 %14, label %_llgo_3, label %_llgo_4 _llgo_1: ; preds = %_llgo_5 - %11 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 5 }, ptr %11, align 8 - %12 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %11, 1 - call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %12) + %15 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @20, i64 5 }, ptr %15, align 8 + %16 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %15, 1 + call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic"(%"github.com/goplus/llgo/runtime/internal/runtime.eface" %16) unreachable _llgo_2: ; preds = %_llgo_5 - %13 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %37) - %14 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %37, 0 - %15 = getelementptr ptr, ptr %14, i64 4 - %16 = load ptr, ptr %15, align 8 - %17 = insertvalue { ptr, ptr } undef, ptr %16, 0 - %18 = insertvalue { ptr, ptr } %17, ptr %13, 1 - %19 = extractvalue { ptr, ptr } %18, 1 - %20 = extractvalue { ptr, ptr } %18, 0 - call void %20(ptr %19, ptr @18) - %21 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %37) - %22 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %37, 0 - %23 = getelementptr ptr, ptr %22, i64 3 - %24 = load ptr, ptr %23, align 8 - %25 = insertvalue { ptr, ptr } undef, ptr %24, 0 - %26 = insertvalue { ptr, ptr } %25, ptr %21, 1 - %27 = extractvalue { ptr, ptr } %26, 1 - %28 = extractvalue { ptr, ptr } %26, 0 - %29 = call i32 (ptr, ...) %28(ptr %27, ptr @19, i64 100, i64 200) + %17 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %41) + %18 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %41, 0 + %19 = getelementptr ptr, ptr %18, i64 4 + %20 = load ptr, ptr %19, align 8 + %21 = insertvalue { ptr, ptr } undef, ptr %20, 0 + %22 = insertvalue { ptr, ptr } %21, ptr %17, 1 + %23 = extractvalue { ptr, ptr } %22, 1 + %24 = extractvalue { ptr, ptr } %22, 0 + call void %24(ptr %23, ptr @18) + %25 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %41) + %26 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %41, 0 + %27 = getelementptr ptr, ptr %26, i64 3 + %28 = load ptr, ptr %27, align 8 + %29 = insertvalue { ptr, ptr } undef, ptr %28, 0 + %30 = insertvalue { ptr, ptr } %29, ptr %25, 1 + %31 = extractvalue { ptr, ptr } %30, 1 + %32 = extractvalue { ptr, ptr } %30, 0 + %33 = call i32 (ptr, ...) %32(ptr %31, ptr @19, i64 100, i64 200) ret void _llgo_3: ; preds = %_llgo_0 - %30 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %8, 1 - %31 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$a85zs5wWQQoPIERm_en8plssh4spdIeeXZPC-E0TDh0", ptr %9) - %32 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %31, 0 - %33 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %32, ptr %30, 1 - %34 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %33, 0 - %35 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %34, i1 true, 1 + %34 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.eface" %12, 1 + %35 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$a85zs5wWQQoPIERm_en8plssh4spdIeeXZPC-E0TDh0", ptr %13) + %36 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" undef, ptr %35, 0 + %37 = insertvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %36, ptr %34, 1 + %38 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } undef, %"github.com/goplus/llgo/runtime/internal/runtime.iface" %37, 0 + %39 = insertvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %38, i1 true, 1 br label %_llgo_5 _llgo_4: ; preds = %_llgo_0 br label %_llgo_5 _llgo_5: ; preds = %_llgo_4, %_llgo_3 - %36 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %35, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] - %37 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %36, 0 - %38 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %36, 1 - br i1 %38, label %_llgo_2, label %_llgo_1 + %40 = phi { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } [ %39, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] + %41 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %40, 0 + %42 = extractvalue { %"github.com/goplus/llgo/runtime/internal/runtime.iface", i1 } %40, 1 + br i1 %42, label %_llgo_2, label %_llgo_1 } ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write) declare void @llvm.memset(ptr nocapture writeonly, i8, i64, i1 immarg) #0 +declare void @"github.com/goplus/llgo/runtime/internal/runtime.AssertNilDeref"(i1) + declare i32 @printf(ptr, ...) declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64) diff --git a/cl/compile.go b/cl/compile.go index 8cc83bdf95..cd3b090609 100644 --- a/cl/compile.go +++ b/cl/compile.go @@ -197,6 +197,117 @@ func (p *context) rewriteInitStore(store *ssa.Store, g *ssa.Global) (string, boo return value, true } +func isUntypedNil(t types.Type) bool { + basic, ok := types.Unalias(t).(*types.Basic) + return ok && basic.Kind() == types.UntypedNil +} + +func makeSliceAllocCap(v ssa.Value) (int64, bool) { + alloc, ok := v.(*ssa.Alloc) + if !ok || alloc.Comment != "makeslice" { + return 0, false + } + ptr, ok := alloc.Type().(*types.Pointer) + if !ok { + return 0, false + } + arr, ok := types.Unalias(ptr.Elem()).(*types.Array) + if !ok { + return 0, false + } + return arr.Len(), true +} + +func skipMakeSliceAlloc(v *ssa.Alloc) bool { + if _, ok := makeSliceAllocCap(v); !ok { + return false + } + refs := *v.Referrers() + if len(refs) != 1 { + return false + } + slice, ok := refs[0].(*ssa.Slice) + if !ok { + return false + } + return slice.X == v && slice.Low == nil && slice.Max == nil +} + +func singleRef(v ssa.Value) (ssa.Instruction, bool) { + refs := v.Referrers() + if refs == nil { + return nil, false + } + var ref ssa.Instruction + n := 0 + for _, item := range *refs { + if _, ok := item.(*ssa.DebugRef); ok { + continue + } + ref = item + n++ + } + return ref, n == 1 +} + +func isSendInstr(instr ssa.Instruction) bool { + _, ok := instr.(*ssa.Send) + return ok +} + +func (p *context) compileSingleUseMakeSliceSend(b llssa.Builder, ch llssa.Expr, v ssa.Value) bool { + ref, ok := singleRef(v) + if !ok || !isSendInstr(ref) { + return false + } + voidPtr := types.Typ[types.UnsafePointer] + intTyp := types.Typ[types.Int] + makeSliceToFn := b.Pkg.NewFunc(llssa.PkgRuntime+".MakeSliceTo", + types.NewSignatureType(nil, nil, nil, types.NewTuple( + types.NewParam(token.NoPos, nil, "", voidPtr), + types.NewParam(token.NoPos, nil, "", intTyp), + types.NewParam(token.NoPos, nil, "", intTyp), + types.NewParam(token.NoPos, nil, "", intTyp), + ), nil, false), llssa.InGo) + chanSendFn := b.Pkg.NewFunc(llssa.PkgRuntime+".ChanSend", + types.NewSignatureType(nil, nil, nil, types.NewTuple( + types.NewParam(token.NoPos, nil, "", voidPtr), + types.NewParam(token.NoPos, nil, "", voidPtr), + types.NewParam(token.NoPos, nil, "", intTyp), + ), types.NewTuple(types.NewParam(token.NoPos, nil, "", types.Typ[types.Bool])), false), llssa.InGo) + var t llssa.Type + var nLen, nCap llssa.Expr + switch v := v.(type) { + case *ssa.MakeSlice: + t = p.type_(v.Type(), llssa.InGo) + nLen = p.compileValue(b, v.Len) + nCap = p.compileValue(b, v.Cap) + case *ssa.Slice: + capLen, ok := makeSliceAllocCap(v.X) + if !ok || v.Low != nil || v.Max != nil { + return false + } + t = p.type_(v.Type(), llssa.InGo) + nLen = p.prog.IntVal(uint64(capLen), p.prog.Int()) + if v.High != nil { + nLen = p.compileValue(b, v.High) + } + nCap = p.prog.IntVal(uint64(capLen), p.prog.Int()) + default: + return false + } + slot := b.Alloc(t, false) + telem := p.prog.Index(t) + teSize := p.prog.IntVal(p.prog.SizeOf(telem), p.prog.Int()) + slotPtr := b.ChangeType(p.prog.VoidPtr(), slot) + b.InlineCall(makeSliceToFn.Expr, slotPtr, nLen, nCap, teSize) + eltSize := p.prog.IntVal(p.prog.SizeOf(p.prog.Elem(ch.Type)), p.prog.Int()) + chPtr := b.ChangeType(p.prog.VoidPtr(), ch) + b.InlineCall(chanSendFn.Expr, chPtr, slotPtr, eltSize) + b.Store(slot, p.prog.Zero(t)) + return true +} + type pkgState byte const ( @@ -209,25 +320,55 @@ const ( func (p *context) compileType(pkg llssa.Package, t *ssa.Type) { tn := t.Object().(*types.TypeName) - if tn.IsAlias() { // don't need to compile alias type - return - } tnName := tn.Name() typ := tn.Type() name := llssa.FullName(tn.Pkg(), tnName) if debugInstr { log.Println("==> NewType", name, typ) } + p.compileTypeMethods(pkg, tn, typ) +} + +func (p *context) compileTypeMethods(pkg llssa.Package, obj *types.TypeName, typ types.Type) { + if obj.IsAlias() { + raw := types.Unalias(typ) + if !isLocalMethodType(obj.Pkg(), raw) { + return + } + p.compileMethods(pkg, raw) + if ptr, ok := raw.(*types.Pointer); ok { + p.compileMethods(pkg, ptr.Elem()) + } + return + } p.compileMethods(pkg, typ) p.compileMethods(pkg, types.NewPointer(typ)) } +func isLocalMethodType(pkg *types.Package, typ types.Type) bool { + for { + switch t := typ.(type) { + case *types.Pointer: + typ = t.Elem() + case *types.Named: + obj := t.Obj() + return obj != nil && obj.Pkg() == pkg + default: + return false + } + } +} + func (p *context) compileMethods(pkg llssa.Package, typ types.Type) { prog := p.goProg mthds := prog.MethodSets.MethodSet(typ) for i, n := 0, mthds.Len(); i < n; i++ { mthd := mthds.At(i) if ssaMthd := prog.MethodValue(mthd); ssaMthd != nil { + _, name, ftype := p.funcName(ssaMthd) + if ftype == goFunc { + pkg.Preserve(name) + } p.compileFuncDecl(pkg, ssaMthd) } } @@ -777,10 +918,57 @@ func (p *context) compileInstrOrValue(b llssa.Builder, iv instrOrValue, asValue case *ssa.Call: ret = p.call(b, llssa.Call, &v.Call) case *ssa.BinOp: + if xConst, ok := v.X.(*ssa.Const); ok && xConst.Value == nil { + if yConst, ok := v.Y.(*ssa.Const); ok && yConst.Value == nil { + switch v.Op { + case token.EQL: + ret = p.prog.BoolVal(true) + case token.NEQ: + ret = p.prog.BoolVal(false) + } + if ret.Type != nil { + break + } + } + } + if xConst, ok := v.X.(*ssa.Const); ok && xConst.Value == nil { + x := p.compileConst(b, xConst, v.Y.Type()) + y := p.compileValue(b, v.Y) + ret = b.BinOp(v.Op, x, y) + break + } + if yConst, ok := v.Y.(*ssa.Const); ok && yConst.Value == nil { + x := p.compileValue(b, v.X) + y := p.compileConst(b, yConst, v.X.Type()) + ret = b.BinOp(v.Op, x, y) + break + } x := p.compileValue(b, v.X) y := p.compileValue(b, v.Y) ret = b.BinOp(v.Op, x, y) case *ssa.UnOp: + if v.Op == token.MUL { + if _, ok := v.X.(*ssa.UnOp); ok { + if refs := v.Referrers(); refs != nil && len(*refs) == 0 { + if t := p.type_(v.Type(), llssa.InGo); t.RawType() != nil { + if _, ok := t.RawType().Underlying().(*types.Pointer); !ok && p.prog.SizeOf(t) > 1<<20 { + x := p.compileValue(b, v.X) + b.AssertNilDeref(x) + return + } + } + } + } + if refs := v.Referrers(); refs != nil && len(*refs) == 1 { + if _, ok := (*refs)[0].(*ssa.MakeInterface); ok { + if t := p.type_(v.Type(), llssa.InGo); t.RawType() != nil { + if _, ok := t.RawType().Underlying().(*types.Pointer); !ok && p.prog.SizeOf(t) > 1<<20 { + return + } + } + } + } + } x := p.compileValue(b, v.X) if v.Op == token.ARROW { ret = b.Recv(x, v.CommaOk) @@ -803,6 +991,9 @@ func (p *context) compileInstrOrValue(b llssa.Builder, iv instrOrValue, asValue if p.checkVArgs(v, t) { // varargs: this maybe a varargs allocation return } + if skipMakeSliceAlloc(v) { + return + } elem := p.type_(t.Elem(), llssa.InGo) ret = b.Alloc(elem, v.Heap) case *ssa.IndexAddr: @@ -834,6 +1025,22 @@ func (p *context) compileInstrOrValue(b llssa.Builder, iv instrOrValue, asValue if _, ok := p.isVArgs(vx); ok { // varargs: this is a varargs slice return } + if ref, ok := singleRef(v); ok && isSendInstr(ref) { + if _, ok := makeSliceAllocCap(vx); ok && v.Low == nil && v.Max == nil { + return + } + } + if capLen, ok := makeSliceAllocCap(vx); ok && v.Low == nil && v.Max == nil { + t := p.type_(v.Type(), llssa.InGo) + nLen := p.prog.IntVal(uint64(capLen), p.prog.Int()) + if v.High != nil { + nLen = p.compileValue(b, v.High) + } + nCap := p.prog.IntVal(uint64(capLen), p.prog.Int()) + ret = b.MakeSlice(t, nLen, nCap) + ret.Type = t + break + } var low, high, max llssa.Expr x := p.compileValue(b, vx) if v.Low != nil { @@ -865,9 +1072,18 @@ func (p *context) compileInstrOrValue(b llssa.Builder, iv instrOrValue, asValue } } t := p.type_(v.Type(), llssa.InGo) + if unop, ok := v.X.(*ssa.UnOp); ok && unop.Op == token.MUL { + if ptr := p.compileValue(b, unop.X); ptr.Type != nil { + ret = b.MakeInterfaceFromPtr(t, ptr) + break + } + } x := p.compileValue(b, v.X) ret = b.MakeInterface(t, x) case *ssa.MakeSlice: + if ref, ok := singleRef(v); ok && isSendInstr(ref) { + return + } t := p.type_(v.Type(), llssa.InGo) nLen := p.compileValue(b, v.Len) nCap := p.compileValue(b, v.Cap) @@ -1023,6 +1239,9 @@ func (p *context) compileInstr(b llssa.Builder, instr ssa.Instruction) { b.Panic(arg) case *ssa.Send: ch := p.compileValue(b, v.Chan) + if p.compileSingleUseMakeSliceSend(b, ch, v.X) { + return + } x := p.compileValue(b, v.X) b.Send(ch, x) case *ssa.DebugRef: @@ -1058,6 +1277,21 @@ func (p *context) compileFunction(v *ssa.Function) (goFn llssa.Function, pyFn ll return p.funcOf(v) } +func (p *context) compileConst(b llssa.Builder, v *ssa.Const, hint types.Type) llssa.Expr { + bg := llssa.InGo + if p.inCFunc { + bg = llssa.InC + } + if v.Value == nil { + t := v.Type() + if isUntypedNil(t) { + t = hint + } + return p.prog.Nil(p.type_(t, bg)) + } + return b.Const(v.Value, p.type_(types.Default(v.Type()), bg)) +} + func (p *context) compileValue(b llssa.Builder, v ssa.Value) llssa.Expr { if iv, ok := v.(instrOrValue); ok { return p.compileInstrOrValue(b, iv, true) @@ -1088,12 +1322,7 @@ func (p *context) compileValue(b llssa.Builder, v ssa.Value) llssa.Expr { } return val case *ssa.Const: - t := types.Default(v.Type()) - bg := llssa.InGo - if p.inCFunc { - bg = llssa.InC - } - return b.Const(v.Value, p.type_(t, bg)) + return p.compileConst(b, v, nil) case *ssa.FreeVar: fn := v.Parent() for idx, freeVar := range fn.FreeVars { diff --git a/cl/compile_test.go b/cl/compile_test.go index 454f2a8bd1..f1b6291b27 100644 --- a/cl/compile_test.go +++ b/cl/compile_test.go @@ -20,15 +20,23 @@ package cl_test import ( + "go/ast" + "go/parser" + "go/token" + "go/types" "os" "runtime" "strings" "testing" + "github.com/goplus/gogen/packages" "github.com/goplus/llgo/cl" "github.com/goplus/llgo/cl/cltest" "github.com/goplus/llgo/internal/build" "github.com/goplus/llgo/internal/llgen" + "github.com/goplus/llgo/ssa/ssatest" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" ) func testCompile(t *testing.T, src, expected string) { @@ -36,6 +44,30 @@ func testCompile(t *testing.T, src, expected string) { cltest.TestCompileEx(t, src, "foo.go", expected, false) } +func compileIR(t *testing.T, src string) string { + t.Helper() + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "foo.go", src, parser.ParseComments) + if err != nil { + t.Fatal("ParseFile failed:", err) + } + files := []*ast.File{f} + pkg := types.NewPackage(f.Name.Name, f.Name.Name) + imp := packages.NewImporter(fset) + foo, _, err := ssautil.BuildPackage( + &types.Config{Importer: imp}, fset, pkg, files, ssa.SanityCheckFunctions|ssa.InstantiateGenerics) + if err != nil { + t.Fatal("BuildPackage failed:", err) + } + prog := ssatest.NewProgramEx(t, nil, imp) + prog.TypeSizes(types.SizesFor("gc", runtime.GOARCH)) + ret, err := cl.NewPackage(prog, foo, files) + if err != nil { + t.Fatal("cl.NewPackage failed:", err) + } + return ret.String() +} + func requireEmbedTest(t *testing.T) { t.Helper() if os.Getenv("LLGO_EMBED_TESTS") != "1" { @@ -246,16 +278,36 @@ func TestRunFromTestgoSelectAllowsKnownInterleavings(t *testing.T) { t.Fatalf("run failed: %v\noutput: %s", err, string(output)) } got := string(output) - allowed := map[string]struct{}{ - "100\nch1\nch2\n": {}, - "100\nexit\nch1\n": {}, - "200\nexit\nexit\n": {}, - } - if _, ok := allowed[got]; !ok { + if !isValidSelectOutput(got) { t.Fatalf("unexpected select output:\n%s", got) } } +func isValidSelectOutput(got string) bool { + got = strings.TrimSuffix(got, "\n") + lines := strings.Split(got, "\n") + if len(lines) != 3 { + return false + } + switch lines[0] { + case "100", "200": + default: + return false + } + valid := map[string]bool{ + "ch1": true, + "ch2": true, + "exit": true, + } + if !valid[lines[1]] || !valid[lines[2]] { + return false + } + if lines[1] == lines[2] && lines[1] != "exit" { + return false + } + return true +} + func TestFromTestpy(t *testing.T) { cltest.FromDir(t, "", "./_testpy") } @@ -287,9 +339,7 @@ func TestRunFromTestlibc(t *testing.T) { } func TestFromTestrt(t *testing.T) { - cl.SetDebug(cl.DbgFlagAll) cltest.FromDir(t, "", "./_testrt") - cl.SetDebug(0) } func TestRunFromTestrt(t *testing.T) { @@ -421,3 +471,33 @@ _llgo_0: } `) } + +func TestMakeSliceAvoidsRedundantAlloc(t *testing.T) { + ir := compileIR(t, `package foo + +func fn(n int) []byte { + return make([]byte, n) +} +`) + if !strings.Contains(ir, `@"github.com/goplus/llgo/runtime/internal/runtime.MakeSlice"`) { + t.Fatalf("missing MakeSlice call:\n%s", ir) + } + if strings.Contains(ir, `@"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"`) { + t.Fatalf("unexpected redundant AllocZ for make([]byte, n):\n%s", ir) + } +} + +func TestSendMakeSliceUsesStackSlotHelper(t *testing.T) { + ir := compileIR(t, `package foo + +func fn(ch chan []byte, n int) { + ch <- make([]byte, n) +} +`) + if !strings.Contains(ir, `@"github.com/goplus/llgo/runtime/internal/runtime.MakeSliceTo"`) { + t.Fatalf("missing MakeSliceTo helper for single-use send:\n%s", ir) + } + if strings.Contains(ir, `call %"github.com/goplus/llgo/runtime/internal/runtime.Slice" @"github.com/goplus/llgo/runtime/internal/runtime.MakeSlice"`) { + t.Fatalf("unexpected direct MakeSlice aggregate in send path:\n%s", ir) + } +} diff --git a/cl/import.go b/cl/import.go index fa15f5605a..1d7b2b4520 100644 --- a/cl/import.go +++ b/cl/import.go @@ -175,6 +175,7 @@ start: } func (p *context) initFiles(pkgPath string, files []*ast.File, cPkg bool) { + fileSyms := collectASTFileSyms(pkgPath, files) for _, file := range files { for _, decl := range file.Decls { switch decl := decl.(type) { @@ -214,6 +215,7 @@ func (p *context) initFiles(pkgPath string, files []*ast.File, cPkg bool) { } } } + processASTFileLinknames(p, file, fileSyms[file], true) } } @@ -223,21 +225,57 @@ func (p *context) initFiles(pkgPath string, files []*ast.File, cPkg bool) { // during the pre-collection phase. func PreCollectLinknames(prog llssa.Program, pkgPath string, files []*ast.File) { ctx := &context{prog: prog} + fileSyms := collectASTFileSyms(pkgPath, files) for _, file := range files { + processASTFileLinknames(ctx, file, fileSyms[file], false) + } +} + +type astFileSymInfo struct { + fullName string + isVar bool +} + +func collectASTFileSyms(pkgPath string, files []*ast.File) map[*ast.File]map[string]astFileSymInfo { + fileSyms := make(map[*ast.File]map[string]astFileSymInfo, len(files)) + for _, file := range files { + syms := make(map[string]astFileSymInfo) for _, decl := range file.Decls { switch decl := decl.(type) { case *ast.FuncDecl: fullName, inPkgName := astFuncName(pkgPath, decl) - ctx.processLinknameByDoc(decl.Doc, fullName, inPkgName, false, false) + syms[inPkgName] = astFileSymInfo{fullName: fullName} case *ast.GenDecl: if decl.Tok == token.VAR && len(decl.Specs) == 1 { if names := decl.Specs[0].(*ast.ValueSpec).Names; len(names) == 1 { inPkgName := names[0].Name - ctx.processLinknameByDoc(decl.Doc, pkgPath+"."+inPkgName, inPkgName, true, false) + syms[inPkgName] = astFileSymInfo{ + fullName: pkgPath + "." + inPkgName, + isVar: true, + } } } } } + fileSyms[file] = syms + } + return fileSyms +} + +func processASTFileLinknames(ctx *context, file *ast.File, syms map[string]astFileSymInfo, allowExport bool) { + if file == nil || len(syms) == 0 { + return + } + for _, group := range file.Comments { + for _, comment := range group.List { + ctx.initLinkname(comment.Text, allowExport, func(name string, isExport bool) (string, bool, bool) { + info, ok := syms[name] + if !ok { + return "", false, false + } + return info.fullName, info.isVar, true + }) + } } } @@ -366,8 +404,10 @@ func (p *context) initLink(line string, prefix int, export bool, f func(inPkgNam if export { panic(fmt.Sprintf("export comment has wrong name %q", inPkgName)) } - fmt.Fprintln(os.Stderr, "==>", line) - fmt.Fprintf(os.Stderr, "llgo: linkname %s not found and ignored\n", inPkgName) + if debugInstr { + fmt.Fprintln(os.Stderr, "==>", line) + fmt.Fprintf(os.Stderr, "llgo: linkname %s not found and ignored\n", inPkgName) + } } } } diff --git a/cl/import_coverage_test.go b/cl/import_coverage_test.go index 2255e17b29..24036caef8 100644 --- a/cl/import_coverage_test.go +++ b/cl/import_coverage_test.go @@ -155,15 +155,23 @@ func TestPreCollectLinknames(t *testing.T) { cases := []struct { name string directive string + layout string want string }{ - {name: "go-linkname", directive: "//go:linkname Sigsetjmp C.sigsetjmp", want: "C.sigsetjmp"}, - {name: "llgo-linkname", directive: "//llgo:link Sigsetjmp C.sigsetjmp", want: "C.sigsetjmp"}, - {name: "llgo-linkname-spaced", directive: "// llgo:link Sigsetjmp C.sigsetjmp", want: "C.sigsetjmp"}, + {name: "go-linkname", directive: "//go:linkname Sigsetjmp C.sigsetjmp", layout: "before", want: "C.sigsetjmp"}, + {name: "llgo-linkname", directive: "//llgo:link Sigsetjmp C.sigsetjmp", layout: "before", want: "C.sigsetjmp"}, + {name: "llgo-linkname-spaced", directive: "// llgo:link Sigsetjmp C.sigsetjmp", layout: "before", want: "C.sigsetjmp"}, + {name: "postdecl-go-linkname", directive: "//go:linkname Sigsetjmp C.sigsetjmp", layout: "after", want: "C.sigsetjmp"}, } for _, tt := range cases { t.Run(tt.name, func(t *testing.T) { - src := "package runtime\nimport _ \"unsafe\"\n" + tt.directive + "\nfunc Sigsetjmp()\n" + var src string + switch tt.layout { + case "after": + src = "package runtime\nimport _ \"unsafe\"\nfunc Sigsetjmp()\n" + tt.directive + "\n" + default: + src = "package runtime\nimport _ \"unsafe\"\n" + tt.directive + "\nfunc Sigsetjmp()\n" + } fset := token.NewFileSet() file, err := parser.ParseFile(fset, "runtime.go", src, parser.ParseComments) if err != nil { diff --git a/dev/test_goroot.sh b/dev/test_goroot.sh new file mode 100755 index 0000000000..5d9b5a2b8b --- /dev/null +++ b/dev/test_goroot.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +runner_args=() +goroots=() +after_delim=0 +for arg in "$@"; do + if [[ "$arg" == "--" ]]; then + after_delim=1 + continue + fi + if [[ $after_delim -eq 1 ]]; then + runner_args+=("$arg") + else + goroots+=("$arg") + fi +done + +if [[ ${#goroots[@]} -eq 0 ]]; then + if [[ -n "${LLGO_GOROOT_MATRIX:-}" ]]; then + IFS=':' read -r -a goroots <<<"${LLGO_GOROOT_MATRIX}" + else + goroots=("$(go env GOROOT)") + fi +fi + +for goroot in "${goroots[@]}"; do + go_bin="$goroot/bin/go" + if [[ ! -x "$go_bin" ]]; then + echo "error: missing go binary: $go_bin" >&2 + exit 2 + fi + version="$("$go_bin" env GOVERSION)" + echo "==== $version ($goroot) ====" + ( + cd "$repo_root" + go test ./test/goroot -count=1 -timeout 90m -args -goroot "$goroot" "${runner_args[@]}" + ) +done diff --git a/internal/build/cgo.go b/internal/build/cgo.go index 47399103da..5f12cb499e 100644 --- a/internal/build/cgo.go +++ b/internal/build/cgo.go @@ -20,12 +20,14 @@ import ( "encoding/json" "fmt" "go/ast" + "go/build" "go/token" "go/types" "os" "os/exec" "path/filepath" "regexp" + "slices" "strings" "github.com/goplus/llgo/internal/buildtags" @@ -34,9 +36,15 @@ import ( ) type cgoDecl struct { - tag string - cflags []string - ldflags []string + tag string + cflags []string + cxxflags []string + ldflags []string +} + +type cgoSrcFile struct { + path string + isCXX bool } type cgoPreamble struct { @@ -54,7 +62,16 @@ static void* _Cmalloc(size_t size) { ) func buildCgo(ctx *context, pkg *aPackage, files []*ast.File, externs []string, verbose bool) (llfiles, cgoLdflags []string, err error) { - cfiles, preambles, cdecls, err := parseCgo_(pkg, files) + buildCtx := build.Default + if ctx.buildConf.Goos != "" { + buildCtx.GOOS = ctx.buildConf.Goos + } + if ctx.buildConf.Goarch != "" { + buildCtx.GOARCH = ctx.buildConf.Goarch + } + buildCtx.BuildTags = parseSourcePatchBuildTags(ctx.conf.BuildFlags) + + srcFiles, preambles, cdecls, err := parseCgo_(&buildCtx, pkg, files) if err != nil { return } @@ -66,12 +83,16 @@ func buildCgo(ctx *context, pkg *aPackage, files []*ast.File, externs []string, } buildtags.CheckTags(ctx.conf.BuildFlags, tagUsed) cflags := []string{} + cxxflags := []string{} ldflags := []string{} for _, cdecl := range cdecls { if cdecl.tag == "" || tagUsed[cdecl.tag] { if len(cdecl.cflags) > 0 { cflags = append(cflags, cdecl.cflags...) } + if len(cdecl.cxxflags) > 0 { + cxxflags = append(cxxflags, cdecl.cxxflags...) + } if len(cdecl.ldflags) > 0 { ldflags = append(ldflags, cdecl.ldflags...) } @@ -85,8 +106,12 @@ func buildCgo(ctx *context, pkg *aPackage, files []*ast.File, externs []string, cflags = append(cflags, "-I"+dir) } } - for _, cfile := range cfiles { - clFile(ctx, cflags, cfile, pkg.ExportFile, pkg.PkgPath, func(linkFile string) { + for _, src := range srcFiles { + args := slices.Clone(cflags) + if src.isCXX { + args = append(args, cxxflags...) + } + clFile(ctx, args, src.path, pkg.ExportFile, pkg.PkgPath, func(linkFile string) { llfiles = append(llfiles, linkFile) }, verbose) } @@ -278,24 +303,59 @@ func extractFuncNames(node *clangASTNode, funcNames map[string]bool) { } } -func parseCgo_(pkg *aPackage, files []*ast.File) (cfiles []string, preambles []cgoPreamble, cdecls []cgoDecl, err error) { +func parseCgo_(buildCtx *build.Context, pkg *aPackage, files []*ast.File) (srcFiles []cgoSrcFile, preambles []cgoPreamble, cdecls []cgoDecl, err error) { dirs := make(map[string]none) for _, file := range files { pos := pkg.Fset.Position(file.Name.NamePos) dir, _ := filepath.Split(pos.Filename) dirs[dir] = none{} } - for dir := range dirs { - matches, err := filepath.Glob(filepath.Join(dir, "*.c")) - if err != nil { - continue + addFile := func(dir, match string, isCXX bool) error { + if fi, err := os.Stat(match); err == nil { + if fi.IsDir() { + return nil + } + } else if !os.IsNotExist(err) { + return err + } + name := filepath.Base(match) + switch { + case strings.HasSuffix(name, "_test.c"), + strings.HasSuffix(name, "_test.cc"), + strings.HasSuffix(name, "_test.cpp"), + strings.HasSuffix(name, "_test.cxx"): + return nil } - for _, match := range matches { - if strings.HasSuffix(match, "_test.c") { + if buildCtx != nil { + matchFile, err := buildCtx.MatchFile(dir, name) + if err != nil { + return fmt.Errorf("match cgo file %s: %w", match, err) + } + if !matchFile { + return nil + } + } + srcFiles = append(srcFiles, cgoSrcFile{path: match, isCXX: isCXX}) + return nil + } + for dir := range dirs { + for _, pattern := range []struct { + glob string + isCXX bool + }{ + {glob: "*.c", isCXX: false}, + {glob: "*.cc", isCXX: true}, + {glob: "*.cpp", isCXX: true}, + {glob: "*.cxx", isCXX: true}, + } { + matches, err := filepath.Glob(filepath.Join(dir, pattern.glob)) + if err != nil { continue } - if fi, err := os.Stat(match); err == nil && !fi.IsDir() { - cfiles = append(cfiles, match) + for _, match := range matches { + if err := addFile(dir, match, pattern.isCXX); err != nil { + return nil, nil, nil, err + } } } } @@ -359,6 +419,7 @@ func parseCgoPreamble(pos token.Position, text string) (preamble cgoPreamble, de // #cgo windows LDFLAGS: -LC:/Python312/libs -lpython312 // #cgo linux CPPFLAGS: -I/usr/lib/llvm-19/include -D_GNU_SOURCE // #cgo CFLAGS: -I/usr/include/python3.12 +// #cgo CXXFLAGS: -I/usr/include/c++/v1 // #cgo LDFLAGS: -L/usr/lib/python3.12/config-3.12-x86_64-linux-gnu -lpython3.12 func parseCgoDecl(line string) (cgoDecls []cgoDecl, err error) { idx := strings.Index(line, ":") @@ -411,6 +472,11 @@ func parseCgoDecl(line string) (cgoDecls []cgoDecl, err error) { tag: tag, cflags: safesplit.SplitPkgConfigFlags(arg), }) + case "CXXFLAGS": + cgoDecls = append(cgoDecls, cgoDecl{ + tag: tag, + cxxflags: safesplit.SplitPkgConfigFlags(arg), + }) case "LDFLAGS": cgoDecls = append(cgoDecls, cgoDecl{ tag: tag, diff --git a/internal/build/cgo_pragmas.go b/internal/build/cgo_pragmas.go index e482c5bdf0..1c5ce0c89c 100644 --- a/internal/build/cgo_pragmas.go +++ b/internal/build/cgo_pragmas.go @@ -130,6 +130,8 @@ func emitDarwinDynimportTrampoline(b *strings.Builder, goarch string, local stri if b == nil || local == "" || alias == "" { return } + trampoline := local + "_trampoline" + addr := local + "_trampoline_addr" // Mach-O external C symbols use a leading underscore. switch goarch { case "arm64": @@ -141,6 +143,19 @@ func emitDarwinDynimportTrampoline(b *strings.Builder, goarch string, local stri b.WriteString(":\n\tb _") b.WriteString(alias) b.WriteString("\n") + b.WriteString(".globl _") + b.WriteString(trampoline) + b.WriteString("\n.p2align 2\n_") + b.WriteString(trampoline) + b.WriteString(":\n\tb _") + b.WriteString(local) + b.WriteString("\n.data\n.globl _") + b.WriteString(addr) + b.WriteString("\n.p2align 3\n_") + b.WriteString(addr) + b.WriteString(":\n\t.quad _") + b.WriteString(trampoline) + b.WriteString("\n") case "amd64": b.WriteString(".text\n") b.WriteString(".globl _") @@ -150,6 +165,19 @@ func emitDarwinDynimportTrampoline(b *strings.Builder, goarch string, local stri b.WriteString(":\n\tjmp _") b.WriteString(alias) b.WriteString("\n") + b.WriteString(".globl _") + b.WriteString(trampoline) + b.WriteString("\n.p2align 4, 0x90\n_") + b.WriteString(trampoline) + b.WriteString(":\n\tjmp _") + b.WriteString(local) + b.WriteString("\n.data\n.globl _") + b.WriteString(addr) + b.WriteString("\n.p2align 3\n_") + b.WriteString(addr) + b.WriteString(":\n\t.quad _") + b.WriteString(trampoline) + b.WriteString("\n") default: // Keep unsupported arch silent for now; caller already gates by darwin. } diff --git a/internal/build/cgo_test.go b/internal/build/cgo_test.go index 1ffd8505b9..7b33121456 100644 --- a/internal/build/cgo_test.go +++ b/internal/build/cgo_test.go @@ -4,9 +4,17 @@ package build import ( + "go/ast" + "go/build" + "go/parser" + "go/token" + "os" + "path/filepath" "reflect" "strings" "testing" + + "github.com/goplus/llgo/internal/packages" ) func TestParseCgoDeclFlags(t *testing.T) { @@ -36,9 +44,13 @@ func TestParseCgoDeclFlags(t *testing.T) { }, }, { - name: "unsupported flag returns error", - line: "#cgo CXXFLAGS: -O2", - wantErrText: "unsupported cgo flag type", + name: "CXXFLAGS without tag", + line: "#cgo CXXFLAGS: -O2 -stdlib=libc++", + want: []cgoDecl{ + { + cxxflags: []string{"-O2", "-stdlib=libc++"}, + }, + }, }, } @@ -63,3 +75,87 @@ func TestParseCgoDeclFlags(t *testing.T) { }) } } + +func TestParseCgoCollectsCXXFiles(t *testing.T) { + dir := t.TempDir() + src := `package demo + +/* +#cgo CFLAGS: -I/c +#cgo CXXFLAGS: -I/cxx +*/ +import "unsafe" +` + goFile := filepath.Join(dir, "demo.go") + if err := os.WriteFile(goFile, []byte(src), 0644); err != nil { + t.Fatal(err) + } + for _, name := range []string{"foo.c", "bar.cpp", "skip_test.cpp"} { + if err := os.WriteFile(filepath.Join(dir, name), []byte(""), 0644); err != nil { + t.Fatal(err) + } + } + fset := token.NewFileSet() + file, err := parser.ParseFile(fset, goFile, src, parser.ParseComments) + if err != nil { + t.Fatal(err) + } + pkg := &aPackage{Package: &packages.Package{Fset: fset}} + buildCtx := build.Default + srcFiles, _, decls, err := parseCgo_(&buildCtx, pkg, []*ast.File{file}) + if err != nil { + t.Fatalf("parseCgo_ returned error: %v", err) + } + gotFiles := map[string]bool{} + for _, src := range srcFiles { + gotFiles[filepath.Base(src.path)] = src.isCXX + } + wantFiles := map[string]bool{ + "foo.c": false, + "bar.cpp": true, + } + if !reflect.DeepEqual(gotFiles, wantFiles) { + t.Fatalf("parseCgo_ files = %#v, want %#v", gotFiles, wantFiles) + } + if !reflect.DeepEqual(decls, []cgoDecl{ + {cflags: []string{"-I/c"}}, + {cxxflags: []string{"-I/cxx"}}, + }) { + t.Fatalf("parseCgo_ decls = %#v", decls) + } +} + +func TestParseCgoIgnoresDirectoryNamedLikeCFile(t *testing.T) { + dir := t.TempDir() + src := `package demo + +/* +#cgo CFLAGS: -I/c +*/ +import "unsafe" +` + goFile := filepath.Join(dir, "demo.go") + if err := os.WriteFile(goFile, []byte(src), 0644); err != nil { + t.Fatal(err) + } + if err := os.Mkdir(filepath.Join(dir, "foo.c"), 0755); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(dir, "bar.c"), []byte(""), 0644); err != nil { + t.Fatal(err) + } + fset := token.NewFileSet() + file, err := parser.ParseFile(fset, goFile, src, parser.ParseComments) + if err != nil { + t.Fatal(err) + } + pkg := &aPackage{Package: &packages.Package{Fset: fset}} + buildCtx := build.Default + srcFiles, _, _, err := parseCgo_(&buildCtx, pkg, []*ast.File{file}) + if err != nil { + t.Fatalf("parseCgo_ returned error: %v", err) + } + if len(srcFiles) != 1 || filepath.Base(srcFiles[0].path) != "bar.c" { + t.Fatalf("parseCgo_ files = %#v, want only bar.c", srcFiles) + } +} diff --git a/internal/build/main_module.go b/internal/build/main_module.go index e6beef8c80..d5d941815f 100644 --- a/internal/build/main_module.go +++ b/internal/build/main_module.go @@ -1,6 +1,3 @@ -//go:build !llgo -// +build !llgo - /* * Copyright (c) 2024 The XGo Authors (xgo.dev). All rights reserved. * diff --git a/internal/build/plan9asm.go b/internal/build/plan9asm.go index a3fa34633e..0f74d4dd71 100644 --- a/internal/build/plan9asm.go +++ b/internal/build/plan9asm.go @@ -59,6 +59,9 @@ func compilePkgSFiles(ctx *context, aPkg *aPackage, pkg *packages.Package, verbo if err != nil { return nil, fmt.Errorf("%s: read %s: %w", pkg.PkgPath, sfile, err) } + if shouldSkipDarwinDynimportTrampolineAsm(ctx, pkg, sfile, src) { + continue + } tr, err := llplan9asm.TranslateSourceModuleForPkg(pkg, sfile, src, ctx.buildConf.Goos, ctx.buildConf.Goarch) if err != nil { // Some stdlib .s files are comment-only placeholders (e.g. internal/cpu/cpu.s). @@ -132,6 +135,24 @@ func compilePkgSFiles(ctx *context, aPkg *aPackage, pkg *packages.Package, verbo return objFiles, nil } +func shouldSkipDarwinDynimportTrampolineAsm(ctx *context, pkg *packages.Package, sfile string, src []byte) bool { + if ctx == nil || ctx.buildConf == nil || ctx.buildConf.Goos != "darwin" { + return false + } + if pkg == nil || pkg.PkgPath != "golang.org/x/sys/unix" { + return false + } + if !strings.HasPrefix(filepath.Base(sfile), "zsyscall_darwin_") { + return false + } + _, dynimports := collectGoCgoPragmas(pkg.Syntax) + if len(dynimports) == 0 { + return false + } + return bytes.Contains(src, []byte("_trampoline<>(SB)")) && + bytes.Contains(src, []byte("_trampoline_addr(SB)")) +} + type plan9AsmSigCacheKey struct { ctx *context pkgPath string @@ -363,11 +384,12 @@ func pkgSFiles(ctx *context, pkg *packages.Package) ([]string, error) { return v, nil } + query := pkgSFilesQuery(pkg) args := []string{"list", "-json"} if ctx.conf != nil && len(ctx.conf.BuildFlags) > 0 { args = append(args, ctx.conf.BuildFlags...) } - args = append(args, pkg.PkgPath) + args = append(args, query) cmd := exec.Command("go", args...) cmd.Dir = pkg.Dir @@ -381,7 +403,7 @@ func pkgSFiles(ctx *context, pkg *packages.Package) ([]string, error) { if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 { errBuf.Write(ee.Stderr) } - return nil, fmt.Errorf("go list -json %s failed: %w\n%s", pkg.PkgPath, err, strings.TrimSpace(errBuf.String())) + return nil, fmt.Errorf("go list -json %s failed: %w\n%s", query, err, strings.TrimSpace(errBuf.String())) } var lp struct { @@ -389,7 +411,7 @@ func pkgSFiles(ctx *context, pkg *packages.Package) ([]string, error) { SFiles []string `json:"SFiles"` } if err := json.Unmarshal(out, &lp); err != nil { - return nil, fmt.Errorf("go list -json %s: parse: %w", pkg.PkgPath, err) + return nil, fmt.Errorf("go list -json %s: parse: %w", query, err) } // internal/chacha8rand has highly optimized arch asm on amd64/arm64. @@ -414,3 +436,19 @@ func pkgSFiles(ctx *context, pkg *packages.Package) ([]string, error) { ctx.sfilesCache[pkg.ID] = paths return paths, nil } + +func pkgSFilesQuery(pkg *packages.Package) string { + if pkg == nil { + return "." + } + switch { + case pkg.PkgPath == "": + return "." + case pkg.PkgPath == "command-line-arguments": + return "." + case strings.HasPrefix(pkg.PkgPath, "_/"): + return "." + default: + return pkg.PkgPath + } +} diff --git a/internal/build/plan9asm_pkgfiles_test.go b/internal/build/plan9asm_pkgfiles_test.go new file mode 100644 index 0000000000..c20fe816d5 --- /dev/null +++ b/internal/build/plan9asm_pkgfiles_test.go @@ -0,0 +1,53 @@ +package build + +import ( + "os" + "path/filepath" + "runtime" + "testing" + + "golang.org/x/tools/go/packages" +) + +func TestPkgSFilesQueryForTempDirPackage(t *testing.T) { + tmp := t.TempDir() + pkg := &packages.Package{ + PkgPath: "_/" + filepath.ToSlash(tmp), + Dir: tmp, + } + if got := pkgSFilesQuery(pkg); got != "." { + t.Fatalf("pkgSFilesQuery()=%q, want .", got) + } +} + +func TestPkgSFilesListsAsmForTempDirPackage(t *testing.T) { + tmp := t.TempDir() + if err := os.WriteFile(filepath.Join(tmp, "main.go"), []byte("package main\nfunc main(){}\n"), 0o644); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(tmp, "a.s"), []byte("TEXT ·noop(SB), 4, $0-0\n\tRET\n"), 0o644); err != nil { + t.Fatal(err) + } + + t.Setenv("GO111MODULE", "off") + pkg := &packages.Package{ + ID: "temp-main", + PkgPath: "_/" + filepath.ToSlash(tmp), + Dir: tmp, + } + ctx := &context{ + buildConf: &Config{Goos: runtime.GOOS, Goarch: runtime.GOARCH}, + } + + files, err := pkgSFiles(ctx, pkg) + if err != nil { + t.Fatal(err) + } + want, err := filepath.EvalSymlinks(filepath.Join(tmp, "a.s")) + if err != nil { + t.Fatal(err) + } + if len(files) != 1 || files[0] != want { + t.Fatalf("pkgSFiles()=%v, want [%q]", files, want) + } +} diff --git a/internal/build/source_patch_go126_test.go b/internal/build/source_patch_go126_test.go index e43e67c73c..d346815595 100644 --- a/internal/build/source_patch_go126_test.go +++ b/internal/build/source_patch_go126_test.go @@ -14,7 +14,8 @@ import ( ) func TestBuildSourcePatchOverlayForInternalSync(t *testing.T) { - overlay, err := buildSourcePatchOverlayForGOROOT(nil, env.LLGoRuntimeDir(), runtime.GOROOT(), sourcePatchBuildContext{ + runtimeDir := mustRuntimeDirForTests(t) + overlay, err := buildSourcePatchOverlayForGOROOT(nil, runtimeDir, runtime.GOROOT(), sourcePatchBuildContext{ goos: runtime.GOOS, goarch: runtime.GOARCH, goversion: "go1.26.0", @@ -32,7 +33,7 @@ func TestBuildSourcePatchOverlayForInternalSync(t *testing.T) { if !strings.Contains(string(patchSrc), "type HashTrieMap") { t.Fatalf("source patch file %s does not contain HashTrieMap replacement", patchFile) } - if !strings.HasPrefix(string(patchSrc), sourcePatchLineDirective(filepath.Join(env.LLGoRuntimeDir(), "_patch", "internal", "sync", "hashtriemap.go"))) { + if !strings.HasPrefix(string(patchSrc), sourcePatchLineDirective(filepath.Join(runtimeDir, "_patch", "internal", "sync", "hashtriemap.go"))) { t.Fatalf("source patch file %s is missing line directive, got:\n%s", patchFile, patchSrc) } @@ -60,7 +61,8 @@ func TestInternalSyncUsesSourcePatchInsteadOfAltPkg(t *testing.T) { } func TestBuildSourcePatchOverlayForCryptoInternalConstanttime(t *testing.T) { - overlay, err := buildSourcePatchOverlayForGOROOT(nil, env.LLGoRuntimeDir(), runtime.GOROOT(), sourcePatchBuildContext{ + runtimeDir := mustRuntimeDirForTests(t) + overlay, err := buildSourcePatchOverlayForGOROOT(nil, runtimeDir, runtime.GOROOT(), sourcePatchBuildContext{ goos: runtime.GOOS, goarch: runtime.GOARCH, goversion: "go1.26.0", @@ -78,7 +80,7 @@ func TestBuildSourcePatchOverlayForCryptoInternalConstanttime(t *testing.T) { if !strings.Contains(string(patchSrc), "//go:linkname boolToUint8 llgo.boolToUint8") { t.Fatalf("source patch file %s does not contain boolToUint8 linkname", patchFile) } - if !strings.HasPrefix(string(patchSrc), sourcePatchLineDirective(filepath.Join(env.LLGoRuntimeDir(), "_patch", "crypto", "internal", "constanttime", "constant_time.go"))) { + if !strings.HasPrefix(string(patchSrc), sourcePatchLineDirective(filepath.Join(runtimeDir, "_patch", "crypto", "internal", "constanttime", "constant_time.go"))) { t.Fatalf("source patch file %s is missing line directive, got:\n%s", patchFile, patchSrc) } } diff --git a/internal/build/source_patch_test.go b/internal/build/source_patch_test.go index 65ac611d30..7c9059126d 100644 --- a/internal/build/source_patch_test.go +++ b/internal/build/source_patch_test.go @@ -17,7 +17,8 @@ import ( ) func TestBuildSourcePatchOverlayForIter(t *testing.T) { - overlay, err := buildSourcePatchOverlayForGOROOT(nil, env.LLGoRuntimeDir(), runtime.GOROOT(), sourcePatchBuildContext{}) + runtimeDir := mustRuntimeDirForTests(t) + overlay, err := buildSourcePatchOverlayForGOROOT(nil, runtimeDir, runtime.GOROOT(), sourcePatchBuildContext{}) if err != nil { t.Fatal(err) } @@ -31,7 +32,7 @@ func TestBuildSourcePatchOverlayForIter(t *testing.T) { if !strings.Contains(string(patchSrc), "func Pull[V any]") { t.Fatalf("source patch file %s does not contain iter replacement", patchFile) } - if !strings.HasPrefix(string(patchSrc), sourcePatchLineDirective(filepath.Join(env.LLGoRuntimeDir(), "_patch", "iter", "iter.go"))) { + if !strings.HasPrefix(string(patchSrc), sourcePatchLineDirective(filepath.Join(runtimeDir, "_patch", "iter", "iter.go"))) { t.Fatalf("source patch file %s is missing line directive, got:\n%s", patchFile, patchSrc) } @@ -209,7 +210,7 @@ func Pull[V any](seq func(func(V) bool)) {} func runSourcePatchCase(t *testing.T, caseName string) { t.Helper() - assetRoot := filepath.Join(env.LLGoRuntimeDir(), "_patch", "_test", caseName) + assetRoot := filepath.Join(mustRuntimeDirForTests(t), "_patch", "_test", caseName) goroot := t.TempDir() runtimeDir := t.TempDir() const pkgPath = "demo" @@ -231,6 +232,28 @@ func runSourcePatchCase(t *testing.T, caseName string) { assertGeneratedPatchPositions(t, overlay, srcDir, patchDir) } +func mustRuntimeDirForTests(t *testing.T) string { + t.Helper() + if dir := env.LLGoRuntimeDir(); dir != "" { + return dir + } + wd, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + for dir := wd; ; dir = filepath.Dir(dir) { + runtimeDir := filepath.Join(dir, "runtime") + data, err := os.ReadFile(filepath.Join(runtimeDir, "go.mod")) + if err == nil && strings.Contains(string(data), "module github.com/goplus/llgo/runtime\n") { + return runtimeDir + } + parent := filepath.Dir(dir) + if parent == dir { + t.Fatalf("failed to locate llgo runtime dir from cwd %s", wd) + } + } +} + func copyTree(t *testing.T, srcRoot, dstRoot string) { t.Helper() err := filepath.WalkDir(srcRoot, func(path string, d fs.DirEntry, err error) error { diff --git a/internal/clang/clang.go b/internal/clang/clang.go index 48ae7cb295..fbfb168106 100644 --- a/internal/clang/clang.go +++ b/internal/clang/clang.go @@ -100,6 +100,7 @@ func (c *Cmd) Compile(args ...string) error { allArgs := make([]string, 0, len(flags)+len(args)) allArgs = append(allArgs, flags...) allArgs = append(allArgs, args...) + allArgs = normalizeExecArgs(allArgs) return c.exec(allArgs...) } @@ -109,6 +110,7 @@ func (c *Cmd) Link(args ...string) error { allArgs := make([]string, 0, len(flags)+len(args)) allArgs = append(allArgs, flags...) allArgs = append(allArgs, args...) + allArgs = normalizeExecArgs(allArgs) return c.exec(allArgs...) } @@ -170,6 +172,18 @@ func (c *Cmd) exec(args ...string) error { return cmd.Run() } +func normalizeExecArgs(args []string) []string { + out := make([]string, 0, len(args)) + for _, arg := range args { + if strings.HasPrefix(arg, "-") && strings.IndexAny(arg, " \t\r\n") >= 0 { + out = append(out, safesplit.SplitPkgConfigFlags(arg)...) + continue + } + out = append(out, arg) + } + return out +} + // CheckLinkArgs validates linking arguments by attempting a test compile. func (c *Cmd) CheckLinkArgs(cmdArgs []string, wasm bool) error { // Create a temporary file with appropriate extension diff --git a/internal/clang/clang_test.go b/internal/clang/clang_test.go index 89dd3d7d90..30f40e3b6b 100644 --- a/internal/clang/clang_test.go +++ b/internal/clang/clang_test.go @@ -295,6 +295,14 @@ func TestLink(t *testing.T) { } } +func TestNormalizeExecArgs(t *testing.T) { + got := normalizeExecArgs([]string{"-framework CoreFoundation", "-framework IOKit", "plain arg", "/tmp/with space"}) + want := []string{"-framework", "CoreFoundation", "-framework", "IOKit", "plain arg", "/tmp/with space"} + if !reflect.DeepEqual(got, want) { + t.Fatalf("normalizeExecArgs = %v, want %v", got, want) + } +} + func TestVerboseMode(t *testing.T) { config := Config{} cmd := New("echo", config) diff --git a/runtime/internal/clite/debug/_wrap/debug.c b/runtime/internal/clite/debug/_wrap/debug.c index 32d87903bf..c4a3e8a3c9 100644 --- a/runtime/internal/clite/debug/_wrap/debug.c +++ b/runtime/internal/clite/debug/_wrap/debug.c @@ -1,3 +1,11 @@ +#if defined(__has_include) +#if __has_include() && __has_include() +#define LLGO_HAVE_HOST_DEBUG 1 +#endif +#endif + +#if defined(LLGO_HAVE_HOST_DEBUG) + #if defined(__linux__) #define UNW_LOCAL_ONLY #ifndef _GNU_SOURCE @@ -38,4 +46,36 @@ void llgo_stacktrace(int skip, void *ctx, int (*fn)(void *ctx, void *pc, void *o } } } -} \ No newline at end of file +} + +#else + +typedef struct { + const char *dli_fname; + void *dli_fbase; + const char *dli_sname; + void *dli_saddr; +} Dl_info; + +void *llgo_address() { + return 0; +} + +int llgo_addrinfo(void *addr, Dl_info *info) { + (void)addr; + if (info) { + info->dli_fname = 0; + info->dli_fbase = 0; + info->dli_sname = 0; + info->dli_saddr = 0; + } + return 0; +} + +void llgo_stacktrace(int skip, void *ctx, int (*fn)(void *ctx, void *pc, void *offset, void *sp, char *name)) { + (void)skip; + (void)ctx; + (void)fn; +} + +#endif diff --git a/runtime/internal/clite/debug/debug.go b/runtime/internal/clite/debug/debug.go index d35899cd99..5111e00d7a 100644 --- a/runtime/internal/clite/debug/debug.go +++ b/runtime/internal/clite/debug/debug.go @@ -1,4 +1,4 @@ -//go:build !wasm && !baremetal +//go:build !wasm && !baremetal && !esp package debug diff --git a/runtime/internal/clite/debug/debug_baremetal.go b/runtime/internal/clite/debug/debug_baremetal.go index e325bc87e5..7269d3c008 100644 --- a/runtime/internal/clite/debug/debug_baremetal.go +++ b/runtime/internal/clite/debug/debug_baremetal.go @@ -1,4 +1,4 @@ -//go:build baremetal +//go:build baremetal || esp package debug diff --git a/runtime/internal/clite/debug/libunwind_linux.go b/runtime/internal/clite/debug/libunwind_linux.go index 1fc8a380da..4761966387 100644 --- a/runtime/internal/clite/debug/libunwind_linux.go +++ b/runtime/internal/clite/debug/libunwind_linux.go @@ -1,4 +1,4 @@ -//go:build linux && !baremetal +//go:build linux && !baremetal && !esp package debug diff --git a/runtime/internal/lib/reflect/value.go b/runtime/internal/lib/reflect/value.go index a093605239..5640d4f4b0 100644 --- a/runtime/internal/lib/reflect/value.go +++ b/runtime/internal/lib/reflect/value.go @@ -400,7 +400,7 @@ func (v Value) Bool() bool { if v.kind() != Bool { v.panicNotBool() } - if v.flag&flagAddr != 0 { + if v.flag&flagIndir != 0 { return *(*bool)(v.ptr) } return uintptr(v.ptr) != 0 diff --git a/runtime/internal/lib/runtime/pprof_runtime_stub_llgo.go b/runtime/internal/lib/runtime/pprof_runtime_stub_llgo.go index 8f7045430b..f283a82f4d 100644 --- a/runtime/internal/lib/runtime/pprof_runtime_stub_llgo.go +++ b/runtime/internal/lib/runtime/pprof_runtime_stub_llgo.go @@ -2,6 +2,8 @@ package runtime +import llrt "github.com/goplus/llgo/runtime/internal/runtime" + // StackRecord is a minimal placeholder for runtime/pprof. type StackRecord struct { Stack []uintptr @@ -48,7 +50,7 @@ func ThreadCreateProfile(p []StackRecord) (n int, ok bool) { } func NumGoroutine() int { - return 1 + return llrt.NumThreads() } func SetCPUProfileRate(hz int) {} diff --git a/runtime/internal/lib/runtime/sync_runtime_llgo.go b/runtime/internal/lib/runtime/sync_runtime_llgo.go index cee3441a8d..9f33b99373 100644 --- a/runtime/internal/lib/runtime/sync_runtime_llgo.go +++ b/runtime/internal/lib/runtime/sync_runtime_llgo.go @@ -18,14 +18,3 @@ func sync_runtime_procPin() int { //go:linkname sync_runtime_procUnpin sync.runtime_procUnpin func sync_runtime_procUnpin() {} - -// sync/atomic.Value expects these package-local runtime hooks. -// In llgo they can share the same no-op pin/unpin behavior as sync. -// -//go:linkname atomic_runtime_procPin sync/atomic.runtime_procPin -func atomic_runtime_procPin() int { - return 0 -} - -//go:linkname atomic_runtime_procUnpin sync/atomic.runtime_procUnpin -func atomic_runtime_procUnpin() {} diff --git a/runtime/internal/lib/sync/atomic/value.go b/runtime/internal/lib/sync/atomic/value.go index 498b40b4e3..f80bc7e931 100644 --- a/runtime/internal/lib/sync/atomic/value.go +++ b/runtime/internal/lib/sync/atomic/value.go @@ -4,12 +4,11 @@ package atomic -import ( - "unsafe" -) +import "unsafe" type Value struct { - v any + lock uint32 + val any } // efaceWords is interface{} internal representation. @@ -18,24 +17,28 @@ type efaceWords struct { data unsafe.Pointer } +func typeOfValue(val any) unsafe.Pointer { + return (*efaceWords)(unsafe.Pointer(&val)).typ +} + +func (v *Value) lockValue() { + for !CompareAndSwapUint32(&v.lock, 0, 1) { + } +} + +func (v *Value) unlockValue() { + StoreUint32(&v.lock, 0) +} + // Load returns the value set by the most recent Store. // It returns nil if there has been no call to Store for this Value. func (v *Value) Load() (val any) { - vp := (*efaceWords)(unsafe.Pointer(v)) - typ := LoadPointer(&vp.typ) - if typ == nil || typ == unsafe.Pointer(&firstStoreInProgress) { - // First store not yet completed. - return nil - } - data := LoadPointer(&vp.data) - vlp := (*efaceWords)(unsafe.Pointer(&val)) - vlp.typ = typ - vlp.data = data - return + v.lockValue() + val = v.val + v.unlockValue() + return val } -var firstStoreInProgress byte - // Store sets the value of the Value v to val. // All calls to Store for a given Value must use values of the same concrete type. // Store of an inconsistent type panics, as does Store(nil). @@ -43,35 +46,13 @@ func (v *Value) Store(val any) { if val == nil { panic("sync/atomic: store of nil value into Value") } - vp := (*efaceWords)(unsafe.Pointer(v)) - vlp := (*efaceWords)(unsafe.Pointer(&val)) - for { - typ := LoadPointer(&vp.typ) - if typ == nil { - // Attempt to start first store. - // Disable preemption so that other goroutines can use - // active spin wait to wait for completion. - if !CompareAndSwapPointer(&vp.typ, nil, unsafe.Pointer(&firstStoreInProgress)) { - continue - } - // Complete first store. - StorePointer(&vp.data, vlp.data) - StorePointer(&vp.typ, vlp.typ) - return - } - if typ == unsafe.Pointer(&firstStoreInProgress) { - // First store in progress. Wait. - // Since we disable preemption around the first store, - // we can wait with active spinning. - continue - } - // First store completed. Check type and overwrite data. - if typ != vlp.typ { - panic("sync/atomic: store of inconsistently typed value into Value") - } - StorePointer(&vp.data, vlp.data) - return + newType := typeOfValue(val) + v.lockValue() + defer v.unlockValue() + if oldType := typeOfValue(v.val); oldType != nil && oldType != newType { + panic("sync/atomic: store of inconsistently typed value into Value") } + v.val = val } // Swap stores new into Value and returns the previous value. It returns nil if @@ -83,37 +64,15 @@ func (v *Value) Swap(new any) (old any) { if new == nil { panic("sync/atomic: swap of nil value into Value") } - vp := (*efaceWords)(unsafe.Pointer(v)) - np := (*efaceWords)(unsafe.Pointer(&new)) - for { - typ := LoadPointer(&vp.typ) - if typ == nil { - // Attempt to start first store. - // Disable preemption so that other goroutines can use - // active spin wait to wait for completion; and so that - // GC does not see the fake type accidentally. - if !CompareAndSwapPointer(&vp.typ, nil, unsafe.Pointer(&firstStoreInProgress)) { - continue - } - // Complete first store. - StorePointer(&vp.data, np.data) - StorePointer(&vp.typ, np.typ) - return nil - } - if typ == unsafe.Pointer(&firstStoreInProgress) { - // First store in progress. Wait. - // Since we disable preemption around the first store, - // we can wait with active spinning. - continue - } - // First store completed. Check type and overwrite data. - if typ != np.typ { - panic("sync/atomic: swap of inconsistently typed value into Value") - } - op := (*efaceWords)(unsafe.Pointer(&old)) - op.typ, op.data = np.typ, SwapPointer(&vp.data, np.data) - return old + newType := typeOfValue(new) + v.lockValue() + defer v.unlockValue() + old = v.val + if oldType := typeOfValue(old); oldType != nil && oldType != newType { + panic("sync/atomic: swap of inconsistently typed value into Value") } + v.val = new + return old } // CompareAndSwap executes the compare-and-swap operation for the Value. @@ -125,52 +84,27 @@ func (v *Value) CompareAndSwap(old, new any) (swapped bool) { if new == nil { panic("sync/atomic: compare and swap of nil value into Value") } - vp := (*efaceWords)(unsafe.Pointer(v)) - np := (*efaceWords)(unsafe.Pointer(&new)) - op := (*efaceWords)(unsafe.Pointer(&old)) - if op.typ != nil && np.typ != op.typ { + newType := typeOfValue(new) + oldType := typeOfValue(old) + if oldType != nil && oldType != newType { panic("sync/atomic: compare and swap of inconsistently typed values") } - for { - typ := LoadPointer(&vp.typ) - if typ == nil { - if old != nil { - return false - } - // Attempt to start first store. - // Disable preemption so that other goroutines can use - // active spin wait to wait for completion; and so that - // GC does not see the fake type accidentally. - if !CompareAndSwapPointer(&vp.typ, nil, unsafe.Pointer(&firstStoreInProgress)) { - continue - } - // Complete first store. - StorePointer(&vp.data, np.data) - StorePointer(&vp.typ, np.typ) - return true - } - if typ == unsafe.Pointer(&firstStoreInProgress) { - // First store in progress. Wait. - // Since we disable preemption around the first store, - // we can wait with active spinning. - continue - } - // First store completed. Check type and overwrite data. - if typ != np.typ { - panic("sync/atomic: compare and swap of inconsistently typed value into Value") - } - // Compare old and current via runtime equality check. - // This allows value types to be compared, something - // not offered by the package functions. - // CompareAndSwapPointer below only ensures vp.data - // has not changed since LoadPointer. - data := LoadPointer(&vp.data) - var i any - (*efaceWords)(unsafe.Pointer(&i)).typ = typ - (*efaceWords)(unsafe.Pointer(&i)).data = data - if i != old { + v.lockValue() + defer v.unlockValue() + cur := v.val + if curType := typeOfValue(cur); curType == nil { + if old != nil { return false } - return CompareAndSwapPointer(&vp.data, data, np.data) + v.val = new + return true + } + if typeOfValue(cur) != newType { + panic("sync/atomic: compare and swap of inconsistently typed value into Value") + } + if cur != old { + return false } + v.val = new + return true } diff --git a/runtime/internal/runtime/tinygogc/gc_link.go b/runtime/internal/runtime/tinygogc/gc_link.go index 9f5c04da00..6c69acfdef 100644 --- a/runtime/internal/runtime/tinygogc/gc_link.go +++ b/runtime/internal/runtime/tinygogc/gc_link.go @@ -36,19 +36,19 @@ func __wrap_realloc(ptr unsafe.Pointer, size uintptr) unsafe.Pointer { func getsp() unsafe.Pointer //go:linkname _heapStart _heapStart -var _heapStart [0]byte +var _heapStart byte //go:linkname _heapEnd _heapEnd -var _heapEnd [0]byte +var _heapEnd byte //go:linkname _stackStart _stack_top -var _stackStart [0]byte +var _stackStart byte //go:linkname _stackEnd _stack_end -var _stackEnd [0]byte +var _stackEnd byte //go:linkname _globals_start _globals_start -var _globals_start [0]byte +var _globals_start byte //go:linkname _globals_end _globals_end -var _globals_end [0]byte +var _globals_end byte diff --git a/runtime/internal/runtime/tinygogc/gc_test.go b/runtime/internal/runtime/tinygogc/gc_test.go index 3ff261132f..422c142064 100644 --- a/runtime/internal/runtime/tinygogc/gc_test.go +++ b/runtime/internal/runtime/tinygogc/gc_test.go @@ -12,14 +12,14 @@ func getsp() uintptr { return currentStack } -var _heapStart [0]byte +var _heapStart byte -var _heapEnd [0]byte +var _heapEnd byte -var _stackStart [0]byte +var _stackStart byte -var _stackEnd [0]byte +var _stackEnd byte -var _globals_start [0]byte +var _globals_start byte -var _globals_end [0]byte +var _globals_end byte diff --git a/runtime/internal/runtime/z_alloc.go b/runtime/internal/runtime/z_alloc.go new file mode 100644 index 0000000000..c7e67e2cf1 --- /dev/null +++ b/runtime/internal/runtime/z_alloc.go @@ -0,0 +1,9 @@ +package runtime + +import "unsafe" + +var zeroSizedAlloc uint8 + +func zeroAlloc() unsafe.Pointer { + return unsafe.Pointer(&zeroSizedAlloc) +} diff --git a/runtime/internal/runtime/z_chan.go b/runtime/internal/runtime/z_chan.go index e36a314001..238635ea81 100644 --- a/runtime/internal/runtime/z_chan.go +++ b/runtime/internal/runtime/z_chan.go @@ -21,6 +21,7 @@ import ( c "github.com/goplus/llgo/runtime/internal/clite" "github.com/goplus/llgo/runtime/internal/clite/pthread/sync" + "github.com/goplus/llgo/runtime/internal/runtime/math" ) // ----------------------------------------------------------------------------- @@ -37,12 +38,21 @@ type Chan struct { getp int len int cap int - sops []*selectOp + sops []*selectReg sends uint16 close bool } func NewChan(eltSize, cap int) *Chan { + if cap < 0 { + panic(plainError("makechan: size out of range")) + } + if cap > 0 { + mem, overflow := math.MulUintptr(uintptr(eltSize), uintptr(cap)) + if overflow || mem > maxAlloc { + panic(plainError("makechan: size out of range")) + } + } ret := new(Chan) if cap > 0 { ret.data = AllocU(uintptr(cap * eltSize)) @@ -71,13 +81,22 @@ func ChanCap(p *Chan) int { } func notifyOps(p *Chan) { - for _, sop := range p.sops { - sop.notify() + for _, reg := range p.sops { + if reg != nil { + reg.notify() + } } } func ChanClose(p *Chan) { + if p == nil { + panic(plainError("close of nil channel")) + } p.mutex.Lock() + if p.close { + p.mutex.Unlock() + panic(plainError("close of closed channel")) + } p.close = true notifyOps(p) p.mutex.Unlock() @@ -85,10 +104,20 @@ func ChanClose(p *Chan) { } func ChanTrySend(p *Chan, v unsafe.Pointer, eltSize int) bool { + if p == nil { + return false + } n := p.cap p.mutex.Lock() if n == 0 { - if p.getp != chanHasRecv || p.close { + if p.close { + p.mutex.Unlock() + panic(plainError("send on closed channel")) + } + if p.getp != chanHasRecv { + if len(p.sops) != 0 { + notifyOps(p) + } p.mutex.Unlock() return false } @@ -97,7 +126,11 @@ func ChanTrySend(p *Chan, v unsafe.Pointer, eltSize int) bool { } p.getp = chanNoSendRecv } else { - if p.len == n || p.close { + if p.close { + p.mutex.Unlock() + panic(plainError("send on closed channel")) + } + if p.len == n { p.mutex.Unlock() return false } @@ -112,22 +145,23 @@ func ChanTrySend(p *Chan, v unsafe.Pointer, eltSize int) bool { } func ChanSend(p *Chan, v unsafe.Pointer, eltSize int) bool { + if p == nil { + select {} + } n := p.cap p.mutex.Lock() if n == 0 { for p.getp != chanHasRecv && !p.close { - p.sends++ - // A blocked unbuffered send must wake select-based receivers so they can - // retry ChanTryRecv after observing that a sender is now waiting. - if p.sends == 1 { + if len(p.sops) != 0 { notifyOps(p) } + p.sends++ p.cond.Wait(&p.mutex) p.sends-- } if p.close { p.mutex.Unlock() - return false + panic(plainError("send on closed channel")) } if p.data != nil { c.Memcpy(p.data, v, uintptr(eltSize)) @@ -139,7 +173,7 @@ func ChanSend(p *Chan, v unsafe.Pointer, eltSize int) bool { } if p.close { p.mutex.Unlock() - return false + panic(plainError("send on closed channel")) } off := (p.getp + p.len) % n c.Memcpy(c.Advance(p.data, off*eltSize), v, uintptr(eltSize)) @@ -152,6 +186,9 @@ func ChanSend(p *Chan, v unsafe.Pointer, eltSize int) bool { } func ChanTryRecv(p *Chan, v unsafe.Pointer, eltSize int) (recvOK bool, tryOK bool) { + if p == nil { + return false, false + } n := p.cap p.mutex.Lock() if n == 0 { @@ -168,9 +205,11 @@ func ChanTryRecv(p *Chan, v unsafe.Pointer, eltSize int) (recvOK bool, tryOK boo p.mutex.Unlock() return } + slot := c.Advance(p.data, p.getp*eltSize) if v != nil { - c.Memcpy(v, c.Advance(p.data, p.getp*eltSize), uintptr(eltSize)) + c.Memcpy(v, slot, uintptr(eltSize)) } + c.Memset(slot, 0, uintptr(eltSize)) p.getp = (p.getp + 1) % n p.len-- } @@ -182,8 +221,8 @@ func ChanTryRecv(p *Chan, v unsafe.Pointer, eltSize int) (recvOK bool, tryOK boo for p.getp == chanHasRecv && !p.close { p.cond.Wait(&p.mutex) } - recvOK = !p.close - tryOK = recvOK + recvOK = p.getp != chanHasRecv + tryOK = recvOK || p.close p.mutex.Unlock() } else { recvOK, tryOK = true, true @@ -192,6 +231,9 @@ func ChanTryRecv(p *Chan, v unsafe.Pointer, eltSize int) (recvOK bool, tryOK boo } func ChanRecv(p *Chan, v unsafe.Pointer, eltSize int) (recvOK bool) { + if p == nil { + select {} + } n := p.cap p.mutex.Lock() if n == 0 { @@ -212,9 +254,11 @@ func ChanRecv(p *Chan, v unsafe.Pointer, eltSize int) (recvOK bool) { } p.cond.Wait(&p.mutex) } + slot := c.Advance(p.data, p.getp*eltSize) if v != nil { - c.Memcpy(v, c.Advance(p.data, p.getp*eltSize), uintptr(eltSize)) + c.Memcpy(v, slot, uintptr(eltSize)) } + c.Memset(slot, 0, uintptr(eltSize)) p.getp = (p.getp + 1) % n p.len-- } @@ -226,7 +270,7 @@ func ChanRecv(p *Chan, v unsafe.Pointer, eltSize int) (recvOK bool) { for p.getp == chanHasRecv && !p.close { p.cond.Wait(&p.mutex) } - recvOK = !p.close + recvOK = p.getp != chanHasRecv p.mutex.Unlock() } else { recvOK = true @@ -237,9 +281,29 @@ func ChanRecv(p *Chan, v unsafe.Pointer, eltSize int) (recvOK bool) { // ----------------------------------------------------------------------------- type selectOp struct { + mutex sync.Mutex + cond sync.Cond + sem bool + regs []*selectReg + gen uint64 + active bool + next *selectOp +} + +type selectReg struct { + op *selectOp + c *Chan + idx int + gen uint64 +} + +var selectPool struct { mutex sync.Mutex - cond sync.Cond - sem bool + head *selectOp +} + +func init() { + selectPool.mutex.Init(nil) } func (p *selectOp) init() { @@ -249,12 +313,24 @@ func (p *selectOp) init() { } func (p *selectOp) end() { - p.mutex.Destroy() - p.cond.Destroy() + p.mutex.Lock() + p.sem = false + p.active = false + p.regs = p.regs[:0] + p.mutex.Unlock() + + selectPool.mutex.Lock() + p.next = selectPool.head + selectPool.head = p + selectPool.mutex.Unlock() } func (p *selectOp) notify() { p.mutex.Lock() + if !p.active { + p.mutex.Unlock() + return + } p.sem = true p.mutex.Unlock() p.cond.Signal() @@ -269,6 +345,42 @@ func (p *selectOp) wait() { p.mutex.Unlock() } +func (r *selectReg) notify() { + op := r.op + if op == nil { + return + } + op.mutex.Lock() + if !op.active || op.gen != r.gen { + op.mutex.Unlock() + return + } + op.sem = true + op.mutex.Unlock() + op.cond.Signal() +} + +func acquireSelectOp() *selectOp { + selectPool.mutex.Lock() + op := selectPool.head + if op != nil { + selectPool.head = op.next + op.next = nil + } + selectPool.mutex.Unlock() + if op == nil { + op = new(selectOp) + op.init() + } + op.mutex.Lock() + op.sem = false + op.regs = op.regs[:0] + op.gen++ + op.active = true + op.mutex.Unlock() + return op +} + // ChanOp represents a channel operation. type ChanOp struct { C *Chan @@ -302,8 +414,7 @@ func TrySelect(ops ...ChanOp) (isel int, recvOK, tryOK bool) { // Select executes a blocking select operation. func Select(ops ...ChanOp) (isel int, recvOK bool) { - selOp := new(selectOp) // TODO(xsw): use c.AllocaNew[selectOp]() - selOp.init() + selOp := acquireSelectOp() for _, op := range ops { if op.C == nil { continue @@ -339,7 +450,9 @@ func prepareSelect(c *Chan, selOp *selectOp, isSend bool) { if c.cap == 0 && isSend { c.sends++ } - c.sops = append(c.sops, selOp) + reg := &selectReg{op: selOp, c: c, idx: len(c.sops), gen: selOp.gen} + c.sops = append(c.sops, reg) + selOp.regs = append(selOp.regs, reg) if c.cap == 0 && isSend { // A newly-registered select-send can make a select-recv runnable. notifyOps(c) @@ -352,11 +465,24 @@ func endSelect(c *Chan, selOp *selectOp, isSend bool) { if c.cap == 0 && isSend { c.sends-- } - for i, op := range c.sops { - if op == selOp { - c.sops = append(c.sops[:i], c.sops[i+1:]...) + for _, reg := range selOp.regs { + if reg == nil || reg.c != c { + continue + } + last := len(c.sops) - 1 + if last < 0 || reg.idx > last { break } + if reg.idx != last { + moved := c.sops[last] + c.sops[reg.idx] = moved + moved.idx = reg.idx + } + c.sops[last] = nil + c.sops = c.sops[:last] + reg.c = nil + reg.op = nil + break } c.mutex.Unlock() } diff --git a/runtime/internal/runtime/z_error.go b/runtime/internal/runtime/z_error.go index 9a21b8fdf0..993aa13658 100644 --- a/runtime/internal/runtime/z_error.go +++ b/runtime/internal/runtime/z_error.go @@ -39,25 +39,31 @@ func (e plainError) Error() string { func AssertRuntimeError(b bool, msg string) { if b { - panic(errorString(msg).Error()) + panic(errorString(msg)) } } func AssertNegativeShift(b bool) { if b { - panic(errorString("negative shift amount").Error()) + panic(errorString("negative shift amount")) } } func AssertIndexRange(b bool) { if b { - panic(errorString("index out of range").Error()) + panic(errorString("index out of range")) } } func AssertDivideByZero(b bool) { if b { - panic(errorString("integer divide by zero").Error()) + panic(errorString("integer divide by zero")) + } +} + +func AssertNilDeref(b bool) { + if b { + panic(errorString("invalid memory address or nil pointer dereference")) } } diff --git a/runtime/internal/runtime/z_gc.go b/runtime/internal/runtime/z_gc.go index 04764a106a..3be75a2565 100644 --- a/runtime/internal/runtime/z_gc.go +++ b/runtime/internal/runtime/z_gc.go @@ -28,11 +28,17 @@ import ( // AllocU allocates uninitialized memory. func AllocU(size uintptr) unsafe.Pointer { + if size == 0 { + return zeroAlloc() + } return bdwgc.Malloc(size) } // AllocZ allocates zero-initialized memory. func AllocZ(size uintptr) unsafe.Pointer { + if size == 0 { + return zeroAlloc() + } ret := bdwgc.Malloc(size) return c.Memset(ret, 0, size) } diff --git a/runtime/internal/runtime/z_gc_baremetal.go b/runtime/internal/runtime/z_gc_baremetal.go index afccff9705..f8ee67bb83 100644 --- a/runtime/internal/runtime/z_gc_baremetal.go +++ b/runtime/internal/runtime/z_gc_baremetal.go @@ -26,11 +26,17 @@ import ( // AllocU allocates uninitialized memory. func AllocU(size uintptr) unsafe.Pointer { + if size == 0 { + return zeroAlloc() + } return tinygogc.Alloc(size) } // AllocZ allocates zero-initialized memory. func AllocZ(size uintptr) unsafe.Pointer { + if size == 0 { + return zeroAlloc() + } return tinygogc.Alloc(size) } diff --git a/runtime/internal/runtime/z_nogc.go b/runtime/internal/runtime/z_nogc.go index 7cbc30c2f0..976760ea1a 100644 --- a/runtime/internal/runtime/z_nogc.go +++ b/runtime/internal/runtime/z_nogc.go @@ -27,11 +27,17 @@ import ( // AllocU allocates uninitialized memory. func AllocU(size uintptr) unsafe.Pointer { + if size == 0 { + return zeroAlloc() + } return c.Malloc(size) } // AllocZ allocates zero-initialized memory. func AllocZ(size uintptr) unsafe.Pointer { + if size == 0 { + return zeroAlloc() + } ret := c.Malloc(size) return c.Memset(ret, 0, size) } diff --git a/runtime/internal/runtime/z_print.go b/runtime/internal/runtime/z_print.go index 702dcf2b8d..0cdda16382 100644 --- a/runtime/internal/runtime/z_print.go +++ b/runtime/internal/runtime/z_print.go @@ -50,7 +50,29 @@ func PrintFloat(v float64) { } return } - c.Fprintf(c.Stderr, c.Str("%+e"), v) + // Go's builtin print/println formats float exponents with at least 3 digits, + // while libc "%+e" typically uses 2. Normalize the exponent width so runtime + // output matches the standard toolchain in goroot run cases. + buf := (*c.Char)(c.Alloca(32)) + c.Snprintf(buf, 32, c.Str("%+e"), v) + n := c.Strlen(buf) + if n >= 4 { + exp := n - 4 + ch := c.Index(buf, exp) + sign := c.Index(buf, exp+1) + d0 := c.Index(buf, exp+2) + d1 := c.Index(buf, exp+3) + if (ch == 'e' || ch == 'E') && + (sign == '+' || sign == '-') && + d0 >= '0' && d0 <= '9' && + d1 >= '0' && d1 <= '9' { + dst := unsafe.Pointer(c.Advance(buf, exp+3)) + src := unsafe.Pointer(c.Advance(buf, exp+2)) + c.Memmove(dst, src, 3) + *c.Advance(buf, exp+2) = '0' + } + } + c.Fputs(buf, c.Stderr) } func PrintComplex(v complex128) { diff --git a/runtime/internal/runtime/z_slice.go b/runtime/internal/runtime/z_slice.go index c47102b334..5f2a03639e 100644 --- a/runtime/internal/runtime/z_slice.go +++ b/runtime/internal/runtime/z_slice.go @@ -50,11 +50,11 @@ func NewSlice3(base unsafe.Pointer, eltSize, cap, i, j, k int) (s Slice) { // SliceAppend append elem data and returns a slice. func SliceAppend(src Slice, data unsafe.Pointer, num, etSize int) Slice { if etSize == 0 { - return src + return GrowSlice(src, num, etSize) } oldLen := src.len src = GrowSlice(src, num, etSize) - c.Memcpy(c.Advance(src.data, oldLen*etSize), data, uintptr(num*etSize)) + c.Memmove(c.Advance(src.data, oldLen*etSize), data, uintptr(num*etSize)) return src } @@ -62,9 +62,26 @@ func SliceAppend(src Slice, data unsafe.Pointer, num, etSize int) Slice { func GrowSlice(src Slice, num, etSize int) Slice { oldLen := src.len newLen := oldLen + num + if num < 0 || newLen < 0 { + panic(errorString("growslice: len out of range")) + } + if etSize == 0 { + if newLen > 0 && src.data == nil { + src.data = zeroAlloc() + } + if newLen > src.cap { + src.cap = nextslicecap(newLen, src.cap) + } + src.len = newLen + return src + } if newLen > src.cap { newCap := nextslicecap(newLen, src.cap) - p := AllocZ(uintptr(newCap * etSize)) + mem, overflow := math.MulUintptr(uintptr(newCap), uintptr(etSize)) + if overflow || mem > maxAlloc { + panic(errorString("growslice: len out of range")) + } + p := AllocZ(mem) if oldLen != 0 { c.Memcpy(p, src.data, uintptr(oldLen*etSize)) } @@ -134,6 +151,13 @@ func MakeSlice(len, cap int, etSize int) Slice { return Slice{AllocZ(mem), len, cap} } +func MakeSliceTo(dst *Slice, len, cap int, etSize int) { + if dst == nil { + return + } + *dst = MakeSlice(len, cap, etSize) +} + func panicmakeslicelen() { panic(errorString("makeslice: len out of range")) } @@ -146,4 +170,11 @@ func SliceClear(t *abi.SliceType, s Slice) { c.Memset(s.data, 0, uintptr(s.len)*t.Elem.Size()) } +func SliceToArrayPtr(src Slice, max int) unsafe.Pointer { + if src.len < max { + PanicSliceConvert(max, src.len) + } + return src.data +} + // ----------------------------------------------------------------------------- diff --git a/runtime/internal/runtime/z_string.go b/runtime/internal/runtime/z_string.go index 142526921d..c98dcb6485 100644 --- a/runtime/internal/runtime/z_string.go +++ b/runtime/internal/runtime/z_string.go @@ -66,7 +66,9 @@ func StringSlice(base String, i, j int) String { if i < base.len { return String{c.Advance(base.data, i), j - i} } - return String{nil, 0} + // Keep the source base for empty suffix slices so repeated slicing + // continues to report a stable base pointer like the standard runtime. + return String{base.data, 0} } type StringIter struct { diff --git a/runtime/internal/runtime/z_thread.go b/runtime/internal/runtime/z_thread.go index c2fbb84072..06fb62013d 100644 --- a/runtime/internal/runtime/z_thread.go +++ b/runtime/internal/runtime/z_thread.go @@ -17,12 +17,40 @@ package runtime import ( - _ "unsafe" + "unsafe" c "github.com/goplus/llgo/runtime/internal/clite" "github.com/goplus/llgo/runtime/internal/clite/pthread" + "github.com/goplus/llgo/runtime/internal/clite/sync/atomic" ) +var liveThreads int64 = 1 + +type threadStart struct { + routine pthread.RoutineFunc + arg c.Pointer +} + +func threadEntry(arg c.Pointer) c.Pointer { + startPtr := (*threadStart)(arg) + start := *startPtr + c.Free(arg) + defer atomic.Sub(&liveThreads, int64(1)) + return start.routine(start.arg) +} + func CreateThread(th *pthread.Thread, attr *pthread.Attr, routine pthread.RoutineFunc, arg c.Pointer) c.Int { - return pthread.Create(th, attr, routine, arg) + start := (*threadStart)(c.Malloc(unsafe.Sizeof(threadStart{}))) + *start = threadStart{routine: routine, arg: arg} + atomic.Add(&liveThreads, int64(1)) + ret := pthread.Create(th, attr, threadEntry, c.Pointer(start)) + if ret != 0 { + c.Free(c.Pointer(start)) + atomic.Sub(&liveThreads, int64(1)) + } + return ret +} + +func NumThreads() int { + return int(atomic.Load(&liveThreads)) } diff --git a/runtime/internal/runtime/z_unsafe.go b/runtime/internal/runtime/z_unsafe.go new file mode 100644 index 0000000000..140f43904c --- /dev/null +++ b/runtime/internal/runtime/z_unsafe.go @@ -0,0 +1,52 @@ +package runtime + +import ( + "unsafe" + + "github.com/goplus/llgo/runtime/internal/runtime/math" +) + +func unsafeRangeOK(data unsafe.Pointer, size uintptr) bool { + if size == 0 { + return true + } + base := uintptr(data) + end := base + size - 1 + return end >= base +} + +func UnsafeString(data unsafe.Pointer, n int) String { + if n < 0 { + panic(errorString("unsafe.String: len out of range")) + } + if data == nil { + if n == 0 { + return String{} + } + panic(errorString("unsafe.String: ptr is nil and len is not zero")) + } + if !unsafeRangeOK(data, uintptr(n)) { + panic(errorString("unsafe.String: len out of range")) + } + return String{data: data, len: n} +} + +func UnsafeSlice(data unsafe.Pointer, n int, elemSize int) Slice { + if n < 0 { + panic(errorString("unsafe.Slice: len out of range")) + } + if data == nil { + if n == 0 { + return Slice{} + } + panic(errorString("unsafe.Slice: ptr is nil and len is not zero")) + } + if elemSize == 0 { + return Slice{data: data, len: n, cap: n} + } + size, overflow := math.MulUintptr(uintptr(n), uintptr(elemSize)) + if overflow || !unsafeRangeOK(data, size) { + panic(errorString("unsafe.Slice: len out of range")) + } + return Slice{data: data, len: n, cap: n} +} diff --git a/ssa/abitype.go b/ssa/abitype.go index 484d05bb59..ef8e944363 100644 --- a/ssa/abitype.go +++ b/ssa/abitype.go @@ -62,6 +62,24 @@ var ( types.NewTuple(types.NewVar(token.NoPos, nil, "", types.Typ[types.Uintptr])), false) ) +func directIfaceType(t types.Type) bool { + switch t := types.Unalias(t).(type) { + case *types.Named: + return directIfaceType(t.Underlying()) + case *types.Pointer: + return true + case *types.Chan, *types.Map, *types.Signature: + return true + case *types.Basic: + return t.Kind() == types.UnsafePointer + case *types.Array: + return t.Len() == 1 && directIfaceType(t.Elem()) + case *types.Struct: + return t.NumFields() == 1 && directIfaceType(t.Field(0).Type()) + } + return false +} + func (b Builder) abiCommonFields(t types.Type, name string, hasUncommon bool) (fields []llvm.Value) { prog := b.Prog ab := prog.abi @@ -87,7 +105,7 @@ func (b Builder) abiCommonFields(t types.Type, name string, hasUncommon bool) (f fields = append(fields, fieldAlign) // Kind uint8 kind := uint8(ab.Kind(t)) - if k, _, _ := abi.DataKindOf(t, 0, prog.is32Bits); k != abi.Indirect { + if directIfaceType(t) { kind |= uint8(abi.KindDirectIface) } fields = append(fields, prog.IntVal(uint64(kind), prog.Byte()).impl) diff --git a/ssa/datastruct.go b/ssa/datastruct.go index 7b0ecdfcf3..79cd4966eb 100644 --- a/ssa/datastruct.go +++ b/ssa/datastruct.go @@ -21,6 +21,7 @@ import ( "go/types" "log" + ssaabi "github.com/goplus/llgo/ssa/abi" "github.com/goplus/llvm" ) @@ -44,6 +45,9 @@ func (b Builder) FieldAddr(x Expr, idx int) Expr { log.Printf("FieldAddr %v, %d\n", x.impl, idx) } prog := b.Prog + nilPtr := llvm.ConstNull(x.impl.Type()) + isNil := Expr{llvm.CreateICmp(b.impl, llvm.IntEQ, x.impl, nilPtr), prog.Bool()} + b.InlineCall(b.Pkg.rtFunc("AssertNilDeref"), isNil) tstruc := prog.Elem(x.Type) telem := prog.Field(tstruc, idx) pt := prog.Pointer(telem) @@ -176,6 +180,9 @@ func (b Builder) IndexAddr(x, idx Expr) Expr { indices := []llvm.Value{idx.impl} return Expr{llvm.CreateInBoundsGEP(b.impl, telem.ll, ptr.impl, indices), pt} case *types.Pointer: + nilPtr := llvm.ConstNull(x.impl.Type()) + isNil := Expr{llvm.CreateICmp(b.impl, llvm.IntEQ, x.impl, nilPtr), prog.Bool()} + b.InlineCall(b.Pkg.rtFunc("AssertNilDeref"), isNil) ar := t.Elem().Underlying().(*types.Array) max := prog.IntVal(uint64(ar.Len()), prog.Int()) idx = b.checkIndex(idx, max) @@ -298,6 +305,17 @@ func (b Builder) Index(x, idx Expr, takeAddr func() (addr Expr, zero bool)) Expr telem = prog.Index(x.Type) ptr, zero = takeAddr() max = prog.IntVal(uint64(t.Len()), prog.Int()) + case *types.Pointer: + ar, ok := t.Elem().Underlying().(*types.Array) + if !ok { + panic(fmt.Errorf("invalid operation: cannot index %v", t)) + } + telem = prog.Index(x.Type) + nilPtr := llvm.ConstNull(x.impl.Type()) + isNil := Expr{llvm.CreateICmp(b.impl, llvm.IntEQ, x.impl, nilPtr), prog.Bool()} + b.InlineCall(b.Pkg.rtFunc("AssertNilDeref"), isNil) + ptr = x + max = prog.IntVal(uint64(ar.Len()), prog.Int()) } idx = b.checkIndex(idx, max) if zero { @@ -670,6 +688,15 @@ func (b Builder) toPtr(x Expr) Expr { return Expr{vptr.impl, vtyp} } +func (b Builder) materializeRecvValue(ptr Expr) Expr { + val := b.Load(ptr) + elem := b.Prog.Elem(ptr.Type) + if ssaabi.HasPtrData(elem.raw.Type) { + b.zeroinit(ptr, SizeOf(b.Prog, elem)) + } + return val +} + func (b Builder) Recv(ch Expr, commaOk bool) (ret Expr) { if debugInstr { log.Printf("Recv %v, %v\n", ch.impl, commaOk) @@ -680,11 +707,12 @@ func (b Builder) Recv(ch Expr, commaOk bool) (ret Expr) { ptr := b.Alloc(etyp, false) ok := b.InlineCall(b.Pkg.rtFunc("ChanRecv"), ch, ptr, eltSize) if commaOk { - val := b.Load(ptr) + val := b.materializeRecvValue(ptr) t := prog.Struct(etyp, prog.Bool()) return b.aggregateValue(t, val.impl, ok.impl) } else { - return b.Load(ptr) + val := b.materializeRecvValue(ptr) + return val } } diff --git a/ssa/decl.go b/ssa/decl.go index 125dfe3d4d..0d3545a928 100644 --- a/ssa/decl.go +++ b/ssa/decl.go @@ -17,6 +17,8 @@ package ssa import ( + "crypto/sha256" + "encoding/hex" "go/types" "log" "strconv" @@ -76,6 +78,25 @@ type aGlobal struct { // variable. type Global = *aGlobal +const moduleZeroName = "__llgo.moduleZeroSizedAlloc$" + +func (p Package) moduleZeroSizedAlloc(elem Type) Expr { + key := elem.ll.String() + if raw := elem.RawType(); raw != nil { + key = raw.String() + } + sum := sha256.Sum256([]byte(key)) + name := moduleZeroName + hex.EncodeToString(sum[:8]) + zerobase := p.mod.NamedGlobal(name) + if zerobase.IsNil() { + zerobase = llvm.AddGlobal(p.mod, elem.ll, name) + zerobase.SetInitializer(llvm.ConstNull(elem.ll)) + zerobase.SetLinkage(llvm.PrivateLinkage) + zerobase.SetUnnamedAddr(true) + } + return Expr{zerobase, p.Prog.Pointer(elem)} +} + // NewVar creates a new global variable. func (p Package) NewVar(name string, typ types.Type, bg Background) Global { if v, ok := p.vars[name]; ok { @@ -95,6 +116,16 @@ func (p Package) NewVarEx(name string, t Type) Global { func (p Package) doNewVar(name string, t Type) Global { typ := p.Prog.Elem(t).ll + if p.Prog.td.TypeAllocSize(typ) == 0 { + if rt := p.Prog.runtime(); rt != nil { + zeroName := FullName(rt, "zeroSizedAlloc") + if name != zeroName { + ret := &aGlobal{p.moduleZeroSizedAlloc(p.Prog.Elem(t))} + p.vars[name] = ret + return ret + } + } + } gbl := llvm.AddGlobal(p.mod, typ, name) alignment := p.Prog.td.ABITypeAlignment(typ) gbl.SetAlignment(alignment) diff --git a/ssa/expr.go b/ssa/expr.go index 894f40f14c..428bab1a14 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -39,6 +39,18 @@ const ( OrderingSeqConsistent = llvm.AtomicOrderingSequentiallyConsistent ) +var ( + // int32 __eqsf2(float32, float32) and friends in compiler-rt. + softFloat32CmpSig = types.NewSignatureType(nil, nil, nil, + types.NewTuple( + types.NewVar(token.NoPos, nil, "", types.Typ[types.Float32]), + types.NewVar(token.NoPos, nil, "", types.Typ[types.Float32]), + ), + types.NewTuple(types.NewVar(token.NoPos, nil, "", types.Typ[types.Int32])), + false, + ) +) + // ----------------------------------------------------------------------------- type Expr struct { @@ -521,17 +533,51 @@ func (b Builder) BinOp(op token.Token, x, y Expr) Expr { if llop := mathOpToLLVM[idx]; llop != 0 { // Go requires integer division/modulo by zero to panic. // LLVM's integer div/rem are undefined on zero divisor, so - // we insert an explicit runtime check here. + // we insert an explicit runtime check here and lower through a + // safe non-zero divisor so targets like x86 don't trap first. + var zero llvm.Value + var isZero llvm.Value + var safeY llvm.Value if (op == token.QUO || op == token.REM) && (kind == vkSigned || kind == vkUnsigned) { needsCheck := true if rv := y.impl.IsAConstantInt(); !rv.IsNil() { needsCheck = rv.ZExtValue() == 0 } if needsCheck { - zero := llvm.ConstInt(y.ll, 0, false) - check := Expr{llvm.CreateICmp(b.impl, llvm.IntEQ, y.impl, zero), b.Prog.Bool()} + zero = llvm.ConstInt(y.ll, 0, false) + isZero = llvm.CreateICmp(b.impl, llvm.IntEQ, y.impl, zero) + check := Expr{isZero, b.Prog.Bool()} b.InlineCall(b.Pkg.rtFunc("AssertDivideByZero"), check) + safeY = llvm.CreateSelect(b.impl, isZero, llvm.ConstInt(y.ll, 1, false), y.impl) + } + } + // On x86/x86_64, signed div/rem of minInt by -1 traps even + // though Go defines it to produce quotient=minInt and + // remainder=0. Lower through safe operands and select the + // Go-defined result for that overflow case. + if (op == token.QUO || op == token.REM) && kind == vkSigned { + bits := b.Prog.SizeOf(x.Type) * 8 + minInt := llvm.ConstInt(x.ll, uint64(1)<<(bits-1), false) + negOne := llvm.ConstAllOnes(y.ll) + isMinInt := llvm.CreateICmp(b.impl, llvm.IntEQ, x.impl, minInt) + isNegOne := llvm.CreateICmp(b.impl, llvm.IntEQ, y.impl, negOne) + overflow := llvm.CreateAnd(b.impl, isMinInt, isNegOne) + + safeX := llvm.CreateSelect(b.impl, overflow, llvm.ConstInt(x.ll, 0, false), x.impl) + if safeY.IsNil() { + safeY = y.impl + } + safeY = llvm.CreateSelect(b.impl, overflow, llvm.ConstInt(y.ll, 1, false), safeY) + v := llvm.CreateBinOp(b.impl, llop, safeX, safeY) + if op == token.QUO { + v = llvm.CreateSelect(b.impl, overflow, x.impl, v) + } else { + v = llvm.CreateSelect(b.impl, overflow, llvm.ConstInt(x.ll, 0, false), v) } + return Expr{v, x.Type} + } + if !safeY.IsNil() { + return Expr{llvm.CreateBinOp(b.impl, llop, x.impl, safeY), x.Type} } return Expr{llvm.CreateBinOp(b.impl, llop, x.impl, y.impl), x.Type} } @@ -581,6 +627,9 @@ func (b Builder) BinOp(op token.Token, x, y Expr) Expr { return Expr{llvm.CreateICmp(b.impl, pred, x.impl, y.impl), tret} case vkFloat: pred := floatPredOpToLLVM[op-predOpBase] + if prog.Target() != nil && prog.Target().Target == "esp32" && x.ll == prog.Float32().ll { + return b.esp32Float32Pred(op, x, y, tret) + } return Expr{llvm.CreateFCmp(b.impl, pred, x.impl, y.impl), tret} case vkBool: pred := boolPredOpToLLVM[op-predOpBase] @@ -712,6 +761,7 @@ func (b Builder) UnOp(op token.Token, x Expr) (ret Expr) { } switch op { case token.MUL: + b.AssertNilDeref(x) return b.Load(x) case token.SUB: switch t := x.raw.Type.Underlying().(type) { @@ -864,7 +914,7 @@ func (b Builder) Convert(t Type, x Expr) (ret Expr) { case *types.Slice: if etyp, ok := xtyp.Elem().Underlying().(*types.Basic); ok { switch etyp.Kind() { - case types.Byte: + case types.Byte, types.Int8: ret.impl = b.InlineCall(b.Func.Pkg.rtFunc("StringFromBytes"), x).impl return case types.Rune: @@ -950,7 +1000,7 @@ func (b Builder) Convert(t Type, x Expr) (ret Expr) { if types.Identical(dst.Underlying(), x.RawType().Underlying()) { return b.ChangeType(t, x) } - panic("todo") + panic(fmt.Sprintf("Convert todo: %v <- %v", dst, x.RawType())) } func castUintptr(b Builder, x llvm.Value, xtyp Type, typ Type) llvm.Value { @@ -1189,6 +1239,36 @@ func (b Builder) compareSelect(op token.Token, x Expr, y ...Expr) Expr { return ret } +func (b Builder) esp32Float32Pred(op token.Token, x, y Expr, tret Type) Expr { + var name string + var pred llvm.IntPredicate + switch op { + case token.EQL: + name = "__eqsf2" + pred = llvm.IntEQ + case token.NEQ: + name = "__nesf2" + pred = llvm.IntNE + case token.LSS: + name = "__ltsf2" + pred = llvm.IntSLT + case token.LEQ: + name = "__lesf2" + pred = llvm.IntSLE + case token.GTR: + name = "__gtsf2" + pred = llvm.IntSGT + case token.GEQ: + name = "__gesf2" + pred = llvm.IntSGE + default: + panic("unreachable") + } + ret := b.Call(b.Pkg.cFunc(name, softFloat32CmpSig), x, y) + zero := Expr{llvm.ConstInt(b.Prog.Int32().ll, 0, false), b.Prog.Int32()} + return Expr{llvm.CreateICmp(b.impl, pred, ret.impl, zero.impl), tret} +} + // SelectValue chooses between two values based on the condition. func (b Builder) SelectValue(cond Expr, a Expr, bExpr Expr) Expr { sel := llvm.CreateSelect(b.impl, cond.impl, a.impl, bExpr.impl) @@ -1215,11 +1295,7 @@ func (b Builder) SelectValue(cond Expr, a Expr, bExpr Expr) Expr { func (b Builder) SliceToArrayPointer(x Expr, typ Type) (ret Expr) { ret.Type = typ max := b.Prog.IntVal(uint64(typ.RawType().Underlying().(*types.Pointer).Elem().Underlying().(*types.Array).Len()), b.Prog.Int()) - failed := Expr{llvm.CreateICmp(b.impl, llvm.IntSLT, b.SliceLen(x).impl, max.impl), b.Prog.Bool()} - b.IfThen(failed, func() { - b.InlineCall(b.Pkg.rtFunc("PanicSliceConvert"), b.SliceLen(x), max) - }) - ret.impl = b.SliceData(x).impl + ret = b.PtrCast(typ, b.InlineCall(b.Pkg.rtFunc("SliceToArrayPtr"), x, max)) return } @@ -1316,10 +1392,13 @@ func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) { case "imag": return b.getField(args[0], 1) case "String": // unsafe.String - return b.unsafeString(args[0].impl, args[1].impl) + size := b.fitIntSize(args[1]) + return b.ChangeType(b.Prog.String(), b.InlineCall(b.Pkg.rtFunc("UnsafeString"), args[0], size)) case "Slice": // unsafe.Slice size := b.fitIntSize(args[1]) - return b.unsafeSlice(args[0], size.impl, size.impl) + eltSize := b.Prog.IntVal(b.Prog.SizeOf(b.Prog.Elem(args[0].Type)), b.Prog.Int()) + tslice := b.Prog.Slice(b.Prog.Elem(args[0].Type)) + return b.ChangeType(tslice, b.InlineCall(b.Pkg.rtFunc("UnsafeSlice"), args[0], size, eltSize)) case "StringData": return b.StringData(args[0]) // TODO(xsw): check return type case "SliceData": diff --git a/ssa/expr_patch_test.go b/ssa/expr_patch_test.go new file mode 100644 index 0000000000..555226448c --- /dev/null +++ b/ssa/expr_patch_test.go @@ -0,0 +1,38 @@ +//go:build !llgo +// +build !llgo + +package ssa + +import ( + "go/token" + "go/types" + "strings" + "testing" +) + +func TestEsp32Float32PredUsesSoftFloatBuiltin(t *testing.T) { + prog := NewProgram(nil) + prog.Target().Target = "esp32" + pkg := prog.NewPackage("bar", "foo/bar") + + params := types.NewTuple( + types.NewVar(0, nil, "a", types.Typ[types.Float32]), + types.NewVar(0, nil, "b", types.Typ[types.Float32]), + ) + rets := types.NewTuple(types.NewVar(0, nil, "", types.Typ[types.Bool])) + sig := types.NewSignatureType(nil, nil, nil, params, rets, false) + fn := pkg.NewFunc("fn", sig, InGo) + b := fn.MakeBody(1) + b.Return(b.BinOp(token.EQL, fn.Param(0), fn.Param(1))) + + ir := pkg.String() + if !strings.Contains(ir, `declare i32 @__eqsf2(float, float)`) { + t.Fatalf("expected __eqsf2 declaration in IR:\n%s", ir) + } + if !strings.Contains(ir, `call i32 @__eqsf2(`) { + t.Fatalf("expected __eqsf2 call in IR:\n%s", ir) + } + if strings.Contains(ir, `fcmp oeq float`) { + t.Fatalf("unexpected float fcmp in IR:\n%s", ir) + } +} diff --git a/ssa/goroutine.go b/ssa/goroutine.go index aa9ea67ba4..a9ae30139c 100644 --- a/ssa/goroutine.go +++ b/ssa/goroutine.go @@ -75,7 +75,9 @@ func (b Builder) Go(fn Expr, buildCall func(Builder, Expr, ...Expr) Expr, args . } t := prog.Struct(typs...) voidPtr := prog.VoidPtr() - data := Expr{b.aggregateMalloc(t, flds...), voidPtr} + // Goroutine startup data may carry Go pointers, including closure ctx. + // Keep it in GC-managed memory so it remains visible across the thread start. + data := Expr{b.aggregateAllocU(t, flds...), voidPtr} size := prog.SizeOf(voidPtr) pthd := b.Alloca(prog.IntVal(uint64(size), prog.Uintptr())) b.pthreadCreate(pthd, prog.Nil(voidPtr), pkg.routine(t, fn, buildCall, len(args)), data) @@ -102,7 +104,6 @@ func (p Package) routine(t Type, fn Expr, buildCall func(Builder, Expr, ...Expr) args[i] = b.getField(data, i+offset) } buildCall(b, fn, args...) - b.free(param) b.Return(prog.Nil(prog.VoidPtr())) return routine.Expr } diff --git a/ssa/goroutine_patch_test.go b/ssa/goroutine_patch_test.go new file mode 100644 index 0000000000..1e669e7b4d --- /dev/null +++ b/ssa/goroutine_patch_test.go @@ -0,0 +1,51 @@ +package ssa_test + +import ( + "go/token" + "go/types" + "strings" + "testing" + + "github.com/goplus/gogen/packages" + "github.com/goplus/llgo/ssa" +) + +func TestGoClosureStartupUsesGCManagedMemory(t *testing.T) { + prog := ssa.NewProgram(nil) + prog.SetRuntime(func() *types.Package { + fset := token.NewFileSet() + imp := packages.NewImporter(fset) + pkg, _ := imp.Import(ssa.PkgRuntime) + return pkg + }) + pkg := prog.NewPackage("bar", "foo/bar") + + ctxFields := []*types.Var{ + types.NewField(0, nil, "x", types.Typ[types.Int], false), + } + ctxStruct := types.NewStruct(ctxFields, nil) + ctxParam := types.NewParam(0, nil, "__llgo_ctx", types.NewPointer(ctxStruct)) + innerSig := types.NewSignatureType(nil, nil, nil, types.NewTuple(ctxParam), nil, false) + inner := pkg.NewFunc("inner", innerSig, ssa.InGo) + ib := inner.MakeBody(1) + ib.Return() + + outer := pkg.NewFunc("outer", ssa.NoArgsNoRet, ssa.InGo) + ob := outer.MakeBody(1) + closure := ob.MakeClosure(inner.Expr, []ssa.Expr{prog.Val(42)}) + ob.Go(closure, func(b ssa.Builder, fn ssa.Expr, args ...ssa.Expr) ssa.Expr { + return b.Call(fn, args...) + }) + ob.Return() + + ir := pkg.String() + if strings.Contains(ir, "@malloc") { + t.Fatalf("goroutine startup data should not use malloc:\n%s", ir) + } + if strings.Contains(ir, "@free") { + t.Fatalf("goroutine startup data should not use free:\n%s", ir) + } + if got := strings.Count(ir, `"github.com/goplus/llgo/runtime/internal/runtime.AllocU"`); got < 2 { + t.Fatalf("expected closure ctx and goroutine startup data to use AllocU, got %d:\n%s", got, ir) + } +} diff --git a/ssa/interface.go b/ssa/interface.go index 8f0e9328a4..ea12688ae1 100644 --- a/ssa/interface.go +++ b/ssa/interface.go @@ -17,7 +17,6 @@ package ssa import ( - "go/constant" "go/token" "go/types" "log" @@ -119,6 +118,11 @@ func (b Builder) MakeInterface(tinter Type, x Expr) (ret Expr) { prog := b.Prog typ := x.Type tabi := b.abiType(typ.raw.Type) + if !directIfaceType(typ.raw.Type) { + vptr := b.AllocU(typ) + b.Store(vptr, x) + return Expr{b.unsafeInterface(rawIntf, tabi, vptr.impl), tinter} + } kind, _, lvl := abi.DataKindOf(typ.raw.Type, 0, prog.is32Bits) switch kind { case abi.Indirect: @@ -151,8 +155,35 @@ func (b Builder) MakeInterface(tinter Type, x Expr) (ret Expr) { return Expr{b.unsafeInterface(rawIntf, tabi, data), tinter} } +func (b Builder) MakeInterfaceFromPtr(tinter Type, ptr Expr) (ret Expr) { + rawIntf := tinter.raw.Type.Underlying().(*types.Interface) + prog := b.Prog + nilPtr := llvm.ConstNull(ptr.impl.Type()) + isNil := Expr{llvm.CreateICmp(b.impl, llvm.IntEQ, ptr.impl, nilPtr), prog.Bool()} + b.InlineCall(b.Pkg.rtFunc("AssertNilDeref"), isNil) + + typ := prog.Elem(ptr.Type) + tabi := b.abiType(typ.raw.Type) + if directIfaceType(typ.raw.Type) { + return b.MakeInterface(tinter, b.Load(ptr)) + } + + vptr := b.AllocU(typ) + dst := b.Convert(prog.VoidPtr(), vptr) + src := b.Convert(prog.VoidPtr(), ptr) + b.Call(b.Pkg.rtFunc("Typedmemmove"), tabi, dst, src) + return Expr{b.unsafeInterface(rawIntf, tabi, vptr.impl), tinter} +} + func (b Builder) valFromData(typ Type, data llvm.Value) Expr { prog := b.Prog + if !directIfaceType(typ.raw.Type) { + impl := b.impl + tll := typ.ll + tptr := llvm.PointerType(tll, 0) + ptr := llvm.CreatePointerCast(impl, data, tptr) + return Expr{llvm.CreateLoad(impl, tll, ptr), typ} + } kind, real, lvl := abi.DataKindOf(typ.raw.Type, 0, prog.is32Bits) switch kind { case abi.Indirect: @@ -256,7 +287,7 @@ func (b Builder) TypeAssert(x Expr, assertedTyp Type, commaOk bool) Expr { var eq Expr var val func() Expr if x.RawType() == assertedTyp.RawType() { - eq = b.Const(constant.MakeBool(!b.faceData(x.impl).IsNull()), b.Prog.Bool()) + eq = b.BinOp(token.NEQ, tx, b.Prog.Zero(b.Prog.AbiTypePtr())) val = func() Expr { return x } } else { if rawIntf, ok := assertedTyp.raw.Type.Underlying().(*types.Interface); ok { diff --git a/ssa/memory.go b/ssa/memory.go index 47555897f2..0c14bbf62a 100644 --- a/ssa/memory.go +++ b/ssa/memory.go @@ -118,6 +118,9 @@ func (b Builder) Alloc(elem Type, heap bool) (ret Expr) { pkg := b.Pkg size := SizeOf(prog, elem) if heap { + if prog.SizeOf(elem) == 0 { + return pkg.moduleZeroSizedAlloc(elem) + } ret = b.InlineCall(pkg.rtFunc("AllocZ"), size) } else { ret = Expr{llvm.CreateAlloca(b.impl, elem.ll), prog.VoidPtr()} @@ -345,6 +348,21 @@ func (b Builder) AtomicCmpXchg(ptr, old, new Expr) Expr { return Expr{ret, prog.Struct(t, prog.Bool())} } +func (b Builder) AssertNilDeref(ptr Expr) { + if b.Pkg.Prog.runtime() == nil { + return + } + if ptr.impl.IsNil() { + return + } + if ptr.impl.IsConstant() && !ptr.impl.IsNull() { + return + } + nilPtr := llvm.ConstNull(ptr.impl.Type()) + isNil := Expr{llvm.CreateICmp(b.impl, llvm.IntEQ, ptr.impl, nilPtr), b.Prog.Bool()} + b.InlineCall(b.Pkg.rtFunc("AssertNilDeref"), isNil) +} + // Load returns the value at the pointer ptr. func (b Builder) Load(ptr Expr) Expr { if debugInstr { diff --git a/ssa/package.go b/ssa/package.go index 41e7af21c4..f1d419d1e0 100644 --- a/ssa/package.go +++ b/ssa/package.go @@ -325,7 +325,7 @@ func (p Program) Linkname(name string) (link string, ok bool) { } func (p Program) runtime() *types.Package { - if p.rt == nil { + if p.rt == nil && p.rtget != nil { p.rt = p.rtget() } return p.rt @@ -720,6 +720,10 @@ func (p Package) SetExport(name, export string) { p.preserveSyms[export] = struct{}{} } +func (p Package) Preserve(name string) { + p.preserveSyms[name] = struct{}{} +} + func (p Package) ExportFuncs() map[string]string { return p.export } diff --git a/ssa/ssa_test.go b/ssa/ssa_test.go index 83eedb935f..5c93642a21 100644 --- a/ssa/ssa_test.go +++ b/ssa/ssa_test.go @@ -1129,6 +1129,36 @@ func TestBasicType(t *testing.T) { } } +func TestRecvZeroesPointerBearingTemp(t *testing.T) { + prog := NewProgram(nil) + prog.SetRuntime(func() *types.Package { + fset := token.NewFileSet() + imp := packages.NewImporter(fset) + pkg, _ := imp.Import(PkgRuntime) + return pkg + }) + pkg := prog.NewPackage("bar", "foo/bar") + chType := types.NewChan(types.SendRecv, types.NewSlice(types.Typ[types.Byte])) + params := types.NewTuple(types.NewVar(0, nil, "ch", chType)) + sig := types.NewSignatureType(nil, nil, nil, params, nil, false) + fn := pkg.NewFunc("fn", sig, InGo) + b := fn.MakeBody(1) + b.Recv(fn.Param(0), true) + b.Return() + + ir := pkg.String() + sliceAlloca := `alloca %"github.com/goplus/llgo/runtime/internal/runtime.Slice"` + if got := strings.Count(ir, sliceAlloca); got != 1 { + t.Fatalf("recv should use one slice temp, got %d:\n%s", got, ir) + } + if strings.Contains(ir, `store %"github.com/goplus/llgo/runtime/internal/runtime.Slice"`) { + t.Fatalf("recv should not spill slice result into a second temp:\n%s", ir) + } + if got := strings.Count(ir, "call void @llvm.memset"); got != 2 { + t.Fatalf("recv temp should be zeroed before and after use, got %d memsets:\n%s", got, ir) + } +} + func TestCompareSelect(t *testing.T) { prog := NewProgram(nil) pkg := prog.NewPackage("bar", "foo/bar") diff --git a/ssa/type.go b/ssa/type.go index 24a8117919..53cc092bde 100644 --- a/ssa/type.go +++ b/ssa/type.go @@ -651,15 +651,18 @@ func FuncName(pkg *types.Package, name string, recv *types.Var, org bool) string } func recvNamed(t types.Type) (typ *types.Named, ptr bool) { - if tp, ok := t.(*types.Pointer); ok { - t = tp.Elem() - ptr = true - } - if _, ok := t.(*types.Alias); ok { - t = types.Unalias(t) + for { + switch tt := t.(type) { + case *types.Alias: + t = types.Unalias(tt) + case *types.Pointer: + ptr = true + t = tt.Elem() + default: + typ, _ = t.(*types.Named) + return + } } - typ, _ = t.(*types.Named) - return } func TypeArgs(typeArgs []types.Type) string { diff --git a/ssa/type_funcname_test.go b/ssa/type_funcname_test.go new file mode 100644 index 0000000000..54ed828773 --- /dev/null +++ b/ssa/type_funcname_test.go @@ -0,0 +1,25 @@ +//go:build !llgo +// +build !llgo + +package ssa + +import ( + "go/token" + "go/types" + "testing" +) + +func TestFuncName_AliasPointerReceiverUsesUnderlyingNamedType(t *testing.T) { + pkg := types.NewPackage("github.com/goplus/llgo/ssa", "ssa") + rawObj := types.NewTypeName(token.NoPos, pkg, "aPackage", nil) + rawNamed := types.NewNamed(rawObj, types.NewStruct(nil, nil), nil) + aliasObj := types.NewTypeName(token.NoPos, pkg, "Package", nil) + alias := types.NewAlias(aliasObj, types.NewPointer(rawNamed)) + recv := types.NewVar(token.NoPos, pkg, "", alias) + + got := FuncName(pkg, "NewFunc", recv, false) + want := "github.com/goplus/llgo/ssa.(*aPackage).NewFunc" + if got != want { + t.Fatalf("FuncName alias receiver = %q, want %q", got, want) + } +} diff --git a/targets/esp32-riscv.app.elf.ld b/targets/esp32-riscv.app.elf.ld index aff15a8627..86b58da79e 100644 --- a/targets/esp32-riscv.app.elf.ld +++ b/targets/esp32-riscv.app.elf.ld @@ -22,13 +22,16 @@ SECTIONS PROVIDE (etext = .); } > iram_seg - .rodata ALIGN(4) : + /* Some ESP RISC-V testcases materialize float64 constants from .rodata. + * Keep the section itself 8-byte aligned so the linker does not place + * double constants at 4-byte-only addresses on RV32. */ + .rodata ALIGN(8) : { *(.rodata .rodata.* .gnu.linkonce.r.*) *(.rodata1) *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) - . = ALIGN(4); + . = ALIGN(8); __cpu_frequency = .; LONG(CPU_FREQUENCY); __uart0_clkdiv_reg = .; @@ -109,6 +112,7 @@ SECTIONS */ .stack (NOLOAD) : { + _stack_end = .; . = ALIGN(16); . += 16K; __stack = .; diff --git a/test/goroot/README.md b/test/goroot/README.md new file mode 100644 index 0000000000..5993339dc1 --- /dev/null +++ b/test/goroot/README.md @@ -0,0 +1,40 @@ +# GOROOT Runner + +This package runs selected upstream `GOROOT/test` cases against `llgo` without +copying the upstream source files into this repository. + +Current scope: + +- Source of truth is an external `GOROOT` +- Only `// run` cases are executed +- Cases are compared as `go run ` vs `llgo run ` +- Upstream files stay read-only; the runner uses a temporary symlinked work tree + +Basic usage: + +```bash +go test ./test/goroot -count=1 -args \ + -goroot "$(go env GOROOT)" \ + -dirs . \ + -case '^helloworld\.go$' +``` + +Multiple toolchains: + +```bash +bash ./dev/test_goroot.sh /path/to/go1.23 /path/to/go1.24 -- -dirs . -case '^helloworld\.go$' +``` + +Useful flags: + +- `-goroot`: upstream Go toolchain root to read tests from +- `-go`: baseline `go` binary; defaults to `/bin/go` +- `-llgo`: existing `llgo` binary to use; otherwise one is built from the current checkout +- `-dirs`: comma-separated `GOROOT/test` subdirectories to scan +- `-case`: regexp filter on the relative case path +- `-limit`: stop after N matching cases +- `-shard-index`: 0-based shard index used to partition matching cases +- `-shard-total`: total number of shards used to partition matching cases +- `-keepwork`: keep the temporary symlink work tree for debugging +- `-run-timeout`: timeout for each child `go`/`llgo` process; `0` disables the timeout +- `-xfail`: xfail YAML file, relative to repo root by default diff --git a/test/goroot/XFAIL_PRIORITY.md b/test/goroot/XFAIL_PRIORITY.md new file mode 100644 index 0000000000..8538209300 --- /dev/null +++ b/test/goroot/XFAIL_PRIORITY.md @@ -0,0 +1,318 @@ +# GOROOT XFAIL Priority + +Based on `test/goroot/xfail.yaml` at commit `0187bbcde`. + +## Current Count + +- Total xfails: `426` +- Host skips: `0` + +By version/platform: + +- `go1.24/linux/amd64`: `133` +- `go1.24/darwin/arm64`: `1` +- `go1.25/linux/amd64`: `134` +- `go1.25/darwin/arm64`: `2` +- `go1.26/linux/amd64`: `144` +- `go1.26/darwin/arm64`: `12` + +By family: + +- `fixedbugs`: `249` +- `(root)`: `129` +- `typeparam`: `30` +- `chan`: `6` +- `interface`: `6` +- `ken`: `6` + +## Priority Buckets + +### P0: Latest-version cross-platform failures + +These are the highest priority because they affect the latest Go version and reproduce on both `linux/amd64` and `darwin/arm64`. + +- `fixedbugs/issue72844.go` +- `devirtualization_nil_panics.go` +- `newexpr.go` +- `range4.go` +- `fixedbugs/issue70189.go` +- `fixedbugs/issue73916.go` +- `fixedbugs/issue73916b.go` +- `fixedbugs/issue73917.go` +- `fixedbugs/issue73920.go` +- `fixedbugs/issue75327.go` +- `fixedbugs/issue76008.go` + +Counts: + +- `go1.25+` cross-platform: `1` +- `go1.26` cross-platform: `11` + +### P1: Long-standing linux failures across all supported Go versions + +These are the largest stable backlog. Fixing one case here usually improves `go1.24`, `go1.25`, and `go1.26` at the same time on Linux. + +Count: + +- `133` cases shared by: + - `go1.24/linux/amd64` + - `go1.25/linux/amd64` + - `go1.26/linux/amd64` + +Family breakdown: + +- `fixedbugs`: `77` +- `(root)`: `41` +- `typeparam`: `10` +- `interface`: `2` +- `ken`: `2` +- `chan`: `1` + +Representative cases: + +- `(root)`: `append.go`, `blank.go`, `chancap.go`, `closedchan.go`, `convert4.go`, `deferfin.go` +- `fixedbugs`: `bug273.go`, `bug336.go`, `issue10332.go`, `issue12133.go`, `issue14646.go` +- `typeparam`: `issue45722.go`, `issue48225.go`, `issue48253.go` + +### P2: Latest-version linux-only additions + +These appear only on `go1.26/linux/amd64`. They look like new language or runtime compatibility gaps introduced by newer stdlib or compiler behavior. + +Count: + +- `10` + +Cases: + +- `devirtualization_nil_panics.go` +- `newexpr.go` +- `range4.go` +- `fixedbugs/issue70189.go` +- `fixedbugs/issue73916.go` +- `fixedbugs/issue73916b.go` +- `fixedbugs/issue73917.go` +- `fixedbugs/issue73920.go` +- `fixedbugs/issue75327.go` +- `fixedbugs/issue76008.go` + +Note: + +- These overlap with the `go1.26/darwin/arm64` additions, which is why they are also listed in `P0`. + +### P3: Darwin-specific scheduler/runtime tail + +These are smaller darwin-only tails. + +Stable across all darwin versions we run: + +- `chan/goroutines.go` + +Additional `go1.25+` darwin case: + +- `fixedbugs/issue72844.go` + +Additional `go1.26` darwin-only tail: + +- `devirtualization_nil_panics.go` +- `newexpr.go` +- `range4.go` +- `fixedbugs/issue70189.go` +- `fixedbugs/issue73916.go` +- `fixedbugs/issue73916b.go` +- `fixedbugs/issue73917.go` +- `fixedbugs/issue73920.go` +- `fixedbugs/issue75327.go` +- `fixedbugs/issue76008.go` + +## Recommended Fix Order + +1. `P0`: latest-version cross-platform failures +2. `P1`: shared linux backlog across all supported Go versions +3. `P3`: darwin-only scheduler/runtime tail + +Within `P1`, start with the non-`fixedbugs` root cases first, because they are usually easier to group by runtime/compiler subsystem and often explain multiple `fixedbugs` cases. + +## Repair Themes + +The following grouping is intended to drive fix order by subsystem, not by file name. + +### First wave: language/runtime semantics + +These are the best first targets because they are either cross-platform on newer Go versions, or they represent core runtime semantics that usually unblock multiple tests. + +#### 1. Range/new/devirtualization semantics + +Scope: + +- new Go 1.26 language/runtime behavior +- range lowering +- devirtualization correctness +- nil panic behavior and line attribution + +Cases: + +- `devirtualization_nil_panics.go` +- `newexpr.go` +- `range4.go` +- `fixedbugs/issue72844.go` +- `fixedbugs/issue75327.go` + +#### 2. Panic/recover/defer/wrapper semantics + +Scope: + +- `panic` / `recover` +- deferred calls +- method wrappers +- wrapper function pointers + +Cases: + +- `fixedbugs/issue73916.go` +- `fixedbugs/issue73916b.go` +- `fixedbugs/issue73917.go` +- `fixedbugs/issue73920.go` +- `recover.go` +- `recover1.go` +- `recover2.go` +- `recover3.go` + +#### 3. Map and interface equality semantics + +Scope: + +- map iteration during mutation +- `clear` +- NaN keys +- equality on non-comparable dynamic values + +Cases: + +- `fixedbugs/issue70189.go` +- `fixedbugs/issue76008.go` +- `interface/fake.go` +- `interface/noeq.go` + +#### 4. Method sets, wrappers, and reflection + +Scope: + +- value/pointer receiver dispatch +- method values +- wrapper generation +- reflection method lookup / retention + +Cases: + +- `method.go` +- `method5.go` +- `reflectmethod1.go` +- `reflectmethod2.go` +- `reflectmethod3.go` +- `reflectmethod5.go` +- `reflectmethod6.go` +- `fixedbugs/issue16037_run.go` + +#### 5. Core builtins, conversions, slices, and unsafe + +Scope: + +- `append` +- conversions +- slice/array layout +- `unsafe` builtins +- division and zero-sized values + +Cases: + +- `append.go` +- `convert4.go` +- `slicecap.go` +- `unsafebuiltins.go` +- `zerodivide.go` +- `zerosize.go` +- `divide.go` +- `divmod.go` + +#### 6. Channels, select, nil behavior, and control flow + +Scope: + +- channel operations +- `select` +- nil semantics +- switch/range control flow + +Cases: + +- `chan/select3.go` +- `chan/goroutines.go` +- `chancap.go` +- `closedchan.go` +- `range.go` +- `nil.go` +- `nilptr.go` +- `nilptr2.go` +- `switch.go` + +#### 7. Generics / type parameters + +Scope: + +- generic channels +- generic ordered maps +- nested type parameters +- type switches on type parameters + +Cases: + +- `typeparam/chans.go` +- `typeparam/issue48645a.go` +- `typeparam/issue49547.go` +- `typeparam/issue51521.go` +- `typeparam/mdempsky/16.go` +- `typeparam/mdempsky/17.go` +- `typeparam/nested.go` +- `typeparam/orderedmap.go` +- `typeparam/typeswitch5.go` +- `typeparam/typeswitch6.go` + +### Later wave: debug, trace, profiling, finalizer + +These should be intentionally deferred because they are less useful for broad xfail reduction early on, and several of them depend on debug info, profiling hooks, or GC/finalizer timing. + +#### 8. Debug info / PC-line / tracing style behavior + +Cases: + +- `inline_literal.go` +- `stackobj.go` +- `stackobj3.go` + +#### 9. Finalizer / heap profile / runtime instrumentation + +Cases: + +- `deferfin.go` +- `finprofiled.go` +- `heapsampling.go` +- `mallocfin.go` +- `tinyfin.go` + +### Suggested practical order + +1. `Range/new/devirtualization` +2. `Panic/recover/defer/wrapper` +3. `Map and interface equality` +4. `Method sets and reflection` +5. `Builtins/conversions/slices/unsafe` +6. `Channels and nil/control flow` +7. `Generics` +8. `Debug/trace` +9. `Finalizer/profile` + +## Notes + +- `fixedbugs/issue72844.go` is already the clearest cross-version and cross-platform signal. +- The `go1.26` new tail is compact and likely reflects a smaller number of newer semantic gaps. +- The big Linux shared backlog is the main bulk-reduction target. diff --git a/test/goroot/proc_other.go b/test/goroot/proc_other.go new file mode 100644 index 0000000000..d942ec62ea --- /dev/null +++ b/test/goroot/proc_other.go @@ -0,0 +1,14 @@ +//go:build !unix + +package goroot + +import "os/exec" + +func configureProcessGroup(cmd *exec.Cmd) {} + +func killProcessTree(cmd *exec.Cmd) { + if cmd.Process == nil { + return + } + _ = cmd.Process.Kill() +} diff --git a/test/goroot/proc_unix.go b/test/goroot/proc_unix.go new file mode 100644 index 0000000000..c16b444b69 --- /dev/null +++ b/test/goroot/proc_unix.go @@ -0,0 +1,19 @@ +//go:build unix + +package goroot + +import ( + "os/exec" + "syscall" +) + +func configureProcessGroup(cmd *exec.Cmd) { + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} +} + +func killProcessTree(cmd *exec.Cmd) { + if cmd.Process == nil { + return + } + _ = syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) +} diff --git a/test/goroot/runner_test.go b/test/goroot/runner_test.go new file mode 100644 index 0000000000..38ac3a5295 --- /dev/null +++ b/test/goroot/runner_test.go @@ -0,0 +1,1365 @@ +package goroot + +import ( + "bufio" + "bytes" + "encoding/json" + "errors" + "flag" + "fmt" + "go/build" + "go/format" + "go/parser" + "go/token" + "io" + "io/fs" + "os" + "os/exec" + "path" + "path/filepath" + "regexp" + "runtime" + "sort" + "strconv" + "strings" + "testing" + "time" + "unicode" + + "gopkg.in/yaml.v3" +) + +var ( + flagGOROOT = flag.String("goroot", os.Getenv("LLGO_GOROOT"), "Go toolchain root whose GOROOT/test sources should be used") + flagGoCmd = flag.String("go", os.Getenv("LLGO_GO"), "go binary used as baseline (default: /bin/go)") + flagLLGO = flag.String("llgo", os.Getenv("LLGO_TEST_LLGO"), "llgo binary used for comparisons (default: build from current checkout)") + flagDirs = flag.String("dirs", strings.Join(defaultGoRootTestDirs, ","), "comma-separated GOROOT/test subdirectories to scan") + flagCase = flag.String("case", os.Getenv("LLGO_GOROOT_CASE"), "regexp selecting cases by relative path") + flagLimit = flag.Int("limit", 0, "maximum number of matching cases to run") + flagShardI = flag.Int("shard-index", 0, "0-based shard index used to partition matching cases") + flagShardN = flag.Int("shard-total", 1, "number of shards used to partition matching cases") + flagKeep = flag.Bool("keepwork", false, "keep temporary work directories for debugging") + flagDirMode = flag.String("directive-mode", "legacy", "case discovery mode: legacy, ci, or runlike") + flagXFail = flag.String("xfail", filepath.Join("test", "goroot", "xfail.yaml"), "xfail configuration path relative to repo root") + flagBuildTO = flag.Duration("build-timeout", 3*time.Minute, "timeout for each go/llgo build step; 0 disables the timeout") + flagRunTO = flag.Duration("run-timeout", 20*time.Second, "timeout for the compiled program run step; 0 disables the timeout") + flagSlowBld = flag.Duration("slow-build", 10*time.Second, "log build steps that exceed this duration; 0 disables slow-build logging") + flagSlowRun = flag.Duration("slow-run", 5*time.Second, "log run steps that exceed this duration; 0 disables slow-run logging") +) + +var defaultGoRootTestDirs = []string{ + ".", + "ken", + "chan", + "interface", + "internal/runtime/sys", + "syntax", + "dwarf", + "fixedbugs", + "codegen", + "abi", + "typeparam", + "typeparam/mdempsky", + "arenas", +} + +type toolchainEnv struct { + GOOS string + GOARCH string + GOVERSION string + CGOEnabled string `json:"CGO_ENABLED"` + ReleaseTags []string +} + +type testCase struct { + RelPath string + Dir string + FileName string + Directive string + DirectiveArg []string +} + +type xfailConfig struct { + Entries []xfailEntry `yaml:"xfails"` + HostSkips []xfailEntry `yaml:"host_skips"` + Timeouts []timeoutEntry `yaml:"timeouts"` +} + +type xfailEntry struct { + Version string `yaml:"version"` + Platform string `yaml:"platform"` + Directive string `yaml:"directive"` + Case string `yaml:"case"` + Reason string `yaml:"reason"` +} + +type timeoutEntry struct { + Version string `yaml:"version"` + Platform string `yaml:"platform"` + Directive string `yaml:"directive"` + Case string `yaml:"case"` + Timeout string `yaml:"timeout"` + Reason string `yaml:"reason"` +} + +type directiveMode struct { + Name string + Directives map[string]bool + AllowRunArgs bool +} + +type directiveOptions struct { + BuildFlags []string + ProgramArgs []string + ExtraEnv []string + GoModVersion string + SingleFilePkgs bool + Timeout time.Duration +} + +type caseMetrics struct { + goBuild time.Duration + llgoBuild time.Duration + goRun time.Duration + llgoRun time.Duration +} + +type caseWorkspace struct { + rootDir string + workDir string + gopath string + cleanup func() +} + +func TestGoRootRunCases(t *testing.T) { + if *flagGOROOT == "" { + t.Skip("set -goroot or LLGO_GOROOT to run external GOROOT/test cases") + } + + repoRoot := repoRoot(t) + goroot, err := filepath.Abs(*flagGOROOT) + if err != nil { + t.Fatalf("resolve goroot: %v", err) + } + goCmd := *flagGoCmd + if goCmd == "" { + goCmd = filepath.Join(goroot, "bin", "go") + } + if _, err := os.Stat(goCmd); err != nil { + t.Fatalf("stat go command %q: %v", goCmd, err) + } + + envInfo := loadToolchainEnv(t, goCmd) + testRoot := filepath.Join(goroot, "test") + info, err := os.Stat(testRoot) + if err != nil { + t.Fatalf("stat GOROOT/test root %q: %v", testRoot, err) + } + if !info.IsDir() { + t.Fatalf("GOROOT/test root %q is not a directory", testRoot) + } + + llgoBin := *flagLLGO + if llgoBin == "" { + llgoBin = buildLLGOBinary(t, repoRoot, goCmd) + } + xfails := loadXFailConfig(t, repoRoot, *flagXFail) + caseFilter := compileCaseFilter(t, *flagCase) + mode := loadDirectiveMode(t, *flagDirMode) + cases := discoverCases(t, testRoot, envInfo, parseDirs(*flagDirs), caseFilter, *flagLimit, mode) + if len(cases) == 0 { + t.Fatalf("no matching cases found under %s for directive mode %q", testRoot, mode.Name) + } + cases = shardCases(t, cases, *flagShardI, *flagShardN) + if len(cases) == 0 { + t.Skipf("no matching cases selected for shard %d/%d", *flagShardI, *flagShardN) + } + + t.Logf("goroot=%s goversion=%s goos=%s goarch=%s shard=%d/%d cases=%d directive_mode=%s", goroot, envInfo.GOVERSION, envInfo.GOOS, envInfo.GOARCH, *flagShardI, *flagShardN, len(cases), mode.Name) + for _, tc := range cases { + tc := tc + t.Run(tc.RelPath, func(t *testing.T) { + if match, reason := xfails.MatchHostSkip(envInfo.GOVERSION, runtime.GOOS+"/"+runtime.GOARCH, tc); match { + t.Skipf("skipping host-unsafe case: %s", reason) + } + runTimeout := *flagRunTO + if timeout, reason, ok := xfails.MatchTimeout(envInfo.GOVERSION, envInfo.GOOS+"/"+envInfo.GOARCH, tc); ok { + runTimeout = timeout + t.Logf("using timeout override %s: %s", timeout, reason) + } + err := runCase(t, repoRoot, goroot, goCmd, llgoBin, tc, runTimeout) + match, reason := xfails.Match(envInfo.GOVERSION, envInfo.GOOS+"/"+envInfo.GOARCH, tc) + switch { + case err == nil && match: + t.Fatalf("unexpected success for xfail case: %s", reason) + case err != nil && match: + t.Logf("expected failure: %s", reason) + case err != nil: + t.Fatal(err) + } + }) + } +} + +func repoRoot(t *testing.T) string { + t.Helper() + wd, err := os.Getwd() + if err != nil { + t.Fatalf("getwd: %v", err) + } + root, err := filepath.Abs(filepath.Join(wd, "..", "..")) + if err != nil { + t.Fatalf("resolve repo root: %v", err) + } + return root +} + +func loadToolchainEnv(t *testing.T, goCmd string) toolchainEnv { + t.Helper() + cmd := exec.Command(goCmd, "env", "-json", "GOOS", "GOARCH", "GOVERSION", "CGO_ENABLED") + cmd.Env = append(os.Environ(), "GOENV=off", "GOFLAGS=") + var stdout bytes.Buffer + var stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + if err := cmd.Run(); err != nil { + t.Fatalf("%s env failed: %v\nstdout:\n%s\nstderr:\n%s", goCmd, err, stdout.Bytes(), stderr.Bytes()) + } + var info toolchainEnv + if err := json.Unmarshal(stdout.Bytes(), &info); err != nil { + t.Fatalf("decode %s env output: %v\nstdout:\n%s\nstderr:\n%s", goCmd, err, stdout.Bytes(), stderr.Bytes()) + } + info.ReleaseTags = releaseTagsFor(info.GOVERSION) + return info +} + +func buildLLGOBinary(t *testing.T, repoRoot, goCmd string) string { + t.Helper() + outDir := t.TempDir() + outPath := filepath.Join(outDir, "llgo") + if runtime.GOOS == "windows" { + outPath += ".exe" + } + cmd := exec.Command(goCmd, "build", "-tags=dev", "-o", outPath, "./cmd/llgo") + cmd.Dir = repoRoot + var out bytes.Buffer + cmd.Stdout = &out + cmd.Stderr = &out + if err := cmd.Run(); err != nil { + t.Fatalf("build llgo failed: %v\n%s", err, out.Bytes()) + } + return outPath +} + +func loadXFailConfig(t *testing.T, repoRoot, relPath string) xfailConfig { + t.Helper() + path := relPath + if !filepath.IsAbs(path) { + path = filepath.Join(repoRoot, relPath) + } + data, err := os.ReadFile(path) + if errors.Is(err, os.ErrNotExist) { + return xfailConfig{} + } + if err != nil { + t.Fatalf("read xfail file %q: %v", path, err) + } + var cfg xfailConfig + if err := yaml.Unmarshal(data, &cfg); err != nil { + t.Fatalf("parse xfail file %q: %v", path, err) + } + return cfg +} + +func compileCaseFilter(t *testing.T, expr string) *regexp.Regexp { + t.Helper() + if expr == "" { + return nil + } + re, err := regexp.Compile(expr) + if err != nil { + t.Fatalf("compile case regexp %q: %v", expr, err) + } + return re +} + +func parseDirs(csv string) []string { + parts := strings.Split(csv, ",") + out := make([]string, 0, len(parts)) + for _, part := range parts { + part = strings.TrimSpace(part) + if part == "" { + continue + } + out = append(out, part) + } + return out +} + +func loadDirectiveMode(t *testing.T, name string) directiveMode { + t.Helper() + switch name { + case "legacy": + return directiveMode{ + Name: "legacy", + Directives: map[string]bool{ + "run": true, + }, + AllowRunArgs: false, + } + case "ci": + return directiveMode{ + Name: "ci", + Directives: map[string]bool{ + "run": true, + "runoutput": true, + "rundir": true, + "runindir": true, + "buildrun": true, + }, + AllowRunArgs: true, + } + case "runlike": + return directiveMode{ + Name: "runlike", + Directives: map[string]bool{ + "run": true, + "runoutput": true, + "rundir": true, + "runindir": true, + "buildrun": true, + "buildrundir": true, + }, + AllowRunArgs: true, + } + default: + t.Fatalf("unknown -directive-mode=%q", name) + return directiveMode{} + } +} + +func discoverCases(t *testing.T, testRoot string, envInfo toolchainEnv, dirs []string, filter *regexp.Regexp, limit int, mode directiveMode) []testCase { + t.Helper() + ctx := build.Default + ctx.GOOS = envInfo.GOOS + ctx.GOARCH = envInfo.GOARCH + ctx.CgoEnabled = envInfo.CGOEnabled == "1" + ctx.GOROOT = filepath.Dir(testRoot) + ctx.ReleaseTags = envInfo.ReleaseTags + + var cases []testCase + for _, relDir := range dirs { + absDir := filepath.Join(testRoot, filepath.FromSlash(relDir)) + entries, err := os.ReadDir(absDir) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + t.Logf("skipping missing GOROOT/test dir %s", absDir) + continue + } + t.Fatalf("read %s: %v", absDir, err) + } + for _, entry := range entries { + name := entry.Name() + if entry.IsDir() || strings.HasPrefix(name, ".") || !strings.HasSuffix(name, ".go") { + continue + } + match, err := ctx.MatchFile(absDir, name) + if err != nil || !match { + continue + } + pathInTest := name + if relDir != "." { + pathInTest = path.Join(relDir, name) + } + if filter != nil && !filter.MatchString(pathInTest) { + continue + } + directive, args, ok := parseDirective(filepath.Join(absDir, name)) + if !ok || !mode.Directives[directive] { + continue + } + if directive == "run" && len(args) != 0 && !mode.AllowRunArgs { + continue + } + cases = append(cases, testCase{ + RelPath: pathInTest, + Dir: absDir, + FileName: name, + Directive: directive, + DirectiveArg: args, + }) + if limit > 0 && len(cases) >= limit { + return cases + } + } + } + return cases +} + +func shardCases(t *testing.T, cases []testCase, shardIndex, shardTotal int) []testCase { + t.Helper() + if shardTotal < 1 { + t.Fatalf("invalid -shard-total=%d; want >= 1", shardTotal) + } + if shardIndex < 0 || shardIndex >= shardTotal { + t.Fatalf("invalid -shard-index=%d for -shard-total=%d", shardIndex, shardTotal) + } + if shardTotal == 1 { + return cases + } + selected := make([]testCase, 0, len(cases)/shardTotal+1) + for i, tc := range cases { + if i%shardTotal == shardIndex { + selected = append(selected, tc) + } + } + return selected +} + +func parseDirective(filePath string) (string, []string, bool) { + f, err := os.Open(filePath) + if err != nil { + return "", nil, false + } + defer f.Close() + + scanner := bufio.NewScanner(f) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, "package ") { + break + } + if !strings.HasPrefix(line, "//") { + continue + } + text := strings.TrimSpace(strings.TrimPrefix(line, "//")) + fields, err := splitQuoted(text) + if err != nil { + return "", nil, false + } + if len(fields) == 0 { + continue + } + switch fields[0] { + case "run", "runoutput", "compile", "errorcheck", "errorcheckandrundir", "rundir", "runindir", "buildrun", "buildrundir": + return fields[0], fields[1:], true + } + } + return "", nil, false +} + +func runCase(t *testing.T, repoRoot, goroot, goCmd, llgoBin string, tc testCase, runTimeout time.Duration) error { + t.Helper() + opts, err := parseDirectiveOptions(tc.Directive, tc.DirectiveArg, runTimeout) + if err != nil { + return err + } + switch tc.Directive { + case "run", "buildrun": + return runSingleFileCase(t, repoRoot, goroot, goCmd, llgoBin, tc, opts) + case "runoutput": + return runOutputCase(t, repoRoot, goroot, goCmd, llgoBin, tc, opts) + case "rundir": + return runDirCase(t, repoRoot, goroot, goCmd, llgoBin, tc, opts, false) + case "runindir": + return runInDirCase(t, repoRoot, goroot, goCmd, llgoBin, tc, opts) + case "buildrundir": + return runDirCase(t, repoRoot, goroot, goCmd, llgoBin, tc, opts, true) + default: + return fmt.Errorf("unsupported directive %q", tc.Directive) + } +} + +func prepareCaseWorkspace(repoRoot string) (caseWorkspace, error) { + root, err := os.MkdirTemp("", "llgo-goroot-*") + if err != nil { + return caseWorkspace{}, err + } + gopath := filepath.Join(root, "gopath") + llgoPath := filepath.Join(gopath, "src", "github.com", "goplus") + if err := os.MkdirAll(llgoPath, 0o755); err != nil { + _ = os.RemoveAll(root) + return caseWorkspace{}, err + } + linkPath := filepath.Join(llgoPath, "llgo") + if err := os.Symlink(repoRoot, linkPath); err != nil && !errors.Is(err, os.ErrExist) { + _ = os.RemoveAll(root) + return caseWorkspace{}, fmt.Errorf("symlink %q -> %q: %w", linkPath, repoRoot, err) + } + workDir := filepath.Join(root, "work") + if err := os.MkdirAll(workDir, 0o755); err != nil { + _ = os.RemoveAll(root) + return caseWorkspace{}, err + } + return caseWorkspace{ + rootDir: root, + workDir: workDir, + gopath: gopath, + cleanup: func() { _ = os.RemoveAll(root) }, + }, nil +} + +func runnerEnv(repoRoot, goroot, gopath string, extra []string) []string { + env := append([]string{}, os.Environ()...) + pathFound := false + for i, item := range env { + switch { + case strings.HasPrefix(item, "GOROOT="): + env[i] = "GOROOT=" + goroot + case strings.HasPrefix(item, "GOENV="): + env[i] = "GOENV=off" + case strings.HasPrefix(item, "GOFLAGS="): + env[i] = "GOFLAGS=" + case strings.HasPrefix(item, "LLGO_ROOT="): + env[i] = "LLGO_ROOT=" + repoRoot + case strings.HasPrefix(item, "GOPATH="): + env[i] = "GOPATH=" + gopath + case strings.HasPrefix(item, "GO111MODULE="): + env[i] = "GO111MODULE=off" + case strings.HasPrefix(item, "PATH="): + pathFound = true + env[i] = "PATH=" + filepath.Join(goroot, "bin") + string(os.PathListSeparator) + strings.TrimPrefix(item, "PATH=") + } + } + if !pathFound { + env = append(env, "PATH="+filepath.Join(goroot, "bin")) + } + env = appendIfMissing(env, "GOROOT="+goroot) + env = appendIfMissing(env, "GOENV=off") + env = appendIfMissing(env, "GOFLAGS=") + env = appendIfMissing(env, "LLGO_ROOT="+repoRoot) + env = appendIfMissing(env, "GOPATH="+gopath) + env = appendIfMissing(env, "GO111MODULE=off") + for _, kv := range extra { + env = upsertEnv(env, kv) + } + return env +} + +func appendIfMissing(env []string, kv string) []string { + key := strings.SplitN(kv, "=", 2)[0] + "=" + for _, item := range env { + if strings.HasPrefix(item, key) { + return env + } + } + return append(env, kv) +} + +func upsertEnv(env []string, kv string) []string { + key := strings.SplitN(kv, "=", 2)[0] + "=" + for i, item := range env { + if strings.HasPrefix(item, key) { + env[i] = kv + return env + } + } + return append(env, kv) +} + +func runProgram(dir, app string, env []string, timeout time.Duration, args ...string) ([]byte, []byte, int, time.Duration, error) { + start := time.Now() + cmd := exec.Command(app, args...) + configureProcessGroup(cmd) + cmd.Dir = dir + cmd.Env = env + var stdout bytes.Buffer + var stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + if err := cmd.Start(); err != nil { + return nil, nil, 0, time.Since(start), err + } + + waitCh := make(chan error, 1) + go func() { + waitCh <- cmd.Wait() + }() + + var err error + timedOut := false + if timeout > 0 { + select { + case err = <-waitCh: + case <-time.After(timeout): + timedOut = true + killProcessTree(cmd) + err = <-waitCh + } + } else { + err = <-waitCh + } + exitCode := 0 + if err != nil { + var exitErr *exec.ExitError + switch { + case errors.As(err, &exitErr): + exitCode = exitErr.ExitCode() + default: + return nil, nil, 0, time.Since(start), err + } + } + elapsed := time.Since(start) + if timedOut { + return stdout.Bytes(), stderr.Bytes(), exitCode, elapsed, fmt.Errorf("timed out after %s", timeout) + } + return stdout.Bytes(), stderr.Bytes(), exitCode, elapsed, nil +} + +func commandFailure(prefix string, elapsed time.Duration, err error, stdout, stderr []byte, exitCode int) error { + var msg strings.Builder + fmt.Fprintf(&msg, "%s failed: %v", prefix, err) + fmt.Fprintf(&msg, "\nduration: %s", elapsed.Round(time.Millisecond)) + if exitCode != 0 { + fmt.Fprintf(&msg, "\nexit code: %d", exitCode) + } + if len(stdout) != 0 { + fmt.Fprintf(&msg, "\nstdout:\n%s", normalizeOutput(stdout)) + } + if len(stderr) != 0 { + fmt.Fprintf(&msg, "\nstderr:\n%s", normalizeOutput(stderr)) + } + return errors.New(msg.String()) +} + +func logSlowCase(t *testing.T, casePath string, goBuildDur, llgoBuildDur, goRunDur, llgoRunDur time.Duration) { + t.Helper() + slowBuild := *flagSlowBld > 0 && (goBuildDur >= *flagSlowBld || llgoBuildDur >= *flagSlowBld) + slowRun := *flagSlowRun > 0 && (goRunDur >= *flagSlowRun || llgoRunDur >= *flagSlowRun) + if !slowBuild && !slowRun { + return + } + t.Logf( + "slow case %s: go build=%s llgo build=%s go run=%s llgo run=%s", + casePath, + goBuildDur.Round(time.Millisecond), + llgoBuildDur.Round(time.Millisecond), + goRunDur.Round(time.Millisecond), + llgoRunDur.Round(time.Millisecond), + ) +} + +func normalizeOutput(in []byte) []byte { + in = bytes.ReplaceAll(in, []byte("\r\n"), []byte("\n")) + in = bytes.ReplaceAll(in, []byte("\r"), []byte("\n")) + lines := bytes.SplitAfter(in, []byte{'\n'}) + if len(lines) == 0 { + return in + } + var out bytes.Buffer + for _, line := range lines { + out.WriteString(trimLogTimestampPrefix(string(line))) + } + return out.Bytes() +} + +func filterNoise(in []byte) []byte { + lines := bytes.SplitAfter(in, []byte{'\n'}) + if len(lines) == 0 { + return in + } + var out bytes.Buffer + for _, line := range lines { + trimmed := strings.TrimSpace(string(line)) + switch { + case strings.HasPrefix(trimmed, "WARNING: Using LLGO root for devel:"): + continue + case strings.HasPrefix(trimmed, "WARNING: LLGO_ROOT is not a valid LLGO root:"): + continue + case strings.HasPrefix(trimmed, "ld64.lld: warning:"): + continue + case strings.HasPrefix(trimmed, "ld.lld: warning:"): + continue + case strings.HasPrefix(trimmed, "ld: warning:"): + continue + } + out.Write(line) + } + return out.Bytes() +} + +func trimLogTimestampPrefix(line string) string { + if len(line) < 20 { + return line + } + if line[4] != '/' || line[7] != '/' || line[10] != ' ' || line[13] != ':' || line[16] != ':' || line[19] != ' ' { + return line + } + for _, pos := range []int{0, 1, 2, 3, 5, 6, 8, 9, 11, 12, 14, 15, 17, 18} { + if line[pos] < '0' || line[pos] > '9' { + return line + } + } + return line[20:] +} + +func releaseTagsFor(goVersion string) []string { + major, minor, ok := parseGoVersion(goVersion) + if !ok || major != 1 || minor < 1 { + return nil + } + tags := make([]string, 0, minor) + for i := 1; i <= minor; i++ { + tags = append(tags, fmt.Sprintf("go1.%d", i)) + } + return tags +} + +func parseGoVersion(goVersion string) (int, int, bool) { + if !strings.HasPrefix(goVersion, "go") { + return 0, 0, false + } + body := strings.TrimPrefix(goVersion, "go") + parts := strings.SplitN(body, ".", 3) + if len(parts) < 2 { + return 0, 0, false + } + major, err := strconv.Atoi(parts[0]) + if err != nil { + return 0, 0, false + } + minorPart := parts[1] + var digits strings.Builder + for _, r := range minorPart { + if r < '0' || r > '9' { + break + } + digits.WriteRune(r) + } + if digits.Len() == 0 { + return 0, 0, false + } + minor, err := strconv.Atoi(digits.String()) + if err != nil { + return 0, 0, false + } + return major, minor, true +} + +func (cfg xfailConfig) Match(goVersion, platform string, tc testCase) (bool, string) { + return matchEntries(cfg.Entries, goVersion, platform, tc) +} + +func (cfg xfailConfig) MatchHostSkip(goVersion, platform string, tc testCase) (bool, string) { + return matchEntries(cfg.HostSkips, goVersion, platform, tc) +} + +func (cfg xfailConfig) MatchTimeout(goVersion, platform string, tc testCase) (time.Duration, string, bool) { + for _, entry := range cfg.Timeouts { + if !entry.matches(goVersion, platform, tc) { + continue + } + timeout, err := time.ParseDuration(entry.Timeout) + if err != nil { + return 0, fmt.Sprintf("invalid timeout override %q for %s: %v", entry.Timeout, entry.Case, err), false + } + reason := entry.Reason + if reason == "" { + reason = entry.Case + } + return timeout, reason, true + } + return 0, "", false +} + +func matchEntries(entries []xfailEntry, goVersion, platform string, tc testCase) (bool, string) { + for _, entry := range entries { + if !entry.matches(goVersion, platform, tc) { + continue + } + reason := entry.Reason + if reason == "" { + reason = entry.Case + } + return true, reason + } + return false, "" +} + +func (entry xfailEntry) matches(goVersion, platform string, tc testCase) bool { + return matchEntry(entry.Version, entry.Platform, entry.Directive, entry.Case, goVersion, platform, tc) +} + +func (entry timeoutEntry) matches(goVersion, platform string, tc testCase) bool { + return matchEntry(entry.Version, entry.Platform, entry.Directive, entry.Case, goVersion, platform, tc) +} + +func matchEntry(version, platform, directive, casePattern, goVersion, goPlatform string, tc testCase) bool { + if version != "" && !matchGoVersion(version, goVersion) { + return false + } + if platform != "" && platform != goPlatform { + return false + } + if directive != "" && directive != tc.Directive { + return false + } + if casePattern == "" { + return true + } + ok, err := path.Match(casePattern, tc.RelPath) + return err == nil && ok +} + +func matchGoVersion(version, goVersion string) bool { + if goVersion == version { + return true + } + suffix, ok := strings.CutPrefix(goVersion, version) + if !ok { + return false + } + return strings.HasPrefix(suffix, ".") || strings.HasPrefix(suffix, "rc") || strings.HasPrefix(suffix, "beta") +} + +func splitQuoted(s string) ([]string, error) { + var args []string + arg := make([]rune, len(s)) + escaped := false + quoted := false + quote := '\x00' + i := 0 + for _, r := range s { + switch { + case escaped: + escaped = false + case r == '\\': + escaped = true + continue + case quote != '\x00': + if r == quote { + quote = '\x00' + continue + } + case r == '"' || r == '\'': + quoted = true + quote = r + continue + case unicode.IsSpace(r): + if quoted || i > 0 { + quoted = false + args = append(args, string(arg[:i])) + i = 0 + } + continue + } + arg[i] = r + i++ + } + if quoted || i > 0 { + args = append(args, string(arg[:i])) + } + if quote != '\x00' { + return args, errors.New("unclosed quote") + } + return args, nil +} + +func parseDirectiveOptions(directive string, args []string, defaultRunTimeout time.Duration) (directiveOptions, error) { + opts := directiveOptions{Timeout: defaultRunTimeout} + args = append([]string(nil), args...) + for len(args) > 0 && strings.HasPrefix(args[0], "-") { + switch args[0] { + case "-1", "-0": + args = args[1:] + case "-s": + opts.SingleFilePkgs = true + args = args[1:] + case "-t": + if len(args) < 2 { + return directiveOptions{}, fmt.Errorf("%s: missing value for -t", directive) + } + secs, err := strconv.Atoi(args[1]) + if err != nil { + return directiveOptions{}, fmt.Errorf("%s: invalid -t value %q: %w", directive, args[1], err) + } + opts.Timeout = time.Duration(secs) * time.Second + args = args[2:] + case "-goexperiment": + if len(args) < 2 { + return directiveOptions{}, fmt.Errorf("%s: missing value for -goexperiment", directive) + } + opts.ExtraEnv = appendDirectiveEnv(opts.ExtraEnv, "GOEXPERIMENT", args[1]) + args = args[2:] + case "-godebug": + if len(args) < 2 { + return directiveOptions{}, fmt.Errorf("%s: missing value for -godebug", directive) + } + opts.ExtraEnv = appendDirectiveEnv(opts.ExtraEnv, "GODEBUG", args[1]) + args = args[2:] + case "-gomodversion": + if len(args) < 2 { + return directiveOptions{}, fmt.Errorf("%s: missing value for -gomodversion", directive) + } + opts.GoModVersion = args[1] + args = args[2:] + case "-gcflags", "-tags": + if len(args) < 2 { + return directiveOptions{}, fmt.Errorf("%s: missing value for %s", directive, args[0]) + } + opts.BuildFlags = append(opts.BuildFlags, args[0], args[1]) + args = args[2:] + case "-ldflags": + if len(args) < 2 { + return directiveOptions{}, fmt.Errorf("%s: missing value for -ldflags", directive) + } + payload := []string{args[1]} + args = args[2:] + for len(args) > 0 && strings.HasPrefix(args[0], "-") { + switch args[0] { + case "-1", "-0", "-s", "-t", "-goexperiment", "-godebug", "-gomodversion", "-gcflags", "-tags", "-ldflags": + goto doneLDFlags + } + payload = append(payload, args[0]) + args = args[1:] + } + doneLDFlags: + opts.BuildFlags = append(opts.BuildFlags, "-ldflags", strings.Join(payload, " ")) + default: + opts.BuildFlags = append(opts.BuildFlags, args[0]) + args = args[1:] + } + } + opts.ProgramArgs = append(opts.ProgramArgs, args...) + return opts, nil +} + +func appendDirectiveEnv(env []string, key, value string) []string { + kv := key + "=" + value + for i, item := range env { + if strings.HasPrefix(item, key+"=") { + env[i] = item + "," + value + return env + } + } + return append(env, kv) +} + +func runSingleFileCase(t *testing.T, repoRoot, goroot, goCmd, llgoBin string, tc testCase, opts directiveOptions) error { + t.Helper() + ws, err := prepareCaseWorkspace(repoRoot) + if err != nil { + return err + } + if !*flagKeep { + defer ws.cleanup() + } + if err := overlayDir(ws.workDir, tc.Dir); err != nil { + return err + } + env := runnerEnv(repoRoot, goroot, ws.gopath, opts.ExtraEnv) + goBin := filepath.Join(ws.rootDir, "go.out") + llgoOut := filepath.Join(ws.rootDir, "llgo.out") + metrics := caseMetrics{} + + goBuildStdout, goBuildStderr, goBuildExit, goBuildDur, err := runProgram(ws.workDir, goCmd, env, *flagBuildTO, append([]string{"build"}, append(opts.BuildFlags, "-o", goBin, tc.FileName)...)...) + metrics.goBuild += goBuildDur + if err != nil { + return commandFailure("baseline go build", goBuildDur, err, goBuildStdout, goBuildStderr, goBuildExit) + } + if err := ensureBuiltBinary(goBin, "baseline go build"); err != nil { + return err + } + llgoBuildStdout, llgoBuildStderr, llgoBuildExit, llgoBuildDur, err := runProgram(ws.workDir, llgoBin, env, *flagBuildTO, append([]string{"build"}, append(opts.BuildFlags, "-o", llgoOut, tc.FileName)...)...) + metrics.llgoBuild += llgoBuildDur + if err != nil { + return commandFailure("llgo build", llgoBuildDur, err, llgoBuildStdout, llgoBuildStderr, llgoBuildExit) + } + if err := ensureBuiltBinary(llgoOut, "llgo build"); err != nil { + return err + } + + goStdout, goStderr, goExit, goRunDur, err := runProgram(ws.workDir, goBin, env, opts.Timeout, opts.ProgramArgs...) + metrics.goRun += goRunDur + if err != nil { + return commandFailure("baseline go run", goRunDur, err, goStdout, goStderr, goExit) + } + llgoStdout, llgoStderr, llgoExit, llgoRunDur, err := runProgram(ws.workDir, llgoOut, env, opts.Timeout, opts.ProgramArgs...) + metrics.llgoRun += llgoRunDur + if err != nil { + return commandFailure("llgo run", llgoRunDur, err, llgoStdout, llgoStderr, llgoExit) + } + + logSlowCase(t, tc.RelPath, metrics.goBuild, metrics.llgoBuild, metrics.goRun, metrics.llgoRun) + return compareOutputs(goStdout, goStderr, goExit, llgoStdout, llgoStderr, llgoExit) +} + +func runOutputCase(t *testing.T, repoRoot, goroot, goCmd, llgoBin string, tc testCase, opts directiveOptions) error { + t.Helper() + ws, err := prepareCaseWorkspace(repoRoot) + if err != nil { + return err + } + if !*flagKeep { + defer ws.cleanup() + } + if err := overlayDir(ws.workDir, tc.Dir); err != nil { + return err + } + env := runnerEnv(repoRoot, goroot, ws.gopath, opts.ExtraEnv) + metrics := caseMetrics{} + + goGen, goGenBuild, goGenRun, err := generateRunOutput(ws, goCmd, env, tc.FileName, opts, "go") + metrics.goBuild += goGenBuild + metrics.goRun += goGenRun + if err != nil { + return err + } + llgoGen, llgoGenBuild, llgoGenRun, err := generateRunOutput(ws, llgoBin, env, tc.FileName, opts, "llgo") + metrics.llgoBuild += llgoGenBuild + metrics.llgoRun += llgoGenRun + if err != nil { + return err + } + + goStdout, goStderr, goExit, goBuildDur, goRunDur, err := runGeneratedProgram(ws, goCmd, env, goGen, "go") + metrics.goBuild += goBuildDur + metrics.goRun += goRunDur + if err != nil { + return err + } + llgoStdout, llgoStderr, llgoExit, llgoBuildDur, llgoRunDur, err := runGeneratedProgram(ws, llgoBin, env, llgoGen, "llgo") + metrics.llgoBuild += llgoBuildDur + metrics.llgoRun += llgoRunDur + if err != nil { + return err + } + + logSlowCase(t, tc.RelPath, metrics.goBuild, metrics.llgoBuild, metrics.goRun, metrics.llgoRun) + return compareOutputs(goStdout, goStderr, goExit, llgoStdout, llgoStderr, llgoExit) +} + +func runInDirCase(t *testing.T, repoRoot, goroot, goCmd, llgoBin string, tc testCase, opts directiveOptions) error { + t.Helper() + srcDir := caseSourceDir(tc) + ws, err := prepareCaseWorkspace(repoRoot) + if err != nil { + return err + } + if !*flagKeep { + defer ws.cleanup() + } + if err := overlayDir(ws.workDir, srcDir); err != nil { + return err + } + modVersion := opts.GoModVersion + if modVersion == "" { + modVersion = "1.14" + } + modName := filepath.Base(srcDir) + if err := os.WriteFile(filepath.Join(ws.workDir, "go.mod"), []byte(fmt.Sprintf("module %s\ngo %s\n", modName, modVersion)), 0o644); err != nil { + return err + } + env := runnerEnv(repoRoot, goroot, ws.gopath, append(opts.ExtraEnv, "GO111MODULE=on")) + return runBuildAndCompare(t, tc.RelPath, ws.workDir, ws.rootDir, env, goCmd, llgoBin, append([]string{}, opts.BuildFlags...), opts.ProgramArgs, opts.Timeout) +} + +func runDirCase(t *testing.T, repoRoot, goroot, goCmd, llgoBin string, tc testCase, opts directiveOptions, preserveLayout bool) error { + t.Helper() + srcDir := caseSourceDir(tc) + ws, err := prepareCaseWorkspace(repoRoot) + if err != nil { + return err + } + if !*flagKeep { + defer ws.cleanup() + } + if preserveLayout { + if err := overlayDir(ws.workDir, srcDir); err != nil { + return err + } + } else { + if err := stageRundirLayout(ws.workDir, srcDir, opts.SingleFilePkgs); err != nil { + return err + } + } + env := runnerEnv(repoRoot, goroot, ws.gopath, opts.ExtraEnv) + return runBuildAndCompare(t, tc.RelPath, ws.workDir, ws.rootDir, env, goCmd, llgoBin, append([]string{}, opts.BuildFlags...), opts.ProgramArgs, opts.Timeout) +} + +func runBuildAndCompare(t *testing.T, casePath, workDir, rootDir string, env []string, goCmd, llgoBin string, buildFlags, programArgs []string, runTimeout time.Duration) error { + t.Helper() + goBin := filepath.Join(rootDir, "go.out") + llgoOut := filepath.Join(rootDir, "llgo.out") + metrics := caseMetrics{} + + goBuildStdout, goBuildStderr, goBuildExit, goBuildDur, err := runProgram(workDir, goCmd, env, *flagBuildTO, append([]string{"build"}, append(buildFlags, "-o", goBin, ".")...)...) + metrics.goBuild += goBuildDur + if err != nil { + return commandFailure("baseline go build", goBuildDur, err, goBuildStdout, goBuildStderr, goBuildExit) + } + if err := ensureBuiltBinary(goBin, "baseline go build"); err != nil { + return err + } + llgoBuildStdout, llgoBuildStderr, llgoBuildExit, llgoBuildDur, err := runProgram(workDir, llgoBin, env, *flagBuildTO, append([]string{"build"}, append(buildFlags, "-o", llgoOut, ".")...)...) + metrics.llgoBuild += llgoBuildDur + if err != nil { + return commandFailure("llgo build", llgoBuildDur, err, llgoBuildStdout, llgoBuildStderr, llgoBuildExit) + } + if err := ensureBuiltBinary(llgoOut, "llgo build"); err != nil { + return err + } + + goStdout, goStderr, goExit, goRunDur, err := runProgram(workDir, goBin, env, runTimeout, programArgs...) + metrics.goRun += goRunDur + if err != nil { + return commandFailure("baseline go run", goRunDur, err, goStdout, goStderr, goExit) + } + llgoStdout, llgoStderr, llgoExit, llgoRunDur, err := runProgram(workDir, llgoOut, env, runTimeout, programArgs...) + metrics.llgoRun += llgoRunDur + if err != nil { + return commandFailure("llgo run", llgoRunDur, err, llgoStdout, llgoStderr, llgoExit) + } + + logSlowCase(t, casePath, metrics.goBuild, metrics.llgoBuild, metrics.goRun, metrics.llgoRun) + return compareOutputs(goStdout, goStderr, goExit, llgoStdout, llgoStderr, llgoExit) +} + +func compareOutputs(goStdout, goStderr []byte, goExit int, llgoStdout, llgoStderr []byte, llgoExit int) error { + goStdout = normalizeOutput(goStdout) + goStderr = normalizeOutput(goStderr) + llgoStdout = normalizeOutput(filterNoise(llgoStdout)) + llgoStderr = normalizeOutput(filterNoise(llgoStderr)) + if !bytes.Equal(llgoStdout, goStdout) { + return fmt.Errorf("stdout mismatch\nllgo:\n%s\n\ngo:\n%s", llgoStdout, goStdout) + } + if !bytes.Equal(llgoStderr, goStderr) { + return fmt.Errorf("stderr mismatch\nllgo:\n%s\n\ngo:\n%s", llgoStderr, goStderr) + } + if llgoExit != goExit { + return fmt.Errorf("exit code mismatch: llgo=%d go=%d", llgoExit, goExit) + } + return nil +} + +func caseSourceDir(tc testCase) string { + base := strings.TrimSuffix(tc.FileName, filepath.Ext(tc.FileName)) + ".dir" + return filepath.Join(tc.Dir, base) +} + +func generateRunOutput(ws caseWorkspace, tool string, env []string, fileName string, opts directiveOptions, label string) (string, time.Duration, time.Duration, error) { + outBin := filepath.Join(ws.rootDir, label+"-gen.out") + buildStdout, buildStderr, buildExit, buildDur, err := runProgram(ws.workDir, tool, env, *flagBuildTO, append([]string{"build"}, append(opts.BuildFlags, "-o", outBin, fileName)...)...) + if err != nil { + return "", buildDur, 0, commandFailure(label+" generate build", buildDur, err, buildStdout, buildStderr, buildExit) + } + if err := ensureBuiltBinary(outBin, label+" generate build"); err != nil { + return "", buildDur, 0, err + } + stdout, stderr, exitCode, runDur, err := runProgram(ws.workDir, outBin, env, opts.Timeout, opts.ProgramArgs...) + if err != nil { + return "", buildDur, runDur, commandFailure(label+" generate run", runDur, err, stdout, stderr, exitCode) + } + genBase := label + "_tmp__.go" + genFile := filepath.Join(ws.workDir, genBase) + if err := os.WriteFile(genFile, stdout, 0o644); err != nil { + return "", buildDur, runDur, err + } + return genBase, buildDur, runDur, nil +} + +func runGeneratedProgram(ws caseWorkspace, tool string, env []string, fileName, label string) ([]byte, []byte, int, time.Duration, time.Duration, error) { + outBin := filepath.Join(ws.rootDir, label+"-tmp.out") + buildStdout, buildStderr, buildExit, buildDur, err := runProgram(ws.workDir, tool, env, *flagBuildTO, "build", "-o", outBin, fileName) + if err != nil { + return nil, nil, 0, buildDur, 0, commandFailure(label+" generated build", buildDur, err, buildStdout, buildStderr, buildExit) + } + if err := ensureBuiltBinary(outBin, label+" generated build"); err != nil { + return nil, nil, 0, buildDur, 0, err + } + stdout, stderr, exitCode, runDur, err := runProgram(ws.workDir, outBin, env, *flagRunTO) + if err != nil { + return nil, nil, 0, buildDur, runDur, commandFailure(label+" generated run", runDur, err, stdout, stderr, exitCode) + } + return stdout, stderr, exitCode, buildDur, runDur, nil +} + +func overlayDir(dstRoot, srcRoot string) error { + dstRoot = filepath.Clean(dstRoot) + if err := os.MkdirAll(dstRoot, 0o777); err != nil { + return err + } + srcRoot, err := filepath.Abs(srcRoot) + if err != nil { + return err + } + return filepath.WalkDir(srcRoot, func(srcPath string, d fs.DirEntry, err error) error { + if err != nil || srcPath == srcRoot { + return err + } + suffix := strings.TrimPrefix(srcPath, srcRoot) + for len(suffix) > 0 && suffix[0] == filepath.Separator { + suffix = suffix[1:] + } + dstPath := filepath.Join(dstRoot, suffix) + var info fs.FileInfo + if d.Type()&os.ModeSymlink != 0 { + info, err = os.Stat(srcPath) + } else { + info, err = d.Info() + } + if err != nil { + return err + } + perm := info.Mode() & os.ModePerm + if info.IsDir() { + return os.MkdirAll(dstPath, perm|0o200) + } + if err := os.Symlink(srcPath, dstPath); err == nil { + return nil + } + src, err := os.Open(srcPath) + if err != nil { + return err + } + defer src.Close() + dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm) + if err != nil { + return err + } + _, err = io.Copy(dst, src) + if closeErr := dst.Close(); err == nil { + err = closeErr + } + return err + }) +} + +type dirPackage struct { + name string + files []string + dir string +} + +func stageRundirLayout(dstRoot, srcRoot string, singleFilePkgs bool) error { + entries, err := os.ReadDir(srcRoot) + if err != nil { + return err + } + var goFiles []string + var auxFiles []string + for _, entry := range entries { + name := entry.Name() + if entry.IsDir() || strings.HasPrefix(name, ".") { + continue + } + switch filepath.Ext(name) { + case ".go": + goFiles = append(goFiles, name) + case ".s": + auxFiles = append(auxFiles, name) + } + } + sort.Strings(goFiles) + sort.Strings(auxFiles) + pkgs, err := groupDirPackages(srcRoot, goFiles, singleFilePkgs) + if err != nil { + return err + } + for _, pkg := range pkgs { + targetDir := dstRoot + if pkg.name != "main" { + targetDir = filepath.Join(dstRoot, pkg.dir) + } + if err := os.MkdirAll(targetDir, 0o755); err != nil { + return err + } + for _, fileName := range pkg.files { + data, err := os.ReadFile(filepath.Join(srcRoot, fileName)) + if err != nil { + return err + } + if pkg.name != "main" { + data, err = rewriteRelativeImports(data) + if err != nil { + return err + } + } + if err := os.WriteFile(filepath.Join(targetDir, fileName), data, 0o644); err != nil { + return err + } + } + } + for _, name := range auxFiles { + data, err := os.ReadFile(filepath.Join(srcRoot, name)) + if err != nil { + return err + } + if err := os.WriteFile(filepath.Join(dstRoot, name), data, 0o644); err != nil { + return err + } + } + return nil +} + +func groupDirPackages(srcRoot string, goFiles []string, singleFilePkgs bool) ([]dirPackage, error) { + var pkgs []dirPackage + indexByName := map[string]int{} + for _, name := range goFiles { + pkgName, err := getPackageNameFromSource(filepath.Join(srcRoot, name)) + if err != nil { + return nil, err + } + if singleFilePkgs { + pkgs = append(pkgs, dirPackage{name: pkgName, files: []string{name}, dir: strings.TrimSuffix(name, ".go")}) + continue + } + if i, ok := indexByName[pkgName]; ok { + pkgs[i].files = append(pkgs[i].files, name) + continue + } + pkgs = append(pkgs, dirPackage{name: pkgName, files: []string{name}, dir: strings.TrimSuffix(name, ".go")}) + indexByName[pkgName] = len(pkgs) - 1 + } + return pkgs, nil +} + +func getPackageNameFromSource(filePath string) (string, error) { + fset := token.NewFileSet() + file, err := parser.ParseFile(fset, filePath, nil, parser.PackageClauseOnly) + if err != nil { + return "", err + } + return file.Name.Name, nil +} + +func rewriteRelativeImports(src []byte) ([]byte, error) { + fset := token.NewFileSet() + file, err := parser.ParseFile(fset, "", src, parser.ParseComments) + if err != nil { + return nil, err + } + changed := false + for _, imp := range file.Imports { + p, err := strconv.Unquote(imp.Path.Value) + if err != nil { + return nil, err + } + if strings.HasPrefix(p, "./") { + imp.Path.Value = strconv.Quote("../" + strings.TrimPrefix(p, "./")) + changed = true + } + } + if !changed { + return src, nil + } + var out bytes.Buffer + if err := format.Node(&out, fset, file); err != nil { + return nil, err + } + return out.Bytes(), nil +} + +func ensureBuiltBinary(path, step string) error { + info, err := os.Stat(path) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return fmt.Errorf("%s succeeded but did not produce %s", step, path) + } + return fmt.Errorf("%s output %s: %w", step, path, err) + } + if info.IsDir() { + return fmt.Errorf("%s produced directory %s, want executable file", step, path) + } + return nil +} diff --git a/test/goroot/runner_unit_test.go b/test/goroot/runner_unit_test.go new file mode 100644 index 0000000000..e37dbe9eb9 --- /dev/null +++ b/test/goroot/runner_unit_test.go @@ -0,0 +1,366 @@ +package goroot + +import ( + "os" + "path/filepath" + "reflect" + "runtime" + "strings" + "testing" + "time" +) + +func TestParseDirective(t *testing.T) { + dir := t.TempDir() + file := filepath.Join(dir, "case.go") + if err := os.WriteFile(file, []byte("// run\n\npackage main\n"), 0644); err != nil { + t.Fatal(err) + } + directive, args, ok := parseDirective(file) + if !ok { + t.Fatal("expected directive to be found") + } + if directive != "run" { + t.Fatalf("directive=%q, want run", directive) + } + if len(args) != 0 { + t.Fatalf("args=%v, want none", args) + } +} + +func TestParseDirectiveWithArgs(t *testing.T) { + dir := t.TempDir() + file := filepath.Join(dir, "case.go") + if err := os.WriteFile(file, []byte("// errorcheckandrundir -1\n\npackage ignored\n"), 0644); err != nil { + t.Fatal(err) + } + directive, args, ok := parseDirective(file) + if !ok { + t.Fatal("expected directive to be found") + } + if directive != "errorcheckandrundir" { + t.Fatalf("directive=%q, want errorcheckandrundir", directive) + } + if !reflect.DeepEqual(args, []string{"-1"}) { + t.Fatalf("args=%v, want [-1]", args) + } +} + +func TestParseDirectiveQuotedArgs(t *testing.T) { + dir := t.TempDir() + file := filepath.Join(dir, "case.go") + src := `// runindir -gomodversion "1.23" -gcflags='all=-N -l' + +package ignored +` + if err := os.WriteFile(file, []byte(src), 0o644); err != nil { + t.Fatal(err) + } + directive, args, ok := parseDirective(file) + if !ok { + t.Fatal("expected directive to be found") + } + if directive != "runindir" { + t.Fatalf("directive=%q, want runindir", directive) + } + want := []string{"-gomodversion", "1.23", "-gcflags=all=-N -l"} + if !reflect.DeepEqual(args, want) { + t.Fatalf("args=%v, want %v", args, want) + } +} + +func TestReleaseTagsFor(t *testing.T) { + got := releaseTagsFor("go1.24.11") + want := []string{ + "go1.1", "go1.2", "go1.3", "go1.4", "go1.5", "go1.6", "go1.7", "go1.8", + "go1.9", "go1.10", "go1.11", "go1.12", "go1.13", "go1.14", "go1.15", "go1.16", + "go1.17", "go1.18", "go1.19", "go1.20", "go1.21", "go1.22", "go1.23", "go1.24", + } + if !reflect.DeepEqual(got, want) { + t.Fatalf("releaseTagsFor()=%v, want %v", got, want) + } +} + +func TestXFailMatch(t *testing.T) { + cfg := xfailConfig{ + Entries: []xfailEntry{{ + Version: "go1.24", + Platform: "darwin/arm64", + Directive: "run", + Case: "fixedbugs/*", + Reason: "known issue", + }}, + } + tc := testCase{RelPath: "fixedbugs/bug123.go", Directive: "run"} + match, reason := cfg.Match("go1.24.11", "darwin/arm64", tc) + if !match { + t.Fatal("expected xfail match") + } + if reason != "known issue" { + t.Fatalf("reason=%q, want known issue", reason) + } +} + +func TestMatchGoVersion(t *testing.T) { + tests := []struct { + version string + goVersion string + want bool + }{ + {version: "go1.24", goVersion: "go1.24", want: true}, + {version: "go1.24", goVersion: "go1.24.11", want: true}, + {version: "go1.24", goVersion: "go1.24rc1", want: true}, + {version: "go1.24", goVersion: "go1.24beta1", want: true}, + {version: "go1.2", goVersion: "go1.24.11", want: false}, + {version: "go1.25", goVersion: "go1.24.11", want: false}, + } + for _, tt := range tests { + if got := matchGoVersion(tt.version, tt.goVersion); got != tt.want { + t.Fatalf("matchGoVersion(%q, %q)=%v, want %v", tt.version, tt.goVersion, got, tt.want) + } + } +} + +func TestHostSkipMatch(t *testing.T) { + cfg := xfailConfig{ + HostSkips: []xfailEntry{{ + Version: "go1.24", + Platform: "darwin/arm64", + Directive: "run", + Case: "fixedbugs/*", + Reason: "host-unsafe", + }}, + } + tc := testCase{RelPath: "fixedbugs/bug123.go", Directive: "run"} + match, reason := cfg.MatchHostSkip("go1.24.11", "darwin/arm64", tc) + if !match { + t.Fatal("expected host skip match") + } + if reason != "host-unsafe" { + t.Fatalf("reason=%q, want host-unsafe", reason) + } +} + +func TestTimeoutMatch(t *testing.T) { + cfg := xfailConfig{ + Timeouts: []timeoutEntry{{ + Version: "go1.24", + Platform: "darwin/arm64", + Directive: "run", + Case: "fixedbugs/*", + Timeout: "90s", + Reason: "slow case", + }}, + } + tc := testCase{RelPath: "fixedbugs/bug123.go", Directive: "run"} + timeout, reason, ok := cfg.MatchTimeout("go1.24.11", "darwin/arm64", tc) + if !ok { + t.Fatal("expected timeout match") + } + if timeout != 90*time.Second { + t.Fatalf("timeout=%s, want 90s", timeout) + } + if reason != "slow case" { + t.Fatalf("reason=%q, want slow case", reason) + } +} + +func TestRunProgramTimeout(t *testing.T) { + if os.Getenv("LLGO_GOROOT_HELPER") == "sleep" { + time.Sleep(200 * time.Millisecond) + return + } + + stdout, stderr, exitCode, elapsed, err := runProgram( + t.TempDir(), + os.Args[0], + append(os.Environ(), "LLGO_GOROOT_HELPER=sleep"), + 50*time.Millisecond, + "-test.run=TestRunProgramTimeout", + ) + if err == nil { + t.Fatal("expected timeout") + } + if exitCode == 0 { + t.Fatalf("exitCode=%d, want non-zero on timeout", exitCode) + } + if len(stdout) != 0 { + t.Fatalf("stdout=%q, want empty", stdout) + } + if len(stderr) != 0 { + t.Fatalf("stderr=%q, want empty", stderr) + } + if !strings.Contains(err.Error(), "timed out after") { + t.Fatalf("err=%v, want timeout", err) + } + if elapsed < 50*time.Millisecond { + t.Fatalf("elapsed=%s, want >= 50ms", elapsed) + } +} + +func TestNormalizeOutputStripsLogTimestamp(t *testing.T) { + in := []byte("2026/03/13 00:56:11 listing stdlib export files: open : no such file or directory\n") + got := string(normalizeOutput(in)) + want := "listing stdlib export files: open : no such file or directory\n" + if got != want { + t.Fatalf("normalizeOutput()=%q, want %q", got, want) + } +} + +func TestShardCases(t *testing.T) { + cases := []testCase{ + {RelPath: "a.go"}, + {RelPath: "b.go"}, + {RelPath: "c.go"}, + {RelPath: "d.go"}, + {RelPath: "e.go"}, + } + got := shardCases(t, cases, 1, 3) + want := []testCase{ + {RelPath: "b.go"}, + {RelPath: "e.go"}, + } + if !reflect.DeepEqual(got, want) { + t.Fatalf("shardCases()=%v, want %v", got, want) + } +} + +func TestDiscoverCasesSkipsMissingDir(t *testing.T) { + testRoot := t.TempDir() + existingDir := filepath.Join(testRoot, "fixedbugs") + if err := os.MkdirAll(existingDir, 0o755); err != nil { + t.Fatal(err) + } + file := filepath.Join(existingDir, "case.go") + if err := os.WriteFile(file, []byte("// run\n\npackage main\n"), 0o644); err != nil { + t.Fatal(err) + } + + got := discoverCases(t, testRoot, toolchainEnv{ + GOOS: runtime.GOOS, + GOARCH: runtime.GOARCH, + CGOEnabled: "1", + }, []string{"fixedbugs", "internal/runtime/sys"}, nil, 0, loadDirectiveMode(t, "legacy")) + want := []testCase{{ + RelPath: "fixedbugs/case.go", + Dir: existingDir, + FileName: "case.go", + Directive: "run", + DirectiveArg: []string{}, + }} + if !reflect.DeepEqual(got, want) { + t.Fatalf("discoverCases()=%v, want %v", got, want) + } +} + +func TestDiscoverCasesRunLikeModeIncludesDirectiveArgs(t *testing.T) { + testRoot := t.TempDir() + dir := filepath.Join(testRoot, "fixedbugs") + if err := os.MkdirAll(dir, 0o755); err != nil { + t.Fatal(err) + } + files := map[string]string{ + "run.go": "// run -gcflags=-d=checkptr\n\npackage main\n", + "runoutput.go": "// runoutput ./rotate.go\n\npackage main\n", + "rundir.go": "// rundir\n\npackage ignored\n", + } + for name, src := range files { + if err := os.WriteFile(filepath.Join(dir, name), []byte(src), 0o644); err != nil { + t.Fatal(err) + } + } + + got := discoverCases(t, testRoot, toolchainEnv{ + GOOS: runtime.GOOS, + GOARCH: runtime.GOARCH, + CGOEnabled: "1", + }, []string{"fixedbugs"}, nil, 0, loadDirectiveMode(t, "runlike")) + if len(got) != 3 { + t.Fatalf("len(discoverCases())=%d, want 3", len(got)) + } + if got[0].Directive != "rundir" && got[1].Directive != "rundir" && got[2].Directive != "rundir" { + t.Fatalf("discoverCases()=%v, want rundir to be included", got) + } +} + +func TestDiscoverCasesCIModeExcludesBuildrundir(t *testing.T) { + testRoot := t.TempDir() + dir := filepath.Join(testRoot, "fixedbugs") + if err := os.MkdirAll(dir, 0o755); err != nil { + t.Fatal(err) + } + files := map[string]string{ + "run.go": "// run arg1\n\npackage main\n", + "runoutput.go": "// runoutput\n\npackage main\n", + "rundir.go": "// rundir\n\npackage ignored\n", + "runindir.go": "// runindir\n\npackage ignored\n", + "buildrun.go": "// buildrun\n\npackage main\n", + "builddir.go": "// buildrundir\n\npackage ignored\n", + "errorcheck.go": "// errorcheckandrundir -1\n\npackage ignored\n", + } + for name, src := range files { + if err := os.WriteFile(filepath.Join(dir, name), []byte(src), 0o644); err != nil { + t.Fatal(err) + } + } + + got := discoverCases(t, testRoot, toolchainEnv{ + GOOS: runtime.GOOS, + GOARCH: runtime.GOARCH, + CGOEnabled: "1", + }, []string{"fixedbugs"}, nil, 0, loadDirectiveMode(t, "ci")) + + if len(got) != 5 { + t.Fatalf("len(discoverCases())=%d, want 5", len(got)) + } + for _, tc := range got { + switch tc.Directive { + case "run", "runoutput", "rundir", "runindir", "buildrun": + default: + t.Fatalf("unexpected directive in ci mode: %q", tc.Directive) + } + } +} + +func TestParseDirectiveOptions(t *testing.T) { + opts, err := parseDirectiveOptions("runindir", []string{"-gomodversion", "1.23", "-goexperiment", "fieldtrack", "-ldflags", "-strictdups=2", "-w=0", "arg1"}, 20*time.Second) + if err != nil { + t.Fatal(err) + } + if opts.GoModVersion != "1.23" { + t.Fatalf("GoModVersion=%q, want 1.23", opts.GoModVersion) + } + if !reflect.DeepEqual(opts.ProgramArgs, []string{"arg1"}) { + t.Fatalf("ProgramArgs=%v, want [arg1]", opts.ProgramArgs) + } + if !reflect.DeepEqual(opts.BuildFlags, []string{"-ldflags", "-strictdups=2 -w=0"}) { + t.Fatalf("BuildFlags=%v", opts.BuildFlags) + } + if !reflect.DeepEqual(opts.ExtraEnv, []string{"GOEXPERIMENT=fieldtrack"}) { + t.Fatalf("ExtraEnv=%v", opts.ExtraEnv) + } +} + +func TestStageRundirLayoutRewritesRelativeImports(t *testing.T) { + srcDir := t.TempDir() + if err := os.WriteFile(filepath.Join(srcDir, "a.go"), []byte("package a\nconst X = 1\n"), 0o644); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(srcDir, "b.go"), []byte("package b\nimport \"./a\"\nconst Y = a.X\n"), 0o644); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(srcDir, "main.go"), []byte("package main\nimport \"./b\"\nfunc main(){_ = b.Y}\n"), 0o644); err != nil { + t.Fatal(err) + } + dstDir := t.TempDir() + if err := stageRundirLayout(dstDir, srcDir, false); err != nil { + t.Fatal(err) + } + got, err := os.ReadFile(filepath.Join(dstDir, "b", "b.go")) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(string(got), "\"../a\"") { + t.Fatalf("rewritten file=%q, want import ../a", got) + } +} diff --git a/test/goroot/xfail.yaml b/test/goroot/xfail.yaml new file mode 100644 index 0000000000..35280067e4 --- /dev/null +++ b/test/goroot/xfail.yaml @@ -0,0 +1,2069 @@ +host_skips: + - platform: darwin/arm64 + directive: run + case: ddd.go + reason: host-unsafe concurrency case can destabilize the host + - platform: darwin/arm64 + directive: run + case: gcgort.go + reason: host-unsafe concurrency case can destabilize the host + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue25897b.go + reason: host-unsafe concurrency case can destabilize the host + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue27695.go + reason: host-unsafe concurrency case can destabilize the host + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue39541.go + reason: host-unsafe concurrency case can destabilize the host + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue39541.go + reason: go1.24 goroot run is host-sensitive on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue16016.go + reason: go1.25 goroot run is host-sensitive on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue39541.go + reason: go1.25 goroot run is host-sensitive on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue39541.go + reason: go1.26 goroot run is host-sensitive on linux/amd64 + - version: go1.24 + platform: darwin/arm64 + directive: run + case: chan/goroutines.go + reason: go1.24 goroot run is host-sensitive on darwin/arm64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: chan/goroutines.go + reason: go1.24 goroot run is host-sensitive on linux/amd64 + - version: go1.25 + platform: darwin/arm64 + directive: run + case: chan/goroutines.go + reason: go1.25 goroot run is host-sensitive on darwin/arm64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: chan/goroutines.go + reason: go1.25 goroot run is host-sensitive on linux/amd64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: chan/goroutines.go + reason: go1.26 goroot run is host-sensitive on darwin/arm64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: chan/goroutines.go + reason: go1.26 goroot run is host-sensitive on linux/amd64 + - version: go1.24 + platform: darwin/arm64 + directive: run + case: chanlinear.go + reason: go1.24 goroot run is host-sensitive on darwin/arm64 + - version: go1.25 + platform: darwin/arm64 + directive: run + case: chanlinear.go + reason: go1.25 goroot run is host-sensitive on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: chanlinear.go + reason: go1.26 goroot run is host-sensitive on darwin/arm64 +timeouts: + - version: go1.24 + platform: linux/amd64 + directive: run + case: abi/uglyfib.go + timeout: 1m + reason: uglyfib runs close to the default timeout on loaded linux/amd64 runners + - version: go1.25 + platform: linux/amd64 + directive: run + case: abi/uglyfib.go + timeout: 1m + reason: uglyfib runs close to the default timeout on loaded linux/amd64 runners + - version: go1.26 + platform: linux/amd64 + directive: run + case: abi/uglyfib.go + timeout: 1m + reason: uglyfib runs close to the default timeout on loaded linux/amd64 runners + - version: go1.26 + platform: linux/amd64 + directive: run + case: chanlinear.go + timeout: 1m + reason: go1.26 chanlinear needs extra runtime slack on loaded linux/amd64 runners +xfails: + - platform: darwin/arm64 + directive: run + case: blank.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: deferfin.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: finprofiled.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: heapsampling.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: init1.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: inline_literal.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: mallocfin.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: noinit.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: peano.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: recover.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: recover1.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: recover2.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: recover3.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: recover4.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: reflectmethod1.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: reflectmethod2.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: reflectmethod3.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: reflectmethod5.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: reflectmethod6.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: stack.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: stackobj.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: stackobj3.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: tinyfin.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: ken/chan.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: chan/doubleselect.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: chan/select2.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: interface/noeq.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/bug336.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/bug347.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/bug348.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue10332.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue12133.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue13169.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue14646.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue15039.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue15175.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue15281.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue16130.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue17381.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue18149.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue19040.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue21879.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue22083.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue22662.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue23837.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue24491b.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue26094.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue26335.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue27201.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue27518b.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue28748.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue29504.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue29735.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue30116.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue30116u.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue31546.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue32187.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue32477.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue33724.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue4316.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue43942.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue44830.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue45045.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue4562.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue4585.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue46725.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue48898.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue52788.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue52788a.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue53137.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue54343.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue5493.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue5704.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue57823.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue58300.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue58300b.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue5856.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue59411.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue5963.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue71675.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue7690.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: fixedbugs/issue8606b.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: typeparam/chans.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: typeparam/issue48645a.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: typeparam/issue49547.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: typeparam/issue51521.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: typeparam/nested.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: typeparam/mdempsky/16.go + reason: latest main goroot run failure on darwin/arm64 + - platform: darwin/arm64 + directive: run + case: typeparam/mdempsky/17.go + reason: latest main goroot run failure on darwin/arm64 + - version: go1.25 + platform: darwin/arm64 + directive: run + case: bigalg.go + reason: go1.25 goroot run failure on darwin/arm64 + - version: go1.24 + platform: darwin/arm64 + directive: run + case: bigalg.go + reason: go1.24 goroot run failure on darwin/arm64 + - version: go1.25 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue72844.go + reason: go1.25 goroot run failure on darwin/arm64 + - version: go1.25 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue73476.go + reason: go1.25 goroot run failure on darwin/arm64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: bigalg.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: blank.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: deferfin.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: finprofiled.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/bug336.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/bug347.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/bug348.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue10332.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue12133.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue13169.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue14646.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15002.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15039.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15175.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15277.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15281.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue16130.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue17381.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue18149.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue19040.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue21879.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue22083.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue22662.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue23837.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue24491b.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue25897a.go + reason: go1.25 goroot run failure on darwin/arm64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue25897a.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue73476.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue26094.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue26335.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue27201.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue27518b.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue28748.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue29504.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue29735.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue30116.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue30116u.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue31546.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue32187.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue32477.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue33724.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue4316.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue43942.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue44830.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue45045.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue4562.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue4585.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue46725.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue48898.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue52788.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue52788a.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue53137.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue54343.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue5493.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue5704.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue57823.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue58300.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue58300b.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue5856.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue59411.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue5963.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue71675.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue72844.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue7690.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: fixedbugs/issue8606b.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: heapsampling.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: init1.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: inline_literal.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: interface/noeq.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: ken/chan.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: mallocfin.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: nilptr.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: noinit.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: peano.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: recover.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: recover1.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: recover2.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: recover3.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: reflectmethod1.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: reflectmethod2.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: reflectmethod3.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: reflectmethod5.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: reflectmethod6.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: stackobj.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: stackobj3.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: tinyfin.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: typeparam/chans.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: typeparam/issue48645a.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: typeparam/issue49547.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: typeparam/issue51521.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: typeparam/mdempsky/16.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: typeparam/mdempsky/17.go + reason: go1.25 goroot run failure on linux/amd64 + - version: go1.25 + platform: linux/amd64 + directive: run + case: typeparam/nested.go + reason: go1.25 goroot run failure on linux/amd64 + + - version: go1.24 + platform: linux/amd64 + directive: run + case: blank.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: deferfin.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: finprofiled.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: heapsampling.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: init1.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: recover.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: recover2.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: reflectmethod2.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: reflectmethod6.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: ken/chan.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/bug347.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue10332.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue14646.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15039.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15175.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15277.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue17381.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue19040.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue22083.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue22662.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue24491b.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue29504.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue30116.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue31546.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue32187.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue32477.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue43942.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue4585.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue46725.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue52788.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue54343.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue5704.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue57823.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue58300.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue5856.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue59411.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue5963.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue71675.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: typeparam/chans.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: typeparam/issue48645a.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: typeparam/issue51521.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: typeparam/nested.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: typeparam/mdempsky/16.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: inline_literal.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: mallocfin.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: nilptr.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: noinit.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: peano.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: recover1.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: recover3.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: reflectmethod1.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: reflectmethod3.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: reflectmethod5.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: stackobj.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: stackobj3.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: tinyfin.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: interface/noeq.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/bug336.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/bug348.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue12133.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue13169.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15002.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15281.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue16130.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue18149.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue21879.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue23837.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue25897a.go + reason: go1.24 goroot run failure on darwin/arm64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue25897a.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue26094.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue26335.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue27201.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue27518b.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue28748.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue29735.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue30116u.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue33724.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue4316.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue44830.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue45045.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue4562.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue48898.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue52788a.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue53137.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue5493.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue58300b.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue7690.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: fixedbugs/issue8606b.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: typeparam/issue49547.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: typeparam/mdempsky/17.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue73916.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue73917.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue76008.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: devirtualization_nil_panics.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: newexpr.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: range4.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue70189.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue72844.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue73916b.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue73920.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue75327.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: print.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: bigalg.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: deferprint.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: goprint.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: fixedbugs/bug409.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue35576.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue73476.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue6899.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: ken/cplx0.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: typeparam/typeswitch5.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.24 + platform: linux/amd64 + directive: run + case: bigalg.go + reason: go1.24 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: bigalg.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: blank.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: deferfin.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: deferprint.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: goprint.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: inline_literal.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: mallocfin.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: print.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: range4.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: recover1.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: recover3.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: reflectmethod1.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: reflectmethod3.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: reflectmethod5.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: stackobj.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: stackobj3.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: tinyfin.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: interface/noeq.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/bug336.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/bug348.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/bug409.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue12133.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue13169.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15002.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15281.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue16130.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue18149.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue21879.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue23837.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: darwin/arm64 + directive: run + case: fixedbugs/issue25897a.go + reason: go1.26 goroot run failure on darwin/arm64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue25897a.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue73476.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue26094.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue26335.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue27201.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue27518b.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue28748.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue29735.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue30116u.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue33724.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue4316.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue44830.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue45045.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue4562.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue48898.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue52788a.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue53137.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue5493.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue58300b.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue6899.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue71675.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue73916.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue73917.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue76008.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: typeparam/typeswitch5.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue7690.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue8606b.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: typeparam/issue49547.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: typeparam/mdempsky/17.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: devirtualization_nil_panics.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: finprofiled.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: heapsampling.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: init1.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: newexpr.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: nilptr.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: noinit.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: peano.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: recover.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: recover2.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: reflectmethod2.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: reflectmethod6.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: ken/chan.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: ken/cplx0.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/bug347.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue10332.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue14646.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15039.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15175.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue15277.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue17381.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue19040.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue22083.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue22662.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue24491b.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue29504.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue30116.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue31546.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue32187.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue32477.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue35576.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue43942.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue4585.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue46725.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue52788.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue54343.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue5704.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue57823.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue58300.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue5856.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue59411.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue5963.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue70189.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue72844.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue73916b.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue73920.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: fixedbugs/issue75327.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: typeparam/chans.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: typeparam/issue48645a.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: typeparam/issue51521.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: typeparam/nested.go + reason: go1.26 goroot run failure on linux/amd64 + - version: go1.26 + platform: linux/amd64 + directive: run + case: typeparam/mdempsky/16.go + reason: go1.26 goroot run failure on linux/amd64 diff --git a/test/std/encoding/asn1/asn1_test.go b/test/std/encoding/asn1/asn1_test.go index 37f088ac4d..a0b39ff873 100644 --- a/test/std/encoding/asn1/asn1_test.go +++ b/test/std/encoding/asn1/asn1_test.go @@ -2,6 +2,7 @@ package asn1_test import ( "encoding/asn1" + "encoding/hex" "reflect" "testing" ) @@ -219,6 +220,30 @@ func TestRawContent(t *testing.T) { } } +func TestMarshalOptionalBoolTrue(t *testing.T) { + type basicConstraints struct { + IsCA bool `asn1:"optional"` + MaxPathLen int `asn1:"optional,default:-1"` + } + + in := basicConstraints{IsCA: true, MaxPathLen: -1} + data, err := asn1.Marshal(in) + if err != nil { + t.Fatalf("Marshal failed: %v", err) + } + if got, want := hex.EncodeToString(data), "30030101ff"; got != want { + t.Fatalf("Marshal optional bool: got %s, want %s", got, want) + } + + var out basicConstraints + if _, err := asn1.Unmarshal(data, &out); err != nil { + t.Fatalf("Unmarshal failed: %v", err) + } + if !reflect.DeepEqual(out, in) { + t.Fatalf("Round trip failed: got %+v, want %+v", out, in) + } +} + func TestStructuralError(t *testing.T) { se := asn1.StructuralError{Msg: "test error"} diff --git a/test/std/sync/atomic/atomic_concurrent_test.go b/test/std/sync/atomic/atomic_concurrent_test.go index 65b2268b07..46972579d9 100644 --- a/test/std/sync/atomic/atomic_concurrent_test.go +++ b/test/std/sync/atomic/atomic_concurrent_test.go @@ -1,8 +1,10 @@ package atomic_test import ( + "runtime" "sync/atomic" "testing" + "unsafe" ) func TestConcurrentOperations(t *testing.T) { @@ -33,6 +35,49 @@ func TestConcurrentCAS(t *testing.T) { t.Skip("Concurrent CAS test skipped due to potential infinite loop") } +func TestValueFirstSwapConcurrentLoad(t *testing.T) { + var one any = 1 + + type eface struct { + typ unsafe.Pointer + data unsafe.Pointer + } + + run := func() error { + var v atomic.Value + swapDone := make(chan struct{}) + go func() { + v.Swap(one) + close(swapDone) + }() + for i := 0; i < 10000; i++ { + got := v.Load() + p := (*eface)(unsafe.Pointer(&got)).typ + if uintptr(p) == ^uintptr(0) { + <-swapDone + return errStaleFirstStoreMarker + } + if i%128 == 0 { + runtime.Gosched() + } + } + <-swapDone + return nil + } + + for attempt := 0; attempt < 16; attempt++ { + if err := run(); err != nil { + t.Fatal(err) + } + } +} + +var errStaleFirstStoreMarker = &staleFirstStoreMarkerError{} + +type staleFirstStoreMarkerError struct{} + +func (*staleFirstStoreMarkerError) Error() string { return "read stale first-store marker" } + // Benchmark functions func BenchmarkAddInt32(b *testing.B) { var i int32 diff --git a/xtool/safesplit/safesplit.go b/xtool/safesplit/safesplit.go index f705868dca..db9e027afc 100644 --- a/xtool/safesplit/safesplit.go +++ b/xtool/safesplit/safesplit.go @@ -18,76 +18,57 @@ package safesplit import "strings" -// SplitPkgConfigFlags splits a pkg-config outputs string into parts. -// Each part starts with "-" followed by a single character flag. -// Spaces after the flag character are ignored. -// Content is read until the next space, unless escaped with "\". +// SplitPkgConfigFlags splits a pkg-config output string into argv-style tokens. +// It preserves ordinary shell quoting and backslash escaping so callers can pass +// the resulting slice directly to exec.Command. func SplitPkgConfigFlags(s string) []string { - var result []string - var current strings.Builder - i := 0 + var out []string + var cur strings.Builder + var quote byte - // Skip leading whitespace - for i < len(s) && (s[i] == ' ' || s[i] == '\t') { - i++ - } - - for i < len(s) { - // Start a new part - if current.Len() > 0 { - result = append(result, strings.TrimSpace(current.String())) - current.Reset() - } - // Write "-" and the flag character - current.WriteByte('-') - i++ - if i < len(s) { - current.WriteByte(s[i]) - i++ - } - // Skip spaces after flag character - for i < len(s) && (s[i] == ' ' || s[i] == '\t') { - i++ + flush := func() { + if cur.Len() == 0 { + return } + out = append(out, cur.String()) + cur.Reset() + } - // Check if next character is another flag (short flag with no argument) - if i < len(s) && s[i] == '-' { - // This is a short flag with no argument, finish current flag + for i := 0; i < len(s); i++ { + ch := s[i] + if quote != 0 { + switch ch { + case '\\': + if i+1 < len(s) { + i++ + cur.WriteByte(s[i]) + } else { + cur.WriteByte(ch) + } + case quote: + quote = 0 + default: + cur.WriteByte(ch) + } continue } - // Read content until next space - for i < len(s) { - if s[i] == '\\' && i+1 < len(s) && (s[i+1] == ' ' || s[i+1] == '\t') { - // Skip backslash and write the escaped space + switch ch { + case ' ', '\t', '\n', '\r': + flush() + case '\'', '"': + quote = ch + case '\\': + if i+1 < len(s) { i++ - current.WriteByte(s[i]) - i++ - continue - } - if s[i] == ' ' || s[i] == '\t' { - // Skip consecutive spaces - j := i - for j < len(s) && (s[j] == ' ' || s[j] == '\t') { - j++ - } - // If we've seen content, check for new flag - if j < len(s) && s[j] == '-' { - i = j - break - } - // Otherwise, include one space and continue - current.WriteByte(' ') - i = j + cur.WriteByte(s[i]) } else { - current.WriteByte(s[i]) - i++ + cur.WriteByte(ch) } + default: + cur.WriteByte(ch) } } - // Add the last part - if current.Len() > 0 { - result = append(result, strings.TrimSpace(current.String())) - } - return result + flush() + return out } diff --git a/xtool/safesplit/safesplit_test.go b/xtool/safesplit/safesplit_test.go index fcca958bbc..9113beba05 100644 --- a/xtool/safesplit/safesplit_test.go +++ b/xtool/safesplit/safesplit_test.go @@ -35,23 +35,23 @@ func TestSplitPkgConfigFlags(t *testing.T) { t.Run("basic", func(t *testing.T) { ftest("-I/usr/include -L/usr/lib", `["-I/usr/include" "-L/usr/lib"]`) - ftest("-I /usr/include -L /usr/lib", `["-I/usr/include" "-L/usr/lib"]`) + ftest("-I /usr/include -L /usr/lib", `["-I" "/usr/include" "-L" "/usr/lib"]`) ftest("-L/opt/homebrew/Cellar/bdw-gc/8.2.8/lib -lgc", `["-L/opt/homebrew/Cellar/bdw-gc/8.2.8/lib" "-lgc"]`) }) t.Run("spaces_in_path", func(t *testing.T) { - ftest("-I/usr/local/include directory -L/usr/local/lib path", + ftest(`-I"/usr/local/include directory" -L"/usr/local/lib path"`, `["-I/usr/local/include directory" "-L/usr/local/lib path"]`) }) t.Run("multiple_spaces", func(t *testing.T) { - ftest(" -I /usr/include -L /usr/lib ", `["-I/usr/include" "-L/usr/lib"]`) + ftest(" -I /usr/include -L /usr/lib ", `["-I" "/usr/include" "-L" "/usr/lib"]`) }) t.Run("consecutive_flags", func(t *testing.T) { ftest("-I -L", `["-I" "-L"]`) - ftest("-I -L /usr/lib", `["-I" "-L/usr/lib"]`) + ftest("-I -L /usr/lib", `["-I" "-L" "/usr/lib"]`) }) t.Run("edge_cases", func(t *testing.T) { @@ -64,18 +64,18 @@ func TestSplitPkgConfigFlags(t *testing.T) { t.Run("escaped_spaces", func(t *testing.T) { ftest(`-I/path\ with\ spaces -L/lib`, `["-I/path with spaces" "-L/lib"]`) - ftest(`-I /first\ path -L /second\ long path`, `["-I/first path" "-L/second long path"]`) + ftest(`-I /first\ path -L /second\ long path`, `["-I" "/first path" "-L" "/second long" "path"]`) }) t.Run("macro_flags", func(t *testing.T) { ftest("-DMACRO -I/usr/include", `["-DMACRO" "-I/usr/include"]`) - ftest("-D MACRO -I/usr/include", `["-DMACRO" "-I/usr/include"]`) + ftest("-D MACRO -I/usr/include", `["-D" "MACRO" "-I/usr/include"]`) ftest("-DMACRO=value -I/usr/include", `["-DMACRO=value" "-I/usr/include"]`) - ftest("-D MACRO=value -I/usr/include", `["-DMACRO=value" "-I/usr/include"]`) + ftest("-D MACRO=value -I/usr/include", `["-D" "MACRO=value" "-I/usr/include"]`) ftest("-D_DEBUG -D_UNICODE -DWIN32", `["-D_DEBUG" "-D_UNICODE" "-DWIN32"]`) - ftest("-D _DEBUG -D _UNICODE -D WIN32", `["-D_DEBUG" "-D_UNICODE" "-DWIN32"]`) + ftest("-D _DEBUG -D _UNICODE -D WIN32", `["-D" "_DEBUG" "-D" "_UNICODE" "-D" "WIN32"]`) ftest("-DVERSION=2.1 -DDEBUG=1", `["-DVERSION=2.1" "-DDEBUG=1"]`) - ftest("-D VERSION=2.1 -D DEBUG=1", `["-DVERSION=2.1" "-DDEBUG=1"]`) + ftest("-D VERSION=2.1 -D DEBUG=1", `["-D" "VERSION=2.1" "-D" "DEBUG=1"]`) }) // case for https://github.com/goplus/llgo/issues/1244 @@ -83,6 +83,11 @@ func TestSplitPkgConfigFlags(t *testing.T) { ftest("-w -pipe", `["-w" "-pipe"]`) ftest("-Os -w -pipe", `["-Os" "-w" "-pipe"]`) }) + + t.Run("framework_flags", func(t *testing.T) { + ftest(`-framework CoreFoundation -framework IOKit`, `["-framework" "CoreFoundation" "-framework" "IOKit"]`) + ftest(`"-framework" "CoreFoundation"`, `["-framework" "CoreFoundation"]`) + }) } func toString(ss []string) string {