From 5c7578de087fb984473277316edd19908d0e8190 Mon Sep 17 00:00:00 2001 From: Mikhail Glushenkov Date: Fri, 30 May 2008 06:13:02 +0000 Subject: Make it possible to change the output file suffix based on command-line options. For instance, the following command: llvmc2 -E hello.c now generates a file with the correct suffix (hello.i). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51733 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/LLVMCConfigurationEmitter.cpp | 35 +++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) (limited to 'utils/TableGen/LLVMCConfigurationEmitter.cpp') diff --git a/utils/TableGen/LLVMCConfigurationEmitter.cpp b/utils/TableGen/LLVMCConfigurationEmitter.cpp index d160412cfa..2dfd17e7b4 100644 --- a/utils/TableGen/LLVMCConfigurationEmitter.cpp +++ b/utils/TableGen/LLVMCConfigurationEmitter.cpp @@ -250,7 +250,7 @@ namespace ToolOptionDescriptionFlags { Forward = 0x2, UnpackValues = 0x4}; } namespace OptionPropertyType { - enum OptionPropertyType { AppendCmd }; + enum OptionPropertyType { AppendCmd, OutputSuffix }; } typedef std::pair @@ -397,6 +397,8 @@ public: optionPropertyHandlers_["append_cmd"] = &CollectProperties::onAppendCmd; optionPropertyHandlers_["forward"] = &CollectProperties::onForward; optionPropertyHandlers_["help"] = &CollectProperties::onHelp; + optionPropertyHandlers_["output_suffix"] = + &CollectProperties::onOutputSuffixOptionProp; optionPropertyHandlers_["required"] = &CollectProperties::onRequired; optionPropertyHandlers_["stop_compilation"] = &CollectProperties::onStopCompilation; @@ -487,11 +489,23 @@ private: void onAppendCmd (const DagInit* d, GlobalOptionDescription& o) { checkNumberOfArguments(d, 1); - std::string const& cmd = InitPtrToString(d->getArg(0)); + const std::string& cmd = InitPtrToString(d->getArg(0)); toolProps_.OptDescs[o.Name].AddProperty(OptionPropertyType::AppendCmd, cmd); } + void onOutputSuffixOptionProp (const DagInit* d, GlobalOptionDescription& o) { + checkNumberOfArguments(d, 1); + const std::string& suf = InitPtrToString(d->getArg(0)); + + if (toolProps_.OptDescs[o.Name].Type != OptionType::Switch) + throw "Option " + o.Name + + " can't have 'output_suffix' property since it isn't a switch!"; + + toolProps_.OptDescs[o.Name].AddProperty + (OptionPropertyType::OutputSuffix, suf); + } + void onForward (const DagInit* d, GlobalOptionDescription& o) { checkNumberOfArguments(d, 0); toolProps_.OptDescs[o.Name].setForward(); @@ -1021,7 +1035,22 @@ void EmitInOutLanguageMethods (const ToolProperties& P, std::ostream& O) { /// given Tool class. void EmitOutputSuffixMethod (const ToolProperties& P, std::ostream& O) { O << Indent1 << "const char* OutputSuffix() const {\n" - << Indent2 << "return \"" << P.OutputSuffix << "\";\n" + << Indent2 << "const char* ret = \"" << P.OutputSuffix << "\";\n"; + + for (ToolOptionDescriptions::const_iterator B = P.OptDescs.begin(), + E = P.OptDescs.end(); B != E; ++B) { + const ToolOptionDescription& OptDesc = B->second; + for (OptionPropertyList::const_iterator B = OptDesc.Props.begin(), + E = OptDesc.Props.end(); B != E; ++B) { + const OptionProperty& OptProp = *B; + if (OptProp.first == OptionPropertyType::OutputSuffix) { + O << Indent2 << "if (" << OptDesc.GenVariableName() << ")\n" + << Indent3 << "ret = \"" << OptProp.second << "\";\n"; + } + } + } + + O << Indent2 << "return ret;\n" << Indent1 << "}\n\n"; } -- cgit v1.2.3