diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 23 | ||||
| -rw-r--r-- | clang/test/CodeGen/2009-01-21-invalid-debug-info.m | 16 | 
2 files changed, 29 insertions, 10 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index d3fee11e467..e0a52d61844 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -47,21 +47,24 @@ void CGDebugInfo::setLocation(SourceLocation Loc) {  /// getOrCreateCompileUnit - Get the compile unit from the cache or create a new  /// one if necessary. This returns null for invalid source locations.  llvm::DICompileUnit CGDebugInfo::getOrCreateCompileUnit(SourceLocation Loc) { -  if (Loc.isInvalid()) -    return llvm::DICompileUnit(); - -  SourceManager &SM = M->getContext().getSourceManager(); -  Loc = SM.getInstantiationLoc(Loc); -  const FileEntry *FE = SM.getFileEntryForID(SM.getFileID(Loc)); -  if (FE == 0) return llvm::DICompileUnit(); -     +  // FIXME: Until we do a complete job of emitting debug information, +  // we need to support making dummy compile units so that we generate +  // "well formed" debug info. +  const FileEntry *FE = 0; + +  if (Loc.isValid()) { +    SourceManager &SM = M->getContext().getSourceManager(); +    Loc = SM.getInstantiationLoc(Loc); +    FE = SM.getFileEntryForID(SM.getFileID(Loc)); +  } +       // See if this compile unit has been used before.    llvm::DICompileUnit &Unit = CompileUnitCache[FE];    if (!Unit.isNull()) return Unit;    // Get source file information. -  const char *FileName = FE->getName(); -  const char *DirName = FE->getDir()->getName(); +  const char *FileName = FE ? FE->getName() : "<unknown>"; +  const char *DirName = FE ? FE->getDir()->getName() : "";    // Create new compile unit.    // FIXME: Handle other language IDs as well. diff --git a/clang/test/CodeGen/2009-01-21-invalid-debug-info.m b/clang/test/CodeGen/2009-01-21-invalid-debug-info.m new file mode 100644 index 00000000000..509a6fb4ed4 --- /dev/null +++ b/clang/test/CodeGen/2009-01-21-invalid-debug-info.m @@ -0,0 +1,16 @@ +// RUN: clang -S -g -o %t.s %s + +// FIXME: This test case can be removed at some point (since it will +// no longer effectively test anything). The reason it was causing +// trouble was the synthesized self decl in im1 was causing the debug +// info for I1* to be generated, but referring to an invalid compile +// unit. This was later referred to by f1 and created ill formed debug +// information. + +@interface I1 @end + +@implementation I1 +-im0 {} +@end + +I1 *f1(void) { return 0; }  | 

