Untangle filename/dirname confusion. Store constructed strings on the side. Avoid use of Path.makeAbsolute().

DW_TAG_compile_unit uses two attributes DW_AT_name and DW_AT_comp_dir. Their expected values are:

$ clang foo.c -g
  DW_AT_name - foo.c
  DW_AT_comp_dir - `pwd`

$ clang one/two/foo.c -g
  DW_AT_name - one/two/foo.c
  DW_AT_comp_dir - `pwd`

$ clang /tmp/one/foo.c -g
  DW_AT_name - /tmp/one/foo.c
  DW_AT_comp_dir - empty

llvm-svn: 109303
This commit is contained in:
Devang Patel 2010-07-24 00:59:16 +00:00
parent 498877d055
commit 268ad093a7
2 changed files with 40 additions and 14 deletions

View File

@ -148,13 +148,8 @@ llvm::DIFile CGDebugInfo::getOrCreateFile(SourceLocation Loc) {
return llvm::DIFile(cast<llvm::MDNode>(it->second));
}
// FIXME: We shouldn't even need to call 'makeAbsolute()' in the cases
// where we can consult the FileEntry.
llvm::sys::Path AbsFileName(PLoc.getFilename());
AbsFileName.makeAbsolute();
llvm::DIFile F = DebugFactory.CreateFile(AbsFileName.getLast(),
AbsFileName.getDirname(), TheCU);
llvm::DIFile F = DebugFactory.CreateFile(PLoc.getFilename(),
getCurrentDirname(), TheCU);
DIFileCache[fname] = F;
return F;
@ -179,6 +174,25 @@ unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc) {
return PLoc.getColumn();
}
llvm::StringRef CGDebugInfo::getCurrentDirname() {
if (!CWDName.empty())
return CWDName;
char *CompDirnamePtr = NULL;
llvm::sys::Path CWD = llvm::sys::Path::GetCurrentDirectory();
CompDirnamePtr = DebugInfoNames.Allocate<char>(CWD.size());
memcpy(CompDirnamePtr, CWD.c_str(), CWD.size());
return CWDName = llvm::StringRef(CompDirnamePtr, CWD.size());
}
/// getCompDirname - AT_comp_dir is empty if filename is absulte otherwise
/// it points to compilation directory.
llvm::StringRef CGDebugInfo::getCompDirname(llvm::StringRef Filename) {
llvm::sys::Path FilePath(Filename);
if (FilePath.isAbsolute())
return llvm::StringRef();
return getCurrentDirname();
}
/// CreateCompileUnit - Create new compile unit.
void CGDebugInfo::CreateCompileUnit() {
@ -188,19 +202,22 @@ void CGDebugInfo::CreateCompileUnit() {
if (MainFileName.empty())
MainFileName = "<unknown>";
llvm::sys::Path AbsFileName(MainFileName);
AbsFileName.makeAbsolute();
// The main file name provided via the "-main-file-name" option contains just
// the file name itself with no path information. This file name may have had
// a relative path, so we look into the actual file entry for the main
// file to determine the real absolute path for the file.
std::string MainFileDir;
if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID()))
if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) {
MainFileDir = MainFile->getDir()->getName();
else
MainFileDir = AbsFileName.getDirname();
if (MainFileDir != ".")
MainFileName = MainFileDir + "/" + MainFileName;
}
// Save filename string.
char *FilenamePtr = DebugInfoNames.Allocate<char>(MainFileName.length());
memcpy(FilenamePtr, MainFileName.c_str(), MainFileName.length());
llvm::StringRef Filename(FilenamePtr, MainFileName.length());
unsigned LangTag;
const LangOptions &LO = CGM.getLangOptions();
if (LO.CPlusPlus) {
@ -229,7 +246,8 @@ void CGDebugInfo::CreateCompileUnit() {
// Create new compile unit.
TheCU = DebugFactory.CreateCompileUnit(
LangTag, AbsFileName.getLast(), MainFileDir, Producer, true,
LangTag, Filename, getCompDirname(Filename),
Producer, true,
LO.Optimize, CGM.getCodeGenOpts().DwarfDebugFlags, RuntimeVers);
}

View File

@ -70,6 +70,7 @@ class CGDebugInfo {
/// DebugInfoNames - This is a storage for names that are
/// constructed on demand. For example, C++ destructors, C++ operators etc..
llvm::BumpPtrAllocator DebugInfoNames;
llvm::StringRef CWDName;
llvm::DenseMap<const char *, llvm::WeakVH> DIFileCache;
llvm::DenseMap<const FunctionDecl *, llvm::WeakVH> SPCache;
@ -198,6 +199,13 @@ private:
llvm::DIDescriptor getContextDescriptor(const Decl *Decl,
llvm::DIDescriptor &CU);
/// getCompDirname - AT_comp_dir is empty if filename is absulte otherwise
/// it points to compilation directory.
llvm::StringRef getCompDirname(llvm::StringRef Filename);
/// getCurrentDirname - Return current directory name.
llvm::StringRef getCurrentDirname();
/// CreateCompileUnit - Create new compile unit.
void CreateCompileUnit();