diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-05-06 22:49:16 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-05-06 22:49:16 +0000 |
commit | 3b3bdb516957deb660525bc46bf2de9d4c6adc0e (patch) | |
tree | 173adef3dcc34311cc6f309bb6feb831cf4566e9 /clang/lib/AST/ItaniumMangle.cpp | |
parent | 8d8f100c57f8c6e774c6948ecc9a6b6a34339e9e (diff) | |
download | bcm5719-llvm-3b3bdb516957deb660525bc46bf2de9d4c6adc0e.tar.gz bcm5719-llvm-3b3bdb516957deb660525bc46bf2de9d4c6adc0e.zip |
AST: Update reference temporary mangling
Summary:
Update our mangling to match the discussion on cxx-abi-dev.
This involves using a seq-id instead of an optional number.
Reviewers: rsmith
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D3631
llvm-svn: 208140
Diffstat (limited to 'clang/lib/AST/ItaniumMangle.cpp')
-rw-r--r-- | clang/lib/AST/ItaniumMangle.cpp | 50 |
1 files changed, 26 insertions, 24 deletions
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 7105af2a761..4a07fbf5635 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -288,11 +288,13 @@ public: void mangleNumber(int64_t Number); void mangleFloat(const llvm::APFloat &F); void mangleFunctionEncoding(const FunctionDecl *FD); + void mangleSeqID(unsigned SeqID); void mangleName(const NamedDecl *ND); void mangleType(QualType T); void mangleNameOrStandardSubstitution(const NamedDecl *ND); private: + bool mangleSubstitution(const NamedDecl *ND); bool mangleSubstitution(QualType T); bool mangleSubstitution(TemplateName Template); @@ -3413,6 +3415,27 @@ void CXXNameMangler::mangleTemplateParameter(unsigned Index) { Out << 'T' << (Index - 1) << '_'; } +void CXXNameMangler::mangleSeqID(unsigned SeqID) { + if (SeqID == 1) + Out << '0'; + else if (SeqID > 1) { + SeqID--; + + // <seq-id> is encoded in base-36, using digits and upper case letters. + char Buffer[7]; // log(2**32) / log(36) ~= 7 + llvm::MutableArrayRef<char> BufferRef(Buffer); + llvm::MutableArrayRef<char>::reverse_iterator I = BufferRef.rbegin(); + + for (; SeqID != 0; SeqID /= 36) { + unsigned C = SeqID % 36; + *I++ = (C < 10 ? '0' + C : 'A' + C - 10); + } + + Out.write(I.base(), I - BufferRef.rbegin()); + } + Out << '_'; +} + void CXXNameMangler::mangleExistingSubstitution(QualType type) { bool result = mangleSubstitution(type); assert(result && "no existing substitution for type"); @@ -3469,28 +3492,8 @@ bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) { return false; unsigned SeqID = I->second; - if (SeqID == 0) - Out << "S_"; - else { - SeqID--; - - // <seq-id> is encoded in base-36, using digits and upper case letters. - char Buffer[10]; - char *BufferPtr = std::end(Buffer); - - if (SeqID == 0) *--BufferPtr = '0'; - - while (SeqID) { - assert(BufferPtr > Buffer && "Buffer overflow!"); - - char c = static_cast<char>(SeqID % 36); - - *--BufferPtr = (c < 10 ? '0' + c : 'A' + c - 10); - SeqID /= 36; - } - - Out << 'S' << StringRef(BufferPtr, std::end(Buffer) - BufferPtr) << '_'; - } + Out << 'S'; + mangleSeqID(SeqID); return true; } @@ -3791,8 +3794,7 @@ void ItaniumMangleContextImpl::mangleReferenceTemporary(const VarDecl *D, Mangler.getStream() << "_ZGR"; Mangler.mangleName(D); assert(ManglingNumber > 0 && "Reference temporary mangling number is zero!"); - if (ManglingNumber > 1) - Mangler.mangleNumber(ManglingNumber - 2); + Mangler.mangleSeqID(ManglingNumber - 1); } void ItaniumMangleContextImpl::mangleCXXVTable(const CXXRecordDecl *RD, |