A small optimization: use static char* array instead of StrVector.

llvm-svn: 51752
This commit is contained in:
Mikhail Glushenkov 2008-05-30 06:24:49 +00:00
parent bf14dd7dc3
commit c8bd3517d5
3 changed files with 37 additions and 27 deletions

View File

@ -123,10 +123,9 @@ void CompilationGraph::insertNode(Tool* V) {
void CompilationGraph::insertEdge(const std::string& A, Edge* Edg) { void CompilationGraph::insertEdge(const std::string& A, Edge* Edg) {
Node& B = getNode(Edg->ToolName()); Node& B = getNode(Edg->ToolName());
if (A == "root") { if (A == "root") {
const StrVector& InputLanguages = B.ToolPtr->InputLanguages(); const char** InLangs = B.ToolPtr->InputLanguages();
for (StrVector::const_iterator B = InputLanguages.begin(), for (;*InLangs; ++InLangs)
E = InputLanguages.end(); B != E; ++B) ToolsMap[*InLangs].push_back(IntrusiveRefCntPtr<Edge>(Edg));
ToolsMap[*B].push_back(IntrusiveRefCntPtr<Edge>(Edg));
NodesMap["root"].AddEdge(Edg); NodesMap["root"].AddEdge(Edg);
} }
else { else {
@ -392,15 +391,17 @@ namespace llvm {
return N->ToolPtr->OutputLanguage(); return N->ToolPtr->OutputLanguage();
} }
else { else {
const StrVector& InputLanguages = I->ToolPtr->InputLanguages(); const char** InLangs = I->ToolPtr->InputLanguages();
std::string ret; std::string ret;
for (StrVector::const_iterator B = InputLanguages.begin(), for (; *InLangs; ++InLangs) {
E = InputLanguages.end(); B != E; ++B) { if (*(InLangs + 1)) {
if (llvm::next(B) != E) ret += *InLangs;
ret += *B + ", "; ret += ", ";
else }
ret += *B; else {
ret += *InLangs;
}
} }
return ret; return ret;

View File

@ -42,10 +42,10 @@ namespace llvmc {
const llvm::sys::Path& outFile, const llvm::sys::Path& outFile,
const InputLanguagesSet& InLangs) const = 0; const InputLanguagesSet& InLangs) const = 0;
virtual const char* Name() const = 0; virtual const char* Name() const = 0;
virtual StrVector InputLanguages() const = 0; virtual const char** InputLanguages() const = 0;
virtual const char* OutputLanguage() const = 0; virtual const char* OutputLanguage() const = 0;
virtual const char* OutputSuffix() const = 0; virtual const char* OutputSuffix() const = 0;
virtual bool IsLast() const = 0; virtual bool IsLast() const = 0;
virtual bool IsJoin() const = 0; virtual bool IsJoin() const = 0;

View File

@ -1058,7 +1058,7 @@ void EmitGenerateActionMethod (const ToolProperties& P,
O << Indent2 << "const sys::Path& outFile,\n" O << Indent2 << "const sys::Path& outFile,\n"
<< Indent2 << "const InputLanguagesSet& InLangs) const\n" << Indent2 << "const InputLanguagesSet& InLangs) const\n"
<< Indent1 << "{\n" << Indent1 << "{\n"
<< Indent2 << "std::string cmd;\n" << Indent2 << "const char* cmd;\n"
<< Indent2 << "std::vector<std::string> vec;\n"; << Indent2 << "std::vector<std::string> vec;\n";
// cmd_line is either a string or a 'case' construct. // 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() /// EmitInOutLanguageMethods - Emit the [Input,Output]Language()
/// methods for a given Tool class. /// methods for a given Tool class.
void EmitInOutLanguageMethods (const ToolProperties& P, std::ostream& O) { void EmitInOutLanguageMethods (const ToolProperties& P, std::ostream& O) {
O << Indent1 << "StrVector InputLanguages() const {\n" O << Indent1 << "const char** InputLanguages() const {\n"
<< Indent2 << "StrVector ret;\n"; << Indent2 << "return InputLanguages_;\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"
<< Indent1 << "}\n\n"; << Indent1 << "}\n\n";
O << Indent1 << "const char* OutputLanguage() const {\n" O << Indent1 << "const char* OutputLanguage() const {\n"
@ -1187,6 +1180,16 @@ void EmitIsJoinMethod (const ToolProperties& P, std::ostream& O) {
O << Indent1 << "}\n\n"; 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. /// EmitToolClassDefinition - Emit a Tool class definition.
void EmitToolClassDefinition (const ToolProperties& P, void EmitToolClassDefinition (const ToolProperties& P,
const GlobalOptionDescriptions& OptDescs, const GlobalOptionDescriptions& OptDescs,
@ -1200,8 +1203,11 @@ void EmitToolClassDefinition (const ToolProperties& P,
O << "JoinTool"; O << "JoinTool";
else else
O << "Tool"; O << "Tool";
O << " {\npublic:\n";
O << "{\nprivate:\n"
<< Indent1 << "static const char* InputLanguages_[];\n\n";
O << "public:\n";
EmitNameMethod(P, O); EmitNameMethod(P, O);
EmitInOutLanguageMethods(P, O); EmitInOutLanguageMethods(P, O);
EmitOutputSuffixMethod(P, O); EmitOutputSuffixMethod(P, O);
@ -1210,7 +1216,10 @@ void EmitToolClassDefinition (const ToolProperties& P,
EmitIsLastMethod(P, O); EmitIsLastMethod(P, O);
// Close class definition // Close class definition
O << "};\n\n"; O << "};\n";
EmitStaticMemberDefinitions(P, O);
} }
/// EmitOptionDescriptions - Iterate over a list of option /// EmitOptionDescriptions - Iterate over a list of option