]> granicus.if.org Git - clang/commitdiff
Add gcc's -no-canonical-prefixes option to clang.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 4 Dec 2009 19:31:58 +0000 (19:31 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 4 Dec 2009 19:31:58 +0000 (19:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90577 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Driver/Options.td
lib/Driver/Tools.cpp
tools/driver/driver.cpp

index 54a7bec3e6625225dd1c7173d041ec58038ab07e..bfe80e6c5ebe3e0374fbf82408ebcffc1d0a23e1 100644 (file)
@@ -375,6 +375,8 @@ def multiply__defined : Separate<"-multiply_defined">;
 def mwarn_nonportable_cfstrings : Flag<"-mwarn-nonportable-cfstrings">, Group<m_Group>;
 def m_Separate : Separate<"-m">, Group<m_Group>;
 def m_Joined : Joined<"-m">, Group<m_Group>;
+def no_canonical_prefixes : Flag<"-no-canonical-prefixes">, Flags<[DriverOption]>,
+  HelpText<"Do not resolve symbolic links, turn relative paths into absolute ones, or do anything else to identify the executable">;
 def no_cpp_precomp : Flag<"-no-cpp-precomp">;
 def no_integrated_cpp : Flag<"-no-integrated-cpp">, Flags<[DriverOption]>;
 def no__dead__strip__inits__and__terms : Flag<"-no_dead_strip_inits_and_terms">;
index b10ad1e12274534934a38be71888a02696d40fce..a6cdac39f5edf87611b2f6b8962dda4a4c9ce91b 100644 (file)
@@ -1104,6 +1104,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
   // care to warn the user about.
   Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
   Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
+
+  // -no-canonical-prefixes is used very early in main.
+  Args.ClaimAllArgs(options::OPT_no_canonical_prefixes);
 }
 
 void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
index c61ee726449fde08738bc30fe7bc1248594e00b3..527b5f3c0c78a70aa84c37df8d38f3d0611e04d4 100644 (file)
@@ -60,7 +60,10 @@ void DriverDiagnosticPrinter::HandleDiagnostic(Diagnostic::Level Level,
   OS << '\n';
 }
 
-llvm::sys::Path GetExecutablePath(const char *Argv0) {
+llvm::sys::Path GetExecutablePath(const char *Argv0, bool CanonicalPrefixes) {
+  if (!CanonicalPrefixes)
+    return llvm::sys::Path(Argv0);
+
   // This just needs to be some symbol in the binary; C++ doesn't
   // allow taking the address of ::main however.
   void *P = (void*) (intptr_t) GetExecutablePath;
@@ -190,7 +193,16 @@ int main(int argc, const char **argv) {
     return cc1_main(argv+2, argv+argc, argv[0],
                     (void*) (intptr_t) GetExecutablePath);
 
-  llvm::sys::Path Path = GetExecutablePath(argv[0]);
+  bool CanonicalPrefixes = true;
+  for (int i = 1; i < argc; ++i) {
+    if (llvm::StringRef(argv[i]) == "-no-canonical-prefixes") {
+      CanonicalPrefixes = false;
+      break;
+    }
+  }
+
+  llvm::sys::Path Path = GetExecutablePath(argv[0], CanonicalPrefixes);
+
   DriverDiagnosticPrinter DiagClient(Path.getBasename(), llvm::errs());
 
   Diagnostic Diags(&DiagClient);
@@ -264,4 +276,3 @@ int main(int argc, const char **argv) {
 
   return Res;
 }
-