[llvm-branch-commits] [llvm] [CommandLine] Make cl::boolOrDefault a scoped enum (PR #204553)
Petar Avramovic via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Jun 18 03:57:37 PDT 2026
https://github.com/petar-avramovic created https://github.com/llvm/llvm-project/pull/204553
Prevents implicit conversion to bool/int, where BOU_FALSE wrongly
evaluated as true. All uses qualified as cl::boolOrDefault::BOU_*.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply at anthropic.com>
>From b3c6fbcc46b4f8c2d2cd2875948d7d1c469a8f28 Mon Sep 17 00:00:00 2001
From: Petar Avramovic <Petar.Avramovic at amd.com>
Date: Thu, 18 Jun 2026 12:55:17 +0200
Subject: [PATCH] [CommandLine] Make cl::boolOrDefault a scoped enum
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Prevents implicit conversion to bool/int, where BOU_FALSE wrongly
evaluated as true. All uses qualified as cl::boolOrDefault::BOU_*.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply at anthropic.com>
---
bolt/lib/Rewrite/RewriteInstance.cpp | 7 +++--
llvm/include/llvm/Passes/CodeGenPassBuilder.h | 18 ++++++------
llvm/include/llvm/Support/CommandLine.h | 2 +-
.../include/llvm/Target/CGPassBuilderOption.h | 12 ++++----
llvm/lib/CodeGen/BranchFolding.cpp | 15 ++++++----
llvm/lib/CodeGen/GlobalMerge.cpp | 6 ++--
llvm/lib/CodeGen/MachineCopyPropagation.cpp | 6 ++--
llvm/lib/CodeGen/RegisterCoalescer.cpp | 6 ++--
llvm/lib/CodeGen/ShrinkWrap.cpp | 6 ++--
llvm/lib/CodeGen/TargetPassConfig.cpp | 28 ++++++++++---------
llvm/lib/MC/MCAsmInfo.cpp | 6 ++--
llvm/lib/MC/MCAsmInfoXCOFF.cpp | 2 +-
llvm/lib/Remarks/RemarkStreamer.cpp | 6 ++--
llvm/lib/Support/CommandLine.cpp | 11 +++++++-
llvm/lib/Support/WithColor.cpp | 7 +++--
.../Target/AArch64/AArch64TargetMachine.cpp | 14 +++++-----
.../AArch64/GISel/AArch64CallLowering.cpp | 3 +-
.../Target/AMDGPU/AMDGPUCodeGenPrepare.cpp | 4 +--
.../lib/Target/AMDGPU/AMDGPUTargetMachine.cpp | 6 ++--
llvm/lib/Target/ARM/ARMTargetMachine.cpp | 6 ++--
llvm/lib/Target/RISCV/RISCVTargetMachine.cpp | 4 +--
.../Transforms/ObjCARC/ObjCARCContract.cpp | 4 +--
.../Transforms/Scalar/LoopStrengthReduce.cpp | 6 ++--
.../Transforms/Vectorize/LoopVectorize.cpp | 6 ++--
llvm/tools/llvm-cov/CodeCoverage.cpp | 10 +++----
llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp | 7 +++--
llvm/tools/llvm-readobj/ELFDumper.cpp | 5 ++--
llvm/tools/llvm-readobj/ObjDumper.h | 2 +-
llvm/tools/llvm-readobj/llvm-readobj.cpp | 9 +++---
llvm/utils/yaml-bench/YAMLBench.cpp | 6 ++--
30 files changed, 129 insertions(+), 101 deletions(-)
diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp
index 6d8fd0b6e1099..0ceb42d61abb0 100644
--- a/bolt/lib/Rewrite/RewriteInstance.cpp
+++ b/bolt/lib/Rewrite/RewriteInstance.cpp
@@ -2284,15 +2284,16 @@ Error RewriteInstance::readSpecialSections() {
BC->printSections(BC->outs());
}
- if (opts::RelocationMode == cl::BOU_TRUE && !HasTextRelocations) {
+ if (opts::RelocationMode == cl::boolOrDefault::BOU_TRUE &&
+ !HasTextRelocations) {
BC->errs()
<< "BOLT-ERROR: relocations against code are missing from the input "
"file. Cannot proceed in relocations mode (-relocs).\n";
exit(1);
}
- BC->HasRelocations =
- HasTextRelocations && (opts::RelocationMode != cl::BOU_FALSE);
+ BC->HasRelocations = HasTextRelocations &&
+ (opts::RelocationMode != cl::boolOrDefault::BOU_FALSE);
if (BC->IsLinuxKernel && BC->HasRelocations) {
BC->outs() << "BOLT-INFO: disabling relocation mode for Linux kernel\n";
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 898aa7c9cf003..c4eec2300e693 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -194,9 +194,10 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
if (Opt.EnableGlobalISelAbort)
TM.Options.GlobalISelAbort = *Opt.EnableGlobalISelAbort;
- if (Opt.OptimizeRegAlloc == cl::BOU_UNSET)
- Opt.OptimizeRegAlloc =
- getOptLevel() != CodeGenOptLevel::None ? cl::BOU_TRUE : cl::BOU_FALSE;
+ if (Opt.OptimizeRegAlloc == cl::boolOrDefault::BOU_UNSET)
+ Opt.OptimizeRegAlloc = getOptLevel() != CodeGenOptLevel::None
+ ? cl::boolOrDefault::BOU_TRUE
+ : cl::boolOrDefault::BOU_FALSE;
}
Error buildPipeline(ModulePassManager &MPM, ModuleAnalysisManager &MAM,
@@ -876,17 +877,18 @@ template <typename Derived, typename TargetMachineT>
Error CodeGenPassBuilder<Derived, TargetMachineT>::addCoreISelPasses(
PassManagerWrapper &PMW) const {
// Enable FastISel with -fast-isel, but allow that to be overridden.
- TM.setO0WantsFastISel(Opt.EnableFastISelOption != cl::BOU_FALSE);
+ TM.setO0WantsFastISel(Opt.EnableFastISelOption !=
+ cl::boolOrDefault::BOU_FALSE);
// Determine an instruction selector.
enum class SelectorType { SelectionDAG, FastISel, GlobalISel };
SelectorType Selector;
- if (Opt.EnableFastISelOption == cl::BOU_TRUE)
+ if (Opt.EnableFastISelOption == cl::boolOrDefault::BOU_TRUE)
Selector = SelectorType::FastISel;
- else if (Opt.EnableGlobalISelOption == cl::BOU_TRUE ||
+ else if (Opt.EnableGlobalISelOption == cl::boolOrDefault::BOU_TRUE ||
(TM.Options.EnableGlobalISel &&
- Opt.EnableGlobalISelOption != cl::BOU_FALSE))
+ Opt.EnableGlobalISelOption != cl::boolOrDefault::BOU_FALSE))
Selector = SelectorType::GlobalISel;
else if (TM.getOptLevel() == CodeGenOptLevel::None && TM.getO0WantsFastISel())
Selector = SelectorType::FastISel;
@@ -988,7 +990,7 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::addMachinePasses(
// Run register allocation and passes that are tightly coupled with it,
// including phi elimination and scheduling.
- if (auto Err = Opt.OptimizeRegAlloc == cl::BOU_TRUE
+ if (auto Err = Opt.OptimizeRegAlloc == cl::boolOrDefault::BOU_TRUE
? derived().addOptimizedRegAlloc(PMW)
: derived().addFastRegAlloc(PMW))
return std::move(Err);
diff --git a/llvm/include/llvm/Support/CommandLine.h b/llvm/include/llvm/Support/CommandLine.h
index e1125042cd7d2..276c4cb90ef55 100644
--- a/llvm/include/llvm/Support/CommandLine.h
+++ b/llvm/include/llvm/Support/CommandLine.h
@@ -630,7 +630,7 @@ struct OptionValue final
};
// Other safe-to-copy-by-value common option types.
-enum boolOrDefault { BOU_UNSET, BOU_TRUE, BOU_FALSE };
+enum class boolOrDefault { BOU_UNSET, BOU_TRUE, BOU_FALSE };
template <>
struct LLVM_ABI OptionValue<cl::boolOrDefault> final
: OptionValueCopy<cl::boolOrDefault> {
diff --git a/llvm/include/llvm/Target/CGPassBuilderOption.h b/llvm/include/llvm/Target/CGPassBuilderOption.h
index 086142b7de574..f825cbdca439b 100644
--- a/llvm/include/llvm/Target/CGPassBuilderOption.h
+++ b/llvm/include/llvm/Target/CGPassBuilderOption.h
@@ -48,7 +48,7 @@ class RegAllocTypeParser : public cl::parser<RegAllocType> {
// Not one-on-one but mostly corresponding to commandline options in
// TargetPassConfig.cpp.
struct CGPassBuilderOption {
- cl::boolOrDefault OptimizeRegAlloc = cl::BOU_UNSET;
+ cl::boolOrDefault OptimizeRegAlloc = cl::boolOrDefault::BOU_UNSET;
std::optional<bool> EnableIPRA;
bool DebugPM = false;
bool DisableVerify = false;
@@ -84,11 +84,11 @@ struct CGPassBuilderOption {
std::string FSProfileFile;
std::string FSRemappingFile;
- cl::boolOrDefault VerifyMachineCode = cl::BOU_UNSET;
- cl::boolOrDefault EnableFastISelOption = cl::BOU_UNSET;
- cl::boolOrDefault EnableGlobalISelOption = cl::BOU_UNSET;
- cl::boolOrDefault DebugifyAndStripAll = cl::BOU_UNSET;
- cl::boolOrDefault DebugifyCheckAndStripAll = cl::BOU_UNSET;
+ cl::boolOrDefault VerifyMachineCode = cl::boolOrDefault::BOU_UNSET;
+ cl::boolOrDefault EnableFastISelOption = cl::boolOrDefault::BOU_UNSET;
+ cl::boolOrDefault EnableGlobalISelOption = cl::boolOrDefault::BOU_UNSET;
+ cl::boolOrDefault DebugifyAndStripAll = cl::boolOrDefault::BOU_UNSET;
+ cl::boolOrDefault DebugifyCheckAndStripAll = cl::boolOrDefault::BOU_UNSET;
};
LLVM_ABI CGPassBuilderOption getCGPassBuilderOption();
diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp
index 4917c5b90821f..55f2dd430d6cb 100644
--- a/llvm/lib/CodeGen/BranchFolding.cpp
+++ b/llvm/lib/CodeGen/BranchFolding.cpp
@@ -74,8 +74,9 @@ STATISTIC(NumTailMerge , "Number of block tails merged");
STATISTIC(NumHoist , "Number of times common instructions are hoisted");
STATISTIC(NumTailCalls, "Number of tail calls optimized");
-static cl::opt<cl::boolOrDefault> FlagEnableTailMerge("enable-tail-merge",
- cl::init(cl::BOU_UNSET), cl::Hidden);
+static cl::opt<cl::boolOrDefault>
+ FlagEnableTailMerge("enable-tail-merge",
+ cl::init(cl::boolOrDefault::BOU_UNSET), cl::Hidden);
// Throttle for huge numbers of predecessors (compile speed problems)
static cl::opt<unsigned>
@@ -173,11 +174,15 @@ BranchFolder::BranchFolder(bool DefaultEnableTailMerge, bool CommonHoist,
: EnableHoistCommonCode(CommonHoist), MinCommonTailLength(MinTailLength),
MBBFreqInfo(FreqInfo), MBPI(ProbInfo), PSI(PSI) {
switch (FlagEnableTailMerge) {
- case cl::BOU_UNSET:
+ case cl::boolOrDefault::BOU_UNSET:
EnableTailMerge = DefaultEnableTailMerge;
break;
- case cl::BOU_TRUE: EnableTailMerge = true; break;
- case cl::BOU_FALSE: EnableTailMerge = false; break;
+ case cl::boolOrDefault::BOU_TRUE:
+ EnableTailMerge = true;
+ break;
+ case cl::boolOrDefault::BOU_FALSE:
+ EnableTailMerge = false;
+ break;
}
}
diff --git a/llvm/lib/CodeGen/GlobalMerge.cpp b/llvm/lib/CodeGen/GlobalMerge.cpp
index d52706b5f9bef..51e9e121def19 100644
--- a/llvm/lib/CodeGen/GlobalMerge.cpp
+++ b/llvm/lib/CodeGen/GlobalMerge.cpp
@@ -773,8 +773,10 @@ Pass *llvm::createGlobalMergePass(const TargetMachine *TM, unsigned Offset,
bool MergeExternalByDefault,
bool MergeConstantByDefault,
bool MergeConstAggressiveByDefault) {
- bool MergeExternal = (EnableGlobalMergeOnExternal == cl::BOU_UNSET) ?
- MergeExternalByDefault : (EnableGlobalMergeOnExternal == cl::BOU_TRUE);
+ bool MergeExternal =
+ (EnableGlobalMergeOnExternal == cl::boolOrDefault::BOU_UNSET)
+ ? MergeExternalByDefault
+ : (EnableGlobalMergeOnExternal == cl::boolOrDefault::BOU_TRUE);
bool MergeConstant = EnableGlobalMergeOnConst || MergeConstantByDefault;
bool MergeConstAggressive = GlobalMergeAllConst.getNumOccurrences() > 0
? GlobalMergeAllConst
diff --git a/llvm/lib/CodeGen/MachineCopyPropagation.cpp b/llvm/lib/CodeGen/MachineCopyPropagation.cpp
index 54b2b2a0f4435..ad33cb71b7c56 100644
--- a/llvm/lib/CodeGen/MachineCopyPropagation.cpp
+++ b/llvm/lib/CodeGen/MachineCopyPropagation.cpp
@@ -1619,14 +1619,14 @@ MachineCopyPropagationPass::run(MachineFunction &MF,
bool MachineCopyPropagation::run(MachineFunction &MF) {
bool IsSpillageCopyElimEnabled = false;
switch (EnableSpillageCopyElimination) {
- case cl::BOU_UNSET:
+ case cl::boolOrDefault::BOU_UNSET:
IsSpillageCopyElimEnabled =
MF.getSubtarget().enableSpillageCopyElimination();
break;
- case cl::BOU_TRUE:
+ case cl::boolOrDefault::BOU_TRUE:
IsSpillageCopyElimEnabled = true;
break;
- case cl::BOU_FALSE:
+ case cl::boolOrDefault::BOU_FALSE:
IsSpillageCopyElimEnabled = false;
break;
}
diff --git a/llvm/lib/CodeGen/RegisterCoalescer.cpp b/llvm/lib/CodeGen/RegisterCoalescer.cpp
index eb43eddfa081e..4b4ba2144f964 100644
--- a/llvm/lib/CodeGen/RegisterCoalescer.cpp
+++ b/llvm/lib/CodeGen/RegisterCoalescer.cpp
@@ -92,7 +92,7 @@ static cl::opt<bool> EnableJoinSplits(
static cl::opt<cl::boolOrDefault> EnableGlobalCopies(
"join-globalcopies",
cl::desc("Coalesce copies that span blocks (default=subtarget)"),
- cl::init(cl::BOU_UNSET), cl::Hidden);
+ cl::init(cl::boolOrDefault::BOU_UNSET), cl::Hidden);
static cl::opt<bool> VerifyCoalescing(
"verify-coalescing",
@@ -4317,10 +4317,10 @@ bool RegisterCoalescer::run(MachineFunction &fn) {
const TargetSubtargetInfo &STI = fn.getSubtarget();
TRI = STI.getRegisterInfo();
TII = STI.getInstrInfo();
- if (EnableGlobalCopies == cl::BOU_UNSET)
+ if (EnableGlobalCopies == cl::boolOrDefault::BOU_UNSET)
JoinGlobalCopies = STI.enableJoinGlobalCopies();
else
- JoinGlobalCopies = (EnableGlobalCopies == cl::BOU_TRUE);
+ JoinGlobalCopies = (EnableGlobalCopies == cl::boolOrDefault::BOU_TRUE);
// If there are PHIs tracked by debug-info, they will need updating during
// coalescing. Build an index of those PHIs to ease updating.
diff --git a/llvm/lib/CodeGen/ShrinkWrap.cpp b/llvm/lib/CodeGen/ShrinkWrap.cpp
index 92d3c2e59fcec..355699a908a43 100644
--- a/llvm/lib/CodeGen/ShrinkWrap.cpp
+++ b/llvm/lib/CodeGen/ShrinkWrap.cpp
@@ -1034,7 +1034,7 @@ bool ShrinkWrapImpl::isShrinkWrapEnabled(const MachineFunction &MF) {
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
switch (EnableShrinkWrapOpt) {
- case cl::BOU_UNSET:
+ case cl::boolOrDefault::BOU_UNSET:
return TFI->enableShrinkWrapping(MF) &&
// Windows with CFI has some limitations that make it impossible
// to use shrink-wrapping.
@@ -1051,9 +1051,9 @@ bool ShrinkWrapImpl::isShrinkWrapEnabled(const MachineFunction &MF) {
// If EnableShrinkWrap is set, it takes precedence on whatever the
// target sets. The rational is that we assume we want to test
// something related to shrink-wrapping.
- case cl::BOU_TRUE:
+ case cl::boolOrDefault::BOU_TRUE:
return true;
- case cl::BOU_FALSE:
+ case cl::boolOrDefault::BOU_FALSE:
return false;
}
llvm_unreachable("Invalid shrink-wrapping state");
diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp
index 697b0a6447950..04f6a6d7e775e 100644
--- a/llvm/lib/CodeGen/TargetPassConfig.cpp
+++ b/llvm/lib/CodeGen/TargetPassConfig.cpp
@@ -802,9 +802,9 @@ void TargetPassConfig::addPrintPass(const std::string &Banner) {
}
void TargetPassConfig::addVerifyPass(const std::string &Banner) {
- bool Verify = VerifyMachineCode == cl::BOU_TRUE;
+ bool Verify = VerifyMachineCode == cl::boolOrDefault::BOU_TRUE;
#ifdef EXPENSIVE_CHECKS
- if (VerifyMachineCode == cl::BOU_UNSET)
+ if (VerifyMachineCode == cl::boolOrDefault::BOU_UNSET)
Verify = TM->isMachineVerifierClean();
#endif
if (Verify)
@@ -825,17 +825,17 @@ void TargetPassConfig::addCheckDebugPass() {
void TargetPassConfig::addMachinePrePasses(bool AllowDebugify) {
if (AllowDebugify && DebugifyIsSafe &&
- (DebugifyAndStripAll == cl::BOU_TRUE ||
- DebugifyCheckAndStripAll == cl::BOU_TRUE))
+ (DebugifyAndStripAll == cl::boolOrDefault::BOU_TRUE ||
+ DebugifyCheckAndStripAll == cl::boolOrDefault::BOU_TRUE))
addDebugifyPass();
}
void TargetPassConfig::addMachinePostPasses(const std::string &Banner) {
if (DebugifyIsSafe) {
- if (DebugifyCheckAndStripAll == cl::BOU_TRUE) {
+ if (DebugifyCheckAndStripAll == cl::boolOrDefault::BOU_TRUE) {
addCheckDebugPass();
addStripDebugPass();
- } else if (DebugifyAndStripAll == cl::BOU_TRUE)
+ } else if (DebugifyAndStripAll == cl::boolOrDefault::BOU_TRUE)
addStripDebugPass();
}
addVerifyPass(Banner);
@@ -994,17 +994,17 @@ void TargetPassConfig::addISelPrepare() {
bool TargetPassConfig::addCoreISelPasses() {
// Enable FastISel with -fast-isel, but allow that to be overridden.
- TM->setO0WantsFastISel(EnableFastISelOption != cl::BOU_FALSE);
+ TM->setO0WantsFastISel(EnableFastISelOption != cl::boolOrDefault::BOU_FALSE);
// Determine an instruction selector.
enum class SelectorType { SelectionDAG, FastISel, GlobalISel };
SelectorType Selector;
- if (EnableFastISelOption == cl::BOU_TRUE)
+ if (EnableFastISelOption == cl::boolOrDefault::BOU_TRUE)
Selector = SelectorType::FastISel;
- else if (EnableGlobalISelOption == cl::BOU_TRUE ||
+ else if (EnableGlobalISelOption == cl::boolOrDefault::BOU_TRUE ||
(TM->Options.EnableGlobalISel &&
- EnableGlobalISelOption != cl::BOU_FALSE))
+ EnableGlobalISelOption != cl::boolOrDefault::BOU_FALSE))
Selector = SelectorType::GlobalISel;
else if (TM->getOptLevel() == CodeGenOptLevel::None &&
TM->getO0WantsFastISel())
@@ -1368,10 +1368,12 @@ void TargetPassConfig::addMachineSSAOptimization() {
bool TargetPassConfig::getOptimizeRegAlloc() const {
switch (OptimizeRegAlloc) {
- case cl::BOU_UNSET:
+ case cl::boolOrDefault::BOU_UNSET:
return getOptLevel() != CodeGenOptLevel::None;
- case cl::BOU_TRUE: return true;
- case cl::BOU_FALSE: return false;
+ case cl::boolOrDefault::BOU_TRUE:
+ return true;
+ case cl::boolOrDefault::BOU_FALSE:
+ return false;
}
llvm_unreachable("Invalid optimize-regalloc state");
}
diff --git a/llvm/lib/MC/MCAsmInfo.cpp b/llvm/lib/MC/MCAsmInfo.cpp
index deb9aa5608c01..ff71de2b42866 100644
--- a/llvm/lib/MC/MCAsmInfo.cpp
+++ b/llvm/lib/MC/MCAsmInfo.cpp
@@ -38,14 +38,14 @@ cl::opt<cl::boolOrDefault> UseLEB128Directives(
"use-leb128-directives", cl::Hidden,
cl::desc(
"Disable the usage of LEB128 directives, and generate .byte instead."),
- cl::init(cl::BOU_UNSET));
+ cl::init(cl::boolOrDefault::BOU_UNSET));
}
MCAsmInfo::MCAsmInfo(const MCTargetOptions &Options) : TargetOptions(Options) {
if (DwarfExtendedLoc != Default)
SupportsExtendedDwarfLocDirective = DwarfExtendedLoc == Enable;
- if (UseLEB128Directives != cl::BOU_UNSET)
- HasLEB128Directives = UseLEB128Directives == cl::BOU_TRUE;
+ if (UseLEB128Directives != cl::boolOrDefault::BOU_UNSET)
+ HasLEB128Directives = UseLEB128Directives == cl::boolOrDefault::BOU_TRUE;
}
MCAsmInfo::~MCAsmInfo() = default;
diff --git a/llvm/lib/MC/MCAsmInfoXCOFF.cpp b/llvm/lib/MC/MCAsmInfoXCOFF.cpp
index 55aa517cd87fe..ddf4a28f619c1 100644
--- a/llvm/lib/MC/MCAsmInfoXCOFF.cpp
+++ b/llvm/lib/MC/MCAsmInfoXCOFF.cpp
@@ -27,7 +27,7 @@ MCAsmInfoXCOFF::MCAsmInfoXCOFF(const MCTargetOptions &Options)
InternalSymbolPrefix = "L..";
SupportsQuotedNames = false;
- if (UseLEB128Directives == cl::BOU_UNSET)
+ if (UseLEB128Directives == cl::boolOrDefault::BOU_UNSET)
HasLEB128Directives = false;
ZeroDirective = "\t.space\t";
AsciiDirective = nullptr; // not supported
diff --git a/llvm/lib/Remarks/RemarkStreamer.cpp b/llvm/lib/Remarks/RemarkStreamer.cpp
index 9911a2250d445..7ddebfbf0ccff 100644
--- a/llvm/lib/Remarks/RemarkStreamer.cpp
+++ b/llvm/lib/Remarks/RemarkStreamer.cpp
@@ -23,7 +23,7 @@ static cl::opt<cl::boolOrDefault> EnableRemarksSection(
cl::desc(
"Emit a section containing remark diagnostics metadata. By default, "
"this is enabled for the following formats: bitstream."),
- cl::init(cl::BOU_UNSET), cl::Hidden);
+ cl::init(cl::boolOrDefault::BOU_UNSET), cl::Hidden);
RemarkStreamer::RemarkStreamer(
std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer,
@@ -58,11 +58,11 @@ bool RemarkStreamer::matchesFilter(StringRef Str) {
}
bool RemarkStreamer::needsSection() const {
- return EnableRemarksSection == cl::BOU_TRUE;
+ return EnableRemarksSection == cl::boolOrDefault::BOU_TRUE;
}
bool RemarkStreamer::wantsSection() const {
- if (EnableRemarksSection == cl::BOU_FALSE)
+ if (EnableRemarksSection == cl::boolOrDefault::BOU_FALSE)
return false;
// Enable remark sections by default for bitstream remarks (so dsymutil can
// find all remarks for a linked binary)
diff --git a/llvm/lib/Support/CommandLine.cpp b/llvm/lib/Support/CommandLine.cpp
index ba321bab5a910..30679bf046f23 100644
--- a/llvm/lib/Support/CommandLine.cpp
+++ b/llvm/lib/Support/CommandLine.cpp
@@ -2011,7 +2011,8 @@ bool parser<bool>::parse(Option &O, StringRef ArgName, StringRef Arg,
//
bool parser<boolOrDefault>::parse(Option &O, StringRef ArgName, StringRef Arg,
boolOrDefault &Value) {
- return parseBool<boolOrDefault, BOU_TRUE, BOU_FALSE>(O, ArgName, Arg, Value);
+ return parseBool<boolOrDefault, boolOrDefault::BOU_TRUE,
+ boolOrDefault::BOU_FALSE>(O, ArgName, Arg, Value);
}
// parser<int> implementation
@@ -2229,6 +2230,14 @@ void generic_parser_base::printGenericOptionDiff(
// printOptionDiff - Specializations for printing basic value types.
//
+namespace llvm {
+namespace cl {
+static raw_ostream &operator<<(raw_ostream &OS, boolOrDefault V) {
+ return OS << static_cast<int>(V);
+}
+} // namespace cl
+} // namespace llvm
+
#define PRINT_OPT_DIFF(T) \
void parser<T>::printOptionDiff(const Option &O, T V, OptionValue<T> D, \
size_t GlobalWidth) const { \
diff --git a/llvm/lib/Support/WithColor.cpp b/llvm/lib/Support/WithColor.cpp
index abc9fb3e5d606..109238528e2a4 100644
--- a/llvm/lib/Support/WithColor.cpp
+++ b/llvm/lib/Support/WithColor.cpp
@@ -26,7 +26,7 @@ struct CreateUseColor {
return new cl::opt<cl::boolOrDefault>(
"color", cl::cat(getColorCategory()),
cl::desc("Use colors in output (default=autodetect)"),
- cl::init(cl::BOU_UNSET));
+ cl::init(cl::boolOrDefault::BOU_UNSET));
}
};
} // namespace
@@ -34,8 +34,9 @@ static ManagedStatic<cl::opt<cl::boolOrDefault>, CreateUseColor> UseColor;
void llvm::initWithColorOptions() { *UseColor; }
static bool DefaultAutoDetectFunction(const raw_ostream &OS) {
- return *UseColor == cl::BOU_UNSET ? OS.has_colors()
- : *UseColor == cl::BOU_TRUE;
+ return *UseColor == cl::boolOrDefault::BOU_UNSET
+ ? OS.has_colors()
+ : *UseColor == cl::boolOrDefault::BOU_TRUE;
}
WithColor::AutoDetectFunctionType WithColor::AutoDetectFunction =
diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
index a96ca792ac0b8..3ac32368fac81 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
+++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
@@ -284,8 +284,8 @@ LLVMInitializeAArch64Target() {
}
bool AArch64TargetMachine::isGlobalISelOptNone() const {
- const bool GlobalISelFlag =
- getCGPassBuilderOption().EnableGlobalISelOption == cl::BOU_TRUE;
+ const bool GlobalISelFlag = getCGPassBuilderOption().EnableGlobalISelOption ==
+ cl::boolOrDefault::BOU_TRUE;
return getOptLevel() == CodeGenOptLevel::None ||
(static_cast<unsigned>(getOptLevel()) >
@@ -397,8 +397,8 @@ AArch64TargetMachine::AArch64TargetMachine(const Target &T, const Triple &TT,
TT.getEnvironment() != Triple::GNUILP32 &&
!(getCodeModel() == CodeModel::Large && TT.isOSBinFormatMachO());
- const bool GlobalISelFlag =
- getCGPassBuilderOption().EnableGlobalISelOption == cl::BOU_TRUE;
+ const bool GlobalISelFlag = getCGPassBuilderOption().EnableGlobalISelOption ==
+ cl::boolOrDefault::BOU_TRUE;
// Enable GlobalISel at or below EnableGlobalISelAt0, unless this is
// MachO/CodeModel::Large, which GlobalISel does not support.
@@ -710,11 +710,11 @@ bool AArch64PassConfig::addPreISel() {
// Basically, the addressable offsets are up to 4095 * Ty.getSizeInBytes().
// and the offset has to be a multiple of the related size in bytes.
if ((TM->getOptLevel() != CodeGenOptLevel::None &&
- EnableGlobalMerge == cl::BOU_UNSET) ||
- EnableGlobalMerge == cl::BOU_TRUE) {
+ EnableGlobalMerge == cl::boolOrDefault::BOU_UNSET) ||
+ EnableGlobalMerge == cl::boolOrDefault::BOU_TRUE) {
bool OnlyOptimizeForSize =
(TM->getOptLevel() < CodeGenOptLevel::Aggressive) &&
- (EnableGlobalMerge == cl::BOU_UNSET);
+ (EnableGlobalMerge == cl::boolOrDefault::BOU_UNSET);
// Merging of extern globals is enabled by default on non-Mach-O as we
// expect it to be generally either beneficial or harmless. On Mach-O it
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp b/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
index e21af65414362..b0a409d153fd2 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
@@ -601,7 +601,8 @@ bool AArch64CallLowering::fallBackToDAGISel(const MachineFunction &MF) const {
auto OptLevel = MF.getTarget().getOptLevel();
bool IsGlobalISelPreferred =
- getCGPassBuilderOption().EnableGlobalISelOption == cl::BOU_TRUE ||
+ getCGPassBuilderOption().EnableGlobalISelOption ==
+ cl::boolOrDefault::BOU_TRUE ||
static_cast<unsigned>(OptLevel) <= TM.getEnableGlobalISelAtO() ||
F.hasOptNone();
return !IsGlobalISelPreferred;
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp b/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp
index 1b66f5e73b903..595038e21a184 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp
@@ -1896,8 +1896,8 @@ bool AMDGPUCodeGenPrepareImpl::visitPHINode(PHINode &I) {
// operations with most elements being "undef". This inhibits a lot of
// optimization opportunities and can result in unreasonably high register
// pressure and the inevitable stack spilling.
- if (!BreakLargePHIs ||
- getCGPassBuilderOption().EnableGlobalISelOption == cl::BOU_TRUE)
+ if (!BreakLargePHIs || getCGPassBuilderOption().EnableGlobalISelOption ==
+ cl::boolOrDefault::BOU_TRUE)
return false;
FixedVectorType *FVT = dyn_cast<FixedVectorType>(I.getType());
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
index 47bc49c3a23f2..524966e156565 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
@@ -1626,7 +1626,8 @@ bool GCNPassConfig::addPreISel() {
// SDAG requires LCSSA, GlobalISel does not. Disable LCSSA for -global-isel
// with -new-reg-bank-select and without any of the fallback options.
- if (getCGPassBuilderOption().EnableGlobalISelOption != cl::BOU_TRUE ||
+ if (getCGPassBuilderOption().EnableGlobalISelOption !=
+ cl::boolOrDefault::BOU_TRUE ||
!isGlobalISelAbortEnabled() || !NewRegBankSelect)
addPass(createLCSSAPass());
@@ -2390,7 +2391,8 @@ void AMDGPUCodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW) const {
// control flow modifications.
addFunctionPass(AMDGPURewriteUndefForPHIPass(), PMW);
- if (getCGPassBuilderOption().EnableGlobalISelOption != cl::BOU_TRUE ||
+ if (getCGPassBuilderOption().EnableGlobalISelOption !=
+ cl::boolOrDefault::BOU_TRUE ||
!isGlobalISelAbortEnabled() || !NewRegBankSelect)
addFunctionPass(LCSSAPass(), PMW);
diff --git a/llvm/lib/Target/ARM/ARMTargetMachine.cpp b/llvm/lib/Target/ARM/ARMTargetMachine.cpp
index ad6ceacb9933e..7a91884b95efc 100644
--- a/llvm/lib/Target/ARM/ARMTargetMachine.cpp
+++ b/llvm/lib/Target/ARM/ARMTargetMachine.cpp
@@ -400,8 +400,8 @@ void ARMPassConfig::addCodeGenPrepare() {
bool ARMPassConfig::addPreISel() {
if ((TM->getOptLevel() != CodeGenOptLevel::None &&
- EnableGlobalMerge == cl::BOU_UNSET) ||
- EnableGlobalMerge == cl::BOU_TRUE) {
+ EnableGlobalMerge == cl::boolOrDefault::BOU_UNSET) ||
+ EnableGlobalMerge == cl::boolOrDefault::BOU_TRUE) {
// FIXME: This is using the thumb1 only constant value for
// maximal global offset for merging globals. We may want
// to look into using the old value for non-thumb1 code of
@@ -409,7 +409,7 @@ bool ARMPassConfig::addPreISel() {
// tricky when doing code gen per function.
bool OnlyOptimizeForSize =
(TM->getOptLevel() < CodeGenOptLevel::Aggressive) &&
- (EnableGlobalMerge == cl::BOU_UNSET);
+ (EnableGlobalMerge == cl::boolOrDefault::BOU_UNSET);
// Merging of extern globals is enabled by default on non-Mach-O as we
// expect it to be generally either beneficial or harmless. On Mach-O it
// is disabled as we emit the .subsections_via_symbols directive which
diff --git a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
index c0de8fe473ae1..e13012a94711d 100644
--- a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
+++ b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
@@ -504,8 +504,8 @@ bool RISCVPassConfig::addPreISel() {
}
if ((TM->getOptLevel() != CodeGenOptLevel::None &&
- EnableGlobalMerge == cl::BOU_UNSET) ||
- EnableGlobalMerge == cl::BOU_TRUE) {
+ EnableGlobalMerge == cl::boolOrDefault::BOU_UNSET) ||
+ EnableGlobalMerge == cl::boolOrDefault::BOU_TRUE) {
// FIXME: Like AArch64, we disable extern global merging by default due to
// concerns it might regress some workloads. Unlike AArch64, we don't
// currently support enabling the pass in an "OnlyOptimizeForSize" mode.
diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp b/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp
index 86d7e2f07c1d9..993fc85438d89 100644
--- a/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp
+++ b/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp
@@ -529,8 +529,8 @@ bool ObjCARCContract::tryToPeepholeInstruction(
/// Should we use objc_claimAutoreleasedReturnValue?
static bool useClaimRuntimeCall(Module &M) {
// Let the flag override our OS-based default.
- if (UseObjCClaimRV != cl::BOU_UNSET)
- return UseObjCClaimRV == cl::BOU_TRUE;
+ if (UseObjCClaimRV != cl::boolOrDefault::BOU_UNSET)
+ return UseObjCClaimRV == cl::boolOrDefault::BOU_TRUE;
Triple TT(M.getTargetTriple());
diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index 6b936ebc1b3b2..6a88740b8ad51 100644
--- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -5666,11 +5666,11 @@ void LSRInstance::Solve(SmallVectorImpl<const Formula *> &Solution) const {
const bool EnableDropUnprofitableSolution = [&] {
switch (AllowDropSolutionIfLessProfitable) {
- case cl::BOU_TRUE:
+ case cl::boolOrDefault::BOU_TRUE:
return true;
- case cl::BOU_FALSE:
+ case cl::boolOrDefault::BOU_FALSE:
return false;
- case cl::BOU_UNSET:
+ case cl::boolOrDefault::BOU_UNSET:
return TTI.shouldDropLSRSolutionIfLessProfitable();
}
llvm_unreachable("Unhandled cl::boolOrDefault enum");
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 466cee091e7d0..0064633f642e2 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -1009,11 +1009,11 @@ class LoopVectorizationCostModel {
bool isDivRemScalarWithPredication(InstructionCost ScalarCost,
InstructionCost MaskedCost) const {
switch (ForceMaskedDivRem) {
- case cl::BOU_UNSET:
+ case cl::boolOrDefault::BOU_UNSET:
return ScalarCost < MaskedCost;
- case cl::BOU_TRUE:
+ case cl::boolOrDefault::BOU_TRUE:
return false;
- case cl::BOU_FALSE:
+ case cl::boolOrDefault::BOU_FALSE:
return true;
}
llvm_unreachable("impossible case value");
diff --git a/llvm/tools/llvm-cov/CodeCoverage.cpp b/llvm/tools/llvm-cov/CodeCoverage.cpp
index e19101ac76045..dbba0a3d73726 100644
--- a/llvm/tools/llvm-cov/CodeCoverage.cpp
+++ b/llvm/tools/llvm-cov/CodeCoverage.cpp
@@ -766,7 +766,7 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) {
cl::opt<cl::boolOrDefault> UseColor(
"use-color", cl::desc("Emit colored output (default=autodetect)"),
- cl::init(cl::BOU_UNSET));
+ cl::init(cl::boolOrDefault::BOU_UNSET));
cl::list<std::string> DemanglerOpts(
"Xdemangler", cl::desc("<demangler-path>|<demangler-option>"));
@@ -849,17 +849,17 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) {
ViewOpts.Format = Format;
switch (ViewOpts.Format) {
case CoverageViewOptions::OutputFormat::Text:
- ViewOpts.Colors = UseColor == cl::BOU_UNSET
+ ViewOpts.Colors = UseColor == cl::boolOrDefault::BOU_UNSET
? sys::Process::StandardOutHasColors()
- : UseColor == cl::BOU_TRUE;
+ : UseColor == cl::boolOrDefault::BOU_TRUE;
break;
case CoverageViewOptions::OutputFormat::HTML:
- if (UseColor == cl::BOU_FALSE)
+ if (UseColor == cl::boolOrDefault::BOU_FALSE)
errs() << "Color output cannot be disabled when generating html.\n";
ViewOpts.Colors = true;
break;
case CoverageViewOptions::OutputFormat::Lcov:
- if (UseColor == cl::BOU_TRUE)
+ if (UseColor == cl::boolOrDefault::BOU_TRUE)
errs() << "Color output cannot be enabled when generating lcov.\n";
ViewOpts.Colors = false;
break;
diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
index 2715bc2f1c5c6..54d2f5b118846 100644
--- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
+++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
@@ -1169,9 +1169,10 @@ static void dumpPretty(StringRef Path) {
Session->setLoadAddress(opts::pretty::LoadAddress);
auto &Stream = outs();
- const bool UseColor = opts::pretty::ColorOutput == cl::BOU_UNSET
- ? Stream.has_colors()
- : opts::pretty::ColorOutput == cl::BOU_TRUE;
+ const bool UseColor =
+ opts::pretty::ColorOutput == cl::boolOrDefault::BOU_UNSET
+ ? Stream.has_colors()
+ : opts::pretty::ColorOutput == cl::boolOrDefault::BOU_TRUE;
LinePrinter Printer(2, UseColor, Stream, opts::Filters);
auto GlobalScope(Session->getGlobalScope());
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 0169e7fb0fff8..81f8f31efbd32 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -4779,7 +4779,8 @@ static bool checkPTDynamic(const typename ELFT::Phdr &Phdr,
template <class ELFT>
void GNUELFDumper<ELFT>::printProgramHeaders(
bool PrintProgramHeaders, cl::boolOrDefault PrintSectionMapping) {
- const bool ShouldPrintSectionMapping = (PrintSectionMapping != cl::BOU_FALSE);
+ const bool ShouldPrintSectionMapping =
+ (PrintSectionMapping != cl::boolOrDefault::BOU_FALSE);
// Exit early if no program header or section mapping details were requested.
if (!PrintProgramHeaders && !ShouldPrintSectionMapping)
return;
@@ -7991,7 +7992,7 @@ void LLVMELFDumper<ELFT>::printProgramHeaders(
bool PrintProgramHeaders, cl::boolOrDefault PrintSectionMapping) {
if (PrintProgramHeaders)
printProgramHeaders();
- if (PrintSectionMapping == cl::BOU_TRUE)
+ if (PrintSectionMapping == cl::boolOrDefault::BOU_TRUE)
printSectionMapping();
}
diff --git a/llvm/tools/llvm-readobj/ObjDumper.h b/llvm/tools/llvm-readobj/ObjDumper.h
index f019ceee112d9..3943f3efa3d0a 100644
--- a/llvm/tools/llvm-readobj/ObjDumper.h
+++ b/llvm/tools/llvm-readobj/ObjDumper.h
@@ -98,7 +98,7 @@ class ObjDumper {
cl::boolOrDefault PrintSectionMapping) {
if (PrintProgramHeaders)
printProgramHeaders();
- if (PrintSectionMapping == cl::BOU_TRUE)
+ if (PrintSectionMapping == cl::boolOrDefault::BOU_TRUE)
printSectionMapping();
}
diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp
index fa56e3e48e58c..9d6522f87f936 100644
--- a/llvm/tools/llvm-readobj/llvm-readobj.cpp
+++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp
@@ -243,11 +243,11 @@ static void parseOptions(const opt::InputArgList &Args) {
opts::SectionRelocations = Args.hasArg(OPT_section_relocations);
opts::SectionSymbols = Args.hasArg(OPT_section_symbols);
if (Args.hasArg(OPT_section_mapping))
- opts::SectionMapping = cl::BOU_TRUE;
+ opts::SectionMapping = cl::boolOrDefault::BOU_TRUE;
else if (Args.hasArg(OPT_section_mapping_EQ_false))
- opts::SectionMapping = cl::BOU_FALSE;
+ opts::SectionMapping = cl::boolOrDefault::BOU_FALSE;
else
- opts::SectionMapping = cl::BOU_UNSET;
+ opts::SectionMapping = cl::boolOrDefault::BOU_UNSET;
opts::PrintStackSizes = Args.hasArg(OPT_stack_sizes);
opts::PrintStackMap = Args.hasArg(OPT_stackmap);
opts::StringDump = Args.getAllArgValues(OPT_string_dump_EQ);
@@ -440,7 +440,8 @@ static void dumpObject(ObjectFile &Obj, ScopedPrinter &Writer,
if (opts::HashSymbols)
Dumper->printHashSymbols();
- if (opts::ProgramHeaders || opts::SectionMapping == cl::BOU_TRUE)
+ if (opts::ProgramHeaders ||
+ opts::SectionMapping == cl::boolOrDefault::BOU_TRUE)
Dumper->printProgramHeaders(opts::ProgramHeaders, opts::SectionMapping);
if (opts::DynamicTable)
Dumper->printDynamicTable();
diff --git a/llvm/utils/yaml-bench/YAMLBench.cpp b/llvm/utils/yaml-bench/YAMLBench.cpp
index 81304fe0ee4a0..5f4a711410664 100644
--- a/llvm/utils/yaml-bench/YAMLBench.cpp
+++ b/llvm/utils/yaml-bench/YAMLBench.cpp
@@ -54,7 +54,7 @@ static cl::opt<unsigned>
static cl::opt<cl::boolOrDefault>
UseColor("use-color", cl::desc("Emit colored output (default=autodetect)"),
- cl::init(cl::BOU_UNSET));
+ cl::init(cl::boolOrDefault::BOU_UNSET));
/// Pretty print a tag by replacing tag:yaml.org,2002: with !!.
static std::string prettyTag(yaml::Node *N) {
@@ -182,9 +182,9 @@ static std::string createJSONText(size_t MemoryMB, unsigned ValueSize) {
int main(int argc, char **argv) {
llvm::cl::ParseCommandLineOptions(argc, argv);
- bool ShowColors = UseColor == cl::BOU_UNSET
+ bool ShowColors = UseColor == cl::boolOrDefault::BOU_UNSET
? sys::Process::StandardOutHasColors()
- : UseColor == cl::BOU_TRUE;
+ : UseColor == cl::boolOrDefault::BOU_TRUE;
if (Input.getNumOccurrences()) {
ErrorOr<std::unique_ptr<MemoryBuffer>> BufOrErr =
MemoryBuffer::getFileOrSTDIN(Input);
More information about the llvm-branch-commits
mailing list