build: use LLVM memcpyopt pass to replace cabi load/store optimization #3206
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # This workflow will build a golang project | |
| # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go | |
| name: LLGo | |
| on: | |
| push: | |
| branches: | |
| - "**" | |
| - "!dependabot/**" | |
| - "!xgopilot/**" | |
| pull_request: | |
| branches: ["**"] | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| download-model: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| steps: | |
| - name: Download model file | |
| run: | | |
| mkdir -p ./_demo/c/llama2-c | |
| wget -P ./_demo/c/llama2-c https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin | |
| - name: Upload model as artifact | |
| uses: actions/upload-artifact@v6 | |
| with: | |
| name: llama2-model | |
| path: ./_demo/c/llama2-c/stories15M.bin | |
| retention-days: 1 | |
| llgo: | |
| needs: download-model | |
| continue-on-error: true | |
| timeout-minutes: 30 | |
| strategy: | |
| matrix: | |
| os: | |
| - macos-latest | |
| - ubuntu-latest | |
| llvm: [19] | |
| go: ["1.21.13", "1.24.2"] | |
| runs-on: ${{matrix.os}} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Install dependencies | |
| uses: ./.github/actions/setup-deps | |
| with: | |
| llvm-version: ${{matrix.llvm}} | |
| - name: Download model artifact | |
| uses: actions/download-artifact@v7 | |
| with: | |
| name: llama2-model | |
| path: ./_demo/c/llama2-c/ | |
| - name: Download platform-specific demo libs | |
| run: | | |
| if ${{ startsWith(matrix.os, 'macos') }}; then | |
| DEMO_PKG="cargs_darwin_arm64.zip" | |
| else | |
| DEMO_PKG="cargs_linux_amd64.zip" | |
| fi | |
| mkdir -p ./_demo/c/cargs/libs | |
| cd ./_demo/c/cargs/libs | |
| wget https://github.com/goplus/llpkg/releases/download/cargs/v1.0.0/${DEMO_PKG} | |
| unzip ${DEMO_PKG} | |
| # Process pc template files - replace {{.Prefix}} with actual path | |
| ACTUAL_PREFIX="$(pwd)" | |
| for tmpl in lib/pkgconfig/*.pc.tmpl; do | |
| pc_file="${tmpl%.tmpl}" | |
| sed "s|{{.Prefix}}|${ACTUAL_PREFIX}|g" "$tmpl" > "$pc_file" | |
| done | |
| echo "PKG_CONFIG_PATH=${ACTUAL_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH}" >> $GITHUB_ENV | |
| - name: Install further optional dependencies for demos | |
| run: | | |
| py_deps=( | |
| numpy # for github.com/goplus/lib/py/numpy | |
| torch # for github.com/goplus/lib/py/torch | |
| ) | |
| pip3.12 install --break-system-packages "${py_deps[@]}" | |
| - name: Set up Go for build | |
| uses: ./.github/actions/setup-go | |
| with: | |
| go-version: "1.24.2" | |
| - name: Install | |
| run: | | |
| go install ./... | |
| echo "LLGO_ROOT=$GITHUB_WORKSPACE" >> $GITHUB_ENV | |
| - name: Set up Go for testing | |
| uses: actions/setup-go@v6 | |
| with: | |
| go-version: ${{matrix.go}} | |
| - name: Test demo without RPATH (expect failure) | |
| run: | | |
| echo "Testing demo without RPATH (should fail)..." | |
| export LLGO_FULL_RPATH=false | |
| pkg-config --libs cargs | |
| if (cd ./_demo/c/cargs && llgo run .); then | |
| echo "ERROR: cargs demo should have failed without RPATH!" | |
| exit 1 | |
| else | |
| echo "✓ cargs demo correctly failed without RPATH" | |
| fi | |
| - name: Test demos | |
| run: | | |
| # TODO(lijie): force python3-embed to be linked with python-3.12-embed | |
| # Currently, python3-embed is python-3.13-embed, doesn't work with pytorch | |
| # Will remove this after pytorch is fixed. | |
| pcdir=$HOME/pc | |
| mkdir -p $pcdir | |
| libdir=$(pkg-config --variable=libdir python-3.12-embed) | |
| echo "libdir: $libdir" | |
| ln -s $libdir/pkgconfig/python-3.12-embed.pc $pcdir/python3-embed.pc | |
| export PKG_CONFIG_PATH=$pcdir:${PKG_CONFIG_PATH} | |
| export LLGO_FULL_RPATH=true | |
| bash .github/workflows/test_demo.sh | |
| - name: Test C header generation | |
| run: | | |
| echo "Testing C header generation in different build modes..." | |
| cd _demo/go/export | |
| chmod +x test.sh | |
| ./test.sh | |
| - name: Test export with different symbol names on embedded targets | |
| run: | | |
| echo "Testing //export with different symbol names on embedded targets..." | |
| cd _demo/embed/export | |
| chmod +x verify_export.sh | |
| ./verify_export.sh | |
| - name: Test ESP32-C3 newlib startup | |
| run: | | |
| echo "Testing ESP32-C3 uses newlib startup (not TinyGo start.S)..." | |
| pip3 install --break-system-packages esptool==5.1.0 | |
| cd _demo/embed | |
| chmod +x test_esp32c3_startup.sh | |
| ./test_esp32c3_startup.sh | |
| - name: _xtool build tests | |
| run: | | |
| cd _xtool | |
| llgo build -v ./... | |
| - name: Show test result | |
| run: cat result.md | |
| - name: LLDB tests | |
| if: ${{startsWith(matrix.os, 'macos')}} | |
| run: | | |
| echo "Test lldb with llgo plugin on ${{matrix.os}} with LLVM ${{matrix.llvm}}" | |
| bash _lldb/runtest.sh -v | |
| test: | |
| continue-on-error: true | |
| timeout-minutes: 30 | |
| strategy: | |
| matrix: | |
| os: | |
| - macos-latest | |
| - ubuntu-latest | |
| llvm: [19] | |
| go: ["1.24.2"] | |
| runs-on: ${{matrix.os}} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Install dependencies | |
| uses: ./.github/actions/setup-deps | |
| with: | |
| llvm-version: ${{matrix.llvm}} | |
| - name: Install further optional dependencies for demos | |
| run: | | |
| py_deps=( | |
| numpy # for github.com/goplus/lib/py/numpy | |
| torch # for github.com/goplus/lib/py/torch | |
| ) | |
| pip3.12 install --break-system-packages "${py_deps[@]}" | |
| - name: Set up Go for build | |
| uses: ./.github/actions/setup-go | |
| with: | |
| go-version: "1.24.2" | |
| - name: Install | |
| run: | | |
| go install ./... | |
| echo "LLGO_ROOT=$GITHUB_WORKSPACE" >> $GITHUB_ENV | |
| - name: Set up Go for testing | |
| uses: actions/setup-go@v6 | |
| with: | |
| go-version: ${{matrix.go}} | |
| - name: Test Baremetal GC | |
| if: ${{!startsWith(matrix.os, 'macos')}} | |
| working-directory: runtime/internal/runtime/tinygogc | |
| run: llgo test -tags testGC . | |
| - name: run llgo test | |
| run: | | |
| llgo test ./... | |
| hello: | |
| continue-on-error: true | |
| timeout-minutes: 30 | |
| strategy: | |
| matrix: | |
| os: [ubuntu-latest, macos-latest] | |
| llvm: [19] | |
| go: ["1.21.13", "1.24.2"] | |
| 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 1.23 for building llgo | |
| uses: ./.github/actions/setup-go | |
| with: | |
| go-version: "1.24.2" | |
| - name: Install llgo | |
| run: | | |
| go install ./... | |
| echo "LLGO_ROOT=$GITHUB_WORKSPACE" >> $GITHUB_ENV | |
| - name: Set up Go for testing | |
| uses: ./.github/actions/setup-go | |
| with: | |
| go-version: ${{matrix.go}} | |
| - name: Test Hello World with go.mod 1.21 | |
| if: startsWith(matrix.go, '1.21') || startsWith(matrix.go, '1.22') || startsWith(matrix.go, '1.23') || startsWith(matrix.go, '1.24') | |
| uses: ./.github/actions/test-helloworld | |
| with: | |
| go-version: ${{matrix.go}} | |
| mod-version: "1.21" | |
| - name: Test Hello World with go.mod 1.22 | |
| if: startsWith(matrix.go, '1.22') || startsWith(matrix.go, '1.23') || startsWith(matrix.go, '1.24') | |
| uses: ./.github/actions/test-helloworld | |
| with: | |
| go-version: ${{matrix.go}} | |
| mod-version: "1.22" | |
| - name: Test Hello World with go.mod 1.23 | |
| if: startsWith(matrix.go, '1.23') || startsWith(matrix.go, '1.24') | |
| uses: ./.github/actions/test-helloworld | |
| with: | |
| go-version: ${{matrix.go}} | |
| mod-version: "1.23" | |
| - name: Test Hello World with go.mod 1.24 | |
| if: startsWith(matrix.go, '1.24') | |
| uses: ./.github/actions/test-helloworld | |
| with: | |
| go-version: ${{matrix.go}} | |
| mod-version: "1.24" | |
| cross-compile: | |
| continue-on-error: true | |
| timeout-minutes: 30 | |
| strategy: | |
| matrix: | |
| os: [macos-latest] | |
| llvm: [19] | |
| 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 for building llgo | |
| uses: ./.github/actions/setup-go | |
| with: | |
| go-version: "1.24.2" | |
| - name: Install wamr | |
| run: | | |
| git clone --branch WAMR-2.4.4 --depth 1 https://github.com/bytecodealliance/wasm-micro-runtime.git | |
| mkdir wasm-micro-runtime/product-mini/platforms/darwin/build | |
| cd wasm-micro-runtime/product-mini/platforms/darwin/build | |
| cmake -D WAMR_BUILD_EXCE_HANDLING=1 -D WAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_SHARED_MEMORY=1 -DWAMR_BUILD_LIB_WASI_THREADS=1 -DWAMR_BUILD_LIB_PTHREAD=1 -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_DEBUG_INTERP=1 .. | |
| make -j8 | |
| echo "$PWD" >> $GITHUB_PATH | |
| - name: Install llgo | |
| run: | | |
| go install ./... | |
| echo "LLGO_ROOT=$GITHUB_WORKSPACE" >> $GITHUB_ENV | |
| - name: Test Cross Compilation (wasm) | |
| shell: bash | |
| working-directory: _demo/c | |
| run: | | |
| echo "Testing cross-compilation wasm with Go 1.24.2" | |
| # Compile for wasm architecture | |
| GOOS=wasip1 GOARCH=wasm llgo build -o hello -tags=nogc -v ./helloc | |
| # Check file type | |
| file hello.wasm | |
| # Run the wasm binary using llgo_wasm | |
| iwasm --stack-size=819200000 --heap-size=800000000 hello.wasm |