diff options
author | Vitaly Buka <vitalybuka@google.com> | 2024-05-01 14:47:00 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-01 14:47:00 -0700 |
commit | a2be1b8d03320908c4d4b42e5bd8b7569b1f9aae (patch) | |
tree | a9fa8c4917b33716310138bc44f093734d6f21fe | |
parent | 0f8d97cccc03246f6b922696b35805c77e022af7 (diff) |
[msan] Don't modify CFG iterating it (#90691)
In rare cases `SplitBlockAndInsertSimpleForLoop` in `paintOrigin`
crashes outsize iterators.
Somehow existing `SplitBlockAndInsertIfThen` do not invalidate
iterators.
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp index cc2295c44023..2b504b893ddb 100644 --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -1135,6 +1135,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { std::unique_ptr<VarArgHelper> VAHelper; const TargetLibraryInfo *TLI; Instruction *FnPrologueEnd; + SmallVector<Instruction *, 16> Instructions; // The following flags disable parts of MSan instrumentation based on // exclusion list contents and command-line options. @@ -1520,6 +1521,11 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { for (BasicBlock *BB : depth_first(FnPrologueEnd->getParent())) visit(*BB); + // `visit` above only collects instructions. Process them after iterating + // CFG to avoid requirement on CFG transformations. + for (Instruction *I : Instructions) + InstVisitor<MemorySanitizerVisitor>::visit(*I); + // Finalize PHI nodes. for (PHINode *PN : ShadowPHINodes) { PHINode *PNS = cast<PHINode>(getShadow(PN)); @@ -2196,7 +2202,8 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { setOrigin(&I, getCleanOrigin()); return; } - InstVisitor<MemorySanitizerVisitor>::visit(I); + + Instructions.push_back(&I); } /// Instrument LoadInst |