mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 22:04:55 +00:00
msan] Add compile-time checks for missing origins.
This change makes MemorySanitizer instrumentation a bit more strict about instructions that have no origin id assigned to them. This would have caught the bug that was fixed in r222918. This is re-commit of r222997, reverted in r223211, with 3 more missing origins added. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223236 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
10e28ca6b1
commit
78d5d1ea1b
@ -921,6 +921,8 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
Value *OriginPtr =
|
||||
getOriginPtrForArgument(&FArg, EntryIRB, ArgOffset);
|
||||
setOrigin(A, EntryIRB.CreateLoad(OriginPtr));
|
||||
} else {
|
||||
setOrigin(A, getCleanOrigin());
|
||||
}
|
||||
}
|
||||
ArgOffset += RoundUpToAlignment(Size, kShadowTLSAlignment);
|
||||
@ -940,15 +942,13 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
/// \brief Get the origin for a value.
|
||||
Value *getOrigin(Value *V) {
|
||||
if (!MS.TrackOrigins) return nullptr;
|
||||
if (isa<Instruction>(V) || isa<Argument>(V)) {
|
||||
Value *Origin = OriginMap[V];
|
||||
if (!Origin) {
|
||||
DEBUG(dbgs() << "NO ORIGIN: " << *V << "\n");
|
||||
Origin = getCleanOrigin();
|
||||
}
|
||||
return Origin;
|
||||
}
|
||||
return getCleanOrigin();
|
||||
if (!PropagateShadow) return getCleanOrigin();
|
||||
if (isa<Constant>(V)) return getCleanOrigin();
|
||||
assert((isa<Instruction>(V) || isa<Argument>(V)) &&
|
||||
"Unexpected value type in getOrigin()");
|
||||
Value *Origin = OriginMap[V];
|
||||
assert(Origin && "Missing origin");
|
||||
return Origin;
|
||||
}
|
||||
|
||||
/// \brief Get the origin for i-th argument of the instruction I.
|
||||
@ -1088,6 +1088,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
IRB.CreateStore(getCleanShadow(&I), ShadowPtr);
|
||||
|
||||
setShadow(&I, getCleanShadow(&I));
|
||||
setOrigin(&I, getCleanOrigin());
|
||||
}
|
||||
|
||||
void visitAtomicRMWInst(AtomicRMWInst &I) {
|
||||
@ -1896,6 +1897,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
setOrigin(&I, getOrigin(CopyOp));
|
||||
} else {
|
||||
setShadow(&I, getCleanShadow(&I));
|
||||
setOrigin(&I, getCleanOrigin());
|
||||
}
|
||||
}
|
||||
|
||||
@ -2360,6 +2362,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
IRBuilder<> IRB(&I);
|
||||
if (!PropagateShadow) {
|
||||
setShadow(&I, getCleanShadow(&I));
|
||||
setOrigin(&I, getCleanOrigin());
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2373,6 +2376,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
|
||||
void visitAllocaInst(AllocaInst &I) {
|
||||
setShadow(&I, getCleanShadow(&I));
|
||||
setOrigin(&I, getCleanOrigin());
|
||||
IRBuilder<> IRB(I.getNextNode());
|
||||
uint64_t Size = MS.DL->getTypeAllocSize(I.getAllocatedType());
|
||||
if (PoisonStack && ClPoisonStackWithCall) {
|
||||
@ -2386,7 +2390,6 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
}
|
||||
|
||||
if (PoisonStack && MS.TrackOrigins) {
|
||||
setOrigin(&I, getCleanOrigin());
|
||||
SmallString<2048> StackDescriptionStorage;
|
||||
raw_svector_ostream StackDescription(StackDescriptionStorage);
|
||||
// We create a string with a description of the stack allocation and
|
||||
|
Loading…
Reference in New Issue
Block a user