aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Driver/Driver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Driver/Driver.cpp')
-rw-r--r--clang/lib/Driver/Driver.cpp45
1 files changed, 30 insertions, 15 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 1889ea28079d..7109faa1072d 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -186,7 +186,7 @@ std::string Driver::GetResourcesPath(StringRef BinaryPath,
CLANG_VERSION_MAJOR_STRING);
}
- return std::string(P.str());
+ return std::string(P);
}
Driver::Driver(StringRef ClangExecutable, StringRef TargetTriple,
@@ -1310,10 +1310,23 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
A->claim();
- // TODO: Specify Vulkan target environment somewhere in the triple.
if (Args.hasArg(options::OPT_spirv)) {
llvm::Triple T(TargetTriple);
T.setArch(llvm::Triple::spirv);
+ T.setOS(llvm::Triple::Vulkan);
+
+ // Set specific Vulkan version if applicable.
+ if (const Arg *A = Args.getLastArg(options::OPT_fspv_target_env_EQ)) {
+ const llvm::StringSet<> ValidValues = {"vulkan1.2", "vulkan1.3"};
+ if (ValidValues.contains(A->getValue())) {
+ T.setOSName(A->getValue());
+ } else {
+ Diag(diag::err_drv_invalid_value)
+ << A->getAsString(Args) << A->getValue();
+ }
+ A->claim();
+ }
+
TargetTriple = T.str();
}
} else {
@@ -1831,7 +1844,7 @@ void Driver::generateCompilationDiagnostics(
ScriptOS << "\n# Additional information: " << AdditionalInformation
<< "\n";
if (Report)
- Report->TemporaryFiles.push_back(std::string(Script.str()));
+ Report->TemporaryFiles.push_back(std::string(Script));
Diag(clang::diag::note_drv_command_failed_diag_msg) << Script;
}
@@ -4751,10 +4764,11 @@ Action *Driver::ConstructPhaseAction(
case phases::Backend: {
if (isUsingLTO() && TargetDeviceOffloadKind == Action::OFK_None) {
types::ID Output;
- if (Args.hasArg(options::OPT_S))
+ if (Args.hasArg(options::OPT_ffat_lto_objects))
+ Output = Args.hasArg(options::OPT_emit_llvm) ? types::TY_LTO_IR
+ : types::TY_PP_Asm;
+ else if (Args.hasArg(options::OPT_S))
Output = types::TY_LTO_IR;
- else if (Args.hasArg(options::OPT_ffat_lto_objects))
- Output = types::TY_PP_Asm;
else
Output = types::TY_LTO_BC;
return C.MakeAction<BackendJobAction>(Input, Output);
@@ -6073,17 +6087,17 @@ std::string Driver::GetFilePath(StringRef Name, const ToolChain &TC) const {
SmallString<128> R(ResourceDir);
llvm::sys::path::append(R, Name);
if (llvm::sys::fs::exists(Twine(R)))
- return std::string(R.str());
+ return std::string(R);
SmallString<128> P(TC.getCompilerRTPath());
llvm::sys::path::append(P, Name);
if (llvm::sys::fs::exists(Twine(P)))
- return std::string(P.str());
+ return std::string(P);
SmallString<128> D(Dir);
llvm::sys::path::append(D, "..", Name);
if (llvm::sys::fs::exists(Twine(D)))
- return std::string(D.str());
+ return std::string(D);
if (auto P = SearchPaths(TC.getLibraryPaths()))
return *P;
@@ -6120,11 +6134,11 @@ std::string Driver::GetProgramPath(StringRef Name, const ToolChain &TC) const {
if (llvm::sys::fs::is_directory(PrefixDir)) {
SmallString<128> P(PrefixDir);
if (ScanDirForExecutable(P, Name))
- return std::string(P.str());
+ return std::string(P);
} else {
SmallString<128> P((PrefixDir + Name).str());
if (llvm::sys::fs::can_execute(Twine(P)))
- return std::string(P.str());
+ return std::string(P);
}
}
@@ -6140,7 +6154,7 @@ std::string Driver::GetProgramPath(StringRef Name, const ToolChain &TC) const {
for (const auto &Path : List) {
SmallString<128> P(Path);
if (ScanDirForExecutable(P, TargetSpecificExecutable))
- return std::string(P.str());
+ return std::string(P);
}
// Fall back to the path
@@ -6160,7 +6174,7 @@ std::string Driver::GetTemporaryPath(StringRef Prefix, StringRef Suffix) const {
return "";
}
- return std::string(Path.str());
+ return std::string(Path);
}
std::string Driver::GetTemporaryDirectory(StringRef Prefix) const {
@@ -6171,7 +6185,7 @@ std::string Driver::GetTemporaryDirectory(StringRef Prefix) const {
return "";
}
- return std::string(Path.str());
+ return std::string(Path);
}
std::string Driver::GetClPchPath(Compilation &C, StringRef BaseName) const {
@@ -6193,7 +6207,7 @@ std::string Driver::GetClPchPath(Compilation &C, StringRef BaseName) const {
Output = BaseName;
llvm::sys::path::replace_extension(Output, ".pch");
}
- return std::string(Output.str());
+ return std::string(Output);
}
const ToolChain &Driver::getToolChain(const ArgList &Args,
@@ -6213,6 +6227,7 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
case llvm::Triple::IOS:
case llvm::Triple::TvOS:
case llvm::Triple::WatchOS:
+ case llvm::Triple::XROS:
case llvm::Triple::DriverKit:
TC = std::make_unique<toolchains::DarwinClang>(*this, Target, Args);
break;