<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jul 13, 2015, at 1:10 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com" class="">dblaikie@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><br class="Apple-interchange-newline"><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 14px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="gmail_quote" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 14px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;">On Mon, Jul 6, 2015 at 5:49 PM, Adrian Prantl<span class="Apple-converted-space"> </span><span dir="ltr" class=""><<a href="mailto:aprantl@apple.com" target="_blank" class="">aprantl@apple.com</a>></span><span class="Apple-converted-space"> </span>wrote:<br class=""><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;">Author: adrian<br class="">Date: Mon Jul  6 19:49:35 2015<br class="">New Revision: 241534<br class=""><br class="">URL:<span class="Apple-converted-space"> </span><a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D241534-26view-3Drev&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=SkezPixS9ks6lFCMOuYVxy4bgVjv853e-bKbiit3Z6I&s=4jcbCOogVBSY13mZin78UQCr2V2Yh_yjf7lSV8VqNr8&e=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=241534&view=rev</a><br class="">Log:<br class="">Debug info: Emit distinct __block_literal_generic types for blocks with<br class="">different function signatures. (Previously clang would emit all block<br class="">pointer types with the type of the first block pointer in the compile<br class="">unit.)<br class=""><br class=""><a href="rdar://problem/21602473" class="">rdar://problem/21602473</a><br class=""><br class="">Modified:<br class="">   <span class="Apple-converted-space"> </span>cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br class="">   <span class="Apple-converted-space"> </span>cfe/trunk/lib/CodeGen/CGDebugInfo.h<br class="">   <span class="Apple-converted-space"> </span>cfe/trunk/test/CodeGen/debug-info-block.c<br class=""><br class="">Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br class="">URL:<span class="Apple-converted-space"> </span><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=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=SkezPixS9ks6lFCMOuYVxy4bgVjv853e-bKbiit3Z6I&s=LNXK5VCvUpIcKoh8x1pg81LQBbDLC87pcJzMJO7e448&e=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=241534&r1=241533&r2=241534&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)<br class="">+++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon Jul  6 19:49:35 2015<br class="">@@ -705,9 +705,6 @@ llvm::DIType *CGDebugInfo::getOrCreateSt<br class=""><br class=""> llvm::DIType *CGDebugInfo::CreateType(const BlockPointerType *Ty,<br class="">                                       llvm::DIFile *Unit) {<br class="">-  if (BlockLiteralGeneric)<br class="">-    return BlockLiteralGeneric;<br class="">-<br class="">   SmallVector<llvm::Metadata *, 8> EltTys;<br class="">   QualType FType;<br class="">   uint64_t FieldSize, FieldOffset;<br class="">@@ -753,12 +750,15 @@ llvm::DIType *CGDebugInfo::CreateType(co<br class="">   FieldOffset += FieldSize;<br class="">   Elements = DBuilder.getOrCreateArray(EltTys);<br class=""><br class="">+  // The __block_literal_generic structs are marked with a special<br class="">+  // DW_AT_APPLE_BLOCK attribute and are an implementation detail only<br class="">+  // the debugger needs to know about. To allow type uniquing, emit<br class="">+  // them without a name or a location.<br class="">   EltTy =<br class="">-      DBuilder.createStructType(Unit, "__block_literal_generic", nullptr, LineNo,<br class="">+      DBuilder.createStructType(Unit, "", nullptr, LineNo,<br class="">                                 FieldOffset, 0, Flags, nullptr, Elements);<br class=""><br class="">-  BlockLiteralGeneric = DBuilder.createPointerType(EltTy, Size);<br class="">-  return BlockLiteralGeneric;<br class="">+  return DBuilder.createPointerType(EltTy, Size);<br class=""></blockquote><div class=""><br class=""></div><div class="">What about two of the same? I assume that hits the type cache long before this & doesn't produce duplicate type metadata?</div><div class=""> </div></div></div></blockquote><div><br class=""></div><div>Yes, to get to this point the it needs to have been through the getOrCreateType caching mechanism before.</div><div><br class=""></div><div>-- adrian</div><br class=""><blockquote type="cite" class=""><div class=""><div class="gmail_quote" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 14px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;"> }<br class=""><br class=""> llvm::DIType *CGDebugInfo::CreateType(const TemplateSpecializationType *Ty,<br class=""><br class="">Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h<br class="">URL:<span class="Apple-converted-space"> </span><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=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=SkezPixS9ks6lFCMOuYVxy4bgVjv853e-bKbiit3Z6I&s=_3sB4BlU3bipNzPOaQXCBeYT3p8BVHAJLNeDU5L-oKg&e=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=241534&r1=241533&r2=241534&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original)<br class="">+++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Mon Jul  6 19:49:35 2015<br class="">@@ -65,7 +65,6 @@ class CGDebugInfo {<br class="">   llvm::DIType *OCLImage2dArrayDITy = nullptr;<br class="">   llvm::DIType *OCLImage3dDITy = nullptr;<br class="">   llvm::DIType *OCLEventDITy = nullptr;<br class="">-  llvm::DIType *BlockLiteralGeneric = nullptr;<br class=""><br class="">   /// \brief Cache of previously constructed Types.<br class="">   llvm::DenseMap<const void *, llvm::TrackingMDRef> TypeCache;<br class=""><br class="">Modified: cfe/trunk/test/CodeGen/debug-info-block.c<br class="">URL:<span class="Apple-converted-space"> </span><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=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=SkezPixS9ks6lFCMOuYVxy4bgVjv853e-bKbiit3Z6I&s=IvU5Rxzwfm6vV4s88KJXSpL3gCiU9Yxxcvcw9YaLK2I&e=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-info-block.c?rev=241534&r1=241533&r2=241534&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/test/CodeGen/debug-info-block.c (original)<br class="">+++ cfe/trunk/test/CodeGen/debug-info-block.c Mon Jul  6 19:49:35 2015<br class="">@@ -2,11 +2,28 @@<br class=""> // Verify that the desired debugging type is generated for a structure<br class=""> // member that is a pointer to a block.<br class=""><br class="">-// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "__block_literal_generic"<br class="">-// CHECK-NOT: line<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_structure_type, scope<br class="">+// CHECK-NOT:              line<br class="">+// CHECK-SAME:             elements: ![[ELEMS1:.*]])<br class="">+// CHECK: ![[ELEMS1]] = {{.*, .*, .*,}} ![[FPEL1:.*]], {{.*}}<br class="">+// CHECK: ![[INT:.*]] = !DIBasicType(name: "int"<br class="">+// CHECK: ![[FPEL1]] = {{.*}}"__FuncPtr", {{.*}}, baseType: ![[FPTY1:[0-9]+]]<br class="">+// CHECK: ![[FPTY1]] = {{.*}}baseType: ![[FNTY1:[0-9]+]]<br class="">+// CHECK: ![[FNTY1]] = !DISubroutineType(types: ![[VOIDVOID:[0-9]+]])<br class="">+// CHECK: ![[VOIDVOID]] = !{null, null}<br class=""> // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "__block_descriptor"<br class="">-// CHECK-NOT: line<br class="">+// CHECK-NOT:              line<br class="">+// CHECK-SAME:            )<br class="">+<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_structure_type, scope<br class="">+// CHECK-NOT:              line<br class="">+// CHECK-SAME:             elements: ![[ELEMS2:.*]])<br class="">+// CHECK: ![[ELEMS2]] = {{.*,.*,.*}}, ![[FPEL2:.*]], {{.*}}<br class="">+// CHECK: ![[FPEL2]] = {{.*}}"__FuncPtr", {{.*}}, baseType: ![[FPTY2:[0-9]+]]<br class="">+// CHECK: ![[FPTY2]] = {{.*}}baseType: ![[FNTY2:[0-9]+]]<br class="">+// CHECK: ![[FNTY2]] = !DISubroutineType(types: ![[INTINT:[0-9]+]])<br class="">+// CHECK: ![[INTINT]] = !{![[INT]], ![[INT]]}<br class=""> struct inStruct {<br class="">-  void (^genericBlockPtr)();<br class="">+  void (^voidBlockPtr)();<br class="">+  int (^intBlockPtr)(int);<br class=""> } is;<br class="">-<br class=""><br class=""><br class="">_______________________________________________<br class="">cfe-commits mailing list<br class=""><a href="mailto:cfe-commits@cs.uiuc.edu" class="">cfe-commits@cs.uiuc.edu</a><br class=""><a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a></blockquote></div></div></blockquote></div><br class=""></body></html>