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.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));
144 CmdArgs.push_back(
"-e");
145 CmdArgs.push_back(
"CELQSTRT");
147 CmdArgs.push_back(
"-O");
148 CmdArgs.push_back(
"CELQSTRT");
150 CmdArgs.push_back(
"-u");
151 CmdArgs.push_back(
"CELQMAIN");
160 llvm::sys::path::replace_extension(SideDeckName,
"x");
161 CmdArgs.push_back(
"-x");
162 CmdArgs.push_back(Args.MakeArgString(SideDeckName));
167 CmdArgs.push_back(
"-x");
168 CmdArgs.push_back(
"/dev/null");
172 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_u});
186 StringRef ld_env_var = StringRef(getenv(
"_LD_SYSLIB")).trim();
187 if (ld_env_var.empty()) {
188 CmdArgs.push_back(
"-S");
189 CmdArgs.push_back(Args.MakeArgString(
"//'" + LEHLQ +
".SCEEBND2'"));
190 CmdArgs.push_back(
"-S");
191 CmdArgs.push_back(Args.MakeArgString(
"//'" + CsslibHLQ +
".CSSLIB'"));
194 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
195 ld_env_var = StringRef(getenv(
"_LD_SIDE_DECKS")).trim();
196 if (ld_env_var.empty()) {
198 Args.MakeArgString(
"//'" + LEHLQ +
".SCEELIB(CELQS001)'"));
200 Args.MakeArgString(
"//'" + LEHLQ +
".SCEELIB(CELQS003)'"));
203 ld_env_var.split(ld_side_deck,
":");
204 for (StringRef ld_loc : ld_side_deck) {
205 CmdArgs.push_back((ld_loc.str()).c_str());
215 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
220 Exec, CmdArgs, Inputs, Output));
232 llvm::opt::ArgStringList &CmdArgs)
const {
235 llvm::report_fatal_error(
"linking libstdc++ is unimplemented on z/OS");
240 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXE)'"));
242 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXS)'"));
244 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXP)'"));
246 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXA)'"));
248 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQXLA)'"));
250 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQUNW)'"));
260 ArgStringList &CC1Args)
const {
261 if (DriverArgs.hasArg(options::OPT_nostdinc))
267 std::string ResourceDir(D.ResourceDir);
272 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
274 path::append(P,
"include",
"zos_wrappers");
279 path::append(P2,
"include");
284 if (Arg *SysIncludeArg =
285 DriverArgs.getLastArg(options::OPT_mzos_sys_include_EQ)) {
286 StringRef SysInclude = SysIncludeArg->getValue();
289 if (!SysInclude.empty()) {
293 StringRef PathLE(SysInclude);
294 size_t Colon = PathLE.find(
':');
295 if (Colon == StringRef::npos) {
300 while (Colon != StringRef::npos) {
303 PathLE = PathLE.substr(Colon + 1);
304 Colon = PathLE.find(
':');
317 const llvm::opt::ArgList &DriverArgs,
318 llvm::opt::ArgStringList &CC1Args)
const {
319 if (!
getVFS().exists(Path)) {
320 if (DriverArgs.hasArg(options::OPT_v))
321 WithColor::warning(errs(),
"Clang")
322 <<
"ignoring nonexistent directory \"" << Path <<
"\"\n";
323 if (!DriverArgs.hasArg(options::OPT__HASH_HASH_HASH))
330 const llvm::opt::ArgList &DriverArgs,
331 llvm::opt::ArgStringList &CC1Args)
const {
332 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
333 DriverArgs.hasArg(options::OPT_nostdincxx) ||
334 DriverArgs.hasArg(options::OPT_nostdlibinc))
341 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
346 llvm::report_fatal_error(
347 "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.