r201569 - MS ABI: Add support for mangling __restrict

David Majnemer david.majnemer at gmail.com
Tue Feb 18 04:58:36 PST 2014


Author: majnemer
Date: Tue Feb 18 06:58:35 2014
New Revision: 201569

URL: http://llvm.org/viewvc/llvm-project?rev=201569&view=rev
Log:
MS ABI: Add support for mangling __restrict

Pointer types in the MSVC ABI are a bit awkward, the width of the
pointer is considered a kind of CVR qualifier.

Restrict is handled similarly to const and volatile but is mangled after
the pointer width qualifier.

This fixes PR18880.

Modified:
    cfe/trunk/lib/AST/MicrosoftMangle.cpp
    cfe/trunk/lib/AST/Type.cpp
    cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp
    cfe/trunk/test/CodeGenCXX/mangle-ms.cpp

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

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

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

Modified: cfe/trunk/test/CodeGenCXX/mangle-ms.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms.cpp?rev=201569&r1=201568&r2=201569&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/mangle-ms.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/mangle-ms.cpp Tue Feb 18 06:58:35 2014
@@ -99,6 +99,11 @@ extern const int * const h2 = &a;
 int i[10][20];
 // CHECK-DAG: @"\01?i@@3PAY0BE at HA"
 
+typedef int (*FunT)(int, int);
+FunT FunArr[10][20];
+// CHECK-DAG: @"\01?FunArr@@3PAY0BE at P6AHHH@ZA"
+// X64-DAG: @"\01?FunArr@@3PAY0BE at P6AHHH@ZA"
+
 int (__stdcall *j)(signed char, unsigned char);
 // CHECK-DAG: @"\01?j@@3P6GHCE at ZA"
 





More information about the cfe-commits mailing list