diff options
author | Charles Davis <cdavis@mines.edu> | 2010-06-18 07:51:00 +0000 |
---|---|---|
committer | Charles Davis <cdavis@mines.edu> | 2010-06-18 07:51:00 +0000 |
commit | c62458f6aead5e4c0d0f4534d52142e7864ba02b (patch) | |
tree | e043e4890473257bb7f88ea9c694b66ee9cef903 /lib/CodeGen | |
parent | 4c6021995032a898fb0502d5d1fd2df37638e57b (diff) |
Mangle tag types (unions, structs, classes, enums) in the Microsoft C++ Mangler.
Also, test that static members with default visibility in a struct have the
right mangling.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106276 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/MicrosoftCXXABI.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/CodeGen/MicrosoftCXXABI.cpp b/lib/CodeGen/MicrosoftCXXABI.cpp index 957b0f4d6d..3823c9dc20 100644 --- a/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/lib/CodeGen/MicrosoftCXXABI.cpp @@ -47,6 +47,7 @@ public: void mangleName(const NamedDecl *ND); void mangleFunctionEncoding(const FunctionDecl *FD); void mangleVariableEncoding(const VarDecl *VD); + void mangleNumber(int64_t Number); void mangleType(QualType T); private: @@ -67,6 +68,7 @@ private: #define TYPE(CLASS, PARENT) void mangleType(const CLASS##Type *T); #include "clang/AST/TypeNodes.def" + void mangleType(const TagType*); void mangleType(const FunctionType *T, bool IsStructor); void mangleFunctionClass(const FunctionDecl *FD); void mangleCallingConvention(const FunctionType *T); @@ -285,6 +287,30 @@ void MicrosoftCXXNameMangler::mangleName(const NamedDecl *ND) { Out << '@'; } +void MicrosoftCXXNameMangler::mangleNumber(int64_t Number) { + // <number> ::= [?] <decimal digit> # <= 9 + // ::= [?] <hex digit>+ @ # > 9; A = 0, B = 1, etc... + if (Number < 0) { + Out << '?'; + Number = -Number; + } + if (Number <= 9) { + Out << Number; + } else { + // We have to build up the encoding in reverse order, so it will come + // out right when we write it out. + char Encoding[16]; + char *EndPtr = Encoding+sizeof(Encoding); + char *CurPtr = EndPtr; + while (Number) { + *--CurPtr = 'A' + (Number % 16); + Number /= 16; + } + Out.write(CurPtr, EndPtr-CurPtr); + Out << '@'; + } +} + void MicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND, DeclarationName Name) { @@ -627,6 +653,12 @@ return; case Type::Builtin: mangleType(static_cast<BuiltinType *>(T.getTypePtr())); break; + case Type::Enum: + mangleType(static_cast<EnumType *>(T.getTypePtr())); + break; + case Type::Record: + mangleType(static_cast<RecordType *>(T.getTypePtr())); + break; default: assert(false && "Don't know how to mangle this type!"); break; @@ -850,6 +882,37 @@ void MicrosoftCXXNameMangler::mangleThrowSpecification( } } +// <type> ::= <union-type> | <struct-type> | <class-type> | <enum-type> +// <union-type> ::= T <name> +// <struct-type> ::= U <name> +// <class-type> ::= V <name> +// <enum-type> ::= W <size> <name> +void MicrosoftCXXNameMangler::mangleType(const EnumType *T) { + mangleType(static_cast<const TagType*>(T)); +} +void MicrosoftCXXNameMangler::mangleType(const RecordType *T) { + mangleType(static_cast<const TagType*>(T)); +} +void MicrosoftCXXNameMangler::mangleType(const TagType *T) { + switch (T->getDecl()->getTagKind()) { + case TTK_Union: + Out << 'T'; + break; + case TTK_Struct: + Out << 'U'; + break; + case TTK_Class: + Out << 'V'; + break; + case TTK_Enum: + Out << 'W'; + mangleNumber(getASTContext().getTypeSizeInChars( + cast<EnumDecl>(T->getDecl())->getIntegerType()).getQuantity()); + break; + } + mangleName(T->getDecl()); +} + void MicrosoftMangleContext::mangleName(const NamedDecl *D, llvm::SmallVectorImpl<char> &Name) { assert((isa<FunctionDecl>(D) || isa<VarDecl>(D)) && |