clang 24.0.0git
CodeGenOptions.h
Go to the documentation of this file.
1//===--- CodeGenOptions.h ---------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the CodeGenOptions interface.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_BASIC_CODEGENOPTIONS_H
14#define LLVM_CLANG_BASIC_CODEGENOPTIONS_H
15
20#include "llvm/ADT/FloatingPointMode.h"
21#include "llvm/Frontend/Debug/Options.h"
22#include "llvm/Frontend/Driver/CodeGenOptions.h"
23#include "llvm/MC/MCTargetOptions.h"
24#include "llvm/Support/CodeGen.h"
25#include "llvm/Support/Regex.h"
26#include "llvm/Target/TargetOptions.h"
27#include "llvm/Transforms/Instrumentation/AddressSanitizerOptions.h"
28#include "llvm/Transforms/Utils/KCFIHash.h"
29#include <map>
30#include <memory>
31#include <string>
32#include <vector>
33
34namespace llvm {
35class PassBuilder;
36}
37namespace clang {
38
39/// A target's ABI policy for whether a class's vtable can be assumed to have
40/// a unique address program-wide. This is the basis for the exact dynamic_cast
41/// optimization (and, where a vtable is not assumed unique, for whether it may
42/// be marked unnamed_addr so the platform can duplicate it).
44 /// Every vtable has a single address program-wide.
46 /// A vtable with strong linkage (e.g., a class with a key function) is
47 /// unique, but a vague-linkage (weak) vtable may be duplicated by the
48 /// platform and so has no unique address.
50};
51
52/// Bitfields of CodeGenOptions, split out from CodeGenOptions to ensure
53/// that this large collection of bitfields is a trivial class type.
55 friend class CompilerInvocation;
57
58public:
59 /// For ASTs produced with different option value, signifies their level of
60 /// compatibility.
61 enum class CompatibilityKind {
62 /// Does affect the construction of the AST in a way that does prevent
63 /// module interoperability.
65 /// Does affect the construction of the AST in a way that doesn't prevent
66 /// interoperability (that is, the value can be different between an
67 /// explicit module and the user of that module).
69 /// Does not affect the construction of the AST in any way (that is, the
70 /// value can be different between an implicit module and the user of that
71 /// module).
73 };
74
76 using ProfileInstrKind = llvm::driver::ProfileInstrKind;
78 llvm::AsanDetectStackUseAfterReturnMode;
79 using AsanDtorKind = llvm::AsanDtorKind;
80 using VectorLibrary = llvm::driver::VectorLibrary;
81 using ZeroCallUsedRegsKind = llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind;
82 using WinX64EHUnwindMode = llvm::WinX64EHUnwindMode;
83 using ControlFlowGuardMechanism = llvm::ControlFlowGuardMechanism;
84
85 using DebugCompressionType = llvm::DebugCompressionType;
86 using EmitDwarfUnwindType = llvm::EmitDwarfUnwindType;
87 using DebugTemplateNamesKind = llvm::codegenoptions::DebugTemplateNamesKind;
88 using DebugInfoKind = llvm::codegenoptions::DebugInfoKind;
89 using DebuggerKind = llvm::DebuggerKind;
90 using RelocSectionSymType = llvm::RelocSectionSymType;
91
92#define CODEGENOPT(Name, Bits, Default, Compatibility) unsigned Name : Bits;
93#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility)
94#include "clang/Basic/CodeGenOptions.def"
95
96protected:
97#define CODEGENOPT(Name, Bits, Default, Compatibility)
98#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
99 unsigned Name : Bits;
100#include "clang/Basic/CodeGenOptions.def"
101};
102
103/// CodeGenOptions - Track various options which control how the code
104/// is optimized and passed to the backend.
106public:
108 NormalInlining, // Use the standard function inlining pass.
109 OnlyHintInlining, // Inline only (implicitly) hinted functions.
110 OnlyAlwaysInlining // Only run the always inlining pass.
111 };
112
118
125
127 SRCK_Default, // No special option was passed.
128 SRCK_OnStack, // Small structs on the stack (-fpcc-struct-return).
129 SRCK_InRegs // Small structs in registers (-freg-struct-return).
130 };
131
133 Embed_Off, // No embedded bitcode.
134 Embed_All, // Embed both bitcode and commandline in the output.
135 Embed_Bitcode, // Embed just the bitcode in the output.
136 Embed_Marker // Embed a marker as a placeholder for bitcode.
137 };
138
144
149
156
157 // This field stores one of the allowed values for the option
158 // -fbasic-block-sections=. The allowed values with this option are:
159 // {"all", "list=<file>", "none"}.
160 //
161 // "all" : Generate basic block sections for all basic blocks.
162 // "list=<file>": Generate basic block sections for a subset of basic blocks.
163 // The functions and the machine basic block ids are specified
164 // in the file.
165 // "none": Disable sections for basic blocks.
166 std::string BBSections;
167
168 // If set, override the default value of MCAsmInfo::BinutilsVersion. If
169 // DisableIntegratedAS is specified, the assembly output will consider GNU as
170 // support. "none" means that all ELF features can be used, regardless of
171 // binutils support.
172 std::string BinutilsVersion;
173
174 enum class FramePointerKind {
175 NonLeafNoReserve, // Keep non-leaf frame pointers, allow the FP to be used
176 // as a GPR in leaf functions.
177 None, // Omit all frame pointers.
178 Reserved, // Maintain valid frame pointer chain.
179 NonLeaf, // Keep non-leaf frame pointers, don't allow the FP to be used as a
180 // GPR in leaf functions.
181 All, // Keep all frame pointers.
182 };
183
185 switch (Kind) {
187 return "none";
189 return "reserved";
191 return "non-leaf-no-reserve";
193 return "non-leaf";
195 return "all";
196 }
197
198 llvm_unreachable("invalid FramePointerKind");
199 }
200
201 /// Possible exception handling behavior.
211
212 /// Translate a clang ExceptionHandlingKind into the corresponding LLVM
213 /// ExceptionHandling model.
214 static llvm::ExceptionHandling
216 switch (Kind) {
218 return llvm::ExceptionHandling::Default;
220 return llvm::ExceptionHandling::None;
222 return llvm::ExceptionHandling::SjLj;
224 return llvm::ExceptionHandling::WinEH;
226 return llvm::ExceptionHandling::DwarfCFI;
228 return llvm::ExceptionHandling::Wasm;
230 return llvm::ExceptionHandling::Emscripten;
231 }
232 llvm_unreachable("invalid ExceptionHandlingKind");
233 }
234
236 Auto, // Choose Swift async extended frame info based on deployment target.
237 Always, // Unconditionally emit Swift async extended frame info.
238 Never, // Don't emit Swift async extended frame info.
240 };
241
243 Language, // Not specified, use language standard.
244 Always, // All loops are assumed to be finite.
245 Never, // No loop is assumed to be finite.
246 };
247
253
255 None, ///< Trap Messages are omitted. This offers the smallest debug info
256 ///< size but at the cost of making traps hard to debug.
257 Basic, ///< Trap Message is fixed per SanitizerKind. Produces smaller debug
258 ///< info than `Detailed` but is not as helpful for debugging.
259 Detailed, ///< Trap Message includes more context (e.g. the expression being
260 ///< overflowed). This is more helpful for debugging but produces
261 ///< larger debug info than `Basic`.
262 };
263
264 enum class BoolFromMem {
265 Strict, ///< In-memory bool values are assumed to be 0 or 1, and any other
266 ///< value is UB.
267 Truncate, ///< Convert in-memory bools to i1 by checking if the least
268 ///< significant bit is 1.
269 NonZero, ///< Convert in-memory bools to i1 by checking if any bit is set
270 ///< to 1.
272 };
273
275 Auto, // Use the target dependent default.
276 ForceEnable, // Always enable regardless of the target default.
277 ForceDisable, // Always disable regardless of the target default.
278 };
279
280 /// The code model to use (-mcmodel).
281 std::string CodeModel;
282
283 /// The code model-specific large data threshold to use
284 /// (-mlarge-data-threshold).
286
287 /// The filename with path we use for coverage data files. The runtime
288 /// allows further manipulation with the GCOV_PREFIX and GCOV_PREFIX_STRIP
289 /// environment variables.
290 std::string CoverageDataFile;
291
292 /// The filename with path we use for coverage notes files.
293 std::string CoverageNotesFile;
294
295 /// Regexes separated by a semi-colon to filter the files to instrument.
297
298 /// Regexes separated by a semi-colon to filter the files to not instrument.
300
301 /// The version string to put into coverage files.
302 char CoverageVersion[4] = {'0', '0', '0', '0'};
303
304 /// Enable additional debugging information.
305 std::string DebugPass;
306
307 /// The string to embed in debug information as the current working directory.
309
310 /// The string to embed in coverage mapping as the current working directory.
312
313 /// The string to embed in the debug information for the compile unit, if
314 /// non-empty.
315 std::string DwarfDebugFlags;
316
317 /// The string containing the commandline for the llvm.commandline metadata,
318 /// if non-empty.
319 std::string RecordCommandLine;
320
321 /// The string containing the commandline for the dx.source.args metadata,
322 /// if non-empty.
324
325 /// The vector contains parsed commandline for the dx.source.args metadata,
326 /// if parsing was successful.
328
330
331 /// Prefix replacement map for source-based code coverage to remap source
332 /// file paths in coverage mapping.
334
335 /// The ABI to use for passing floating point arguments.
336 std::string FloatABI;
337
338 /// The file to use for dumping bug report by `Debugify` for original
339 /// debug info.
341
342 /// The floating-point denormal mode to use.
343 llvm::DenormalMode FPDenormalMode = llvm::DenormalMode::getIEEE();
344
345 /// The floating-point denormal mode to use, for float.
346 llvm::DenormalMode FP32DenormalMode = llvm::DenormalMode::getIEEE();
347
348 /// The float precision limit to use, if non-empty.
350
352 /// The filename of the bitcode file to link in.
353 std::string Filename;
354 /// If true, we set attributes functions in the bitcode library according to
355 /// our CodeGenOptions, much as we set attrs on functions that we generate
356 /// ourselves.
357 bool PropagateAttrs = false;
358 /// If true, we use LLVM module internalizer.
359 bool Internalize = false;
360 /// Bitwise combination of llvm::Linker::Flags, passed to the LLVM linker.
361 unsigned LinkFlags = 0;
362 };
363
364 /// The files specified here are linked in to the module before optimizations.
365 std::vector<BitcodeFileToLink> LinkBitcodeFiles;
366
367 /// The user provided name for the "main file", if non-empty. This is useful
368 /// in situations where the input file name does not match the original input
369 /// file, for example with -save-temps.
370 std::string MainFileName;
371
372 /// The name for the split debug info file used for the DW_AT_[GNU_]dwo_name
373 /// attribute in the skeleton CU.
374 std::string SplitDwarfFile;
375
376 /// Output filename for the split debug info, not used in the skeleton CU.
377 std::string SplitDwarfOutput;
378
379 /// Output filename used in the COFF debug information.
381
382 /// The name of the relocation model to use.
383 llvm::Reloc::Model RelocationModel;
384
385 /// If not an empty string, trap intrinsics are lowered to calls to this
386 /// function instead of to trap instructions.
387 std::string TrapFuncName;
388
389 /// A list of dependent libraries.
390 std::vector<std::string> DependentLibraries;
391
392 /// A list of linker options to embed in the object file.
393 std::vector<std::string> LinkerOptions;
394
395 /// Name of the profile file to use as output for -fprofile-instr-generate,
396 /// -fprofile-generate, and -fcs-profile-generate.
398
399 /// Name of the patchable function entry section with
400 /// -fpatchable-function-entry.
402
403 /// Name of the profile file to use with -fprofile-sample-use.
404 std::string SampleProfileFile;
405
406 /// Name of the profile file to use as output for with -fmemory-profile.
408
409 /// Name of the profile file to use as input for -fmemory-profile-use.
411
412 /// Name of the profile file to use as input for -fprofile-instr-use
414
415 /// Name of the profile remapping file to apply to the profile data supplied
416 /// by -fprofile-sample-use or -fprofile-instr-use.
418
419 /// Name of the function summary index file to use for ThinLTO function
420 /// importing.
421 std::string ThinLTOIndexFile;
422
423 /// Name of a file that can optionally be written with minimized bitcode
424 /// to be used as input for the ThinLTO thin link step, which only needs
425 /// the summary and module symbol table (and not, e.g. any debug metadata).
427
428 /// Prefix to use for -save-temps output.
430
431 /// Prefix to use for -save-dynamic-debugging-temps output.
433
434 /// Name of file passed with -foffload-include-binary option to forward to
435 /// offloading runtime back-end for incorporating them into host-side object
436 /// file.
438
439 /// List of filenames passed in using the -fembed-offload-object option. These
440 /// are offloading binaries containing device images and metadata.
441 std::vector<std::string> OffloadObjects;
442
443 /// The name of the file to which the backend should save YAML optimization
444 /// records.
445 std::string OptRecordFile;
446
447 /// The regex that filters the passes that should be saved to the optimization
448 /// records.
449 std::string OptRecordPasses;
450
451 /// The format used for serializing remarks (default: YAML)
452 std::string OptRecordFormat;
453
454 /// The name of the partition that symbols are assigned to, specified with
455 /// -fsymbol-partition (see https://lld.llvm.org/Partitions.html).
456 std::string SymbolPartition;
457
458 /// If non-empty, allow the compiler to assume that the given source file
459 /// identifier is unique at link time.
461
463 RK_Missing, // Remark argument not present on the command line.
464 RK_Enabled, // Remark enabled via '-Rgroup'.
465 RK_EnabledEverything, // Remark enabled via '-Reverything'.
466 RK_Disabled, // Remark disabled via '-Rno-group'.
467 RK_DisabledEverything, // Remark disabled via '-Rno-everything'.
468 RK_WithPattern, // Remark pattern specified via '-Rgroup=regexp'.
469 };
470
471 /// Optimization remark with an optional regular expression pattern.
472 struct OptRemark {
474 std::string Pattern;
475 std::shared_ptr<llvm::Regex> Regex;
476
477 /// By default, optimization remark is missing.
478 OptRemark() = default;
479
480 /// Returns true iff the optimization remark holds a valid regular
481 /// expression.
482 bool hasValidPattern() const { return Regex != nullptr; }
483
484 /// Matches the given string against the regex, if there is some.
485 bool patternMatches(StringRef String) const {
486 return hasValidPattern() && Regex->match(String);
487 }
488 };
489
490 /// Selected optimizations for which we should enable optimization remarks.
491 /// Transformation passes whose name matches the contained (optional) regular
492 /// expression (and support this feature), will emit a diagnostic whenever
493 /// they perform a transformation.
495
496 /// Selected optimizations for which we should enable missed optimization
497 /// remarks. Transformation passes whose name matches the contained (optional)
498 /// regular expression (and support this feature), will emit a diagnostic
499 /// whenever they tried but failed to perform a transformation.
501
502 /// Selected optimizations for which we should enable optimization analyses.
503 /// Transformation passes whose name matches the contained (optional) regular
504 /// expression (and support this feature), will emit a diagnostic whenever
505 /// they want to explain why they decided to apply or not apply a given
506 /// transformation.
508
509 /// Set of sanitizer checks that are non-fatal (i.e. execution should be
510 /// continued when possible).
512
513 /// Set of sanitizer checks that trap rather than diagnose.
515
516 /// Set of sanitizer checks that can merge handlers (smaller code size at
517 /// the expense of debuggability).
519
520 /// Set of thresholds in a range [0.0, 1.0]: the top hottest code responsible
521 /// for the given fraction of PGO counters will be excluded from sanitization
522 /// (0.0 [default] to skip none, 1.0 to skip all).
524
525 /// Set of sanitizer checks, for which the instrumentation will be annotated
526 /// with extra debug info.
528
529 std::optional<double> AllowRuntimeCheckSkipHotCutoff;
530
531 /// List of backend command-line options for -fembed-bitcode.
532 std::vector<uint8_t> CmdArgs;
533
534 /// A list of all -fno-builtin-* function names (e.g., memset).
535 std::vector<std::string> NoBuiltinFuncs;
536
537 std::vector<std::string> Reciprocals;
538
539 /// Configuration for pointer-signing.
541
542 /// The preferred width for auto-vectorization transforms. This is intended to
543 /// override default transforms based on the width of the architected vector
544 /// registers.
545 std::string PreferVectorWidth;
546
547 /// Set of XRay instrumentation kinds to emit.
549
550 std::vector<std::string> DefaultFunctionAttrs;
551
552 /// List of dynamic shared object files to be loaded as pass plugins.
553 std::vector<std::string> PassPlugins;
554
555 /// List of pass builder callbacks.
556 std::vector<std::function<void(llvm::PassBuilder &)>> PassBuilderCallbacks;
557
558 /// List of global variables explicitly specified by the user as toc-data.
559 std::vector<std::string> TocDataVarsUserSpecified;
560
561 /// List of global variables that over-ride the toc-data default.
562 std::vector<std::string> NoTocDataVars;
563
564 /// Path to allowlist file specifying which objects
565 /// (files, functions) should exclusively be instrumented
566 /// by sanitizer coverage pass.
567 std::vector<std::string> SanitizeCoverageAllowlistFiles;
568
569 /// The guard style used for stack protector to get a initial value, this
570 /// value usually be gotten from TLS or get from __stack_chk_guard, or some
571 /// other styles we may implement in the future.
573
574 /// The TLS base register when StackProtectorGuard is "tls", or register used
575 /// to store the stack canary for "sysreg".
576 /// On x86 this can be "fs" or "gs".
577 /// On AArch64 this can only be "sp_el0".
579
580 /// Specify a symbol to be the guard value.
582
583 /// Path to ignorelist file specifying which objects
584 /// (files, functions) listed for instrumentation by sanitizer
585 /// coverage pass should actually not be instrumented.
586 std::vector<std::string> SanitizeCoverageIgnorelistFiles;
587
588 /// Path to ignorelist file specifying which objects
589 /// (files, functions) listed for instrumentation by sanitizer
590 /// binary metadata pass should not be instrumented.
591 std::vector<std::string> SanitizeMetadataIgnorelistFiles;
592
593 /// Hash algorithm to use for KCFI type IDs.
594 llvm::KCFIHashAlgorithm SanitizeKcfiHash;
595
596 /// Name of the stack usage file (i.e., .su file) if user passes
597 /// -fstack-usage. If empty, it can be implied that -fstack-usage is not
598 /// passed on the command line.
599 std::string StackUsageFile;
600
601 /// Executable and command-line used to create a given CompilerInvocation.
602 /// Most of the time this will be the full -cc1 command.
603 const char *Argv0 = nullptr;
604 std::vector<std::string> CommandLineArgs;
605
606 /// The minimum hotness value a diagnostic needs in order to be included in
607 /// optimization diagnostics.
608 ///
609 /// The threshold is an Optional value, which maps to one of the 3 states:
610 /// 1. 0 => threshold disabled. All remarks will be printed.
611 /// 2. positive int => manual threshold by user. Remarks with hotness exceed
612 /// threshold will be printed.
613 /// 3. None => 'auto' threshold by user. The actual value is not
614 /// available at command line, but will be synced with
615 /// hotness threshold from profile summary during
616 /// compilation.
617 ///
618 /// If threshold option is not specified, it is disabled by default.
619 std::optional<uint64_t> DiagnosticsHotnessThreshold = 0;
620
621 /// The maximum percentage profiling weights can deviate from the expected
622 /// values in order to be included in misexpect diagnostics.
623 std::optional<uint32_t> DiagnosticsMisExpectTolerance = 0;
624
625 /// The name of a file to use with \c .secure_log_unique directives.
626 std::string AsSecureLogFile;
627
628 /// A list of functions that are replacable by the loader.
629 std::vector<std::string> LoaderReplaceableFunctionNames;
630 /// The name of a file that contains functions which will be compiled for
631 /// hotpatching. See -fms-secure-hotpatch-functions-file.
633
634 /// A list of functions which will be compiled for hotpatching.
635 /// See -fms-secure-hotpatch-functions-list.
636 std::vector<std::string> MSSecureHotPatchFunctionsList;
637
638public:
639 // Define accessors/mutators for code generation options of enumeration type.
640#define CODEGENOPT(Name, Bits, Default, Compatibility)
641#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
642 Type get##Name() const { return static_cast<Type>(Name); } \
643 void set##Name(Type Value) { Name = static_cast<unsigned>(Value); }
644#include "clang/Basic/CodeGenOptions.def"
645
647
648 const std::vector<std::string> &getNoBuiltinFuncs() const {
649 return NoBuiltinFuncs;
650 }
651
652 bool hasSjLjExceptions() const {
653 return getExceptionHandling() == ExceptionHandlingKind::SjLj;
654 }
655
656 bool hasSEHExceptions() const {
657 return getExceptionHandling() == ExceptionHandlingKind::WinEH;
658 }
659
660 bool hasDWARFExceptions() const {
661 return getExceptionHandling() == ExceptionHandlingKind::DwarfCFI;
662 }
663
664 bool hasWasmExceptions() const {
665 return getExceptionHandling() == ExceptionHandlingKind::Wasm;
666 }
667
669 return getExceptionHandling() == ExceptionHandlingKind::Emscripten;
670 }
671
672 /// Check if Clang profile instrumenation is on.
673 bool hasProfileClangInstr() const {
674 return getProfileInstr() ==
675 llvm::driver::ProfileInstrKind::ProfileClangInstr;
676 }
677
678 /// Check if IR level profile instrumentation is on.
679 bool hasProfileIRInstr() const {
680 return getProfileInstr() == llvm::driver::ProfileInstrKind::ProfileIRInstr;
681 }
682
683 /// Check if CS IR level profile instrumentation is on.
684 bool hasProfileCSIRInstr() const {
685 return getProfileInstr() ==
686 llvm::driver::ProfileInstrKind::ProfileCSIRInstr;
687 }
688
689 /// Check if any form of instrumentation is on.
690 bool hasProfileInstr() const {
691 return getProfileInstr() != llvm::driver::ProfileInstrKind::ProfileNone;
692 }
693
694 /// Check if Clang profile use is on.
695 bool hasProfileClangUse() const {
696 return getProfileUse() == llvm::driver::ProfileInstrKind::ProfileClangInstr;
697 }
698
699 /// Check if IR level profile use is on.
700 bool hasProfileIRUse() const {
701 return getProfileUse() == llvm::driver::ProfileInstrKind::ProfileIRInstr ||
702 getProfileUse() == llvm::driver::ProfileInstrKind::ProfileCSIRInstr;
703 }
704
705 /// Check if CSIR profile use is on.
706 bool hasProfileCSIRUse() const {
707 return getProfileUse() == llvm::driver::ProfileInstrKind::ProfileCSIRInstr;
708 }
709
710 /// Check if type and variable info should be emitted.
711 bool hasReducedDebugInfo() const {
712 return getDebugInfo() >= llvm::codegenoptions::DebugInfoConstructor;
713 }
714
715 /// Check if maybe unused type info should be emitted.
717 return getDebugInfo() >= llvm::codegenoptions::UnusedTypeInfo;
718 }
719
720 // Check if any one of SanitizeCoverage* is enabled.
721 bool hasSanitizeCoverage() const {
722 return SanitizeCoverageType || SanitizeCoverageIndirectCalls ||
723 SanitizeCoverageTraceCmp || SanitizeCoverageTraceLoads ||
724 SanitizeCoverageTraceStores || SanitizeCoverageControlFlow;
725 }
726
727 // Check if any one of SanitizeBinaryMetadata* is enabled.
729 return SanitizeBinaryMetadataCovered || SanitizeBinaryMetadataAtomics ||
730 SanitizeBinaryMetadataUAR;
731 }
732
733 /// Reset all of the options that are not considered when building a
734 /// module.
735 void resetNonModularOptions(StringRef ModuleFormat);
736
737 // Is the given function name one of the functions that can be replaced by the
738 // loader?
739 bool isLoaderReplaceableFunctionName(StringRef FuncName) const {
740 return llvm::is_contained(LoaderReplaceableFunctionNames, FuncName);
741 }
742
743 /// Are we building at -O1 or higher?
744 bool isOptimizedBuild() const { return OptimizationLevel > 0; }
745
746 /// When loading a bool from a storage unit larger than i1, should it
747 /// be converted to i1 by comparing to 0 or by truncating to i1?
749 switch (getLoadBoolFromMem()) {
751 return !isOptimizedBuild();
752
754 return false;
755
757 return true;
758 }
759 llvm_unreachable("Unknown BoolFromMem enum");
760 }
761
762 /// Remap specified path prefix using provided DebugPrefixMap map.
763 /// Returns updated path or unchanged if no substitution was found.
764 std::string remapDebugPathPrefix(StringRef Path) const;
765};
766
767} // end namespace clang
768
769#endif
Defines the clang::SanitizerKind enum.
Defines the clang::XRayInstrKind enum.
Bitfields of CodeGenOptions, split out from CodeGenOptions to ensure that this large collection of bi...
llvm::driver::ProfileInstrKind ProfileInstrKind
llvm::AsanDtorKind AsanDtorKind
llvm::WinX64EHUnwindMode WinX64EHUnwindMode
llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind ZeroCallUsedRegsKind
llvm::codegenoptions::DebugInfoKind DebugInfoKind
llvm::DebuggerKind DebuggerKind
llvm::EmitDwarfUnwindType EmitDwarfUnwindType
llvm::AsanDetectStackUseAfterReturnMode AsanDetectStackUseAfterReturnMode
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
@ NotCompatible
Does affect the construction of the AST in a way that does prevent module interoperability.
@ Compatible
Does affect the construction of the AST in a way that doesn't prevent interoperability (that is,...
@ Benign
Does not affect the construction of the AST in any way (that is, the value can be different between a...
friend class CompilerInvocationBase
llvm::ControlFlowGuardMechanism ControlFlowGuardMechanism
llvm::DebugCompressionType DebugCompressionType
llvm::RelocSectionSymType RelocSectionSymType
llvm::driver::VectorLibrary VectorLibrary
llvm::codegenoptions::DebugTemplateNamesKind DebugTemplateNamesKind
clang::CFBranchLabelSchemeKind CFBranchLabelSchemeKind
llvm::SmallVector< std::pair< std::string, std::string >, 0 > CoveragePrefixMap
Prefix replacement map for source-based code coverage to remap source file paths in coverage mapping.
std::string StackProtectorGuardSymbol
Specify a symbol to be the guard value.
SanitizerSet SanitizeMergeHandlers
Set of sanitizer checks that can merge handlers (smaller code size at the expense of debuggability).
std::string StackUsageFile
Name of the stack usage file (i.e., .su file) if user passes -fstack-usage.
std::string UniqueSourceFileIdentifier
If non-empty, allow the compiler to assume that the given source file identifier is unique at link ti...
std::string MSSecureHotPatchFunctionsFile
The name of a file that contains functions which will be compiled for hotpatching.
const std::vector< std::string > & getNoBuiltinFuncs() const
std::vector< std::string > LoaderReplaceableFunctionNames
A list of functions that are replacable by the loader.
llvm::SmallVector< std::pair< std::string, std::string >, 0 > DebugPrefixMap
@ None
Trap Messages are omitted.
@ Detailed
Trap Message includes more context (e.g.
@ Basic
Trap Message is fixed per SanitizerKind.
std::string OptRecordFile
The name of the file to which the backend should save YAML optimization records.
std::string InstrProfileOutput
Name of the profile file to use as output for -fprofile-instr-generate, -fprofile-generate,...
bool hasEmscriptenExceptions() const
std::string StackProtectorGuard
The guard style used for stack protector to get a initial value, this value usually be gotten from TL...
bool hasDWARFExceptions() const
std::vector< BitcodeFileToLink > LinkBitcodeFiles
The files specified here are linked in to the module before optimizations.
std::string RecordCommandLine
The string containing the commandline for the llvm.commandline metadata, if non-empty.
std::optional< uint64_t > DiagnosticsHotnessThreshold
The minimum hotness value a diagnostic needs in order to be included in optimization diagnostics.
bool hasProfileInstr() const
Check if any form of instrumentation is on.
static llvm::ExceptionHandling toExceptionHandling(ExceptionHandlingKind Kind)
Translate a clang ExceptionHandlingKind into the corresponding LLVM ExceptionHandling model.
bool isConvertingBoolWithCmp0() const
When loading a bool from a storage unit larger than i1, should it be converted to i1 by comparing to ...
bool hasProfileIRUse() const
Check if IR level profile use is on.
char CoverageVersion[4]
The version string to put into coverage files.
std::string FloatABI
The ABI to use for passing floating point arguments.
std::string OffloadBinaryToEmbedFile
Name of file passed with -foffload-include-binary option to forward to offloading runtime back-end fo...
std::string HLSLRecordCommandLine
The string containing the commandline for the dx.source.args metadata, if non-empty.
std::string ThinLinkBitcodeFile
Name of a file that can optionally be written with minimized bitcode to be used as input for the Thin...
bool hasProfileCSIRInstr() const
Check if CS IR level profile instrumentation is on.
std::vector< std::string > DependentLibraries
A list of dependent libraries.
std::string DebugPass
Enable additional debugging information.
llvm::Reloc::Model RelocationModel
The name of the relocation model to use.
llvm::DenormalMode FPDenormalMode
The floating-point denormal mode to use.
std::string CoverageNotesFile
The filename with path we use for coverage notes files.
std::string ProfileInstrumentUsePath
Name of the profile file to use as input for -fprofile-instr-use.
std::string SampleProfileFile
Name of the profile file to use with -fprofile-sample-use.
uint64_t LargeDataThreshold
The code model-specific large data threshold to use (-mlarge-data-threshold).
static StringRef getFramePointerKindName(FramePointerKind Kind)
std::string MemoryProfileOutput
Name of the profile file to use as output for with -fmemory-profile.
std::vector< std::function< void(llvm::PassBuilder &)> > PassBuilderCallbacks
List of pass builder callbacks.
std::string LimitFloatPrecision
The float precision limit to use, if non-empty.
std::string CodeModel
The code model to use (-mcmodel).
std::vector< std::string > TocDataVarsUserSpecified
List of global variables explicitly specified by the user as toc-data.
std::string CoverageDataFile
The filename with path we use for coverage data files.
std::vector< std::string > PassPlugins
List of dynamic shared object files to be loaded as pass plugins.
bool hasProfileClangInstr() const
Check if Clang profile instrumenation is on.
std::string DebugCompilationDir
The string to embed in debug information as the current working directory.
std::optional< uint32_t > DiagnosticsMisExpectTolerance
The maximum percentage profiling weights can deviate from the expected values in order to be included...
std::string OptRecordPasses
The regex that filters the passes that should be saved to the optimization records.
std::vector< std::string > SanitizeCoverageAllowlistFiles
Path to allowlist file specifying which objects (files, functions) should exclusively be instrumented...
std::string SaveTempsFilePrefix
Prefix to use for -save-temps output.
std::string PatchableFunctionEntrySection
Name of the patchable function entry section with -fpatchable-function-entry.
XRayInstrSet XRayInstrumentationBundle
Set of XRay instrumentation kinds to emit.
std::vector< std::string > SanitizeCoverageIgnorelistFiles
Path to ignorelist file specifying which objects (files, functions) listed for instrumentation by san...
bool hasSanitizeCoverage() const
std::vector< std::string > Reciprocals
std::string MainFileName
The user provided name for the "main file", if non-empty.
SanitizerSet SanitizeAnnotateDebugInfo
Set of sanitizer checks, for which the instrumentation will be annotated with extra debug info.
PointerAuthOptions PointerAuth
Configuration for pointer-signing.
llvm::DenormalMode FP32DenormalMode
The floating-point denormal mode to use, for float.
bool hasProfileIRInstr() const
Check if IR level profile instrumentation is on.
bool hasProfileCSIRUse() const
Check if CSIR profile use is on.
std::string CoverageCompilationDir
The string to embed in coverage mapping as the current working directory.
SanitizerSet SanitizeTrap
Set of sanitizer checks that trap rather than diagnose.
std::vector< std::string > SanitizeMetadataIgnorelistFiles
Path to ignorelist file specifying which objects (files, functions) listed for instrumentation by san...
SanitizerSet SanitizeRecover
Set of sanitizer checks that are non-fatal (i.e.
std::string ProfileExcludeFiles
Regexes separated by a semi-colon to filter the files to not instrument.
std::string AsSecureLogFile
The name of a file to use with .secure_log_unique directives.
std::string ProfileRemappingFile
Name of the profile remapping file to apply to the profile data supplied by -fprofile-sample-use or -...
bool hasReducedDebugInfo() const
Check if type and variable info should be emitted.
bool hasSanitizeBinaryMetadata() const
OptRemark OptimizationRemark
Selected optimizations for which we should enable optimization remarks.
llvm::KCFIHashAlgorithm SanitizeKcfiHash
Hash algorithm to use for KCFI type IDs.
std::string ThinLTOIndexFile
Name of the function summary index file to use for ThinLTO function importing.
const char * Argv0
Executable and command-line used to create a given CompilerInvocation.
bool hasWasmExceptions() const
llvm::SmallVector< llvm::SmallString< 8 > > HLSLParsedCommandLine
The vector contains parsed commandline for the dx.source.args metadata, if parsing was successful.
bool hasSjLjExceptions() const
std::string TrapFuncName
If not an empty string, trap intrinsics are lowered to calls to this function instead of to trap inst...
std::string remapDebugPathPrefix(StringRef Path) const
Remap specified path prefix using provided DebugPrefixMap map.
SanitizerMaskCutoffs SanitizeSkipHotCutoffs
Set of thresholds in a range [0.0, 1.0]: the top hottest code responsible for the given fraction of P...
std::string SplitDwarfFile
The name for the split debug info file used for the DW_AT_[GNU_]dwo_name attribute in the skeleton CU...
std::string StackProtectorGuardReg
The TLS base register when StackProtectorGuard is "tls", or register used to store the stack canary f...
std::vector< std::string > DefaultFunctionAttrs
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
std::vector< uint8_t > CmdArgs
List of backend command-line options for -fembed-bitcode.
OptRemark OptimizationRemarkAnalysis
Selected optimizations for which we should enable optimization analyses.
std::optional< double > AllowRuntimeCheckSkipHotCutoff
std::vector< std::string > CommandLineArgs
std::vector< std::string > LinkerOptions
A list of linker options to embed in the object file.
bool hasSEHExceptions() const
std::string MemoryProfileUsePath
Name of the profile file to use as input for -fmemory-profile-use.
std::vector< std::string > MSSecureHotPatchFunctionsList
A list of functions which will be compiled for hotpatching.
void resetNonModularOptions(StringRef ModuleFormat)
Reset all of the options that are not considered when building a module.
@ Strict
In-memory bool values are assumed to be 0 or 1, and any other value is UB.
@ NonZero
Convert in-memory bools to i1 by checking if any bit is set to 1.
@ Truncate
Convert in-memory bools to i1 by checking if the least significant bit is 1.
ExceptionHandlingKind
Possible exception handling behavior.
std::string OptRecordFormat
The format used for serializing remarks (default: YAML)
bool hasProfileClangUse() const
Check if Clang profile use is on.
bool isOptimizedBuild() const
Are we building at -O1 or higher?
std::vector< std::string > OffloadObjects
List of filenames passed in using the -fembed-offload-object option.
std::string SymbolPartition
The name of the partition that symbols are assigned to, specified with -fsymbol-partition (see https:...
std::vector< std::string > NoTocDataVars
List of global variables that over-ride the toc-data default.
std::string ProfileFilterFiles
Regexes separated by a semi-colon to filter the files to instrument.
bool hasMaybeUnusedDebugInfo() const
Check if maybe unused type info should be emitted.
std::string PreferVectorWidth
The preferred width for auto-vectorization transforms.
std::string ObjectFilenameForDebug
Output filename used in the COFF debug information.
std::string SplitDwarfOutput
Output filename for the split debug info, not used in the skeleton CU.
bool isLoaderReplaceableFunctionName(StringRef FuncName) const
std::string DwarfDebugFlags
The string to embed in the debug information for the compile unit, if non-empty.
std::string DIBugsReportFilePath
The file to use for dumping bug report by Debugify for original debug info.
OptRemark OptimizationRemarkMissed
Selected optimizations for which we should enable missed optimization remarks.
std::string SaveDynDbgTempsFilePrefix
Prefix to use for -save-dynamic-debugging-temps output.
Top level wrappers for InstallAPI frontend operations.
VTableUniquenessKind
A target's ABI policy for whether a class's vtable can be assumed to have a unique address program-wi...
@ AlwaysUnique
Every vtable has a single address program-wide.
@ UniqueIfStrongLinkage
A vtable with strong linkage (e.g., a class with a key function) is unique, but a vague-linkage (weak...
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
int const char * function
Definition c++config.h:31
Optimization remark with an optional regular expression pattern.
std::shared_ptr< llvm::Regex > Regex
bool patternMatches(StringRef String) const
Matches the given string against the regex, if there is some.
OptRemark()=default
By default, optimization remark is missing.
bool hasValidPattern() const
Returns true iff the optimization remark holds a valid regular expression.