Revert "Avoid emitting redundant or unusable directories in DIFile metadata entries."
This reverts commit r348154 and follow-up commits r348211 and r3248213. Reason: the original commit broke compiler-rt tests and a follow-up fix (r348203) broke our integrate and was reverted. llvm-svn: 348280
This commit is contained in:
parent
449a7f0dbb
commit
660d233ea5
@ -181,7 +181,8 @@ void CGDebugInfo::setLocation(SourceLocation Loc) {
|
||||
SourceManager &SM = CGM.getContext().getSourceManager();
|
||||
auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
|
||||
PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc);
|
||||
if (PCLoc.isInvalid() || Scope->getFile() == getOrCreateFile(CurLoc))
|
||||
|
||||
if (PCLoc.isInvalid() || Scope->getFilename() == PCLoc.getFilename())
|
||||
return;
|
||||
|
||||
if (auto *LBF = dyn_cast<llvm::DILexicalBlockFile>(Scope)) {
|
||||
@ -409,13 +410,13 @@ llvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) {
|
||||
SourceManager &SM = CGM.getContext().getSourceManager();
|
||||
PresumedLoc PLoc = SM.getPresumedLoc(Loc);
|
||||
|
||||
StringRef FileName = PLoc.getFilename();
|
||||
if (PLoc.isInvalid() || FileName.empty())
|
||||
if (PLoc.isInvalid() || StringRef(PLoc.getFilename()).empty())
|
||||
// If the location is not valid then use main input file.
|
||||
return getOrCreateMainFile();
|
||||
|
||||
// Cache the results.
|
||||
auto It = DIFileCache.find(FileName.data());
|
||||
const char *fname = PLoc.getFilename();
|
||||
auto It = DIFileCache.find(fname);
|
||||
|
||||
if (It != DIFileCache.end()) {
|
||||
// Verify that the information still exists.
|
||||
@ -430,41 +431,11 @@ llvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) {
|
||||
if (CSKind)
|
||||
CSInfo.emplace(*CSKind, Checksum);
|
||||
|
||||
StringRef Dir;
|
||||
StringRef File;
|
||||
std::string RemappedFile = remapDIPath(FileName);
|
||||
std::string CurDir = remapDIPath(getCurrentDirname());
|
||||
SmallString<128> DirBuf;
|
||||
SmallString<128> FileBuf;
|
||||
if (llvm::sys::path::is_absolute(RemappedFile)) {
|
||||
// Strip the common prefix (if it is more than just "/") from current
|
||||
// directory and FileName for a more space-efficient encoding.
|
||||
auto FileIt = llvm::sys::path::begin(RemappedFile);
|
||||
auto FileE = llvm::sys::path::end(RemappedFile);
|
||||
auto CurDirIt = llvm::sys::path::begin(CurDir);
|
||||
auto CurDirE = llvm::sys::path::end(CurDir);
|
||||
for (; CurDirIt != CurDirE && *CurDirIt == *FileIt; ++CurDirIt, ++FileIt)
|
||||
llvm::sys::path::append(DirBuf, *CurDirIt);
|
||||
if (std::distance(llvm::sys::path::begin(CurDir), CurDirIt) == 1) {
|
||||
// The common prefix only the root; stripping it would cause
|
||||
// LLVM diagnostic locations to be more confusing.
|
||||
Dir = {};
|
||||
File = RemappedFile;
|
||||
} else {
|
||||
for (; FileIt != FileE; ++FileIt)
|
||||
llvm::sys::path::append(FileBuf, *FileIt);
|
||||
Dir = DirBuf;
|
||||
File = FileBuf;
|
||||
}
|
||||
} else {
|
||||
Dir = CurDir;
|
||||
File = RemappedFile;
|
||||
}
|
||||
llvm::DIFile *F =
|
||||
DBuilder.createFile(File, Dir, CSInfo,
|
||||
getSource(SM, SM.getFileID(Loc)));
|
||||
llvm::DIFile *F = DBuilder.createFile(
|
||||
remapDIPath(PLoc.getFilename()), remapDIPath(getCurrentDirname()), CSInfo,
|
||||
getSource(SM, SM.getFileID(Loc)));
|
||||
|
||||
DIFileCache[FileName.data()].reset(F);
|
||||
DIFileCache[fname].reset(F);
|
||||
return F;
|
||||
}
|
||||
|
||||
|
||||
@ -549,16 +549,12 @@ const FullSourceLoc BackendConsumer::getBestLocationFromDebugLoc(
|
||||
SourceLocation DILoc;
|
||||
|
||||
if (D.isLocationAvailable()) {
|
||||
D.getLocation(Filename, Line, Column);
|
||||
if (Line > 0) {
|
||||
const FileEntry *FE = FileMgr.getFile(Filename);
|
||||
if (!FE)
|
||||
FE = FileMgr.getFile(D.getAbsolutePath());
|
||||
if (FE) {
|
||||
// If -gcolumn-info was not used, Column will be 0. This upsets the
|
||||
// source manager, so pass 1 if Column is not set.
|
||||
DILoc = SourceMgr.translateFileLineCol(FE, Line, Column ? Column : 1);
|
||||
}
|
||||
D.getLocation(&Filename, &Line, &Column);
|
||||
const FileEntry *FE = FileMgr.getFile(Filename);
|
||||
if (FE && Line > 0) {
|
||||
// If -gcolumn-info was not used, Column will be 0. This upsets the
|
||||
// source manager, so pass 1 if Column is not set.
|
||||
DILoc = SourceMgr.translateFileLineCol(FE, Line, Column ? Column : 1);
|
||||
}
|
||||
BadDebugInfo = DILoc.isInvalid();
|
||||
}
|
||||
|
||||
@ -1,15 +0,0 @@
|
||||
// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple \
|
||||
// RUN: %s -emit-llvm -o - | FileCheck %s
|
||||
|
||||
// RUN: cp %s %t.c
|
||||
// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple \
|
||||
// RUN: %t.c -emit-llvm -o - | FileCheck %s --check-prefix=INTREE
|
||||
void foo() {}
|
||||
|
||||
// Since %s is an absolute path, directory should be a nonempty
|
||||
// prefix, but the CodeGen part should be part of the filename.
|
||||
|
||||
// CHECK: DIFile(filename: "{{.*}}CodeGen{{.*}}debug-info-abspath.c"
|
||||
// CHECK-SAME: directory: "{{.+}}")
|
||||
|
||||
// INTREE: DIFile({{.*}}directory: "{{.+}}CodeGen{{.*}}")
|
||||
@ -17,24 +17,18 @@ void test_rewrite_includes() {
|
||||
}
|
||||
|
||||
// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "/var/empty{{/|\\5C}}<stdin>"
|
||||
// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "/var/empty{{[/\\]}}{{.*}}",
|
||||
// Dir should always be empty, but on Windows we can't recognize /var
|
||||
// as being an absolute path.
|
||||
// CHECK-NO-MAIN-FILE-NAME-SAME: directory: "{{()|(.*:.*)}}")
|
||||
// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "/var/empty{{[/\\]}}Inputs/stdio.h",
|
||||
// CHECK-NO-MAIN-FILE-NAME-SAME: directory: "{{()|(.*:.*)}}")
|
||||
// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "/var/empty{{[/\\]}}{{.*}}"
|
||||
// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "/var/empty{{[/\\]}}Inputs/stdio.h"
|
||||
// CHECK-NO-MAIN-FILE-NAME-NOT: !DIFile(filename:
|
||||
|
||||
// CHECK-EVIL: !DIFile(filename: "/var=empty{{[/\\]}}{{.*}}"
|
||||
// CHECK-EVIL: !DIFile(filename: "/var=empty{{[/\\]}}{{.*}}Inputs/stdio.h",
|
||||
// CHECK-EVIL-SAME: directory: "{{()|(.*:.*)}}")
|
||||
// CHECK-EVIL: !DIFile(filename: "/var=empty{{[/\\]}}Inputs/stdio.h"
|
||||
// CHECK-EVIL-NOT: !DIFile(filename:
|
||||
|
||||
// CHECK: !DIFile(filename: "/var/empty{{[/\\]}}{{.*}}"
|
||||
// CHECK: !DIFile(filename: "/var/empty{{[/\\]}}{{.*}}Inputs/stdio.h",
|
||||
// CHECK-SAME: directory: "{{()|(.*:.*)}}")
|
||||
// CHECK: !DIFile(filename: "/var/empty{{[/\\]}}Inputs/stdio.h"
|
||||
// CHECK-NOT: !DIFile(filename:
|
||||
|
||||
// CHECK-COMPILATION-DIR: !DIFile(filename: "{{.*}}", directory: "/var/empty")
|
||||
// CHECK-COMPILATION-DIR: !DIFile(filename: "{{.*}}Inputs/stdio.h", directory: "/var/empty")
|
||||
// CHECK-COMPILATION-DIR: !DIFile(filename: "/var/empty{{[/\\]}}{{.*}}", directory: "/var/empty")
|
||||
// CHECK-COMPILATION-DIR: !DIFile(filename: "/var/empty{{[/\\]}}Inputs/stdio.h", directory: "/var/empty")
|
||||
// CHECK-COMPILATION-DIR-NOT: !DIFile(filename:
|
||||
|
||||
@ -20,6 +20,4 @@
|
||||
@import DebugObjC;
|
||||
#endif
|
||||
|
||||
// Dir should always be empty, but on Windows we can't recognize /var
|
||||
// as being an absolute path.
|
||||
// CHECK: !DIFile(filename: "/OVERRIDE/DebugObjC.h", directory: "{{()|(.*:.*)}}")
|
||||
// CHECK: !DIFile({{.*}}"/OVERRIDE/DebugObjC.h"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user