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