From: Rafael Espindola Date: Fri, 4 Dec 2009 19:31:58 +0000 (+0000) Subject: Add gcc's -no-canonical-prefixes option to clang. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0f4c59c3beae302b5a3ecea13f2e257bdaad3188;p=clang Add gcc's -no-canonical-prefixes option to clang. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90577 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 54a7bec3e6..bfe80e6c5e 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -375,6 +375,8 @@ def multiply__defined : Separate<"-multiply_defined">; def mwarn_nonportable_cfstrings : Flag<"-mwarn-nonportable-cfstrings">, Group; def m_Separate : Separate<"-m">, Group; def m_Joined : Joined<"-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">; diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index b10ad1e122..a6cdac39f5 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -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, diff --git a/tools/driver/driver.cpp b/tools/driver/driver.cpp index c61ee72644..527b5f3c0c 100644 --- a/tools/driver/driver.cpp +++ b/tools/driver/driver.cpp @@ -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; } -