mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 20:59:51 +00:00
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
This commit is contained in:
parent
0ab8ac318f
commit
a7d0ae34fb
@ -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<std::string> InputFilenames(cl::Positional, cl::desc("<input file>"),
|
||||
cl::ZeroOrMore);
|
||||
cl::opt<std::string> OutputFilename("o", cl::desc("Output file name"),
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user