r241534 - Debug info: Emit distinct __block_literal_generic types for blocks with

Adrian Prantl aprantl at apple.com
Mon Jul 13 13:20:58 PDT 2015


> On Jul 13, 2015, at 1:10 PM, David Blaikie <dblaikie at gmail.com> wrote:
> 
> 
> 
> On Mon, Jul 6, 2015 at 5:49 PM, Adrian Prantl <aprantl at apple.com <mailto:aprantl at apple.com>> wrote:
> Author: adrian
> Date: Mon Jul  6 19:49:35 2015
> New Revision: 241534
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=241534&view=rev <http://llvm.org/viewvc/llvm-project?rev=241534&view=rev>
> Log:
> Debug info: Emit distinct __block_literal_generic types for blocks with
> different function signatures. (Previously clang would emit all block
> pointer types with the type of the first block pointer in the compile
> unit.)
> 
> rdar://problem/21602473
> 
> Modified:
>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>     cfe/trunk/lib/CodeGen/CGDebugInfo.h
>     cfe/trunk/test/CodeGen/debug-info-block.c
> 
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=241534&r1=241533&r2=241534&view=diff <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=241534&r1=241533&r2=241534&view=diff>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon Jul  6 19:49:35 2015
> @@ -705,9 +705,6 @@ llvm::DIType *CGDebugInfo::getOrCreateSt
> 
>  llvm::DIType *CGDebugInfo::CreateType(const BlockPointerType *Ty,
>                                        llvm::DIFile *Unit) {
> -  if (BlockLiteralGeneric)
> -    return BlockLiteralGeneric;
> -
>    SmallVector<llvm::Metadata *, 8> EltTys;
>    QualType FType;
>    uint64_t FieldSize, FieldOffset;
> @@ -753,12 +750,15 @@ llvm::DIType *CGDebugInfo::CreateType(co
>    FieldOffset += FieldSize;
>    Elements = DBuilder.getOrCreateArray(EltTys);
> 
> +  // The __block_literal_generic structs are marked with a special
> +  // DW_AT_APPLE_BLOCK attribute and are an implementation detail only
> +  // the debugger needs to know about. To allow type uniquing, emit
> +  // them without a name or a location.
>    EltTy =
> -      DBuilder.createStructType(Unit, "__block_literal_generic", nullptr, LineNo,
> +      DBuilder.createStructType(Unit, "", nullptr, LineNo,
>                                  FieldOffset, 0, Flags, nullptr, Elements);
> 
> -  BlockLiteralGeneric = DBuilder.createPointerType(EltTy, Size);
> -  return BlockLiteralGeneric;
> +  return DBuilder.createPointerType(EltTy, Size);
> 
> What about two of the same? I assume that hits the type cache long before this & doesn't produce duplicate type metadata?
>  

Yes, to get to this point the it needs to have been through the getOrCreateType caching mechanism before.

-- adrian

>  }
> 
>  llvm::DIType *CGDebugInfo::CreateType(const TemplateSpecializationType *Ty,
> 
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=241534&r1=241533&r2=241534&view=diff <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=241534&r1=241533&r2=241534&view=diff>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Mon Jul  6 19:49:35 2015
> @@ -65,7 +65,6 @@ class CGDebugInfo {
>    llvm::DIType *OCLImage2dArrayDITy = nullptr;
>    llvm::DIType *OCLImage3dDITy = nullptr;
>    llvm::DIType *OCLEventDITy = nullptr;
> -  llvm::DIType *BlockLiteralGeneric = nullptr;
> 
>    /// \brief Cache of previously constructed Types.
>    llvm::DenseMap<const void *, llvm::TrackingMDRef> TypeCache;
> 
> Modified: cfe/trunk/test/CodeGen/debug-info-block.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-info-block.c?rev=241534&r1=241533&r2=241534&view=diff <http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-info-block.c?rev=241534&r1=241533&r2=241534&view=diff>
> ==============================================================================
> --- cfe/trunk/test/CodeGen/debug-info-block.c (original)
> +++ cfe/trunk/test/CodeGen/debug-info-block.c Mon Jul  6 19:49:35 2015
> @@ -2,11 +2,28 @@
>  // Verify that the desired debugging type is generated for a structure
>  // member that is a pointer to a block.
> 
> -// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "__block_literal_generic"
> -// CHECK-NOT: line
> +// CHECK: !DICompositeType(tag: DW_TAG_structure_type, scope
> +// CHECK-NOT:              line
> +// CHECK-SAME:             elements: ![[ELEMS1:.*]])
> +// CHECK: ![[ELEMS1]] = {{.*, .*, .*,}} ![[FPEL1:.*]], {{.*}}
> +// CHECK: ![[INT:.*]] = !DIBasicType(name: "int"
> +// CHECK: ![[FPEL1]] = {{.*}}"__FuncPtr", {{.*}}, baseType: ![[FPTY1:[0-9]+]]
> +// CHECK: ![[FPTY1]] = {{.*}}baseType: ![[FNTY1:[0-9]+]]
> +// CHECK: ![[FNTY1]] = !DISubroutineType(types: ![[VOIDVOID:[0-9]+]])
> +// CHECK: ![[VOIDVOID]] = !{null, null}
>  // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "__block_descriptor"
> -// CHECK-NOT: line
> +// CHECK-NOT:              line
> +// CHECK-SAME:            )
> +
> +// CHECK: !DICompositeType(tag: DW_TAG_structure_type, scope
> +// CHECK-NOT:              line
> +// CHECK-SAME:             elements: ![[ELEMS2:.*]])
> +// CHECK: ![[ELEMS2]] = {{.*,.*,.*}}, ![[FPEL2:.*]], {{.*}}
> +// CHECK: ![[FPEL2]] = {{.*}}"__FuncPtr", {{.*}}, baseType: ![[FPTY2:[0-9]+]]
> +// CHECK: ![[FPTY2]] = {{.*}}baseType: ![[FNTY2:[0-9]+]]
> +// CHECK: ![[FNTY2]] = !DISubroutineType(types: ![[INTINT:[0-9]+]])
> +// CHECK: ![[INTINT]] = !{![[INT]], ![[INT]]}
>  struct inStruct {
> -  void (^genericBlockPtr)();
> +  void (^voidBlockPtr)();
> +  int (^intBlockPtr)(int);
>  } is;
> -
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu <mailto:cfe-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits <http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150713/749d0a1c/attachment.html>


More information about the cfe-commits mailing list