[PATCH] D33398: Mangle __unaligned in Itanium ABI

2017-06-02 Thread Roger Ferrer Ibanez via Phabricator via cfe-commits
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

2017-06-01 Thread Richard Smith - zygoloid via Phabricator via cfe-commits
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

2017-06-01 Thread Roger Ferrer Ibanez via Phabricator via cfe-commits
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

2017-06-01 Thread Roger Ferrer Ibanez via Phabricator via cfe-commits
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

2017-05-31 Thread Richard Smith - zygoloid via Phabricator via cfe-commits
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

2017-05-31 Thread Reid Kleckner via Phabricator via cfe-commits
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

2017-05-31 Thread Roger Ferrer Ibanez via Phabricator via cfe-commits
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

2017-05-30 Thread Aaron Ballman via Phabricator via cfe-commits
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

2017-05-30 Thread Roger Ferrer Ibanez via Phabricator via cfe-commits
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

2017-05-23 Thread Aaron Ballman via Phabricator via cfe-commits
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