From f5377021c55e7ffc158488fb94d580772573d978 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Fri, 22 Aug 2014 01:18:18 +0000 Subject: [PATCH] [dfsan] Fix non-determinism bug in non-zero label check annotator. We now use a std::vector instead of a DenseSet to store the list of label checks so that we can iterate over it deterministically. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216255 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Instrumentation/DataFlowSanitizer.cpp | 18 ++++++++---------- .../DataFlowSanitizer/debug-nonzero-labels.ll | 13 ++++++++----- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp b/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp index 9f5e0bb844d..6323a56d06f 100644 --- a/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp +++ b/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp @@ -280,7 +280,7 @@ struct DFSanFunction { DenseMap AllocaShadowMap; std::vector > PHIFixups; DenseSet SkipInsts; - DenseSet NonZeroChecks; + std::vector NonZeroChecks; bool AvoidNewBlocks; struct CachedCombinedShadow { @@ -802,18 +802,16 @@ bool DataFlowSanitizer::runOnModule(Module &M) { // yet). To make our life easier, do this work in a pass after the main // instrumentation. if (ClDebugNonzeroLabels) { - for (DenseSet::iterator i = DFSF.NonZeroChecks.begin(), - e = DFSF.NonZeroChecks.end(); - i != e; ++i) { + for (Value *V : DFSF.NonZeroChecks) { Instruction *Pos; - if (Instruction *I = dyn_cast(*i)) + if (Instruction *I = dyn_cast(V)) Pos = I->getNextNode(); else Pos = DFSF.F->getEntryBlock().begin(); while (isa(Pos) || isa(Pos)) Pos = Pos->getNextNode(); IRBuilder<> IRB(Pos); - Value *Ne = IRB.CreateICmpNE(*i, DFSF.DFS.ZeroShadow); + Value *Ne = IRB.CreateICmpNE(V, DFSF.DFS.ZeroShadow); BranchInst *BI = cast(SplitBlockAndInsertIfThen( Ne, Pos, /*Unreachable=*/false, ColdCallWeights)); IRBuilder<> ThenIRB(BI); @@ -878,7 +876,7 @@ Value *DFSanFunction::getShadow(Value *V) { break; } } - NonZeroChecks.insert(Shadow); + NonZeroChecks.push_back(Shadow); } else { Shadow = DFS.ZeroShadow; } @@ -1138,7 +1136,7 @@ void DFSanVisitor::visitLoadInst(LoadInst &LI) { Shadow = DFSF.combineShadows(Shadow, PtrShadow, &LI); } if (Shadow != DFSF.DFS.ZeroShadow) - DFSF.NonZeroChecks.insert(Shadow); + DFSF.NonZeroChecks.push_back(Shadow); DFSF.setShadow(&LI, Shadow); } @@ -1480,7 +1478,7 @@ void DFSanVisitor::visitCallSite(CallSite CS) { LoadInst *LI = NextIRB.CreateLoad(DFSF.getRetvalTLS()); DFSF.SkipInsts.insert(LI); DFSF.setShadow(CS.getInstruction(), LI); - DFSF.NonZeroChecks.insert(LI); + DFSF.NonZeroChecks.push_back(LI); } } @@ -1534,7 +1532,7 @@ void DFSanVisitor::visitCallSite(CallSite CS) { ExtractValueInst::Create(NewCS.getInstruction(), 1, "", Next); DFSF.SkipInsts.insert(ExShadow); DFSF.setShadow(ExVal, ExShadow); - DFSF.NonZeroChecks.insert(ExShadow); + DFSF.NonZeroChecks.push_back(ExShadow); CS.getInstruction()->replaceAllUsesWith(ExVal); } diff --git a/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll b/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll index 6bcd5c5f0c1..eb28c2c5245 100644 --- a/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll +++ b/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll @@ -3,13 +3,16 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 declare i32 @g() -; CHECK: define { i32, i16 } @"dfs$f"(i32, i16) -define i32 @f(i32) { +; CHECK: define { i32, i16 } @"dfs$f"(i32, i32, i16, i16) +define i32 @f(i32, i32) { ; CHECK: [[LOCALLABELALLOCA:%.*]] = alloca i16 - ; CHECK: [[ARGCMP:%.*]] = icmp ne i16 %1, 0 - ; CHECK: br i1 [[ARGCMP]] %i = alloca i32 - store i32 %0, i32* %i + ; CHECK: [[ARGCMP1:%.*]] = icmp ne i16 %3, 0 + ; CHECK: br i1 [[ARGCMP1]] + ; CHECK: [[ARGCMP2:%.*]] = icmp ne i16 %2, 0 + ; CHECK: br i1 [[ARGCMP2]] + %x = add i32 %0, %1 + store i32 %x, i32* %i ; CHECK: [[CALL:%.*]] = call { i32, i16 } @"dfs$g"() ; CHECK: [[CALLLABEL:%.*]] = extractvalue { i32, i16 } [[CALL]], 1 ; CHECK: [[CALLCMP:%.*]] = icmp ne i16 [[CALLLABEL]], 0