mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 02:52:53 +02:00
DebugInfo: Provide a new hook to encode relationship between a property and an ivar.
llvm-svn: 149874
This commit is contained in:
parent
b5e95a7fb3
commit
864da4b549
@ -191,6 +191,23 @@ namespace llvm {
|
||||
StringRef PropertySetterName = StringRef(),
|
||||
unsigned PropertyAttributes = 0);
|
||||
|
||||
/// createObjCIVar - Create debugging information entry for Objective-C
|
||||
/// instance variable.
|
||||
/// @param Name Member name.
|
||||
/// @param File File where this member is defined.
|
||||
/// @param LineNo Line number.
|
||||
/// @param SizeInBits Member size.
|
||||
/// @param AlignInBits Member alignment.
|
||||
/// @param OffsetInBits Member offset.
|
||||
/// @param Flags Flags to encode member attribute, e.g. private
|
||||
/// @param Ty Parent type.
|
||||
/// @param Property Property associated with this ivar.
|
||||
DIType createObjCIVar(StringRef Name, DIFile File,
|
||||
unsigned LineNo, uint64_t SizeInBits,
|
||||
uint64_t AlignInBits, uint64_t OffsetInBits,
|
||||
unsigned Flags, DIType Ty,
|
||||
MDNode *PropertyNode);
|
||||
|
||||
/// createObjCProperty - Create debugging information entry for Objective-C
|
||||
/// property.
|
||||
/// @param Name Property name.
|
||||
|
@ -43,6 +43,7 @@ namespace llvm {
|
||||
class DILexicalBlockFile;
|
||||
class DIVariable;
|
||||
class DIType;
|
||||
class DIObjCProperty;
|
||||
|
||||
/// DIDescriptor - A thin wraper around MDNode to access encoded debug info.
|
||||
/// This should not be stored in a container, because underly MDNode may
|
||||
@ -356,6 +357,10 @@ namespace llvm {
|
||||
/// return base type size.
|
||||
uint64_t getOriginalTypeSize() const;
|
||||
|
||||
/// getObjCProperty - Return property node, if this ivar is
|
||||
/// associated with one.
|
||||
MDNode *getObjCProperty() const;
|
||||
|
||||
StringRef getObjCPropertyName() const {
|
||||
if (getVersion() > LLVMDebugVersion11)
|
||||
return StringRef();
|
||||
|
@ -359,6 +359,30 @@ DIType DIBuilder::createObjCIVar(StringRef Name,
|
||||
return DIType(MDNode::get(VMContext, Elts));
|
||||
}
|
||||
|
||||
/// createObjCIVar - Create debugging information entry for Objective-C
|
||||
/// instance variable.
|
||||
DIType DIBuilder::createObjCIVar(StringRef Name,
|
||||
DIFile File, unsigned LineNumber,
|
||||
uint64_t SizeInBits, uint64_t AlignInBits,
|
||||
uint64_t OffsetInBits, unsigned Flags,
|
||||
DIType Ty, MDNode *PropertyNode) {
|
||||
// TAG_member is encoded in DIDerivedType format.
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(VMContext, dwarf::DW_TAG_member),
|
||||
getNonCompileUnitScope(File),
|
||||
MDString::get(VMContext, Name),
|
||||
File,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
|
||||
Ty,
|
||||
PropertyNode
|
||||
};
|
||||
return DIType(MDNode::get(VMContext, Elts));
|
||||
}
|
||||
|
||||
/// createObjCProperty - Create debugging information entry for Objective-C
|
||||
/// property.
|
||||
DIObjCProperty DIBuilder::createObjCProperty(StringRef Name,
|
||||
|
@ -510,6 +510,13 @@ uint64_t DIDerivedType::getOriginalTypeSize() const {
|
||||
return getSizeInBits();
|
||||
}
|
||||
|
||||
/// getObjCProperty - Return property node, if this ivar is associated with one.
|
||||
MDNode *DIDerivedType::getObjCProperty() const {
|
||||
if (getVersion() <= LLVMDebugVersion11 || DbgNode->getNumOperands() <= 10)
|
||||
return NULL;
|
||||
return dyn_cast_or_null<MDNode>(DbgNode->getOperand(10));
|
||||
}
|
||||
|
||||
/// isInlinedFnArgument - Return true if this variable provides debugging
|
||||
/// information for an inlined function arguments.
|
||||
bool DIVariable::isInlinedFnArgument(const Function *CurFn) {
|
||||
|
@ -851,6 +851,12 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
|
||||
if (PropertyAttributes)
|
||||
addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
|
||||
PropertyAttributes);
|
||||
|
||||
DIEEntry *Entry = getDIEEntry(Element);
|
||||
if (!Entry) {
|
||||
Entry = createDIEEntry(ElemDie);
|
||||
insertDIEEntry(Element, Entry);
|
||||
}
|
||||
} else
|
||||
continue;
|
||||
Buffer.addChild(ElemDie);
|
||||
@ -1455,6 +1461,11 @@ DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
|
||||
dwarf::DW_VIRTUALITY_virtual);
|
||||
|
||||
// Objective-C properties.
|
||||
if (MDNode *PNode = DT.getObjCProperty())
|
||||
if (DIEEntry *PropertyDie = getDIEEntry(PNode))
|
||||
MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
|
||||
PropertyDie);
|
||||
|
||||
// This is only for backward compatibility.
|
||||
StringRef PropertyName = DT.getObjCPropertyName();
|
||||
if (!PropertyName.empty()) {
|
||||
|
Loading…
Reference in New Issue
Block a user