Handle corner case where clang-cc is invoked directly to compile preprocessed source file without -main-file-name. In this case, CDDebugInfo is not able identify correct main source file becase SM.isFromMainFile() returns true for locations from header files as well as locations from main source file.

This patch takes conservative approach by not emitting more then one compile unit with isMain bit set.

llvm-svn: 69902
This commit is contained in:
Devang Patel 2009-04-23 18:09:16 +00:00
parent 466af3eb46
commit a6acb390e7
3 changed files with 35 additions and 8 deletions

View File

@ -34,7 +34,7 @@ using namespace clang;
using namespace clang::CodeGen;
CGDebugInfo::CGDebugInfo(CodeGenModule *m)
: M(m), DebugFactory(M->getModule()) {
: M(m), isMainCompileUnitCreated(false), DebugFactory(M->getModule()) {
}
CGDebugInfo::~CGDebugInfo() {
@ -71,16 +71,22 @@ llvm::DICompileUnit CGDebugInfo::getOrCreateCompileUnit(SourceLocation Loc) {
AbsFileName = tmp;
}
// See if thie compile unit is represnting main source file.
// See if thie compile unit is representing main source file. Each source
// file has corresponding compile unit. There is only one main source
// file at a time.
bool isMain = false;
const LangOptions &LO = M->getLangOptions();
const char *MainFileName = LO.getMainFileName();
if (MainFileName) {
if (!strcmp(AbsFileName.getLast().c_str(), MainFileName))
isMain = true;
} else {
if (Loc.isValid() && SM.isFromMainFile(Loc))
isMain = true;
if (isMainCompileUnitCreated == false) {
if (MainFileName) {
if (!strcmp(AbsFileName.getLast().c_str(), MainFileName))
isMain = true;
} else {
if (Loc.isValid() && SM.isFromMainFile(Loc))
isMain = true;
}
if (isMain)
isMainCompileUnitCreated = true;
}
unsigned LangTag;

View File

@ -34,6 +34,7 @@ namespace CodeGen {
/// the backend.
class CGDebugInfo {
CodeGenModule *M;
bool isMainCompileUnitCreated;
llvm::DIFactory DebugFactory;
SourceLocation CurLoc, PrevLoc;

View File

@ -0,0 +1,20 @@
// RUN: clang-cc -g -o %t %s -emit-llvm-bc && llc %t -f -o %t.s
# 1 "a.c"
# 1 "a.c" 1
# 1 "<built-in>" 1
# 103 "<built-in>"
# 103 "<command line>" 1
# 1 "/private/tmp/a.h" 1
int bar;
# 105 "<command line>" 2
# 105 "<built-in>" 2
# 1 "a.c" 2
# 1 "/private/tmp/a.h" 1
int bar;
# 2 "a.c" 2
int main() {
bar = 0;
return 0;
}