diff --git a/llvm/tools/llvmc2/CompilationGraph.cpp b/llvm/tools/llvmc2/CompilationGraph.cpp index cf174dd56f32..df1f23956544 100644 --- a/llvm/tools/llvmc2/CompilationGraph.cpp +++ b/llvm/tools/llvmc2/CompilationGraph.cpp @@ -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(Edg)); + const char** InLangs = B.ToolPtr->InputLanguages(); + for (;*InLangs; ++InLangs) + ToolsMap[*InLangs].push_back(IntrusiveRefCntPtr(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; diff --git a/llvm/tools/llvmc2/Tool.h b/llvm/tools/llvmc2/Tool.h index 4762b1ee65d8..93fa5dfb43a9 100644 --- a/llvm/tools/llvmc2/Tool.h +++ b/llvm/tools/llvmc2/Tool.h @@ -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; diff --git a/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp b/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp index 9be9cfc98b0a..44a6ff4a4021 100644 --- a/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp +++ b/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp @@ -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 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