From 89aa2ce6d6de2b9200171bd3ecc97fe917f73d62 Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Tue, 30 Oct 2012 21:42:09 +0000 Subject: [PATCH] [driver] Older versions of ld expect '-L' not '-L '. In Xcode4 and later, '-L ' is allowed, but rewrite these in the driver as '-L' to maintain backward compatibility. The same is true for the -I option. rdar://12366753 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@167054 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/Tools.cpp | 38 ++++++++++++++++++++++++++++++-------- test/Driver/cpath.c | 4 ++-- test/Driver/linker-opts.c | 2 +- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index d0cf1cad5e..7c48d6bc41 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -93,9 +93,15 @@ static void addDirectoryList(const ArgList &Args, const char *ArgName, const char *EnvVar) { const char *DirList = ::getenv(EnvVar); + bool CombinedArg = false; + if (!DirList) return; // Nothing to do. + StringRef Name(ArgName); + if (Name.equals("-I") || Name.equals("-L")) + CombinedArg = true; + StringRef Dirs(DirList); if (Dirs.empty()) // Empty string should not add '.'. return; @@ -103,21 +109,37 @@ static void addDirectoryList(const ArgList &Args, StringRef::size_type Delim; while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) { if (Delim == 0) { // Leading colon. - CmdArgs.push_back(ArgName); - CmdArgs.push_back("."); + if (CombinedArg) { + CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + ".")); + } else { + CmdArgs.push_back(ArgName); + CmdArgs.push_back("."); + } } else { - CmdArgs.push_back(ArgName); - CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim))); + if (CombinedArg) { + CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim))); + } else { + CmdArgs.push_back(ArgName); + CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim))); + } } Dirs = Dirs.substr(Delim + 1); } if (Dirs.empty()) { // Trailing colon. - CmdArgs.push_back(ArgName); - CmdArgs.push_back("."); + if (CombinedArg) { + CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + ".")); + } else { + CmdArgs.push_back(ArgName); + CmdArgs.push_back("."); + } } else { // Add the last path. - CmdArgs.push_back(ArgName); - CmdArgs.push_back(Args.MakeArgString(Dirs)); + if (CombinedArg) { + CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs)); + } else { + CmdArgs.push_back(ArgName); + CmdArgs.push_back(Args.MakeArgString(Dirs)); + } } } diff --git a/test/Driver/cpath.c b/test/Driver/cpath.c index bd7c8d0ab5..ea6ba49d6d 100644 --- a/test/Driver/cpath.c +++ b/test/Driver/cpath.c @@ -1,8 +1,8 @@ // RUN: mkdir -p %T/test1 %T/test2 %T/test3 // RUN: env "CPATH=%T/test1%{pathsep}%T/test2" %clang -x c -E -v %s 2>&1 | FileCheck %s -check-prefix=CPATH -// CPATH: -I {{.*}}/test1 -// CPATH: -I {{.*}}/test2 +// CPATH: -I{{.*}}/test1 +// CPATH: -I{{.*}}/test2 // CPATH: search starts here // CPATH: test1 // CPATH: test2 diff --git a/test/Driver/linker-opts.c b/test/Driver/linker-opts.c index 85e180c4e2..2a96a17c70 100644 --- a/test/Driver/linker-opts.c +++ b/test/Driver/linker-opts.c @@ -1,5 +1,5 @@ // RUN: env LIBRARY_PATH=%T/test1 %clang -x c %s -### 2>&1 | FileCheck %s -// CHECK: "-L" "{{.*}}/test1" +// CHECK: "-L{{.*}}/test1" // GCC driver is used as linker on cygming. It should be aware of LIBRARY_PATH. // XFAIL: cygwin,mingw32,win32 -- 2.40.0