]> granicus.if.org Git - clang/commit
MS ABI: Mangle member pointer template arguments
authorReid Kleckner <reid@kleckner.net>
Wed, 5 Feb 2014 17:27:08 +0000 (17:27 +0000)
committerReid Kleckner <reid@kleckner.net>
Wed, 5 Feb 2014 17:27:08 +0000 (17:27 +0000)
commit9d74e0d38b38a234c577341a55b351328841f52b
tree866dae08bc4ea3db8480981a52e39a465a53a1a2
parent3bb54680c4b6e7d918c82e96ecd56239e3149a5a
MS ABI: Mangle member pointer template arguments

Member pointers are mangled as they would be represented at runtime.
They can be a single integer literal, single decl, or a tuple with some
more numbers tossed in.  With Clang today, most of those numbers will be
zero because we reject pointers to members of virtual bases.

This change required moving VTableContextBase ownership from
CodeGenVTables to ASTContext, because mangling now depends on vtable
layout.

I also hoisted the inheritance model helpers up to be inline static
methods of MSInheritanceAttr.  This makes the AST code that deals with
member pointers much more readable.

MSVC doesn't appear to have stable manglings of null member pointers:
- Null data memptrs in function templates have a mangling collision with
  the first field of a non-polymorphic single inheritance class.
- The mangling of null data memptrs changes if you add casts.
- Large null function memptrs in class templates crash MSVC.

Clang uses the class template mangling for null data memptrs and the
function template mangling for null function memptrs to deal with this.

Reviewers: majnemer

Differential Revision: http://llvm-reviews.chandlerc.com/D2695

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@200857 91177308-0d34-0410-b5e6-96231b3b80d8
include/clang/AST/ASTContext.h
include/clang/AST/DeclCXX.h
include/clang/AST/Mangle.h
include/clang/Basic/Attr.td
lib/AST/ASTContext.cpp
lib/AST/MicrosoftCXXABI.cpp
lib/AST/MicrosoftMangle.cpp
lib/CodeGen/CGVTables.cpp
lib/CodeGen/CGVTables.h
lib/CodeGen/MicrosoftCXXABI.cpp
test/CodeGenCXX/mangle-ms-templates-memptrs.cpp [new file with mode: 0644]