================
@@ -573,14 +574,29 @@ static void dropDeadSymbols(Module &Mod, const
GVSummaryMapTy &DefinedGlobals,
convertToDeclaration(GV);
}
+ Triple TT(Mod.getTargetTriple());
+ std::unique_ptr<CXXABI> ABI = CXXABI::Create(TT);
+
// Now that all dead bodies have been dropped, delete the actual objects
// themselves when possible.
for (GlobalValue *GV : DeadGVs) {
GV->removeDeadConstantUsers();
- // Might reference something defined in native object (i.e. dropped a
- // non-prevailing IR def, but we need to keep the declaration).
- if (GV->use_empty())
+
+ // The RTTI data consists of both type information and the type name
string.
+ // Although they are considered dead, there are still users that reference
them.
+ // For example, the type information might be used by a vtable, and the
type name
+ // string might be used by the type info.
+ // Therefore, we need to replace these uses to null pointer before erasing
them.
+ if (ABI && (ABI->isTypeInfo(GV->getName()) ||
+ ABI->isTypeName(GV->getName()))) {
+ GV->replaceAllUsesWith(
----------------
teresajohnson wrote:
What happens without this change? Can it just be done unconditionally?
https://github.com/llvm/llvm-project/pull/126336
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits