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
This commit is contained in:
Mikhail Glushenkov 2008-05-30 06:13:02 +00:00
parent fc4ed7ad83
commit 73edde26f0
2 changed files with 34 additions and 8 deletions

View File

@ -30,10 +30,7 @@ def llvm_gcc_c : Tool<
"llvm-g++ -E -x c $INFILE -o $OUTFILE -emit-llvm", "llvm-g++ -E -x c $INFILE -o $OUTFILE -emit-llvm",
(default), (default),
"llvm-g++ -c -x c $INFILE -o $OUTFILE -emit-llvm")), "llvm-g++ -c -x c $INFILE -o $OUTFILE -emit-llvm")),
// TOFIX: Preprocessed files currently have suffix ".bc". (switch_option "E", (stop_compilation),(output_suffix "i"),
(switch_option "E", (stop_compilation),
// Make this possible:
// (output_suffix "i"),
(help "Stop after the preprocessing stage, do not run the compiler")), (help "Stop after the preprocessing stage, do not run the compiler")),
(sink) (sink)
]>; ]>;
@ -47,7 +44,7 @@ def llvm_gcc_cpp : Tool<
"llvm-g++ -E -x c++ $INFILE -o $OUTFILE -emit-llvm", "llvm-g++ -E -x c++ $INFILE -o $OUTFILE -emit-llvm",
(default), (default),
"llvm-g++ -c -x c++ $INFILE -o $OUTFILE -emit-llvm")), "llvm-g++ -c -x c++ $INFILE -o $OUTFILE -emit-llvm")),
(switch_option "E", (stop_compilation)), (switch_option "E", (stop_compilation), (output_suffix "i")),
(sink) (sink)
]>; ]>;

View File

@ -250,7 +250,7 @@ namespace ToolOptionDescriptionFlags {
Forward = 0x2, UnpackValues = 0x4}; Forward = 0x2, UnpackValues = 0x4};
} }
namespace OptionPropertyType { namespace OptionPropertyType {
enum OptionPropertyType { AppendCmd }; enum OptionPropertyType { AppendCmd, OutputSuffix };
} }
typedef std::pair<OptionPropertyType::OptionPropertyType, std::string> typedef std::pair<OptionPropertyType::OptionPropertyType, std::string>
@ -397,6 +397,8 @@ public:
optionPropertyHandlers_["append_cmd"] = &CollectProperties::onAppendCmd; optionPropertyHandlers_["append_cmd"] = &CollectProperties::onAppendCmd;
optionPropertyHandlers_["forward"] = &CollectProperties::onForward; optionPropertyHandlers_["forward"] = &CollectProperties::onForward;
optionPropertyHandlers_["help"] = &CollectProperties::onHelp; optionPropertyHandlers_["help"] = &CollectProperties::onHelp;
optionPropertyHandlers_["output_suffix"] =
&CollectProperties::onOutputSuffixOptionProp;
optionPropertyHandlers_["required"] = &CollectProperties::onRequired; optionPropertyHandlers_["required"] = &CollectProperties::onRequired;
optionPropertyHandlers_["stop_compilation"] = optionPropertyHandlers_["stop_compilation"] =
&CollectProperties::onStopCompilation; &CollectProperties::onStopCompilation;
@ -487,11 +489,23 @@ private:
void onAppendCmd (const DagInit* d, GlobalOptionDescription& o) { void onAppendCmd (const DagInit* d, GlobalOptionDescription& o) {
checkNumberOfArguments(d, 1); 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); 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) { void onForward (const DagInit* d, GlobalOptionDescription& o) {
checkNumberOfArguments(d, 0); checkNumberOfArguments(d, 0);
toolProps_.OptDescs[o.Name].setForward(); toolProps_.OptDescs[o.Name].setForward();
@ -1021,7 +1035,22 @@ void EmitInOutLanguageMethods (const ToolProperties& P, std::ostream& O) {
/// given Tool class. /// given Tool class.
void EmitOutputSuffixMethod (const ToolProperties& P, std::ostream& O) { void EmitOutputSuffixMethod (const ToolProperties& P, std::ostream& O) {
O << Indent1 << "const char* OutputSuffix() const {\n" 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"; << Indent1 << "}\n\n";
} }