aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvanhauser-thc <vh@thc.org>2024-04-07 09:44:33 +0200
committervanhauser-thc <vh@thc.org>2024-04-07 09:44:33 +0200
commit45603367bfb71948f56715ac88e34c05c0dc0486 (patch)
tree9e2535f8cec6750d9ecfe5d398384fd21c916b97
parentf7ea0f569fa57e22548c1dc8eaba2903213e496e (diff)
downloadafl++-45603367bfb71948f56715ac88e34c05c0dc0486.tar.gz
fix llvm modules
-rw-r--r--docs/Changelog.md1
-rw-r--r--instrumentation/SanitizerCoverageLTO.so.cc9
-rw-r--r--instrumentation/afl-llvm-dict2file.so.cc2
-rw-r--r--instrumentation/afl-llvm-pass.so.cc10
-rw-r--r--instrumentation/cmplog-instructions-pass.cc9
-rw-r--r--instrumentation/cmplog-routines-pass.cc12
-rw-r--r--instrumentation/cmplog-switches-pass.cc12
-rw-r--r--instrumentation/compare-transform-pass.so.cc27
-rw-r--r--instrumentation/injection-pass.cc17
-rw-r--r--instrumentation/split-compares-pass.so.cc37
-rw-r--r--instrumentation/split-switches-pass.so.cc17
-rw-r--r--src/afl-cc.c7
12 files changed, 95 insertions, 65 deletions
diff --git a/docs/Changelog.md b/docs/Changelog.md
index 70f4e375..72e20a18 100644
--- a/docs/Changelog.md
+++ b/docs/Changelog.md
@@ -29,6 +29,7 @@
- added collision free caller instrumentation to LTO mode. activate with
`AFL_LLVM_LTO_CALLER=1`. You can set a max depth to go through single
block functions with `AFL_LLVM_LTO_CALLER_DEPTH` (default 0)
+ - fixes for COMPCOV/LAF and most other modules
- fix for GCC_PLUGIN cmplog that broke on std::strings
- afl-whatsup:
- now also displays current average speed
diff --git a/instrumentation/SanitizerCoverageLTO.so.cc b/instrumentation/SanitizerCoverageLTO.so.cc
index 43c6ca40..4518c1c7 100644
--- a/instrumentation/SanitizerCoverageLTO.so.cc
+++ b/instrumentation/SanitizerCoverageLTO.so.cc
@@ -341,7 +341,7 @@ llvmGetPassPluginInfo() {
using OptimizationLevel = typename PassBuilder::OptimizationLevel;
#endif
#if LLVM_VERSION_MAJOR >= 15
- PB.registerFullLinkTimeOptimizationLastEPCallback(
+ PB.registerFullLinkTimeOptimizationEarlyEPCallback(
#else
PB.registerOptimizerLastEPCallback(
#endif
@@ -1304,7 +1304,12 @@ u32 countCallers(Function *F) {
for (auto *U : F->users()) {
- if (auto *CI = dyn_cast<CallInst>(U)) { ++callers; }
+ if (auto *CI = dyn_cast<CallInst>(U)) {
+
+ ++callers;
+ (void)(CI);
+
+ }
}
diff --git a/instrumentation/afl-llvm-dict2file.so.cc b/instrumentation/afl-llvm-dict2file.so.cc
index ac497b5b..b93f61f0 100644
--- a/instrumentation/afl-llvm-dict2file.so.cc
+++ b/instrumentation/afl-llvm-dict2file.so.cc
@@ -746,7 +746,7 @@ bool AFLdict2filePass::runOnModule(Module &M) {
auto PA = PreservedAnalyses::all();
return PA;
#else
- return true;
+ return false;
#endif
}
diff --git a/instrumentation/afl-llvm-pass.so.cc b/instrumentation/afl-llvm-pass.so.cc
index 62f5023d..75b8532b 100644
--- a/instrumentation/afl-llvm-pass.so.cc
+++ b/instrumentation/afl-llvm-pass.so.cc
@@ -128,7 +128,11 @@ llvmGetPassPluginInfo() {
#if LLVM_VERSION_MAJOR <= 13
using OptimizationLevel = typename PassBuilder::OptimizationLevel;
#endif
+ #if LLVM_VERSION_MAJOR >= 16
+ PB.registerOptimizerEarlyEPCallback(
+ #else
PB.registerOptimizerLastEPCallback(
+ #endif
[](ModulePassManager &MPM, OptimizationLevel OL) {
MPM.addPass(AFLCoverage());
@@ -212,10 +216,6 @@ bool AFLCoverage::runOnModule(Module &M) {
u32 rand_seed;
unsigned int cur_loc = 0;
-#if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */
- auto PA = PreservedAnalyses::all();
-#endif
-
/* Setup random() so we get Actually Random(TM) outputs from AFL_R() */
gettimeofday(&tv, &tz);
rand_seed = tv.tv_sec ^ tv.tv_usec ^ getpid();
@@ -1081,7 +1081,7 @@ bool AFLCoverage::runOnModule(Module &M) {
}
#if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */
- return PA;
+ return PreservedAnalyses();
#else
return true;
#endif
diff --git a/instrumentation/cmplog-instructions-pass.cc b/instrumentation/cmplog-instructions-pass.cc
index dc60221e..fe5c2926 100644
--- a/instrumentation/cmplog-instructions-pass.cc
+++ b/instrumentation/cmplog-instructions-pass.cc
@@ -680,13 +680,16 @@ bool CmpLogInstructions::runOnModule(Module &M) {
printf("Running cmplog-instructions-pass by andreafioraldi@gmail.com\n");
else
be_quiet = 1;
- hookInstrs(M);
+ bool ret = hookInstrs(M);
verifyModule(M);
#if LLVM_MAJOR >= 11 /* use new pass manager */
- return PreservedAnalyses::all();
+ if (ret == false)
+ return PreservedAnalyses::all();
+ else
+ return PreservedAnalyses();
#else
- return true;
+ return ret;
#endif
}
diff --git a/instrumentation/cmplog-routines-pass.cc b/instrumentation/cmplog-routines-pass.cc
index 78317d5d..560bd73b 100644
--- a/instrumentation/cmplog-routines-pass.cc
+++ b/instrumentation/cmplog-routines-pass.cc
@@ -758,16 +758,16 @@ bool CmpLogRoutines::runOnModule(Module &M) {
printf("Running cmplog-routines-pass by andreafioraldi@gmail.com\n");
else
be_quiet = 1;
- hookRtns(M);
-#if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */
- auto PA = PreservedAnalyses::all();
-#endif
+ bool ret = hookRtns(M);
verifyModule(M);
#if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */
- return PA;
+ if (ret == false)
+ return PreservedAnalyses::all();
+ else
+ return PreservedAnalyses();
#else
- return true;
+ return ret;
#endif
}
diff --git a/instrumentation/cmplog-switches-pass.cc b/instrumentation/cmplog-switches-pass.cc
index 3e05c13d..2b87ea8c 100644
--- a/instrumentation/cmplog-switches-pass.cc
+++ b/instrumentation/cmplog-switches-pass.cc
@@ -442,16 +442,16 @@ bool CmplogSwitches::runOnModule(Module &M) {
printf("Running cmplog-switches-pass by andreafioraldi@gmail.com\n");
else
be_quiet = 1;
- hookInstrs(M);
-#if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */
- auto PA = PreservedAnalyses::all();
-#endif
+ bool ret = hookInstrs(M);
verifyModule(M);
#if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */
- return PA;
+ if (ret == false)
+ return PreservedAnalyses::all();
+ else
+ return PreservedAnalyses();
#else
- return true;
+ return ret;
#endif
}
diff --git a/instrumentation/compare-transform-pass.so.cc b/instrumentation/compare-transform-pass.so.cc
index b0d6355a..f8ba9de5 100644
--- a/instrumentation/compare-transform-pass.so.cc
+++ b/instrumentation/compare-transform-pass.so.cc
@@ -89,7 +89,7 @@ class CompareTransform : public ModulePass {
#endif
- return "cmplog transform";
+ return "compcov transform";
}
@@ -123,7 +123,11 @@ llvmGetPassPluginInfo() {
#if LLVM_VERSION_MAJOR <= 13
using OptimizationLevel = typename PassBuilder::OptimizationLevel;
#endif
+ #if LLVM_VERSION_MAJOR >= 16
+ PB.registerOptimizerEarlyEPCallback(
+ #else
PB.registerOptimizerLastEPCallback(
+ #endif
[](ModulePassManager &MPM, OptimizationLevel OL) {
MPM.addPass(CompareTransform());
@@ -746,6 +750,8 @@ bool CompareTransform::runOnModule(Module &M) {
#endif
+ bool ret = false;
+
if ((isatty(2) && getenv("AFL_QUIET") == NULL) || getenv("AFL_DEBUG") != NULL)
printf(
"Running compare-transform-pass by laf.intel@gmail.com, extended by "
@@ -753,11 +759,7 @@ bool CompareTransform::runOnModule(Module &M) {
else
be_quiet = 1;
-#if LLVM_MAJOR >= 11 /* use new pass manager */
- auto PA = PreservedAnalyses::all();
-#endif
-
- transformCmps(M, true, true, true, true, true);
+ if (transformCmps(M, true, true, true, true, true) == true) ret = true;
verifyModule(M);
#if LLVM_MAJOR >= 11 /* use new pass manager */
@@ -767,9 +769,18 @@ bool CompareTransform::runOnModule(Module &M) {
}*/
- return PA;
+ if (ret == true) {
+
+ return PreservedAnalyses();
+
+ } else {
+
+ return PreservedAnalyses::all();
+
+ }
+
#else
- return true;
+ return ret;
#endif
}
diff --git a/instrumentation/injection-pass.cc b/instrumentation/injection-pass.cc
index 2280208b..47ddabd9 100644
--- a/instrumentation/injection-pass.cc
+++ b/instrumentation/injection-pass.cc
@@ -204,6 +204,8 @@ bool InjectionRoutines::hookRtns(Module &M) {
Function *FuncPtr;
#endif
+ bool ret = false;
+
/* iterate over all functions, bbs and instruction and add suitable calls */
for (auto &F : M) {
@@ -281,6 +283,7 @@ bool InjectionRoutines::hookRtns(Module &M) {
IRBuilder<> IRB(callInst->getParent());
IRB.SetInsertPoint(callInst);
+ ret = true;
Value *parameter = callInst->getArgOperand(param);
@@ -299,7 +302,7 @@ bool InjectionRoutines::hookRtns(Module &M) {
}
- return true;
+ return ret;
}
@@ -328,16 +331,16 @@ bool InjectionRoutines::runOnModule(Module &M) {
if (getenv("AFL_LLVM_INJECTIONS_LDAP")) { doLDAP = true; }
if (getenv("AFL_LLVM_INJECTIONS_XSS")) { doXSS = true; }
- hookRtns(M);
-#if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */
- auto PA = PreservedAnalyses::all();
-#endif
+ bool ret = hookRtns(M);
verifyModule(M);
#if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */
- return PA;
+ if (ret == false)
+ return PreservedAnalyses::all();
+ else
+ return PreservedAnalyses();
#else
- return true;
+ return ret;
#endif
}
diff --git a/instrumentation/split-compares-pass.so.cc b/instrumentation/split-compares-pass.so.cc
index 144025fb..421a7c39 100644
--- a/instrumentation/split-compares-pass.so.cc
+++ b/instrumentation/split-compares-pass.so.cc
@@ -189,7 +189,11 @@ llvmGetPassPluginInfo() {
#if LLVM_VERSION_MAJOR <= 13
using OptimizationLevel = typename PassBuilder::OptimizationLevel;
#endif
+ #if LLVM_VERSION_MAJOR >= 16
+ PB.registerOptimizerEarlyEPCallback(
+ #else
PB.registerOptimizerLastEPCallback(
+ #endif
[](ModulePassManager &MPM, OptimizationLevel OL) {
MPM.addPass(SplitComparesTransform());
@@ -935,7 +939,7 @@ size_t SplitComparesTransform::nextPowerOfTwo(size_t in) {
/* splits fcmps into two nested fcmps with sign compare and the rest */
size_t SplitComparesTransform::splitFPCompares(Module &M) {
- size_t count = 0;
+ size_t counts = 0;
LLVMContext &C = M.getContext();
@@ -951,7 +955,7 @@ size_t SplitComparesTransform::splitFPCompares(Module &M) {
} else {
- return count;
+ return counts;
}
@@ -1004,7 +1008,7 @@ size_t SplitComparesTransform::splitFPCompares(Module &M) {
}
- if (!fcomps.size()) { return count; }
+ if (!fcomps.size()) { return counts; }
IntegerType *Int1Ty = IntegerType::getInt1Ty(C);
@@ -1690,11 +1694,11 @@ size_t SplitComparesTransform::splitFPCompares(Module &M) {
#else
ReplaceInstWithInst(FcmpInst->getParent()->getInstList(), ii, PN);
#endif
- ++count;
+ ++counts;
}
- return count;
+ return counts;
}
@@ -1743,10 +1747,6 @@ bool SplitComparesTransform::runOnModule(Module &M) {
}
-#if LLVM_MAJOR >= 11
- auto PA = PreservedAnalyses::all();
-#endif
-
if (enableFPSplit) {
simplifyFPCompares(M);
@@ -1778,15 +1778,7 @@ bool SplitComparesTransform::runOnModule(Module &M) {
auto op0 = CI->getOperand(0);
auto op1 = CI->getOperand(1);
- if (!op0 || !op1) {
-
-#if LLVM_MAJOR >= 11
- return PA;
-#else
- return false;
-#endif
-
- }
+ if (!op0 || !op1) { continue; }
auto iTy1 = dyn_cast<IntegerType>(op0->getType());
if (iTy1 && isa<IntegerType>(op1->getType())) {
@@ -1814,6 +1806,8 @@ bool SplitComparesTransform::runOnModule(Module &M) {
}
+ bool ret = count == 0 ? false : true;
+
bool brokenDebug = false;
if (verifyModule(M, &errs()
#if LLVM_VERSION_MAJOR >= 4 || \
@@ -1852,9 +1846,12 @@ bool SplitComparesTransform::runOnModule(Module &M) {
}*/
- return PA;
+ if (ret == false)
+ return PreservedAnalyses::all();
+ else
+ return PreservedAnalyses();
#else
- return true;
+ return ret;
#endif
}
diff --git a/instrumentation/split-switches-pass.so.cc b/instrumentation/split-switches-pass.so.cc
index e3dfea0d..aa552a42 100644
--- a/instrumentation/split-switches-pass.so.cc
+++ b/instrumentation/split-switches-pass.so.cc
@@ -137,7 +137,11 @@ llvmGetPassPluginInfo() {
#if LLVM_VERSION_MAJOR <= 13
using OptimizationLevel = typename PassBuilder::OptimizationLevel;
#endif
+ #if LLVM_VERSION_MAJOR >= 16
+ PB.registerOptimizerEarlyEPCallback(
+ #else
PB.registerOptimizerLastEPCallback(
+ #endif
[](ModulePassManager &MPM, OptimizationLevel OL) {
MPM.addPass(SplitSwitchesTransform());
@@ -516,11 +520,7 @@ bool SplitSwitchesTransform::runOnModule(Module &M) {
else
be_quiet = 1;
-#if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */
- auto PA = PreservedAnalyses::all();
-#endif
-
- splitSwitches(M);
+ bool ret = splitSwitches(M);
verifyModule(M);
#if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */
@@ -530,9 +530,12 @@ bool SplitSwitchesTransform::runOnModule(Module &M) {
}*/
- return PA;
+ if (ret == false)
+ return PreservedAnalyses::all();
+ else
+ return PreservedAnalyses();
#else
- return true;
+ return ret;
#endif
}
diff --git a/src/afl-cc.c b/src/afl-cc.c
index faa46103..45fd398b 100644
--- a/src/afl-cc.c
+++ b/src/afl-cc.c
@@ -1369,6 +1369,13 @@ void mode_final_checkout(aflcc_state_t *aflcc, int argc, char **argv) {
}
+ if (getenv("AFL_LLVM_DICT2FILE") &&
+ (getenv("AFL_LLVM_LAF_SPLIT_SWITCHES") ||
+ getenv("AFL_LLVM_LAF_SPLIT_COMPARES") ||
+ getenv("AFL_LLVM_LAF_SPLIT_FLOATS") ||
+ getenv("AFL_LLVM_LAF_TRANSFORM_COMPARES")))
+ FATAL("AFL_LLVM_DICT2FILE is incompatible with AFL_LLVM_LAF_*");
+
aflcc->cmplog_mode = getenv("AFL_CMPLOG") || getenv("AFL_LLVM_CMPLOG") ||
getenv("AFL_GCC_CMPLOG");