forked from OSchip/llvm-project
[DebugInfo][OpenCL] Address post-commit review for r338299
NFC refactor of code to generate debug info for OpenCL 2.X blocks. Differential Revision: https://reviews.llvm.org/D50099 llvm-svn: 339265
This commit is contained in:
parent
04c5a34f4f
commit
58df0e4d2c
|
@ -942,35 +942,18 @@ llvm::DIType *CGDebugInfo::getOrCreateStructPtrType(StringRef Name,
|
|||
return Cache;
|
||||
}
|
||||
|
||||
llvm::DIType *CGDebugInfo::CreateType(const BlockPointerType *Ty,
|
||||
llvm::DIFile *Unit) {
|
||||
SmallVector<llvm::Metadata *, 8> EltTys;
|
||||
uint64_t CGDebugInfo::collectDefaultElementTypesForBlockPointer(
|
||||
const BlockPointerType *Ty, llvm::DIFile *Unit, llvm::DIDerivedType *DescTy,
|
||||
unsigned LineNo, SmallVectorImpl<llvm::Metadata *> &EltTys) {
|
||||
QualType FType;
|
||||
uint64_t FieldSize, FieldOffset;
|
||||
uint32_t FieldAlign;
|
||||
llvm::DINodeArray Elements;
|
||||
|
||||
FieldOffset = 0;
|
||||
FType = CGM.getContext().UnsignedLongTy;
|
||||
EltTys.push_back(CreateMemberType(Unit, FType, "reserved", &FieldOffset));
|
||||
EltTys.push_back(CreateMemberType(Unit, FType, "Size", &FieldOffset));
|
||||
// Advanced by calls to CreateMemberType in increments of FType, then
|
||||
// returned as the overall size of the default elements.
|
||||
uint64_t FieldOffset = 0;
|
||||
|
||||
Elements = DBuilder.getOrCreateArray(EltTys);
|
||||
EltTys.clear();
|
||||
|
||||
llvm::DINode::DIFlags Flags = llvm::DINode::FlagAppleBlock;
|
||||
unsigned LineNo = 0;
|
||||
|
||||
auto *EltTy =
|
||||
DBuilder.createStructType(Unit, "__block_descriptor", nullptr, LineNo,
|
||||
FieldOffset, 0, Flags, nullptr, Elements);
|
||||
|
||||
// Bit size, align and offset of the type.
|
||||
uint64_t Size = CGM.getContext().getTypeSize(Ty);
|
||||
|
||||
auto *DescTy = DBuilder.createPointerType(EltTy, Size);
|
||||
|
||||
FieldOffset = 0;
|
||||
// Blocks in OpenCL have unique constraints which make the standard fields
|
||||
// redundant while requiring size and align fields for enqueue_kernel. See
|
||||
// initializeForBlockHeader in CGBlocks.cpp
|
||||
if (CGM.getLangOpts().OpenCL) {
|
||||
FType = CGM.getContext().IntTy;
|
||||
EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset));
|
||||
|
@ -984,21 +967,53 @@ llvm::DIType *CGDebugInfo::CreateType(const BlockPointerType *Ty,
|
|||
FType = CGM.getContext().getPointerType(Ty->getPointeeType());
|
||||
EltTys.push_back(CreateMemberType(Unit, FType, "__FuncPtr", &FieldOffset));
|
||||
FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
|
||||
FieldSize = CGM.getContext().getTypeSize(Ty);
|
||||
FieldAlign = CGM.getContext().getTypeAlign(Ty);
|
||||
uint64_t FieldSize = CGM.getContext().getTypeSize(Ty);
|
||||
uint32_t FieldAlign = CGM.getContext().getTypeAlign(Ty);
|
||||
EltTys.push_back(DBuilder.createMemberType(
|
||||
Unit, "__descriptor", nullptr, LineNo, FieldSize, FieldAlign, FieldOffset,
|
||||
llvm::DINode::FlagZero, DescTy));
|
||||
Unit, "__descriptor", nullptr, LineNo, FieldSize, FieldAlign,
|
||||
FieldOffset, llvm::DINode::FlagZero, DescTy));
|
||||
FieldOffset += FieldSize;
|
||||
}
|
||||
|
||||
return FieldOffset;
|
||||
}
|
||||
|
||||
llvm::DIType *CGDebugInfo::CreateType(const BlockPointerType *Ty,
|
||||
llvm::DIFile *Unit) {
|
||||
SmallVector<llvm::Metadata *, 8> EltTys;
|
||||
QualType FType;
|
||||
uint64_t FieldOffset;
|
||||
llvm::DINodeArray Elements;
|
||||
|
||||
FieldOffset = 0;
|
||||
FType = CGM.getContext().UnsignedLongTy;
|
||||
EltTys.push_back(CreateMemberType(Unit, FType, "reserved", &FieldOffset));
|
||||
EltTys.push_back(CreateMemberType(Unit, FType, "Size", &FieldOffset));
|
||||
|
||||
Elements = DBuilder.getOrCreateArray(EltTys);
|
||||
EltTys.clear();
|
||||
|
||||
llvm::DINode::DIFlags Flags = llvm::DINode::FlagAppleBlock;
|
||||
|
||||
auto *EltTy =
|
||||
DBuilder.createStructType(Unit, "__block_descriptor", nullptr, 0,
|
||||
FieldOffset, 0, Flags, nullptr, Elements);
|
||||
|
||||
// Bit size, align and offset of the type.
|
||||
uint64_t Size = CGM.getContext().getTypeSize(Ty);
|
||||
|
||||
auto *DescTy = DBuilder.createPointerType(EltTy, Size);
|
||||
|
||||
FieldOffset = collectDefaultElementTypesForBlockPointer(Ty, Unit, DescTy,
|
||||
0, EltTys);
|
||||
|
||||
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, "", nullptr, LineNo, FieldOffset, 0,
|
||||
EltTy = DBuilder.createStructType(Unit, "", nullptr, 0, FieldOffset, 0,
|
||||
Flags, nullptr, Elements);
|
||||
|
||||
return DBuilder.createPointerType(EltTy, Size);
|
||||
|
@ -3830,6 +3845,44 @@ bool operator<(const BlockLayoutChunk &l, const BlockLayoutChunk &r) {
|
|||
}
|
||||
} // namespace
|
||||
|
||||
void CGDebugInfo::collectDefaultFieldsForBlockLiteralDeclare(
|
||||
const CGBlockInfo &Block, const ASTContext &Context, SourceLocation Loc,
|
||||
const llvm::StructLayout &BlockLayout, llvm::DIFile *Unit,
|
||||
SmallVectorImpl<llvm::Metadata *> &Fields) {
|
||||
// Blocks in OpenCL have unique constraints which make the standard fields
|
||||
// redundant while requiring size and align fields for enqueue_kernel. See
|
||||
// initializeForBlockHeader in CGBlocks.cpp
|
||||
if (CGM.getLangOpts().OpenCL) {
|
||||
Fields.push_back(createFieldType("__size", Context.IntTy, Loc, AS_public,
|
||||
BlockLayout.getElementOffsetInBits(0),
|
||||
Unit, Unit));
|
||||
Fields.push_back(createFieldType("__align", Context.IntTy, Loc, AS_public,
|
||||
BlockLayout.getElementOffsetInBits(1),
|
||||
Unit, Unit));
|
||||
} else {
|
||||
Fields.push_back(createFieldType("__isa", Context.VoidPtrTy, Loc, AS_public,
|
||||
BlockLayout.getElementOffsetInBits(0),
|
||||
Unit, Unit));
|
||||
Fields.push_back(createFieldType("__flags", Context.IntTy, Loc, AS_public,
|
||||
BlockLayout.getElementOffsetInBits(1),
|
||||
Unit, Unit));
|
||||
Fields.push_back(
|
||||
createFieldType("__reserved", Context.IntTy, Loc, AS_public,
|
||||
BlockLayout.getElementOffsetInBits(2), Unit, Unit));
|
||||
auto *FnTy = Block.getBlockExpr()->getFunctionType();
|
||||
auto FnPtrType = CGM.getContext().getPointerType(FnTy->desugar());
|
||||
Fields.push_back(createFieldType("__FuncPtr", FnPtrType, Loc, AS_public,
|
||||
BlockLayout.getElementOffsetInBits(3),
|
||||
Unit, Unit));
|
||||
Fields.push_back(createFieldType(
|
||||
"__descriptor",
|
||||
Context.getPointerType(Block.NeedsCopyDispose
|
||||
? Context.getBlockDescriptorExtendedType()
|
||||
: Context.getBlockDescriptorType()),
|
||||
Loc, AS_public, BlockLayout.getElementOffsetInBits(4), Unit, Unit));
|
||||
}
|
||||
}
|
||||
|
||||
void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
|
||||
StringRef Name,
|
||||
unsigned ArgNo,
|
||||
|
@ -3852,35 +3905,8 @@ void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
|
|||
CGM.getDataLayout().getStructLayout(block.StructureType);
|
||||
|
||||
SmallVector<llvm::Metadata *, 16> fields;
|
||||
if (CGM.getLangOpts().OpenCL) {
|
||||
fields.push_back(createFieldType("__size", C.IntTy, loc, AS_public,
|
||||
blockLayout->getElementOffsetInBits(0),
|
||||
tunit, tunit));
|
||||
fields.push_back(createFieldType("__align", C.IntTy, loc, AS_public,
|
||||
blockLayout->getElementOffsetInBits(1),
|
||||
tunit, tunit));
|
||||
} else {
|
||||
fields.push_back(createFieldType("__isa", C.VoidPtrTy, loc, AS_public,
|
||||
blockLayout->getElementOffsetInBits(0),
|
||||
tunit, tunit));
|
||||
fields.push_back(createFieldType("__flags", C.IntTy, loc, AS_public,
|
||||
blockLayout->getElementOffsetInBits(1),
|
||||
tunit, tunit));
|
||||
fields.push_back(createFieldType("__reserved", C.IntTy, loc, AS_public,
|
||||
blockLayout->getElementOffsetInBits(2),
|
||||
tunit, tunit));
|
||||
auto *FnTy = block.getBlockExpr()->getFunctionType();
|
||||
auto FnPtrType = CGM.getContext().getPointerType(FnTy->desugar());
|
||||
fields.push_back(createFieldType("__FuncPtr", FnPtrType, loc, AS_public,
|
||||
blockLayout->getElementOffsetInBits(3),
|
||||
tunit, tunit));
|
||||
fields.push_back(createFieldType(
|
||||
"__descriptor",
|
||||
C.getPointerType(block.NeedsCopyDispose
|
||||
? C.getBlockDescriptorExtendedType()
|
||||
: C.getBlockDescriptorType()),
|
||||
loc, AS_public, blockLayout->getElementOffsetInBits(4), tunit, tunit));
|
||||
}
|
||||
collectDefaultFieldsForBlockLiteralDeclare(block, C, loc, *blockLayout, tunit,
|
||||
fields);
|
||||
|
||||
// We want to sort the captures by offset, not because DWARF
|
||||
// requires this, but because we're paranoid about debuggers.
|
||||
|
|
|
@ -311,6 +311,22 @@ class CGDebugInfo {
|
|||
void AppendAddressSpaceXDeref(unsigned AddressSpace,
|
||||
SmallVectorImpl<int64_t> &Expr) const;
|
||||
|
||||
/// A helper function to collect debug info for the default elements of a
|
||||
/// block.
|
||||
///
|
||||
/// \returns The next available field offset after the default elements.
|
||||
uint64_t collectDefaultElementTypesForBlockPointer(
|
||||
const BlockPointerType *Ty, llvm::DIFile *Unit,
|
||||
llvm::DIDerivedType *DescTy, unsigned LineNo,
|
||||
SmallVectorImpl<llvm::Metadata *> &EltTys);
|
||||
|
||||
/// A helper function to collect debug info for the default fields of a
|
||||
/// block.
|
||||
void collectDefaultFieldsForBlockLiteralDeclare(
|
||||
const CGBlockInfo &Block, const ASTContext &Context, SourceLocation Loc,
|
||||
const llvm::StructLayout &BlockLayout, llvm::DIFile *Unit,
|
||||
SmallVectorImpl<llvm::Metadata *> &Fields);
|
||||
|
||||
public:
|
||||
CGDebugInfo(CodeGenModule &CGM);
|
||||
~CGDebugInfo();
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
// RUN: %clang_cc1 %s -cl-std=CL2.0 -emit-llvm -o - -O0 -debug-info-kind=limited -triple spir-unknown-unknown | FileCheck -check-prefixes=COMMON,SPIR %s
|
||||
// RUN: %clang_cc1 %s -cl-std=CL2.0 -emit-llvm -o - -O0 -debug-info-kind=limited -triple amdgcn-amd-amdhsa | FileCheck -check-prefixes=COMMON,AMDGCN %s
|
||||
// RUN: %clang_cc1 %s -cl-std=CL2.0 -emit-llvm -o - -O0 -triple spir-unknown-unknown | FileCheck -check-prefixes=COMMON,SPIR %s
|
||||
// RUN: %clang_cc1 %s -cl-std=CL2.0 -emit-llvm -o - -O0 -triple amdgcn-amd-amdhsa | FileCheck -check-prefixes=COMMON,AMDGCN %s
|
||||
// RUN: %clang_cc1 %s -cl-std=CL2.0 -emit-llvm -o - -O0 -debug-info-kind=limited -triple spir-unknown-unknown | FileCheck -check-prefixes=CHECK-DEBUG %s
|
||||
// RUN: %clang_cc1 %s -cl-std=CL2.0 -emit-llvm -o - -O0 -debug-info-kind=limited -triple amdgcn-amd-amdhsa | FileCheck -check-prefixes=CHECK-DEBUG %s
|
||||
|
||||
// COMMON: @__block_literal_global = internal addrspace(1) constant { i32, i32 } { i32 8, i32 4 }
|
||||
// COMMON-NOT: .str
|
||||
|
@ -61,10 +63,10 @@ void foo(){
|
|||
|
||||
// COMMON-NOT: define{{.*}}@__foo_block_invoke_kernel
|
||||
|
||||
// COMMON: !DIDerivedType(tag: DW_TAG_member, name: "__size"
|
||||
// COMMON: !DIDerivedType(tag: DW_TAG_member, name: "__align"
|
||||
// CHECK-DEBUG: !DIDerivedType(tag: DW_TAG_member, name: "__size"
|
||||
// CHECK-DEBUG: !DIDerivedType(tag: DW_TAG_member, name: "__align"
|
||||
|
||||
// COMMON-NOT: !DIDerivedType(tag: DW_TAG_member, name: "__isa"
|
||||
// COMMON-NOT: !DIDerivedType(tag: DW_TAG_member, name: "__flags"
|
||||
// COMMON-NOT: !DIDerivedType(tag: DW_TAG_member, name: "__reserved"
|
||||
// COMMON-NOT: !DIDerivedType(tag: DW_TAG_member, name: "__FuncPtr"
|
||||
// CHECK-DEBUG-NOT: !DIDerivedType(tag: DW_TAG_member, name: "__isa"
|
||||
// CHECK-DEBUG-NOT: !DIDerivedType(tag: DW_TAG_member, name: "__flags"
|
||||
// CHECK-DEBUG-NOT: !DIDerivedType(tag: DW_TAG_member, name: "__reserved"
|
||||
// CHECK-DEBUG-NOT: !DIDerivedType(tag: DW_TAG_member, name: "__FuncPtr"
|
||||
|
|
Loading…
Reference in New Issue