15#include "llvm/ADT/StringExtras.h"
16#include "llvm/Option/ArgList.h"
17#include "llvm/ProfileData/InstrProf.h"
18#include "llvm/Support/Path.h"
26using namespace llvm::sys;
32 const char *LinkingOutput)
const {
34 ArgStringList CmdArgs;
39 if (!IsArch32Bit && !IsArch64Bit)
40 llvm_unreachable(
"Unsupported bit width value.");
42 if (Arg *A =
C.getArgs().getLastArg(options::OPT_G)) {
43 D.
Diag(diag::err_drv_unsupported_opt_for_target)
49 CmdArgs.push_back(
"-a32");
52 CmdArgs.push_back(
"-a64");
59 CmdArgs.push_back(
"-many");
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));
88 for (
size_t i = 0, Size = CmdArgs.size(); i < Size; ++i) {
89 llvm::StringRef ArgString(CmdArgs[i]);
91 if (ArgString.startswith(
"-bE:") || ArgString.startswith(
"-bexport:") ||
92 ArgString ==
"-bexpall" || ArgString ==
"-bexpfull")
96 if (ArgString ==
"-b" && i + 1 < Size) {
98 llvm::StringRef ArgNextString(CmdArgs[i]);
99 if (ArgNextString.startswith(
"E:") ||
100 ArgNextString.startswith(
"export:") || ArgNextString ==
"expall" ||
101 ArgNextString ==
"expfull")
111 const char *LinkingOutput)
const {
114 ArgStringList CmdArgs;
119 if (!(IsArch32Bit || IsArch64Bit))
120 llvm_unreachable(
"Unsupported bit width value.");
122 if (Arg *A =
C.getArgs().getLastArg(options::OPT_G)) {
123 D.
Diag(diag::err_drv_unsupported_opt_for_target)
128 if (Args.hasArg(options::OPT_static))
129 CmdArgs.push_back(
"-bnso");
132 if (Args.hasArg(options::OPT_shared)) {
133 CmdArgs.push_back(
"-bM:SRE");
134 CmdArgs.push_back(
"-bnoentry");
137 if (Args.hasFlag(options::OPT_mxcoff_roptr, options::OPT_mno_xcoff_roptr,
139 if (Args.hasArg(options::OPT_shared))
140 D.
Diag(diag::err_roptr_cannot_build_shared);
145 CmdArgs.push_back(
"-bforceimprw");
151 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
153 Args.hasFlag(options::OPT_fprofile_generate,
154 options::OPT_fno_profile_generate,
false) ||
155 Args.hasFlag(options::OPT_fprofile_generate_EQ,
156 options::OPT_fno_profile_generate,
false) ||
157 Args.hasFlag(options::OPT_fprofile_instr_generate,
158 options::OPT_fno_profile_instr_generate,
false) ||
159 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
160 options::OPT_fno_profile_instr_generate,
false) ||
161 Args.hasFlag(options::OPT_fcs_profile_generate,
162 options::OPT_fno_profile_generate,
false) ||
163 Args.hasFlag(options::OPT_fcs_profile_generate_EQ,
164 options::OPT_fno_profile_generate,
false) ||
165 Args.hasArg(options::OPT_fcreate_profile) ||
166 Args.hasArg(options::OPT_coverage))
167 CmdArgs.push_back(
"-bdbg:namedsects:ss");
170 Args.getLastArg(clang::driver::options::OPT_mxcoff_build_id_EQ)) {
171 StringRef BuildId = A->getValue();
172 if (BuildId[0] !=
'0' || BuildId[1] !=
'x' ||
173 BuildId.find_if_not(llvm::isHexDigit, 2) != StringRef::npos)
175 << A->getSpelling() << BuildId;
177 std::string LinkerFlag =
"-bdbg:ldrinfo:xcoff_binary_id:0x";
178 if (BuildId.size() % 2)
180 LinkerFlag += BuildId.drop_front(2).lower();
181 CmdArgs.push_back(Args.MakeArgString(LinkerFlag));
188 CmdArgs.push_back(
"-o");
195 CmdArgs.push_back(
"-b32");
196 CmdArgs.push_back(
"-bpT:0x10000000");
197 CmdArgs.push_back(
"-bpD:0x20000000");
200 CmdArgs.push_back(
"-b64");
201 CmdArgs.push_back(
"-bpT:0x100000000");
202 CmdArgs.push_back(
"-bpD:0x110000000");
205 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
206 options::OPT_shared, options::OPT_r)) {
207 auto getCrt0Basename = [&Args, IsArch32Bit] {
208 if (Arg *A = Args.getLastArgNoClaim(options::OPT_p, options::OPT_pg)) {
210 if (A->getOption().matches(options::OPT_pg))
211 return IsArch32Bit ?
"gcrt0.o" :
"gcrt0_64.o";
213 return IsArch32Bit ?
"mcrt0.o" :
"mcrt0_64.o";
215 return IsArch32Bit ?
"crt0.o" :
"crt0_64.o";
221 CmdArgs.push_back(Args.MakeArgString(
229 CmdArgs.push_back(
"-bcdtors:all:0:s");
235 assert(!Inputs.empty() &&
"Must have at least one input.");
242 const char *CreateExportListExec = Args.MakeArgString(
245 ArgStringList CreateExportCmdArgs;
247 std::string CreateExportListPath =
248 C.getDriver().GetTemporaryPath(
"CreateExportList",
"exp");
249 const char *ExportList =
250 C.addTempFile(
C.getArgs().MakeArgString(CreateExportListPath));
252 for (
const auto &II : Inputs)
254 CreateExportCmdArgs.push_back(II.getFilename());
256 CreateExportCmdArgs.push_back(
"--export-symbols");
257 CreateExportCmdArgs.push_back(
"-X");
259 CreateExportCmdArgs.push_back(
"32");
262 CreateExportCmdArgs.push_back(
"64");
265 auto ExpCommand = std::make_unique<Command>(
267 CreateExportCmdArgs, Inputs, Output);
268 ExpCommand->setRedirectFiles(
269 {std::nullopt, std::string(ExportList), std::nullopt});
270 C.addCommand(std::move(ExpCommand));
271 CmdArgs.push_back(Args.MakeArgString(llvm::Twine(
"-bE:") + ExportList));
275 Args.AddAllArgs(CmdArgs, options::OPT_L);
276 if (!Args.hasArg(options::OPT_r)) {
280 if (getToolChain().ShouldLinkCXXStdlib(Args))
281 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
283 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
287 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
288 options::OPT_fno_openmp,
false)) {
291 CmdArgs.push_back(
"-lomp");
294 CmdArgs.push_back(
"-liomp5");
297 CmdArgs.push_back(
"-lgomp");
306 if (Args.hasArg(options::OPT_pthreads, options::OPT_pthread))
307 CmdArgs.push_back(
"-lpthreads");
310 CmdArgs.push_back(
"-lm");
312 CmdArgs.push_back(
"-lc");
314 if (Args.hasArgNoClaim(options::OPT_p, options::OPT_pg)) {
315 CmdArgs.push_back(Args.MakeArgString((llvm::Twine(
"-L") + D.
SysRoot) +
317 CmdArgs.push_back(Args.MakeArgString((llvm::Twine(
"-L") + D.
SysRoot) +
318 "/usr/lib/profiled"));
325 Exec, CmdArgs, Inputs, Output));
335 ParseInlineAsmUsingAsmParser = Args.hasFlag(
336 options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
true);
343AIX::GetHeaderSysroot(
const llvm::opt::ArgList &DriverArgs)
const {
344 if (DriverArgs.hasArg(options::OPT_isysroot))
345 return DriverArgs.getLastArgValue(options::OPT_isysroot);
352 ArgStringList &CC1Args)
const {
354 if (DriverArgs.hasArg(options::OPT_nostdinc))
357 llvm::StringRef Sysroot = GetHeaderSysroot(DriverArgs);
360 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
363 path::append(
P,
"include",
"ppc_wrappers");
370 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
375 path::append(UP,
"/usr/include");
380 const llvm::opt::ArgList &DriverArgs,
381 llvm::opt::ArgStringList &CC1Args)
const {
383 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
384 DriverArgs.hasArg(options::OPT_nostdincxx) ||
385 DriverArgs.hasArg(options::OPT_nostdlibinc))
390 llvm::report_fatal_error(
391 "picking up libstdc++ headers is unimplemented on AIX");
393 llvm::StringRef Sysroot = GetHeaderSysroot(DriverArgs);
395 llvm::sys::path::append(PathCPP,
"opt/IBM/openxlCSDK",
"include",
"c++",
400 CC1Args.push_back(
"-D__LIBC_NO_CPP_MATH_OVERLOADS__");
405 llvm_unreachable(
"Unexpected C++ library type; only libc++ is supported.");
409 llvm::opt::ArgStringList &CmdArgs)
const {
412 llvm::report_fatal_error(
"linking libstdc++ unimplemented on AIX");
414 CmdArgs.push_back(
"-lc++");
415 if (Args.hasArg(options::OPT_fexperimental_library))
416 CmdArgs.push_back(
"-lc++experimental");
417 CmdArgs.push_back(
"-lc++abi");
421 llvm_unreachable(
"Unexpected C++ library type; only libc++ is supported.");
425 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1Args,
427 Args.AddLastArg(CC1Args, options::OPT_mignore_xcoff_visibility);
428 Args.AddLastArg(CC1Args, options::OPT_mdefault_visibility_export_mapping_EQ);
429 Args.addOptInFlag(CC1Args, options::OPT_mxcoff_roptr, options::OPT_mno_xcoff_roptr);
431 if (Args.hasFlag(options::OPT_fxl_pragma_pack,
432 options::OPT_fno_xl_pragma_pack,
true))
433 CC1Args.push_back(
"-fxl-pragma-pack");
437 llvm::opt::ArgStringList &CmdArgs)
const {
441 CmdArgs.push_back(Args.MakeArgString(
442 Twine(
"-u", llvm::getInstrProfRuntimeHookVarName())));
445 Args.getLastArgNoClaim(options::OPT_fprofile_update_EQ)) {
446 StringRef Val = A->getValue();
447 if (Val ==
"atomic" || Val ==
"prefer-atomic")
448 CmdArgs.push_back(
"-latomic");
static bool hasExportListLinkerOpts(const ArgStringList &CmdArgs)
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 SysRoot
sysroot, if present
OpenMPRuntimeKind getOpenMPRuntime(const llvm::opt::ArgList &Args) const
Compute the desired OpenMP runtime from the flags provided.
DiagnosticBuilder Diag(unsigned DiagID) const
std::string ClangExecutable
The original path to the clang executable.
LTOKind getLTOMode(bool IsOffload=false) const
Get the specific kind of LTO being performed.
std::string ResourceDir
The path to the compiler resource directory.
bool isUsingLTO(bool IsOffload=false) const
Returns true if we are performing any kind of LTO.
@ OMPRT_IOMP5
The legacy name for the LLVM OpenMP runtime from when it was the Intel OpenMP runtime.
@ OMPRT_OMP
The LLVM OpenMP runtime.
@ OMPRT_Unknown
An unknown OpenMP runtime.
@ OMPRT_GOMP
The GNU OpenMP runtime.
std::string getTargetTriple() const
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
@ C
Languages that the frontend can parse and compile.
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.