Teach debug-info generation that SourceManager::getPresumedLoc() can
produce an invalid location even when given a valid location, if the file system has changed underneath us. Recovery more gracefully. llvm-svn: 118834
This commit is contained in:
parent
c043de11e8
commit
ad3832e213
|
@ -153,13 +153,14 @@ CGDebugInfo::getClassName(RecordDecl *RD) {
|
|||
|
||||
/// getOrCreateFile - Get the file debug info descriptor for the input location.
|
||||
llvm::DIFile CGDebugInfo::getOrCreateFile(SourceLocation Loc) {
|
||||
if (!Loc.isValid())
|
||||
// If Location is not valid then use main input file.
|
||||
return DebugFactory.CreateFile(TheCU.getFilename(), TheCU.getDirectory(),
|
||||
TheCU);
|
||||
SourceManager &SM = CGM.getContext().getSourceManager();
|
||||
PresumedLoc PLoc = SM.getPresumedLoc(Loc);
|
||||
|
||||
if (PLoc.isInvalid())
|
||||
// If the location is not valid then use main input file.
|
||||
return DebugFactory.CreateFile(TheCU.getFilename(), TheCU.getDirectory(),
|
||||
TheCU);
|
||||
|
||||
// Cache the results.
|
||||
const char *fname = PLoc.getFilename();
|
||||
llvm::DenseMap<const char *, llvm::WeakVH>::iterator it =
|
||||
|
@ -191,7 +192,7 @@ unsigned CGDebugInfo::getLineNumber(SourceLocation Loc) {
|
|||
assert (CurLoc.isValid() && "Invalid current location!");
|
||||
SourceManager &SM = CGM.getContext().getSourceManager();
|
||||
PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc);
|
||||
return PLoc.getLine();
|
||||
return PLoc.isValid()? PLoc.getLine() : 0;
|
||||
}
|
||||
|
||||
/// getColumnNumber - Get column number for the location. If location is
|
||||
|
@ -200,7 +201,7 @@ unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc) {
|
|||
assert (CurLoc.isValid() && "Invalid current location!");
|
||||
SourceManager &SM = CGM.getContext().getSourceManager();
|
||||
PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc);
|
||||
return PLoc.getColumn();
|
||||
return PLoc.isValid()? PLoc.getColumn() : 0;
|
||||
}
|
||||
|
||||
llvm::StringRef CGDebugInfo::getCurrentDirname() {
|
||||
|
@ -1653,7 +1654,8 @@ void CGDebugInfo::UpdateLineDirectiveRegion(CGBuilderTy &Builder) {
|
|||
PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc);
|
||||
PresumedLoc PPLoc = SM.getPresumedLoc(PrevLoc);
|
||||
|
||||
if (!strcmp(PPLoc.getFilename(), PCLoc.getFilename()))
|
||||
if (PCLoc.isInvalid() || PPLoc.isInvalid() ||
|
||||
!strcmp(PPLoc.getFilename(), PCLoc.getFilename()))
|
||||
return;
|
||||
|
||||
// If #line directive stack is empty then we are entering a new scope.
|
||||
|
|
Loading…
Reference in New Issue