32#define CGOPT(TY, NAME) \
33 static cl::opt<TY> *NAME##View; \
34 TY codegen::get##NAME() { \
35 assert(NAME##View && "RegisterCodeGenFlags not created."); \
39#define CGLIST(TY, NAME) \
40 static cl::list<TY> *NAME##View; \
41 std::vector<TY> codegen::get##NAME() { \
42 assert(NAME##View && "RegisterCodeGenFlags not created."); \
47#define CGOPT_EXP(TY, NAME) \
49 std::optional<TY> codegen::getExplicit##NAME() { \
50 if (NAME##View->getNumOccurrences()) { \
51 TY res = *NAME##View; \
54 return std::nullopt; \
57CGOPT(std::string, MArch)
58CGOPT(std::string, MCPU)
67CGOPT(
bool, EnableUnsafeFPMath)
68CGOPT(
bool, EnableNoInfsFPMath)
69CGOPT(
bool, EnableNoNaNsFPMath)
70CGOPT(
bool, EnableNoSignedZerosFPMath)
71CGOPT(
bool, EnableNoTrappingFPMath)
72CGOPT(
bool, EnableAIXExtendedAltivecABI)
75CGOPT(
bool, EnableHonorSignDependentRoundingFPMath)
79CGOPT(
bool, DontPlaceZerosInBSS)
80CGOPT(
bool, EnableGuaranteedTailCallOpt)
81CGOPT(
bool, DisableTailCalls)
82CGOPT(
bool, StackSymbolOrdering)
83CGOPT(
bool, StackRealign)
84CGOPT(std::string, TrapFuncName)
86CGOPT(
bool, DisableIntegratedAS)
89CGOPT(
bool, IgnoreXCOFFVisibility)
90CGOPT(
bool, XCOFFTracebackTable)
91CGOPT(
bool, EnableBBAddrMap)
92CGOPT(std::string, BBSections)
93CGOPT(
unsigned, TLSSize)
96CGOPT(
bool, UniqueSectionNames)
97CGOPT(
bool, UniqueBasicBlockSectionNames)
98CGOPT(
bool, SeparateNamedSections)
101CGOPT(
bool, EnableStackSizeSection)
102CGOPT(
bool, EnableAddrsig)
103CGOPT(
bool, EnableCallGraphSection)
104CGOPT(
bool, EmitCallSiteInfo)
106CGOPT(
bool, EnableStaticDataPartitioning)
107CGOPT(
bool, EnableDebugEntryValues)
108CGOPT(
bool, ForceDwarfFrameSection)
109CGOPT(
bool, XRayFunctionIndex)
110CGOPT(
bool, DebugStrictDwarf)
111CGOPT(
unsigned, AlignLoops)
112CGOPT(
bool, JMCInstrument)
113CGOPT(
bool, XCOFFReadOnlyPointers)
116#define CGBINDOPT(NAME) \
118 NAME##View = std::addressof(NAME); \
122 "march",
cl::desc(
"Architecture to generate code for (see --version)"));
126 "mcpu",
cl::desc(
"Target a specific cpu type (-mcpu=help for details)"),
132 cl::desc(
"Target specific attributes (-mattr=help for details)"),
137 "relocation-model",
cl::desc(
"Choose relocation model"),
141 "Fully relocatable, position independent code"),
143 "Relocatable external references, non-relocatable code"),
146 "Code and read-only data relocatable, accessed PC-relative"),
149 "Read-write data relocatable, accessed relative to static base"),
151 "Combination of ropi and rwpi")));
155 "thread-model",
cl::desc(
"Choose threading model"),
163 "code-model",
cl::desc(
"Choose code model"),
172 "large-data-threshold",
173 cl::desc(
"Choose large data threshold for x86_64 medium code model"),
178 "exception-model",
cl::desc(
"exception model"),
181 clEnumValN(ExceptionHandling::None,
"default",
182 "default exception handling model"),
183 clEnumValN(ExceptionHandling::DwarfCFI,
"dwarf",
184 "DWARF-like CFI based exception handling"),
186 "SjLj exception handling"),
187 clEnumValN(ExceptionHandling::ARM,
"arm",
"ARM EHABI exceptions"),
189 "Windows exception model"),
191 "WebAssembly exception handling")));
195 "filetype",
cl::init(CodeGenFileType::AssemblyFile),
197 "Choose a file type (not all types are supported by all targets):"),
199 "Emit an assembly ('.s') file"),
200 clEnumValN(CodeGenFileType::ObjectFile,
"obj",
201 "Emit a native object ('.o') file"),
203 "Emit nothing, for performance testing")));
208 cl::desc(
"Specify frame pointer elimination optimization"),
212 "Disable frame pointer elimination"),
213 clEnumValN(FramePointerKind::NonLeaf,
"non-leaf",
214 "Disable frame pointer elimination for non-leaf frame"),
215 clEnumValN(FramePointerKind::Reserved,
"reserved",
216 "Enable frame pointer elimination, but reserve the frame "
219 "Enable frame pointer elimination")));
223 "enable-unsafe-fp-math",
224 cl::desc(
"Enable optimizations that may decrease FP precision"),
229 "enable-no-infs-fp-math",
230 cl::desc(
"Enable FP math optimizations that assume no +-Infs"),
235 "enable-no-nans-fp-math",
236 cl::desc(
"Enable FP math optimizations that assume no NaNs"),
241 "enable-no-signed-zeros-fp-math",
242 cl::desc(
"Enable FP math optimizations that assume "
243 "the sign of 0 is insignificant"),
248 "enable-no-trapping-fp-math",
249 cl::desc(
"Enable setting the FP exceptions build "
250 "attribute not to use exceptions"),
254 static const auto DenormFlagEnumOptions =
cl::values(
257 "the sign of a flushed-to-zero number is preserved "
260 "denormals are flushed to positive zero"),
262 "denormals have unknown treatment"));
267 cl::desc(
"Select which denormal numbers the code is permitted to require"),
269 DenormFlagEnumOptions);
273 "denormal-fp-math-f32",
274 cl::desc(
"Select which denormal numbers the code is permitted to require for float"),
276 DenormFlagEnumOptions);
280 "enable-sign-dependent-rounding-fp-math",
cl::Hidden,
281 cl::desc(
"Force codegen to assume rounding mode can change dynamically"),
283 CGBINDOPT(EnableHonorSignDependentRoundingFPMath);
286 "float-abi",
cl::desc(
"Choose float ABI type"),
289 "Target default float ABI type"),
291 "Soft float ABI (implied by -soft-float)"),
293 "Hard float ABI (uses FP registers)")));
297 "fp-contract",
cl::desc(
"Enable aggressive formation of fused FP ops"),
301 "Fuse FP ops whenever profitable"),
304 "Only fuse FP ops when the result won't be affected.")));
309 cl::desc(
"Determine when the Swift async frame pointer should be set"),
310 cl::init(SwiftAsyncFramePointerMode::Always),
312 "Determine based on deployment target"),
313 clEnumValN(SwiftAsyncFramePointerMode::Always,
"always",
314 "Always set the bit"),
315 clEnumValN(SwiftAsyncFramePointerMode::Never,
"never",
316 "Never set the bit")));
320 "nozero-initialized-in-bss",
321 cl::desc(
"Don't place zero-initialized symbols into bss section"),
326 "vec-extabi",
cl::desc(
"Enable the AIX Extended Altivec ABI."),
333 "Turn fastcc calls into tail calls by (potentially) changing ABI."),
342 "stack-symbol-ordering",
cl::desc(
"Order local stack symbols."),
348 cl::desc(
"Force align the stack to the minimum alignment"),
354 cl::desc(
"Emit a call to trap function rather than a trap instruction"),
359 cl::desc(
"Use .ctors instead of .init_array."),
364 "data-sections",
cl::desc(
"Emit data into separate sections"),
369 "function-sections",
cl::desc(
"Emit functions into separate sections"),
374 "ignore-xcoff-visibility",
375 cl::desc(
"Not emit the visibility attribute for asm in AIX OS or give "
376 "all symbols 'unspecified' visibility in XCOFF object file"),
381 "xcoff-traceback-table",
cl::desc(
"Emit the XCOFF traceback table"),
386 "basic-block-address-map",
391 "basic-block-sections",
392 cl::desc(
"Emit basic blocks into separate sections"),
406 "enable-tlsdesc",
cl::desc(
"Enable the use of TLS Descriptors"),
411 "unique-section-names",
cl::desc(
"Give unique names to every section"),
416 "unique-basic-block-section-names",
417 cl::desc(
"Give unique names to every basic block section"),
422 "separate-named-sections",
423 cl::desc(
"Use separate unique sections for named sections"),
428 "meabi",
cl::desc(
"Set EABI type (default depends on triple):"),
431 clEnumValN(EABI::Default,
"default",
"Triple default EABI version"),
432 clEnumValN(EABI::EABI4,
"4",
"EABI version 4"),
433 clEnumValN(EABI::EABI5,
"5",
"EABI version 5"),
438 "debugger-tune",
cl::desc(
"Tune debug info for a particular debugger"),
442 clEnumValN(DebuggerKind::LLDB,
"lldb",
"lldb"),
444 clEnumValN(DebuggerKind::SCE,
"sce",
"SCE targets (e.g. PS4)")));
448 "stack-size-section",
449 cl::desc(
"Emit a section containing stack size metadata"),
454 "addrsig",
cl::desc(
"Emit an address-significance table"),
459 "call-graph-section",
cl::desc(
"Emit a call graph section"),
464 "emit-call-site-info",
466 "Emit call site debug information, if debug information is enabled."),
471 "debug-entry-values",
472 cl::desc(
"Enable debug info for the debug entry values."),
477 "split-machine-functions",
478 cl::desc(
"Split out cold basic blocks from machine functions based on "
479 "profile information"),
484 "partition-static-data-sections",
485 cl::desc(
"Partition data sections using profile information."),
490 "force-dwarf-frame-section",
494 static cl::opt<bool> XRayFunctionIndex(
"xray-function-index",
495 cl::desc(
"Emit xray_fn_idx section"),
504 cl::desc(
"Default alignment for loops"));
508 "enable-jmc-instrument",
509 cl::desc(
"Instrument functions with a call to __CheckForDebuggerJustMyCode"),
515 cl::desc(
"When set to true, const objects with relocatable address "
516 "values are put into the RO data section."),
521 "no-integrated-as",
cl::desc(
"Disable integrated assembler"),
533 return BasicBlockSection::All;
535 return BasicBlockSection::None;
540 errs() <<
"Error loading basic block sections function list file: "
541 << MBOrErr.
getError().message() <<
"\n";
543 Options.BBSectionsFuncListBuf = std::move(*MBOrErr);
545 return BasicBlockSection::List;
566 Options.HonorSignDependentRoundingFPMathOption =
660 B.addAttribute(
Name, Val ?
"true" :
"false");
663#define HANDLE_BOOL_ATTR(CL, AttrName) \
665 if (CL->getNumOccurrences() > 0 && !F.hasFnAttribute(AttrName)) \
666 renderBoolStringAttr(NewAttrs, AttrName, *CL); \
673 auto &Ctx =
F.getContext();
677 if (!CPU.
empty() && !
F.hasFnAttribute(
"target-cpu"))
679 if (!Features.
empty()) {
682 F.getFnAttribute(
"target-features").getValueAsString();
683 if (OldFeatures.
empty())
688 Appended.
append(Features);
692 if (FramePointerUsageView->getNumOccurrences() > 0 &&
693 !
F.hasFnAttribute(
"frame-pointer")) {
703 if (DisableTailCallsView->getNumOccurrences() > 0)
714 if (DenormalFPMathView->getNumOccurrences() > 0 &&
715 !
F.hasFnAttribute(
"denormal-fp-math")) {
723 if (DenormalFP32MathView->getNumOccurrences() > 0 &&
724 !
F.hasFnAttribute(
"denormal-fp-math-f32")) {
729 "denormal-fp-math-f32",
733 if (TrapFuncNameView->getNumOccurrences() > 0)
736 if (
auto *Call = dyn_cast<CallInst>(&
I))
737 if (
const auto *
F = Call->getCalledFunction())
738 if (
F->getIntrinsicID() == Intrinsic::debugtrap ||
739 F->getIntrinsicID() == Intrinsic::trap)
744 F.setAttributes(Attrs.addFnAttributes(Ctx, NewAttrs));
758 Triple TheTriple(TargetTriple);
760 const auto *TheTarget =
771 Twine(
"could not allocate target machine for ") +
773 return std::unique_ptr<TargetMachine>(
Target);
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define CGOPT_EXP(TY, NAME)
#define HANDLE_BOOL_ATTR(CL, AttrName)
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
Module.h This file contains the declarations for the Module class.
static cl::opt< bool > EnableMachineFunctionSplitter("enable-split-machine-functions", cl::Hidden, cl::desc("Split out cold blocks from machine functions based on profile " "information."))
Enable the machine function splitter pass.
LLVM_ABI AttrBuilder & addAttribute(Attribute::AttrKind Val)
Add an attribute to the builder.
static LLVM_ABI Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
Represents either an error or a value T.
std::error_code getError() const
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFile(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
A Module instance is used to store all the information related to an LLVM module.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void append(StringRef RHS)
Append from a StringRef.
void push_back(const T &Elt)
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
Manages the enabling and disabling of subtarget specific features.
const std::vector< std::string > & getFeatures() const
Returns the vector of individual subtarget features.
LLVM_ABI std::string getString() const
Returns features as a string.
LLVM_ABI void AddFeature(StringRef String, bool Enable=true)
Adds Features.
Target - Wrapper for Target specific information.
TargetMachine * createTargetMachine(const Triple &TT, StringRef CPU, StringRef Features, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM=std::nullopt, CodeGenOptLevel OL=CodeGenOptLevel::Default, bool JIT=false) const
createTargetMachine - Create a target specific machine implementation for the specified Triple.
Triple - Helper class for working with autoconf configuration names.
bool hasDefaultTLSDESC() const
True if the target uses TLSDESC by default.
bool hasDefaultDataSections() const
Tests whether the target uses -data-sections as default.
bool hasDefaultEmulatedTLS() const
Tests whether the target uses emulated TLS as default.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
LLVM_ABI bool getEnableMachineFunctionSplitter()
LLVM_ABI bool getEnableHonorSignDependentRoundingFPMath()
LLVM_ABI std::string getTrapFuncName()
LLVM_ABI bool getEnableDebugEntryValues()
LLVM_ABI unsigned getTLSSize()
LLVM_ABI bool getEnableGuaranteedTailCallOpt()
LLVM_ABI llvm::FPOpFusion::FPOpFusionMode getFuseFPOps()
LLVM_ABI std::optional< CodeModel::Model > getExplicitCodeModel()
LLVM_ABI bool getFunctionSections()
LLVM_ABI bool getDisableTailCalls()
LLVM_ABI std::string getCPUStr()
LLVM_ABI bool getXCOFFReadOnlyPointers()
LLVM_ABI std::string getFeaturesStr()
LLVM_ABI bool getUniqueSectionNames()
LLVM_ABI DenormalMode::DenormalModeKind getDenormalFPMath()
LLVM_ABI llvm::FloatABI::ABIType getFloatABIForCalls()
LLVM_ABI void renderBoolStringAttr(AttrBuilder &B, StringRef Name, bool Val)
LLVM_ABI bool getDebugStrictDwarf()
LLVM_ABI bool getForceDwarfFrameSection()
LLVM_ABI bool getStackRealign()
LLVM_ABI std::string getMCPU()
LLVM_ABI bool getJMCInstrument()
LLVM_ABI bool getEnableAddrsig()
LLVM_ABI bool getStackSymbolOrdering()
LLVM_ABI SwiftAsyncFramePointerMode getSwiftAsyncFramePointer()
LLVM_ABI bool getEnableBBAddrMap()
LLVM_ABI std::vector< std::string > getFeatureList()
LLVM_ABI bool getEnableStaticDataPartitioning()
LLVM_ABI std::string getMArch()
LLVM_ABI DenormalMode::DenormalModeKind getDenormalFP32Math()
LLVM_ABI bool getEnableNoSignedZerosFPMath()
LLVM_ABI bool getEnableStackSizeSection()
LLVM_ABI llvm::EABI getEABIVersion()
LLVM_ABI bool getEnableCallGraphSection()
LLVM_ABI bool getEnableNoTrappingFPMath()
LLVM_ABI Expected< std::unique_ptr< TargetMachine > > createTargetMachineForTriple(StringRef TargetTriple, CodeGenOptLevel OptLevel=CodeGenOptLevel::Default)
Creates a TargetMachine instance with the options defined on the command line.
LLVM_ABI bool getUniqueBasicBlockSectionNames()
LLVM_ABI FramePointerKind getFramePointerUsage()
LLVM_ABI bool getDontPlaceZerosInBSS()
LLVM_ABI bool getSeparateNamedSections()
LLVM_ABI bool getEnableNoInfsFPMath()
LLVM_ABI bool getEnableUnsafeFPMath()
LLVM_ABI bool getEnableNoNaNsFPMath()
LLVM_ABI std::optional< bool > getExplicitDataSections()
LLVM_ABI ThreadModel::Model getThreadModel()
LLVM_ABI bool getXCOFFTracebackTable()
LLVM_ABI bool getIgnoreXCOFFVisibility()
LLVM_ABI bool getDisableIntegratedAS()
LLVM_ABI bool getUseCtors()
LLVM_ABI llvm::DebuggerKind getDebuggerTuningOpt()
LLVM_ABI std::vector< std::string > getMAttrs()
LLVM_ABI void setFunctionAttributes(StringRef CPU, StringRef Features, Function &F)
Set function attributes of function F based on CPU, Features, and command line flags.
LLVM_ABI llvm::BasicBlockSection getBBSectionsMode(llvm::TargetOptions &Options)
LLVM_ABI TargetOptions InitTargetOptionsFromCodeGenFlags(const llvm::Triple &TheTriple)
Common utility function tightly tied to the options listed here.
LLVM_ABI std::string getBBSections()
LLVM_ABI std::optional< bool > getExplicitEnableTLSDESC()
LLVM_ABI unsigned getAlignLoops()
LLVM_ABI std::optional< Reloc::Model > getExplicitRelocModel()
LLVM_ABI bool getEnableAIXExtendedAltivecABI()
LLVM_ABI bool getXRayFunctionIndex()
LLVM_ABI llvm::ExceptionHandling getExceptionModel()
LLVM_ABI bool getEmitCallSiteInfo()
LLVM_ABI std::optional< bool > getExplicitEmulatedTLS()
LLVM_ABI MCTargetOptions InitMCTargetOptionsFromFlags()
LLVM_ABI StringMap< bool, MallocAllocator > getHostCPUFeatures()
getHostCPUFeatures - Get the LLVM names for the host CPU features.
LLVM_ABI StringRef getHostCPUName()
getHostCPUName - Get the LLVM name for the host CPU.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
CodeGenFileType
These enums are meant to be passed into addPassesToEmitFile to indicate what type of file to emit,...
SwiftAsyncFramePointerMode
Indicates when and how the Swift async frame pointer bit should be set.
CodeGenOptLevel
Code generation optimization level.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
DebuggerKind
Identify a debugger for "tuning" the debug info.
Represent subnormal handling kind for floating point instruction inputs and outputs.
DenormalModeKind
Represent handled modes for denormal (aka subnormal) modes in the floating point environment.
@ PreserveSign
The sign of a flushed-to-zero number is preserved in the sign of 0.
@ PositiveZero
Denormals are flushed to positive zero.
@ Dynamic
Denormals have unknown treatment.
@ IEEE
IEEE-754 denormal numbers preserved.
static const Target * lookupTarget(StringRef TripleStr, std::string &Error)
lookupTarget - Lookup a target based on a target triple.
Create this object with static storage to register codegen-related command line options.
Create this object with static storage to register mc-related command line options.