<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">I'll take a look right away. Thanks for letting me know!<div class=""><br class=""></div><div class="">-- adrian<br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Dec 3, 2018, at 1:26 PM, Vlad Tsyrklevich <<a href="mailto:vlad@tsyrklevich.net" class="">vlad@tsyrklevich.net</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">This change appears to have broken a number of compiler-rt coverage tests, e.g. <a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/17934/steps/test%20standalone%20compiler-rt/logs/stdio" class="">in this run</a>. The source of the error appears to be that llvm-cov is now trying to use a relative path that's not relative to the directory it's in, though I'm not familiar enough with debuginfo/coverage to understand what an appropriate fix is. I've not yet reverted these changes to give you a chance to take a look.</div><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Mon, Dec 3, 2018 at 9:58 AM Adrian Prantl via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: adrian<br class="">
Date: Mon Dec  3 09:55:27 2018<br class="">
New Revision: 348154<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=348154&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=348154&view=rev</a><br class="">
Log:<br class="">
Avoid emitting redundant or unusable directories in DIFile metadata entries.<br class="">
<br class="">
As discussed on llvm-dev recently, Clang currently emits redundant<br class="">
directories in DIFile entries, such as<br class="">
<br class="">
  .file      1 "/Volumes/Data/llvm" "/Volumes/Data/llvm/tools/clang/test/CodeGen/debug-info-abspath.c"<br class="">
<br class="">
This patch looks at any common prefix between the compilation<br class="">
directory and the (absolute) file path and strips the redundant<br class="">
part. More importantly it leaves the compilation directory empty if<br class="">
the two paths have no common prefix.<br class="">
<br class="">
After this patch the above entry is (assuming a compilation dir of "/Volumes/Data/llvm/_build"):<br class="">
<br class="">
  .file 1 "/Volumes/Data/llvm" "tools/clang/test/CodeGen/debug-info-abspath.c"<br class="">
<br class="">
When building the FileCheck binary with debug info, this patch makes<br class="">
the build artifacts ~1kb smaller.<br class="">
<br class="">
Differential Revision: <a href="https://reviews.llvm.org/D55085" rel="noreferrer" target="_blank" class="">https://reviews.llvm.org/D55085</a><br class="">
<br class="">
Added:<br class="">
    cfe/trunk/test/CodeGen/debug-info-abspath.c<br class="">
Modified:<br class="">
    cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br class="">
    cfe/trunk/lib/CodeGen/CodeGenAction.cpp<br class="">
    cfe/trunk/test/CodeGen/debug-prefix-map.c<br class="">
    cfe/trunk/test/Modules/module-debuginfo-prefix.m<br class="">
<br class="">
Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=348154&r1=348153&r2=348154&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=348154&r1=348153&r2=348154&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)<br class="">
+++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon Dec  3 09:55:27 2018<br class="">
@@ -181,8 +181,7 @@ void CGDebugInfo::setLocation(SourceLoca<br class="">
   SourceManager &SM = CGM.getContext().getSourceManager();<br class="">
   auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());<br class="">
   PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc);<br class="">
-<br class="">
-  if (PCLoc.isInvalid() || Scope->getFilename() == PCLoc.getFilename())<br class="">
+  if (PCLoc.isInvalid() || Scope->getFile() == getOrCreateFile(CurLoc))<br class="">
     return;<br class="">
<br class="">
   if (auto *LBF = dyn_cast<llvm::DILexicalBlockFile>(Scope)) {<br class="">
@@ -410,13 +409,13 @@ llvm::DIFile *CGDebugInfo::getOrCreateFi<br class="">
   SourceManager &SM = CGM.getContext().getSourceManager();<br class="">
   PresumedLoc PLoc = SM.getPresumedLoc(Loc);<br class="">
<br class="">
-  if (PLoc.isInvalid() || StringRef(PLoc.getFilename()).empty())<br class="">
+  StringRef FileName = PLoc.getFilename();<br class="">
+  if (PLoc.isInvalid() || FileName.empty())<br class="">
     // If the location is not valid then use main input file.<br class="">
     return getOrCreateMainFile();<br class="">
<br class="">
   // Cache the results.<br class="">
-  const char *fname = PLoc.getFilename();<br class="">
-  auto It = DIFileCache.find(fname);<br class="">
+  auto It = DIFileCache.find(FileName.data());<br class="">
<br class="">
   if (It != DIFileCache.end()) {<br class="">
     // Verify that the information still exists.<br class="">
@@ -431,11 +430,41 @@ llvm::DIFile *CGDebugInfo::getOrCreateFi<br class="">
   if (CSKind)<br class="">
     CSInfo.emplace(*CSKind, Checksum);<br class="">
<br class="">
-  llvm::DIFile *F = DBuilder.createFile(<br class="">
-      remapDIPath(PLoc.getFilename()), remapDIPath(getCurrentDirname()), CSInfo,<br class="">
-      getSource(SM, SM.getFileID(Loc)));<br class="">
+  StringRef Dir;<br class="">
+  StringRef File;<br class="">
+  std::string RemappedFile = remapDIPath(FileName);<br class="">
+  std::string CurDir = remapDIPath(getCurrentDirname());<br class="">
+  SmallString<128> DirBuf;<br class="">
+  SmallString<128> FileBuf;<br class="">
+  if (llvm::sys::path::is_absolute(RemappedFile)) {<br class="">
+    // Strip the common prefix (if it is more than just "/") from current<br class="">
+    // directory and FileName for a more space-efficient encoding.<br class="">
+    auto FileIt = llvm::sys::path::begin(RemappedFile);<br class="">
+    auto FileE = llvm::sys::path::end(RemappedFile);<br class="">
+    auto CurDirIt = llvm::sys::path::begin(CurDir);<br class="">
+    auto CurDirE = llvm::sys::path::end(CurDir);<br class="">
+    for (; CurDirIt != CurDirE && *CurDirIt == *FileIt; ++CurDirIt, ++FileIt)<br class="">
+      llvm::sys::path::append(DirBuf, *CurDirIt);<br class="">
+    if (std::distance(llvm::sys::path::begin(CurDir), CurDirIt) == 1) {<br class="">
+      // The common prefix only the root; stripping it would cause<br class="">
+      // LLVM diagnostic locations to be more confusing.<br class="">
+      Dir = {};<br class="">
+      File = RemappedFile;<br class="">
+    } else {<br class="">
+      for (; FileIt != FileE; ++FileIt)<br class="">
+        llvm::sys::path::append(FileBuf, *FileIt);<br class="">
+      Dir = DirBuf;<br class="">
+      File = FileBuf;<br class="">
+    }<br class="">
+  } else {<br class="">
+    Dir = CurDir;<br class="">
+    File = RemappedFile;<br class="">
+  }<br class="">
+  llvm::DIFile *F =<br class="">
+      DBuilder.createFile(File, Dir, CSInfo,<br class="">
+                          getSource(SM, SM.getFileID(Loc)));<br class="">
<br class="">
-  DIFileCache[fname].reset(F);<br class="">
+  DIFileCache[FileName.data()].reset(F);<br class="">
   return F;<br class="">
 }<br class="">
<br class="">
<br class="">
Modified: cfe/trunk/lib/CodeGen/CodeGenAction.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenAction.cpp?rev=348154&r1=348153&r2=348154&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenAction.cpp?rev=348154&r1=348153&r2=348154&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/lib/CodeGen/CodeGenAction.cpp (original)<br class="">
+++ cfe/trunk/lib/CodeGen/CodeGenAction.cpp Mon Dec  3 09:55:27 2018<br class="">
@@ -549,12 +549,16 @@ const FullSourceLoc BackendConsumer::get<br class="">
   SourceLocation DILoc;<br class="">
<br class="">
   if (D.isLocationAvailable()) {<br class="">
-    D.getLocation(&Filename, &Line, &Column);<br class="">
-    const FileEntry *FE = FileMgr.getFile(Filename);<br class="">
-    if (FE && Line > 0) {<br class="">
-      // If -gcolumn-info was not used, Column will be 0. This upsets the<br class="">
-      // source manager, so pass 1 if Column is not set.<br class="">
-      DILoc = SourceMgr.translateFileLineCol(FE, Line, Column ? Column : 1);<br class="">
+    D.getLocation(Filename, Line, Column);<br class="">
+    if (Line > 0) {<br class="">
+      const FileEntry *FE = FileMgr.getFile(Filename);<br class="">
+      if (!FE)<br class="">
+        FE = FileMgr.getFile(D.getAbsolutePath());<br class="">
+      if (FE) {<br class="">
+        // If -gcolumn-info was not used, Column will be 0. This upsets the<br class="">
+        // source manager, so pass 1 if Column is not set.<br class="">
+        DILoc = SourceMgr.translateFileLineCol(FE, Line, Column ? Column : 1);<br class="">
+      }<br class="">
     }<br class="">
     BadDebugInfo = DILoc.isInvalid();<br class="">
   }<br class="">
<br class="">
Added: cfe/trunk/test/CodeGen/debug-info-abspath.c<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-info-abspath.c?rev=348154&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-info-abspath.c?rev=348154&view=auto</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/test/CodeGen/debug-info-abspath.c (added)<br class="">
+++ cfe/trunk/test/CodeGen/debug-info-abspath.c Mon Dec  3 09:55:27 2018<br class="">
@@ -0,0 +1,15 @@<br class="">
+// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple \<br class="">
+// RUN:   %s -emit-llvm -o - | FileCheck %s<br class="">
+<br class="">
+// RUN: cp %s %t.c<br class="">
+// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple \<br class="">
+// RUN:   %t.c -emit-llvm -o - | FileCheck %s --check-prefix=INTREE<br class="">
+void foo() {}<br class="">
+<br class="">
+// Since %s is an absolute path, directory should be a nonempty<br class="">
+// prefix, but the CodeGen part should be part of the filename.<br class="">
+<br class="">
+// CHECK: DIFile(filename: "{{.*}}CodeGen{{.*}}debug-info-abspath.c"<br class="">
+// CHECK-SAME:   directory: "{{.+}}")<br class="">
+<br class="">
+// INTREE: DIFile({{.*}}directory: "{{.+}}CodeGen{{.*}}")<br class="">
<br class="">
Modified: cfe/trunk/test/CodeGen/debug-prefix-map.c<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-prefix-map.c?rev=348154&r1=348153&r2=348154&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-prefix-map.c?rev=348154&r1=348153&r2=348154&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/test/CodeGen/debug-prefix-map.c (original)<br class="">
+++ cfe/trunk/test/CodeGen/debug-prefix-map.c Mon Dec  3 09:55:27 2018<br class="">
@@ -17,18 +17,22 @@ void test_rewrite_includes() {<br class="">
 }<br class="">
<br class="">
 // CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "/var/empty{{/|\\5C}}<stdin>"<br class="">
-// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "/var/empty{{[/\\]}}{{.*}}"<br class="">
-// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "/var/empty{{[/\\]}}Inputs/stdio.h"<br class="">
+// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "/var/empty{{[/\\]}}{{.*}}",<br class="">
+// CHECK-NO-MAIN-FILE-NAME-SAME:    directory: "")<br class="">
+// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "/var/empty{{[/\\]}}Inputs/stdio.h",<br class="">
+// CHECK-NO-MAIN-FILE-NAME-SAME:    directory: "")<br class="">
 // CHECK-NO-MAIN-FILE-NAME-NOT: !DIFile(filename:<br class="">
<br class="">
 // CHECK-EVIL: !DIFile(filename: "/var=empty{{[/\\]}}{{.*}}"<br class="">
-// CHECK-EVIL: !DIFile(filename: "/var=empty{{[/\\]}}Inputs/stdio.h"<br class="">
+// CHECK-EVIL: !DIFile(filename: "/var=empty{{[/\\]}}{{.*}}Inputs/stdio.h",<br class="">
+// CHECK-EVIL-SAME:    directory: "")<br class="">
 // CHECK-EVIL-NOT: !DIFile(filename:<br class="">
<br class="">
 // CHECK: !DIFile(filename: "/var/empty{{[/\\]}}{{.*}}"<br class="">
-// CHECK: !DIFile(filename: "/var/empty{{[/\\]}}Inputs/stdio.h"<br class="">
+// CHECK: !DIFile(filename: "/var/empty{{[/\\]}}{{.*}}Inputs/stdio.h",<br class="">
+// CHECK-SAME:    directory: "")<br class="">
 // CHECK-NOT: !DIFile(filename:<br class="">
<br class="">
-// CHECK-COMPILATION-DIR: !DIFile(filename: "/var/empty{{[/\\]}}{{.*}}", directory: "/var/empty")<br class="">
-// CHECK-COMPILATION-DIR: !DIFile(filename: "/var/empty{{[/\\]}}Inputs/stdio.h", directory: "/var/empty")<br class="">
+// CHECK-COMPILATION-DIR: !DIFile(filename: "{{.*}}", directory: "/var/empty")<br class="">
+// CHECK-COMPILATION-DIR: !DIFile(filename: "Inputs/stdio.h", directory: "/var/empty")<br class="">
 // CHECK-COMPILATION-DIR-NOT: !DIFile(filename:<br class="">
<br class="">
Modified: cfe/trunk/test/Modules/module-debuginfo-prefix.m<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/module-debuginfo-prefix.m?rev=348154&r1=348153&r2=348154&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/module-debuginfo-prefix.m?rev=348154&r1=348153&r2=348154&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/test/Modules/module-debuginfo-prefix.m (original)<br class="">
+++ cfe/trunk/test/Modules/module-debuginfo-prefix.m Mon Dec  3 09:55:27 2018<br class="">
@@ -20,4 +20,4 @@<br class="">
 @import DebugObjC;<br class="">
 #endif<br class="">
<br class="">
-// CHECK: !DIFile({{.*}}"/OVERRIDE/DebugObjC.h"<br class="">
+// CHECK: !DIFile(filename: "/OVERRIDE/DebugObjC.h", directory: "")<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
cfe-commits mailing list<br class="">
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br class="">
</blockquote></div>
</div></blockquote></div><br class=""></div></body></html>