mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-28 14:10:55 +00:00
Use DW_FORM_flag_present to save space in debug information if we're
not in darwin gdb compat mode. Fixes rdar://10975088 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@162526 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3887a902a1
commit
873cf0a0d7
@ -182,6 +182,12 @@ void DIEValue::dump() {
|
||||
void DIEInteger::EmitValue(AsmPrinter *Asm, unsigned Form) const {
|
||||
unsigned Size = ~0U;
|
||||
switch (Form) {
|
||||
case dwarf::DW_FORM_flag_present:
|
||||
// Emit something to keep the lines and comments in sync.
|
||||
// FIXME: Is there a better way to do this?
|
||||
if (Asm->OutStreamer.hasRawTextSupport())
|
||||
Asm->OutStreamer.EmitRawText(StringRef(""));
|
||||
return;
|
||||
case dwarf::DW_FORM_flag: // Fall thru
|
||||
case dwarf::DW_FORM_ref1: // Fall thru
|
||||
case dwarf::DW_FORM_data1: Size = 1; break;
|
||||
@ -203,6 +209,8 @@ void DIEInteger::EmitValue(AsmPrinter *Asm, unsigned Form) const {
|
||||
///
|
||||
unsigned DIEInteger::SizeOf(AsmPrinter *AP, unsigned Form) const {
|
||||
switch (Form) {
|
||||
case dwarf::DW_FORM_flag_present: // Fall thru
|
||||
return 0;
|
||||
case dwarf::DW_FORM_flag: // Fall thru
|
||||
case dwarf::DW_FORM_ref1: // Fall thru
|
||||
case dwarf::DW_FORM_data1: return sizeof(int8_t);
|
||||
|
@ -51,6 +51,15 @@ DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
|
||||
return Value;
|
||||
}
|
||||
|
||||
/// addFlag - Add a flag that is true.
|
||||
void CompileUnit::addFlag(DIE *Die, unsigned Attribute) {
|
||||
if (!DD->useDarwinGDBCompat())
|
||||
Die->addValue(Attribute, dwarf::DW_FORM_flag_present,
|
||||
DIEIntegerOne);
|
||||
else
|
||||
addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1);
|
||||
}
|
||||
|
||||
/// addUInt - Add an unsigned integer attribute data and value.
|
||||
///
|
||||
void CompileUnit::addUInt(DIE *Die, unsigned Attribute,
|
||||
@ -794,7 +803,7 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
|
||||
(Language == dwarf::DW_LANG_C89 ||
|
||||
Language == dwarf::DW_LANG_C99 ||
|
||||
Language == dwarf::DW_LANG_ObjC))
|
||||
addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
|
||||
addFlag(&Buffer, dwarf::DW_AT_prototyped);
|
||||
}
|
||||
break;
|
||||
case dwarf::DW_TAG_structure_type:
|
||||
@ -825,15 +834,15 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
|
||||
addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
|
||||
dwarf::DW_ACCESS_public);
|
||||
if (SP.isExplicit())
|
||||
addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
|
||||
addFlag(ElemDie, dwarf::DW_AT_explicit);
|
||||
}
|
||||
else if (Element.isVariable()) {
|
||||
DIVariable DV(Element);
|
||||
ElemDie = new DIE(dwarf::DW_TAG_variable);
|
||||
addString(ElemDie, dwarf::DW_AT_name, DV.getName());
|
||||
addType(ElemDie, DV.getType());
|
||||
addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
|
||||
addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
|
||||
addFlag(ElemDie, dwarf::DW_AT_declaration);
|
||||
addFlag(ElemDie, dwarf::DW_AT_external);
|
||||
addSourceLine(ElemDie, DV);
|
||||
} else if (Element.isDerivedType()) {
|
||||
DIDerivedType DDTy(Element);
|
||||
@ -883,7 +892,7 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
|
||||
}
|
||||
|
||||
if (CTy.isAppleBlockExtension())
|
||||
addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
|
||||
addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
|
||||
|
||||
DICompositeType ContainingType = CTy.getContainingType();
|
||||
if (DIDescriptor(ContainingType).isCompositeType())
|
||||
@ -895,8 +904,7 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
|
||||
}
|
||||
|
||||
if (CTy.isObjcClassComplete())
|
||||
addUInt(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type,
|
||||
dwarf::DW_FORM_flag, 1);
|
||||
addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
|
||||
|
||||
// Add template parameters to a class, structure or union types.
|
||||
// FIXME: The support isn't in the metadata for this yet.
|
||||
@ -929,7 +937,7 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
|
||||
|
||||
// If we're a forward decl, say so.
|
||||
if (CTy.isForwardDecl())
|
||||
addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
|
||||
addFlag(&Buffer, dwarf::DW_AT_declaration);
|
||||
|
||||
// Add source line info if available.
|
||||
if (!CTy.isForwardDecl())
|
||||
@ -1062,7 +1070,7 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
|
||||
(Language == dwarf::DW_LANG_C89 ||
|
||||
Language == dwarf::DW_LANG_C99 ||
|
||||
Language == dwarf::DW_LANG_ObjC))
|
||||
addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
|
||||
addFlag(SPDie, dwarf::DW_AT_prototyped);
|
||||
|
||||
// Add Return Type.
|
||||
DICompositeType SPTy = SP.getType();
|
||||
@ -1086,7 +1094,7 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
|
||||
}
|
||||
|
||||
if (!SP.isDefinition()) {
|
||||
addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
|
||||
addFlag(SPDie, dwarf::DW_AT_declaration);
|
||||
|
||||
// Add arguments. Do not add arguments for subprogram definition. They will
|
||||
// be handled while processing variables.
|
||||
@ -1100,19 +1108,19 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
|
||||
DIType ATy = DIType(DIType(Args.getElement(i)));
|
||||
addType(Arg, ATy);
|
||||
if (ATy.isArtificial())
|
||||
addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
|
||||
addFlag(Arg, dwarf::DW_AT_artificial);
|
||||
SPDie->addChild(Arg);
|
||||
}
|
||||
}
|
||||
|
||||
if (SP.isArtificial())
|
||||
addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
|
||||
addFlag(SPDie, dwarf::DW_AT_artificial);
|
||||
|
||||
if (!SP.isLocalToUnit())
|
||||
addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
|
||||
addFlag(SPDie, dwarf::DW_AT_external);
|
||||
|
||||
if (SP.isOptimized())
|
||||
addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
|
||||
addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
|
||||
|
||||
if (unsigned isa = Asm->getISAEncoding()) {
|
||||
addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
|
||||
@ -1175,7 +1183,7 @@ void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
|
||||
|
||||
// Add scoping info.
|
||||
if (!GV.isLocalToUnit())
|
||||
addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
|
||||
addFlag(VariableDIE, dwarf::DW_AT_external);
|
||||
|
||||
// Add line number info.
|
||||
addSourceLine(VariableDIE, GV);
|
||||
@ -1200,8 +1208,7 @@ void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
|
||||
addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
|
||||
dwarf::DW_FORM_ref4, VariableDIE);
|
||||
addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
|
||||
addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag,
|
||||
1);
|
||||
addFlag(VariableDIE, dwarf::DW_AT_declaration);
|
||||
addDie(VariableSpecDIE);
|
||||
} else {
|
||||
addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
|
||||
@ -1267,7 +1274,7 @@ void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
|
||||
DICompositeType *CTy) {
|
||||
Buffer.setTag(dwarf::DW_TAG_array_type);
|
||||
if (CTy->getTag() == dwarf::DW_TAG_vector_type)
|
||||
addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
|
||||
addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
|
||||
|
||||
// Emit derived type.
|
||||
addType(&Buffer, CTy->getTypeDerivedFrom());
|
||||
@ -1340,8 +1347,7 @@ DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
|
||||
}
|
||||
|
||||
if (DV->isArtificial())
|
||||
addUInt(VariableDie, dwarf::DW_AT_artificial,
|
||||
dwarf::DW_FORM_flag, 1);
|
||||
addFlag(VariableDie, dwarf::DW_AT_artificial);
|
||||
|
||||
if (isScopeAbstract) {
|
||||
DV->setDIE(VariableDie);
|
||||
|
@ -176,6 +176,9 @@ public:
|
||||
}
|
||||
public:
|
||||
|
||||
/// addFlag - Add a flag that is true to the DIE.
|
||||
void addFlag(DIE *Die, unsigned Attribute);
|
||||
|
||||
/// addUInt - Add an unsigned integer attribute data and value.
|
||||
///
|
||||
void addUInt(DIE *Die, unsigned Attribute, unsigned Form, uint64_t Integer);
|
||||
|
@ -317,7 +317,7 @@ DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
|
||||
if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
|
||||
!SP.getContext().isFile() &&
|
||||
!isSubprogramContext(SP.getContext())) {
|
||||
SPCU->addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
|
||||
SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
|
||||
|
||||
// Add arguments.
|
||||
DICompositeType SPTy = SP.getType();
|
||||
@ -329,7 +329,7 @@ DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
|
||||
DIType ATy = DIType(DIType(Args.getElement(i)));
|
||||
SPCU->addType(Arg, ATy);
|
||||
if (ATy.isArtificial())
|
||||
SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
|
||||
SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
|
||||
SPDie->addChild(Arg);
|
||||
}
|
||||
DIE *SPDeclDie = SPDie;
|
||||
@ -610,7 +610,7 @@ CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
|
||||
if (!CompilationDir.empty())
|
||||
NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
|
||||
if (DIUnit.isOptimized())
|
||||
NewCU->addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
|
||||
NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
|
||||
|
||||
StringRef Flags = DIUnit.getFlags();
|
||||
if (!Flags.empty())
|
||||
@ -1481,8 +1481,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
|
||||
DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
|
||||
|
||||
if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
|
||||
TheCU->addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
|
||||
dwarf::DW_FORM_flag, 1);
|
||||
TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
|
||||
|
||||
DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
|
||||
MMI->getFrameMoves()));
|
||||
|
@ -7,15 +7,15 @@
|
||||
; first check that we have a TAG_subprogram at a given offset and it has
|
||||
; AT_inline.
|
||||
|
||||
; CHECK: 0x00000130: DW_TAG_subprogram [18]
|
||||
; CHECK: 0x0000011e: DW_TAG_subprogram [18]
|
||||
; CHECK-NEXT: DW_AT_specification
|
||||
; CHECK-NEXT: DW_AT_inline
|
||||
|
||||
|
||||
; and then that a TAG_subprogram refers to it with AT_abstract_origin.
|
||||
|
||||
; CHECK: 0x00000174: DW_TAG_subprogram [20]
|
||||
; CHECK-NEXT: DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x0130 => {0x00000130})
|
||||
; CHECK: 0x0000015f: DW_TAG_subprogram [20]
|
||||
; CHECK-NEXT: DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x011e => {0x0000011e})
|
||||
|
||||
define i32 @_ZN17nsAutoRefCnt7ReleaseEv() {
|
||||
entry:
|
||||
|
@ -16,8 +16,8 @@
|
||||
|
||||
; Verify that we refer to 'yyyy' with a relocation.
|
||||
; LINUX: .long .Lstring3 # DW_AT_name
|
||||
; LINUX-NEXT: .long 39 # DW_AT_type
|
||||
; LINUX-NEXT: .byte 1 # DW_AT_external
|
||||
; LINUX-NEXT: .long 38 # DW_AT_type
|
||||
; LINUX-NEXT: # DW_AT_external
|
||||
; LINUX-NEXT: .byte 1 # DW_AT_decl_file
|
||||
; LINUX-NEXT: .byte 1 # DW_AT_decl_line
|
||||
; LINUX-NEXT: .byte 9 # DW_AT_location
|
||||
|
Loading…
Reference in New Issue
Block a user