r180628 - [driver] Implement the -fdebug-compilation-dir in a way that is compatible with

Chad Rosier mcrosier at apple.com
Fri Apr 26 13:49:51 PDT 2013


Author: mcrosier
Date: Fri Apr 26 15:49:50 2013
New Revision: 180628

URL: http://llvm.org/viewvc/llvm-project?rev=180628&view=rev
Log:
[driver] Implement the -fdebug-compilation-dir in a way that is compatible with
gcc.  No test case included as I'm having problems finding a test case where
the inode/dev don't match.

Modified:
    cfe/trunk/lib/Driver/Tools.cpp
    cfe/trunk/test/Driver/debug-comp-dir.S
    cfe/trunk/test/Driver/debug.c

Modified: cfe/trunk/lib/Driver/Tools.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=180628&r1=180627&r2=180628&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Tools.cpp (original)
+++ cfe/trunk/lib/Driver/Tools.cpp Fri Apr 26 15:49:50 2013
@@ -7,6 +7,9 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <unistd.h>
 #include "Tools.h"
 #include "InputInfo.h"
 #include "SanitizerArgs.h"
@@ -1776,14 +1779,24 @@ static bool shouldUseLeafFramePointer(co
 /// If the PWD environment variable is set, add a CC1 option to specify the
 /// debug compilation directory.
 static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
-  if (const char *pwd = ::getenv("PWD")) {
-    // GCC also verifies that stat(pwd) and stat(".") have the same inode
-    // number. Not doing those because stats are slow, but we could.
-    if (llvm::sys::path::is_absolute(pwd)) {
-      std::string CompDir = pwd;
-      CmdArgs.push_back("-fdebug-compilation-dir");
-      CmdArgs.push_back(Args.MakeArgString(CompDir));
-    }
+  struct stat StatPWDBuf, StatDotBuf;
+
+  const char *pwd;
+  if ((pwd = ::getenv("PWD")) != 0 &&
+      llvm::sys::path::is_absolute(pwd) &&
+      stat(pwd, &StatPWDBuf) == 0 &&
+      stat(".", &StatDotBuf) == 0 &&
+      StatPWDBuf.st_ino == StatDotBuf.st_ino &&
+      StatPWDBuf.st_dev == StatDotBuf.st_dev) {
+    CmdArgs.push_back("-fdebug-compilation-dir");
+    CmdArgs.push_back(Args.MakeArgString(pwd));
+    return;
+  }
+  // Fall back to using getcwd.
+  char cwd[MAXPATHLEN];
+  if (pwd && ::getcwd(cwd, MAXPATHLEN)) {
+    CmdArgs.push_back("-fdebug-compilation-dir");
+    CmdArgs.push_back(Args.MakeArgString(cwd));
   }
 }
 

Modified: cfe/trunk/test/Driver/debug-comp-dir.S
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/debug-comp-dir.S?rev=180628&r1=180627&r2=180628&view=diff
==============================================================================
--- cfe/trunk/test/Driver/debug-comp-dir.S (original)
+++ cfe/trunk/test/Driver/debug-comp-dir.S Fri Apr 26 15:49:50 2013
@@ -1,9 +1,6 @@
 // RUN: cd %S && %clang -### -g %s -c 2>&1 | FileCheck -check-prefix=CHECK-PWD %s
 // CHECK-PWD: {{"-fdebug-compilation-dir" ".*Driver.*"}}
 
-// RUN: env PWD=/foo %clang -### -g %s -c 2>&1 | FileCheck -check-prefix=CHECK-FOO %s
-// CHECK-FOO: {{"-fdebug-compilation-dir" ".*foo"}}
-
 // "PWD=/foo gcc" wouldn't necessarily work. You would need to pick a different
 // path to the same directory (try a symlink).
 

Modified: cfe/trunk/test/Driver/debug.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/debug.c?rev=180628&r1=180627&r2=180628&view=diff
==============================================================================
--- cfe/trunk/test/Driver/debug.c (original)
+++ cfe/trunk/test/Driver/debug.c Fri Apr 26 15:49:50 2013
@@ -1,9 +1,6 @@
 // RUN: cd %S && %clang -### -g %s -c 2>&1 | FileCheck -check-prefix=CHECK-PWD %s
 // CHECK-PWD: {{"-fdebug-compilation-dir" ".*Driver.*"}}
 
-// RUN: env PWD=/foo %clang -### -g %s -c 2>&1 | FileCheck -check-prefix=CHECK-FOO %s
-// CHECK-FOO: {{"-fdebug-compilation-dir" ".*foo"}}
-
 // "PWD=/foo gcc" wouldn't necessarily work. You would need to pick a different
 // path to the same directory (try a symlink).
 





More information about the cfe-commits mailing list