compnerd created this revision.
compnerd added a reviewer: rjmccall.
Herald added a subscriber: cfe-commits.

Add support for Objective C lifetime qualifiers in MS ABI.  Because
there is no formal way to add a custom extension on a pointer qualifier,
re-use C++/CX (which is deprecated) and C++/CLI manglings to provide a
decoration.

We map the lifetimes as the following:

- none/explicitly none (__unsafe_unretained) as having no extended qualifier
- strong (__strong) as having cli::pin_ptr<T>
- weak (__weak) as a C++/CX tracking ref
- autorealeasing (__autoreleasing) as having a C++/CX ref

One side effect of this change is that the decoration of normal
functions is altered with the implicit lifetime qualifier (__strong)
where it is not needed since functions cannot be overloaded on just the
lifetime qualifier.


Repository:
  rC Clang

https://reviews.llvm.org/D42614

Files:
  lib/AST/MicrosoftMangle.cpp
  test/CodeGenObjCXX/microsoft-abi-arc-param-order.mm
  test/CodeGenObjCXX/msabi-objc-lifetimes.mm


Index: test/CodeGenObjCXX/msabi-objc-lifetimes.mm
===================================================================
--- /dev/null
+++ test/CodeGenObjCXX/msabi-objc-lifetimes.mm
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -triple thumbv7-windows-msvc -fobjc-arc 
-fobjc-runtime=ios-6.0 -o - -emit-llvm %s | FileCheck %s
+
+template <typename T>
+struct S {};
+
+void f(S<__unsafe_unretained id>) {}
+// CHECK-LABEL: "\01?f@@YAXU?$S@PAUobjc_object@@@@@Z"
+
+void f(S<__autoreleasing id>) {}
+// CHECK-LABEL: "\01?f@@YAXU?$S@P$AAUobjc_object@@@@@Z"
+
+void f(S<__strong id>) {}
+// CHECK-LABEL: "\01?f@@YAXU?$S@P$BAUobjc_object@@@@@Z"
+
+void f(S<__weak id>) {}
+// CHECK-LABEL: "\01?f@@YAXU?$S@P$CAUobjc_object@@@@@Z"
+
Index: test/CodeGenObjCXX/microsoft-abi-arc-param-order.mm
===================================================================
--- test/CodeGenObjCXX/microsoft-abi-arc-param-order.mm
+++ test/CodeGenObjCXX/microsoft-abi-arc-param-order.mm
@@ -9,9 +9,9 @@

 // Verify that we destruct things from left to right in the MS C++ ABI: a, b, 
c, d.
 //
-// CHECK-LABEL: define void @"\01?test_arc_order@@YAXUA@@PAUobjc_object@@01@Z"
+// CHECK-LABEL: define void 
@"\01?test_arc_order@@YAXUA@@P$BAUobjc_object@@01@Z"
 // CHECK:                       (<{ %struct.A, i8*, %struct.A, i8* }>* 
inalloca)
-void test_arc_order(A a, id __attribute__((ns_consumed)) b , A c, id 
__attribute__((ns_consumed)) d) {
+void test_arc_order(A a, id __attribute__((__ns_consumed__)) b, A c, id 
__attribute__((__ns_consumed__)) d) {
   // CHECK: call x86_thiscallcc void @"\01??1A@@QAE@XZ"(%struct.A* %{{.*}})
   // CHECK: call void @objc_storeStrong(i8** %{{.*}}, i8* null)
   // CHECK: call x86_thiscallcc void @"\01??1A@@QAE@XZ"(%struct.A* %{{.*}})
Index: lib/AST/MicrosoftMangle.cpp
===================================================================
--- lib/AST/MicrosoftMangle.cpp
+++ lib/AST/MicrosoftMangle.cpp
@@ -1569,6 +1569,21 @@
   if (Quals.hasUnaligned() ||
       (!PointeeType.isNull() && 
PointeeType.getLocalQualifiers().hasUnaligned()))
     Out << 'F';
+
+  switch (Quals.getObjCLifetime()) {
+  case Qualifiers::OCL_None:
+  case Qualifiers::OCL_ExplicitNone:
+    break;
+  case Qualifiers::OCL_Autoreleasing:
+    Out << "$A";  // C++/CX Ref Parameter
+    break;
+  case Qualifiers::OCL_Strong:
+    Out << "$B";  // C++/CLI cli::pin_ptr<T>
+    break;
+  case Qualifiers::OCL_Weak:
+    Out << "$C";  // C++/CX Tracking Ref Parameter
+    break;
+  }
 }

 void MicrosoftCXXNameMangler::manglePointerCVQualifiers(Qualifiers Quals) {


Index: test/CodeGenObjCXX/msabi-objc-lifetimes.mm
===================================================================
--- /dev/null
+++ test/CodeGenObjCXX/msabi-objc-lifetimes.mm
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -triple thumbv7-windows-msvc -fobjc-arc -fobjc-runtime=ios-6.0 -o - -emit-llvm %s | FileCheck %s
+
+template <typename T>
+struct S {};
+
+void f(S<__unsafe_unretained id>) {}
+// CHECK-LABEL: "\01?f@@YAXU?$S@PAUobjc_object@@@@@Z"
+
+void f(S<__autoreleasing id>) {}
+// CHECK-LABEL: "\01?f@@YAXU?$S@P$AAUobjc_object@@@@@Z"
+
+void f(S<__strong id>) {}
+// CHECK-LABEL: "\01?f@@YAXU?$S@P$BAUobjc_object@@@@@Z"
+
+void f(S<__weak id>) {}
+// CHECK-LABEL: "\01?f@@YAXU?$S@P$CAUobjc_object@@@@@Z"
+
Index: test/CodeGenObjCXX/microsoft-abi-arc-param-order.mm
===================================================================
--- test/CodeGenObjCXX/microsoft-abi-arc-param-order.mm
+++ test/CodeGenObjCXX/microsoft-abi-arc-param-order.mm
@@ -9,9 +9,9 @@

 // Verify that we destruct things from left to right in the MS C++ ABI: a, b, c, d.
 //
-// CHECK-LABEL: define void @"\01?test_arc_order@@YAXUA@@PAUobjc_object@@01@Z"
+// CHECK-LABEL: define void @"\01?test_arc_order@@YAXUA@@P$BAUobjc_object@@01@Z"
 // CHECK:                       (<{ %struct.A, i8*, %struct.A, i8* }>* inalloca)
-void test_arc_order(A a, id __attribute__((ns_consumed)) b , A c, id __attribute__((ns_consumed)) d) {
+void test_arc_order(A a, id __attribute__((__ns_consumed__)) b, A c, id __attribute__((__ns_consumed__)) d) {
   // CHECK: call x86_thiscallcc void @"\01??1A@@QAE@XZ"(%struct.A* %{{.*}})
   // CHECK: call void @objc_storeStrong(i8** %{{.*}}, i8* null)
   // CHECK: call x86_thiscallcc void @"\01??1A@@QAE@XZ"(%struct.A* %{{.*}})
Index: lib/AST/MicrosoftMangle.cpp
===================================================================
--- lib/AST/MicrosoftMangle.cpp
+++ lib/AST/MicrosoftMangle.cpp
@@ -1569,6 +1569,21 @@
   if (Quals.hasUnaligned() ||
       (!PointeeType.isNull() && PointeeType.getLocalQualifiers().hasUnaligned()))
     Out << 'F';
+
+  switch (Quals.getObjCLifetime()) {
+  case Qualifiers::OCL_None:
+  case Qualifiers::OCL_ExplicitNone:
+    break;
+  case Qualifiers::OCL_Autoreleasing:
+    Out << "$A";  // C++/CX Ref Parameter
+    break;
+  case Qualifiers::OCL_Strong:
+    Out << "$B";  // C++/CLI cli::pin_ptr<T>
+    break;
+  case Qualifiers::OCL_Weak:
+    Out << "$C";  // C++/CX Tracking Ref Parameter
+    break;
+  }
 }

 void MicrosoftCXXNameMangler::manglePointerCVQualifiers(Qualifiers Quals) {
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to