forked from OSchip/llvm-project
parent
7b0a5fd2a5
commit
6014edd117
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
Loading…
Reference in New Issue