28#include "clang/Config/config.h" 
   39#include "llvm/ADT/STLExtras.h" 
   40#include "llvm/ADT/SmallSet.h" 
   41#include "llvm/ADT/SmallString.h" 
   42#include "llvm/ADT/StringExtras.h" 
   43#include "llvm/ADT/StringSwitch.h" 
   44#include "llvm/ADT/Twine.h" 
   45#include "llvm/BinaryFormat/Magic.h" 
   46#include "llvm/Config/llvm-config.h" 
   47#include "llvm/Option/Arg.h" 
   48#include "llvm/Option/ArgList.h" 
   49#include "llvm/Option/Option.h" 
   50#include "llvm/Support/CodeGen.h" 
   51#include "llvm/Support/Compression.h" 
   52#include "llvm/Support/ErrorHandling.h" 
   53#include "llvm/Support/FileSystem.h" 
   54#include "llvm/Support/Path.h" 
   55#include "llvm/Support/Process.h" 
   56#include "llvm/Support/Program.h" 
   57#include "llvm/Support/Threading.h" 
   58#include "llvm/Support/VirtualFileSystem.h" 
   59#include "llvm/Support/YAMLParser.h" 
   60#include "llvm/TargetParser/Host.h" 
   61#include "llvm/TargetParser/PPCTargetParser.h" 
   62#include "llvm/TargetParser/TargetParser.h" 
   71                                              const llvm::Triple &Triple) {
 
   72  if (Args.hasArg(clang::driver::options::OPT_pg) &&
 
   73      !Args.hasArg(clang::driver::options::OPT_mfentry))
 
   76  if (Triple.isAndroid())
 
   79  switch (Triple.getArch()) {
 
   80  case llvm::Triple::xcore:
 
   81  case llvm::Triple::wasm32:
 
   82  case llvm::Triple::wasm64:
 
   83  case llvm::Triple::msp430:
 
   87  case llvm::Triple::ppc:
 
   88  case llvm::Triple::ppcle:
 
   89  case llvm::Triple::ppc64:
 
   90  case llvm::Triple::ppc64le:
 
   91  case llvm::Triple::riscv32:
 
   92  case llvm::Triple::riscv64:
 
   93  case llvm::Triple::sparc:
 
   94  case llvm::Triple::sparcel:
 
   95  case llvm::Triple::sparcv9:
 
   96  case llvm::Triple::amdgcn:
 
   97  case llvm::Triple::r600:
 
   98  case llvm::Triple::csky:
 
   99  case llvm::Triple::loongarch32:
 
  100  case llvm::Triple::loongarch64:
 
  101  case llvm::Triple::m68k:
 
  107  if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
 
  111  if (Triple.isOSLinux() || Triple.isOSHurd()) {
 
  112    switch (Triple.getArch()) {
 
  114    case llvm::Triple::arm:
 
  115    case llvm::Triple::armeb:
 
  116    case llvm::Triple::thumb:
 
  117    case llvm::Triple::thumbeb:
 
  118    case llvm::Triple::mips64:
 
  119    case llvm::Triple::mips64el:
 
  120    case llvm::Triple::mips:
 
  121    case llvm::Triple::mipsel:
 
  122    case llvm::Triple::systemz:
 
  123    case llvm::Triple::x86:
 
  124    case llvm::Triple::x86_64:
 
  131  if (Triple.isOSWindows()) {
 
  132    switch (Triple.getArch()) {
 
  133    case llvm::Triple::x86:
 
  135    case llvm::Triple::x86_64:
 
  136      return Triple.isOSBinFormatMachO();
 
  137    case llvm::Triple::arm:
 
  138    case llvm::Triple::thumb:
 
 
  155  if (Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
 
  156      (Triple.isAndroid() && !Triple.isARM()))
 
  159  if ((Triple.isARM() || Triple.isThumb()) && Triple.isOSBinFormatMachO())
 
 
  166  switch (Triple.getArch()) {
 
  169  case llvm::Triple::arm:
 
  170  case llvm::Triple::thumb:
 
  173    return Triple.isOSDarwin();
 
 
  180                                        const llvm::Triple &Triple) {
 
  181  switch (Triple.getArch()) {
 
  184  case llvm::Triple::arm:
 
  185  case llvm::Triple::armeb:
 
  186  case llvm::Triple::thumb:
 
  187  case llvm::Triple::thumbeb:
 
  191    if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
 
  192      StringRef 
V = A->getValue();
 
  197  case llvm::Triple::aarch64:
 
  201    return Triple.isOSWindows();
 
 
  208                                                const llvm::Triple &Triple) {
 
  209  if (Triple.isARM() || Triple.isThumb()) {
 
  213    if (Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
 
  214      StringRef 
V = A->getValue();
 
  215      return V == 
"aapcs+leaf";
 
 
  224                    const llvm::Triple &Triple) {
 
  254      Args.hasFlag(clang::driver::options::OPT_fno_omit_frame_pointer,
 
  255                   clang::driver::options::OPT_fomit_frame_pointer, DefaultFP);
 
  260  bool EnableLeafFP = Args.hasFlag(
 
  261      clang::driver::options::OPT_mno_omit_leaf_frame_pointer,
 
  262      clang::driver::options::OPT_momit_leaf_frame_pointer, DefaultLeafFP);
 
 
  277                               const StringRef PluginOptPrefix) {
 
  278  if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
 
  279    CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
 
  280                                         "-pass-remarks=" + A->getValue()));
 
  282  if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
 
  283    CmdArgs.push_back(Args.MakeArgString(
 
  284        Twine(PluginOptPrefix) + 
"-pass-remarks-missed=" + A->getValue()));
 
  286  if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
 
  287    CmdArgs.push_back(Args.MakeArgString(
 
  288        Twine(PluginOptPrefix) + 
"-pass-remarks-analysis=" + A->getValue()));
 
 
  292                                 const llvm::Triple &Triple,
 
  295                                 const StringRef PluginOptPrefix) {
 
  296  StringRef Format = 
"yaml";
 
  297  if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
 
  298    Format = A->getValue();
 
  302          Args.getLastArg(options::OPT_foptimization_record_file_EQ)) {
 
  305  } 
else if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
 
  312  assert(!F.empty() && 
"Cannot determine remarks output name.");
 
  314  CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
 
  315                                       "opt-remarks-filename=" + F + 
"opt.ld." +
 
  319          Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
 
  320    CmdArgs.push_back(Args.MakeArgString(
 
  321        Twine(PluginOptPrefix) + 
"opt-remarks-passes=" + A->getValue()));
 
  323  CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
 
  324                                       "opt-remarks-format=" + Format.data()));
 
 
  328                                        ArgStringList &CmdArgs,
 
  329                                        const StringRef PluginOptPrefix) {
 
  330  if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
 
  331                   options::OPT_fno_diagnostics_show_hotness, 
false))
 
  332    CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
 
  333                                         "opt-remarks-with-hotness"));
 
  336          Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
 
  338        Args.MakeArgString(Twine(PluginOptPrefix) +
 
  339                           "opt-remarks-hotness-threshold=" + A->getValue()));
 
 
  344                                                 StringRef Processor) {
 
  348  auto GPUKind = 
T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor)
 
  349                              : llvm::AMDGPU::parseArchR600(Processor);
 
  350  auto GPUFeatures = 
T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
 
  351                                  : llvm::AMDGPU::getArchAttrR600(GPUKind);
 
  352  if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
 
  354  return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
 
 
  359  if (D.
getVFS().exists(Path))
 
  360    Paths.push_back(Path.str());
 
 
  364                                      const llvm::Triple &Triple,
 
  366                                      std::vector<StringRef> &Features,
 
  367                                      OptSpecifier Group) {
 
  368  std::set<StringRef> Warned;
 
  369  for (
const Arg *A : Args.filtered(Group)) {
 
  370    StringRef Name = A->getOption().getName();
 
  374    assert(Name.starts_with(
"m") && 
"Invalid feature name.");
 
  375    Name = Name.substr(1);
 
  379      if (Warned.count(Name) == 0) {
 
  381            clang::diag::warn_drv_unsupported_option_for_processor)
 
  382            << A->getAsString(Args) << Proc;
 
  388    bool IsNegative = Name.consume_front(
"no-");
 
  390    Features.push_back(Args.MakeArgString((IsNegative ? 
"-" : 
"+") + Name));
 
  398  llvm::DenseSet<StringRef> UsedFeatures;
 
  399  for (StringRef 
Feature : llvm::reverse(Features)) {
 
  400    if (UsedFeatures.insert(
Feature.drop_front()).second)
 
  401      UnifiedFeatures.insert(UnifiedFeatures.begin(), 
Feature);
 
  404  return UnifiedFeatures;
 
 
  408                             const char *ArgName, 
const char *EnvVar) {
 
  409  const char *DirList = ::getenv(EnvVar);
 
  410  bool CombinedArg = 
false;
 
  415  StringRef Name(ArgName);
 
  416  if (Name == 
"-I" || Name == 
"-L" || Name.empty())
 
  419  StringRef Dirs(DirList);
 
  423  StringRef::size_type Delim;
 
  424  while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
 
  427        CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + 
"."));
 
  429        CmdArgs.push_back(ArgName);
 
  430        CmdArgs.push_back(
".");
 
  435            Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
 
  437        CmdArgs.push_back(ArgName);
 
  438        CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
 
  441    Dirs = Dirs.substr(Delim + 1);
 
  446      CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + 
"."));
 
  448      CmdArgs.push_back(ArgName);
 
  449      CmdArgs.push_back(
".");
 
  453      CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
 
  455      CmdArgs.push_back(ArgName);
 
  456      CmdArgs.push_back(Args.MakeArgString(Dirs));
 
  462                            const ArgList &Args, ArgStringList &CmdArgs,
 
  468  Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
 
  475  for (
const auto &II : Inputs) {
 
  479    if (
auto *IA = II.getAction())
 
  489    if (II.isFilename()) {
 
  490      CmdArgs.push_back(II.getFilename());
 
  499    const Arg &A = II.getInputArg();
 
  502    if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
 
  504    else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
 
  507    else if (A.getOption().matches(options::OPT_rpath) &&
 
  511      A.renderAsInput(Args, CmdArgs);
 
  513  if (
const Arg *A = Args.getLastArg(options::OPT_fveclib)) {
 
  514    const llvm::Triple &Triple = TC.
getTriple();
 
  515    StringRef 
V = A->getValue();
 
  516    if (
V == 
"ArmPL" && (Triple.isOSLinux() || Triple.isOSDarwin())) {
 
  534      if (Triple.isOSLinux()) {
 
  535        CmdArgs.push_back(Args.MakeArgString(
"--push-state"));
 
  536        CmdArgs.push_back(Args.MakeArgString(
"--as-needed"));
 
  538      if (!Args.hasArg(options::OPT_nostdlib))
 
  539        CmdArgs.push_back(Args.MakeArgString(
"-lm"));
 
  540      CmdArgs.push_back(Args.MakeArgString(
"-lamath"));
 
  541      if (!Args.hasArg(options::OPT_nostdlib))
 
  542        CmdArgs.push_back(Args.MakeArgString(
"-lm"));
 
  543      if (Triple.isOSLinux())
 
  544        CmdArgs.push_back(Args.MakeArgString(
"--pop-state"));
 
  551  switch (
T.getArch()) {
 
  552  case llvm::Triple::x86:
 
  556  case llvm::Triple::aarch64:
 
  557    if (
T.isOSManagarm())
 
  558      return "aarch64managarm";
 
  561    return "aarch64linux";
 
  562  case llvm::Triple::aarch64_be:
 
  564      return "aarch64elfb";
 
  565    return "aarch64linuxb";
 
  566  case llvm::Triple::arm:
 
  567  case llvm::Triple::thumb:
 
  568  case llvm::Triple::armeb:
 
  569  case llvm::Triple::thumbeb: {
 
  572      return IsBigEndian ? 
"armelfb" : 
"armelf";
 
  573    return IsBigEndian ? 
"armelfb_linux_eabi" : 
"armelf_linux_eabi";
 
  575  case llvm::Triple::m68k:
 
  577  case llvm::Triple::ppc:
 
  579      return "elf32ppclinux";
 
  581  case llvm::Triple::ppcle:
 
  583      return "elf32lppclinux";
 
  585  case llvm::Triple::ppc64:
 
  587  case llvm::Triple::ppc64le:
 
  589  case llvm::Triple::riscv32:
 
  590    return "elf32lriscv";
 
  591  case llvm::Triple::riscv64:
 
  592    return "elf64lriscv";
 
  593  case llvm::Triple::sparc:
 
  594  case llvm::Triple::sparcel:
 
  595    return "elf32_sparc";
 
  596  case llvm::Triple::sparcv9:
 
  597    return "elf64_sparc";
 
  598  case llvm::Triple::loongarch32:
 
  599    return "elf32loongarch";
 
  600  case llvm::Triple::loongarch64:
 
  601    return "elf64loongarch";
 
  602  case llvm::Triple::mips:
 
  603    return "elf32btsmip";
 
  604  case llvm::Triple::mipsel:
 
  605    return "elf32ltsmip";
 
  606  case llvm::Triple::mips64:
 
  608      return "elf32btsmipn32";
 
  609    return "elf64btsmip";
 
  610  case llvm::Triple::mips64el:
 
  612      return "elf32ltsmipn32";
 
  613    return "elf64ltsmip";
 
  614  case llvm::Triple::systemz:
 
  616  case llvm::Triple::x86_64:
 
  618      return "elf32_x86_64";
 
  620  case llvm::Triple::ve:
 
  622  case llvm::Triple::csky:
 
  623    return "cskyelf_linux";
 
  630    const ToolChain &TC, 
const llvm::opt::ArgList &Args,
 
  631    llvm::opt::ArgStringList &CmdArgs) {
 
  637  if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
 
  638    StringRef 
V = A->getValue();
 
  639    if (
V == 
"none" || 
V == 
"zlib" || 
V == 
"zstd")
 
  640      CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" + 
V));
 
  642      TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
 
  643          << A->getSpelling() << 
V;
 
 
  648                             std::vector<StringRef> &Features,
 
  649                             OptSpecifier OnOpt, OptSpecifier OffOpt,
 
  650                             StringRef FeatureName) {
 
  651  if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
 
  652    if (A->getOption().matches(OnOpt))
 
  653      Features.push_back(Args.MakeArgString(
"+" + FeatureName));
 
  655      Features.push_back(Args.MakeArgString(
"-" + FeatureName));
 
  661                                      const ArgList &Args) {
 
  662  Arg *MArch = Args.getLastArg(options::OPT_march_EQ);
 
  663  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
 
  665    return llvm::StringSwitch<std::string>(GPUName)
 
  666        .Cases({
"rv630", 
"rv635"}, 
"r600")
 
  667        .Cases({
"rv610", 
"rv620", 
"rs780"}, 
"rs880")
 
  668        .Case(
"rv740", 
"rv770")
 
  669        .Case(
"palm", 
"cedar")
 
  670        .Cases({
"sumo", 
"sumo2"}, 
"sumo")
 
  671        .Case(
"hemlock", 
"cypress")
 
  672        .Case(
"aruba", 
"cayman")
 
  673        .Default(GPUName.str());
 
 
  681  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
 
  682    return A->getValue();
 
 
  690  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
 
  691    StringRef CPU = A->getValue();
 
  697      return llvm::sys::getHostCPUName();
 
 
  707                              const llvm::Triple &
T, 
bool FromAs) {
 
  710  switch (
T.getArch()) {
 
  714  case llvm::Triple::aarch64:
 
  715  case llvm::Triple::aarch64_32:
 
  716  case llvm::Triple::aarch64_be:
 
  719  case llvm::Triple::arm:
 
  720  case llvm::Triple::armeb:
 
  721  case llvm::Triple::thumb:
 
  722  case llvm::Triple::thumbeb: {
 
  723    StringRef MArch, MCPU;
 
  728  case llvm::Triple::avr:
 
  729    if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
 
  730      return A->getValue();
 
  733  case llvm::Triple::m68k:
 
  736  case llvm::Triple::mips:
 
  737  case llvm::Triple::mipsel:
 
  738  case llvm::Triple::mips64:
 
  739  case llvm::Triple::mips64el: {
 
  743    return std::string(CPUName);
 
  746  case llvm::Triple::nvptx:
 
  747  case llvm::Triple::nvptx64:
 
  748    if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
 
  749      return A->getValue();
 
  752  case llvm::Triple::ppc:
 
  753  case llvm::Triple::ppcle:
 
  754  case llvm::Triple::ppc64:
 
  755  case llvm::Triple::ppc64le:
 
  756    if (Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ))
 
  758          llvm::PPC::getNormalizedPPCTargetCPU(
T, A->getValue()));
 
  759    return std::string(llvm::PPC::getNormalizedPPCTargetCPU(
T));
 
  761  case llvm::Triple::csky:
 
  762    if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
 
  763      return A->getValue();
 
  764    else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
 
  765      return A->getValue();
 
  768  case llvm::Triple::riscv32:
 
  769  case llvm::Triple::riscv64:
 
  772  case llvm::Triple::bpfel:
 
  773  case llvm::Triple::bpfeb:
 
  774    if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
 
  775      return A->getValue();
 
  778  case llvm::Triple::sparc:
 
  779  case llvm::Triple::sparcel:
 
  780  case llvm::Triple::sparcv9:
 
  783  case llvm::Triple::x86:
 
  784  case llvm::Triple::x86_64:
 
  787  case llvm::Triple::hexagon:
 
  791  case llvm::Triple::lanai:
 
  794  case llvm::Triple::systemz:
 
  797  case llvm::Triple::r600:
 
  798  case llvm::Triple::amdgcn:
 
  801  case llvm::Triple::wasm32:
 
  802  case llvm::Triple::wasm64:
 
  805  case llvm::Triple::loongarch32:
 
  806  case llvm::Triple::loongarch64:
 
  809  case llvm::Triple::xtensa:
 
  810    if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
 
  811      return A->getValue();
 
  817                                         const llvm::Triple &Triple,
 
  819                                         std::vector<StringRef> &Features) {
 
  821                            options::OPT_m_wasm_Features_Group);
 
 
  825                              const ArgList &Args, ArgStringList &CmdArgs,
 
  826                              bool ForAS, 
bool IsAux) {
 
  827  std::vector<StringRef> Features;
 
  828  switch (Triple.getArch()) {
 
  831  case llvm::Triple::mips:
 
  832  case llvm::Triple::mipsel:
 
  833  case llvm::Triple::mips64:
 
  834  case llvm::Triple::mips64el:
 
  837  case llvm::Triple::arm:
 
  838  case llvm::Triple::armeb:
 
  839  case llvm::Triple::thumb:
 
  840  case llvm::Triple::thumbeb:
 
  843  case llvm::Triple::ppc:
 
  844  case llvm::Triple::ppcle:
 
  845  case llvm::Triple::ppc64:
 
  846  case llvm::Triple::ppc64le:
 
  849  case llvm::Triple::riscv32:
 
  850  case llvm::Triple::riscv64:
 
  853  case llvm::Triple::systemz:
 
  856  case llvm::Triple::aarch64:
 
  857  case llvm::Triple::aarch64_32:
 
  858  case llvm::Triple::aarch64_be:
 
  861  case llvm::Triple::x86:
 
  862  case llvm::Triple::x86_64:
 
  865  case llvm::Triple::hexagon:
 
  868  case llvm::Triple::wasm32:
 
  869  case llvm::Triple::wasm64:
 
  872  case llvm::Triple::sparc:
 
  873  case llvm::Triple::sparcel:
 
  874  case llvm::Triple::sparcv9:
 
  877  case llvm::Triple::r600:
 
  878  case llvm::Triple::amdgcn:
 
  881  case llvm::Triple::nvptx:
 
  882  case llvm::Triple::nvptx64:
 
  885  case llvm::Triple::m68k:
 
  888  case llvm::Triple::msp430:
 
  891  case llvm::Triple::ve:
 
  894  case llvm::Triple::csky:
 
  897  case llvm::Triple::loongarch32:
 
  898  case llvm::Triple::loongarch64:
 
  904    CmdArgs.push_back(IsAux ? 
"-aux-target-feature" : 
"-target-feature");
 
  905    CmdArgs.push_back(
Feature.data());
 
  910  Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
 
  913  if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
 
  914    D.
Diag(diag::err_drv_invalid_int_value)
 
  915        << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
 
  916  return LtoJobsArg->getValue();
 
  921  return Triple.isPS();
 
 
  925                             const llvm::opt::ArgList &Args) {
 
  927  Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
 
  929    return Triple.hasDefaultTLSDESC();
 
  930  StringRef 
V = A->getValue();
 
  931  bool SupportedArgument = 
false, EnableTLSDESC = 
false;
 
  932  bool Unsupported = !Triple.isOSBinFormatELF();
 
  933  if (Triple.isLoongArch() || Triple.isRISCV()) {
 
  934    SupportedArgument = 
V == 
"desc" || 
V == 
"trad";
 
  935    EnableTLSDESC = 
V == 
"desc";
 
  936  } 
else if (Triple.isX86()) {
 
  937    SupportedArgument = 
V == 
"gnu" || 
V == 
"gnu2";
 
  938    EnableTLSDESC = 
V == 
"gnu2";
 
  943    TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
 
  944        << A->getSpelling() << Triple.getTriple();
 
  945  } 
else if (!SupportedArgument) {
 
  946    TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
 
  947        << A->getSpelling() << 
V << Triple.getTriple();
 
  949  return EnableTLSDESC;
 
 
  953                            llvm::opt::ArgStringList &CmdArgs) {
 
  954  if (Arg *A = Args.getLastArg(options::OPT_fthinlto_distributor_EQ)) {
 
  956        Args.MakeArgString(
"--thinlto-distributor=" + Twine(A->getValue())));
 
  958    CmdArgs.push_back(Args.MakeArgString(
"--thinlto-remote-compiler=" +
 
  961      CmdArgs.push_back(Args.MakeArgString(
 
  962          "--thinlto-remote-compiler-prepend-arg=" + Twine(PA)));
 
  965         Args.getAllArgValues(options::OPT_Xthinlto_distributor_EQ))
 
  966      CmdArgs.push_back(Args.MakeArgString(
"--thinlto-distributor-arg=" + A));
 
  971                          ArgStringList &CmdArgs, 
const InputInfo &Output,
 
  974  const bool IsOSAIX = Triple.isOSAIX();
 
  975  const bool IsAMDGCN = Triple.isAMDGCN();
 
  976  StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ);
 
  979  const bool IsFatLTO = Args.hasFlag(options::OPT_ffat_lto_objects,
 
  980                                     options::OPT_fno_fat_lto_objects, 
false);
 
  981  const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
 
  983  assert(!Inputs.empty() && 
"Must have at least one input.");
 
  985  auto Input = llvm::find_if(
 
  987  if (Input == Inputs.end()) {
 
  990    Input = Inputs.begin();
 
  993  if (Linker != 
"lld" && Linker != 
"lld-link" &&
 
  994      llvm::sys::path::filename(LinkerPath) != 
"ld.lld" &&
 
  995      llvm::sys::path::stem(LinkerPath) != 
"ld.lld" && !Triple.isOSOpenBSD()) {
 
  999    const char *PluginPrefix = IsOSAIX ? 
"-bplugin:" : 
"";
 
 1000    const char *PluginName = IsOSAIX ? 
"/libLTO" : 
"/LLVMgold";
 
 1003      CmdArgs.push_back(
"-plugin");
 
 1006    const char *Suffix = 
".dll";
 
 1007#elif defined(__APPLE__) 
 1008    const char *Suffix = 
".dylib";
 
 1010    const char *Suffix = 
".so";
 
 1014    llvm::sys::path::native(Twine(D.
Dir) +
 
 1015                                "/../" CLANG_INSTALL_LIBDIR_BASENAME +
 
 1016                                PluginName + Suffix,
 
 1018    CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
 
 1023      CmdArgs.push_back(
"--fat-lto-objects");
 
 1025    if (Args.hasArg(options::OPT_flto_partitions_EQ)) {
 
 1027      StringRef A = Args.getLastArgValue(options::OPT_flto_partitions_EQ, 
"8");
 
 1028      if (A.getAsInteger(10, 
Value) || (
Value < 1)) {
 
 1029        Arg *Arg = Args.getLastArg(options::OPT_flto_partitions_EQ);
 
 1030        D.
Diag(diag::err_drv_invalid_int_value)
 
 1031            << Arg->getAsString(Args) << Arg->getValue();
 
 1033      CmdArgs.push_back(Args.MakeArgString(
"--lto-partitions=" + A));
 
 1037  const char *PluginOptPrefix = IsOSAIX ? 
"-bplugin_opt:" : 
"-plugin-opt=";
 
 1038  const char *ExtraDash = IsOSAIX ? 
"-" : 
"";
 
 1039  const char *ParallelismOpt = IsOSAIX ? 
"-threads=" : 
"jobs=";
 
 1044  if (Args.hasArg(options::OPT_gdwarf_aranges)) {
 
 1045    CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
 
 1046                                         "-generate-arange-section"));
 
 1050  Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
 
 1051  if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
 
 1054    std::optional<StringRef> OptVal =
 
 1055        llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
 
 1056            .Case(
"Accelerate", 
"Accelerate")
 
 1057            .Case(
"libmvec", 
"LIBMVEC")
 
 1058            .Case(
"AMDLIBM", 
"AMDLIBM")
 
 1059            .Case(
"MASSV", 
"MASSV")
 
 1060            .Case(
"SVML", 
"SVML")
 
 1061            .Case(
"SLEEF", 
"sleefgnuabi")
 
 1062            .Case(
"Darwin_libsystem_m", 
"Darwin_libsystem_m")
 
 1063            .Case(
"ArmPL", 
"ArmPL")
 
 1064            .Case(
"none", 
"none")
 
 1065            .Default(std::nullopt);
 
 1068      CmdArgs.push_back(Args.MakeArgString(
 
 1069          Twine(PluginOptPrefix) + 
"-vector-library=" + OptVal.value()));
 
 1079        Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash + 
"mcpu=" + CPU));
 
 1081  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
 
 1085    if (A->getOption().matches(options::OPT_O4) ||
 
 1086        A->getOption().matches(options::OPT_Ofast))
 
 1088    else if (A->getOption().matches(options::OPT_O)) {
 
 1089      OOpt = A->getValue();
 
 1092      else if (OOpt == 
"s" || OOpt == 
"z")
 
 1094    } 
else if (A->getOption().matches(options::OPT_O0))
 
 1096    if (!OOpt.empty()) {
 
 1098          Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash + 
"O" + OOpt));
 
 1100        CmdArgs.push_back(Args.MakeArgString(Twine(
"--lto-CGO") + OOpt));
 
 1104  if (Args.hasArg(options::OPT_gsplit_dwarf)) {
 
 1106    if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
 
 1113        Args.MakeArgString(Twine(PluginOptPrefix) + 
"dwo_dir=" + F + 
"dwo"));
 
 1116  if (IsThinLTO && !IsOSAIX)
 
 1117    CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + 
"thinlto"));
 
 1118  else if (IsThinLTO && IsOSAIX)
 
 1119    CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
 
 1124  if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
 
 1125        Args.hasArg(options::OPT_fenable_matrix))
 
 1127        Args.MakeArgString(Twine(PluginOptPrefix) + 
"-enable-matrix"));
 
 1130  if (!Parallelism.empty())
 
 1131    CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
 
 1132                                         ParallelismOpt + Parallelism));
 
 1135  if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
 
 1136                               options::OPT_fno_global_isel)) {
 
 1139    CmdArgs.push_back(Args.MakeArgString(
 
 1140        Twine(PluginOptPrefix) + 
"-global-isel=" +
 
 1141        (A->getOption().matches(options::OPT_fglobal_isel) ? 
"1" : 
"0")));
 
 1146          Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
 
 1147    if (A->getOption().matches(options::OPT_glldb))
 
 1149          Args.MakeArgString(Twine(PluginOptPrefix) + 
"-debugger-tune=lldb"));
 
 1150    else if (A->getOption().matches(options::OPT_gsce))
 
 1152          Args.MakeArgString(Twine(PluginOptPrefix) + 
"-debugger-tune=sce"));
 
 1153    else if (A->getOption().matches(options::OPT_gdbx))
 
 1155          Args.MakeArgString(Twine(PluginOptPrefix) + 
"-debugger-tune=dbx"));
 
 1158          Args.MakeArgString(Twine(PluginOptPrefix) + 
"-debugger-tune=gdb"));
 
 1164          Args.MakeArgString(Twine(PluginOptPrefix) + 
"-no-integrated-as=1"));
 
 1168    Arg *A = Args.getLastArg(options::OPT_g_Group);
 
 1169    bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
 
 1170                           !A->getOption().matches(options::OPT_ggdb0);
 
 1171    if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
 
 1172                                        options::OPT_gno_strict_dwarf, 
true))
 
 1174          Args.MakeArgString(Twine(PluginOptPrefix) + 
"-strict-dwarf=true"));
 
 1176    for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
 
 1177      StringRef 
V = A->getValue();
 
 1178      if (
V == 
"vec-default")
 
 1180      if (
V == 
"vec-extabi") {
 
 1182            Args.MakeArgString(Twine(PluginOptPrefix) + 
"-vec-extabi"));
 
 1188  bool UseSeparateSections =
 
 1191  if (Args.hasFlag(options::OPT_ffunction_sections,
 
 1192                   options::OPT_fno_function_sections, UseSeparateSections))
 
 1194        Args.MakeArgString(Twine(PluginOptPrefix) + 
"-function-sections=1"));
 
 1195  else if (Args.hasArg(options::OPT_fno_function_sections))
 
 1197        Args.MakeArgString(Twine(PluginOptPrefix) + 
"-function-sections=0"));
 
 1199  bool DataSectionsTurnedOff = 
false;
 
 1200  if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
 
 1201                   UseSeparateSections)) {
 
 1203        Args.MakeArgString(Twine(PluginOptPrefix) + 
"-data-sections=1"));
 
 1204  } 
else if (Args.hasArg(options::OPT_fno_data_sections)) {
 
 1205    DataSectionsTurnedOff = 
true;
 
 1207        Args.MakeArgString(Twine(PluginOptPrefix) + 
"-data-sections=0"));
 
 1210  if (Args.hasArg(options::OPT_mxcoff_roptr) ||
 
 1211      Args.hasArg(options::OPT_mno_xcoff_roptr)) {
 
 1212    bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
 
 1213                                 options::OPT_mno_xcoff_roptr, 
false);
 
 1214    StringRef OptStr = HasRoptr ? 
"-mxcoff-roptr" : 
"-mno-xcoff-roptr";
 
 1216      D.
Diag(diag::err_drv_unsupported_opt_for_target)
 
 1217          << OptStr << Triple.str();
 
 1223      if (DataSectionsTurnedOff)
 
 1224        D.
Diag(diag::err_roptr_requires_data_sections);
 
 1227          Args.MakeArgString(Twine(PluginOptPrefix) + 
"-mxcoff-roptr"));
 
 1232  if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
 
 1233                                options::OPT_fno_split_machine_functions)) {
 
 1234    if (A->getOption().matches(options::OPT_fsplit_machine_functions))
 
 1235      CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
 
 1236                                           "-split-machine-functions"));
 
 1240    StringRef FName = A->getValue();
 
 1241    if (!llvm::sys::fs::exists(FName))
 
 1242      D.
Diag(diag::err_drv_no_such_file) << FName;
 
 1244      CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
 
 1245                                           "sample-profile=" + FName));
 
 1249    CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
 
 1250                                         "cs-profile-generate"));
 
 1251    if (CSPGOGenerateArg->getOption().matches(
 
 1252            options::OPT_fcs_profile_generate_EQ)) {
 
 1254      llvm::sys::path::append(Path, 
"default_%m.profraw");
 
 1255      CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
 
 1256                                           "cs-profile-path=" + Path));
 
 1259          Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
 
 1260                             "cs-profile-path=default_%m.profraw"));
 
 1263        ProfileUseArg->getNumValues() == 0 ? 
"" : ProfileUseArg->getValue());
 
 1264    if (Path.empty() || llvm::sys::fs::is_directory(Path))
 
 1265      llvm::sys::path::append(Path, 
"default.profdata");
 
 1266    CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
 
 1267                                         "cs-profile-path=" + Path));
 
 1271  if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc, 
false)) {
 
 1273      CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
 
 1274                                           "-enable-jmc-instrument"));
 
 1276      D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
 
 1279  if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
 
 1280                   Triple.hasDefaultEmulatedTLS())) {
 
 1282        Args.MakeArgString(Twine(PluginOptPrefix) + 
"-emulated-tls"));
 
 1286        Args.MakeArgString(Twine(PluginOptPrefix) + 
"-enable-tlsdesc"));
 
 1288  if (Args.hasFlag(options::OPT_fstack_size_section,
 
 1289                   options::OPT_fno_stack_size_section, 
false))
 
 1291        Args.MakeArgString(Twine(PluginOptPrefix) + 
"-stack-size-section"));
 
 1293  if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
 
 1294                   options::OPT_fno_experimental_call_graph_section, 
false))
 
 1296        Args.MakeArgString(Twine(PluginOptPrefix) + 
"-call-graph-section"));
 
 1300  if (!StatsFile.empty())
 
 1302        Args.MakeArgString(Twine(PluginOptPrefix) + 
"stats-file=" + StatsFile));
 
 1305  if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
 
 1306    CmdArgs.push_back(Args.MakeArgString(
 
 1307        Twine(PluginOptPrefix) + 
"-crash-diagnostics-dir=" + A->getValue()));
 
 1318                         Output, PluginOptPrefix);
 
 1324                         true, PluginOptPrefix);
 
 1326  bool IsELF = Triple.isOSBinFormatELF();
 
 1328  bool ImplicitMapSyms = 
false;
 
 1329  for (
const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
 
 1330    for (StringRef 
V : A->getValues()) {
 
 1331      auto Equal = 
V.split(
'=');
 
 1332      auto checkArg = [&](
bool ValidTarget,
 
 1333                          std::initializer_list<const char *> 
Set) {
 
 1335          D.
Diag(diag::err_drv_unsupported_opt_for_target)
 
 1336              << (Twine(
"-Wa,") + 
Equal.first + 
"=").str()
 
 1337              << Triple.getTriple();
 
 1338        } 
else if (!llvm::is_contained(
Set, 
Equal.second)) {
 
 1339          D.
Diag(diag::err_drv_unsupported_option_argument)
 
 1340              << (Twine(
"-Wa,") + 
Equal.first + 
"=").str() << 
Equal.second;
 
 1343      if (
Equal.first == 
"-mmapsyms") {
 
 1344        ImplicitMapSyms = 
Equal.second == 
"implicit";
 
 1345        checkArg(IsELF && Triple.isAArch64(), {
"default", 
"implicit"});
 
 1346      } 
else if (
V == 
"--crel")
 
 1348      else if (
V == 
"--no-crel")
 
 1356    if (IsELF && !Triple.isMIPS()) {
 
 1357      CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + 
"-crel"));
 
 1359      D.
Diag(diag::err_drv_unsupported_opt_for_target)
 
 1363  if (ImplicitMapSyms)
 
 1365        Args.MakeArgString(Twine(PluginOptPrefix) + 
"-implicit-mapsyms"));
 
 1367  if (Args.hasArg(options::OPT_ftime_report))
 
 1369        Args.MakeArgString(Twine(PluginOptPrefix) + 
"-time-passes"));
 
 1375                                        const ArgList &Args,
 
 1376                                        ArgStringList &CmdArgs) {
 
 1381  llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
 
 1382  CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
 
 1386                                 ArgStringList &CmdArgs) {
 
 1387  if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
 
 1388                    options::OPT_fno_rtlib_add_rpath, 
false))
 
 1396    CandidateRPaths.emplace_back(*CandidateRPath);
 
 1398  for (
const auto &CandidateRPath : CandidateRPaths) {
 
 1399    if (TC.
getVFS().exists(CandidateRPath)) {
 
 1400      CmdArgs.push_back(
"-rpath");
 
 1401      CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
 
 1407                             const ToolChain &TC, 
const ArgList &Args,
 
 1408                             bool ForceStaticHostRuntime, 
bool IsOffloadingHost,
 
 1410  if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
 
 1411                    options::OPT_fno_openmp, 
false)) {
 
 1413    if (Args.hasFlag(options::OPT_foffload_via_llvm,
 
 1414                     options::OPT_fno_offload_via_llvm, 
false))
 
 1415      CmdArgs.push_back(
"-lomptarget");
 
 1425  if (ForceStaticHostRuntime)
 
 1426    CmdArgs.push_back(
"-Bstatic");
 
 1430    CmdArgs.push_back(
"-lomp");
 
 1433    CmdArgs.push_back(
"-lgomp");
 
 1436    CmdArgs.push_back(
"-liomp5");
 
 1442  if (ForceStaticHostRuntime)
 
 1443    CmdArgs.push_back(
"-Bdynamic");
 
 1446      CmdArgs.push_back(
"-lrt");
 
 1448  if (IsOffloadingHost)
 
 1449    CmdArgs.push_back(
"-lomptarget");
 
 1460                                        const llvm::opt::ArgList &Args,
 
 1461                                        llvm::opt::ArgStringList &CmdArgs) {
 
 1467  constexpr llvm::StringLiteral Targets(
"--offload-targets=");
 
 1471  std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples),
 
 1472                 [](
auto TC) { return TC.second->getTripleString(); });
 
 1474      Args.MakeArgString(Twine(Targets) + llvm::join(Triples, 
",")));
 
 
 1478                                ArgStringList &CmdArgs, StringRef Sanitizer,
 
 1479                                bool IsShared, 
bool IsWhole) {
 
 1482  if (IsWhole) CmdArgs.push_back(
"--whole-archive");
 
 1485  if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
 
 
 1495                                    ArgStringList &CmdArgs,
 
 1496                                    StringRef Sanitizer) {
 
 1501  if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
 
 1504  if (llvm::sys::fs::exists(SanRT + 
".syms")) {
 
 1505    CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT + 
".syms"));
 
 
 1512                              const llvm::opt::ArgList &Args,
 
 1513                              llvm::opt::ArgStringList &CmdArgs,
 
 1516         "AIX linker does not support any form of --as-needed option yet.");
 
 1524  if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
 
 1525    CmdArgs.push_back(
"-z");
 
 1526    CmdArgs.push_back(as_needed ? 
"ignore" : 
"record");
 
 1528    CmdArgs.push_back(as_needed ? 
"--as-needed" : 
"--no-as-needed");
 
 
 1533                                     const llvm::opt::ArgList &Args,
 
 1534                                     ArgStringList &CmdArgs) {
 
 1539  if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
 
 1541    CmdArgs.push_back(
"-lpthread");
 
 1543      CmdArgs.push_back(
"-lrt");
 
 1545  CmdArgs.push_back(
"-lm");
 
 1550      TC.
getTriple().getOS() != llvm::Triple::RTEMS)
 
 1551    CmdArgs.push_back(
"-ldl");
 
 1555    CmdArgs.push_back(
"-lexecinfo");
 
 1557    CmdArgs.push_back(
"-lbsd");
 
 1563    CmdArgs.push_back(
"-lresolv");
 
 1573  assert(!TC.
getTriple().isOSDarwin() && 
"it's not used by Darwin");
 
 1578      SharedRuntimes.push_back(
"asan");
 
 1579      if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
 
 1580        HelperStaticRuntimes.push_back(
"asan-preinit");
 
 1583      SharedRuntimes.push_back(
"memprof");
 
 1584      if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
 
 1585        HelperStaticRuntimes.push_back(
"memprof-preinit");
 
 1588      SharedRuntimes.push_back(
"nsan");
 
 1591        SharedRuntimes.push_back(
"ubsan_minimal");
 
 1593        SharedRuntimes.push_back(
"ubsan_standalone");
 
 1596      SharedRuntimes.push_back(
"scudo_standalone");
 
 1599      SharedRuntimes.push_back(
"tsan");
 
 1601      SharedRuntimes.push_back(
"tysan");
 
 1604        SharedRuntimes.push_back(
"hwasan_aliases");
 
 1606        SharedRuntimes.push_back(
"hwasan");
 
 1607      if (!Args.hasArg(options::OPT_shared))
 
 1608        HelperStaticRuntimes.push_back(
"hwasan-preinit");
 
 1611      SharedRuntimes.push_back(
"rtsan");
 
 1616    StaticRuntimes.push_back(
"stats_client");
 
 1620    HelperStaticRuntimes.push_back(
"asan_static");
 
 1623  if (Args.hasArg(options::OPT_shared)) {
 
 1632    StaticRuntimes.push_back(
"asan");
 
 1634      StaticRuntimes.push_back(
"asan_cxx");
 
 1639    StaticRuntimes.push_back(
"rtsan");
 
 1642    StaticRuntimes.push_back(
"memprof");
 
 1644      StaticRuntimes.push_back(
"memprof_cxx");
 
 1649      StaticRuntimes.push_back(
"hwasan_aliases");
 
 1651        StaticRuntimes.push_back(
"hwasan_aliases_cxx");
 
 1653      StaticRuntimes.push_back(
"hwasan");
 
 1655        StaticRuntimes.push_back(
"hwasan_cxx");
 
 1659    StaticRuntimes.push_back(
"dfsan");
 
 1661    StaticRuntimes.push_back(
"lsan");
 
 1663    StaticRuntimes.push_back(
"msan");
 
 1665      StaticRuntimes.push_back(
"msan_cxx");
 
 1668    StaticRuntimes.push_back(
"nsan");
 
 1670    StaticRuntimes.push_back(
"tsan");
 
 1672      StaticRuntimes.push_back(
"tsan_cxx");
 
 1675    StaticRuntimes.push_back(
"tysan");
 
 1678      StaticRuntimes.push_back(
"ubsan_minimal");
 
 1680      StaticRuntimes.push_back(
"ubsan_standalone");
 
 1684    NonWholeStaticRuntimes.push_back(
"safestack");
 
 1685    RequiredSymbols.push_back(
"__safestack_init");
 
 1689      StaticRuntimes.push_back(
"cfi");
 
 1691      StaticRuntimes.push_back(
"cfi_diag");
 
 1696    StaticRuntimes.push_back(
"ubsan_standalone_cxx");
 
 1699    NonWholeStaticRuntimes.push_back(
"stats");
 
 1700    RequiredSymbols.push_back(
"__sanitizer_stats_register");
 
 1703    StaticRuntimes.push_back(
"scudo_standalone");
 
 1705      StaticRuntimes.push_back(
"scudo_standalone_cxx");
 
 
 1712                                 ArgStringList &CmdArgs) {
 
 1715      NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
 
 1718                             NonWholeStaticRuntimes, HelperStaticRuntimes,
 
 1723  for (
auto S : RequiredSymbols) {
 
 1724    CmdArgs.push_back(
"-u");
 
 1725    CmdArgs.push_back(Args.MakeArgString(S));
 
 1730      !Args.hasArg(options::OPT_shared)) {
 
 1736    if (!Args.hasArg(clang::driver::options::OPT_nostdlibxx)) {
 
 1737      bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
 
 1738                                 !Args.hasArg(options::OPT_static);
 
 1739      if (OnlyLibstdcxxStatic)
 
 1740        CmdArgs.push_back(
"-Bstatic");
 
 1742      if (OnlyLibstdcxxStatic)
 
 1743        CmdArgs.push_back(
"-Bdynamic");
 
 1747  for (
auto RT : SharedRuntimes)
 
 1749  for (
auto RT : HelperStaticRuntimes)
 
 1751  bool AddExportDynamic = 
false;
 
 1752  for (
auto RT : StaticRuntimes) {
 
 1756  for (
auto RT : NonWholeStaticRuntimes) {
 
 1762  if (AddExportDynamic)
 
 1763    CmdArgs.push_back(
"--export-dynamic");
 
 1766    CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
 
 1770      TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
 
 1771          << 
"-fsanitize=memtag*" << TC.
getTriple().str();
 
 1774        Args.MakeArgString(
"--android-memtag-mode=" + SanArgs.
getMemtagMode()));
 
 1776      CmdArgs.push_back(
"--android-memtag-heap");
 
 1778      CmdArgs.push_back(
"--android-memtag-stack");
 
 1781  return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
 
 1786  if (Args.hasArg(options::OPT_shared)) {
 
 1788      CmdArgs.push_back(
"--whole-archive");
 
 1790      CmdArgs.push_back(
"--no-whole-archive");
 
 1794    CmdArgs.push_back(
"--whole-archive");
 
 1796    for (
const auto &Mode : XRay.
modeList())
 
 1798    CmdArgs.push_back(
"--no-whole-archive");
 
 1806                                const llvm::opt::ArgList &Args,
 
 1807                                ArgStringList &CmdArgs) {
 
 1809  CmdArgs.push_back(
"-lpthread");
 
 1811    CmdArgs.push_back(
"-lrt");
 
 1812  CmdArgs.push_back(
"-lm");
 
 1817    CmdArgs.push_back(
"-ldl");
 
 1822  if (Arg *A = Args.getLastArg(options::OPT_O_Group))
 
 1823    return !A->getOption().matches(options::OPT_O0);
 
 1831  auto AddPostfix = [JA](
auto &F) {
 
 1836  if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
 
 1837    if (StringRef(A->getValue()) == 
"single" && Output.
isFilename())
 
 1841  if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
 
 1844    Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o);
 
 1845    if (FinalOutput && Args.hasArg(options::OPT_c)) {
 
 1846      T = FinalOutput->getValue();
 
 1847      llvm::sys::path::remove_filename(
T);
 
 1848      llvm::sys::path::append(
T,
 
 1849                              llvm::sys::path::stem(FinalOutput->getValue()));
 
 1851      return Args.MakeArgString(
T);
 
 1857  return Args.MakeArgString(
T);
 
 1861                           const JobAction &JA, 
const ArgList &Args,
 
 1862                           const InputInfo &Output, 
const char *OutFile) {
 
 1863  ArgStringList ExtractArgs;
 
 1864  ExtractArgs.push_back(
"--extract-dwo");
 
 1866  ArgStringList StripArgs;
 
 1867  StripArgs.push_back(
"--strip-dwo");
 
 1872  ExtractArgs.push_back(OutFile);
 
 1879  C.addCommand(std::make_unique<Command>(JA, 
T,
 
 1881                                         Exec, ExtractArgs, II, Output));
 
 1884  C.addCommand(std::make_unique<Command>(
 
 1894  Args.ClaimAllArgs(options::OPT_flto_EQ);
 
 1895  Args.ClaimAllArgs(options::OPT_flto);
 
 1896  Args.ClaimAllArgs(options::OPT_fno_lto);
 
 1900  auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
 
 1901                                           options::OPT_fcs_profile_generate_EQ,
 
 1902                                           options::OPT_fno_profile_generate);
 
 1903  if (CSPGOGenerateArg &&
 
 1904      CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
 
 1905    CSPGOGenerateArg = 
nullptr;
 
 1907  return CSPGOGenerateArg;
 
 1911  auto *ProfileUseArg = Args.getLastArg(
 
 1912      options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
 
 1913      options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
 
 1914      options::OPT_fno_profile_instr_use);
 
 1916  if (ProfileUseArg &&
 
 1917      ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
 
 1918    ProfileUseArg = 
nullptr;
 
 1920  return ProfileUseArg;
 
 1924  auto *ProfileSampleUseArg = Args.getLastArg(
 
 1925      options::OPT_fprofile_sample_use_EQ, options::OPT_fno_profile_sample_use);
 
 1927  if (ProfileSampleUseArg && (ProfileSampleUseArg->getOption().matches(
 
 1928                                 options::OPT_fno_profile_sample_use)))
 
 1931  return Args.getLastArg(options::OPT_fprofile_sample_use_EQ);
 
 1936  case llvm::Reloc::Static:
 
 1938  case llvm::Reloc::PIC_:
 
 1940  case llvm::Reloc::DynamicNoPIC:
 
 1941    return "dynamic-no-pic";
 
 1942  case llvm::Reloc::ROPI:
 
 1944  case llvm::Reloc::RWPI:
 
 1946  case llvm::Reloc::ROPI_RWPI:
 
 1949  llvm_unreachable(
"Unknown Reloc::Model kind");
 
 
 1956std::tuple<llvm::Reloc::Model, unsigned, bool>
 
 1964  if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
 
 1966  bool IsPICLevelTwo = PIC;
 
 1969      Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
 
 1972  if (Triple.isAndroid()) {
 
 1973    switch (Triple.getArch()) {
 
 1974    case llvm::Triple::x86:
 
 1975    case llvm::Triple::x86_64:
 
 1977      IsPICLevelTwo = 
true;
 
 1987  if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
 
 1991  if (Triple.isOSOpenBSD()) {
 
 1993    case llvm::Triple::arm:
 
 1994    case llvm::Triple::aarch64:
 
 1995    case llvm::Triple::mips64:
 
 1996    case llvm::Triple::mips64el:
 
 1997    case llvm::Triple::x86:
 
 1998    case llvm::Triple::x86_64:
 
 1999      IsPICLevelTwo = 
false; 
 
 2002    case llvm::Triple::ppc:
 
 2003    case llvm::Triple::sparcv9:
 
 2004      IsPICLevelTwo = 
true; 
 
 2016  Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
 
 2017                                    options::OPT_fpic, options::OPT_fno_pic,
 
 2018                                    options::OPT_fPIE, options::OPT_fno_PIE,
 
 2019                                    options::OPT_fpie, options::OPT_fno_pie);
 
 2020  if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
 
 2021      LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
 
 2022                                    options::OPT_fPIE, options::OPT_fpie)) {
 
 2024        << LastPICArg->getSpelling() << Triple.str();
 
 2025    if (Triple.getArch() == llvm::Triple::x86_64)
 
 2026      return std::make_tuple(llvm::Reloc::PIC_, 2U, 
false);
 
 2027    return std::make_tuple(llvm::Reloc::Static, 0
U, 
false);
 
 2034      Option O = LastPICArg->getOption();
 
 2035      if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
 
 2036          O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
 
 2037        PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
 
 2039            PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
 
 2041            O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
 
 2044        if (EffectiveTriple.isPS()) {
 
 2045          Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
 
 2046          StringRef Model = ModelArg ? ModelArg->getValue() : 
"";
 
 2047          if (Model != 
"kernel") {
 
 2050                << LastPICArg->getSpelling()
 
 2051                << (EffectiveTriple.isPS4() ? 
"PS4" : 
"PS5");
 
 2061  if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
 
 2067      ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
 
 2068       !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
 
 2071  if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
 
 2074    if (!Triple.isOSDarwin())
 
 2076          << A->getSpelling() << Triple.str();
 
 2085    return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U, 
false);
 
 2088  bool EmbeddedPISupported;
 
 2089  switch (Triple.getArch()) {
 
 2090    case llvm::Triple::arm:
 
 2091    case llvm::Triple::armeb:
 
 2092    case llvm::Triple::thumb:
 
 2093    case llvm::Triple::thumbeb:
 
 2094      EmbeddedPISupported = 
true;
 
 2097      EmbeddedPISupported = 
false;
 
 2101  bool ROPI = 
false, RWPI = 
false;
 
 2102  Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
 
 2103  if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
 
 2104    if (!EmbeddedPISupported)
 
 2106          << LastROPIArg->getSpelling() << Triple.str();
 
 2109  Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
 
 2110  if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
 
 2111    if (!EmbeddedPISupported)
 
 2113          << LastRWPIArg->getSpelling() << Triple.str();
 
 2118  if ((ROPI || RWPI) && (PIC || PIE))
 
 2121  if (Triple.isMIPS()) {
 
 2128    if (ABIName == 
"n64")
 
 2131    if(Args.hasArg(options::OPT_mno_abicalls))
 
 2132      return std::make_tuple(llvm::Reloc::Static, 0
U, 
false);
 
 2135    IsPICLevelTwo = 
false;
 
 2139    return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
 
 2141  llvm::Reloc::Model RelocM = llvm::Reloc::Static;
 
 2143    RelocM = llvm::Reloc::ROPI_RWPI;
 
 2145    RelocM = llvm::Reloc::ROPI;
 
 2147    RelocM = llvm::Reloc::RWPI;
 
 2149  return std::make_tuple(RelocM, 0
U, 
false);
 
 2153  bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
 
 2154  if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
 
 2156    const llvm::opt::OptTable &Opts = D.
getOpts();
 
 2157    StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
 
 2158    StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
 
 2159    D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
 
 2161  return HasStaticPIE;
 
 2181                                       const ArgList &Args) {
 
 2182  const Arg *A = Args.getLastArg(options::OPT_falign_functions,
 
 2183                                 options::OPT_falign_functions_EQ,
 
 2184                                 options::OPT_fno_align_functions);
 
 2185  if (!A || A->getOption().matches(options::OPT_fno_align_functions))
 
 2188  if (A->getOption().matches(options::OPT_falign_functions))
 
 2192  if (StringRef(A->getValue()).getAsInteger(10, 
Value) || 
Value > 65536)
 
 2194        << A->getAsString(Args) << A->getValue();
 
 2199    ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
 
 2200  switch (DebugInfoKind) {
 
 2201  case llvm::codegenoptions::DebugDirectivesOnly:
 
 2202    CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
 
 2204  case llvm::codegenoptions::DebugLineTablesOnly:
 
 2205    CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
 
 2207  case llvm::codegenoptions::DebugInfoConstructor:
 
 2208    CmdArgs.push_back(
"-debug-info-kind=constructor");
 
 2210  case llvm::codegenoptions::LimitedDebugInfo:
 
 2211    CmdArgs.push_back(
"-debug-info-kind=limited");
 
 2213  case llvm::codegenoptions::FullDebugInfo:
 
 2214    CmdArgs.push_back(
"-debug-info-kind=standalone");
 
 2216  case llvm::codegenoptions::UnusedTypeInfo:
 
 2217    CmdArgs.push_back(
"-debug-info-kind=unused-types");
 
 2227  assert(A.getOption().matches(options::OPT_gN_Group) &&
 
 2228         "Not a -g option that specifies a debug-info level");
 
 2229  if (A.getOption().matches(options::OPT_g0) ||
 
 2230      A.getOption().matches(options::OPT_ggdb0))
 
 2231    return llvm::codegenoptions::NoDebugInfo;
 
 2232  if (A.getOption().matches(options::OPT_gline_tables_only) ||
 
 2233      A.getOption().matches(options::OPT_ggdb1))
 
 2234    return llvm::codegenoptions::DebugLineTablesOnly;
 
 2235  if (A.getOption().matches(options::OPT_gline_directives_only))
 
 2236    return llvm::codegenoptions::DebugDirectivesOnly;
 
 2237  return llvm::codegenoptions::DebugInfoConstructor;
 
 2241                                         const ArgList &Args) {
 
 2242  const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
 
 2248  if (StringRef(A->getValue()).getAsInteger(10, 
Value) || 
Value > 6 ||
 
 2251        << A->getAsString(Args) << A->getValue();
 
 
 2256  return llvm::StringSwitch<unsigned>(ArgValue)
 
 2257      .Case(
"-gdwarf-2", 2)
 
 2258      .Case(
"-gdwarf-3", 3)
 
 2259      .Case(
"-gdwarf-4", 4)
 
 2260      .Case(
"-gdwarf-5", 5)
 
 2261      .Case(
"-gdwarf-6", 6)
 
 
 2266  return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
 
 2267                         options::OPT_gdwarf_4, options::OPT_gdwarf_5,
 
 2268                         options::OPT_gdwarf_6, options::OPT_gdwarf);
 
 2272                                const llvm::opt::ArgList &Args) {
 
 2277      if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
 
 2278        TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
 
 2279            << GDwarfN->getSpelling() << TC.
getTriple().str();
 
 2281  if (DwarfVersion == 0) {
 
 2283    assert(DwarfVersion && 
"toolchain default DWARF version must be nonzero");
 
 2285  return DwarfVersion;
 
 
 2289                                            const ArgList &Args, Arg *&Arg) {
 
 2290  Arg = Args.getLastArg(options::OPT_gsplit_dwarf, options::OPT_gsplit_dwarf_EQ,
 
 2291                        options::OPT_gno_split_dwarf);
 
 2292  if (!Arg || Arg->getOption().matches(options::OPT_gno_split_dwarf))
 
 2295  if (Arg->getOption().matches(options::OPT_gsplit_dwarf))
 
 2298  StringRef 
Value = Arg->getValue();
 
 2299  if (
Value == 
"split")
 
 2301  if (
Value == 
"single")
 
 2304  D.
Diag(diag::err_drv_unsupported_option_argument)
 
 2305      << Arg->getSpelling() << Arg->getValue();
 
 2311  assert(A && 
"Expected non-nullptr argument.");
 
 2314  D.
Diag(diag::warn_drv_unsupported_debug_info_opt_for_target)
 
 2320                             ArgStringList &CmdArgs) {
 
 2321  llvm::Reloc::Model RelocationModel;
 
 2326  if (RelocationModel != llvm::Reloc::Static)
 
 2327    CmdArgs.push_back(
"-KPIC");
 
 2333  return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, 
false);
 
 2339                                const ArgList &Args) {
 
 2340  if (Args.hasArg(options::OPT_static_libgcc) ||
 
 2341      Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
 
 2345  if (Args.hasArg(options::OPT_shared_libgcc))
 
 
 2364                             ArgStringList &CmdArgs, 
const ArgList &Args) {
 
 2368    CmdArgs.push_back(
"-l:libunwind.a");
 
 2391      CmdArgs.push_back(
"-lgcc_eh");
 
 2393      CmdArgs.push_back(
"-lgcc_s");
 
 2401        CmdArgs.push_back(
"-lunwind");
 
 2403      CmdArgs.push_back(
"-l:libunwind.a");
 
 2406        CmdArgs.push_back(
"-l:libunwind.dll.a");
 
 2408        CmdArgs.push_back(
"-l:libunwind.so");
 
 2412      CmdArgs.push_back(
"-lunwind");
 
 
 2422                      ArgStringList &CmdArgs, 
const ArgList &Args) {
 
 2426    CmdArgs.push_back(
"-lgcc");
 
 2430    CmdArgs.push_back(
"-lgcc");
 
 2434    CmdArgs.push_back(
"--as-needed");
 
 2436    CmdArgs.push_back(
"--no-as-needed");
 
 
 2441                           ArgStringList &CmdArgs, 
const ArgList &Args) {
 
 2452    if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
 
 2455      Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
 
 2456      if (A && A->getValue() != StringRef(
"platform")) {
 
 2457        TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
 
 2458            << A->getValue() << 
"MSVC";
 
 2468  if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
 
 2469      !Args.hasArg(options::OPT_static_pie))
 
 2470    CmdArgs.push_back(
"-ldl");
 
 2477  const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
 
 2483    StringRef SaveStats = A->getValue();
 
 2484    if (SaveStats == 
"obj" && Output.
isFilename()) {
 
 2486      llvm::sys::path::remove_filename(StatsFile);
 
 2487    } 
else if (SaveStats != 
"cwd") {
 
 2488      D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
 
 2492    StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
 
 2493    llvm::sys::path::append(StatsFile, BaseName);
 
 2494    llvm::sys::path::replace_extension(StatsFile, 
"stats");
 
 
 2506  assert(Flag.front() == 
'-');
 
 2508    Flags.push_back(Flag.str());
 
 2510    Flags.push_back((
"!" + Flag.substr(1)).str());
 
 
 2515                                  ArgStringList &CmdArgs, 
bool IsLTO,
 
 2516                                  const StringRef PluginOptPrefix) {
 
 2517  auto addArg = [&, IsLTO](
const Twine &Arg) {
 
 2519      assert(!PluginOptPrefix.empty() && 
"Cannot have empty PluginOptPrefix!");
 
 2520      CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
 
 2522      CmdArgs.push_back(
"-mllvm");
 
 2523      CmdArgs.push_back(Args.MakeArgString(Arg));
 
 2527  if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
 
 2528    addArg(Twine(
"-x86-branches-within-32B-boundaries"));
 
 2530  if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
 
 2531    StringRef 
Value = A->getValue();
 
 2533    if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
 
 2534        !llvm::isPowerOf2_64(Boundary)) {
 
 2535      D.
Diag(diag::err_drv_invalid_argument_to_option)
 
 2536          << 
Value << A->getOption().getName();
 
 2538      addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
 
 2541  if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
 
 2542    std::string AlignBranch;
 
 2543    for (StringRef 
T : A->getValues()) {
 
 2544      if (
T != 
"fused" && 
T != 
"jcc" && 
T != 
"jmp" && 
T != 
"call" &&
 
 2545          T != 
"ret" && 
T != 
"indirect")
 
 2546        D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
 
 2547            << 
T << 
"fused, jcc, jmp, call, ret, indirect";
 
 2548      if (!AlignBranch.empty())
 
 2552    addArg(
"-x86-align-branch=" + Twine(AlignBranch));
 
 2554  if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
 
 2555    StringRef 
Value = A->getValue();
 
 2556    unsigned PrefixSize;
 
 2557    if (
Value.getAsInteger(10, PrefixSize)) {
 
 2558      D.
Diag(diag::err_drv_invalid_argument_to_option)
 
 2559          << 
Value << A->getOption().getName();
 
 2561      addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
 
 2587                      llvm::opt::ArgStringList &CC1Args,
 
 2589                      StringRef Lib, StringRef 
Arch, StringRef 
Target,
 
 2590                      bool isBitCodeSDL) {
 
 2593  std::string LibDeviceLoc = 
"/libdevice";
 
 2594  std::string LibBcPrefix = 
"/libbc-";
 
 2595  std::string LibPrefix = 
"/lib";
 
 2612    for (StringRef 
Base : {LibBcPrefix, LibPrefix}) {
 
 2613      const auto *Ext = 
Base.contains(LibBcPrefix) ? 
".a" : 
".bc";
 
 2615      for (
auto Suffix : {Twine(Lib + 
"-" + 
Arch + 
"-" + 
Target).str(),
 
 2616                          Twine(Lib + 
"-" + 
Arch).str(), Twine(Lib).str()}) {
 
 2617        SDLs.push_back(Twine(LibDeviceLoc + 
Base + Suffix + Ext).str());
 
 2618        SDLs.push_back(Twine(
Base + Suffix + Ext).str());
 
 2628    const auto *Ext = 
".a";
 
 2630    for (
auto Suffix : {Twine(Lib + 
"-" + 
Arch + 
"-" + 
Target).str(),
 
 2631                        Twine(Lib + 
"-" + 
Arch).str()}) {
 
 2632      SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
 
 2633      SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
 
 2644  bool FoundSDL = 
false;
 
 2645  for (
auto LPath : LibraryPaths) {
 
 2646    for (
auto SDL : SDLs) {
 
 2647      auto FullName = Twine(LPath + SDL).str();
 
 2648      if (llvm::sys::fs::exists(FullName)) {
 
 2649        CC1Args.push_back(DriverArgs.MakeArgString(FullName));
 
 
 2666    const InputInfoList &Inputs, 
const llvm::opt::ArgList &DriverArgs,
 
 2667    llvm::opt::ArgStringList &CC1Args,
 
 2669    StringRef 
Arch, StringRef 
Target, 
bool isBitCodeSDL) {
 
 2672  if (isBitCodeSDL && 
Arch.contains(
"nvptx"))
 
 2675  bool FoundAOB = 
false;
 
 2676  std::string ArchiveOfBundles;
 
 2679  bool IsMSVC = Triple.isWindowsMSVCEnvironment();
 
 2680  auto Ext = IsMSVC ? 
".lib" : 
".a";
 
 2681  if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
 
 2682    if (llvm::sys::fs::exists(Lib)) {
 
 2683      ArchiveOfBundles = Lib;
 
 2687    Lib.consume_front(
"-l");
 
 2688    for (
auto LPath : LibraryPaths) {
 
 2689      ArchiveOfBundles.clear();
 
 2690      auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
 
 2691                      : IsMSVC             ? Lib + Ext
 
 2692                                           : 
"lib" + Lib + Ext)
 
 2694      for (
auto Prefix : {
"/libdevice/", 
"/"}) {
 
 2695        auto AOB = Twine(LPath + Prefix + LibFile).str();
 
 2696        if (llvm::sys::fs::exists(AOB)) {
 
 2697          ArchiveOfBundles = AOB;
 
 2710  llvm::file_magic Magic;
 
 2711  auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
 
 2712  if (EC || Magic != llvm::file_magic::archive)
 
 2715  StringRef Prefix = isBitCodeSDL ? 
"libbc-" : 
"lib";
 
 2716  std::string OutputLib =
 
 2722  C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
 
 2726  DeviceTriple += 
'-';
 
 2727  std::string NormalizedTriple = 
T.getToolChain().getTriple().normalize(
 
 2728      llvm::Triple::CanonicalForm::FOUR_IDENT);
 
 2729  DeviceTriple += NormalizedTriple;
 
 2731    DeviceTriple += 
'-';
 
 2735  std::string UnbundleArg(
"-unbundle");
 
 2736  std::string TypeArg(
"-type=a");
 
 2737  std::string InputArg(
"-input=" + ArchiveOfBundles);
 
 2738  std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
 
 2739  std::string OutputArg(
"-output=" + OutputLib);
 
 2741  const char *UBProgram = DriverArgs.MakeArgString(
 
 2742      T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
 
 2744  ArgStringList UBArgs;
 
 2745  UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
 
 2746  UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
 
 2747  UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
 
 2748  UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
 
 2749  UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
 
 2753  std::string AdditionalArgs(
"-allow-missing-bundles");
 
 2754  UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
 
 2759  std::string HipCompatibleArgs(
"-hip-openmp-compatible");
 
 2760  UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
 
 2762  C.addCommand(std::make_unique<Command>(
 
 2764      InputInfo(&JA, 
C.getArgs().MakeArgString(OutputLib))));
 
 2766  CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
 
 
 2773                                       const llvm::opt::ArgList &DriverArgs,
 
 2774                                       llvm::opt::ArgStringList &CC1Args,
 
 2776                                       bool isBitCodeSDL) {
 
 
 2807                                const llvm::opt::ArgList &DriverArgs,
 
 2808                                llvm::opt::ArgStringList &CC1Args,
 
 2810                                bool isBitCodeSDL) {
 
 2814  std::optional<std::string> LibPath =
 
 2815      llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
 
 2818    const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, 
'\0'};
 
 2819    llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
 
 2820    for (StringRef Path : Frags)
 
 2821      LibraryPaths.emplace_back(Path.trim());
 
 2825  for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
 
 2826    LibraryPaths.emplace_back(Search_Dir);
 
 2830  llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
 
 2831  LibraryPaths.emplace_back(DefaultLibPath.c_str());
 
 2834  llvm::SmallSet<std::string, 16> SDLNames;
 
 2835  static const StringRef HostOnlyArchives[] = {
 
 2836      "omp", 
"cudart", 
"m", 
"gcc", 
"gcc_s", 
"pthread", 
"hip_hcc"};
 
 2837  for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
 
 2838    if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
 
 2839      SDLNames.insert(std::string(
"-l") + SDLName);
 
 2843  for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
 
 2850    const StringRef LibFileExt = 
".lib";
 
 2851    if (!llvm::sys::path::has_extension(
FileName) ||
 
 2853            llvm::sys::path::extension(
FileName).drop_front()) ==
 
 2855        llvm::sys::path::extension(
FileName) == LibFileExt)
 
 2856      SDLNames.insert(Input);
 
 2863  for (
auto SDLName : SDLNames) {
 
 
 2874static llvm::opt::Arg *
 
 2876  return Args.getLastArg(options::OPT_mcode_object_version_EQ);
 
 
 2880                                         const llvm::opt::ArgList &Args) {
 
 2881  const unsigned MinCodeObjVer = 4;
 
 2882  const unsigned MaxCodeObjVer = 6;
 
 2885    if (CodeObjArg->getOption().getID() ==
 
 2886        options::OPT_mcode_object_version_EQ) {
 
 2887      unsigned CodeObjVer = MaxCodeObjVer;
 
 2889          StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
 
 2890      if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
 
 2891        D.
Diag(diag::err_drv_invalid_int_value)
 
 2892            << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
 
 
 2898                                           const llvm::opt::ArgList &Args) {
 
 2899  unsigned CodeObjVer = 6; 
 
 2901    StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
 
 
 2906    const Driver &D, 
const llvm::opt::ArgList &Args) {
 
 
 2911                                   const llvm::opt::ArgList &Args,
 
 2912                                   llvm::opt::ArgStringList &CmdArgs,
 
 2913                                   const llvm::Triple &Triple, 
bool IsLTO,
 
 2914                                   const StringRef PluginOptPrefix) {
 
 2915  auto addArg = [&, IsLTO](
const Twine &Arg) {
 
 2917      assert(!PluginOptPrefix.empty() && 
"Cannot have empty PluginOptPrefix!");
 
 2918      CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
 
 2920      CmdArgs.push_back(
"-mllvm");
 
 2921      CmdArgs.push_back(Args.MakeArgString(Arg));
 
 2925  if (Arg *A = Args.getLastArg(options::OPT_moutline,
 
 2926                               options::OPT_mno_outline)) {
 
 2927    if (A->getOption().matches(options::OPT_moutline)) {
 
 2931      if (!(Triple.isARM() || Triple.isThumb() || Triple.isAArch64())) {
 
 2932        D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
 
 2934        addArg(Twine(
"-enable-machine-outliner"));
 
 2938      addArg(Twine(
"-enable-machine-outliner=never"));
 
 2942  auto *CodeGenDataGenArg =
 
 2943      Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
 
 2944  auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
 
 2947  if (CodeGenDataGenArg && CodeGenDataUseArg)
 
 2948    D.
Diag(diag::err_drv_argument_not_allowed_with)
 
 2949        << CodeGenDataGenArg->getAsString(Args)
 
 2950        << CodeGenDataUseArg->getAsString(Args);
 
 2954  if (CodeGenDataGenArg)
 
 2955    addArg(Twine(
"-codegen-data-generate"));
 
 2958  if (CodeGenDataUseArg)
 
 2959    addArg(Twine(
"-codegen-data-use-path=") + CodeGenDataUseArg->getValue());
 
 
 2963                               const llvm::opt::ArgList &DriverArgs,
 
 2964                               llvm::opt::ArgStringList &CC1Args,
 
 2965                               StringRef BitcodeSuffix,
 
 2966                               const llvm::Triple &Triple,
 
 2971  std::optional<std::string> LibPath =
 
 2972      llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
 
 2975    const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, 
'\0'};
 
 2976    llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
 
 2977    for (StringRef Path : Frags)
 
 2978      LibraryPaths.emplace_back(Path.trim());
 
 2983    LibraryPaths.emplace_back(LibPath);
 
 2987  llvm::sys::path::append(P, 
"..", 
"lib", Triple.getTriple());
 
 2988  LibraryPaths.emplace_back(P);
 
 2990  OptSpecifier LibomptargetBCPathOpt =
 
 2991      Triple.isAMDGCN()  ? options::OPT_libomptarget_amdgpu_bc_path_EQ
 
 2992      : Triple.isNVPTX() ? options::OPT_libomptarget_nvptx_bc_path_EQ
 
 2993                         : options::OPT_libomptarget_spirv_bc_path_EQ;
 
 2995  StringRef ArchPrefix = Triple.isAMDGCN()  ? 
"amdgpu" 
 2996                         : Triple.isNVPTX() ? 
"nvptx" 
 2998  std::string LibOmpTargetName = (
"libomptarget-" + ArchPrefix + 
".bc").str();
 
 3001  if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
 
 3003    if (llvm::sys::fs::exists(LibOmpTargetFile) &&
 
 3004        llvm::sys::fs::is_directory(LibOmpTargetFile)) {
 
 3005      llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
 
 3008    if (llvm::sys::fs::exists(LibOmpTargetFile)) {
 
 3009      CC1Args.push_back(
"-mlink-builtin-bitcode");
 
 3010      CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
 
 3012      D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
 
 3013          << LibOmpTargetFile;
 
 3016    bool FoundBCLibrary = 
false;
 
 3018    for (StringRef LibraryPath : LibraryPaths) {
 
 3020      llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
 
 3021      if (llvm::sys::fs::exists(LibOmpTargetFile)) {
 
 3022        CC1Args.push_back(
"-mlink-builtin-bitcode");
 
 3023        CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
 
 3024        FoundBCLibrary = 
true;
 
 3029    if (!FoundBCLibrary)
 
 3030      D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
 
 3031          << LibOmpTargetName << ArchPrefix;
 
 
 3035                                 const llvm::opt::ArgList &Args,
 
 3036                                 llvm::opt::ArgStringList &CmdArgs) {
 
 3038      (!Args.hasArg(options::OPT_nostdlib) ||
 
 3039       TC.
getTriple().isKnownWindowsMSVCEnvironment()) &&
 
 3040      !Args.hasArg(options::OPT_no_hip_rt) && !Args.hasArg(options::OPT_r)) {
 
 3044    for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
 
 
 3051                                 const llvm::opt::ArgList &DriverArgs,
 
 3052                                 llvm::opt::ArgStringList &CC1Args) {
 
 3054  const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
 
 3060  llvm::sys::path::append(LibclcPath, 
"lib", 
"libclc");
 
 3063  StringRef LibclcNamespec(A->getValue());
 
 3064  bool FilenameSearch = LibclcNamespec.consume_front(
":");
 
 3067  if (FilenameSearch && llvm::sys::fs::exists(LibclcTargetFile)) {
 
 3068    CC1Args.push_back(
"-mlink-builtin-bitcode");
 
 3069    CC1Args.push_back(DriverArgs.MakeArgString(LibclcTargetFile));
 
 3072    if (!FilenameSearch)
 
 3073      LibclcTargetFile += 
".bc";
 
 3075    llvm::sys::path::append(LibclcPath, LibclcTargetFile);
 
 3076    if (llvm::sys::fs::exists(LibclcPath)) {
 
 3077      CC1Args.push_back(
"-mlink-builtin-bitcode");
 
 3078      CC1Args.push_back(DriverArgs.MakeArgString(LibclcPath));
 
 3082      D.
Diag(diag::err_drv_libclc_not_found) << LibclcTargetFile;
 
 
 3088                                  const llvm::opt::ArgList &Args,
 
 3089                                  llvm::opt::ArgStringList &CmdArgs,
 
 3090                                  const llvm::Triple &Triple) {
 
 3091  if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
 
 3092                               options::OPT_mno_outline_atomics)) {
 
 3094    if (!Triple.isAArch64()) {
 
 3095      D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
 
 3096          << Triple.getArchName() << A->getOption().getName();
 
 3098      if (A->getOption().matches(options::OPT_moutline_atomics)) {
 
 3099        CmdArgs.push_back(
"-target-feature");
 
 3100        CmdArgs.push_back(
"+outline-atomics");
 
 3102        CmdArgs.push_back(
"-target-feature");
 
 3103        CmdArgs.push_back(
"-outline-atomics");
 
 3107    CmdArgs.push_back(
"-target-feature");
 
 3108    CmdArgs.push_back(
"+outline-atomics");
 
 
 3113                                   llvm::opt::ArgStringList &CmdArgs) {
 
 3114  if (TCArgs.hasFlag(options::OPT_offload_compress,
 
 3115                     options::OPT_no_offload_compress, 
false))
 
 3116    CmdArgs.push_back(
"--compress");
 
 3117  if (TCArgs.hasArg(options::OPT_v))
 
 3118    CmdArgs.push_back(
"--verbose");
 
 3119  if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
 
 3121        TCArgs.MakeArgString(Twine(
"--compression-level=") + Arg->getValue()));
 
 
 3125                       const llvm::Triple &Triple,
 
 3126                       const llvm::Reloc::Model &RelocationModel,
 
 3127                       llvm::opt::ArgStringList &CmdArgs) {
 
 3128  if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
 
 3129    StringRef CM = A->getValue();
 
 3131    if (Triple.isOSAIX() && CM == 
"medium")
 
 3133    if (Triple.isAArch64(64)) {
 
 3134      Ok = CM == 
"tiny" || CM == 
"small" || CM == 
"large";
 
 3135      if (CM == 
"large" && !Triple.isOSBinFormatMachO() &&
 
 3136          RelocationModel != llvm::Reloc::Static)
 
 3137        D.
Diag(diag::err_drv_argument_only_allowed_with)
 
 3138            << A->getAsString(Args) << 
"-fno-pic";
 
 3139    } 
else if (Triple.isLoongArch()) {
 
 3140      if (CM == 
"extreme" &&
 
 3141          Args.hasFlagNoClaim(options::OPT_fplt, options::OPT_fno_plt, 
false))
 
 3142        D.
Diag(diag::err_drv_argument_not_allowed_with)
 
 3143            << A->getAsString(Args) << 
"-fplt";
 
 3144      Ok = CM == 
"normal" || CM == 
"medium" || CM == 
"extreme";
 
 3147        CM = llvm::StringSwitch<StringRef>(CM)
 
 3148                 .Case(
"normal", 
"small")
 
 3149                 .Case(
"extreme", 
"large")
 
 3151    } 
else if (Triple.isPPC64() || Triple.isOSAIX()) {
 
 3152      Ok = CM == 
"small" || CM == 
"medium" || CM == 
"large";
 
 3153    } 
else if (Triple.isRISCV()) {
 
 3155      if (CM == 
"large" && RelocationModel != llvm::Reloc::Static)
 
 3156        D.
Diag(diag::err_drv_argument_not_allowed_with)
 
 3157            << A->getAsString(Args) << 
"-fpic";
 
 3160      else if (CM == 
"medany")
 
 3162      Ok = CM == 
"small" || CM == 
"medium" ||
 
 3163           (CM == 
"large" && Triple.isRISCV64());
 
 3164    } 
else if (Triple.getArch() == llvm::Triple::x86_64) {
 
 3165      Ok = llvm::is_contained({
"small", 
"kernel", 
"medium", 
"large"}, CM);
 
 3166    } 
else if (Triple.isNVPTX() || Triple.isAMDGPU() || Triple.isSPIRV()) {
 
 3170    } 
else if (Triple.isSPARC64()) {
 
 3173      else if (CM == 
"medmid")
 
 3175      else if (CM == 
"medany")
 
 3177      Ok = CM == 
"small" || CM == 
"medium" || CM == 
"large";
 
 3178    } 
else if (Triple.getArch() == llvm::Triple::lanai) {
 
 3179      Ok = llvm::is_contained({
"small", 
"medium", 
"large"}, CM);
 
 3182      CmdArgs.push_back(Args.MakeArgString(
"-mcmodel=" + CM));
 
 3184      D.
Diag(diag::err_drv_unsupported_option_argument_for_target)
 
 3185          << A->getSpelling() << CM << Triple.getTriple();
 
 3189  if (Triple.getArch() == llvm::Triple::x86_64) {
 
 3190    bool IsMediumCM = 
false;
 
 3191    bool IsLargeCM = 
false;
 
 3192    if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
 
 3193      IsMediumCM = StringRef(A->getValue()) == 
"medium";
 
 3194      IsLargeCM = StringRef(A->getValue()) == 
"large";
 
 3196    if (Arg *A = Args.getLastArg(options::OPT_mlarge_data_threshold_EQ)) {
 
 3197      if (!IsMediumCM && !IsLargeCM) {
 
 3198        D.
Diag(diag::warn_drv_large_data_threshold_invalid_code_model)
 
 3199            << A->getOption().getRenderName();
 
 3201        A->render(Args, CmdArgs);
 
 3203    } 
else if (IsMediumCM) {
 
 3204      CmdArgs.push_back(
"-mlarge-data-threshold=65536");
 
 3205    } 
else if (IsLargeCM) {
 
 3206      CmdArgs.push_back(
"-mlarge-data-threshold=0");
 
 
 3212                                       ArgStringList &CmdArgs) {
 
 3217  Args.getLastArg(options::OPT_fcolor_diagnostics,
 
 3218                  options::OPT_fno_color_diagnostics);
 
 3219  if (
const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_color_EQ)) {
 
 3220    StringRef 
Value(A->getValue());
 
 3222      D.
Diag(diag::err_drv_invalid_argument_to_option)
 
 3223          << 
Value << A->getOption().getName();
 
 3227    CmdArgs.push_back(
"-fcolor-diagnostics");
 
 3232  for (; *Arg; ++Arg) {
 
 3238      Res.push_back(
'\\');
 
 3241    Res.push_back(*Arg);
 
 
 3246                                            const llvm::opt::ArgList &Args) {
 
 3250  llvm::opt::ArgStringList OriginalArgs;
 
 3251  for (
const auto &Arg : Args)
 
 3252    Arg->render(Args, OriginalArgs);
 
 3256  for (
const char *OriginalArg : OriginalArgs) {
 
 3260    Flags += EscapedArg;
 
 3263  return Args.MakeArgString(Flags);
 
 
 3267                                    const llvm::opt::ArgList &Args,
 
 3268                                    bool &FRecordCommandLine,
 
 3269                                    bool &GRecordCommandLine) {
 
 3272  const std::string &TripleStr = Triple.getTriple();
 
 3274  FRecordCommandLine =
 
 3275      Args.hasFlag(options::OPT_frecord_command_line,
 
 3276                   options::OPT_fno_record_command_line, 
false);
 
 3277  GRecordCommandLine =
 
 3278      Args.hasFlag(options::OPT_grecord_command_line,
 
 3279                   options::OPT_gno_record_command_line, 
false);
 
 3280  if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
 
 3281      !Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
 
 3282    D.
Diag(diag::err_drv_unsupported_opt_for_target)
 
 3283        << Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
 
 
 3290                                               ArgStringList &CmdArgs) {
 
 3291  bool use_fwrapv = 
false;
 
 3292  bool use_fwrapv_pointer = 
false;
 
 3293  for (
const Arg *A : Args.filtered(
 
 3294           options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
 
 3295           options::OPT_fwrapv, options::OPT_fno_wrapv,
 
 3296           options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
 
 3298    switch (A->getOption().getID()) {
 
 3299    case options::OPT_fstrict_overflow:
 
 3301      use_fwrapv_pointer = 
false;
 
 3303    case options::OPT_fno_strict_overflow:
 
 3305      use_fwrapv_pointer = 
true;
 
 3307    case options::OPT_fwrapv:
 
 3310    case options::OPT_fno_wrapv:
 
 3313    case options::OPT_fwrapv_pointer:
 
 3314      use_fwrapv_pointer = 
true;
 
 3316    case options::OPT_fno_wrapv_pointer:
 
 3317      use_fwrapv_pointer = 
false;
 
 3323    CmdArgs.push_back(
"-fwrapv");
 
 3324  if (use_fwrapv_pointer)
 
 3325    CmdArgs.push_back(
"-fwrapv-pointer");
 
 3332  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
 
 3333    if (A->getOption().matches(options::OPT_O4) ||
 
 3334        A->getOption().matches(options::OPT_Ofast))
 
 3337    if (A->getOption().matches(options::OPT_O0))
 
 3340    assert(A->getOption().matches(options::OPT_O) && 
"Must have a -O flag");
 
 3343    StringRef S(A->getValue());
 
 3351    unsigned OptLevel = 0;
 
 3352    if (S.getAsInteger(10, OptLevel))
 
 3355    return OptLevel > 1;
 
 3362                                     ArgStringList &CmdArgs) {
 
 3364  if (Args.hasFlag(options::OPT_fvectorize, options::OPT_fno_vectorize,
 
 3366    CmdArgs.push_back(
"-vectorize-loops");
 
 3370                                   ArgStringList &CmdArgs) {
 
 3372  if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize,
 
 3374    CmdArgs.push_back(
"-vectorize-slp");
 
 3378                                       ArgStringList &CmdArgs) {
 
 3379  if (Args.hasFlag(options::OPT_floop_interchange,
 
 3380                   options::OPT_fno_loop_interchange, 
false))
 
 3381    CmdArgs.push_back(
"-floop-interchange");
 
 3387                                               const llvm::opt::ArgList &Args) {
 
 3388  Arg *A = Args.getLastArg(clang::driver::options::OPT_mprefer_vector_width_EQ);
 
 3392  StringRef 
Value = A->getValue();
 
 3393  unsigned Width LLVM_ATTRIBUTE_UNINITIALIZED;
 
 3397  if (
Value != 
"none" && 
Value.getAsInteger(10, Width)) {
 
 3398    Diags.
Report(clang::diag::err_drv_invalid_value)
 
 3399        << A->getOption().getName() << 
Value;
 
 
 3411                              const Arg &A, 
size_t &Position) {
 
 3412  const char RefinementStepToken = 
':';
 
 3413  Position = In.find(RefinementStepToken);
 
 3414  if (Position != StringRef::npos) {
 
 3415    StringRef Option = A.getOption().getName();
 
 3416    StringRef RefStep = In.substr(Position + 1);
 
 3424    if (RefStep.size() != 1) {
 
 3425      Diags.
Report(diag::err_drv_invalid_value) << Option << RefStep;
 
 3428    char RefStepChar = RefStep[0];
 
 3429    if (RefStepChar < 
'0' || RefStepChar > 
'9') {
 
 3430      Diags.
Report(diag::err_drv_invalid_value) << Option << RefStep;
 
 
 3440                                   const ArgList &Args) {
 
 3441  StringRef DisabledPrefixIn = 
"!";
 
 3442  StringRef DisabledPrefixOut = 
"!";
 
 3443  StringRef EnabledPrefixOut = 
"";
 
 3446  Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
 
 3450  unsigned NumOptions = A->getNumValues();
 
 3451  if (NumOptions == 0) {
 
 3457  if (NumOptions == 1) {
 
 3458    StringRef Val = A->getValue(0);
 
 3462    StringRef ValBase = Val.slice(0, RefStepLoc);
 
 3463    if (ValBase == 
"all" || ValBase == 
"none" || ValBase == 
"default") {
 
 3472  llvm::StringMap<bool> OptionStrings;
 
 3473  OptionStrings.insert(std::make_pair(
"divd", 
false));
 
 3474  OptionStrings.insert(std::make_pair(
"divf", 
false));
 
 3475  OptionStrings.insert(std::make_pair(
"divh", 
false));
 
 3476  OptionStrings.insert(std::make_pair(
"vec-divd", 
false));
 
 3477  OptionStrings.insert(std::make_pair(
"vec-divf", 
false));
 
 3478  OptionStrings.insert(std::make_pair(
"vec-divh", 
false));
 
 3479  OptionStrings.insert(std::make_pair(
"sqrtd", 
false));
 
 3480  OptionStrings.insert(std::make_pair(
"sqrtf", 
false));
 
 3481  OptionStrings.insert(std::make_pair(
"sqrth", 
false));
 
 3482  OptionStrings.insert(std::make_pair(
"vec-sqrtd", 
false));
 
 3483  OptionStrings.insert(std::make_pair(
"vec-sqrtf", 
false));
 
 3484  OptionStrings.insert(std::make_pair(
"vec-sqrth", 
false));
 
 3486  for (
unsigned i = 0; i != NumOptions; ++i) {
 
 3487    StringRef Val = A->getValue(i);
 
 3489    bool IsDisabled = Val.starts_with(DisabledPrefixIn);
 
 3492      Val = Val.substr(1);
 
 3498    StringRef ValBase = Val.slice(0, RefStep);
 
 3499    llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
 
 3500    if (OptionIter == OptionStrings.end()) {
 
 3502      OptionIter = OptionStrings.find(ValBase.str() + 
'f');
 
 3503      if (OptionIter == OptionStrings.end()) {
 
 3505        Diags.
Report(diag::err_drv_unknown_argument) << Val;
 
 3511      if (OptionStrings[ValBase.str() + 
'd'] ||
 
 3512          OptionStrings[ValBase.str() + 
'h']) {
 
 3513        Diags.
Report(diag::err_drv_invalid_value)
 
 3514            << A->getOption().getName() << Val;
 
 3519    if (OptionIter->second == 
true) {
 
 3521      Diags.
Report(diag::err_drv_invalid_value)
 
 3522          << A->getOption().getName() << Val;
 
 3527    OptionIter->second = 
true;
 
 3531    if (ValBase.back() != 
'f' && ValBase.back() != 
'd' &&
 
 3532        ValBase.back() != 
'h') {
 
 3533      OptionStrings[ValBase.str() + 
'd'] = 
true;
 
 3534      OptionStrings[ValBase.str() + 
'h'] = 
true;
 
 3538    StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
 
 3539    Out = Args.MakeArgString(Out + Prefix + Val);
 
 3540    if (i != NumOptions - 1)
 
 3541      Out = Args.MakeArgString(Out + 
",");
 
 3565  llvm_unreachable(
"Fully covered switch above");
 
 
 3571  if (!ComplexRangeStr.empty())
 
 3572    return "-complex-range=" + ComplexRangeStr;
 
 3573  return ComplexRangeStr;
 
 
 3593  if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
 
 3594      (LastOpt == 
"-fcx-limited-range" && NewOpt == 
"-fno-cx-limited-range") ||
 
 3595      (LastOpt == 
"-fno-cx-limited-range" && NewOpt == 
"-fcx-limited-range") ||
 
 3596      (LastOpt == 
"-fcx-fortran-rules" && NewOpt == 
"-fno-cx-fortran-rules") ||
 
 3597      (LastOpt == 
"-fno-cx-fortran-rules" && NewOpt == 
"-fcx-fortran-rules") ||
 
 3598      (LastOpt == 
"-ffast-math" && NewOpt == 
"-fno-fast-math") ||
 
 3599      (LastOpt.starts_with(
"-ffp-model=") && NewOpt == 
"-ffast-math") ||
 
 3600      (LastOpt.starts_with(
"-ffp-model=") && NewOpt == 
"-fno-fast-math") ||
 
 3601      (LastOpt.starts_with(
"-ffp-model=") &&
 
 3602       NewOpt.starts_with(
"-ffp-model=")) ||
 
 3603      (LastOpt.starts_with(
"-fcomplex-arithmetic=") &&
 
 3604       NewOpt.starts_with(
"-fcomplex-arithmetic=")))
 
 3607  D.
Diag(clang::diag::warn_drv_overriding_complex_range)
 
 
static bool useLeafFramePointerForTargetByDefault(const llvm::Triple &Triple)
static unsigned ParseDebugDefaultVersion(const ToolChain &TC, const ArgList &Args)
static bool getRefinementStep(StringRef In, clang::DiagnosticsEngine &Diags, const Arg &A, size_t &Position)
static void getWebAssemblyTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector< StringRef > &Features)
static void emitComplexRangeDiag(const Driver &D, StringRef LastOpt, LangOptions::ComplexRangeKind Range, StringRef NewOpt, LangOptions::ComplexRangeKind NewRange)
static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer)
static bool mustMaintainValidFrameChain(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static llvm::opt::Arg * getAMDGPUCodeObjectArgument(const Driver &D, const llvm::opt::ArgList &Args)
static void collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, SmallVectorImpl< StringRef > &SharedRuntimes, SmallVectorImpl< StringRef > &StaticRuntimes, SmallVectorImpl< StringRef > &NonWholeStaticRuntimes, SmallVectorImpl< StringRef > &HelperStaticRuntimes, SmallVectorImpl< StringRef > &RequiredSymbols)
static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer, bool IsShared, bool IsWhole)
static void AddUnwindLibrary(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static bool SDLSearch(const Driver &D, const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const SmallVectorImpl< std::string > &LibraryPaths, StringRef Lib, StringRef Arch, StringRef Target, bool isBitCodeSDL)
SDLSearch: Search for Static Device Library The search for SDL bitcode files is consistent with how s...
static void renderRpassOptions(const ArgList &Args, ArgStringList &CmdArgs, const StringRef PluginOptPrefix)
static StringRef getWebAssemblyTargetCPU(const ArgList &Args)
Get the (LLVM) name of the WebAssembly cpu we are targeting.
static bool framePointerImpliesLeafFramePointer(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static void renderRemarksHotnessOptions(const ArgList &Args, ArgStringList &CmdArgs, const StringRef PluginOptPrefix)
static void GetSDLFromOffloadArchive(Compilation &C, const Driver &D, const Tool &T, const JobAction &JA, const InputInfoList &Inputs, const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const SmallVectorImpl< std::string > &LibraryPaths, StringRef Lib, StringRef Arch, StringRef Target, bool isBitCodeSDL)
Search if a user provided archive file lib<libname>.a exists in any of the library paths.
static std::string getLanaiTargetCPU(const ArgList &Args)
static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple, const InputInfo &Input, const InputInfo &Output, const StringRef PluginOptPrefix)
static bool useFramePointerForTargetByDefault(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static void AddLibgcc(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static LibGccType getLibGccType(const ToolChain &TC, const Driver &D, const ArgList &Args)
clang::CodeGenOptions::FramePointerKind getFramePointerKind(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static std::string getAMDGPUTargetGPU(const llvm::Triple &T, const ArgList &Args)
Get the (LLVM) name of the AMDGPU gpu we are targeting.
static bool mustUseNonLeafFramePointerForTarget(const llvm::Triple &Triple)
static bool shouldIgnoreUnsupportedTargetFeature(const Arg &TargetFeatureArg, llvm::Triple T, StringRef Processor)
llvm::MachO::Target Target
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
ComplexRangeKind
Controls the various implementations for complex multiplication and.
@ CX_Full
Implementation of complex division and multiplication using a call to runtime library functions(gener...
@ CX_Basic
Implementation of complex division and multiplication using algebraic formulas at source precision.
@ CX_Promoted
Implementation of complex division using algebraic formulas at higher precision.
@ CX_None
No range rule is enabled.
@ CX_Improved
Implementation of complex division offering an improved handling for overflow in intermediate calcula...
const char * getOffloadingArch() const
static StringRef GetOffloadKindName(OffloadKind Kind)
Return a string containing a offload kind name.
OffloadKind getOffloadingDeviceKind() const
bool isHostOffloading(unsigned int OKind) const
Check if this action have any offload kinds.
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 CCPrintInternalStatReportFilename
The file to log CC_PRINT_INTERNAL_STAT_FILE output to, if enabled.
DiagnosticsEngine & getDiags() const
const char * getPrependArg() const
OpenMPRuntimeKind getOpenMPRuntime(const llvm::opt::ArgList &Args) const
Compute the desired OpenMP runtime from the flags provided.
const char * getClangProgramPath() const
Get the path to the main clang executable.
DiagnosticBuilder Diag(unsigned DiagID) const
unsigned CCPrintInternalStats
Set CC_PRINT_INTERNAL_STAT mode, which causes the driver to dump internal performance report to CC_PR...
const llvm::opt::OptTable & getOpts() const
std::string ResourceDir
The path to the compiler resource directory.
llvm::vfs::FileSystem & getVFS() const
std::string GetTemporaryPath(StringRef Prefix, StringRef Suffix) const
GetTemporaryPath - Return the pathname of a temporary file to use as part of compilation; the file wi...
std::string Dir
The path the driver executable was in, as invoked from the command line.
@ 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 IsFlangMode() const
Whether the driver should invoke flang for fortran inputs.
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
std::vector< std::string > flags_list
bool needsFuzzerInterceptors() const
bool needsHwasanAliasesRt() const
bool needsStatsRt() const
bool needsMemProfRt() const
bool linkRuntimes() const
bool needsUbsanRt() const
bool needsHwasanRt() const
bool hasCrossDsoCfi() const
bool needsCfiCrossDsoDiagRt() const
bool hasMemtagHeap() const
bool needsSafeStackRt() const
bool needsRtsanRt() const
bool requiresMinimalRuntime() const
bool hasMemtagStack() const
bool needsDfsanRt() const
bool needsScudoRt() const
bool needsUbsanCXXRt() const
bool needsCfiCrossDsoRt() const
const std::string & getMemtagMode() const
bool needsSharedRt() const
bool needsTysanRt() const
bool linkCXXRuntimes() const
bool needsXRayDSORt() const
llvm::ArrayRef< std::string > modeList() const
bool isLLVMIR(ID Id)
Is this LLVM IR.
ID lookupTypeForExtension(llvm::StringRef Ext)
lookupTypeForExtension - Lookup the type to use for the file extension Ext.
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
The JSON file list parser is used to communicate input to InstallAPI.
llvm::StringRef getProcessorFromTargetID(const llvm::Triple &T, llvm::StringRef OffloadArch)
Get processor name from target ID.
const FunctionProtoType * T
static constexpr ResponseFileSupport AtFileCurCP()