Avoid extra back reference key lookup in msmangler

Avoid a second key lookup when the back reference key is going to be
inserted in the StringMap. The string lookups in the msmangler are the
main responsible for the huge overhead when compared to the itanium
mangler. This patch makes a small but noticeable improvement.

Reviewed by: rnk

Differential Revision: http://reviews.llvm.org/D4130

Patch by Agustín Bergé!

llvm-svn: 211813
This commit is contained in:
Reid Kleckner 2014-06-26 22:42:18 +00:00
parent 34413ec640
commit 11c6f6165b
1 changed files with 17 additions and 19 deletions

View File

@ -650,6 +650,7 @@ void MicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
// FIXME: Test alias template mangling with MSVC 2013. // FIXME: Test alias template mangling with MSVC 2013.
if (!isa<ClassTemplateDecl>(TD)) { if (!isa<ClassTemplateDecl>(TD)) {
mangleTemplateInstantiationName(TD, *TemplateArgs); mangleTemplateInstantiationName(TD, *TemplateArgs);
Out << '@';
return; return;
} }
@ -668,22 +669,13 @@ void MicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
// the mangled type name as a key to check the mangling of different types // the mangled type name as a key to check the mangling of different types
// for aliasing. // for aliasing.
std::string TemplateMangling; llvm::SmallString<64> TemplateMangling;
llvm::raw_string_ostream Stream(TemplateMangling); llvm::raw_svector_ostream Stream(TemplateMangling);
MicrosoftCXXNameMangler Extra(Context, Stream); MicrosoftCXXNameMangler Extra(Context, Stream);
Extra.mangleTemplateInstantiationName(TD, *TemplateArgs); Extra.mangleTemplateInstantiationName(TD, *TemplateArgs);
Stream.flush(); Stream.flush();
BackRefMap::iterator Found = NameBackReferences.find(TemplateMangling); mangleSourceName(TemplateMangling);
if (Found == NameBackReferences.end()) {
Out << TemplateMangling;
if (NameBackReferences.size() < 10) {
size_t Size = NameBackReferences.size();
NameBackReferences[TemplateMangling] = Size;
}
} else {
Out << Found->second;
}
return; return;
} }
@ -1002,13 +994,20 @@ void MicrosoftCXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO,
void MicrosoftCXXNameMangler::mangleSourceName(StringRef Name) { void MicrosoftCXXNameMangler::mangleSourceName(StringRef Name) {
// <source name> ::= <identifier> @ // <source name> ::= <identifier> @
BackRefMap::iterator Found = NameBackReferences.find(Name); BackRefMap::iterator Found;
if (NameBackReferences.size() < 10) {
size_t Size = NameBackReferences.size();
bool Inserted;
std::tie(Found, Inserted) =
NameBackReferences.insert(std::make_pair(Name, Size));
if (Inserted)
Found = NameBackReferences.end();
} else {
Found = NameBackReferences.find(Name);
}
if (Found == NameBackReferences.end()) { if (Found == NameBackReferences.end()) {
Out << Name << '@'; Out << Name << '@';
if (NameBackReferences.size() < 10) {
size_t Size = NameBackReferences.size();
NameBackReferences[Name] = Size;
}
} else { } else {
Out << Found->second; Out << Found->second;
} }
@ -1104,10 +1103,9 @@ void MicrosoftCXXNameMangler::mangleExpression(const Expr *E) {
void MicrosoftCXXNameMangler::mangleTemplateArgs( void MicrosoftCXXNameMangler::mangleTemplateArgs(
const TemplateDecl *TD, const TemplateArgumentList &TemplateArgs) { const TemplateDecl *TD, const TemplateArgumentList &TemplateArgs) {
// <template-args> ::= <template-arg>+ @ // <template-args> ::= <template-arg>+
for (const TemplateArgument &TA : TemplateArgs.asArray()) for (const TemplateArgument &TA : TemplateArgs.asArray())
mangleTemplateArg(TD, TA); mangleTemplateArg(TD, TA);
Out << '@';
} }
void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD, void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,