tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 6a4c883edf72160289b9c87fb91244bd7324193f
parent c6bdc6abd200b1c812cc814789d1b03d6d4b6a47
Author: Mike Hommey <mh+mozilla@glandium.org>
Date:   Tue, 21 Oct 2025 22:42:53 +0000

Bug 1994622 - Backport LLVM 20 support for AFL++. r=decoder

Differential Revision: https://phabricator.services.mozilla.com/D268979

Diffstat:
Ataskcluster/scripts/misc/afl-llvm20.patch | 290+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtaskcluster/scripts/misc/build-afl.sh | 1+
2 files changed, 291 insertions(+), 0 deletions(-)

diff --git a/taskcluster/scripts/misc/afl-llvm20.patch b/taskcluster/scripts/misc/afl-llvm20.patch @@ -0,0 +1,290 @@ +From 30861b5d542105f19e65b5ca90e3f1385743d457 Mon Sep 17 00:00:00 2001 +From: vanhauser-thc <vh@thc.org> +Date: Thu, 16 Jan 2025 15:32:58 +0100 +Subject: [PATCH] llvm 20 support + +--- + GNUmakefile.llvm | 4 ++-- + instrumentation/SanitizerCoveragePCGUARD.so.cc | 4 ++++ + instrumentation/afl-llvm-dict2file.so.cc | 13 +++++++++---- + instrumentation/afl-llvm-lto-instrumentlist.so.cc | 13 +++++++++---- + instrumentation/afl-llvm-pass.so.cc | 7 +++++-- + instrumentation/cmplog-instructions-pass.cc | 13 +++++++++---- + instrumentation/cmplog-routines-pass.cc | 13 +++++++++---- + instrumentation/cmplog-switches-pass.cc | 13 +++++++++---- + instrumentation/compare-transform-pass.so.cc | 4 ++++ + instrumentation/injection-pass.cc | 13 +++++++++---- + instrumentation/split-compares-pass.so.cc | 4 ++++ + instrumentation/split-switches-pass.so.cc | 4 ++++ + 14 files changed, 81 insertions(+), 30 deletions(-) + +diff --git a/GNUmakefile.llvm b/GNUmakefile.llvm +index 5e0adb7f..2d9cc51a 100644 +--- a/GNUmakefile.llvm ++++ b/GNUmakefile.llvm +@@ -69,7 +69,7 @@ endif + + LLVM_STDCXX := gnu++11 + LLVM_LTO := 0 +-LLVM_UNSUPPORTED := $(shell echo "$(LLVMVER)" | grep -E -q '^[0-2]\.|^3\.[0-7]\.|^2[0-9]\.' && echo 1 || echo 0) ++LLVM_UNSUPPORTED := $(shell echo "$(LLVMVER)" | grep -E -q '^[0-2]\.|^3\.[0-7]\.|^2[1-9]\.' && echo 1 || echo 0) + # Uncomment to see the values assigned above + # $(foreach var,_CLANG_VERSIONS_TO_TEST LLVM_CONFIG LLVMVER LLVM_MAJOR LLVM_MINOR LLVM_TOO_NEW LLVM_TOO_OLD LLVM_TOO_NEW_DEFAULT LLVM_TOO_OLD_DEFAULT LLVM_NEW_API LLVM_NEWER_API LLVM_13_OK LLVM_HAVE_LTO LLVM_BINDIR LLVM_LIBDIR LLVM_STDCXX LLVM_APPLE_XCODE LLVM_LTO LLVM_UNSUPPORTED,$(warning $(var) = $($(var)))) + +@@ -78,7 +78,7 @@ ifeq "$(LLVMVER)" "" + endif + + ifeq "$(LLVM_UNSUPPORTED)" "1" +- $(error llvm_mode only supports llvm from version 3.8 onwards) ++ $(error llvm_mode only supports llvm from version 3.8 onwards - or your version is too new. Upgrade AFL++ if possible or downgrade LLVM.) + endif + + ifeq "$(LLVM_TOO_NEW)" "1" +index a9c87094..fae33d27 100644 +--- a/instrumentation/SanitizerCoveragePCGUARD.so.cc ++++ b/instrumentation/SanitizerCoveragePCGUARD.so.cc +@@ -226,7 +226,11 @@ llvmGetPassPluginInfo() { + using OptimizationLevel = typename PassBuilder::OptimizationLevel; + #endif + #if LLVM_VERSION_MAJOR >= 16 ++ #if LLVM_VERSION_MAJOR >= 20 ++ PB.registerPipelineStartEPCallback( ++ #else + PB.registerOptimizerEarlyEPCallback( ++ #endif + #else + PB.registerOptimizerLastEPCallback( + #endif +diff --git a/instrumentation/afl-llvm-dict2file.so.cc b/instrumentation/afl-llvm-dict2file.so.cc +index 6559bc84..c6b7312e 100644 +--- a/instrumentation/afl-llvm-dict2file.so.cc ++++ b/instrumentation/afl-llvm-dict2file.so.cc +@@ -120,12 +120,17 @@ llvmGetPassPluginInfo() { + #if LLVM_VERSION_MAJOR <= 13 + using OptimizationLevel = typename PassBuilder::OptimizationLevel; + #endif +- PB.registerOptimizerLastEPCallback( +- [](ModulePassManager &MPM, OptimizationLevel OL) { ++ PB.registerOptimizerLastEPCallback([](ModulePassManager &MPM, ++ OptimizationLevel OL ++ #if LLVM_VERSION_MAJOR >= 20 ++ , ++ ThinOrFullLTOPhase Phase ++ #endif ++ ) { + +- MPM.addPass(AFLdict2filePass()); ++ MPM.addPass(AFLdict2filePass()); + +- }); ++ }); + + }}; + +diff --git a/instrumentation/afl-llvm-lto-instrumentlist.so.cc b/instrumentation/afl-llvm-lto-instrumentlist.so.cc +index 17abe2a8..a0d4811d 100644 +--- a/instrumentation/afl-llvm-lto-instrumentlist.so.cc ++++ b/instrumentation/afl-llvm-lto-instrumentlist.so.cc +@@ -83,12 +83,17 @@ llvmGetPassPluginInfo() { + #if LLVM_VERSION_MAJOR <= 13 + using OptimizationLevel = typename PassBuilder::OptimizationLevel; + #endif +- PB.registerOptimizerLastEPCallback( +- [](ModulePassManager &MPM, OptimizationLevel OL) { ++ PB.registerOptimizerLastEPCallback([](ModulePassManager &MPM, ++ OptimizationLevel OL ++#if LLVM_VERSION_MAJOR >= 20 ++ , ++ ThinOrFullLTOPhase Phase ++#endif ++ ) { + +- MPM.addPass(AFLcheckIfInstrument()); ++ MPM.addPass(AFLcheckIfInstrument()); + +- }); ++ }); + + }}; + +diff --git a/instrumentation/afl-llvm-pass.so.cc b/instrumentation/afl-llvm-pass.so.cc +index 8620fb3f..c599e957 100644 +--- a/instrumentation/afl-llvm-pass.so.cc ++++ b/instrumentation/afl-llvm-pass.so.cc +@@ -110,8 +110,7 @@ class AFLCoverage : public ModulePass { + } // namespace + + #if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */ +-extern "C" ::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK +-llvmGetPassPluginInfo() { ++extern "C" LLVM_ATTRIBUTE_WEAK PassPluginLibraryInfo llvmGetPassPluginInfo() { + + return {LLVM_PLUGIN_API_VERSION, "AFLCoverage", "v0.1", + /* lambda to insert our pass into the pass pipeline. */ +@@ -122,7 +121,11 @@ llvmGetPassPluginInfo() { + using OptimizationLevel = typename PassBuilder::OptimizationLevel; + #endif + #if LLVM_VERSION_MAJOR >= 16 ++ #if LLVM_VERSION_MAJOR >= 20 ++ PB.registerPipelineStartEPCallback( ++ #else + PB.registerOptimizerEarlyEPCallback( ++ #endif + #else + PB.registerOptimizerLastEPCallback( + #endif +diff --git a/instrumentation/cmplog-instructions-pass.cc b/instrumentation/cmplog-instructions-pass.cc +index fe5c2926..a2165d7b 100644 +--- a/instrumentation/cmplog-instructions-pass.cc ++++ b/instrumentation/cmplog-instructions-pass.cc +@@ -123,12 +123,17 @@ llvmGetPassPluginInfo() { + #if LLVM_VERSION_MAJOR <= 13 + using OptimizationLevel = typename PassBuilder::OptimizationLevel; + #endif +- PB.registerOptimizerLastEPCallback( +- [](ModulePassManager &MPM, OptimizationLevel OL) { ++ PB.registerOptimizerLastEPCallback([](ModulePassManager &MPM, ++ OptimizationLevel OL ++ #if LLVM_VERSION_MAJOR >= 20 ++ , ++ ThinOrFullLTOPhase Phase ++ #endif ++ ) { + +- MPM.addPass(CmpLogInstructions()); ++ MPM.addPass(CmpLogInstructions()); + +- }); ++ }); + + }}; + +diff --git a/instrumentation/cmplog-routines-pass.cc b/instrumentation/cmplog-routines-pass.cc +index 560bd73b..d3fafe53 100644 +--- a/instrumentation/cmplog-routines-pass.cc ++++ b/instrumentation/cmplog-routines-pass.cc +@@ -118,12 +118,17 @@ llvmGetPassPluginInfo() { + #if LLVM_VERSION_MAJOR <= 13 + using OptimizationLevel = typename PassBuilder::OptimizationLevel; + #endif +- PB.registerOptimizerLastEPCallback( +- [](ModulePassManager &MPM, OptimizationLevel OL) { ++ PB.registerOptimizerLastEPCallback([](ModulePassManager &MPM, ++ OptimizationLevel OL ++ #if LLVM_VERSION_MAJOR >= 20 ++ , ++ ThinOrFullLTOPhase Phase ++ #endif ++ ) { + +- MPM.addPass(CmpLogRoutines()); ++ MPM.addPass(CmpLogRoutines()); + +- }); ++ }); + + }}; + +diff --git a/instrumentation/cmplog-switches-pass.cc b/instrumentation/cmplog-switches-pass.cc +index 2b87ea8c..727c47d6 100644 +--- a/instrumentation/cmplog-switches-pass.cc ++++ b/instrumentation/cmplog-switches-pass.cc +@@ -118,12 +118,17 @@ llvmGetPassPluginInfo() { + #if LLVM_VERSION_MAJOR <= 13 + using OptimizationLevel = typename PassBuilder::OptimizationLevel; + #endif +- PB.registerOptimizerLastEPCallback( +- [](ModulePassManager &MPM, OptimizationLevel OL) { ++ PB.registerOptimizerLastEPCallback([](ModulePassManager &MPM, ++ OptimizationLevel OL ++ #if LLVM_VERSION_MAJOR >= 20 ++ , ++ ThinOrFullLTOPhase Phase ++ #endif ++ ) { + +- MPM.addPass(CmplogSwitches()); ++ MPM.addPass(CmplogSwitches()); + +- }); ++ }); + + }}; + +diff --git a/instrumentation/compare-transform-pass.so.cc b/instrumentation/compare-transform-pass.so.cc +index 36149f35..5516880c 100644 +--- a/instrumentation/compare-transform-pass.so.cc ++++ b/instrumentation/compare-transform-pass.so.cc +@@ -130,7 +130,11 @@ llvmGetPassPluginInfo() { + using OptimizationLevel = typename PassBuilder::OptimizationLevel; + #endif + #if LLVM_VERSION_MAJOR >= 16 ++ #if LLVM_VERSION_MAJOR >= 20 ++ PB.registerPipelineStartEPCallback( ++ #else + PB.registerOptimizerEarlyEPCallback( ++ #endif + #else + PB.registerOptimizerLastEPCallback( + #endif +diff --git a/instrumentation/injection-pass.cc b/instrumentation/injection-pass.cc +index 47ddabd9..f745de78 100644 +--- a/instrumentation/injection-pass.cc ++++ b/instrumentation/injection-pass.cc +@@ -122,12 +122,17 @@ llvmGetPassPluginInfo() { + #if LLVM_VERSION_MAJOR <= 13 + using OptimizationLevel = typename PassBuilder::OptimizationLevel; + #endif +- PB.registerOptimizerLastEPCallback( +- [](ModulePassManager &MPM, OptimizationLevel OL) { ++ PB.registerOptimizerLastEPCallback([](ModulePassManager &MPM, ++ OptimizationLevel OL ++ #if LLVM_VERSION_MAJOR >= 20 ++ , ++ ThinOrFullLTOPhase Phase ++ #endif ++ ) { + +- MPM.addPass(InjectionRoutines()); ++ MPM.addPass(InjectionRoutines()); + +- }); ++ }); + + }}; + +diff --git a/instrumentation/split-compares-pass.so.cc b/instrumentation/split-compares-pass.so.cc +index effafe50..cc031073 100644 +--- a/instrumentation/split-compares-pass.so.cc ++++ b/instrumentation/split-compares-pass.so.cc +@@ -190,7 +190,11 @@ llvmGetPassPluginInfo() { + using OptimizationLevel = typename PassBuilder::OptimizationLevel; + #endif + #if LLVM_VERSION_MAJOR >= 16 ++ #if LLVM_VERSION_MAJOR >= 20 ++ PB.registerPipelineStartEPCallback( ++ #else + PB.registerOptimizerEarlyEPCallback( ++ #endif + #else + PB.registerOptimizerLastEPCallback( + #endif +diff --git a/instrumentation/split-switches-pass.so.cc b/instrumentation/split-switches-pass.so.cc +index aa552a42..1e4052a3 100644 +--- a/instrumentation/split-switches-pass.so.cc ++++ b/instrumentation/split-switches-pass.so.cc +@@ -138,7 +138,11 @@ llvmGetPassPluginInfo() { + using OptimizationLevel = typename PassBuilder::OptimizationLevel; + #endif + #if LLVM_VERSION_MAJOR >= 16 ++ #if LLVM_VERSION_MAJOR >= 20 ++ PB.registerPipelineStartEPCallback( ++ #else + PB.registerOptimizerEarlyEPCallback( ++ #endif + #else + PB.registerOptimizerLastEPCallback( + #endif +-- +2.51.0.1.g7a422dac74 + diff --git a/taskcluster/scripts/misc/build-afl.sh b/taskcluster/scripts/misc/build-afl.sh @@ -12,6 +12,7 @@ SH_PROGS="afl-plot afl-cmin afl-cmin.bash afl-whatsup afl-addseeds afl-system-co cd "$MOZ_FETCHES_DIR/AFLplusplus" patch -p1 -i "$scripts/afl-nyx.patch" +patch -p1 -i "$scripts/afl-llvm20.patch" make -f GNUmakefile $PROGS \ CC="$MOZ_FETCHES_DIR/clang/bin/clang" \