<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 6, 2015 at 5:49 PM, Adrian Prantl <span dir="ltr"><<a href="mailto:aprantl@apple.com" target="_blank">aprantl@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: adrian<br>
Date: Mon Jul  6 19:49:35 2015<br>
New Revision: 241534<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D241534-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=RJ08ULHMNS7hq8rVkU-Er72968TieUx89DE8c1QXLak&s=KEAUkiHVcIDPBPcHN4W9fjis70V-h9GYneKvXZ9o2Zo&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=241534&view=rev</a><br>
Log:<br>
Debug info: Emit distinct __block_literal_generic types for blocks with<br>
different function signatures. (Previously clang would emit all block<br>
pointer types with the type of the first block pointer in the compile<br>
unit.)<br>
<br>
rdar://problem/21602473<br>
<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br>
    cfe/trunk/lib/CodeGen/CGDebugInfo.h<br>
    cfe/trunk/test/CodeGen/debug-info-block.c<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGDebugInfo.cpp-3Frev-3D241534-26r1-3D241533-26r2-3D241534-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=RJ08ULHMNS7hq8rVkU-Er72968TieUx89DE8c1QXLak&s=E0cWEVW2Tp485In_dG4_rNCPJ9d93qK1IRinKiM_GL0&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=241534&r1=241533&r2=241534&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon Jul  6 19:49:35 2015<br>
@@ -705,9 +705,6 @@ llvm::DIType *CGDebugInfo::getOrCreateSt<br>
<br>
 llvm::DIType *CGDebugInfo::CreateType(const BlockPointerType *Ty,<br>
                                       llvm::DIFile *Unit) {<br>
-  if (BlockLiteralGeneric)<br>
-    return BlockLiteralGeneric;<br>
-<br>
   SmallVector<llvm::Metadata *, 8> EltTys;<br>
   QualType FType;<br>
   uint64_t FieldSize, FieldOffset;<br>
@@ -753,12 +750,15 @@ llvm::DIType *CGDebugInfo::CreateType(co<br>
   FieldOffset += FieldSize;<br>
   Elements = DBuilder.getOrCreateArray(EltTys);<br>
<br>
+  // The __block_literal_generic structs are marked with a special<br>
+  // DW_AT_APPLE_BLOCK attribute and are an implementation detail only<br>
+  // the debugger needs to know about. To allow type uniquing, emit<br>
+  // them without a name or a location.<br>
   EltTy =<br>
-      DBuilder.createStructType(Unit, "__block_literal_generic", nullptr, LineNo,<br>
+      DBuilder.createStructType(Unit, "", nullptr, LineNo,<br>
                                 FieldOffset, 0, Flags, nullptr, Elements);<br>
<br>
-  BlockLiteralGeneric = DBuilder.createPointerType(EltTy, Size);<br>
-  return BlockLiteralGeneric;<br>
+  return DBuilder.createPointerType(EltTy, Size);<br></blockquote><div><br></div><div>What about two of the same? I assume that hits the type cache long before this & doesn't produce duplicate type metadata?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
 }<br>
<br>
 llvm::DIType *CGDebugInfo::CreateType(const TemplateSpecializationType *Ty,<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGDebugInfo.h-3Frev-3D241534-26r1-3D241533-26r2-3D241534-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=RJ08ULHMNS7hq8rVkU-Er72968TieUx89DE8c1QXLak&s=9c6SBzetn6esLhvyrBxdAKKh_n2ZDtO1Exii6x4Ogmw&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=241534&r1=241533&r2=241534&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original)<br>
+++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Mon Jul  6 19:49:35 2015<br>
@@ -65,7 +65,6 @@ class CGDebugInfo {<br>
   llvm::DIType *OCLImage2dArrayDITy = nullptr;<br>
   llvm::DIType *OCLImage3dDITy = nullptr;<br>
   llvm::DIType *OCLEventDITy = nullptr;<br>
-  llvm::DIType *BlockLiteralGeneric = nullptr;<br>
<br>
   /// \brief Cache of previously constructed Types.<br>
   llvm::DenseMap<const void *, llvm::TrackingMDRef> TypeCache;<br>
<br>
Modified: cfe/trunk/test/CodeGen/debug-info-block.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_CodeGen_debug-2Dinfo-2Dblock.c-3Frev-3D241534-26r1-3D241533-26r2-3D241534-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=RJ08ULHMNS7hq8rVkU-Er72968TieUx89DE8c1QXLak&s=m4DPbrTpu_kEHpytQrB9I1J-vAFuqAeWyI1j-eWAKYI&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-info-block.c?rev=241534&r1=241533&r2=241534&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/debug-info-block.c (original)<br>
+++ cfe/trunk/test/CodeGen/debug-info-block.c Mon Jul  6 19:49:35 2015<br>
@@ -2,11 +2,28 @@<br>
 // Verify that the desired debugging type is generated for a structure<br>
 // member that is a pointer to a block.<br>
<br>
-// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "__block_literal_generic"<br>
-// CHECK-NOT: line<br>
+// CHECK: !DICompositeType(tag: DW_TAG_structure_type, scope<br>
+// CHECK-NOT:              line<br>
+// CHECK-SAME:             elements: ![[ELEMS1:.*]])<br>
+// CHECK: ![[ELEMS1]] = {{.*, .*, .*,}} ![[FPEL1:.*]], {{.*}}<br>
+// CHECK: ![[INT:.*]] = !DIBasicType(name: "int"<br>
+// CHECK: ![[FPEL1]] = {{.*}}"__FuncPtr", {{.*}}, baseType: ![[FPTY1:[0-9]+]]<br>
+// CHECK: ![[FPTY1]] = {{.*}}baseType: ![[FNTY1:[0-9]+]]<br>
+// CHECK: ![[FNTY1]] = !DISubroutineType(types: ![[VOIDVOID:[0-9]+]])<br>
+// CHECK: ![[VOIDVOID]] = !{null, null}<br>
 // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "__block_descriptor"<br>
-// CHECK-NOT: line<br>
+// CHECK-NOT:              line<br>
+// CHECK-SAME:            )<br>
+<br>
+// CHECK: !DICompositeType(tag: DW_TAG_structure_type, scope<br>
+// CHECK-NOT:              line<br>
+// CHECK-SAME:             elements: ![[ELEMS2:.*]])<br>
+// CHECK: ![[ELEMS2]] = {{.*,.*,.*}}, ![[FPEL2:.*]], {{.*}}<br>
+// CHECK: ![[FPEL2]] = {{.*}}"__FuncPtr", {{.*}}, baseType: ![[FPTY2:[0-9]+]]<br>
+// CHECK: ![[FPTY2]] = {{.*}}baseType: ![[FNTY2:[0-9]+]]<br>
+// CHECK: ![[FNTY2]] = !DISubroutineType(types: ![[INTINT:[0-9]+]])<br>
+// CHECK: ![[INTINT]] = !{![[INT]], ![[INT]]}<br>
 struct inStruct {<br>
-  void (^genericBlockPtr)();<br>
+  void (^voidBlockPtr)();<br>
+  int (^intBlockPtr)(int);<br>
 } is;<br>
-<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>