diff options
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/Mangle.cpp | 21 | ||||
-rw-r--r-- | clang/lib/CodeGen/Mangle.h | 17 |
3 files changed, 25 insertions, 15 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index a3a9e619773..89e6490be35 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1204,7 +1204,7 @@ static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old, void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD) { const FunctionDecl *D = cast<FunctionDecl>(GD.getDecl()); const llvm::FunctionType *Ty = getTypes().GetFunctionType(GD); - + getMangleContext().mangleInitDiscriminator(); // Get or create the prototype for the function. llvm::Constant *Entry = GetAddrOfFunction(GD, Ty); diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp index e053f78008c..20d54b34105 100644 --- a/clang/lib/CodeGen/Mangle.cpp +++ b/clang/lib/CodeGen/Mangle.cpp @@ -65,8 +65,6 @@ static const CXXMethodDecl *getStructor(const CXXMethodDecl *MD) { } static const unsigned UnknownArity = ~0U; -static unsigned Discriminator = 0; -static llvm::DenseMap<const NamedDecl*, unsigned> Uniquifier; /// CXXNameMangler - Manage the mangling of a single name. class CXXNameMangler { @@ -672,17 +670,14 @@ void CXXNameMangler::mangleLocalName(const NamedDecl *ND) { Out << 'E'; mangleNestedName(ND, DC, true /*NoFunction*/); - // FIXME. This still does not conform to ABI and does not cover all cases. - unsigned &discriminator = Uniquifier[ND]; - if (!discriminator) - discriminator = ++Discriminator; - if (discriminator == 1) - return; - unsigned disc = discriminator-2; - if (disc < 10) - Out << '_' << disc; - else - Out << "__" << disc << '_'; + // FIXME. This still does not cover all cases. + unsigned disc; + if (Context.getNextDiscriminator(ND, disc)) { + if (disc < 10) + Out << '_' << disc; + else + Out << "__" << disc << '_'; + } return; } diff --git a/clang/lib/CodeGen/Mangle.h b/clang/lib/CodeGen/Mangle.h index 8d9629528d6..97f94b69b43 100644 --- a/clang/lib/CodeGen/Mangle.h +++ b/clang/lib/CodeGen/Mangle.h @@ -44,7 +44,9 @@ class MangleContext { ASTContext &Context; llvm::DenseMap<const TagDecl *, uint64_t> AnonStructIds; - + unsigned Discriminator; + llvm::DenseMap<const NamedDecl*, unsigned> Uniquifier; + public: explicit MangleContext(ASTContext &Context) : Context(Context) { } @@ -85,7 +87,20 @@ public: llvm::SmallVectorImpl<char> &); void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type, llvm::SmallVectorImpl<char> &); + + void mangleInitDiscriminator() { + Discriminator = 0; + } + bool getNextDiscriminator(const NamedDecl *ND, unsigned &disc) { + unsigned &discriminator = Uniquifier[ND]; + if (!discriminator) + discriminator = ++Discriminator; + if (discriminator == 1) + return false; + disc = discriminator-2; + return true; + } /// @} }; |