about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--instrumentation/SanitizerCoverageLTO.so.cc56
1 files changed, 30 insertions, 26 deletions
diff --git a/instrumentation/SanitizerCoverageLTO.so.cc b/instrumentation/SanitizerCoverageLTO.so.cc
index a3074ae2..3a02cf08 100644
--- a/instrumentation/SanitizerCoverageLTO.so.cc
+++ b/instrumentation/SanitizerCoverageLTO.so.cc
@@ -1299,7 +1299,7 @@ void ModuleSanitizerCoverageLTO::instrumentFunction(
   bool                     IsLeafFunc = true;
   uint32_t                 skip_next = 0;
   uint32_t                 call_counter = 0;
-  uint32_t                 inst_save = inst;
+  uint32_t                 inst_save = inst, save_global = afl_global_id;
   uint32_t                 inst_in_this_func = 0;
   LLVMContext             &Context = F.getContext();
 
@@ -1332,15 +1332,13 @@ void ModuleSanitizerCoverageLTO::instrumentFunction(
 
       SelectInst *selectInst = nullptr;
 
-      if (!skip_next && (selectInst = dyn_cast<SelectInst>(&IN)) && 1 == 0) {
+      if ((selectInst = dyn_cast<SelectInst>(&IN))) {
 
-        uint32_t vector_cnt = 0;
-        Value   *condition = selectInst->getCondition();
-        auto     t = condition->getType();
+        Value *condition = selectInst->getCondition();
+        auto   t = condition->getType();
 
         if (t->getTypeID() == llvm::Type::IntegerTyID) {
 
-          skip_next = 1;
           inst += 2;
 
         } else
@@ -1352,8 +1350,7 @@ void ModuleSanitizerCoverageLTO::instrumentFunction(
           if (tt) {
 
             uint32_t elements = tt->getElementCount().getFixedValue();
-            vector_cnt = elements;
-            inst += vector_cnt * 2;
+            inst += elements * 2;
 
           }
 
@@ -1366,12 +1363,6 @@ void ModuleSanitizerCoverageLTO::instrumentFunction(
 
         }
 
-        skip_next = 1;
-
-      } else {
-
-        skip_next = 0;
-
       }
 
     }
@@ -1478,19 +1469,22 @@ void ModuleSanitizerCoverageLTO::instrumentFunction(
 
   // Now the real instrumentation
 
-  IsLeafFunc = true;
-  skip_next = 0;
-
   if (CTX_add == NULL) {
 
-      auto BB = &F.getEntryBlock();
+    auto BB = &F.getEntryBlock();
+    if (!BB) {
+
       fprintf(stderr, "NULL %s %p\n", F.getName().str().c_str(), BB);
-      if (!BB) { exit(-1); }
-      BasicBlock::iterator IP = BB->getFirstInsertionPt();
-      IRBuilder<>          IRB(&(*IP));
-      CTX_add = IRB.CreateAlloca(Type::getInt32Ty(Context), nullptr, "CTX_add");
-      auto nosan = IRB.CreateStore(Zero, CTX_add);
-      nosan->setMetadata("nosanitize", N);
+      exit(-1);
+
+    }
+
+    BasicBlock::iterator IP = BB->getFirstInsertionPt();
+    IRBuilder<>          IRB(&(*IP));
+    CTX_add = IRB.CreateAlloca(Type::getInt32Ty(Context), nullptr, "CTX_add");
+    auto nosan = IRB.CreateStore(Zero, CTX_add);
+    nosan->setMetadata("nosanitize", N);
+
   }
 
   for (auto &BB : F) {
@@ -1590,6 +1584,7 @@ void ModuleSanitizerCoverageLTO::instrumentFunction(
               uint32_t elements = tt->getElementCount().getFixedValue();
               vector_cnt = elements;
               inst += vector_cnt * 2;
+
               if (elements) {
 
                 FixedVectorType *GuardPtr1 =
@@ -1714,6 +1709,15 @@ void ModuleSanitizerCoverageLTO::instrumentFunction(
 
   if (inst_in_this_func && call_counter > 1) {
 
+    if (inst_in_this_func != afl_global_id - save_global) {
+
+      fprintf(
+          stderr,
+          "BUG! inst_in_this_func %u != afl_global_id %u - save_global %u\n",
+          inst_in_this_func, afl_global_id, save_global);
+
+    }
+
     extra_ctx_inst += inst_in_this_func * (call_counter - 1);
     afl_global_id += extra_ctx_inst;
 
@@ -1883,7 +1887,7 @@ bool ModuleSanitizerCoverageLTO::Fake_InjectCoverage(
 
     }
 
-    inst++;  // InjectCoverageAtBlock()
+    ++inst;  // InjectCoverageAtBlock()
 
   }
 
@@ -2017,7 +2021,7 @@ void ModuleSanitizerCoverageLTO::InjectCoverageAtBlock(Function   &F,
 
     // done :)
 
-    inst++;
+    ++inst;
     // AFL++ END
 
     /*