13#include "llvm/Option/ArgList.h"
14#include "llvm/Support/VirtualFileSystem.h"
15#include "llvm/Support/WithColor.h"
23using namespace llvm::sys;
35 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
36 options::OPT_fno_aligned_allocation))
37 CC1Args.push_back(
"-faligned-alloc-unavailable");
39 if (!DriverArgs.hasArg(options::OPT_fvisibility_EQ,
40 options::OPT_fvisibility_ms_compat))
41 CC1Args.push_back(
"-fvisibility=hidden");
43 if (DriverArgs.hasFlag(options::OPT_fxl_pragma_pack,
44 options::OPT_fno_xl_pragma_pack,
true))
45 CC1Args.push_back(
"-fxl-pragma-pack");
49 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
50 options::OPT_fno_sized_deallocation))
51 CC1Args.push_back(
"-fno-sized-deallocation");
58 const char *LinkingOutput)
const {
59 ArgStringList CmdArgs;
61 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
66 CmdArgs.push_back(
"-o");
73 if (Inputs.size() != 1)
74 llvm_unreachable(
"Invalid number of input files.");
80 const char *Exec = Args.MakeArgString(
getToolChain().GetProgramPath(
"as"));
82 Exec, CmdArgs, Inputs, Output));
85static std::string
getLEHLQ(
const ArgList &Args) {
86 if (Args.hasArg(options::OPT_mzos_hlq_le_EQ)) {
87 Arg *LEHLQArg = Args.getLastArg(options::OPT_mzos_hlq_le_EQ);
88 StringRef HLQ = LEHLQArg->getValue();
96 if (Args.hasArg(options::OPT_mzos_hlq_clang_EQ)) {
97 Arg *ClangHLQArg = Args.getLastArg(options::OPT_mzos_hlq_clang_EQ);
98 StringRef HLQ = ClangHLQArg->getValue();
106 if (Args.hasArg(options::OPT_mzos_hlq_csslib_EQ)) {
107 Arg *CsslibHLQArg = Args.getLastArg(options::OPT_mzos_hlq_csslib_EQ);
108 StringRef HLQ = CsslibHLQArg->getValue();
118 const char *LinkingOutput)
const {
120 ArgStringList CmdArgs;
122 const bool IsSharedLib =
123 Args.hasFlag(options::OPT_shared, options::OPT_static,
false);
127 CmdArgs.push_back(
"-o");
132 LinkerOptions =
"AMODE=";
133 LinkerOptions +=
"64";
134 LinkerOptions +=
",LIST";
135 LinkerOptions +=
",DYNAM=DLL";
136 LinkerOptions +=
",MSGLEVEL=4";
137 LinkerOptions +=
",CASE=MIXED";
138 LinkerOptions +=
",REUS=RENT";
140 CmdArgs.push_back(
"-b");
141 CmdArgs.push_back(Args.MakeArgString(LinkerOptions));
143 CmdArgs.push_back(
"-e");
144 CmdArgs.push_back(
"CELQSTRT");
145 CmdArgs.push_back(
"-O");
146 CmdArgs.push_back(
"CELQSTRT");
148 CmdArgs.push_back(
"-u");
149 CmdArgs.push_back(
"CELQMAIN");
155 bool HasSideDeck =
false;
156 for (
auto *Arg : Args.filtered(options::OPT_Wl_COMMA)) {
157 if (std::find_if(Arg->getValues().begin(), Arg->getValues().end(),
158 [](StringRef ArgValue) {
159 return ArgValue.starts_with(
"-x");
160 }) != Arg->getValues().end()) {
171 llvm::sys::path::replace_extension(SideDeckName,
"x");
172 CmdArgs.push_back(
"-x");
173 CmdArgs.push_back(Args.MakeArgString(SideDeckName));
179 CmdArgs.push_back(
"-x");
180 CmdArgs.push_back(
"/dev/null");
184 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_u});
198 StringRef ld_env_var = StringRef(getenv(
"_LD_SYSLIB")).trim();
199 if (ld_env_var.empty()) {
200 CmdArgs.push_back(
"-S");
201 CmdArgs.push_back(Args.MakeArgString(
"//'" + LEHLQ +
".SCEEBND2'"));
202 CmdArgs.push_back(
"-S");
203 CmdArgs.push_back(Args.MakeArgString(
"//'" + CsslibHLQ +
".CSSLIB'"));
206 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
207 ld_env_var = StringRef(getenv(
"_LD_SIDE_DECKS")).trim();
208 if (ld_env_var.empty()) {
210 Args.MakeArgString(
"//'" + LEHLQ +
".SCEELIB(CELQS001)'"));
212 Args.MakeArgString(
"//'" + LEHLQ +
".SCEELIB(CELQS003)'"));
215 ld_env_var.split(ld_side_deck,
":");
216 for (StringRef ld_loc : ld_side_deck) {
217 CmdArgs.push_back((ld_loc.str()).c_str());
227 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
232 Exec, CmdArgs, Inputs, Output));
244 llvm::opt::ArgStringList &CmdArgs)
const {
247 llvm::report_fatal_error(
"linking libstdc++ is unimplemented on z/OS");
252 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXE)'"));
254 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXS)'"));
256 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXP)'"));
258 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXA)'"));
260 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQXLA)'"));
262 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQUNW)'"));
272 ArgStringList &CC1Args)
const {
273 if (DriverArgs.hasArg(options::OPT_nostdinc))
279 std::string ResourceDir(D.ResourceDir);
284 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
286 path::append(P,
"include",
"zos_wrappers");
291 path::append(P2,
"include");
296 if (Arg *SysIncludeArg =
297 DriverArgs.getLastArg(options::OPT_mzos_sys_include_EQ)) {
298 StringRef SysInclude = SysIncludeArg->getValue();
301 if (!SysInclude.empty()) {
305 StringRef PathLE(SysInclude);
306 size_t Colon = PathLE.find(
':');
307 if (Colon == StringRef::npos) {
312 while (Colon != StringRef::npos) {
315 PathLE = PathLE.substr(Colon + 1);
316 Colon = PathLE.find(
':');
329 const llvm::opt::ArgList &DriverArgs,
330 llvm::opt::ArgStringList &CC1Args)
const {
331 if (!
getVFS().exists(Path)) {
332 if (DriverArgs.hasArg(options::OPT_v))
333 WithColor::warning(errs(),
"Clang")
334 <<
"ignoring nonexistent directory \"" << Path <<
"\"\n";
335 if (!DriverArgs.hasArg(options::OPT__HASH_HASH_HASH))
342 const llvm::opt::ArgList &DriverArgs,
343 llvm::opt::ArgStringList &CC1Args)
const {
344 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
345 DriverArgs.hasArg(options::OPT_nostdincxx) ||
346 DriverArgs.hasArg(options::OPT_nostdlibinc))
353 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
358 llvm::report_fatal_error(
359 "picking up libstdc++ headers is unimplemented on z/OS");
static std::string getClangHLQ(const ArgList &Args)
static std::string getLEHLQ(const ArgList &Args)
static std::string getCSSHLQ(const ArgList &Args)
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
SmallVector< InputInfo, 4 > InputInfoList
The JSON file list parser is used to communicate input to InstallAPI.
Diagnostic wrappers for TextAPI types for error reporting.
Represents a bound architecture for offload / multiple architecture compilation.
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.