From a7d0ae34fbcc587e4b357f33849c50127a166cf2 Mon Sep 17 00:00:00 2001 From: Mikhail Glushenkov Date: Fri, 30 May 2008 06:28:37 +0000 Subject: [PATCH] Add a check for side effect-free options (specified only in the OptionList). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51759 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llvmc2/llvmc.cpp | 3 ++ utils/TableGen/LLVMCConfigurationEmitter.cpp | 40 +++++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/tools/llvmc2/llvmc.cpp b/tools/llvmc2/llvmc.cpp index 9580717a40c..ba2d70a6203 100644 --- a/tools/llvmc2/llvmc.cpp +++ b/tools/llvmc2/llvmc.cpp @@ -32,6 +32,9 @@ using namespace llvmc; // Built-in command-line options. // External linkage here is intentional. +// TOFIX: Add a --keep-temps option. +// TOFIX: Write a 'driver driver' (easier to do as a separate +// executable that drives llvmc2 proper). cl::list InputFilenames(cl::Positional, cl::desc(""), cl::ZeroOrMore); cl::opt OutputFilename("o", cl::desc("Output file name"), diff --git a/utils/TableGen/LLVMCConfigurationEmitter.cpp b/utils/TableGen/LLVMCConfigurationEmitter.cpp index 8b79105a799..260da0ac0f3 100644 --- a/utils/TableGen/LLVMCConfigurationEmitter.cpp +++ b/utils/TableGen/LLVMCConfigurationEmitter.cpp @@ -243,6 +243,7 @@ struct GlobalOptionDescriptions { /// HasSink - Should the emitter generate a "cl::sink" option? bool HasSink; + /// FindOption - exception-throwing wrapper for find(). const GlobalOptionDescription& FindOption(const std::string& OptName) const { const_iterator I = Descriptions.find(OptName); if (I != Descriptions.end()) @@ -251,7 +252,8 @@ struct GlobalOptionDescriptions { throw OptName + ": no such option!"; } - // Insert new GlobalOptionDescription into GlobalOptionDescriptions list + /// insertDescription - Insert new GlobalOptionDescription into + /// GlobalOptionDescriptions list void insertDescription (const GlobalOptionDescription& o) { container_type::iterator I = Descriptions.find(o.Name); @@ -750,7 +752,6 @@ void CollectPropertiesFromOptionList (RecordVector::const_iterator B, GlobalOptionDescriptions& OptDescs) { // Iterate over a properties list of every Tool definition - for (;B!=E;++B) { RecordVector::value_type T = *B; // Throws an exception if the value does not exist. @@ -760,12 +761,43 @@ void CollectPropertiesFromOptionList (RecordVector::const_iterator B, } } +/// CheckForSuperfluousOptions - Check that there are no side +/// effect-free options (specified only in the OptionList). Otherwise, +/// output a warning. +void CheckForSuperfluousOptions (const ToolPropertiesList& TPList, + const GlobalOptionDescriptions& OptDescs) { + llvm::StringSet<> nonSuperfluousOptions; + + // Add all options mentioned in the TPList to the set of + // non-superfluous options. + for (ToolPropertiesList::const_iterator B = TPList.begin(), + E = TPList.end(); B != E; ++B) { + const ToolProperties& TP = *(*B); + for (ToolOptionDescriptions::const_iterator B = TP.OptDescs.begin(), + E = TP.OptDescs.end(); B != E; ++B) { + nonSuperfluousOptions.insert(B->first()); + } + } + + // Check that all options in OptDescs belong to the set of + // non-superfluous options. + for (GlobalOptionDescriptions::const_iterator B = OptDescs.begin(), + E = OptDescs.end(); B != E; ++B) { + const GlobalOptionDescription& Val = B->second; + if (!nonSuperfluousOptions.count(Val.Name) + && Val.Type != OptionType::Alias) + cerr << "Warning: option '-" << Val.Name << "' has no effect! " + "Probable cause: this option is specified only in the OptionList.\n"; + } +} + /// EmitCaseTest1Arg - Helper function used by /// EmitCaseConstructHandler. bool EmitCaseTest1Arg(const std::string& TestName, const DagInit& d, const GlobalOptionDescriptions& OptDescs, std::ostream& O) { + // TOFIX - Add a mechanism for OS detection. checkNumberOfArguments(&d, 1); const std::string& OptName = InitPtrToString(d.getArg(0)); if (TestName == "switch_on") { @@ -1666,6 +1698,10 @@ void LLVMCConfigurationEmitter::run (std::ostream &O) { CollectPropertiesFromOptionList(OptionLists.begin(), OptionLists.end(), opt_descs); + // Check that there are no options without side effects (specified + // only in the OptionList). + CheckForSuperfluousOptions(tool_props, opt_descs); + // Emit global option registration code. EmitOptionDescriptions(opt_descs, O); -- 2.34.1