Skip to content
Snippets Groups Projects
Commit e4f0f4ab authored by David Majnemer's avatar David Majnemer
Browse files

MS ABI: Refactor extended qualifiers

Extended qualifiers can appear in many places, refactor the code so it's
more reusable.  Add tests in areas where we've increased compatibility.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201574 91177308-0d34-0410-b5e6-96231b3b80d8
parent fb51566d
No related branches found
No related tags found
No related merge requests found
...@@ -145,7 +145,8 @@ private: ...@@ -145,7 +145,8 @@ private:
void mangleOperatorName(OverloadedOperatorKind OO, SourceLocation Loc); void mangleOperatorName(OverloadedOperatorKind OO, SourceLocation Loc);
void mangleCXXDtorType(CXXDtorType T); void mangleCXXDtorType(CXXDtorType T);
void mangleQualifiers(Qualifiers Quals, bool IsMember); void mangleQualifiers(Qualifiers Quals, bool IsMember);
void manglePointerQualifiers(Qualifiers Quals, const Type *PointeeType); void manglePointerCVQualifiers(Qualifiers Quals);
void manglePointerExtQualifiers(Qualifiers Quals, const Type *PointeeType);
void mangleUnscopedTemplateName(const TemplateDecl *ND); void mangleUnscopedTemplateName(const TemplateDecl *ND);
void mangleTemplateInstantiationName(const TemplateDecl *TD, void mangleTemplateInstantiationName(const TemplateDecl *TD,
...@@ -355,8 +356,8 @@ void MicrosoftCXXNameMangler::mangleVariableEncoding(const VarDecl *VD) { ...@@ -355,8 +356,8 @@ void MicrosoftCXXNameMangler::mangleVariableEncoding(const VarDecl *VD) {
if (Ty->isPointerType() || Ty->isReferenceType() || if (Ty->isPointerType() || Ty->isReferenceType() ||
Ty->isMemberPointerType()) { Ty->isMemberPointerType()) {
mangleType(Ty, TL.getSourceRange(), QMM_Drop); mangleType(Ty, TL.getSourceRange(), QMM_Drop);
if (PointersAre64Bit) manglePointerExtQualifiers(
Out << 'E'; Ty.getDesugaredType(getASTContext()).getLocalQualifiers(), 0);
if (const MemberPointerType *MPT = Ty->getAs<MemberPointerType>()) { if (const MemberPointerType *MPT = Ty->getAs<MemberPointerType>()) {
mangleQualifiers(MPT->getPointeeType().getQualifiers(), true); mangleQualifiers(MPT->getPointeeType().getQualifiers(), true);
// Member pointers are suffixed with a back reference to the member // Member pointers are suffixed with a back reference to the member
...@@ -1213,15 +1214,24 @@ void MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals, ...@@ -1213,15 +1214,24 @@ void MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals,
// FIXME: For now, just drop all extension qualifiers on the floor. // FIXME: For now, just drop all extension qualifiers on the floor.
} }
void MicrosoftCXXNameMangler::manglePointerQualifiers(Qualifiers Quals, void
const Type *PointeeType) { MicrosoftCXXNameMangler::manglePointerExtQualifiers(Qualifiers Quals,
// <pointer-cvr-qualifiers> ::= P # no qualifiers const Type *PointeeType) {
// ::= Q # const bool HasRestrict = Quals.hasRestrict();
// ::= R # volatile if (PointersAre64Bit && (!PointeeType || !PointeeType->isFunctionType()))
// ::= S # const volatile Out << 'E';
if (HasRestrict)
Out << 'I';
}
void MicrosoftCXXNameMangler::manglePointerCVQualifiers(Qualifiers Quals) {
// <pointer-cv-qualifiers> ::= P # no qualifiers
// ::= Q # const
// ::= R # volatile
// ::= S # const volatile
bool HasConst = Quals.hasConst(), bool HasConst = Quals.hasConst(),
HasVolatile = Quals.hasVolatile(), HasVolatile = Quals.hasVolatile();
HasRestrict = Quals.hasRestrict();
if (HasConst && HasVolatile) { if (HasConst && HasVolatile) {
Out << 'S'; Out << 'S';
...@@ -1232,12 +1242,6 @@ void MicrosoftCXXNameMangler::manglePointerQualifiers(Qualifiers Quals, ...@@ -1232,12 +1242,6 @@ void MicrosoftCXXNameMangler::manglePointerQualifiers(Qualifiers Quals,
} else { } else {
Out << 'P'; Out << 'P';
} }
if (PointersAre64Bit && PointeeType && !PointeeType->isFunctionType())
Out << 'E';
if (HasRestrict)
Out << 'I';
} }
void MicrosoftCXXNameMangler::mangleArgumentType(QualType T, void MicrosoftCXXNameMangler::mangleArgumentType(QualType T,
...@@ -1328,8 +1332,10 @@ void MicrosoftCXXNameMangler::mangleType(QualType T, SourceRange Range, ...@@ -1328,8 +1332,10 @@ void MicrosoftCXXNameMangler::mangleType(QualType T, SourceRange Range,
} }
// We have to mangle these now, while we still have enough information. // We have to mangle these now, while we still have enough information.
if (IsPointer) if (IsPointer) {
manglePointerQualifiers(Quals, T->getPointeeType().getTypePtr()); manglePointerCVQualifiers(Quals);
manglePointerExtQualifiers(Quals, T->getPointeeType().getTypePtr());
}
const Type *ty = T.getTypePtr(); const Type *ty = T.getTypePtr();
switch (ty->getTypeClass()) { switch (ty->getTypeClass()) {
...@@ -1469,9 +1475,9 @@ void MicrosoftCXXNameMangler::mangleFunctionType(const FunctionType *T, ...@@ -1469,9 +1475,9 @@ void MicrosoftCXXNameMangler::mangleFunctionType(const FunctionType *T,
// If this is a C++ instance method, mangle the CVR qualifiers for the // If this is a C++ instance method, mangle the CVR qualifiers for the
// this pointer. // this pointer.
if (IsInstMethod) { if (IsInstMethod) {
if (PointersAre64Bit) Qualifiers Quals = Qualifiers::fromCVRMask(Proto->getTypeQuals());
Out << 'E'; manglePointerExtQualifiers(Quals, 0);
mangleQualifiers(Qualifiers::fromCVRMask(Proto->getTypeQuals()), false); mangleQualifiers(Quals, false);
} }
mangleCallingConvention(T); mangleCallingConvention(T);
...@@ -1665,7 +1671,7 @@ void MicrosoftCXXNameMangler::mangleType(const TagDecl *TD) { ...@@ -1665,7 +1671,7 @@ void MicrosoftCXXNameMangler::mangleType(const TagDecl *TD) {
void MicrosoftCXXNameMangler::mangleDecayedArrayType(const ArrayType *T) { void MicrosoftCXXNameMangler::mangleDecayedArrayType(const ArrayType *T) {
// This isn't a recursive mangling, so now we have to do it all in this // This isn't a recursive mangling, so now we have to do it all in this
// one call. // one call.
manglePointerQualifiers(T->getElementType().getQualifiers(), 0); manglePointerCVQualifiers(T->getElementType().getQualifiers());
mangleType(T->getElementType(), SourceRange()); mangleType(T->getElementType(), SourceRange());
} }
void MicrosoftCXXNameMangler::mangleType(const ConstantArrayType *T, void MicrosoftCXXNameMangler::mangleType(const ConstantArrayType *T,
...@@ -1774,8 +1780,7 @@ void MicrosoftCXXNameMangler::mangleType(const ObjCObjectPointerType *T, ...@@ -1774,8 +1780,7 @@ void MicrosoftCXXNameMangler::mangleType(const ObjCObjectPointerType *T,
SourceRange Range) { SourceRange Range) {
// Object pointers never have qualifiers. // Object pointers never have qualifiers.
Out << 'A'; Out << 'A';
if (PointersAre64Bit && !T->getPointeeType()->isFunctionType()) manglePointerExtQualifiers(Qualifiers(), T->getPointeeType().getTypePtr());
Out << 'E';
mangleType(T->getPointeeType(), Range); mangleType(T->getPointeeType(), Range);
} }
...@@ -1785,8 +1790,7 @@ void MicrosoftCXXNameMangler::mangleType(const ObjCObjectPointerType *T, ...@@ -1785,8 +1790,7 @@ void MicrosoftCXXNameMangler::mangleType(const ObjCObjectPointerType *T,
void MicrosoftCXXNameMangler::mangleType(const LValueReferenceType *T, void MicrosoftCXXNameMangler::mangleType(const LValueReferenceType *T,
SourceRange Range) { SourceRange Range) {
Out << 'A'; Out << 'A';
if (PointersAre64Bit && !T->getPointeeType()->isFunctionType()) manglePointerExtQualifiers(Qualifiers(), T->getPointeeType().getTypePtr());
Out << 'E';
mangleType(T->getPointeeType(), Range); mangleType(T->getPointeeType(), Range);
} }
...@@ -1796,8 +1800,7 @@ void MicrosoftCXXNameMangler::mangleType(const LValueReferenceType *T, ...@@ -1796,8 +1800,7 @@ void MicrosoftCXXNameMangler::mangleType(const LValueReferenceType *T,
void MicrosoftCXXNameMangler::mangleType(const RValueReferenceType *T, void MicrosoftCXXNameMangler::mangleType(const RValueReferenceType *T,
SourceRange Range) { SourceRange Range) {
Out << "$$Q"; Out << "$$Q";
if (PointersAre64Bit && !T->getPointeeType()->isFunctionType()) manglePointerExtQualifiers(Qualifiers(), T->getPointeeType().getTypePtr());
Out << 'E';
mangleType(T->getPointeeType(), Range); mangleType(T->getPointeeType(), Range);
} }
......
...@@ -164,6 +164,12 @@ int S::* f8() { return 0; } ...@@ -164,6 +164,12 @@ int S::* f8() { return 0; }
int S::* const f9() { return 0; } int S::* const f9() { return 0; }
// CHECK: "\01?f9@@YAQQS@@HXZ" // CHECK: "\01?f9@@YAQQS@@HXZ"
int S::* __restrict f10() { return 0; }
// CHECK: "\01?f10@@YAPIQS@@HXZ"
int S::* const __restrict f11() { return 0; }
// CHECK: "\01?f11@@YAQIQS@@HXZ"
typedef int (*function_pointer)(int); typedef int (*function_pointer)(int);
function_pointer g1() { return 0; } function_pointer g1() { return 0; }
......
...@@ -95,6 +95,9 @@ extern int * const h1 = &a; ...@@ -95,6 +95,9 @@ extern int * const h1 = &a;
// CHECK-DAG: @"\01?h1@@3QAHA" // CHECK-DAG: @"\01?h1@@3QAHA"
extern const int * const h2 = &a; extern const int * const h2 = &a;
// CHECK-DAG: @"\01?h2@@3QBHB" // CHECK-DAG: @"\01?h2@@3QBHB"
extern int * const __restrict h3 = &a;
// CHECK-DAG: @"\01?h3@@3QIAHIA"
// X64-DAG: @"\01?h3@@3QEIAHEIA"
int i[10][20]; int i[10][20];
// CHECK-DAG: @"\01?i@@3PAY0BE@HA" // CHECK-DAG: @"\01?i@@3PAY0BE@HA"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment