//===-- CommandFlags.h - Command Line Flags Interface -----------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file contains codegen-specific flags that are shared between different
// command line tools. The tools "llc" and "opt" both use this file to prevent
// flag duplication.
//
//===----------------------------------------------------------------------===//

#include "llvm/ADT/StringExtras.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Module.h"
#include "llvm/MC/MCTargetOptionsCommandFlags.inc"
#include "llvm/MC/SubtargetFeature.h"
#include "llvm/Support/CodeGen.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Host.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include <string>
using namespace llvm;

static cl::opt<std::string>
    MArch("march",
          cl::desc("Architecture to generate code for (see --version)"));

static cl::opt<std::string>
    MCPU("mcpu",
         cl::desc("Target a specific cpu type (-mcpu=help for details)"),
         cl::value_desc("cpu-name"), cl::init(""));

static cl::list<std::string>
    MAttrs("mattr", cl::CommaSeparated,
           cl::desc("Target specific attributes (-mattr=help for details)"),
           cl::value_desc("a1,+a2,-a3,..."));

static cl::opt<Reloc::Model> RelocModel(
    "relocation-model", cl::desc("Choose relocation model"),
    cl::values(
        clEnumValN(Reloc::Static, "static", "Non-relocatable code"),
        clEnumValN(Reloc::PIC_, "pic",
                   "Fully relocatable, position independent code"),
        clEnumValN(Reloc::DynamicNoPIC, "dynamic-no-pic",
                   "Relocatable external references, non-relocatable code"),
        clEnumValN(Reloc::ROPI, "ropi",
                   "Code and read-only data relocatable, accessed PC-relative"),
        clEnumValN(
            Reloc::RWPI, "rwpi",
            "Read-write data relocatable, accessed relative to static base"),
        clEnumValN(Reloc::ROPI_RWPI, "ropi-rwpi",
                   "Combination of ropi and rwpi")));

LLVM_ATTRIBUTE_UNUSED static Optional<Reloc::Model> getRelocModel() {
  if (RelocModel.getNumOccurrences()) {
    Reloc::Model R = RelocModel;
    return R;
  }
  return None;
}

static cl::opt<ThreadModel::Model> TMModel(
    "thread-model", cl::desc("Choose threading model"),
    cl::init(ThreadModel::POSIX),
    cl::values(clEnumValN(ThreadModel::POSIX, "posix", "POSIX thread model"),
               clEnumValN(ThreadModel::Single, "single",
                          "Single thread model")));

static cl::opt<llvm::CodeModel::Model> CMModel(
    "code-model", cl::desc("Choose code model"),
    cl::values(clEnumValN(CodeModel::Tiny, "tiny", "Tiny code model"),
               clEnumValN(CodeModel::Small, "small", "Small code model"),
               clEnumValN(CodeModel::Kernel, "kernel", "Kernel code model"),
               clEnumValN(CodeModel::Medium, "medium", "Medium code model"),
               clEnumValN(CodeModel::Large, "large", "Large code model")));

LLVM_ATTRIBUTE_UNUSED static Optional<CodeModel::Model> getCodeModel() {
  if (CMModel.getNumOccurrences()) {
    CodeModel::Model M = CMModel;
    return M;
  }
  return None;
}

static cl::opt<llvm::ExceptionHandling> ExceptionModel(
    "exception-model", cl::desc("exception model"),
    cl::init(ExceptionHandling::None),
    cl::values(
        clEnumValN(ExceptionHandling::None, "default",
                   "default exception handling model"),
        clEnumValN(ExceptionHandling::DwarfCFI, "dwarf",
                   "DWARF-like CFI based exception handling"),
        clEnumValN(ExceptionHandling::SjLj, "sjlj", "SjLj exception handling"),
        clEnumValN(ExceptionHandling::ARM, "arm", "ARM EHABI exceptions"),
        clEnumValN(ExceptionHandling::WinEH, "wineh",
                   "Windows exception model"),
        clEnumValN(ExceptionHandling::Wasm, "wasm",
                   "WebAssembly exception handling")));

static cl::opt<CodeGenFileType> FileType(
    "filetype", cl::init(CGFT_AssemblyFile),
    cl::desc(
        "Choose a file type (not all types are supported by all targets):"),
    cl::values(clEnumValN(CGFT_AssemblyFile, "asm",
                          "Emit an assembly ('.s') file"),
               clEnumValN(CGFT_ObjectFile, "obj",
                          "Emit a native object ('.o') file"),
               clEnumValN(CGFT_Null, "null",
                          "Emit nothing, for performance testing")));

static cl::opt<llvm::FramePointer::FP> FramePointerUsage(
    "frame-pointer", cl::desc("Specify frame pointer elimination optimization"),
    cl::init(llvm::FramePointer::None),
    cl::values(
        clEnumValN(llvm::FramePointer::All, "all",
                   "Disable frame pointer elimination"),
        clEnumValN(llvm::FramePointer::NonLeaf, "non-leaf",
                   "Disable frame pointer elimination for non-leaf frame"),
        clEnumValN(llvm::FramePointer::None, "none",
                   "Enable frame pointer elimination")));

static cl::opt<bool> EnableUnsafeFPMath(
    "enable-unsafe-fp-math",
    cl::desc("Enable optimizations that may decrease FP precision"),
    cl::init(false));

static cl::opt<bool> EnableNoInfsFPMath(
    "enable-no-infs-fp-math",
    cl::desc("Enable FP math optimizations that assume no +-Infs"),
    cl::init(false));

static cl::opt<bool> EnableNoNaNsFPMath(
    "enable-no-nans-fp-math",
    cl::desc("Enable FP math optimizations that assume no NaNs"),
    cl::init(false));

static cl::opt<bool> EnableNoSignedZerosFPMath(
    "enable-no-signed-zeros-fp-math",
    cl::desc("Enable FP math optimizations that assume "
             "the sign of 0 is insignificant"),
    cl::init(false));

static cl::opt<bool>
    EnableNoTrappingFPMath("enable-no-trapping-fp-math",
                           cl::desc("Enable setting the FP exceptions build "
                                    "attribute not to use exceptions"),
                           cl::init(false));

static cl::opt<llvm::FPDenormal::DenormalMode> DenormalFPMath(
    "denormal-fp-math",
    cl::desc("Select which denormal numbers the code is permitted to require"),
    cl::init(FPDenormal::IEEE),
    cl::values(clEnumValN(FPDenormal::IEEE, "ieee",
                          "IEEE 754 denormal numbers"),
               clEnumValN(FPDenormal::PreserveSign, "preserve-sign",
                          "the sign of a  flushed-to-zero number is preserved "
                          "in the sign of 0"),
               clEnumValN(FPDenormal::PositiveZero, "positive-zero",
                          "denormals are flushed to positive zero")));

static cl::opt<bool> EnableHonorSignDependentRoundingFPMath(
    "enable-sign-dependent-rounding-fp-math", cl::Hidden,
    cl::desc("Force codegen to assume rounding mode can change dynamically"),
    cl::init(false));

static cl::opt<llvm::FloatABI::ABIType> FloatABIForCalls(
    "float-abi", cl::desc("Choose float ABI type"), cl::init(FloatABI::Default),
    cl::values(clEnumValN(FloatABI::Default, "default",
                          "Target default float ABI type"),
               clEnumValN(FloatABI::Soft, "soft",
                          "Soft float ABI (implied by -soft-float)"),
               clEnumValN(FloatABI::Hard, "hard",
                          "Hard float ABI (uses FP registers)")));

static cl::opt<llvm::FPOpFusion::FPOpFusionMode> FuseFPOps(
    "fp-contract", cl::desc("Enable aggressive formation of fused FP ops"),
    cl::init(FPOpFusion::Standard),
    cl::values(
        clEnumValN(FPOpFusion::Fast, "fast", "Fuse FP ops whenever profitable"),
        clEnumValN(FPOpFusion::Standard, "on", "Only fuse 'blessed' FP ops."),
        clEnumValN(FPOpFusion::Strict, "off",
                   "Only fuse FP ops when the result won't be affected.")));

static cl::opt<bool> DontPlaceZerosInBSS(
    "nozero-initialized-in-bss",
    cl::desc("Don't place zero-initialized symbols into bss section"),
    cl::init(false));

static cl::opt<bool> EnableGuaranteedTailCallOpt(
    "tailcallopt",
    cl::desc(
        "Turn fastcc calls into tail calls by (potentially) changing ABI."),
    cl::init(false));

static cl::opt<bool> DisableTailCalls("disable-tail-calls",
                                      cl::desc("Never emit tail calls"),
                                      cl::init(false));

static cl::opt<bool> StackSymbolOrdering("stack-symbol-ordering",
                                         cl::desc("Order local stack symbols."),
                                         cl::init(true));

static cl::opt<unsigned>
    OverrideStackAlignment("stack-alignment",
                           cl::desc("Override default stack alignment"),
                           cl::init(0));

static cl::opt<bool>
    StackRealign("stackrealign",
                 cl::desc("Force align the stack to the minimum alignment"),
                 cl::init(false));

static cl::opt<std::string> TrapFuncName(
    "trap-func", cl::Hidden,
    cl::desc("Emit a call to trap function rather than a trap instruction"),
    cl::init(""));

static cl::opt<bool> UseCtors("use-ctors",
                              cl::desc("Use .ctors instead of .init_array."),
                              cl::init(false));

static cl::opt<bool> RelaxELFRelocations(
    "relax-elf-relocations",
    cl::desc("Emit GOTPCRELX/REX_GOTPCRELX instead of GOTPCREL on x86-64 ELF"),
    cl::init(false));

static cl::opt<bool> DataSections("data-sections",
                                  cl::desc("Emit data into separate sections"),
                                  cl::init(false));

static cl::opt<bool>
    FunctionSections("function-sections",
                     cl::desc("Emit functions into separate sections"),
                     cl::init(false));

static cl::opt<unsigned> TLSSize("tls-size",
                                 cl::desc("Bit size of immediate TLS offsets"),
                                 cl::init(0));

static cl::opt<bool> EmulatedTLS("emulated-tls",
                                 cl::desc("Use emulated TLS model"),
                                 cl::init(false));

static cl::opt<bool>
    UniqueSectionNames("unique-section-names",
                       cl::desc("Give unique names to every section"),
                       cl::init(true));

static cl::opt<llvm::EABI>
    EABIVersion("meabi", cl::desc("Set EABI type (default depends on triple):"),
                cl::init(EABI::Default),
                cl::values(clEnumValN(EABI::Default, "default",
                                      "Triple default EABI version"),
                           clEnumValN(EABI::EABI4, "4", "EABI version 4"),
                           clEnumValN(EABI::EABI5, "5", "EABI version 5"),
                           clEnumValN(EABI::GNU, "gnu", "EABI GNU")));

static cl::opt<DebuggerKind> DebuggerTuningOpt(
    "debugger-tune", cl::desc("Tune debug info for a particular debugger"),
    cl::init(DebuggerKind::Default),
    cl::values(clEnumValN(DebuggerKind::GDB, "gdb", "gdb"),
               clEnumValN(DebuggerKind::LLDB, "lldb", "lldb"),
               clEnumValN(DebuggerKind::SCE, "sce", "SCE targets (e.g. PS4)")));

static cl::opt<bool> EnableStackSizeSection(
    "stack-size-section",
    cl::desc("Emit a section containing stack size metadata"), cl::init(false));

static cl::opt<bool>
    EnableAddrsig("addrsig", cl::desc("Emit an address-significance table"),
                  cl::init(false));

static cl::opt<bool>
    EnableDebugEntryValues("debug-entry-values",
                           cl::desc("Emit debug info about parameter's entry values"),
                           cl::init(false));

static cl::opt<bool>
    ForceDwarfFrameSection("force-dwarf-frame-section",
                           cl::desc("Always emit a debug frame section."),
                           cl::init(false));

// Common utility function tightly tied to the options listed here. Initializes
// a TargetOptions object with CodeGen flags and returns it.
static TargetOptions InitTargetOptionsFromCodeGenFlags() {
  TargetOptions Options;
  Options.AllowFPOpFusion = FuseFPOps;
  Options.UnsafeFPMath = EnableUnsafeFPMath;
  Options.NoInfsFPMath = EnableNoInfsFPMath;
  Options.NoNaNsFPMath = EnableNoNaNsFPMath;
  Options.NoSignedZerosFPMath = EnableNoSignedZerosFPMath;
  Options.NoTrappingFPMath = EnableNoTrappingFPMath;
  Options.FPDenormalMode = DenormalFPMath;
  Options.HonorSignDependentRoundingFPMathOption =
      EnableHonorSignDependentRoundingFPMath;
  if (FloatABIForCalls != FloatABI::Default)
    Options.FloatABIType = FloatABIForCalls;
  Options.NoZerosInBSS = DontPlaceZerosInBSS;
  Options.GuaranteedTailCallOpt = EnableGuaranteedTailCallOpt;
  Options.StackAlignmentOverride = OverrideStackAlignment;
  Options.StackSymbolOrdering = StackSymbolOrdering;
  Options.UseInitArray = !UseCtors;
  Options.RelaxELFRelocations = RelaxELFRelocations;
  Options.DataSections = DataSections;
  Options.FunctionSections = FunctionSections;
  Options.UniqueSectionNames = UniqueSectionNames;
  Options.TLSSize = TLSSize;
  Options.EmulatedTLS = EmulatedTLS;
  Options.ExplicitEmulatedTLS = EmulatedTLS.getNumOccurrences() > 0;
  Options.ExceptionModel = ExceptionModel;
  Options.EmitStackSizeSection = EnableStackSizeSection;
  Options.EmitAddrsig = EnableAddrsig;
  Options.EnableDebugEntryValues = EnableDebugEntryValues;
  Options.ForceDwarfFrameSection = ForceDwarfFrameSection;

  Options.MCOptions = InitMCTargetOptionsFromFlags();

  Options.ThreadModel = TMModel;
  Options.EABIVersion = EABIVersion;
  Options.DebuggerTuning = DebuggerTuningOpt;

  return Options;
}

LLVM_ATTRIBUTE_UNUSED static std::string getCPUStr() {
  // If user asked for the 'native' CPU, autodetect here. If autodection fails,
  // this will set the CPU to an empty string which tells the target to
  // pick a basic default.
  if (MCPU == "native")
    return sys::getHostCPUName();

  return MCPU;
}

LLVM_ATTRIBUTE_UNUSED static std::string getFeaturesStr() {
  SubtargetFeatures Features;

  // If user asked for the 'native' CPU, we need to autodetect features.
  // This is necessary for x86 where the CPU might not support all the
  // features the autodetected CPU name lists in the target. For example,
  // not all Sandybridge processors support AVX.
  if (MCPU == "native") {
    StringMap<bool> HostFeatures;
    if (sys::getHostCPUFeatures(HostFeatures))
      for (auto &F : HostFeatures)
        Features.AddFeature(F.first(), F.second);
  }

  for (unsigned i = 0; i != MAttrs.size(); ++i)
    Features.AddFeature(MAttrs[i]);

  return Features.getString();
}

LLVM_ATTRIBUTE_UNUSED static std::vector<std::string> getFeatureList() {
  SubtargetFeatures Features;

  // If user asked for the 'native' CPU, we need to autodetect features.
  // This is necessary for x86 where the CPU might not support all the
  // features the autodetected CPU name lists in the target. For example,
  // not all Sandybridge processors support AVX.
  if (MCPU == "native") {
    StringMap<bool> HostFeatures;
    if (sys::getHostCPUFeatures(HostFeatures))
      for (auto &F : HostFeatures)
        Features.AddFeature(F.first(), F.second);
  }

  for (unsigned i = 0; i != MAttrs.size(); ++i)
    Features.AddFeature(MAttrs[i]);

  return Features.getFeatures();
}

/// Set function attributes of function \p F based on CPU, Features, and command
/// line flags.
LLVM_ATTRIBUTE_UNUSED static void
setFunctionAttributes(StringRef CPU, StringRef Features, Function &F) {
  auto &Ctx = F.getContext();
  AttributeList Attrs = F.getAttributes();
  AttrBuilder NewAttrs;

  if (!CPU.empty() && !F.hasFnAttribute("target-cpu"))
    NewAttrs.addAttribute("target-cpu", CPU);
  if (!Features.empty())
    NewAttrs.addAttribute("target-features", Features);
  if (FramePointerUsage.getNumOccurrences() > 0) {
    if (FramePointerUsage == llvm::FramePointer::All)
      NewAttrs.addAttribute("frame-pointer", "all");
    else if (FramePointerUsage == llvm::FramePointer::NonLeaf)
      NewAttrs.addAttribute("frame-pointer", "non-leaf");
    else if (FramePointerUsage == llvm::FramePointer::None)
      NewAttrs.addAttribute("frame-pointer", "none");
  }
  if (DisableTailCalls.getNumOccurrences() > 0)
    NewAttrs.addAttribute("disable-tail-calls",
                          toStringRef(DisableTailCalls));
  if (StackRealign)
    NewAttrs.addAttribute("stackrealign");

  if (TrapFuncName.getNumOccurrences() > 0)
    for (auto &B : F)
      for (auto &I : B)
        if (auto *Call = dyn_cast<CallInst>(&I))
          if (const auto *F = Call->getCalledFunction())
            if (F->getIntrinsicID() == Intrinsic::debugtrap ||
                F->getIntrinsicID() == Intrinsic::trap)
              Call->addAttribute(
                llvm::AttributeList::FunctionIndex,
                Attribute::get(Ctx, "trap-func-name", TrapFuncName));

  // Let NewAttrs override Attrs.
  F.setAttributes(
    Attrs.addAttributes(Ctx, AttributeList::FunctionIndex, NewAttrs));
}

/// Set function attributes of functions in Module M based on CPU,
/// Features, and command line flags.
LLVM_ATTRIBUTE_UNUSED static void
setFunctionAttributes(StringRef CPU, StringRef Features, Module &M) {
  for (Function &F : M)
    setFunctionAttributes(CPU, Features, F);
}
