aboutsummaryrefslogtreecommitdiff
path: root/instrumentation/split-compares-pass.so.cc
diff options
context:
space:
mode:
authorvanhauser-thc <vh@thc.org>2022-02-20 19:51:43 +0100
committervanhauser-thc <vh@thc.org>2022-02-20 19:51:43 +0100
commit92db44363543b510b7737d51ea2b9a4e790bfb07 (patch)
tree0047ceef4707aad6bc5fce9638ed8d2e24a7b808 /instrumentation/split-compares-pass.so.cc
parenta5943dc782d1a6047aaa8f455ab37e4a31369311 (diff)
downloadafl++-92db44363543b510b7737d51ea2b9a4e790bfb07.tar.gz
Revert "remove new llvm pass manager :("
This reverts commit 55ed2a443c5c61baba37415d4087164454d8a2a8.
Diffstat (limited to 'instrumentation/split-compares-pass.so.cc')
-rw-r--r--instrumentation/split-compares-pass.so.cc132
1 files changed, 117 insertions, 15 deletions
diff --git a/instrumentation/split-compares-pass.so.cc b/instrumentation/split-compares-pass.so.cc
index 0f00fa96..d7bb7aba 100644
--- a/instrumentation/split-compares-pass.so.cc
+++ b/instrumentation/split-compares-pass.so.cc
@@ -1,6 +1,7 @@
/*
* Copyright 2016 laf-intel
* extended for floating point by Heiko Eißfeldt
+ * adapted to new pass manager by Heiko Eißfeldt
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,10 +29,20 @@
#include "llvm/Pass.h"
#include "llvm/Support/raw_ostream.h"
-#include "llvm/IR/LegacyPassManager.h"
-#include "llvm/Transforms/IPO/PassManagerBuilder.h"
+
+#if LLVM_MAJOR >= 11
+ #include "llvm/Passes/PassPlugin.h"
+ #include "llvm/Passes/PassBuilder.h"
+ #include "llvm/IR/PassManager.h"
+#else
+ #include "llvm/IR/LegacyPassManager.h"
+ #include "llvm/Transforms/IPO/PassManagerBuilder.h"
+#endif
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/IR/Module.h"
+#if LLVM_VERSION_MAJOR >= 14 /* how about stable interfaces? */
+ #include "llvm/Passes/OptimizationLevel.h"
+#endif
#include "llvm/IR/IRBuilder.h"
#if LLVM_VERSION_MAJOR >= 4 || \
@@ -53,27 +64,31 @@ using namespace llvm;
namespace {
+#if LLVM_MAJOR >= 11
+class SplitComparesTransform : public PassInfoMixin<SplitComparesTransform> {
+
+ public:
+ // static char ID;
+ SplitComparesTransform() : enableFPSplit(0) {
+
+#else
class SplitComparesTransform : public ModulePass {
public:
static char ID;
SplitComparesTransform() : ModulePass(ID), enableFPSplit(0) {
+#endif
+
initInstrumentList();
}
- bool runOnModule(Module &M) override;
-#if LLVM_VERSION_MAJOR >= 4
- StringRef getPassName() const override {
-
+#if LLVM_MAJOR >= 11
+ PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
#else
- const char *getPassName() const override {
-
+ bool runOnModule(Module &M) override;
#endif
- return "AFL_SplitComparesTransform";
-
- }
private:
int enableFPSplit;
@@ -162,7 +177,54 @@ class SplitComparesTransform : public ModulePass {
} // namespace
+#if LLVM_MAJOR >= 11
+extern "C" ::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK
+llvmGetPassPluginInfo() {
+
+ return {LLVM_PLUGIN_API_VERSION, "splitcompares", "v0.1",
+ /* lambda to insert our pass into the pass pipeline. */
+ [](PassBuilder &PB) {
+
+ #if 1
+ #if LLVM_VERSION_MAJOR <= 13
+ using OptimizationLevel = typename PassBuilder::OptimizationLevel;
+ #endif
+ PB.registerOptimizerLastEPCallback(
+ [](ModulePassManager &MPM, OptimizationLevel OL) {
+
+ MPM.addPass(SplitComparesTransform());
+
+ });
+
+ /* TODO LTO registration */
+ #else
+ using PipelineElement = typename PassBuilder::PipelineElement;
+ PB.registerPipelineParsingCallback([](StringRef Name,
+ ModulePassManager &MPM,
+ ArrayRef<PipelineElement>) {
+
+ if (Name == "splitcompares") {
+
+ MPM.addPass(SplitComparesTransform());
+ return true;
+
+ } else {
+
+ return false;
+
+ }
+
+ });
+
+ #endif
+
+ }};
+
+}
+
+#else
char SplitComparesTransform::ID = 0;
+#endif
/// This function splits FCMP instructions with xGE or xLE predicates into two
/// FCMP instructions with predicate xGT or xLT and EQ
@@ -1421,8 +1483,15 @@ size_t SplitComparesTransform::splitFPCompares(Module &M) {
}
+#if LLVM_MAJOR >= 11
+PreservedAnalyses SplitComparesTransform::run(Module & M,
+ ModuleAnalysisManager &MAM) {
+
+#else
bool SplitComparesTransform::runOnModule(Module &M) {
+#endif
+
char *bitw_env = getenv("AFL_LLVM_LAF_SPLIT_COMPARES_BITW");
if (!bitw_env) bitw_env = getenv("LAF_SPLIT_COMPARES_BITW");
if (bitw_env) { target_bitwidth = atoi(bitw_env); }
@@ -1432,7 +1501,7 @@ bool SplitComparesTransform::runOnModule(Module &M) {
if ((isatty(2) && getenv("AFL_QUIET") == NULL) ||
getenv("AFL_DEBUG") != NULL) {
- errs() << "Split-compare-pass by laf.intel@gmail.com, extended by "
+ errs() << "Split-compare-newpass by laf.intel@gmail.com, extended by "
"heiko@hexco.de (splitting icmp to "
<< target_bitwidth << " bit)\n";
@@ -1444,6 +1513,10 @@ bool SplitComparesTransform::runOnModule(Module &M) {
}
+#if LLVM_MAJOR >= 11
+ auto PA = PreservedAnalyses::all();
+#endif
+
if (enableFPSplit) {
simplifyFPCompares(M);
@@ -1473,7 +1546,16 @@ bool SplitComparesTransform::runOnModule(Module &M) {
auto op0 = CI->getOperand(0);
auto op1 = CI->getOperand(1);
- if (!op0 || !op1) { return false; }
+ if (!op0 || !op1) {
+
+#if LLVM_MAJOR >= 11
+ return PA;
+#else
+ return false;
+#endif
+
+ }
+
auto iTy1 = dyn_cast<IntegerType>(op0->getType());
if (iTy1 && isa<IntegerType>(op1->getType())) {
@@ -1522,10 +1604,29 @@ bool SplitComparesTransform::runOnModule(Module &M) {
}
+ if ((isatty(2) && getenv("AFL_QUIET") == NULL) ||
+ getenv("AFL_DEBUG") != NULL) {
+
+ errs() << count << " comparisons found\n";
+
+ }
+
+#if LLVM_MAJOR >= 11
+ /* if (modified) {
+
+ PA.abandon<XX_Manager>();
+
+ }*/
+
+ return PA;
+#else
return true;
+#endif
}
+#if LLVM_MAJOR < 11 /* use old pass manager */
+
static void registerSplitComparesPass(const PassManagerBuilder &,
legacy::PassManagerBase &PM) {
@@ -1539,14 +1640,15 @@ static RegisterStandardPasses RegisterSplitComparesPass(
static RegisterStandardPasses RegisterSplitComparesTransPass0(
PassManagerBuilder::EP_EnabledOnOptLevel0, registerSplitComparesPass);
-#if LLVM_VERSION_MAJOR >= 11
+ #if LLVM_VERSION_MAJOR >= 11
static RegisterStandardPasses RegisterSplitComparesTransPassLTO(
PassManagerBuilder::EP_FullLinkTimeOptimizationLast,
registerSplitComparesPass);
-#endif
+ #endif
static RegisterPass<SplitComparesTransform> X("splitcompares",
"AFL++ split compares",
true /* Only looks at CFG */,
true /* Analysis Pass */);
+#endif