forked from OSchip/llvm-project
Remove all uses of DIFlagBlockByrefStruct
This patch removes the last reason why DIFlagBlockByrefStruct from Clang by directly implementing the drilling into the member type done in DwarfDebug::DbgVariable::getType() into the frontend. rdar://problem/31629055 Differential Revision: https://reviews.llvm.org/D51807 llvm-svn: 341842
This commit is contained in:
parent
5660bd460b
commit
05a623eb87
|
@ -3565,9 +3565,9 @@ void CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder, llvm::Function *Fn) {
|
||||||
DBuilder.finalizeSubprogram(Fn->getSubprogram());
|
DBuilder.finalizeSubprogram(Fn->getSubprogram());
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::DIType *CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD,
|
CGDebugInfo::BlockByRefType
|
||||||
|
CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD,
|
||||||
uint64_t *XOffset) {
|
uint64_t *XOffset) {
|
||||||
|
|
||||||
SmallVector<llvm::Metadata *, 5> EltTys;
|
SmallVector<llvm::Metadata *, 5> EltTys;
|
||||||
QualType FType;
|
QualType FType;
|
||||||
uint64_t FieldSize, FieldOffset;
|
uint64_t FieldSize, FieldOffset;
|
||||||
|
@ -3619,23 +3619,21 @@ llvm::DIType *CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD,
|
||||||
}
|
}
|
||||||
|
|
||||||
FType = Type;
|
FType = Type;
|
||||||
llvm::DIType *FieldTy = getOrCreateType(FType, Unit);
|
llvm::DIType *WrappedTy = getOrCreateType(FType, Unit);
|
||||||
FieldSize = CGM.getContext().getTypeSize(FType);
|
FieldSize = CGM.getContext().getTypeSize(FType);
|
||||||
FieldAlign = CGM.getContext().toBits(Align);
|
FieldAlign = CGM.getContext().toBits(Align);
|
||||||
|
|
||||||
*XOffset = FieldOffset;
|
*XOffset = FieldOffset;
|
||||||
FieldTy = DBuilder.createMemberType(Unit, VD->getName(), Unit, 0, FieldSize,
|
llvm::DIType *FieldTy = DBuilder.createMemberType(
|
||||||
FieldAlign, FieldOffset,
|
Unit, VD->getName(), Unit, 0, FieldSize, FieldAlign, FieldOffset,
|
||||||
llvm::DINode::FlagZero, FieldTy);
|
llvm::DINode::FlagZero, WrappedTy);
|
||||||
EltTys.push_back(FieldTy);
|
EltTys.push_back(FieldTy);
|
||||||
FieldOffset += FieldSize;
|
FieldOffset += FieldSize;
|
||||||
|
|
||||||
llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
|
llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
|
||||||
|
return {DBuilder.createStructType(Unit, "", Unit, 0, FieldOffset, 0,
|
||||||
llvm::DINode::DIFlags Flags = llvm::DINode::FlagBlockByrefStruct;
|
llvm::DINode::FlagZero, nullptr, Elements),
|
||||||
|
WrappedTy};
|
||||||
return DBuilder.createStructType(Unit, "", Unit, 0, FieldOffset, 0, Flags,
|
|
||||||
nullptr, Elements);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD,
|
llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD,
|
||||||
|
@ -3656,7 +3654,7 @@ llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD,
|
||||||
llvm::DIType *Ty;
|
llvm::DIType *Ty;
|
||||||
uint64_t XOffset = 0;
|
uint64_t XOffset = 0;
|
||||||
if (VD->hasAttr<BlocksAttr>())
|
if (VD->hasAttr<BlocksAttr>())
|
||||||
Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset);
|
Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset).WrappedType;
|
||||||
else
|
else
|
||||||
Ty = getOrCreateType(VD->getType(), Unit);
|
Ty = getOrCreateType(VD->getType(), Unit);
|
||||||
|
|
||||||
|
@ -3794,7 +3792,7 @@ void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(
|
||||||
llvm::DIFile *Unit = getOrCreateFile(VD->getLocation());
|
llvm::DIFile *Unit = getOrCreateFile(VD->getLocation());
|
||||||
llvm::DIType *Ty;
|
llvm::DIType *Ty;
|
||||||
if (isByRef)
|
if (isByRef)
|
||||||
Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset);
|
Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset).WrappedType;
|
||||||
else
|
else
|
||||||
Ty = getOrCreateType(VD->getType(), Unit);
|
Ty = getOrCreateType(VD->getType(), Unit);
|
||||||
|
|
||||||
|
@ -3987,10 +3985,10 @@ void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
|
||||||
if (capture->isByRef()) {
|
if (capture->isByRef()) {
|
||||||
TypeInfo PtrInfo = C.getTypeInfo(C.VoidPtrTy);
|
TypeInfo PtrInfo = C.getTypeInfo(C.VoidPtrTy);
|
||||||
auto Align = PtrInfo.AlignIsRequired ? PtrInfo.Align : 0;
|
auto Align = PtrInfo.AlignIsRequired ? PtrInfo.Align : 0;
|
||||||
|
// FIXME: This recomputes the layout of the BlockByRefWrapper.
|
||||||
// FIXME: this creates a second copy of this type!
|
|
||||||
uint64_t xoffset;
|
uint64_t xoffset;
|
||||||
fieldType = EmitTypeForVarWithBlocksAttr(variable, &xoffset);
|
fieldType =
|
||||||
|
EmitTypeForVarWithBlocksAttr(variable, &xoffset).BlockByRefWrapper;
|
||||||
fieldType = DBuilder.createPointerType(fieldType, PtrInfo.Width);
|
fieldType = DBuilder.createPointerType(fieldType, PtrInfo.Width);
|
||||||
fieldType = DBuilder.createMemberType(tunit, name, tunit, line,
|
fieldType = DBuilder.createMemberType(tunit, name, tunit, line,
|
||||||
PtrInfo.Width, Align, offsetInBits,
|
PtrInfo.Width, Align, offsetInBits,
|
||||||
|
|
|
@ -491,8 +491,15 @@ private:
|
||||||
llvm::Optional<unsigned> ArgNo,
|
llvm::Optional<unsigned> ArgNo,
|
||||||
CGBuilderTy &Builder);
|
CGBuilderTy &Builder);
|
||||||
|
|
||||||
|
struct BlockByRefType {
|
||||||
|
/// The wrapper struct used inside the __block_literal struct.
|
||||||
|
llvm::DIType *BlockByRefWrapper;
|
||||||
|
/// The type as it appears in the source code.
|
||||||
|
llvm::DIType *WrappedType;
|
||||||
|
};
|
||||||
|
|
||||||
/// Build up structure info for the byref. See \a BuildByRefType.
|
/// Build up structure info for the byref. See \a BuildByRefType.
|
||||||
llvm::DIType *EmitTypeForVarWithBlocksAttr(const VarDecl *VD,
|
BlockByRefType EmitTypeForVarWithBlocksAttr(const VarDecl *VD,
|
||||||
uint64_t *OffSet);
|
uint64_t *OffSet);
|
||||||
|
|
||||||
/// Get context info for the DeclContext of \p Decl.
|
/// Get context info for the DeclContext of \p Decl.
|
||||||
|
|
|
@ -1,16 +1,35 @@
|
||||||
// RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -debug-info-kind=limited -triple x86_64-apple-darwin -emit-llvm %s -o - | FileCheck %s
|
// RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -debug-info-kind=limited -triple x86_64-apple-darwin -emit-llvm %s -o - | FileCheck %s
|
||||||
|
|
||||||
// rdar://problem/14386148
|
// CHECK: !DILocalVariable(name: "foo", {{.*}}type: ![[FOOTY:[0-9]+]])
|
||||||
|
// CHECK: ![[FOOTY]] = {{.*}}!DICompositeType({{.*}}, name: "Foo"
|
||||||
|
|
||||||
|
// CHECK-NOT: DIFlagBlockByrefStruct
|
||||||
|
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "__block_literal_1",
|
||||||
|
// CHECK-SAME: size: 320, elements: ![[BL_ELTS:[0-9]+]])
|
||||||
|
// CHECK: ![[BL_ELTS]] = !{{.*}}![[WFOO:[0-9]+]]}
|
||||||
|
|
||||||
// Test that the foo is aligned at an 8 byte boundary in the DWARF
|
// Test that the foo is aligned at an 8 byte boundary in the DWARF
|
||||||
// expression (256) that locates it inside of the byref descriptor:
|
// expression (256) that locates it inside of the byref descriptor:
|
||||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "foo",
|
// CHECK: ![[WFOO]] = !DIDerivedType(tag: DW_TAG_member, name: "foo",
|
||||||
// CHECK-NOT: line:
|
// CHECK-SAME: baseType: ![[PTR:[0-9]+]]
|
||||||
// CHECK-SAME: offset: 256
|
// CHECK-SAME: offset: 256)
|
||||||
|
|
||||||
|
// CHECK: ![[PTR]] = !DIDerivedType(tag: DW_TAG_pointer_type,
|
||||||
|
// CHECK-SAME: baseType: ![[WRAPPER:[0-9]+]]
|
||||||
|
// CHECK: ![[WRAPPER]] = !DICompositeType(tag: DW_TAG_structure_type, scope:
|
||||||
|
// CHECK: elements: ![[WR_ELTS:[0-9]+]])
|
||||||
|
// CHECK: ![[WR_ELTS]] = !{{.*}}![[WFOO:[0-9]+]]}
|
||||||
|
// CHECK: ![[WFOO]] = !DIDerivedType(tag: DW_TAG_member, name: "foo",
|
||||||
|
// CHECK-SAME: baseType: ![[FOOTY]]
|
||||||
|
|
||||||
|
// CHECK: !DILocalVariable(name: "foo", {{.*}}type: ![[FOOTY]])
|
||||||
|
|
||||||
|
|
||||||
struct Foo {
|
struct Foo {
|
||||||
unsigned char *data;
|
unsigned char *data;
|
||||||
};
|
};
|
||||||
int func() {
|
int func() {
|
||||||
__attribute__((__blocks__(byref))) struct Foo foo;
|
__attribute__((__blocks__(byref))) struct Foo foo;
|
||||||
|
^{ foo.data = 0; }();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue