#include "llvm/ADT/Triple.h"
#include "llvm/MC/MCTargetOptions.h"
#include "llvm/Option/Option.h"
+#include "llvm/Support/Path.h"
#include "llvm/Support/VersionTuple.h"
#include "llvm/Target/TargetOptions.h"
#include <cassert>
StringRef Component,
bool Shared = false) const;
+ std::string normalizePath(StringRef Path) const {
+ if (!Triple.isOSWindows() || Triple.isOSCygMing())
+ return llvm::sys::path::convert_to_slash(Path);
+ return Path;
+ }
+
// Returns <ResourceDir>/lib/<OSName>/<arch>. This is used by runtimes (such
// as OpenMP) to find arch-specific libraries.
std::string getArchSpecificLibPath() const;
.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.
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);
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,
}
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 {
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,
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);
}
// 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.");
}
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);
}
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);
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) &&
}
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));
// Add filenames immediately.
if (II.isFilename()) {
- CmdArgs.push_back(II.getFilename());
+ CmdArgs.push_back(Args.MakeArgString(TC.normalizePath(II.getFilename())));
continue;
}
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()) {