70
70
#endif
71
71
#include " llvm/Transforms/Utils/BasicBlockUtils.h"
72
72
#include " llvm/Transforms/Utils/ModuleUtils.h"
73
+ #include " llvm/Analysis/LoopInfo.h"
74
+ #include " llvm/Analysis/LoopPass.h"
73
75
74
76
#include " config.h"
75
77
#include " debug.h"
@@ -119,6 +121,7 @@ SanitizerCoverageOptions OverrideFromCL(SanitizerCoverageOptions Options) {
119
121
120
122
}
121
123
124
+ using LoopInfoCallback = function_ref<const LoopInfo *(Function &F)>;
122
125
using DomTreeCallback = function_ref<const DominatorTree *(Function &F)>;
123
126
using PostDomTreeCallback =
124
127
function_ref<const PostDominatorTree *(Function &F)>;
@@ -135,11 +138,13 @@ class ModuleSanitizerCoverageAFL
135
138
136
139
PreservedAnalyses run (Module &M, ModuleAnalysisManager &MAM);
137
140
bool instrumentModule (Module &M, DomTreeCallback DTCallback,
138
- PostDomTreeCallback PDTCallback);
141
+ PostDomTreeCallback PDTCallback,
142
+ LoopInfoCallback LCallback);
139
143
140
144
private:
141
145
void instrumentFunction (Function &F, DomTreeCallback DTCallback,
142
- PostDomTreeCallback PDTCallback);
146
+ PostDomTreeCallback PDTCallback,
147
+ LoopInfoCallback LCallback);
143
148
void InjectTraceForCmp (Function &F, ArrayRef<Instruction *> CmpTraceTargets);
144
149
void InjectTraceForSwitch (Function &F,
145
150
ArrayRef<Instruction *> SwitchTraceTargets);
@@ -233,8 +238,10 @@ PreservedAnalyses ModuleSanitizerCoverageAFL::run(Module &M,
233
238
ModuleAnalysisManager &MAM) {
234
239
235
240
ModuleSanitizerCoverageAFL ModuleSancov (Options);
241
+
236
242
auto &FAM = MAM.getResult <FunctionAnalysisManagerModuleProxy>(M).getManager ();
237
- auto DTCallback = [&FAM](Function &F) -> const DominatorTree *{
243
+
244
+ auto DTCallback = [&FAM](Function &F) -> const DominatorTree * {
238
245
239
246
return &FAM.getResult <DominatorTreeAnalysis>(F);
240
247
@@ -246,9 +253,21 @@ PreservedAnalyses ModuleSanitizerCoverageAFL::run(Module &M,
246
253
247
254
};
248
255
249
- if (ModuleSancov.instrumentModule (M, DTCallback, PDTCallback))
256
+ auto LoopCallback = [&FAM](Function &F) -> const LoopInfo * {
257
+
258
+ return &FAM.getResult <LoopAnalysis>(F);
259
+
260
+ };
261
+
262
+ if (ModuleSancov.instrumentModule (M, DTCallback, PDTCallback, LoopCallback)) {
263
+
250
264
return PreservedAnalyses::none ();
251
- return PreservedAnalyses::all ();
265
+
266
+ } else {
267
+
268
+ return PreservedAnalyses::all ();
269
+
270
+ }
252
271
253
272
}
254
273
@@ -324,7 +343,8 @@ Function *ModuleSanitizerCoverageAFL::CreateInitCallsForSections(
324
343
}
325
344
326
345
bool ModuleSanitizerCoverageAFL::instrumentModule (
327
- Module &M, DomTreeCallback DTCallback, PostDomTreeCallback PDTCallback) {
346
+ Module &M, DomTreeCallback DTCallback, PostDomTreeCallback PDTCallback,
347
+ LoopInfoCallback LCallback) {
328
348
329
349
setvbuf (stdout, NULL , _IONBF, 0 );
330
350
@@ -429,7 +449,7 @@ bool ModuleSanitizerCoverageAFL::instrumentModule(
429
449
M.getOrInsertFunction (SanCovTracePCGuardName, VoidTy, Int32PtrTy);
430
450
431
451
for (auto &F : M)
432
- instrumentFunction (F, DTCallback, PDTCallback);
452
+ instrumentFunction (F, DTCallback, PDTCallback, LCallback );
433
453
434
454
Function *Ctor = nullptr ;
435
455
@@ -568,7 +588,8 @@ static bool IsInterestingCmp(ICmpInst *CMP, const DominatorTree *DT,
568
588
#endif
569
589
570
590
void ModuleSanitizerCoverageAFL::instrumentFunction (
571
- Function &F, DomTreeCallback DTCallback, PostDomTreeCallback PDTCallback) {
591
+ Function &F, DomTreeCallback DTCallback, PostDomTreeCallback PDTCallback,
592
+ LoopInfoCallback LCallback) {
572
593
573
594
if (F.empty ()) return ;
574
595
if (!isInInstrumentList (&F, FMNAME)) return ;
@@ -604,6 +625,7 @@ void ModuleSanitizerCoverageAFL::instrumentFunction(
604
625
605
626
const DominatorTree *DT = DTCallback (F);
606
627
const PostDominatorTree *PDT = PDTCallback (F);
628
+ const LoopInfo *LI = LCallback (F);
607
629
bool IsLeafFunc = true ;
608
630
609
631
for (auto &BB : F) {
@@ -640,7 +662,7 @@ void ModuleSanitizerCoverageAFL::instrumentFunction(
640
662
// InjectTraceForCmp(F, CmpTraceTargets);
641
663
// InjectTraceForSwitch(F, SwitchTraceTargets);
642
664
643
- if (dump_cc) { calcCyclomaticComplexity (&F); }
665
+ if (dump_cc) { calcCyclomaticComplexity (&F, LI ); }
644
666
645
667
}
646
668
0 commit comments