A small optimization: use static char* array instead of StrVector.
authorMikhail Glushenkov <foldr@codedgers.com>
Fri, 30 May 2008 06:24:49 +0000 (06:24 +0000)
committerMikhail Glushenkov <foldr@codedgers.com>
Fri, 30 May 2008 06:24:49 +0000 (06:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51752 91177308-0d34-0410-b5e6-96231b3b80d8

tools/llvmc2/CompilationGraph.cpp
tools/llvmc2/Tool.h
utils/TableGen/LLVMCConfigurationEmitter.cpp

index cf174dd56f3274a325a539cff48d139a193f093c..df1f2395654440a28e9c65954f2f406f132e872b 100644 (file)
@@ -123,10 +123,9 @@ void CompilationGraph::insertNode(Tool* V) {
 void CompilationGraph::insertEdge(const std::string& A, Edge* Edg) {
   Node& B = getNode(Edg->ToolName());
   if (A == "root") {
-    const StrVector& InputLanguages = B.ToolPtr->InputLanguages();
-    for (StrVector::const_iterator B = InputLanguages.begin(),
-           E = InputLanguages.end(); B != E; ++B)
-      ToolsMap[*B].push_back(IntrusiveRefCntPtr<Edge>(Edg));
+    const char** InLangs = B.ToolPtr->InputLanguages();
+    for (;*InLangs; ++InLangs)
+      ToolsMap[*InLangs].push_back(IntrusiveRefCntPtr<Edge>(Edg));
     NodesMap["root"].AddEdge(Edg);
   }
   else {
@@ -392,15 +391,17 @@ namespace llvm {
         return N->ToolPtr->OutputLanguage();
       }
       else {
-        const StrVector& InputLanguages = I->ToolPtr->InputLanguages();
+        const char** InLangs = I->ToolPtr->InputLanguages();
         std::string ret;
 
-        for (StrVector::const_iterator B = InputLanguages.begin(),
-               E = InputLanguages.end(); B != E; ++B) {
-          if (llvm::next(B) != E)
-            ret += *B + ", ";
-          else
-            ret += *B;
+        for (; *InLangs; ++InLangs) {
+          if (*(InLangs + 1)) {
+            ret += *InLangs;
+            ret +=  ", ";
+          }
+          else {
+            ret += *InLangs;
+          }
         }
 
         return ret;
index 4762b1ee65d8b0de0168594d9c59815ca6690cc4..93fa5dfb43a9e3426f79cfb99bde1f9d81ad6df0 100644 (file)
@@ -42,10 +42,10 @@ namespace llvmc {
                                    const llvm::sys::Path& outFile,
                                    const InputLanguagesSet& InLangs) const = 0;
 
-    virtual const char* Name() const = 0;
-    virtual StrVector InputLanguages() const = 0;
-    virtual const char* OutputLanguage() const = 0;
-    virtual const char* OutputSuffix() const = 0;
+    virtual const char*  Name() const = 0;
+    virtual const char** InputLanguages() const = 0;
+    virtual const char*  OutputLanguage() const = 0;
+    virtual const char*  OutputSuffix() const = 0;
 
     virtual bool IsLast() const = 0;
     virtual bool IsJoin() const = 0;
index 9be9cfc98b0a6ef7082698977a35a894d67d39b5..44a6ff4a402182f29bac33261f1cb5de64ffa54d 100644 (file)
@@ -1058,7 +1058,7 @@ void EmitGenerateActionMethod (const ToolProperties& P,
   O << Indent2 << "const sys::Path& outFile,\n"
     << Indent2 << "const InputLanguagesSet& InLangs) const\n"
     << Indent1 << "{\n"
-    << Indent2 << "std::string cmd;\n"
+    << Indent2 << "const char* cmd;\n"
     << Indent2 << "std::vector<std::string> vec;\n";
 
   // cmd_line is either a string or a 'case' construct.
@@ -1130,15 +1130,8 @@ void EmitIsLastMethod (const ToolProperties& P, std::ostream& O) {
 /// EmitInOutLanguageMethods - Emit the [Input,Output]Language()
 /// methods for a given Tool class.
 void EmitInOutLanguageMethods (const ToolProperties& P, std::ostream& O) {
-  O << Indent1 << "StrVector InputLanguages() const {\n"
-    << Indent2 << "StrVector ret;\n";
-
-  for (StrVector::const_iterator B = P.InLanguage.begin(),
-         E = P.InLanguage.end(); B != E; ++B) {
-    O << Indent2 << "ret.push_back(\"" << *B << "\");\n";
-  }
-
-  O << Indent2 << "return ret;\n"
+  O << Indent1 << "const char** InputLanguages() const {\n"
+    << Indent2 << "return InputLanguages_;\n"
     << Indent1 << "}\n\n";
 
   O << Indent1 << "const char* OutputLanguage() const {\n"
@@ -1187,6 +1180,16 @@ void EmitIsJoinMethod (const ToolProperties& P, std::ostream& O) {
   O << Indent1 << "}\n\n";
 }
 
+/// EmitStaticMemberDefinitions - Emit static member definitions for a
+/// given Tool class.
+void EmitStaticMemberDefinitions(const ToolProperties& P, std::ostream& O) {
+  O << "const char* " << P.Name << "::InputLanguages_[] = {";
+  for (StrVector::const_iterator B = P.InLanguage.begin(),
+         E = P.InLanguage.end(); B != E; ++B)
+    O << '\"' << *B << "\", ";
+  O << "0};\n\n";
+}
+
 /// EmitToolClassDefinition - Emit a Tool class definition.
 void EmitToolClassDefinition (const ToolProperties& P,
                               const GlobalOptionDescriptions& OptDescs,
@@ -1200,8 +1203,11 @@ void EmitToolClassDefinition (const ToolProperties& P,
     O << "JoinTool";
   else
     O << "Tool";
-  O << " {\npublic:\n";
 
+  O << "{\nprivate:\n"
+    << Indent1 << "static const char* InputLanguages_[];\n\n";
+
+  O << "public:\n";
   EmitNameMethod(P, O);
   EmitInOutLanguageMethods(P, O);
   EmitOutputSuffixMethod(P, O);
@@ -1210,7 +1216,10 @@ void EmitToolClassDefinition (const ToolProperties& P,
   EmitIsLastMethod(P, O);
 
   // Close class definition
-  O << "};\n\n";
+  O << "};\n";
+
+  EmitStaticMemberDefinitions(P, O);
+
 }
 
 /// EmitOptionDescriptions - Iterate over a list of option