diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4d03ab8..0368eee 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,22 +22,22 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Install LLVM 20 + - name: Install LLVM 22 run: | wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key \ | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc > /dev/null codename=$(lsb_release -cs) - echo "deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}-20 main" \ + echo "deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}-22 main" \ | sudo tee /etc/apt/sources.list.d/llvm.list sudo apt-get update - sudo apt-get install -y llvm-20-dev libclang-20-dev clang-20 cmake - /usr/lib/llvm-20/bin/llvm-config --version + sudo apt-get install -y llvm-22-dev libclang-22-dev clang-22 cmake + /usr/lib/llvm-22/bin/llvm-config --version - name: Configure and build run: | mkdir -p build cd build - cmake .. -DCMAKE_PREFIX_PATH=/usr/lib/llvm-20 + cmake .. -DCMAKE_PREFIX_PATH=/usr/lib/llvm-22 cmake --build . -j $(nproc) - name: Run unit tests (debug, -C opt-level=0) @@ -52,7 +52,7 @@ jobs: run: | ln -sf build/jam jam.out clang++ -c tests/cpp/test_codegen_errors.cpp -o codegen_error_tests.o \ - `/usr/lib/llvm-20/bin/llvm-config --cxxflags` -fexceptions + `/usr/lib/llvm-22/bin/llvm-config --cxxflags` -fexceptions clang++ -o codegen_error_tests codegen_error_tests.o ./codegen_error_tests @@ -68,22 +68,22 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Install LLVM 20 + - name: Install LLVM 22 run: | wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key \ | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc > /dev/null codename=$(lsb_release -cs) - echo "deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}-20 main" \ + echo "deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}-22 main" \ | sudo tee /etc/apt/sources.list.d/llvm.list sudo apt-get update - sudo apt-get install -y llvm-20-dev libclang-20-dev clang-20 cmake - /usr/lib/llvm-20/bin/llvm-config --version + sudo apt-get install -y llvm-22-dev libclang-22-dev clang-22 cmake + /usr/lib/llvm-22/bin/llvm-config --version - name: Configure and build run: | mkdir -p build cd build - cmake .. -DCMAKE_PREFIX_PATH=/usr/lib/llvm-20 + cmake .. -DCMAKE_PREFIX_PATH=/usr/lib/llvm-22 cmake --build . -j $(nproc) - name: Run unit tests (debug, -C opt-level=0) @@ -98,7 +98,7 @@ jobs: run: | ln -sf build/jam jam.out clang++ -c tests/cpp/test_codegen_errors.cpp -o codegen_error_tests.o \ - `/usr/lib/llvm-20/bin/llvm-config --cxxflags` -fexceptions + `/usr/lib/llvm-22/bin/llvm-config --cxxflags` -fexceptions clang++ -o codegen_error_tests codegen_error_tests.o ./codegen_error_tests @@ -114,10 +114,10 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Install LLVM 20 via Homebrew + - name: Install LLVM 22 via Homebrew run: | - brew install llvm@20 - LLVM_PREFIX="$(brew --prefix llvm@20)" + brew install llvm@22 + LLVM_PREFIX="$(brew --prefix llvm@22)" echo "${LLVM_PREFIX}/bin" >> "$GITHUB_PATH" echo "LLVM_PREFIX=${LLVM_PREFIX}" >> "$GITHUB_ENV" "${LLVM_PREFIX}/bin/llvm-config" --version diff --git a/Formula/jam.rb b/Formula/jam.rb index a30db97..0a2b8bd 100644 --- a/Formula/jam.rb +++ b/Formula/jam.rb @@ -15,10 +15,10 @@ class Jam < Formula head "https://github.com/raphamorim/jam.git", branch: "main" depends_on "cmake" => :build - depends_on "llvm@20" + depends_on "llvm@22" def install - llvm = Formula["llvm@20"] + llvm = Formula["llvm@22"] ENV.prepend_path "PATH", llvm.opt_bin system "cmake", "-S", ".", "-B", "build", diff --git a/src/init_analysis.cpp b/src/init_analysis.cpp index 8dd18d1..4334143 100644 --- a/src/init_analysis.cpp +++ b/src/init_analysis.cpp @@ -243,6 +243,18 @@ Result Analyzer::analyze(NodeIdx idx, NameMap state) { if (r.terminated) return r; return analyze(n.rhs, std::move(r.state)); } + case AstTag::Slice: { + // `base[start..end]` — walk the base, then the start/end bound + // expressions (held in the extra payload) for variable reads. + auto r = analyze(n.lhs, std::move(state)); + if (r.terminated) return r; + ExtraIdx extra = n.rhs; + NodeIdx startIdx = static_cast(nodes_.getExtra(extra)); + NodeIdx endIdx = static_cast(nodes_.getExtra(extra + 1)); + r = analyze(startIdx, std::move(r.state)); + if (r.terminated) return r; + return analyze(endIdx, std::move(r.state)); + } case AstTag::Deref: // `p.*` — read the pointer. (Whether the pointee was initialized // is a separate concern it does not track.) diff --git a/src/jam_llvm.cpp b/src/jam_llvm.cpp index a731754..66e49f7 100644 --- a/src/jam_llvm.cpp +++ b/src/jam_llvm.cpp @@ -120,7 +120,8 @@ JamModuleRef JamLLVMCreateModule(const char *name, JamContextRef ctx) { void JamLLVMDisposeModule(JamModuleRef mod) { delete UNWRAP_MODULE(mod); } void JamLLVMSetTargetTriple(JamModuleRef mod, const char *triple) { - UNWRAP_MODULE(mod)->setTargetTriple(triple); + // LLVM 21+ takes a Triple here (previously a string). + UNWRAP_MODULE(mod)->setTargetTriple(llvm::Triple(triple)); } void JamLLVMSetDataLayout(JamModuleRef mod, JamTargetMachineRef tm) { @@ -204,8 +205,9 @@ JamTypeRef JamLLVMVoidType(JamContextRef ctx) { } JamTypeRef JamLLVMPointerType(JamTypeRef elementType, unsigned addressSpace) { - return WRAP_TYPE( - llvm::PointerType::get(UNWRAP_TYPE(elementType), addressSpace)); + // Opaque pointers: the element type only supplies the LLVMContext now. + return WRAP_TYPE(llvm::PointerType::get( + UNWRAP_TYPE(elementType)->getContext(), addressSpace)); } JamTypeRef JamLLVMStructType(JamContextRef ctx, JamTypeRef *elementTypes, @@ -1100,8 +1102,9 @@ JamLLVMCreateTargetMachine(const char *triple, const char *cpu, const char *features, bool isRelocationPIC, JamOptLevel optLevel, JamLTO lto) { std::string error; - const llvm::Target *target = - llvm::TargetRegistry::lookupTarget(triple, error); + // LLVM 21+ takes a Triple in TargetRegistry/TargetMachine (was a string). + llvm::Triple tt(triple); + const llvm::Target *target = llvm::TargetRegistry::lookupTarget(tt, error); if (!target) { return nullptr; } llvm::TargetOptions opt; @@ -1143,8 +1146,9 @@ JamLLVMCreateTargetMachine(const char *triple, const char *cpu, break; } + // createTargetMachine also takes the Triple `tt` built above. llvm::TargetMachine *tm = target->createTargetMachine( - triple, cpu ? cpu : "generic", features ? features : "", opt, rm, + tt, cpu ? cpu : "generic", features ? features : "", opt, rm, std::nullopt, cgOpt); if (!tm) { return nullptr; }