forked from OSchip/llvm-project
Include debug info for types referenced only via explicit cast expressions.
Most of the debug info emission is powered essentially from function definitions - if we emit the definition of a function, we emit the types of its parameters, the members of those types, and so on and so forth. For types that aren't referenced even indirectly due to this - because they only appear in temporary expressions, not in any named variable, we need to explicitly emit/add them as is done here. This is not the only case of such code, and we might want to consider handling "void func(void*); ... func(new T());" (currently debug info for T is not emitted) at some point, though GCC doesn't. There's a much broader solution to these issues, but it's a lot of work for possibly marginal gain (but might help us improve the default -fno-standalone-debug behavior to be even more aggressive in some places). See the original review thread for more details. Patch by jyoti allur (jyoti.yalamanchili@gmail.com)! Differential Revision: http://reviews.llvm.org/D2498 llvm-svn: 218390
This commit is contained in:
parent
0e92815e94
commit
66088d5917
|
@ -3347,3 +3347,11 @@ void CGDebugInfo::finalize() {
|
||||||
|
|
||||||
DBuilder.finalize();
|
DBuilder.finalize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CGDebugInfo::EmitExplicitCastType(QualType Ty) {
|
||||||
|
if (CGM.getCodeGenOpts().getDebugInfo() < CodeGenOptions::LimitedDebugInfo)
|
||||||
|
return;
|
||||||
|
llvm::DIType DieTy = getOrCreateType(Ty, getOrCreateMainFile());
|
||||||
|
// Don't ignore in case of explicit cast where it is referenced indirectly.
|
||||||
|
DBuilder.retainType(DieTy);
|
||||||
|
}
|
||||||
|
|
|
@ -283,6 +283,9 @@ public:
|
||||||
/// \brief - Emit C++ using directive.
|
/// \brief - Emit C++ using directive.
|
||||||
void EmitUsingDirective(const UsingDirectiveDecl &UD);
|
void EmitUsingDirective(const UsingDirectiveDecl &UD);
|
||||||
|
|
||||||
|
/// EmitExplicitCastType - Emit the type explicitly casted to.
|
||||||
|
void EmitExplicitCastType(QualType Ty);
|
||||||
|
|
||||||
/// \brief - Emit C++ using declaration.
|
/// \brief - Emit C++ using declaration.
|
||||||
void EmitUsingDecl(const UsingDecl &UD);
|
void EmitUsingDecl(const UsingDecl &UD);
|
||||||
|
|
||||||
|
|
|
@ -274,6 +274,10 @@ public:
|
||||||
Value *VisitExplicitCastExpr(ExplicitCastExpr *E) {
|
Value *VisitExplicitCastExpr(ExplicitCastExpr *E) {
|
||||||
if (E->getType()->isVariablyModifiedType())
|
if (E->getType()->isVariablyModifiedType())
|
||||||
CGF.EmitVariablyModifiedType(E->getType());
|
CGF.EmitVariablyModifiedType(E->getType());
|
||||||
|
|
||||||
|
if (CGDebugInfo *DI = CGF.getDebugInfo())
|
||||||
|
DI->EmitExplicitCastType(E->getType());
|
||||||
|
|
||||||
return VisitCastExpr(E);
|
return VisitCastExpr(E);
|
||||||
}
|
}
|
||||||
Value *VisitCastExpr(CastExpr *E);
|
Value *VisitCastExpr(CastExpr *E);
|
||||||
|
|
Loading…
Reference in New Issue