forked from OSchip/llvm-project
Fix MSAN failure on Function destruction
Summary: When Function is destroyed, GlobalValue base class is destroyed, then Value destructor would call use_empty, which ultimately attempts to downcast 'this' to GlobalValue. This is UB, and is caught my MSAN as accessing uninitialized memory. Call materialized_use_empty, which doesn't call assertModuleIsMaterializedImpl(). Reviewers: eugenis Reviewed By: eugenis Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D74161 Patch by Antonio Maiorano.
This commit is contained in:
parent
ac8a12c874
commit
7dd2810907
|
@ -83,13 +83,17 @@ Value::~Value() {
|
|||
// reference and something is wrong. This code is here to print out where
|
||||
// the value is still being referenced.
|
||||
//
|
||||
if (!use_empty()) {
|
||||
// Note that use_empty() cannot be called here, as it eventually downcasts
|
||||
// 'this' to GlobalValue (derived class of Value), but GlobalValue has already
|
||||
// been destructed, so accessing it is UB.
|
||||
//
|
||||
if (!materialized_use_empty()) {
|
||||
dbgs() << "While deleting: " << *VTy << " %" << getName() << "\n";
|
||||
for (auto *U : users())
|
||||
dbgs() << "Use still stuck around after Def is destroyed:" << *U << "\n";
|
||||
}
|
||||
#endif
|
||||
assert(use_empty() && "Uses remain when a value is destroyed!");
|
||||
assert(materialized_use_empty() && "Uses remain when a value is destroyed!");
|
||||
|
||||
// If this value is named, destroy the name. This should not be in a symtab
|
||||
// at this point.
|
||||
|
|
Loading…
Reference in New Issue