[PATCH] D33398: Mangle __unaligned in Itanium ABI
This revision was automatically updated to reflect the committed changes. Closed by commit rL304523: Mangle __unaligned in Itanium ABI (authored by rogfer01). Changed prior to commit: https://reviews.llvm.org/D33398?vs=100974=101171#toc Repository: rL LLVM https://reviews.llvm.org/D33398 Files: cfe/trunk/lib/AST/ItaniumMangle.cpp cfe/trunk/test/CodeGenCXX/pr33080.cpp cfe/trunk/test/CodeGenCXX/unaligned-member-qualifier.cpp cfe/trunk/test/CodeGenObjCXX/arc-mangle.mm Index: cfe/trunk/test/CodeGenObjCXX/arc-mangle.mm === --- cfe/trunk/test/CodeGenObjCXX/arc-mangle.mm +++ cfe/trunk/test/CodeGenObjCXX/arc-mangle.mm @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -fobjc-arc -fobjc-runtime-has-weak -triple %itanium_abi_triple -emit-llvm -fblocks -o - %s | FileCheck %s +// RUN: %clang_cc1 -DTEST_UNALIGNED -fms-extensions -fobjc-arc -fobjc-runtime-has-weak -triple %itanium_abi_triple -emit-llvm -fblocks -o - %s | FileCheck %s --check-prefix=UNALIGNED // CHECK-LABEL: define {{.*}}void @_Z1fPU8__strongP11objc_object(i8**) void f(__strong id *) {} @@ -32,3 +33,12 @@ // CHECK-LABEL: define weak_odr {{.*}}void @_Z1gIKvEvP10unsigned_cIXplszv1U8__bridgecvPT_v1U8__bridgecvP11objc_objectcvS3_Li0ELi1EEE templatevoid g(unsigned_c*) {} template void g(unsigned_c *); + +#if TEST_UNALIGNED +// UNALIGNED-LABEL: define {{.*}}void @_Z1gPU6__weakU11__unalignedP11objc_object(i8**) +void g(__weak __unaligned id *) {} +// UNALIGNED-LABEL: define {{.*}}void @_Z1gPU11__unalignedU8__strongP11objc_object(i8**) +void g(__strong __unaligned id *) {} +// UNALIGNED-LABEL: define {{.*}}void @_Z1gPU11__unalignedU15__autoreleasingP11objc_object(i8**) +void g(__autoreleasing __unaligned id *) {} +#endif // TEST_UNALIGNED Index: cfe/trunk/test/CodeGenCXX/unaligned-member-qualifier.cpp === --- cfe/trunk/test/CodeGenCXX/unaligned-member-qualifier.cpp +++ cfe/trunk/test/CodeGenCXX/unaligned-member-qualifier.cpp @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -triple %itanium_abi_triple -fms-extensions -emit-llvm %s -o- | FileCheck %s + +struct A { + void foo() __unaligned; + void foo() const __unaligned; + void foo() volatile __unaligned; + void foo() const volatile __unaligned; +}; + +void A::foo() __unaligned {} +// CHECK: define void @_ZNU11__unaligned1A3fooEv( + +void A::foo() const __unaligned {} +// CHECK: define void @_ZNU11__unalignedK1A3fooEv( + +void A::foo() volatile __unaligned {} +// CHECK: define void @_ZNU11__unalignedV1A3fooEv( + +void A::foo() const volatile __unaligned {} +// CHECK: define void @_ZNU11__unalignedVK1A3fooEv( Index: cfe/trunk/test/CodeGenCXX/pr33080.cpp === --- cfe/trunk/test/CodeGenCXX/pr33080.cpp +++ cfe/trunk/test/CodeGenCXX/pr33080.cpp @@ -0,0 +1,33 @@ +// RUN: %clang_cc1 -triple %itanium_abi_triple -fms-extensions -emit-llvm -o- %s | FileCheck %s + +void fa(__unaligned struct A *) {} +// CHECK: define void @_Z2faPU11__unaligned1A( + +void ga(struct A *, struct A *) {} +// CHECK: define void @_Z2gaP1AS0_( + +void gb(__unaligned struct A *, struct A *) {} +// CHECK: define void @_Z2gbPU11__unaligned1APS_( + +void gc(struct A *, __unaligned struct A *) {} +// CHECK: define void @_Z2gcP1APU11__unalignedS_( + +void gd(__unaligned struct A *, __unaligned struct A *) {} +// CHECK: define void @_Z2gdPU11__unaligned1AS1_( + +void hb(__unaligned struct A *, __unaligned const struct A *) {} +// CHECK: define void @_Z2hbPU11__unaligned1APU11__unalignedKS_( + +void ja(__unaligned struct A *, __unaligned struct A *__unaligned *, __unaligned struct A *__unaligned *__unaligned *) {} +// CHECK: define void @_Z2jaPU11__unaligned1APU11__unalignedS1_PU11__unalignedS3_( + +void jb(__unaligned struct A *, __unaligned struct A **, __unaligned struct A *__unaligned *__unaligned *) {} +// CHECK: @_Z2jbPU11__unaligned1APS1_PU11__unalignedPU11__unalignedS1_( + +template +void ta(T &, Q *) {} + +void ia(__unaligned struct A ) { + ta(a, ); +} +// CHECK: @_Z2taIU11__unaligned1AS1_EvRT_PT0_( Index: cfe/trunk/lib/AST/ItaniumMangle.cpp === --- cfe/trunk/lib/AST/ItaniumMangle.cpp +++ cfe/trunk/lib/AST/ItaniumMangle.cpp @@ -1459,8 +1459,6 @@ // We do not consider restrict a distinguishing attribute for overloading // purposes so we must not mangle it. MethodQuals.removeRestrict(); -// __unaligned is not currently mangled in any way, so remove it. -MethodQuals.removeUnaligned(); mangleQualifiers(MethodQuals); mangleRefQualifier(Method->getRefQualifier()); } @@ -2140,7 +2138,8 @@ } void CXXNameMangler::mangleQualifiers(Qualifiers Quals) { - // Vendor qualifiers come first. + // Vendor qualifiers come first and if they are order-insensitive they must + // be emitted in reversed
[PATCH] D33398: Mangle __unaligned in Itanium ABI
rsmith accepted this revision. rsmith added a comment. Looks great, thanks! Comment at: lib/AST/ItaniumMangle.cpp:2210 + if (Quals.hasUnaligned()) + mangleVendorQualifier("__unaligned"); + rogfer01 wrote: > rsmith wrote: > > Too much indentation here. Also, the ABI requires the "unordered" vendor > > qualifiers to be emitted in reverse alphabetical order, so this should be > > emitted after `__weak` and `__strong` but before `__autoreleasing`. > I think you meant after `__weak` but before `__strong` and `__autoreleasing`? > Maybe I'm misinterpreting something here. > > The current patch emits `__weak`, then `__unaligned` and then the remaining > ARC ones. The alphabet is hard, apparently :) Yes, thanks! Comment at: lib/AST/ItaniumMangle.cpp:2184 + // + // Note: we emit first __weak to preserve the order as + // required by the Itanium ABI. first `__weak` -> `__weak` first https://reviews.llvm.org/D33398 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33398: Mangle __unaligned in Itanium ABI
rogfer01 added inline comments. Comment at: lib/AST/ItaniumMangle.cpp:2210 + if (Quals.hasUnaligned()) + mangleVendorQualifier("__unaligned"); + rsmith wrote: > Too much indentation here. Also, the ABI requires the "unordered" vendor > qualifiers to be emitted in reverse alphabetical order, so this should be > emitted after `__weak` and `__strong` but before `__autoreleasing`. I think you meant after `__weak` but before `__strong` and `__autoreleasing`? Maybe I'm misinterpreting something here. The current patch emits `__weak`, then `__unaligned` and then the remaining ARC ones. https://reviews.llvm.org/D33398 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33398: Mangle __unaligned in Itanium ABI
rogfer01 updated this revision to Diff 100974. rogfer01 added a comment. Changelog: - Fix formatting. - Emit `__unaligned` in the right order (as defined by the Itanium ABI) when there are Objective-C++ ARC vendor qualifiers. - New test for `__unaligned` and ARC's `__weak`, `__strong` and `__autorelease` https://reviews.llvm.org/D33398 Files: lib/AST/ItaniumMangle.cpp test/CodeGenCXX/pr33080.cpp test/CodeGenCXX/unaligned-duplicated-mangle-name.cpp test/CodeGenCXX/unaligned-member-qualifier.cpp test/CodeGenObjCXX/arc-mangle.mm Index: test/CodeGenObjCXX/arc-mangle.mm === --- test/CodeGenObjCXX/arc-mangle.mm +++ test/CodeGenObjCXX/arc-mangle.mm @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -fobjc-arc -fobjc-runtime-has-weak -triple %itanium_abi_triple -emit-llvm -fblocks -o - %s | FileCheck %s +// RUN: %clang_cc1 -DTEST_UNALIGNED -fms-extensions -fobjc-arc -fobjc-runtime-has-weak -triple %itanium_abi_triple -emit-llvm -fblocks -o - %s | FileCheck %s --check-prefix=UNALIGNED // CHECK-LABEL: define {{.*}}void @_Z1fPU8__strongP11objc_object(i8**) void f(__strong id *) {} @@ -32,3 +33,12 @@ // CHECK-LABEL: define weak_odr {{.*}}void @_Z1gIKvEvP10unsigned_cIXplszv1U8__bridgecvPT_v1U8__bridgecvP11objc_objectcvS3_Li0ELi1EEE templatevoid g(unsigned_c*) {} template void g(unsigned_c *); + +#if TEST_UNALIGNED +// UNALIGNED-LABEL: define {{.*}}void @_Z1gPU6__weakU11__unalignedP11objc_object(i8**) +void g(__weak __unaligned id *) {} +// UNALIGNED-LABEL: define {{.*}}void @_Z1gPU11__unalignedU8__strongP11objc_object(i8**) +void g(__strong __unaligned id *) {} +// UNALIGNED-LABEL: define {{.*}}void @_Z1gPU11__unalignedU15__autoreleasingP11objc_object(i8**) +void g(__autoreleasing __unaligned id *) {} +#endif // TEST_UNALIGNED Index: test/CodeGenCXX/unaligned-member-qualifier.cpp === --- /dev/null +++ test/CodeGenCXX/unaligned-member-qualifier.cpp @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -triple %itanium_abi_triple -fms-extensions -emit-llvm %s -o- | FileCheck %s + +struct A { + void foo() __unaligned; + void foo() const __unaligned; + void foo() volatile __unaligned; + void foo() const volatile __unaligned; +}; + +void A::foo() __unaligned {} +// CHECK: define void @_ZNU11__unaligned1A3fooEv( + +void A::foo() const __unaligned {} +// CHECK: define void @_ZNU11__unalignedK1A3fooEv( + +void A::foo() volatile __unaligned {} +// CHECK: define void @_ZNU11__unalignedV1A3fooEv( + +void A::foo() const volatile __unaligned {} +// CHECK: define void @_ZNU11__unalignedVK1A3fooEv( Index: test/CodeGenCXX/unaligned-duplicated-mangle-name.cpp === --- test/CodeGenCXX/unaligned-duplicated-mangle-name.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// RUN: %clang_cc1 -triple %itanium_abi_triple -fms-extensions -emit-llvm-only %s -verify - -struct A -{ -int x; -void foo() __unaligned; -void foo(); -}; - -void A::foo() __unaligned -{ -this->x++; -} - -void A::foo() // expected-error {{definition with same mangled name as another definition}} - // expected-note@-6 {{previous definition is here}} -{ -this->x++; -} - Index: test/CodeGenCXX/pr33080.cpp === --- /dev/null +++ test/CodeGenCXX/pr33080.cpp @@ -0,0 +1,33 @@ +// RUN: %clang_cc1 -triple %itanium_abi_triple -fms-extensions -emit-llvm -o- %s | FileCheck %s + +void fa(__unaligned struct A *) {} +// CHECK: define void @_Z2faPU11__unaligned1A( + +void ga(struct A *, struct A *) {} +// CHECK: define void @_Z2gaP1AS0_( + +void gb(__unaligned struct A *, struct A *) {} +// CHECK: define void @_Z2gbPU11__unaligned1APS_( + +void gc(struct A *, __unaligned struct A *) {} +// CHECK: define void @_Z2gcP1APU11__unalignedS_( + +void gd(__unaligned struct A *, __unaligned struct A *) {} +// CHECK: define void @_Z2gdPU11__unaligned1AS1_( + +void hb(__unaligned struct A *, __unaligned const struct A *) {} +// CHECK: define void @_Z2hbPU11__unaligned1APU11__unalignedKS_( + +void ja(__unaligned struct A *, __unaligned struct A *__unaligned *, __unaligned struct A *__unaligned *__unaligned *) {} +// CHECK: define void @_Z2jaPU11__unaligned1APU11__unalignedS1_PU11__unalignedS3_( + +void jb(__unaligned struct A *, __unaligned struct A **, __unaligned struct A *__unaligned *__unaligned *) {} +// CHECK: @_Z2jbPU11__unaligned1APS1_PU11__unalignedPU11__unalignedS1_( + +template +void ta(T &, Q *) {} + +void ia(__unaligned struct A ) { + ta(a, ); +} +// CHECK: @_Z2taIU11__unaligned1AS1_EvRT_PT0_( Index: lib/AST/ItaniumMangle.cpp === --- lib/AST/ItaniumMangle.cpp +++ lib/AST/ItaniumMangle.cpp @@ -1459,8 +1459,6 @@ // We do not consider restrict a distinguishing attribute for overloading //
[PATCH] D33398: Mangle __unaligned in Itanium ABI
rsmith added a comment. In https://reviews.llvm.org/D33398#769152, @rnk wrote: > Isn't there a space in the mangling for vendor extensions? Can we use that > here? We are using that here: that's what `mangleVendorQualifier` does. Comment at: lib/AST/ItaniumMangle.cpp:2210 + if (Quals.hasUnaligned()) + mangleVendorQualifier("__unaligned"); + Too much indentation here. Also, the ABI requires the "unordered" vendor qualifiers to be emitted in reverse alphabetical order, so this should be emitted after `__weak` and `__strong` but before `__autoreleasing`. https://reviews.llvm.org/D33398 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33398: Mangle __unaligned in Itanium ABI
rnk added a comment. This was filed as https://bugs.llvm.org/show_bug.cgi?id=33178 Isn't there a space in the mangling for vendor extensions? Can we use that here? https://reviews.llvm.org/D33398 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33398: Mangle __unaligned in Itanium ABI
rogfer01 updated this revision to Diff 100868. rogfer01 added a comment. Fix formatting of tests. Thanks for the review @aaron.ballman ! https://reviews.llvm.org/D33398 Files: lib/AST/ItaniumMangle.cpp test/CodeGenCXX/pr33080.cpp test/CodeGenCXX/unaligned-duplicated-mangle-name.cpp test/CodeGenCXX/unaligned-member-qualifier.cpp Index: test/CodeGenCXX/unaligned-member-qualifier.cpp === --- /dev/null +++ test/CodeGenCXX/unaligned-member-qualifier.cpp @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -triple %itanium_abi_triple -fms-extensions -emit-llvm %s -o- | FileCheck %s + +struct A { + void foo() __unaligned; + void foo() const __unaligned; + void foo() volatile __unaligned; + void foo() const volatile __unaligned; +}; + +void A::foo() __unaligned {} +// CHECK: define void @_ZNU11__unaligned1A3fooEv( + +void A::foo() const __unaligned {} +// CHECK: define void @_ZNU11__unalignedK1A3fooEv( + +void A::foo() volatile __unaligned {} +// CHECK: define void @_ZNU11__unalignedV1A3fooEv( + +void A::foo() const volatile __unaligned {} +// CHECK: define void @_ZNU11__unalignedVK1A3fooEv( Index: test/CodeGenCXX/unaligned-duplicated-mangle-name.cpp === --- test/CodeGenCXX/unaligned-duplicated-mangle-name.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// RUN: %clang_cc1 -triple %itanium_abi_triple -fms-extensions -emit-llvm-only %s -verify - -struct A -{ -int x; -void foo() __unaligned; -void foo(); -}; - -void A::foo() __unaligned -{ -this->x++; -} - -void A::foo() // expected-error {{definition with same mangled name as another definition}} - // expected-note@-6 {{previous definition is here}} -{ -this->x++; -} - Index: test/CodeGenCXX/pr33080.cpp === --- /dev/null +++ test/CodeGenCXX/pr33080.cpp @@ -0,0 +1,33 @@ +// RUN: %clang_cc1 -triple %itanium_abi_triple -fms-extensions -emit-llvm -o- %s | FileCheck %s + +void fa(__unaligned struct A *) {} +// CHECK: define void @_Z2faPU11__unaligned1A( + +void ga(struct A *, struct A *) {} +// CHECK: define void @_Z2gaP1AS0_( + +void gb(__unaligned struct A *, struct A *) {} +// CHECK: define void @_Z2gbPU11__unaligned1APS_( + +void gc(struct A *, __unaligned struct A *) {} +// CHECK: define void @_Z2gcP1APU11__unalignedS_( + +void gd(__unaligned struct A *, __unaligned struct A *) {} +// CHECK: define void @_Z2gdPU11__unaligned1AS1_( + +void hb(__unaligned struct A *, __unaligned const struct A *) {} +// CHECK: define void @_Z2hbPU11__unaligned1APU11__unalignedKS_( + +void ja(__unaligned struct A *, __unaligned struct A *__unaligned *, __unaligned struct A *__unaligned *__unaligned *) {} +// CHECK: define void @_Z2jaPU11__unaligned1APU11__unalignedS1_PU11__unalignedS3_( + +void jb(__unaligned struct A *, __unaligned struct A **, __unaligned struct A *__unaligned *__unaligned *) {} +// CHECK: @_Z2jbPU11__unaligned1APS1_PU11__unalignedPU11__unalignedS1_( + +template +void ta(T &, Q *) {} + +void ia(__unaligned struct A ) { + ta(a, ); +} +// CHECK: @_Z2taIU11__unaligned1AS1_EvRT_PT0_( Index: lib/AST/ItaniumMangle.cpp === --- lib/AST/ItaniumMangle.cpp +++ lib/AST/ItaniumMangle.cpp @@ -1459,8 +1459,6 @@ // We do not consider restrict a distinguishing attribute for overloading // purposes so we must not mangle it. MethodQuals.removeRestrict(); -// __unaligned is not currently mangled in any way, so remove it. -MethodQuals.removeUnaligned(); mangleQualifiers(MethodQuals); mangleRefQualifier(Method->getRefQualifier()); } @@ -2208,6 +2206,9 @@ break; } + if (Quals.hasUnaligned()) + mangleVendorQualifier("__unaligned"); + // ::= [r] [V] [K]# restrict (C99), volatile, const if (Quals.hasRestrict()) Out << 'r'; @@ -4327,7 +4328,7 @@ /// substitutions. static bool hasMangledSubstitutionQualifiers(QualType T) { Qualifiers Qs = T.getQualifiers(); - return Qs.getCVRQualifiers() || Qs.hasAddressSpace(); + return Qs.getCVRQualifiers() || Qs.hasAddressSpace() || Qs.hasUnaligned(); } bool CXXNameMangler::mangleSubstitution(QualType T) { ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33398: Mangle __unaligned in Itanium ABI
aaron.ballman accepted this revision. aaron.ballman added a comment. This revision is now accepted and ready to land. Can you run clang-format over both the test files? Aside from that, looks good to me, but you should wait for @rsmith or @majnemer to sign off before committing. https://reviews.llvm.org/D33398 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33398: Mangle __unaligned in Itanium ABI
rogfer01 updated this revision to Diff 100670. rogfer01 added a comment. Thanks @aaron.ballman for the review. I have extended the test with your suggestions. https://reviews.llvm.org/D33398 Files: lib/AST/ItaniumMangle.cpp test/CodeGenCXX/pr33080.cpp test/CodeGenCXX/unaligned-duplicated-mangle-name.cpp test/CodeGenCXX/unaligned-member-qualifier.cpp Index: test/CodeGenCXX/unaligned-member-qualifier.cpp === --- /dev/null +++ test/CodeGenCXX/unaligned-member-qualifier.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -triple %itanium_abi_triple -fms-extensions -emit-llvm %s -o- | FileCheck %s + +struct A +{ +void foo() __unaligned; +void foo() const __unaligned; +void foo() volatile __unaligned; +void foo() const volatile __unaligned; +}; + +void A::foo() __unaligned { } +// CHECK: define void @_ZNU11__unaligned1A3fooEv( + +void A::foo() const __unaligned { } +// CHECK: define void @_ZNU11__unalignedK1A3fooEv( + +void A::foo() volatile __unaligned { } +// CHECK: define void @_ZNU11__unalignedV1A3fooEv( + +void A::foo() const volatile __unaligned { } +// CHECK: define void @_ZNU11__unalignedVK1A3fooEv( Index: test/CodeGenCXX/unaligned-duplicated-mangle-name.cpp === --- test/CodeGenCXX/unaligned-duplicated-mangle-name.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// RUN: %clang_cc1 -triple %itanium_abi_triple -fms-extensions -emit-llvm-only %s -verify - -struct A -{ -int x; -void foo() __unaligned; -void foo(); -}; - -void A::foo() __unaligned -{ -this->x++; -} - -void A::foo() // expected-error {{definition with same mangled name as another definition}} - // expected-note@-6 {{previous definition is here}} -{ -this->x++; -} - Index: test/CodeGenCXX/pr33080.cpp === --- /dev/null +++ test/CodeGenCXX/pr33080.cpp @@ -0,0 +1,35 @@ +// RUN: %clang_cc1 -triple %itanium_abi_triple -fms-extensions -emit-llvm -o- %s | FileCheck %s + +void fa(__unaligned struct A*) {} +// CHECK: define void @_Z2faPU11__unaligned1A( + +void ga(struct A*, struct A*) {} +// CHECK: define void @_Z2gaP1AS0_( + +void gb(__unaligned struct A*, struct A*) {} +// CHECK: define void @_Z2gbPU11__unaligned1APS_( + +void gc(struct A*, __unaligned struct A*) {} +// CHECK: define void @_Z2gcP1APU11__unalignedS_( + +void gd(__unaligned struct A*, __unaligned struct A*) {} +// CHECK: define void @_Z2gdPU11__unaligned1AS1_( + +void hb(__unaligned struct A*, __unaligned const struct A*) {} +// CHECK: define void @_Z2hbPU11__unaligned1APU11__unalignedKS_( + +void ja(__unaligned struct A *, __unaligned struct A *__unaligned *, __unaligned struct A *__unaligned *__unaligned *) {} +// CHECK: define void @_Z2jaPU11__unaligned1APU11__unalignedS1_PU11__unalignedS3_( + +void jb(__unaligned struct A *, __unaligned struct A * *, __unaligned struct A *__unaligned *__unaligned *) {} +// CHECK: @_Z2jbPU11__unaligned1APS1_PU11__unalignedPU11__unalignedS1_( + + +template +void ta(T&, Q*) { } + +void ia(__unaligned struct A ) { + ta(a, ); +} + +// CHECK: @_Z2taIU11__unaligned1AS1_EvRT_PT0_( Index: lib/AST/ItaniumMangle.cpp === --- lib/AST/ItaniumMangle.cpp +++ lib/AST/ItaniumMangle.cpp @@ -1459,8 +1459,6 @@ // We do not consider restrict a distinguishing attribute for overloading // purposes so we must not mangle it. MethodQuals.removeRestrict(); -// __unaligned is not currently mangled in any way, so remove it. -MethodQuals.removeUnaligned(); mangleQualifiers(MethodQuals); mangleRefQualifier(Method->getRefQualifier()); } @@ -2208,6 +2206,9 @@ break; } + if (Quals.hasUnaligned()) + mangleVendorQualifier("__unaligned"); + // ::= [r] [V] [K]# restrict (C99), volatile, const if (Quals.hasRestrict()) Out << 'r'; @@ -4327,7 +4328,7 @@ /// substitutions. static bool hasMangledSubstitutionQualifiers(QualType T) { Qualifiers Qs = T.getQualifiers(); - return Qs.getCVRQualifiers() || Qs.hasAddressSpace(); + return Qs.getCVRQualifiers() || Qs.hasAddressSpace() || Qs.hasUnaligned(); } bool CXXNameMangler::mangleSubstitution(QualType T) { ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D33398: Mangle __unaligned in Itanium ABI
aaron.ballman added inline comments. Comment at: test/CodeGenCXX/pr33080.cpp:19 +void hb(__unaligned struct A*, __unaligned const struct A*) {} +// CHECK: define void @_Z2hbPU11__unaligned1APU11__unalignedKS_( Can we also get a test like `struct A * __unaligned * __unaligned *`? Also, perhaps a test case involving templates would be good. https://reviews.llvm.org/D33398 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits