From 73edde26f00b766f15570079d61be6e19b1eeff2 Mon Sep 17 00:00:00 2001 From: Mikhail Glushenkov Date: Fri, 30 May 2008 06:13:02 +0000 Subject: [PATCH] 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). llvm-svn: 51733 --- llvm/tools/llvmc2/Tools.td | 7 ++-- .../TableGen/LLVMCConfigurationEmitter.cpp | 35 +++++++++++++++++-- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/llvm/tools/llvmc2/Tools.td b/llvm/tools/llvmc2/Tools.td index 63b713fb0a2e..42060e3b2cf4 100644 --- a/llvm/tools/llvmc2/Tools.td +++ b/llvm/tools/llvmc2/Tools.td @@ -30,10 +30,7 @@ def llvm_gcc_c : Tool< "llvm-g++ -E -x c $INFILE -o $OUTFILE -emit-llvm", (default), "llvm-g++ -c -x c $INFILE -o $OUTFILE -emit-llvm")), - // TOFIX: Preprocessed files currently have suffix ".bc". - (switch_option "E", (stop_compilation), - // Make this possible: - // (output_suffix "i"), + (switch_option "E", (stop_compilation),(output_suffix "i"), (help "Stop after the preprocessing stage, do not run the compiler")), (sink) ]>; @@ -47,7 +44,7 @@ def llvm_gcc_cpp : Tool< "llvm-g++ -E -x c++ $INFILE -o $OUTFILE -emit-llvm", (default), "llvm-g++ -c -x c++ $INFILE -o $OUTFILE -emit-llvm")), - (switch_option "E", (stop_compilation)), + (switch_option "E", (stop_compilation), (output_suffix "i")), (sink) ]>; diff --git a/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp b/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp index d160412cfaa7..2dfd17e7b48a 100644 --- a/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp +++ b/llvm/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"; }