13#include "llvm/Option/ArgList.h"
14#include "llvm/Support/FileSystem.h"
15#include "llvm/Support/VirtualFileSystem.h"
16#include "llvm/Support/WithColor.h"
24using namespace llvm::sys;
32 ArgStringList &CC1Args,
36 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
37 options::OPT_fno_aligned_allocation))
38 CC1Args.push_back(
"-faligned-alloc-unavailable");
45 const char *LinkingOutput)
const {
46 ArgStringList CmdArgs;
48 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
53 CmdArgs.push_back(
"-o");
60 if (Inputs.size() != 1)
61 llvm_unreachable(
"Invalid number of input files.");
67 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(
"as"));
69 Exec, CmdArgs, Inputs));
72static std::string
getLEHLQ(
const ArgList &Args) {
73 if (Args.hasArg(options::OPT_mzos_hlq_le_EQ)) {
74 Arg *LEHLQArg = Args.getLastArg(options::OPT_mzos_hlq_le_EQ);
75 StringRef HLQ = LEHLQArg->getValue();
83 if (Args.hasArg(options::OPT_mzos_hlq_clang_EQ)) {
84 Arg *ClangHLQArg = Args.getLastArg(options::OPT_mzos_hlq_clang_EQ);
85 StringRef HLQ = ClangHLQArg->getValue();
93 if (Args.hasArg(options::OPT_mzos_hlq_csslib_EQ)) {
94 Arg *CsslibHLQArg = Args.getLastArg(options::OPT_mzos_hlq_csslib_EQ);
95 StringRef HLQ = CsslibHLQArg->getValue();
105 const char *LinkingOutput)
const {
107 ArgStringList CmdArgs;
109 const bool IsSharedLib =
110 Args.hasFlag(options::OPT_shared, options::OPT_static,
false);
114 CmdArgs.push_back(
"-o");
119 LinkerOptions =
"AMODE=";
120 LinkerOptions +=
"64";
121 LinkerOptions +=
",LIST";
122 LinkerOptions +=
",DYNAM=DLL";
123 LinkerOptions +=
",MSGLEVEL=4";
124 LinkerOptions +=
",CASE=MIXED";
125 LinkerOptions +=
",REUS=RENT";
127 CmdArgs.push_back(
"-b");
128 CmdArgs.push_back(Args.MakeArgString(LinkerOptions));
131 CmdArgs.push_back(
"-e");
132 CmdArgs.push_back(
"CELQSTRT");
134 CmdArgs.push_back(
"-O");
135 CmdArgs.push_back(
"CELQSTRT");
137 CmdArgs.push_back(
"-u");
138 CmdArgs.push_back(
"CELQMAIN");
146 size_t Suffix = OutputName.find_last_of(
'.');
147 const char *SideDeckName =
148 Args.MakeArgString(OutputName.substr(0, Suffix) +
".x");
149 CmdArgs.push_back(
"-x");
150 CmdArgs.push_back(SideDeckName);
155 CmdArgs.push_back(
"-x");
156 CmdArgs.push_back(
"/dev/null");
160 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_u});
174 StringRef ld_env_var = StringRef(getenv(
"_LD_SYSLIB")).trim();
175 if (ld_env_var.empty()) {
176 CmdArgs.push_back(
"-S");
177 CmdArgs.push_back(Args.MakeArgString(
"//'" + LEHLQ +
".SCEEBND2'"));
178 CmdArgs.push_back(
"-S");
179 CmdArgs.push_back(Args.MakeArgString(
"//'" + CsslibHLQ +
".CSSLIB'"));
182 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
183 ld_env_var = StringRef(getenv(
"_LD_SIDE_DECKS")).trim();
184 if (ld_env_var.empty()) {
186 Args.MakeArgString(
"//'" + LEHLQ +
".SCEELIB(CELQS001)'"));
188 Args.MakeArgString(
"//'" + LEHLQ +
".SCEELIB(CELQS003)'"));
191 ld_env_var.split(ld_side_deck,
":");
192 for (StringRef ld_loc : ld_side_deck) {
193 CmdArgs.push_back((ld_loc.str()).c_str());
203 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
208 Exec, CmdArgs, Inputs));
220 llvm::opt::ArgStringList &CmdArgs)
const {
223 llvm::report_fatal_error(
"linking libstdc++ is unimplemented on z/OS");
228 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXE)'"));
230 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXS)'"));
232 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXP)'"));
234 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQCXA)'"));
236 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQXLA)'"));
238 Args.MakeArgString(
"//'" + ClangHLQ +
".SCEELIB(CRTDQUNW)'"));
248 ArgStringList &CC1Args)
const {
249 if (DriverArgs.hasArg(options::OPT_nostdinc))
260 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
262 path::append(
P,
"include",
"zos_wrappers");
267 path::append(P2,
"include");
272 if (Arg *SysIncludeArg =
273 DriverArgs.getLastArg(options::OPT_mzos_sys_include_EQ)) {
274 StringRef SysInclude = SysIncludeArg->getValue();
277 if (!SysInclude.empty()) {
281 StringRef PathLE(SysInclude);
282 size_t Colon = PathLE.find(
':');
283 if (Colon == StringRef::npos) {
288 while (Colon != StringRef::npos) {
291 PathLE = PathLE.substr(Colon + 1);
292 Colon = PathLE.find(
':');
305 const llvm::opt::ArgList &DriverArgs,
306 llvm::opt::ArgStringList &CC1Args)
const {
307 if (!
getVFS().exists(Path)) {
308 if (DriverArgs.hasArg(options::OPT_v))
309 WithColor::warning(errs(),
"Clang")
310 <<
"ignoring nonexistent directory \"" << Path <<
"\"\n";
311 if (!DriverArgs.hasArg(options::OPT__HASH_HASH_HASH))
318 const llvm::opt::ArgList &DriverArgs,
319 llvm::opt::ArgStringList &CC1Args)
const {
320 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
321 DriverArgs.hasArg(options::OPT_nostdincxx) ||
322 DriverArgs.hasArg(options::OPT_nostdlibinc))
329 llvm::StringRef(
getDriver().getInstalledDir());
330 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
335 llvm::report_fatal_error(
336 "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...
std::string ResourceDir
The path to the compiler resource directory.
YAML serialization mapping.
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.