13#include "llvm/Option/ArgList.h"
14#include "llvm/Support/VirtualFileSystem.h"
15#include "llvm/Support/WithColor.h"
23using namespace llvm::sys;
31 ArgStringList &CC1Args,
35 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
36 options::OPT_fno_aligned_allocation))
37 CC1Args.push_back(
"-faligned-alloc-unavailable");
39 if (DriverArgs.hasFlag(options::OPT_fxl_pragma_pack,
40 options::OPT_fno_xl_pragma_pack,
true))
41 CC1Args.push_back(
"-fxl-pragma-pack");
45 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
46 options::OPT_fno_sized_deallocation))
47 CC1Args.push_back(
"-fno-sized-deallocation");
54 const char *LinkingOutput)
const {
55 ArgStringList CmdArgs;
57 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
62 CmdArgs.push_back(
"-o");
69 if (Inputs.size() != 1)
70 llvm_unreachable(
"Invalid number of input files.");
76 const char *Exec = Args.MakeArgString(
getToolChain().GetProgramPath(
"as"));
78 Exec, CmdArgs, Inputs));
81static std::string
getLEHLQ(
const ArgList &Args) {
82 if (Args.hasArg(options::OPT_mzos_hlq_le_EQ)) {
83 Arg *LEHLQArg = Args.getLastArg(options::OPT_mzos_hlq_le_EQ);
84 StringRef HLQ = LEHLQArg->getValue();
92 if (Args.hasArg(options::OPT_mzos_hlq_clang_EQ)) {
93 Arg *ClangHLQArg = Args.getLastArg(options::OPT_mzos_hlq_clang_EQ);
94 StringRef HLQ = ClangHLQArg->getValue();
102 if (Args.hasArg(options::OPT_mzos_hlq_csslib_EQ)) {
103 Arg *CsslibHLQArg = Args.getLastArg(options::OPT_mzos_hlq_csslib_EQ);
104 StringRef HLQ = CsslibHLQArg->getValue();
114 const char *LinkingOutput)
const {
116 ArgStringList CmdArgs;
118 const bool IsSharedLib =
119 Args.hasFlag(options::OPT_shared, options::OPT_static,
false);
123 CmdArgs.push_back(
"-o");
128 LinkerOptions =
"AMODE=";
129 LinkerOptions +=
"64";
130 LinkerOptions +=
",LIST";
131 LinkerOptions +=
",DYNAM=DLL";
132 LinkerOptions +=
",MSGLEVEL=4";
133 LinkerOptions +=
",CASE=MIXED";
134 LinkerOptions +=
",REUS=RENT";
136 CmdArgs.push_back(
"-b");
137 CmdArgs.push_back(Args.MakeArgString(LinkerOptions));
140 CmdArgs.push_back(
"-e");
141 CmdArgs.push_back(
"CELQSTRT");
143 CmdArgs.push_back(
"-O");
144 CmdArgs.push_back(
"CELQSTRT");
146 CmdArgs.push_back(
"-u");
147 CmdArgs.push_back(
"CELQMAIN");
156 llvm::sys::path::replace_extension(SideDeckName,
"x");
157 CmdArgs.push_back(
"-x");
158 CmdArgs.push_back(Args.MakeArgString(SideDeckName));
163 CmdArgs.push_back(
"-x");
164 CmdArgs.push_back(
"/dev/null");
168 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_u});
182 StringRef ld_env_var = StringRef(getenv(
"_LD_SYSLIB")).trim();
183 if (ld_env_var.empty()) {
184 CmdArgs.push_back(
"-S");
185 CmdArgs.push_back(Args.MakeArgString(
"//'" + LEHLQ +
".SCEEBND2'"));
186 CmdArgs.push_back(
"-S");
187 CmdArgs.push_back(Args.MakeArgString(
"//'" + CsslibHLQ +
".CSSLIB'"));
190 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
191 ld_env_var = StringRef(getenv(
"_LD_SIDE_DECKS")).trim();
192 if (ld_env_var.empty()) {
194 Args.MakeArgString(
"//'" + LEHLQ +
".SCEELIB(CELQS001)'"));
196 Args.MakeArgString(
"//'" + LEHLQ +
".SCEELIB(CELQS003)'"));
199 ld_env_var.split(ld_side_deck,
":");
200 for (StringRef ld_loc : ld_side_deck) {
201 CmdArgs.push_back((ld_loc.str()).c_str());
211 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
216 Exec, CmdArgs, Inputs));
228 llvm::opt::ArgStringList &CmdArgs)
const {
231 llvm::report_fatal_error(
"linking libstdc++ is unimplemented on z/OS");
236 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXE)'"));
238 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXS)'"));
240 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXP)'"));
242 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXA)'"));
244 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQXLA)'"));
246 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQUNW)'"));
256 ArgStringList &CC1Args)
const {
257 if (DriverArgs.hasArg(options::OPT_nostdinc))
263 std::string ResourceDir(D.ResourceDir);
268 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
270 path::append(P,
"include",
"zos_wrappers");
275 path::append(P2,
"include");
280 if (Arg *SysIncludeArg =
281 DriverArgs.getLastArg(options::OPT_mzos_sys_include_EQ)) {
282 StringRef SysInclude = SysIncludeArg->getValue();
285 if (!SysInclude.empty()) {
289 StringRef PathLE(SysInclude);
290 size_t Colon = PathLE.find(
':');
291 if (Colon == StringRef::npos) {
296 while (Colon != StringRef::npos) {
299 PathLE = PathLE.substr(Colon + 1);
300 Colon = PathLE.find(
':');
313 const llvm::opt::ArgList &DriverArgs,
314 llvm::opt::ArgStringList &CC1Args)
const {
315 if (!
getVFS().exists(Path)) {
316 if (DriverArgs.hasArg(options::OPT_v))
317 WithColor::warning(errs(),
"Clang")
318 <<
"ignoring nonexistent directory \"" << Path <<
"\"\n";
319 if (!DriverArgs.hasArg(options::OPT__HASH_HASH_HASH))
326 const llvm::opt::ArgList &DriverArgs,
327 llvm::opt::ArgStringList &CC1Args)
const {
328 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
329 DriverArgs.hasArg(options::OPT_nostdincxx) ||
330 DriverArgs.hasArg(options::OPT_nostdlibinc))
337 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
342 llvm::report_fatal_error(
343 "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.
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.