Index: lib/AST/MicrosoftMangle.cpp =================================================================== --- lib/AST/MicrosoftMangle.cpp +++ lib/AST/MicrosoftMangle.cpp @@ -238,6 +238,7 @@ void mangleNestedName(const NamedDecl *ND); private: + void mangleBackReference(StringRef Name, StringRef Suffix = ""); void mangleUnqualifiedName(const NamedDecl *ND) { mangleUnqualifiedName(ND, ND->getDeclName()); } @@ -607,6 +608,27 @@ } } +void MicrosoftCXXNameMangler::mangleBackReference(StringRef Name, + StringRef Suffix) { + if (NameBackReferences.size() < 10) { + size_t Size = NameBackReferences.size(); + BackRefMap::MapEntryTy &Entry = + NameBackReferences.GetOrCreateValue(Name, Size); + if (Entry.second == Size) { + Out << Name << Suffix; + } else { + Out << Entry.second; + } + } else { + BackRefMap::iterator Found = NameBackReferences.find(Name); + if (Found == NameBackReferences.end()) { + Out << Name << Suffix; + } else { + Out << Found->second; + } + } +} + static const TemplateDecl * isTemplate(const NamedDecl *ND, const TemplateArgumentList *&TemplateArgs) { // Check if we have a function template. @@ -668,22 +690,13 @@ // the mangled type name as a key to check the mangling of different types // for aliasing. - std::string TemplateMangling; - llvm::raw_string_ostream Stream(TemplateMangling); + llvm::SmallString<64> TemplateMangling; + llvm::raw_svector_ostream Stream(TemplateMangling); MicrosoftCXXNameMangler Extra(Context, Stream); Extra.mangleTemplateInstantiationName(TD, *TemplateArgs); Stream.flush(); - BackRefMap::iterator Found = NameBackReferences.find(TemplateMangling); - if (Found == NameBackReferences.end()) { - Out << TemplateMangling; - if (NameBackReferences.size() < 10) { - size_t Size = NameBackReferences.size(); - NameBackReferences[TemplateMangling] = Size; - } - } else { - Out << Found->second; - } + mangleBackReference(TemplateMangling); return; } @@ -1002,16 +1015,7 @@ void MicrosoftCXXNameMangler::mangleSourceName(StringRef Name) { // ::= @ - BackRefMap::iterator Found = NameBackReferences.find(Name); - if (Found == NameBackReferences.end()) { - Out << Name << '@'; - if (NameBackReferences.size() < 10) { - size_t Size = NameBackReferences.size(); - NameBackReferences[Name] = Size; - } - } else { - Out << Found->second; - } + mangleBackReference(Name, "@"); } void MicrosoftCXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) {