summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2018-10-26 07:01:59 +0000
committerMartin Storsjo <martin@martin.st>2018-10-26 07:01:59 +0000
commitcbd73574e43e0b14f428cbe7f748c5bba8636e3a (patch)
treef832c779f8a627d46f55d460072cf2cfa72372a3 /clang/lib
parent065c3610ad609bb12fd4602ef8cb2bd4f773a5fc (diff)
downloadbcm5719-llvm-cbd73574e43e0b14f428cbe7f748c5bba8636e3a.tar.gz
bcm5719-llvm-cbd73574e43e0b14f428cbe7f748c5bba8636e3a.zip
Reapply: [Driver] Use forward slashes in most linker arguments
libtool inspects the output of $CC -v to detect what object files and libraries are linked in by default. When clang is built as a native windows executable, all paths are formatted with backslashes, and the backslashes cause each argument to be enclosed in quotes. The backslashes and quotes break further processing within libtool (which is implemented in shell script, running in e.g. msys) pretty badly. Between unix style pathes (that only work in tools that are linked to the msys runtime, essentially the same as cygwin) and proper windows style paths (with backslashes, that can easily break shell scripts and msys environments), the best compromise is to use windows style paths (starting with e.g. c:) but with forward slashes, which both msys based tools, shell scripts and native windows executables can cope with. This incidentally turns out to be the form of paths that GCC prints out when run with -v on windows as well. This change potentially makes the output from clang -v a bit more inconsistent, but it is isn't necessarily very consistent to begin with. Compared to the previous attempt in SVN r345004, this now does the same transformation on more paths, hopefully on the right set of paths so that all tests pass (previously some tests failed, where path fragments that were required to be identical turned out to use different path separators in different places). This now also is done only for non-windows, or cygwin/mingw targets, to preserve all backslashes for MSVC cases (where the paths can end up e.g. embedded into PDB files. (The transformation function itself, llvm::sys::path::convert_to_slash only has an effect when run on windows.) Differential Revision: https://reviews.llvm.org/D53066 llvm-svn: 345370
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Driver/Driver.cpp6
-rw-r--r--clang/lib/Driver/ToolChain.cpp19
-rw-r--r--clang/lib/Driver/ToolChains/Clang.cpp18
-rw-r--r--clang/lib/Driver/ToolChains/CommonArgs.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/Gnu.cpp2
5 files changed, 30 insertions, 17 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 453758196cf..45e93a3661e 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -1011,6 +1011,12 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
.Default(SaveTempsCwd);
}
+ llvm::Triple EffectiveTriple = computeTargetTriple(*this, TargetTriple, Args);
+ if (!EffectiveTriple.isOSWindows() || EffectiveTriple.isOSCygMing()) {
+ for (auto *Str : {&Dir, &InstalledDir, &SysRoot, &ResourceDir})
+ *Str = llvm::sys::path::convert_to_slash(*Str);
+ }
+
setLTOMode(Args);
// Process -fembed-bitcode= flags.
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 1667536c567..880a2ec250a 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -376,9 +376,10 @@ std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component,
for (const auto &LibPath : getLibraryPaths()) {
SmallString<128> P(LibPath);
- llvm::sys::path::append(P, Prefix + Twine("clang_rt.") + Component + Suffix);
+ llvm::sys::path::append(P,
+ Prefix + Twine("clang_rt.") + Component + Suffix);
if (getVFS().exists(P))
- return P.str();
+ return normalizePath(P);
}
StringRef Arch = getArchNameForCompilerRTLib(*this, Args);
@@ -386,7 +387,7 @@ std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component,
SmallString<128> Path(getCompilerRTPath());
llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
Arch + Env + Suffix);
- return Path.str();
+ return normalizePath(Path);
}
const char *ToolChain::getCompilerRTArgString(const llvm::opt::ArgList &Args,
@@ -425,7 +426,7 @@ Tool *ToolChain::SelectTool(const JobAction &JA) const {
}
std::string ToolChain::GetFilePath(const char *Name) const {
- return D.GetFilePath(Name, *this);
+ return normalizePath(D.GetFilePath(Name, *this));
}
std::string ToolChain::GetProgramPath(const char *Name) const {
@@ -774,12 +775,14 @@ void ToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
void ToolChain::AddFilePathLibArgs(const ArgList &Args,
ArgStringList &CmdArgs) const {
for (const auto &LibPath : getLibraryPaths())
- if(LibPath.length() > 0)
- CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
+ if (LibPath.length() > 0)
+ CmdArgs.push_back(
+ Args.MakeArgString(StringRef("-L") + normalizePath(LibPath)));
for (const auto &LibPath : getFilePaths())
- if(LibPath.length() > 0)
- CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
+ if (LibPath.length() > 0)
+ CmdArgs.push_back(
+ Args.MakeArgString(StringRef("-L") + normalizePath(LibPath)));
}
void ToolChain::AddCCKextLibArgs(const ArgList &Args,
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index a8ddd8adc32..67c94da8f3a 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -3570,7 +3570,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
for (const auto &II : Inputs) {
addDashXForInput(Args, II, CmdArgs);
if (II.isFilename())
- CmdArgs.push_back(II.getFilename());
+ CmdArgs.push_back(
+ Args.MakeArgString(TC.normalizePath(II.getFilename())));
else
II.getInputArg().renderAsInput(Args, CmdArgs);
}
@@ -4963,7 +4964,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
// Handled with other dependency code.
} else if (Output.isFilename()) {
CmdArgs.push_back("-o");
- CmdArgs.push_back(Output.getFilename());
+ CmdArgs.push_back(
+ Args.MakeArgString(TC.normalizePath(Output.getFilename())));
} else {
assert(Output.isNothing() && "Invalid output.");
}
@@ -4978,7 +4980,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
for (const InputInfo &Input : FrontendInputs) {
if (Input.isFilename())
- CmdArgs.push_back(Input.getFilename());
+ CmdArgs.push_back(
+ Args.MakeArgString(TC.normalizePath(Input.getFilename())));
else
Input.getInputArg().renderAsInput(Args, CmdArgs);
}
@@ -5671,9 +5674,10 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
assert(Inputs.size() == 1 && "Unexpected number of inputs.");
const InputInfo &Input = Inputs[0];
- const llvm::Triple &Triple = getToolChain().getEffectiveTriple();
+ const ToolChain &TC = getToolChain();
+ const llvm::Triple &Triple = TC.getEffectiveTriple();
const std::string &TripleStr = Triple.getTriple();
- const auto &D = getToolChain().getDriver();
+ const auto &D = TC.getDriver();
// Don't warn about "clang -w -c foo.s"
Args.ClaimAllArgs(options::OPT_w);
@@ -5847,7 +5851,7 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
assert(Output.isFilename() && "Unexpected lipo output.");
CmdArgs.push_back("-o");
- CmdArgs.push_back(Output.getFilename());
+ CmdArgs.push_back(Args.MakeArgString(TC.normalizePath(Output.getFilename())));
const llvm::Triple &T = getToolChain().getTriple();
if (Args.hasArg(options::OPT_gsplit_dwarf) &&
@@ -5857,7 +5861,7 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
}
assert(Input.isFilename() && "Invalid input.");
- CmdArgs.push_back(Input.getFilename());
+ CmdArgs.push_back(Args.MakeArgString(TC.normalizePath(Input.getFilename())));
const char *Exec = getToolChain().getDriver().getClangProgramPath();
C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 171d1aebdb4..0278074334d 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -163,7 +163,7 @@ void tools::AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
// Add filenames immediately.
if (II.isFilename()) {
- CmdArgs.push_back(II.getFilename());
+ CmdArgs.push_back(Args.MakeArgString(TC.normalizePath(II.getFilename())));
continue;
}
diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
index d91808db34c..514632bd1b8 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -1699,7 +1699,7 @@ void Generic_GCC::GCCInstallationDetector::init(
if (GCCToolchainDir.back() == '/')
GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
- Prefixes.push_back(GCCToolchainDir);
+ Prefixes.push_back(llvm::sys::path::convert_to_slash(GCCToolchainDir));
} else {
// If we have a SysRoot, try that first.
if (!D.SysRoot.empty()) {
OpenPOWER on IntegriCloud