Commit 2233987b by Reed Kotler Committed by Jim Stichnoth

doxygenize IceClFlags.cpp

This is a first cut at this. More can be done and much of this is just moving what is already in the help for the commands into Doxygen comments. The documentation can be expanded to better describe the role of the various command line options. BUG= R=stichnot@chromium.org Review URL: https://codereview.chromium.org/1547743002 . Patch from Reed Kotler <rkotlerimgtec@gmail.com>.
parent 008f4ce5
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
/// ///
/// \file /// \file
/// \brief Defines commandline flags parsing. /// \brief Defines commandline flags parsing of class Ice::ClFlags.
/// ///
/// This currently relies on llvm::cl to parse. In the future, the minimal build /// This currently relies on llvm::cl to parse. In the future, the minimal build
/// can have a simpler parser. /// can have a simpler parser.
...@@ -26,66 +26,81 @@ ...@@ -26,66 +26,81 @@
namespace cl = llvm::cl; namespace cl = llvm::cl;
// Options which are captured in Ice::ClFlags and propagated. /// Options which are captured in Ice::ClFlags and propagated.
namespace { namespace {
/// Allow error recovery when reading PNaCl bitcode.
cl::opt<bool> AllowErrorRecovery( cl::opt<bool> AllowErrorRecovery(
"allow-pnacl-reader-error-recovery", "allow-pnacl-reader-error-recovery",
cl::desc("Allow error recovery when reading PNaCl bitcode."), cl::desc("Allow error recovery when reading PNaCl bitcode."),
cl::init(false)); cl::init(false));
/// Allow global symbols to be externally defined (other than _start and
/// __pnacl_pso_root).
cl::opt<bool> AllowExternDefinedSymbols( cl::opt<bool> AllowExternDefinedSymbols(
"allow-externally-defined-symbols", "allow-externally-defined-symbols",
cl::desc("Allow global symbols to be externally defined (other than _start " cl::desc("Allow global symbols to be externally defined (other than _start "
"and __pnacl_pso_root)."), "and __pnacl_pso_root)."),
cl::init(false)); cl::init(false));
/// Alias for --allow-externally-defined-symbols.
cl::alias AllowExternDefinedSymbolsA( cl::alias AllowExternDefinedSymbolsA(
"allow-extern", cl::desc("Alias for --allow-externally-defined-symbols"), "allow-extern", cl::desc("Alias for --allow-externally-defined-symbols"),
cl::NotHidden, cl::aliasopt(AllowExternDefinedSymbols)); cl::NotHidden, cl::aliasopt(AllowExternDefinedSymbols));
/// Allow IACA (Intel Architecture Code Analyzer) marks to be inserted. These
/// binaries are not executable.
cl::opt<bool> AllowIacaMarks( cl::opt<bool> AllowIacaMarks(
"allow-iaca-marks", "allow-iaca-marks",
cl::desc("Allow IACA (Intel Architecture Code Analyzer) marks to be " cl::desc("Allow IACA (Intel Architecture Code Analyzer) marks to be "
"inserted. These binaries are not executable."), "inserted. These binaries are not executable."),
cl::init(false)); cl::init(false));
// This is currently needed by crosstest.py. /// Allow global variables to be uninitialized. This is currently needed by the
/// cross tests.
cl::opt<bool> AllowUninitializedGlobals( cl::opt<bool> AllowUninitializedGlobals(
"allow-uninitialized-globals", "allow-uninitialized-globals",
cl::desc("Allow global variables to be uninitialized")); cl::desc("Allow global variables to be uninitialized"));
/// Emit (global) data into separate sections.
cl::opt<bool> cl::opt<bool>
DataSections("fdata-sections", DataSections("fdata-sections",
cl::desc("Emit (global) data into separate sections")); cl::desc("Emit (global) data into separate sections"));
/// Decorate textual asm output with register liveness info.
cl::opt<bool> DecorateAsm( cl::opt<bool> DecorateAsm(
"asm-verbose", "asm-verbose",
cl::desc("Decorate textual asm output with register liveness info")); cl::desc("Decorate textual asm output with register liveness info"));
/// Define default function prefix for naming unnamed functions.
cl::opt<std::string> cl::opt<std::string>
DefaultFunctionPrefix("default-function-prefix", DefaultFunctionPrefix("default-function-prefix",
cl::desc("Define default function prefix for naming " cl::desc("Define default function prefix for naming "
"unnamed functions"), "unnamed functions"),
cl::init("Function")); cl::init("Function"));
/// Define default global prefix for naming unnamed globals.
cl::opt<std::string> cl::opt<std::string>
DefaultGlobalPrefix("default-global-prefix", DefaultGlobalPrefix("default-global-prefix",
cl::desc("Define default global prefix for naming " cl::desc("Define default global prefix for naming "
"unnamed globals"), "unnamed globals"),
cl::init("Global")); cl::init("Global"));
/// Disable hybrid assembly when -filetype=iasm.
cl::opt<bool> DisableHybridAssembly( cl::opt<bool> DisableHybridAssembly(
"no-hybrid-asm", cl::desc("Disable hybrid assembly when -filetype=iasm"), "no-hybrid-asm", cl::desc("Disable hybrid assembly when -filetype=iasm"),
cl::init(false)); cl::init(false));
/// Externalize all symbols.
cl::opt<bool> DisableInternal("externalize", cl::opt<bool> DisableInternal("externalize",
cl::desc("Externalize all symbols")); cl::desc("Externalize all symbols"));
/// Disable Subzero translation.
cl::opt<bool> DisableTranslation("notranslate", cl::opt<bool> DisableTranslation("notranslate",
cl::desc("Disable Subzero translation")); cl::desc("Disable Subzero translation"));
/// Print statistics after translating each function.
cl::opt<bool> cl::opt<bool>
DumpStats("szstats", DumpStats("szstats",
cl::desc("Print statistics after translating each function")); cl::desc("Print statistics after translating each function"));
...@@ -96,27 +111,33 @@ cl::opt<bool> ...@@ -96,27 +111,33 @@ cl::opt<bool>
// counts for blocks not in the original asm output. Second, edge-split nodes // counts for blocks not in the original asm output. Second, edge-split nodes
// for advanced phi lowering are added too late, at which point it is not // for advanced phi lowering are added too late, at which point it is not
// practical to add profiling. // practical to add profiling.
/// Instrument basic blocks, and output profiling information to stdout at the
/// end of program execution.
cl::opt<bool> EnableBlockProfile( cl::opt<bool> EnableBlockProfile(
"enable-block-profile", "enable-block-profile",
cl::desc("If true, instrument basic blocks, and output profiling " cl::desc("Instrument basic blocks, and output profiling "
"information to stdout at the end of program execution."), "information to stdout at the end of program execution."),
cl::init(false)); cl::init(false));
/// Force optimization of memory intrinsics.
cl::opt<bool> cl::opt<bool>
ForceMemIntrinOpt("fmem-intrin-opt", ForceMemIntrinOpt("fmem-intrin-opt",
cl::desc("Force optimization of memory intrinsics.")); cl::desc("Force optimization of memory intrinsics."));
/// Emit functions into separate sections.
cl::opt<bool> cl::opt<bool>
FunctionSections("ffunction-sections", FunctionSections("ffunction-sections",
cl::desc("Emit functions into separate sections")); cl::desc("Emit functions into separate sections"));
/// Mock bounds checking on loads/stores.
cl::opt<bool> MockBoundsCheck("mock-bounds-check", cl::opt<bool> MockBoundsCheck("mock-bounds-check",
cl::desc("Mock bounds checking on loads/stores")); cl::desc("Mock bounds checking on loads/stores"));
// Number of translation threads (in addition to the parser thread and the /// Number of translation threads (in addition to the parser thread and the
// emitter thread). The special case of 0 means purely sequential, i.e. parser, /// emitter thread). The special case of 0 means purely sequential, i.e. parser,
// translator, and emitter all within the same single thread. (This may need a /// translator, and emitter all within the same single thread. (This may need a
// slight rework if we expand to multiple parser or emitter threads.) /// slight rework if we expand to multiple parser or emitter threads.)
cl::opt<uint32_t> NumThreads( cl::opt<uint32_t> NumThreads(
"threads", "threads",
cl::desc("Number of translation threads (0 for purely sequential)"), cl::desc("Number of translation threads (0 for purely sequential)"),
...@@ -124,6 +145,7 @@ cl::opt<uint32_t> NumThreads( ...@@ -124,6 +145,7 @@ cl::opt<uint32_t> NumThreads(
// std::thread::hardware_concurrency(). // std::thread::hardware_concurrency().
cl::init(2)); cl::init(2));
/// Optimization level Om1, O-1, O0, O0, O1, O2.
cl::opt<Ice::OptLevel> OLevel(cl::desc("Optimization level"), cl::opt<Ice::OptLevel> OLevel(cl::desc("Optimization level"),
cl::init(Ice::Opt_m1), cl::value_desc("level"), cl::init(Ice::Opt_m1), cl::value_desc("level"),
cl::values(clEnumValN(Ice::Opt_m1, "Om1", "-1"), cl::values(clEnumValN(Ice::Opt_m1, "Om1", "-1"),
...@@ -133,40 +155,47 @@ cl::opt<Ice::OptLevel> OLevel(cl::desc("Optimization level"), ...@@ -133,40 +155,47 @@ cl::opt<Ice::OptLevel> OLevel(cl::desc("Optimization level"),
clEnumValN(Ice::Opt_2, "O2", "2"), clEnumValN(Ice::Opt_2, "O2", "2"),
clEnumValEnd)); clEnumValEnd));
/// Enable edge splitting for Phi lowering.
cl::opt<bool> cl::opt<bool>
EnablePhiEdgeSplit("phi-edge-split", EnablePhiEdgeSplit("phi-edge-split",
cl::desc("Enable edge splitting for Phi lowering"), cl::desc("Enable edge splitting for Phi lowering"),
cl::init(true)); cl::init(true));
// TODO(stichnot): See if we can easily use LLVM's -rng-seed option and /// TODO(stichnot): See if we can easily use LLVM's -rng-seed option and
// implementation. I expect the implementation is different and therefore the /// implementation. I expect the implementation is different and therefore the
// tests would need to be changed. /// tests would need to be changed.
cl::opt<unsigned long long> cl::opt<unsigned long long>
RandomSeed("sz-seed", cl::desc("Seed the random number generator"), RandomSeed("sz-seed", cl::desc("Seed the random number generator"),
cl::init(1)); cl::init(1));
/// Randomly insert NOPs.
cl::opt<bool> ShouldDoNopInsertion("nop-insertion", cl::opt<bool> ShouldDoNopInsertion("nop-insertion",
cl::desc("Randomly insert NOPs"), cl::desc("Randomly insert NOPs"),
cl::init(false)); cl::init(false));
/// Randomize register allocation.
cl::opt<bool> cl::opt<bool>
RandomizeRegisterAllocation("randomize-regalloc", RandomizeRegisterAllocation("randomize-regalloc",
cl::desc("Randomize register allocation"), cl::desc("Randomize register allocation"),
cl::init(false)); cl::init(false));
/// Repeat register allocation until convergence.
cl::opt<bool> cl::opt<bool>
RepeatRegAlloc("regalloc-repeat", RepeatRegAlloc("regalloc-repeat",
cl::desc("Repeat register allocation until convergence"), cl::desc("Repeat register allocation until convergence"),
cl::init(true)); cl::init(true));
/// Skip through unimplemented lowering code instead of aborting.
cl::opt<bool> SkipUnimplemented( cl::opt<bool> SkipUnimplemented(
"skip-unimplemented", "skip-unimplemented",
cl::desc("Skip through unimplemented lowering code instead of aborting."), cl::desc("Skip through unimplemented lowering code instead of aborting."),
cl::init(false)); cl::init(false));
/// Enable breakdown timing of Subzero translation.
cl::opt<bool> SubzeroTimingEnabled( cl::opt<bool> SubzeroTimingEnabled(
"timing", cl::desc("Enable breakdown timing of Subzero translation")); "timing", cl::desc("Enable breakdown timing of Subzero translation"));
/// Target architecture.
cl::opt<Ice::TargetArch> TargetArch( cl::opt<Ice::TargetArch> TargetArch(
"target", cl::desc("Target architecture:"), cl::init(Ice::Target_X8632), "target", cl::desc("Target architecture:"), cl::init(Ice::Target_X8632),
cl::values( cl::values(
...@@ -183,12 +212,14 @@ cl::opt<Ice::TargetArch> TargetArch( ...@@ -183,12 +212,14 @@ cl::opt<Ice::TargetArch> TargetArch(
clEnumValN(Ice::Target_MIPS32, "mips32", "mips32 (same as mips)"), clEnumValN(Ice::Target_MIPS32, "mips32", "mips32 (same as mips)"),
clEnumValEnd)); clEnumValEnd));
/// Extra amount of stack to add to the frame in bytes (for testing).
cl::opt<uint32_t> TestStackExtra( cl::opt<uint32_t> TestStackExtra(
"test-stack-extra", "test-stack-extra",
cl::desc( cl::desc(
"Extra amount of stack to add to the frame in bytes (for testing)."), "Extra amount of stack to add to the frame in bytes (for testing)."),
cl::init(0)); cl::init(0));
/// Target architecture attributes.
cl::opt<Ice::TargetInstructionSet> TargetInstructionSet( cl::opt<Ice::TargetInstructionSet> TargetInstructionSet(
"mattr", cl::desc("Target architecture attributes"), "mattr", cl::desc("Target architecture attributes"),
cl::init(Ice::BaseInstructionSet), cl::init(Ice::BaseInstructionSet),
...@@ -203,30 +234,38 @@ cl::opt<Ice::TargetInstructionSet> TargetInstructionSet( ...@@ -203,30 +234,38 @@ cl::opt<Ice::TargetInstructionSet> TargetInstructionSet(
clEnumValN(Ice::ARM32InstructionSet_HWDivArm, "hwdiv-arm", clEnumValN(Ice::ARM32InstructionSet_HWDivArm, "hwdiv-arm",
"Enable ARM integer divide instructions in ARM mode"), "Enable ARM integer divide instructions in ARM mode"),
clEnumValEnd)); clEnumValEnd));
/// Prepend a prefix to symbol names for testing.
cl::opt<std::string> cl::opt<std::string>
TestPrefix("prefix", TestPrefix("prefix",
cl::desc("Prepend a prefix to symbol names for testing"), cl::desc("Prepend a prefix to symbol names for testing"),
cl::init(""), cl::value_desc("prefix")); cl::init(""), cl::value_desc("prefix"));
/// Print total translation time for each function.
cl::opt<bool> TimeEachFunction( cl::opt<bool> TimeEachFunction(
"timing-funcs", cl::desc("Print total translation time for each function")); "timing-funcs", cl::desc("Print total translation time for each function"));
/// Break down timing for a specific function (use '*' for all).
cl::opt<std::string> TimingFocusOn( cl::opt<std::string> TimingFocusOn(
"timing-focus", "timing-focus",
cl::desc("Break down timing for a specific function (use '*' for all)"), cl::desc("Break down timing for a specific function (use '*' for all)"),
cl::init("")); cl::init(""));
/// Translate only the given function.
cl::opt<std::string> cl::opt<std::string>
TranslateOnly("translate-only", TranslateOnly("translate-only",
cl::desc("Translate only the given function"), cl::init("")); cl::desc("Translate only the given function"), cl::init(""));
/// Use sandboxing.
cl::opt<bool> UseSandboxing("sandbox", cl::desc("Use sandboxing")); cl::opt<bool> UseSandboxing("sandbox", cl::desc("Use sandboxing"));
/// Override with -verbose=none except for the specified function.
cl::opt<std::string> VerboseFocusOn( cl::opt<std::string> VerboseFocusOn(
"verbose-focus", "verbose-focus",
cl::desc("Override with -verbose=none except for the specified function"), cl::desc("Override with -verbose=none except for the specified function"),
cl::init("")); cl::init(""));
/// Output file type.
cl::opt<Ice::FileType> OutFileType( cl::opt<Ice::FileType> OutFileType(
"filetype", cl::desc("Output file type"), cl::init(Ice::FT_Iasm), "filetype", cl::desc("Output file type"), cl::init(Ice::FT_Iasm),
cl::values(clEnumValN(Ice::FT_Elf, "obj", "Native ELF object ('.o') file"), cl::values(clEnumValN(Ice::FT_Elf, "obj", "Native ELF object ('.o') file"),
...@@ -235,14 +274,17 @@ cl::opt<Ice::FileType> OutFileType( ...@@ -235,14 +274,17 @@ cl::opt<Ice::FileType> OutFileType(
"Low-level integrated assembly ('.s') file"), "Low-level integrated assembly ('.s') file"),
clEnumValEnd)); clEnumValEnd));
/// Max number of nops to insert per instruction.
cl::opt<int> MaxNopsPerInstruction( cl::opt<int> MaxNopsPerInstruction(
"max-nops-per-instruction", "max-nops-per-instruction",
cl::desc("Max number of nops to insert per instruction"), cl::init(1)); cl::desc("Max number of nops to insert per instruction"), cl::init(1));
/// Nop insertion probability as percentage.
cl::opt<int> NopProbabilityAsPercentage( cl::opt<int> NopProbabilityAsPercentage(
"nop-insertion-percentage", "nop-insertion-percentage",
cl::desc("Nop insertion probability as percentage"), cl::init(10)); cl::desc("Nop insertion probability as percentage"), cl::init(10));
/// Verbose options (can be comma-separated).
cl::list<Ice::VerboseItem> VerboseList( cl::list<Ice::VerboseItem> VerboseList(
"verbose", cl::CommaSeparated, "verbose", cl::CommaSeparated,
cl::desc("Verbose options (can be comma-separated):"), cl::desc("Verbose options (can be comma-separated):"),
...@@ -271,19 +313,21 @@ cl::list<Ice::VerboseItem> VerboseList( ...@@ -271,19 +313,21 @@ cl::list<Ice::VerboseItem> VerboseList(
// Options not captured in Ice::ClFlags and propagated. // Options not captured in Ice::ClFlags and propagated.
/// Exit with success status, even if errors found.
cl::opt<bool> AlwaysExitSuccess( cl::opt<bool> AlwaysExitSuccess(
"exit-success", cl::desc("Exit with success status, even if errors found"), "exit-success", cl::desc("Exit with success status, even if errors found"),
cl::init(false)); cl::init(false));
// Note: While this flag isn't used in the minimal build, we keep this flag so /// Note: While this flag isn't used in the minimal build, we keep this flag so
// that tests can set this command-line flag without concern to the type of /// that tests can set this command-line flag without concern to the type of
// build. We double check that this flag at runtime to make sure the /// build. We double check this flag at runtime to make sure the
// consistency is maintained. /// consistency is maintained.
cl::opt<bool> cl::opt<bool>
BuildOnRead("build-on-read", BuildOnRead("build-on-read",
cl::desc("Build ICE instructions when reading bitcode"), cl::desc("Build ICE instructions when reading bitcode"),
cl::init(true)); cl::init(true));
/// Define format of input file.
cl::opt<llvm::NaClFileFormat> InputFileFormat( cl::opt<llvm::NaClFileFormat> InputFileFormat(
"bitcode-format", cl::desc("Define format of input file:"), "bitcode-format", cl::desc("Define format of input file:"),
cl::values(clEnumValN(llvm::LLVMFormat, "llvm", "LLVM file (default)"), cl::values(clEnumValN(llvm::LLVMFormat, "llvm", "LLVM file (default)"),
...@@ -291,15 +335,22 @@ cl::opt<llvm::NaClFileFormat> InputFileFormat( ...@@ -291,15 +335,22 @@ cl::opt<llvm::NaClFileFormat> InputFileFormat(
clEnumValEnd), clEnumValEnd),
cl::init(llvm::LLVMFormat)); cl::init(llvm::LLVMFormat));
/// Generate list of build attributes associated with this executable.
cl::opt<bool> GenerateBuildAtts( cl::opt<bool> GenerateBuildAtts(
"build-atts", cl::desc("Generate list of build attributes associated with " "build-atts", cl::desc("Generate list of build attributes associated with "
"this executable."), "this executable."),
cl::init(false)); cl::init(false));
/// <Input file>
cl::opt<std::string> IRFilename(cl::Positional, cl::desc("<IR file>"), cl::opt<std::string> IRFilename(cl::Positional, cl::desc("<IR file>"),
cl::init("-")); cl::init("-"));
/// Set log filename.
cl::opt<std::string> LogFilename("log", cl::desc("Set log filename"), cl::opt<std::string> LogFilename("log", cl::desc("Set log filename"),
cl::init("-"), cl::value_desc("filename")); cl::init("-"), cl::value_desc("filename"));
/// Print out more descriptive PNaCl bitcode parse errors when building LLVM
/// IR first.
cl::opt<bool> LLVMVerboseErrors( cl::opt<bool> LLVMVerboseErrors(
"verbose-llvm-parse-errors", "verbose-llvm-parse-errors",
cl::desc("Print out more descriptive PNaCl bitcode parse errors when " cl::desc("Print out more descriptive PNaCl bitcode parse errors when "
...@@ -310,7 +361,7 @@ cl::opt<std::string> OutputFilename("o", cl::desc("Override output filename"), ...@@ -310,7 +361,7 @@ cl::opt<std::string> OutputFilename("o", cl::desc("Override output filename"),
Ice::IceString AppName; Ice::IceString AppName;
// Define the command line options for immediates pooling and randomization /// Define the command line options for immediates pooling and randomization.
cl::opt<Ice::RandomizeAndPoolImmediatesEnum> RandomizeAndPoolImmediatesOption( cl::opt<Ice::RandomizeAndPoolImmediatesEnum> RandomizeAndPoolImmediatesOption(
"randomize-pool-immediates", "randomize-pool-immediates",
cl::desc("Randomize or pooling the representation of immediates"), cl::desc("Randomize or pooling the representation of immediates"),
...@@ -322,48 +373,46 @@ cl::opt<Ice::RandomizeAndPoolImmediatesEnum> RandomizeAndPoolImmediatesOption( ...@@ -322,48 +373,46 @@ cl::opt<Ice::RandomizeAndPoolImmediatesEnum> RandomizeAndPoolImmediatesOption(
clEnumValN(Ice::RPI_Pool, "pool", clEnumValN(Ice::RPI_Pool, "pool",
"Turn on immediate constants pooling"), "Turn on immediate constants pooling"),
clEnumValEnd)); clEnumValEnd));
// Command line option for x86 immediate integer randomization/pooling /// Command line option for x86 immediate integer randomization/pooling
// threshold. Immediates whose representation are between: /// threshold. Immediates whose representation are between:
// -RandomizeAndPoolImmediatesThreshold/2 and /// -RandomizeAndPoolImmediatesThreshold/2 and
// +RandomizeAndPoolImmediatesThreshold/2 will be randomized or pooled. /// +RandomizeAndPoolImmediatesThreshold/2 will be randomized or pooled.
cl::opt<uint32_t> RandomizeAndPoolImmediatesThreshold( cl::opt<uint32_t> RandomizeAndPoolImmediatesThreshold(
"randomize-pool-threshold", "randomize-pool-threshold",
cl::desc("The threshold for immediates randomization and pooling"), cl::desc("The threshold for immediates randomization and pooling"),
cl::init(0xffff)); cl::init(0xffff));
// Command line option for turning on basic block shuffling. /// Shuffle the layout of basic blocks in each functions.
cl::opt<bool> ReorderBasicBlocks( cl::opt<bool> ReorderBasicBlocks(
"reorder-basic-blocks", "reorder-basic-blocks",
cl::desc("Shuffle the layout of basic blocks in each functions"), cl::desc("Shuffle the layout of basic blocks in each function"),
cl::init(false)); cl::init(false));
// Command line option for turning on function layout reordering. /// Randomize function ordering.
cl::opt<bool> ReorderFunctions( cl::opt<bool> ReorderFunctions("reorder-functions",
"reorder-functions", cl::desc("Randomize function ordering"),
cl::desc("Reorder the layout of functions in TEXT section"),
cl::init(false)); cl::init(false));
// Command line option for the shuffling window size for function reordering. /// The shuffling window size for function reordering. 1 or 0 means no effective
// The default size is 8. /// shuffling. The default size is 8.
cl::opt<uint32_t> ReorderFunctionsWindowSize( cl::opt<uint32_t> ReorderFunctionsWindowSize(
"reorder-functions-window-size", "reorder-functions-window-size",
cl::desc("The shuffling window size for function reordering. 1 or 0 means " cl::desc("The shuffling window size for function reordering. 1 or 0 means "
"no effective shuffling."), "no effective shuffling."),
cl::init(8)); cl::init(8));
// Command line option for turning on global variable layout reordering. /// Randomize global data ordering.
cl::opt<bool> ReorderGlobalVariables( cl::opt<bool> ReorderGlobalVariables("reorder-global-variables",
"reorder-global-variables", cl::desc("Randomize global data ordering"),
cl::desc("Reorder the layout of global variables in NON TEXT section"),
cl::init(false)); cl::init(false));
// Command line option for turning on layout reordering in constant pools. /// Randomize constant pool entry ordering.
cl::opt<bool> ReorderPooledConstants( cl::opt<bool>
"reorder-pooled-constants", ReorderPooledConstants("reorder-pooled-constants",
cl::desc("Reorder the layout of constants in constant pools"), cl::desc("Randomize constant pool entry ordering"),
cl::init(false)); cl::init(false));
// Command line option for accepting textual bitcode. /// Command line option for accepting textual bitcode.
cl::opt<bool> BitcodeAsText( cl::opt<bool> BitcodeAsText(
"bitcode-as-text", "bitcode-as-text",
cl::desc( cl::desc(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment