about summary refs log tree commit diff
diff options
context:
space:
mode:
authoraflpp <aflpp@aflplus.plus>2020-08-21 11:17:03 +0200
committeraflpp <aflpp@aflplus.plus>2020-08-21 11:17:03 +0200
commit714e4d2b4688624586560017b6f53699aeb56d1c (patch)
treef611de6d5e78d490f1755fbd1f70a39524f102ec
parent85a4c5e7248cb4073c7396e0c80306bdfed58f86 (diff)
downloadafl++-714e4d2b4688624586560017b6f53699aeb56d1c.tar.gz
fixed for LTO llvm 11
-rw-r--r--llvm_mode/SanitizerCoverageLTO.so.cc75
-rw-r--r--llvm_mode/afl-clang-fast.c6
2 files changed, 50 insertions, 31 deletions
diff --git a/llvm_mode/SanitizerCoverageLTO.so.cc b/llvm_mode/SanitizerCoverageLTO.so.cc
index 95834a36..6788c64b 100644
--- a/llvm_mode/SanitizerCoverageLTO.so.cc
+++ b/llvm_mode/SanitizerCoverageLTO.so.cc
@@ -165,12 +165,16 @@ class ModuleSanitizerCoverage {
 
  public:
   ModuleSanitizerCoverage(
-      const SanitizerCoverageOptions &Options = SanitizerCoverageOptions(),
+      const SanitizerCoverageOptions &Options = SanitizerCoverageOptions()) 
+       : Options(OverrideFromCL(Options)) {
+
+      /* ,
       const SpecialCaseList *         Allowlist = nullptr,
       const SpecialCaseList *         Blocklist = nullptr)
-      : Options(OverrideFromCL(Options)),
+        ,
         Allowlist(Allowlist),
         Blocklist(Blocklist) {
+      */
 
   }
 
@@ -224,26 +228,26 @@ class ModuleSanitizerCoverage {
   SanitizerCoverageOptions Options;
 
   // afl++ START
-  const SpecialCaseList *          Allowlist;
-  const SpecialCaseList *          Blocklist;
+  //const SpecialCaseList *          Allowlist;
+  //const SpecialCaseList *          Blocklist;
   uint32_t                         autodictionary = 1;
   uint32_t                         inst = 0;
   uint32_t                         afl_global_id = 0;
   uint64_t                         map_addr = 0;
-  char *                           skip_nozero;
+  char *                           skip_nozero = NULL;
   std::vector<BasicBlock *>        BlockList;
   DenseMap<Value *, std::string *> valueMap;
   std::vector<std::string>         dictionary;
-  IntegerType *                    Int8Tyi;
-  IntegerType *                    Int32Tyi;
-  IntegerType *                    Int64Tyi;
-  ConstantInt *                    Zero;
-  ConstantInt *                    One;
-  LLVMContext *                    Ct;
-  Module *                         Mo;
-  GlobalVariable *                 AFLMapPtr;
-  Value *                          MapPtrFixed;
-  FILE *                           documentFile;
+  IntegerType *                    Int8Tyi = NULL;
+  IntegerType *                    Int32Tyi = NULL;
+  IntegerType *                    Int64Tyi = NULL;
+  ConstantInt *                    Zero = NULL;
+  ConstantInt *                    One = NULL;
+  LLVMContext *                    Ct = NULL;
+  Module *                         Mo = NULL;
+  GlobalVariable *                 AFLMapPtr = NULL;
+  Value *                          MapPtrFixed = NULL;
+  FILE *                           documentFile = NULL;
   // afl++ END
 
 };
@@ -266,19 +270,20 @@ class ModuleSanitizerCoverageLegacyPass : public ModulePass {
   }
 
   ModuleSanitizerCoverageLegacyPass(
-      const SanitizerCoverageOptions &Options = SanitizerCoverageOptions(),
+      const SanitizerCoverageOptions &Options = SanitizerCoverageOptions())
+       : ModulePass(ID), Options(Options) {
+/* ,
       const std::vector<std::string> &AllowlistFiles =
           std::vector<std::string>(),
       const std::vector<std::string> &BlocklistFiles =
           std::vector<std::string>())
-      : ModulePass(ID), Options(Options) {
-
     if (AllowlistFiles.size() > 0)
       Allowlist = SpecialCaseList::createOrDie(AllowlistFiles,
                                                *vfs::getRealFileSystem());
     if (BlocklistFiles.size() > 0)
       Blocklist = SpecialCaseList::createOrDie(BlocklistFiles,
                                                *vfs::getRealFileSystem());
+*/
     initializeModuleSanitizerCoverageLegacyPassPass(
         *PassRegistry::getPassRegistry());
 
@@ -286,8 +291,8 @@ class ModuleSanitizerCoverageLegacyPass : public ModulePass {
 
   bool runOnModule(Module &M) override {
 
-    ModuleSanitizerCoverage ModuleSancov(Options, Allowlist.get(),
-                                         Blocklist.get());
+    ModuleSanitizerCoverage ModuleSancov(Options);
+    // , Allowlist.get(), Blocklist.get());
     auto DTCallback = [this](Function &F) -> const DominatorTree * {
 
       return &this->getAnalysis<DominatorTreeWrapperPass>(F).getDomTree();
@@ -308,8 +313,8 @@ class ModuleSanitizerCoverageLegacyPass : public ModulePass {
  private:
   SanitizerCoverageOptions Options;
 
-  std::unique_ptr<SpecialCaseList> Allowlist;
-  std::unique_ptr<SpecialCaseList> Blocklist;
+  //std::unique_ptr<SpecialCaseList> Allowlist;
+  //std::unique_ptr<SpecialCaseList> Blocklist;
 
 };
 
@@ -318,8 +323,8 @@ class ModuleSanitizerCoverageLegacyPass : public ModulePass {
 PreservedAnalyses ModuleSanitizerCoveragePass::run(Module &               M,
                                                    ModuleAnalysisManager &MAM) {
 
-  ModuleSanitizerCoverage ModuleSancov(Options, Allowlist.get(),
-                                       Blocklist.get());
+  ModuleSanitizerCoverage ModuleSancov(Options);
+  //Allowlist.get(), Blocklist.get());
   auto &FAM = MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
   auto  DTCallback = [&FAM](Function &F) -> const DominatorTree * {
 
@@ -369,12 +374,17 @@ bool ModuleSanitizerCoverage::instrumentModule(
     Module &M, DomTreeCallback DTCallback, PostDomTreeCallback PDTCallback) {
 
   if (Options.CoverageType == SanitizerCoverageOptions::SCK_None) return false;
+/*
   if (Allowlist &&
       !Allowlist->inSection("coverage", "src", M.getSourceFileName()))
     return false;
   if (Blocklist &&
       Blocklist->inSection("coverage", "src", M.getSourceFileName()))
     return false;
+*/
+  BlockList.clear();
+  valueMap.clear();
+  dictionary.clear();
   C = &(M.getContext());
   DL = &M.getDataLayout();
   CurModule = &M;
@@ -1098,9 +1108,9 @@ void ModuleSanitizerCoverage::instrumentFunction(
   if (F.hasPersonalityFn() &&
       isAsynchronousEHPersonality(classifyEHPersonality(F.getPersonalityFn())))
     return;
-  if (Allowlist && !Allowlist->inSection("coverage", "fun", F.getName()))
-    return;
-  if (Blocklist && Blocklist->inSection("coverage", "fun", F.getName())) return;
+  //if (Allowlist && !Allowlist->inSection("coverage", "fun", F.getName()))
+  //  return;
+  // if (Blocklist && Blocklist->inSection("coverage", "fun", F.getName())) return;
 
   // afl++ START
   if (!F.size()) return;
@@ -1306,7 +1316,11 @@ void ModuleSanitizerCoverage::InjectCoverageAtBlock(Function &F, BasicBlock &BB,
   if (Options.TracePC) {
 
     IRB.CreateCall(SanCovTracePC)
+#if LLVM_VERSION_MAJOR < 12
+        ->cannotMerge();  // gets the PC using GET_CALLER_PC.
+#else
         ->setCannotMerge();  // gets the PC using GET_CALLER_PC.
+#endif
 
   }
 
@@ -1457,12 +1471,11 @@ INITIALIZE_PASS_END(ModuleSanitizerCoverageLegacyPass, "sancov",
                     false)
 
 ModulePass *llvm::createModuleSanitizerCoverageLegacyPassPass(
-    const SanitizerCoverageOptions &Options,
-    const std::vector<std::string> &AllowlistFiles,
+    const SanitizerCoverageOptions &Options, const std::vector<std::string> &AllowlistFiles,
     const std::vector<std::string> &BlocklistFiles) {
 
-  return new ModuleSanitizerCoverageLegacyPass(Options, AllowlistFiles,
-                                               BlocklistFiles);
+  return new ModuleSanitizerCoverageLegacyPass(Options);
+  //, AllowlistFiles, BlocklistFiles);
 
 }
 
diff --git a/llvm_mode/afl-clang-fast.c b/llvm_mode/afl-clang-fast.c
index cafc9265..f84778cb 100644
--- a/llvm_mode/afl-clang-fast.c
+++ b/llvm_mode/afl-clang-fast.c
@@ -851,6 +851,12 @@ int main(int argc, char **argv, char **envp) {
 
       }
 
+    } else if (instrument_mode == INSTRUMENT_LTO ||
+        instrument_mode == INSTRUMENT_CLASSIC) {
+
+      lto_mode = 1;
+      callname = "afl-clang-lto";
+
     } else {
 
       if (!be_quiet)