Make it possible to change the output file suffix based on command-line options.
authorMikhail Glushenkov <foldr@codedgers.com>
Fri, 30 May 2008 06:13:02 +0000 (06:13 +0000)
committerMikhail Glushenkov <foldr@codedgers.com>
Fri, 30 May 2008 06:13:02 +0000 (06:13 +0000)
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

tools/llvmc2/Tools.td
utils/TableGen/LLVMCConfigurationEmitter.cpp

index 63b713fb0a2e3aaccdf29829d5b597ebe31f4cf6..42060e3b2cf40379ffdadc6927d089cb0a174f38 100644 (file)
@@ -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)
 ]>;
 
index d160412cfaa718e916a351e1a74c7fd771c46ae4..2dfd17e7b48a89dec35e367f35b95bf8c0e7fca9 100644 (file)
@@ -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";
 }