<div dir="ltr">I'm definitely in favor of moving more of the 'E' manglings for 64-bit pointers into the qualifier mangling.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Feb 18, 2014 at 4:58 AM, David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: majnemer<br>
Date: Tue Feb 18 06:58:35 2014<br>
New Revision: 201569<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=201569&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=201569&view=rev</a><br>
Log:<br>
MS ABI: Add support for mangling __restrict<br>
<br>
Pointer types in the MSVC ABI are a bit awkward, the width of the<br>
pointer is considered a kind of CVR qualifier.<br>
<br>
Restrict is handled similarly to const and volatile but is mangled after<br>
the pointer width qualifier.<br>
<br>
This fixes PR18880.<br>
<br>
Modified:<br>
    cfe/trunk/lib/AST/MicrosoftMangle.cpp<br>
    cfe/trunk/lib/AST/Type.cpp<br>
    cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp<br>
    cfe/trunk/test/CodeGenCXX/mangle-ms.cpp<br>
<br>
Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=201569&r1=201568&r2=201569&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=201569&r1=201568&r2=201569&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original)<br>
+++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Tue Feb 18 06:58:35 2014<br>
@@ -145,7 +145,7 @@ private:<br>
   void mangleOperatorName(OverloadedOperatorKind OO, SourceLocation Loc);<br>
   void mangleCXXDtorType(CXXDtorType T);<br>
   void mangleQualifiers(Qualifiers Quals, bool IsMember);<br>
-  void manglePointerQualifiers(Qualifiers Quals);<br>
+  void manglePointerQualifiers(Qualifiers Quals, const Type *PointeeType);<br>
<br>
   void mangleUnscopedTemplateName(const TemplateDecl *ND);<br>
   void mangleTemplateInstantiationName(const TemplateDecl *TD,<br>
@@ -1213,13 +1213,16 @@ void MicrosoftCXXNameMangler::mangleQual<br>
   // FIXME: For now, just drop all extension qualifiers on the floor.<br>
 }<br>
<br>
-void MicrosoftCXXNameMangler::manglePointerQualifiers(Qualifiers Quals) {<br>
+void MicrosoftCXXNameMangler::manglePointerQualifiers(Qualifiers Quals,<br>
+                                                      const Type *PointeeType) {<br>
   // <pointer-cvr-qualifiers> ::= P  # no qualifiers<br>
   //                          ::= Q  # const<br>
   //                          ::= R  # volatile<br>
   //                          ::= S  # const volatile<br>
   bool HasConst = Quals.hasConst(),<br>
-       HasVolatile = Quals.hasVolatile();<br>
+       HasVolatile = Quals.hasVolatile(),<br>
+       HasRestrict = Quals.hasRestrict();<br>
+<br>
   if (HasConst && HasVolatile) {<br>
     Out << 'S';<br>
   } else if (HasVolatile) {<br>
@@ -1229,6 +1232,12 @@ void MicrosoftCXXNameMangler::manglePoin<br>
   } else {<br>
     Out << 'P';<br>
   }<br>
+<br>
+  if (PointersAre64Bit && PointeeType && !PointeeType->isFunctionType())<br>
+    Out << 'E';<br>
+<br>
+  if (HasRestrict)<br>
+    Out << 'I';<br>
 }<br>
<br>
 void MicrosoftCXXNameMangler::mangleArgumentType(QualType T,<br>
@@ -1320,7 +1329,7 @@ void MicrosoftCXXNameMangler::mangleType<br>
<br>
   // We have to mangle these now, while we still have enough information.<br>
   if (IsPointer)<br>
-    manglePointerQualifiers(Quals);<br>
+    manglePointerQualifiers(Quals, T->getPointeeType().getTypePtr());<br>
   const Type *ty = T.getTypePtr();<br>
<br>
   switch (ty->getTypeClass()) {<br>
@@ -1656,7 +1665,7 @@ void MicrosoftCXXNameMangler::mangleType<br>
 void MicrosoftCXXNameMangler::mangleDecayedArrayType(const ArrayType *T) {<br>
   // This isn't a recursive mangling, so now we have to do it all in this<br>
   // one call.<br>
-  manglePointerQualifiers(T->getElementType().getQualifiers());<br>
+  manglePointerQualifiers(T->getElementType().getQualifiers(), 0);<br>
   mangleType(T->getElementType(), SourceRange());<br>
 }<br>
 void MicrosoftCXXNameMangler::mangleType(const ConstantArrayType *T,<br>
@@ -1728,8 +1737,6 @@ void MicrosoftCXXNameMangler::mangleType<br>
     mangleName(T->getClass()->castAs<RecordType>()->getDecl());<br>
     mangleFunctionType(FPT, 0, true);<br>
   } else {<br>
-    if (PointersAre64Bit && !T->getPointeeType()->isFunctionType())<br>
-      Out << 'E';<br>
     mangleQualifiers(PointeeType.getQualifiers(), true);<br>
     mangleName(T->getClass()->castAs<RecordType>()->getDecl());<br>
     mangleType(PointeeType, Range, QMM_Drop);<br>
@@ -1761,8 +1768,6 @@ void MicrosoftCXXNameMangler::mangleType<br>
 void MicrosoftCXXNameMangler::mangleType(const PointerType *T,<br>
                                          SourceRange Range) {<br>
   QualType PointeeTy = T->getPointeeType();<br>
-  if (PointersAre64Bit && !T->getPointeeType()->isFunctionType())<br>
-    Out << 'E';<br>
   mangleType(PointeeTy, Range);<br>
 }<br>
 void MicrosoftCXXNameMangler::mangleType(const ObjCObjectPointerType *T,<br>
<br>
Modified: cfe/trunk/lib/AST/Type.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=201569&r1=201568&r2=201569&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=201569&r1=201568&r2=201569&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/AST/Type.cpp (original)<br>
+++ cfe/trunk/lib/AST/Type.cpp Tue Feb 18 06:58:35 2014<br>
@@ -422,6 +422,10 @@ QualType Type::getPointeeType() const {<br>
     return BPT->getPointeeType();<br>
   if (const ReferenceType *RT = getAs<ReferenceType>())<br>
     return RT->getPointeeType();<br>
+  if (const MemberPointerType *MPT = getAs<MemberPointerType>())<br>
+    return MPT->getPointeeType();<br>
+  if (const DecayedType *DT = getAs<DecayedType>())<br>
+    return DT->getPointeeType();<br>
   return QualType();<br>
 }<br>
<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp?rev=201569&r1=201568&r2=201569&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp?rev=201569&r1=201568&r2=201569&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp Tue Feb 18 06:58:35 2014<br>
@@ -37,6 +37,22 @@ void foo_sad(char * const volatile x) {}<br>
 // CHECK: "\01?foo_sad@@YAXSAD@Z"<br>
 // X64: "\01?foo_sad@@YAXSEAD@Z"<br>
<br>
+void foo_piad(char * __restrict x) {}<br>
+// CHECK: "\01?foo_piad@@YAXPIAD@Z"<br>
+// X64: "\01?foo_piad@@YAXPEIAD@Z"<br>
+<br>
+void foo_qiad(char * const __restrict x) {}<br>
+// CHECK: "\01?foo_qiad@@YAXQIAD@Z"<br>
+// X64: "\01?foo_qiad@@YAXQEIAD@Z"<br>
+<br>
+void foo_riad(char * volatile __restrict x) {}<br>
+// CHECK: "\01?foo_riad@@YAXRIAD@Z"<br>
+// X64: "\01?foo_riad@@YAXREIAD@Z"<br>
+<br>
+void foo_siad(char * const volatile __restrict x) {}<br>
+// CHECK: "\01?foo_siad@@YAXSIAD@Z"<br>
+// X64: "\01?foo_siad@@YAXSEIAD@Z"<br>
+<br>
 void foo_papad(char ** x) {}<br>
 // CHECK: "\01?foo_papad@@YAXPAPAD@Z"<br>
 // X64: "\01?foo_papad@@YAXPEAPEAD@Z"<br>
@@ -238,3 +254,7 @@ void mangle_yes_backref2(fun_type *const<br>
 void mangle_yes_backref3(ptr_to_fun_type *const, void (**const)(void)) {}<br>
 // CHECK: "\01?mangle_yes_backref3@@YAXQAP6AXXZ0@Z"<br>
 // X64:   "\01?mangle_yes_backref3@@YAXQEAP6AXXZ0@Z"<br>
+<br>
+void mangle_yes_backref4(int *const __restrict, int *const __restrict) {}<br>
+// CHECK: "\01?mangle_yes_backref4@@YAXQIAH0@Z"<br>
+// X64:   "\01?mangle_yes_backref4@@YAXQEIAH0@Z"<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/mangle-ms.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms.cpp?rev=201569&r1=201568&r2=201569&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms.cpp?rev=201569&r1=201568&r2=201569&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/mangle-ms.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/mangle-ms.cpp Tue Feb 18 06:58:35 2014<br>
@@ -99,6 +99,11 @@ extern const int * const h2 = &a;<br>
 int i[10][20];<br>
 // CHECK-DAG: @"\01?i@@3PAY0BE@HA"<br>
<br>
+typedef int (*FunT)(int, int);<br>
+FunT FunArr[10][20];<br>
+// CHECK-DAG: @"\01?FunArr@@3PAY0BE@P6AHHH@ZA"<br>
+// X64-DAG: @"\01?FunArr@@3PAY0BE@P6AHHH@ZA"<br>
+<br>
 int (__stdcall *j)(signed char, unsigned char);<br>
 // CHECK-DAG: @"\01?j@@3P6GHCE@ZA"<br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>