diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4cdd5d8..474acaf 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,76 +1,21 @@ -# Test whether we can link to LLVM installed from apt.llvm.org or Homebrew. ---- +name: Source checks -name: Test - -on: [push, pull_request] +on: + push: + branches: [master] + pull_request: jobs: - test-macos: - runs-on: macos-latest - strategy: - matrix: - llvm: [14, 15, 16, 17, 18, 19, 20, 21, 22] - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Set up Go - uses: actions/setup-go@v5 - with: - go-version: '1.24' - # Optional step when a LLVM version is very new. - - name: Update Homebrew - run: brew update - - name: Install LLVM - run: HOMEBREW_NO_AUTO_UPDATE=1 brew install llvm@${{ matrix.llvm }} - - name: Test LLVM ${{ matrix.llvm }} - run: - go test -v -tags=llvm${{ matrix.llvm }} - test-linux: - runs-on: ubuntu-22.04 - strategy: - matrix: - llvm: [14, 15, 16, 17, 18, 19, 20, 21, 22, 23] - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Set up Go - uses: actions/setup-go@v5 - with: - go-version: '1.24' - - name: Install LLVM - run: | - suite=llvm-toolchain-jammy-${{ matrix.llvm }} - if [ "${{ matrix.llvm }}" = 23 ]; then - suite=llvm-toolchain-jammy - fi - echo "deb http://apt.llvm.org/jammy/ ${suite} main" | sudo tee /etc/apt/sources.list.d/llvm.list - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - - sudo apt-get update - sudo apt-get install --no-install-recommends llvm-${{ matrix.llvm }}-dev - - name: Test LLVM ${{ matrix.llvm }} - run: - go test -v -tags=llvm${{ matrix.llvm }} - - name: Test default LLVM - if: matrix.llvm == 23 - run: - go test -v - test-linux-fedora: - # Fedora uses different paths than other systems, so testing it separately. + format: runs-on: ubuntu-24.04 - strategy: - matrix: - llvm: [19, 20, 21] - container: fedora:43 steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Install dependencies (default LLVM) - if: matrix.llvm == 21 - run: dnf install --assumeyes g++ golang llvm-devel - - name: Install dependencies (older LLVM) - if: matrix.llvm != 21 - run: dnf install --assumeyes g++ golang llvm${{ matrix.llvm }}-devel - - name: Test LLVM ${{ matrix.llvm }} - run: - go test -v -tags=llvm${{ matrix.llvm }} + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: '1.25' + - name: Check Go formatting + run: test -z "$(gofmt -l .)" + +# Full dynamic and static binding tests require the customized GoALLC LLVM +# payload. Restore those tests by downloading the project's prebuilt payload +# once it is published; do not build LLVM from source in this workflow. diff --git a/.gitignore b/.gitignore index 68f25aa..e5b97b8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ llvm-*.src.tar.xz llvm-*/ +/llvm +/libLLVMGoALLC.a* diff --git a/README.markdown b/README.markdown index 6c60343..fd90b5e 100644 --- a/README.markdown +++ b/README.markdown @@ -1,32 +1,51 @@ -# Go bindings to system LLVM +# Go bindings for GoALLC LLVM -This library provides bindings to a system-installed LLVM. +This repository contains the LLVM Go bindings used by GoALLC. It intentionally +targets the customized LLVM build maintained by the GoALLC project; a +system-installed LLVM is not supported. -Currently supported: +## LLVM payload - * LLVM 23, 22, 21, 20, 19, 18, 17, 16, 15 and 14 from [apt.llvm.org](http://apt.llvm.org/) on Debian/Ubuntu. - * LLVM 23, 22, 21, 20, 19, 18, 17, 16, 15 and 14 from Homebrew on macOS. - * Any of the above versions with a manually built LLVM through the `byollvm` build tag. You need to set up `CFLAGS`/`LDFLAGS` etc yourself in this case. +The binding always reads LLVM headers below `${SRCDIR}/llvm`; dynamic linking +also reads the LLVM shared library there: -LLVM 23 is selected by default. You can select another LLVM version using a -build tag, for example `-tags=llvm17` to use LLVM 17. When using a manually -built LLVM 22 or newer, combine the version and custom-build tags, for example -`-tags="byollvm llvm23"`. + llvm/include/llvm-c + llvm/lib -The GoALLC in-tree static LLVM payload is selected explicitly with -`-tags=staticllvm`. Add a version tag when the payload is not LLVM 23, for -example `-tags="staticllvm llvm20"`. +`llvm` is not committed. The caller must create it as a symlink to an LLVM +payload with this layout. GoALLC's `cmd/dist` manages that symlink from its +`-llvm-dir` option, whose default is `$GOROOT/llvm`. -## Usage +## Build tags -If you have a supported LLVM installation, you should be able to do a simple `go get`: +The LLVM API version and link mode are independent, mandatory build-tag axes: - go get tinygo.org/x/go-llvm +* `llvm23` selects the LLVM 23 API. A future LLVM 24 port will add `llvm24` + without changing how the payload path or link mode is selected. +* `dynamicllvm` links `llvm/lib/libLLVM`; it is the GoALLC default. +* `staticllvm` links `${SRCDIR}/libLLVMGoALLC.a`. GoALLC's `cmd/dist` + assembles and caches this build artifact from the selected payload's normal + LLVM component archives with `llvm-config` and `llvm-ar`. -You can use build tags to select a LLVM version. For example, use `-tags=llvm15` to select LLVM 15. Setting a build tag for a LLVM version that is not supported will be ignored. +For example: -## License + go test -tags='llvm23 dynamicllvm' ./... + go test -tags='llvm23 staticllvm' ./... + +The static command requires `libLLVMGoALLC.a` to have been assembled first. +The GoALLC toolchain does this automatically for `-llvm-link=static`. + +Do not select multiple version tags or multiple link-mode tags in one build. -These LLVM bindings for Go originally come from LLVM, but they have since been [removed](https://discourse.llvm.org/t/rfc-remove-the-go-bindings/65725). Still, they remain under the same license as they were originally, which is the [Apache License 2.0 (with LLVM exceptions)](http://releases.llvm.org/9.0.0/LICENSE.TXT). Check upstream LLVM for detailed copyright information. +## Continuous integration + +Automatic pull-request checks currently validate the binding source only. Full +dynamic and static tests require the customized GoALLC LLVM payload and are +validated as part of integration work. Once the project publishes prebuilt LLVM +payloads, CI will download those artifacts and run both link modes without +rebuilding LLVM from source. + +## License -This README, the backports\* files, and the Makefile are separate from LLVM but are licensed under the same license. +These bindings originated in LLVM and remain licensed under the Apache License +2.0 with LLVM Exceptions. See `LICENSE.txt`. diff --git a/branch_llvm23.go b/branch_llvm23.go index a19065f..c31cc09 100644 --- a/branch_llvm23.go +++ b/branch_llvm23.go @@ -1,4 +1,4 @@ -//go:build llvm23 || (!byollvm && !llvm14 && !llvm15 && !llvm16 && !llvm17 && !llvm18 && !llvm19 && !llvm20 && !llvm21 && !llvm22) +//go:build llvm23 package llvm diff --git a/branch_pre23.go b/branch_pre23.go deleted file mode 100644 index e3b33bf..0000000 --- a/branch_pre23.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build !llvm23 && (byollvm || llvm14 || llvm15 || llvm16 || llvm17 || llvm18 || llvm19 || llvm20 || llvm21 || llvm22) - -package llvm - -/* -#include "llvm-c/Core.h" -*/ -import "C" - -func (v Value) IsABranchInst() (rv Value) { - rv.C = C.LLVMIsABranchInst(v.C) - return -} diff --git a/gen_llvm_config_static.sh b/gen_llvm_config_static.sh deleted file mode 100644 index cbd2664..0000000 --- a/gen_llvm_config_static.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -if [[ ! -d ./llvm/lib ]]; then - echo "Error: directory ./llvm/lib not found" - exit 1 -fi - -LDFLAGS="-L\${SRCDIR}/$(realpath --relative-to="$(pwd)" ./llvm/lib)" -for f in ./llvm/lib/*.a; do - [[ -e "$f" ]] || continue - filename=$(basename "$f") # liba.a - libname="${filename#lib}" # a.a - libname="${libname%.a}" # a - LDFLAGS="$LDFLAGS -l$libname" -done - -cat > "./llvm_config_static.go" < +*/ +import "C" + +import ( + "errors" + "unsafe" +) + +func LLVMPrintModuleToFile(module Module, filename string) error { + filenamestr := C.CString(filename) + defer C.free(unsafe.Pointer(filenamestr)) + var errmsg *C.char + if C.LLVMPrintModuleToFile(module.C, filenamestr, &errmsg) != 0 { + err := errors.New(C.GoString(errmsg)) + C.LLVMDisposeMessage(errmsg) + return err + } + return nil +} + +func LLVMSetValueName2(value Value, name string) { + namestr := C.CString(name) + defer C.free(unsafe.Pointer(namestr)) + C.LLVMSetValueName2(value.C, namestr, C.size_t(len(name))) +} + +func (c Context) PointerType(addressSpace uint32) (t Type) { + t.C = C.LLVMPointerTypeInContext(c.C, C.unsigned(addressSpace)) + return +} diff --git a/llvm/bin/.gitignore b/llvm/bin/.gitignore deleted file mode 100644 index 86d0cb2..0000000 --- a/llvm/bin/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore \ No newline at end of file diff --git a/llvm/include/.gitignore b/llvm/include/.gitignore deleted file mode 100644 index 86d0cb2..0000000 --- a/llvm/include/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore \ No newline at end of file diff --git a/llvm/lib/.gitignore b/llvm/lib/.gitignore deleted file mode 100644 index 86d0cb2..0000000 --- a/llvm/lib/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore \ No newline at end of file diff --git a/llvm/share/.gitignore b/llvm/share/.gitignore deleted file mode 100644 index 86d0cb2..0000000 --- a/llvm/share/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore \ No newline at end of file diff --git a/llvm_config.go b/llvm_config.go new file mode 100644 index 0000000..e9f5875 --- /dev/null +++ b/llvm_config.go @@ -0,0 +1,9 @@ +package llvm + +/* +#cgo darwin CPPFLAGS: -I${SRCDIR}/llvm/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS +#cgo linux CPPFLAGS: -I${SRCDIR}/llvm/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS +#cgo darwin CXXFLAGS: -std=c++17 +#cgo linux CXXFLAGS: -std=c++17 +*/ +import "C" diff --git a/llvm_config_llvm14.go b/llvm_config_llvm14.go deleted file mode 100644 index 154b4f5..0000000 --- a/llvm_config_llvm14.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm14 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@14/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++14 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@14/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@14/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++14 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@14/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo linux CPPFLAGS: -I/usr/lib/llvm-14/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++14 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-14/lib -lLLVM-14 -import "C" - -type run_build_sh int diff --git a/llvm_config_llvm15.go b/llvm_config_llvm15.go deleted file mode 100644 index bf4c451..0000000 --- a/llvm_config_llvm15.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm15 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@15/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++14 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@15/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@15/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++14 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@15/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo linux CPPFLAGS: -I/usr/lib/llvm-15/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++14 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-15/lib -lLLVM-15 -import "C" - -type run_build_sh int diff --git a/llvm_config_llvm16.go b/llvm_config_llvm16.go deleted file mode 100644 index 6d742ed..0000000 --- a/llvm_config_llvm16.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm16 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@16/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@16/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@16/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@16/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo linux CPPFLAGS: -I/usr/lib/llvm-16/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-16/lib -lLLVM-16 -import "C" - -type run_build_sh int diff --git a/llvm_config_llvm17.go b/llvm_config_llvm17.go deleted file mode 100644 index 58a377c..0000000 --- a/llvm_config_llvm17.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm17 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@17/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@17/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@17/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@17/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo linux CPPFLAGS: -I/usr/include/llvm-17 -I/usr/include/llvm-c-17 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-17/lib -lLLVM-17 -import "C" - -type run_build_sh int diff --git a/llvm_config_llvm18.go b/llvm_config_llvm18.go deleted file mode 100644 index 7a706bf..0000000 --- a/llvm_config_llvm18.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm18 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@18/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@18/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@18/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@18/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo linux CPPFLAGS: -I/usr/include/llvm-18 -I/usr/include/llvm-c-18 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-18/lib -lLLVM-18 -import "C" - -type run_build_sh int diff --git a/llvm_config_llvm19.go b/llvm_config_llvm19.go deleted file mode 100644 index bbe44d8..0000000 --- a/llvm_config_llvm19.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm19 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@19/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@19/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@19/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@19/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo freebsd CPPFLAGS: -I/usr/local/llvm19/include -I/usr/local/llvm19/include/llvm-c -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo freebsd CXXFLAGS: -std=c++17 -// #cgo freebsd LDFLAGS: -L/usr/local/llvm19/lib -lLLVM -// #cgo linux CPPFLAGS: -I/usr/include/llvm-19 -I/usr/include/llvm-c-19 -I/usr/lib64/llvm19/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-19/lib -L/usr/lib64/llvm19/lib -lLLVM-19 -import "C" - -type run_build_sh int diff --git a/llvm_config_llvm20.go b/llvm_config_llvm20.go deleted file mode 100644 index 224418c..0000000 --- a/llvm_config_llvm20.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm20 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@20/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@20/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@20/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@20/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo freebsd CPPFLAGS: -I/usr/local/llvm20/include -I/usr/local/llvm20/include/llvm-c -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo freebsd CXXFLAGS: -std=c++17 -// #cgo freebsd LDFLAGS: -L/usr/local/llvm20/lib -lLLVM -// #cgo linux CPPFLAGS: -I/usr/include/llvm-20 -I/usr/include/llvm-c-20 -I/usr/lib64/llvm20/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-20/lib -L/usr/lib64/llvm20/lib64 -lLLVM-20 -import "C" - -type run_build_sh int diff --git a/llvm_config_llvm21.go b/llvm_config_llvm21.go deleted file mode 100644 index de236b4..0000000 --- a/llvm_config_llvm21.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm21 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@21/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@21/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@21/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@21/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo freebsd CPPFLAGS: -I/usr/local/llvm21/include -I/usr/local/llvm21/include/llvm-c -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo freebsd CXXFLAGS: -std=c++17 -// #cgo freebsd LDFLAGS: -L/usr/local/llvm21/lib -lLLVM -// #cgo linux CPPFLAGS: -I/usr/include/llvm-21 -I/usr/include/llvm-c-21 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-21/lib -lLLVM-21 -import "C" - -type run_build_sh int diff --git a/llvm_config_llvm22.go b/llvm_config_llvm22.go deleted file mode 100644 index e468b61..0000000 --- a/llvm_config_llvm22.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm22 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@22/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@22/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@22/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@22/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo freebsd CPPFLAGS: -I/usr/local/llvm22/include -I/usr/local/llvm22/include/llvm-c -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo freebsd CXXFLAGS: -std=c++17 -// #cgo freebsd LDFLAGS: -L/usr/local/llvm22/lib -lLLVM -// #cgo linux CPPFLAGS: -I/usr/include/llvm-22 -I/usr/include/llvm-c-22 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-22/lib -lLLVM-22 -import "C" - -type run_build_sh int diff --git a/llvm_config_llvm23.go b/llvm_config_llvm23.go deleted file mode 100644 index ddfeb87..0000000 --- a/llvm_config_llvm23.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !byollvm && !staticllvm && !llvm14 && !llvm15 && !llvm16 && !llvm17 && !llvm18 && !llvm19 && !llvm20 && !llvm21 && !llvm22 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@23/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@23/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@23/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@23/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo freebsd CPPFLAGS: -I/usr/local/llvm23/include -I/usr/local/llvm23/include/llvm-c -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo freebsd CXXFLAGS: -std=c++17 -// #cgo freebsd LDFLAGS: -L/usr/local/llvm23/lib -lLLVM -// #cgo linux CPPFLAGS: -I/usr/include/llvm-23 -I/usr/include/llvm-c-23 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-23/lib -lLLVM-23 -import "C" - -type run_build_sh int diff --git a/llvm_config_static.go b/llvm_config_static.go deleted file mode 100644 index 24e172d..0000000 --- a/llvm_config_static.go +++ /dev/null @@ -1,14 +0,0 @@ -//go:build !byollvm && staticllvm - -// Code generated by gen_llvm_config_static.sh; DO NOT EDIT. - -package llvm - -/* -#cgo linux CPPFLAGS: -I${SRCDIR}/llvm/include/ -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -#cgo linux CXXFLAGS: -std=c++17 -#cgo linux LDFLAGS: -Wl,--start-group -lz -lzstd -L${SRCDIR}/llvm/lib -lLLVMAArch64AsmParser -lLLVMAArch64CodeGen -lLLVMAArch64Desc -lLLVMAArch64Disassembler -lLLVMAArch64Info -lLLVMAArch64Utils -lLLVMAggressiveInstCombine -lLLVMAnalysis -lLLVMAsmParser -lLLVMAsmPrinter -lLLVMBinaryFormat -lLLVMBitReader -lLLVMBitstreamReader -lLLVMBitWriter -lLLVMCAS -lLLVMCFGuard -lLLVMCFIVerify -lLLVMCGData -lLLVMCodeGen -lLLVMCodeGenTypes -lLLVMCore -lLLVMCoroutines -lLLVMCoverage -lLLVMDebugInfoBTF -lLLVMDebugInfoCodeView -lLLVMDebuginfod -lLLVMDebugInfoDWARF -lLLVMDebugInfoDWARFLowLevel -lLLVMDebugInfoGSYM -lLLVMDebugInfoLogicalView -lLLVMDebugInfoMSF -lLLVMDebugInfoPDB -lLLVMDemangle -lLLVMDiff -lLLVMDlltoolDriver -lLLVMDWARFCFIChecker -lLLVMDWARFLinker -lLLVMDWARFLinkerClassic -lLLVMDWARFLinkerParallel -lLLVMDWP -lLLVMExecutionEngine -lLLVMExegesis -lLLVMExegesisAArch64 -lLLVMExegesisX86 -lLLVMExtensions -lLLVMFileCheck -lLLVMFrontendAtomic -lLLVMFrontendDirective -lLLVMFrontendDriver -lLLVMFrontendHLSL -lLLVMFrontendOffloading -lLLVMFrontendOpenACC -lLLVMFrontendOpenMP -lLLVMFuzzerCLI -lLLVMFuzzMutate -lLLVMGlobalISel -lLLVMHipStdPar -lLLVMInstCombine -lLLVMInstrumentation -lLLVMInterfaceStub -lLLVMInterpreter -lLLVMipo -lLLVMIRPrinter -lLLVMIRReader -lLLVMJITLink -lLLVMLibDriver -lLLVMLineEditor -lLLVMLinker -lLLVMLTO -lLLVMMC -lLLVMMCA -lLLVMMCDisassembler -lLLVMMCJIT -lLLVMMCParser -lLLVMMIRParser -lLLVMObjCARCOpts -lLLVMObjCopy -lLLVMObject -lLLVMObjectYAML -lLLVMOptDriver -lLLVMOption -lLLVMOrcDebugging -lLLVMOrcJIT -lLLVMOrcShared -lLLVMOrcTargetProcess -lLLVMPasses -lLLVMProfileData -lLLVMRemarks -lLLVMRuntimeDyld -lLLVMSandboxIR -lLLVMScalarOpts -lLLVMSelectionDAG -lLLVMSupport -lLLVMSupportLSP -lLLVMSymbolize -lLLVMTableGen -lLLVMTableGenBasic -lLLVMTableGenCommon -lLLVMTarget -lLLVMTargetParser -lLLVMTelemetry -lLLVMTextAPI -lLLVMTextAPIBinaryReader -lLLVMTransformUtils -lLLVMVectorize -lLLVMWindowsDriver -lLLVMWindowsManifest -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMX86Desc -lLLVMX86Disassembler -lLLVMX86Info -lLLVMX86TargetMCA -lLLVMXRay -Wl,--end-group -*/ -import "C" - -type run_build_sh int diff --git a/llvm_dep.go b/llvm_dep.go index cdce01b..570fa84 100644 --- a/llvm_dep.go +++ b/llvm_dep.go @@ -6,13 +6,13 @@ // //===----------------------------------------------------------------------===// // -// This file ensures that the LLVM libraries are built before using the -// bindings. +// This file makes selecting an LLVM API version and link mode mandatory. // //===----------------------------------------------------------------------===// -//go:build !byollvm - package llvm -var _ run_build_sh +var ( + _ llvmVersionSelected + _ llvmLinkModeSelected +) diff --git a/llvm_link_dynamic.go b/llvm_link_dynamic.go new file mode 100644 index 0000000..9fbe9ef --- /dev/null +++ b/llvm_link_dynamic.go @@ -0,0 +1,11 @@ +//go:build dynamicllvm + +package llvm + +/* +#cgo darwin LDFLAGS: -L${SRCDIR}/llvm/lib -Wl,-rpath,${SRCDIR}/llvm/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM +#cgo linux LDFLAGS: -L${SRCDIR}/llvm/lib -Wl,-rpath,${SRCDIR}/llvm/lib -lLLVM +*/ +import "C" + +type llvmLinkModeSelected struct{} diff --git a/llvm_link_static.go b/llvm_link_static.go new file mode 100644 index 0000000..c9667f6 --- /dev/null +++ b/llvm_link_static.go @@ -0,0 +1,11 @@ +//go:build staticllvm + +package llvm + +/* +#cgo darwin LDFLAGS: -L${SRCDIR} -lLLVMGoALLC -lm -lz -lxml2 +#cgo linux LDFLAGS: -L${SRCDIR} -lLLVMGoALLC -lm -lz -lxml2 -ldl -lpthread -lrt +*/ +import "C" + +type llvmLinkModeSelected struct{} diff --git a/llvm_version_23.go b/llvm_version_23.go new file mode 100644 index 0000000..0a60710 --- /dev/null +++ b/llvm_version_23.go @@ -0,0 +1,5 @@ +//go:build llvm23 + +package llvm + +type llvmVersionSelected struct{} diff --git a/opcode_llvm23.go b/opcode_llvm23.go index f126e80..9507220 100644 --- a/opcode_llvm23.go +++ b/opcode_llvm23.go @@ -1,4 +1,4 @@ -//go:build llvm23 || (!byollvm && !llvm14 && !llvm15 && !llvm16 && !llvm17 && !llvm18 && !llvm19 && !llvm20 && !llvm21 && !llvm22) +//go:build llvm23 package llvm diff --git a/opcode_pre23.go b/opcode_pre23.go deleted file mode 100644 index 9a32080..0000000 --- a/opcode_pre23.go +++ /dev/null @@ -1,10 +0,0 @@ -//go:build !llvm23 && (byollvm || llvm14 || llvm15 || llvm16 || llvm17 || llvm18 || llvm19 || llvm20 || llvm21 || llvm22) - -package llvm - -/* -#include "llvm-c/Core.h" -*/ -import "C" - -const Br Opcode = C.LLVMBr diff --git a/passes_llvm23_test.go b/passes_llvm23_test.go index c348317..df6f891 100644 --- a/passes_llvm23_test.go +++ b/passes_llvm23_test.go @@ -1,4 +1,4 @@ -//go:build llvm23 || (!byollvm && !llvm14 && !llvm15 && !llvm16 && !llvm17 && !llvm18 && !llvm19 && !llvm20 && !llvm21 && !llvm22) +//go:build llvm23 package llvm diff --git a/passes_pre23_test.go b/passes_pre23_test.go deleted file mode 100644 index 316dcf4..0000000 --- a/passes_pre23_test.go +++ /dev/null @@ -1,7 +0,0 @@ -//go:build !llvm23 && (byollvm || llvm14 || llvm15 || llvm16 || llvm17 || llvm18 || llvm19 || llvm20 || llvm21 || llvm22) - -package llvm - -const defaultTestPipeline = "default" - -func prepareDefaultTestPipeline(Context, Value) {} diff --git a/switch_llvm22.go b/switch_llvm22.go index 8df6966..cdb7cc2 100644 --- a/switch_llvm22.go +++ b/switch_llvm22.go @@ -1,4 +1,4 @@ -//go:build llvm22 || llvm23 || (!byollvm && !llvm14 && !llvm15 && !llvm16 && !llvm17 && !llvm18 && !llvm19 && !llvm20 && !llvm21 && !llvm22) +//go:build llvm23 package llvm diff --git a/switch_pre22.go b/switch_pre22.go deleted file mode 100644 index 6bbfac9..0000000 --- a/switch_pre22.go +++ /dev/null @@ -1,15 +0,0 @@ -//go:build !llvm22 && !llvm23 && (byollvm || llvm14 || llvm15 || llvm16 || llvm17 || llvm18 || llvm19 || llvm20 || llvm21) - -package llvm - -// GetSwitchCaseValue obtains the case value for a successor of a switch -// instruction. i corresponds to the successor index; the first successor (0) -// is the default destination, so i must be greater than zero. -// -// Before LLVM 22, switch case values were stored as regular instruction -// operands (alternating with their destination blocks, after the leading -// condition/default-destination pair), so this is implemented via Operand -// access instead of the LLVM 22+-only LLVMGetSwitchCaseValue. -func (v Value) GetSwitchCaseValue(i int) Value { - return v.Operand(2 * i) -}