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::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
334 llvm::report_fatal_error(
335 "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.
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.