diff options
author | Mikhail Glushenkov <foldr@codedgers.com> | 2008-05-30 06:13:02 +0000 |
---|---|---|
committer | Mikhail Glushenkov <foldr@codedgers.com> | 2008-05-30 06:13:02 +0000 |
commit | abab33b4351f735f9d95eaa9d4c0fea2126423d6 (patch) | |
tree | 42868b9dd13532077ed3f6c254cb05b5cd9d6cda | |
parent | 793f63db7b1d534647d90b7ee7194d36aced0c66 (diff) | |
download | external_llvm-abab33b4351f735f9d95eaa9d4c0fea2126423d6.zip external_llvm-abab33b4351f735f9d95eaa9d4c0fea2126423d6.tar.gz external_llvm-abab33b4351f735f9d95eaa9d4c0fea2126423d6.tar.bz2 |
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
-rw-r--r-- | tools/llvmc2/Tools.td | 7 | ||||
-rw-r--r-- | utils/TableGen/LLVMCConfigurationEmitter.cpp | 35 |
2 files changed, 34 insertions, 8 deletions
diff --git a/tools/llvmc2/Tools.td b/tools/llvmc2/Tools.td index 63b713f..42060e3 100644 --- a/tools/llvmc2/Tools.td +++ b/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/utils/TableGen/LLVMCConfigurationEmitter.cpp b/utils/TableGen/LLVMCConfigurationEmitter.cpp index d160412..2dfd17e 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<OptionPropertyType::OptionPropertyType, std::string> @@ -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"; } |