mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 20:59:51 +00:00
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
This commit is contained in:
parent
08bd2e74dc
commit
5c7578de08
@ -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)
|
||||
]>;
|
||||
|
||||
|
@ -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";
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user