mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-26 22:34:39 +00:00
DebugInfo: Put each kind of constant (form, attribute, tag, etc) into its own enum for ease of use.
This allows various variables to be more self-documenting and easier to debug by being of specific types without overlapping enum values. Precommit review by Eric Christopher. llvm-svn: 193091
This commit is contained in:
parent
34304975c5
commit
e9f0bff07e
@ -68,8 +68,7 @@ enum LLVMConstants LLVM_ENUM_INT_TYPE(uint32_t) {
|
||||
const uint32_t DW_CIE_ID = UINT32_MAX;
|
||||
const uint64_t DW64_CIE_ID = UINT64_MAX;
|
||||
|
||||
enum Constants {
|
||||
// Tags
|
||||
enum Tag LLVM_ENUM_INT_TYPE(uint16_t) {
|
||||
DW_TAG_array_type = 0x01,
|
||||
DW_TAG_class_type = 0x02,
|
||||
DW_TAG_entry_point = 0x03,
|
||||
@ -139,12 +138,10 @@ enum Constants {
|
||||
DW_TAG_GNU_formal_parameter_pack = 0x4108,
|
||||
DW_TAG_lo_user = 0x4080,
|
||||
DW_TAG_APPLE_property = 0x4200,
|
||||
DW_TAG_hi_user = 0xffff,
|
||||
|
||||
// Children flag
|
||||
DW_CHILDREN_no = 0x00,
|
||||
DW_CHILDREN_yes = 0x01,
|
||||
DW_TAG_hi_user = 0xffff
|
||||
};
|
||||
|
||||
enum Attribute LLVM_ENUM_INT_TYPE(uint16_t) {
|
||||
// Attributes
|
||||
DW_AT_sibling = 0x01,
|
||||
DW_AT_location = 0x02,
|
||||
@ -295,8 +292,10 @@ enum Constants {
|
||||
DW_AT_APPLE_property_setter = 0x3fea,
|
||||
DW_AT_APPLE_property_attribute = 0x3feb,
|
||||
DW_AT_APPLE_objc_complete_type = 0x3fec,
|
||||
DW_AT_APPLE_property = 0x3fed,
|
||||
DW_AT_APPLE_property = 0x3fed
|
||||
};
|
||||
|
||||
enum Form LLVM_ENUM_INT_TYPE(uint16_t) {
|
||||
// Attribute form encodings
|
||||
DW_FORM_addr = 0x01,
|
||||
DW_FORM_block2 = 0x03,
|
||||
@ -326,8 +325,10 @@ enum Constants {
|
||||
|
||||
// Extensions for Fission proposal
|
||||
DW_FORM_GNU_addr_index = 0x1f01,
|
||||
DW_FORM_GNU_str_index = 0x1f02,
|
||||
DW_FORM_GNU_str_index = 0x1f02
|
||||
};
|
||||
|
||||
enum LocationAtom {
|
||||
// Operation encodings
|
||||
DW_OP_addr = 0x03,
|
||||
DW_OP_deref = 0x06,
|
||||
@ -491,8 +492,10 @@ enum Constants {
|
||||
|
||||
// Extensions for Fission proposal.
|
||||
DW_OP_GNU_addr_index = 0xfb,
|
||||
DW_OP_GNU_const_index = 0xfc,
|
||||
DW_OP_GNU_const_index = 0xfc
|
||||
};
|
||||
|
||||
enum TypeKind {
|
||||
// Encoding attribute values
|
||||
DW_ATE_address = 0x01,
|
||||
DW_ATE_boolean = 0x02,
|
||||
@ -511,37 +514,49 @@ enum Constants {
|
||||
DW_ATE_decimal_float = 0x0f,
|
||||
DW_ATE_UTF = 0x10,
|
||||
DW_ATE_lo_user = 0x80,
|
||||
DW_ATE_hi_user = 0xff,
|
||||
DW_ATE_hi_user = 0xff
|
||||
};
|
||||
|
||||
enum DecimalSignEncoding {
|
||||
// Decimal sign attribute values
|
||||
DW_DS_unsigned = 0x01,
|
||||
DW_DS_leading_overpunch = 0x02,
|
||||
DW_DS_trailing_overpunch = 0x03,
|
||||
DW_DS_leading_separate = 0x04,
|
||||
DW_DS_trailing_separate = 0x05,
|
||||
DW_DS_trailing_separate = 0x05
|
||||
};
|
||||
|
||||
enum EndianityEncoding {
|
||||
// Endianity attribute values
|
||||
DW_END_default = 0x00,
|
||||
DW_END_big = 0x01,
|
||||
DW_END_little = 0x02,
|
||||
DW_END_lo_user = 0x40,
|
||||
DW_END_hi_user = 0xff,
|
||||
DW_END_hi_user = 0xff
|
||||
};
|
||||
|
||||
enum AccessAttribute {
|
||||
// Accessibility codes
|
||||
DW_ACCESS_public = 0x01,
|
||||
DW_ACCESS_protected = 0x02,
|
||||
DW_ACCESS_private = 0x03,
|
||||
DW_ACCESS_private = 0x03
|
||||
};
|
||||
|
||||
enum VisibilityAttribute {
|
||||
// Visibility codes
|
||||
DW_VIS_local = 0x01,
|
||||
DW_VIS_exported = 0x02,
|
||||
DW_VIS_qualified = 0x03,
|
||||
DW_VIS_qualified = 0x03
|
||||
};
|
||||
|
||||
enum VirtualityAttribute {
|
||||
// Virtuality codes
|
||||
DW_VIRTUALITY_none = 0x00,
|
||||
DW_VIRTUALITY_virtual = 0x01,
|
||||
DW_VIRTUALITY_pure_virtual = 0x02,
|
||||
DW_VIRTUALITY_pure_virtual = 0x02
|
||||
};
|
||||
|
||||
enum SourceLanguage {
|
||||
// Language names
|
||||
DW_LANG_C89 = 0x0001,
|
||||
DW_LANG_C = 0x0002,
|
||||
@ -565,35 +580,47 @@ enum Constants {
|
||||
DW_LANG_Python = 0x0014,
|
||||
DW_LANG_lo_user = 0x8000,
|
||||
DW_LANG_Mips_Assembler = 0x8001,
|
||||
DW_LANG_hi_user = 0xffff,
|
||||
DW_LANG_hi_user = 0xffff
|
||||
};
|
||||
|
||||
enum CaseSensitivity {
|
||||
// Identifier case codes
|
||||
DW_ID_case_sensitive = 0x00,
|
||||
DW_ID_up_case = 0x01,
|
||||
DW_ID_down_case = 0x02,
|
||||
DW_ID_case_insensitive = 0x03,
|
||||
DW_ID_case_insensitive = 0x03
|
||||
};
|
||||
|
||||
enum CallingConvention {
|
||||
// Calling convention codes
|
||||
DW_CC_normal = 0x01,
|
||||
DW_CC_program = 0x02,
|
||||
DW_CC_nocall = 0x03,
|
||||
DW_CC_lo_user = 0x40,
|
||||
DW_CC_hi_user = 0xff,
|
||||
DW_CC_hi_user = 0xff
|
||||
};
|
||||
|
||||
enum InlineAttribute {
|
||||
// Inline codes
|
||||
DW_INL_not_inlined = 0x00,
|
||||
DW_INL_inlined = 0x01,
|
||||
DW_INL_declared_not_inlined = 0x02,
|
||||
DW_INL_declared_inlined = 0x03,
|
||||
DW_INL_declared_inlined = 0x03
|
||||
};
|
||||
|
||||
enum ArrayDimensionOrdering {
|
||||
// Array ordering
|
||||
DW_ORD_row_major = 0x00,
|
||||
DW_ORD_col_major = 0x01,
|
||||
DW_ORD_col_major = 0x01
|
||||
};
|
||||
|
||||
enum DiscriminantList {
|
||||
// Discriminant descriptor values
|
||||
DW_DSC_label = 0x00,
|
||||
DW_DSC_range = 0x01,
|
||||
DW_DSC_range = 0x01
|
||||
};
|
||||
|
||||
enum LineNumberOps {
|
||||
// Line Number Standard Opcode Encodings
|
||||
DW_LNS_extended_op = 0x00,
|
||||
DW_LNS_copy = 0x01,
|
||||
@ -607,23 +634,29 @@ enum Constants {
|
||||
DW_LNS_fixed_advance_pc = 0x09,
|
||||
DW_LNS_set_prologue_end = 0x0a,
|
||||
DW_LNS_set_epilogue_begin = 0x0b,
|
||||
DW_LNS_set_isa = 0x0c,
|
||||
DW_LNS_set_isa = 0x0c
|
||||
};
|
||||
|
||||
enum LineNumberExtendedOps {
|
||||
// Line Number Extended Opcode Encodings
|
||||
DW_LNE_end_sequence = 0x01,
|
||||
DW_LNE_set_address = 0x02,
|
||||
DW_LNE_define_file = 0x03,
|
||||
DW_LNE_set_discriminator = 0x04,
|
||||
DW_LNE_lo_user = 0x80,
|
||||
DW_LNE_hi_user = 0xff,
|
||||
DW_LNE_hi_user = 0xff
|
||||
};
|
||||
|
||||
enum MacinfoRecordType {
|
||||
// Macinfo Type Encodings
|
||||
DW_MACINFO_define = 0x01,
|
||||
DW_MACINFO_undef = 0x02,
|
||||
DW_MACINFO_start_file = 0x03,
|
||||
DW_MACINFO_end_file = 0x04,
|
||||
DW_MACINFO_vendor_ext = 0xff,
|
||||
DW_MACINFO_vendor_ext = 0xff
|
||||
};
|
||||
|
||||
enum CallFrameInfo {
|
||||
// Call frame instruction encodings
|
||||
DW_CFA_extended = 0x00,
|
||||
DW_CFA_nop = 0x00,
|
||||
@ -656,7 +689,13 @@ enum Constants {
|
||||
DW_CFA_GNU_window_save = 0x2d,
|
||||
DW_CFA_GNU_args_size = 0x2e,
|
||||
DW_CFA_lo_user = 0x1c,
|
||||
DW_CFA_hi_user = 0x3f,
|
||||
DW_CFA_hi_user = 0x3f
|
||||
};
|
||||
|
||||
enum Constants {
|
||||
// Children flag
|
||||
DW_CHILDREN_no = 0x00,
|
||||
DW_CHILDREN_yes = 0x01,
|
||||
|
||||
DW_EH_PE_absptr = 0x00,
|
||||
DW_EH_PE_omit = 0xff,
|
||||
@ -674,8 +713,10 @@ enum Constants {
|
||||
DW_EH_PE_datarel = 0x30,
|
||||
DW_EH_PE_funcrel = 0x40,
|
||||
DW_EH_PE_aligned = 0x50,
|
||||
DW_EH_PE_indirect = 0x80,
|
||||
DW_EH_PE_indirect = 0x80
|
||||
};
|
||||
|
||||
enum ApplePropertyAttributes {
|
||||
// Apple Objective-C Property Attributes
|
||||
DW_APPLE_PROPERTY_readonly = 0x01,
|
||||
DW_APPLE_PROPERTY_readwrite = 0x02,
|
||||
|
@ -187,7 +187,7 @@ void DIEValue::dump() const {
|
||||
|
||||
/// EmitValue - Emit integer of appropriate size.
|
||||
///
|
||||
void DIEInteger::EmitValue(AsmPrinter *Asm, uint16_t Form) const {
|
||||
void DIEInteger::EmitValue(AsmPrinter *Asm, dwarf::Form Form) const {
|
||||
unsigned Size = ~0U;
|
||||
switch (Form) {
|
||||
case dwarf::DW_FORM_flag_present:
|
||||
@ -219,7 +219,7 @@ void DIEInteger::EmitValue(AsmPrinter *Asm, uint16_t Form) const {
|
||||
|
||||
/// SizeOf - Determine size of integer value in bytes.
|
||||
///
|
||||
unsigned DIEInteger::SizeOf(AsmPrinter *AP, uint16_t Form) const {
|
||||
unsigned DIEInteger::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
|
||||
switch (Form) {
|
||||
case dwarf::DW_FORM_flag_present: return 0;
|
||||
case dwarf::DW_FORM_flag: // Fall thru
|
||||
@ -254,13 +254,13 @@ void DIEInteger::print(raw_ostream &O) const {
|
||||
|
||||
/// EmitValue - Emit expression value.
|
||||
///
|
||||
void DIEExpr::EmitValue(AsmPrinter *AP, uint16_t Form) const {
|
||||
void DIEExpr::EmitValue(AsmPrinter *AP, dwarf::Form Form) const {
|
||||
AP->OutStreamer.EmitValue(Expr, SizeOf(AP, Form));
|
||||
}
|
||||
|
||||
/// SizeOf - Determine size of expression value in bytes.
|
||||
///
|
||||
unsigned DIEExpr::SizeOf(AsmPrinter *AP, uint16_t Form) const {
|
||||
unsigned DIEExpr::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
|
||||
if (Form == dwarf::DW_FORM_data4) return 4;
|
||||
if (Form == dwarf::DW_FORM_sec_offset) return 4;
|
||||
if (Form == dwarf::DW_FORM_strp) return 4;
|
||||
@ -280,15 +280,16 @@ void DIEExpr::print(raw_ostream &O) const {
|
||||
|
||||
/// EmitValue - Emit label value.
|
||||
///
|
||||
void DIELabel::EmitValue(AsmPrinter *AP, uint16_t Form) const {
|
||||
AP->EmitLabelReference(Label, SizeOf(AP, Form), Form == dwarf::DW_FORM_strp
|
||||
|| Form == dwarf::DW_FORM_sec_offset || Form == dwarf::DW_OP_call_ref
|
||||
|| Form == dwarf::DW_FORM_ref_addr);
|
||||
void DIELabel::EmitValue(AsmPrinter *AP, dwarf::Form Form) const {
|
||||
AP->EmitLabelReference(Label, SizeOf(AP, Form),
|
||||
Form == dwarf::DW_FORM_strp ||
|
||||
Form == dwarf::DW_FORM_sec_offset ||
|
||||
Form == dwarf::DW_FORM_ref_addr);
|
||||
}
|
||||
|
||||
/// SizeOf - Determine size of label value in bytes.
|
||||
///
|
||||
unsigned DIELabel::SizeOf(AsmPrinter *AP, uint16_t Form) const {
|
||||
unsigned DIELabel::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
|
||||
if (Form == dwarf::DW_FORM_data4) return 4;
|
||||
if (Form == dwarf::DW_FORM_sec_offset) return 4;
|
||||
if (Form == dwarf::DW_FORM_strp) return 4;
|
||||
@ -307,13 +308,13 @@ void DIELabel::print(raw_ostream &O) const {
|
||||
|
||||
/// EmitValue - Emit delta value.
|
||||
///
|
||||
void DIEDelta::EmitValue(AsmPrinter *AP, uint16_t Form) const {
|
||||
void DIEDelta::EmitValue(AsmPrinter *AP, dwarf::Form Form) const {
|
||||
AP->EmitLabelDifference(LabelHi, LabelLo, SizeOf(AP, Form));
|
||||
}
|
||||
|
||||
/// SizeOf - Determine size of delta value in bytes.
|
||||
///
|
||||
unsigned DIEDelta::SizeOf(AsmPrinter *AP, uint16_t Form) const {
|
||||
unsigned DIEDelta::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
|
||||
if (Form == dwarf::DW_FORM_data4) return 4;
|
||||
if (Form == dwarf::DW_FORM_strp) return 4;
|
||||
return AP->getDataLayout().getPointerSize();
|
||||
@ -331,13 +332,13 @@ void DIEDelta::print(raw_ostream &O) const {
|
||||
|
||||
/// EmitValue - Emit string value.
|
||||
///
|
||||
void DIEString::EmitValue(AsmPrinter *AP, uint16_t Form) const {
|
||||
void DIEString::EmitValue(AsmPrinter *AP, dwarf::Form Form) const {
|
||||
Access->EmitValue(AP, Form);
|
||||
}
|
||||
|
||||
/// SizeOf - Determine size of delta value in bytes.
|
||||
///
|
||||
unsigned DIEString::SizeOf(AsmPrinter *AP, uint16_t Form) const {
|
||||
unsigned DIEString::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
|
||||
return Access->SizeOf(AP, Form);
|
||||
}
|
||||
|
||||
@ -354,7 +355,7 @@ void DIEString::print(raw_ostream &O) const {
|
||||
|
||||
/// EmitValue - Emit debug information entry offset.
|
||||
///
|
||||
void DIEEntry::EmitValue(AsmPrinter *AP, uint16_t Form) const {
|
||||
void DIEEntry::EmitValue(AsmPrinter *AP, dwarf::Form Form) const {
|
||||
AP->EmitInt32(Entry->getOffset());
|
||||
}
|
||||
|
||||
@ -392,7 +393,7 @@ unsigned DIEBlock::ComputeSize(AsmPrinter *AP) {
|
||||
|
||||
/// EmitValue - Emit block data.
|
||||
///
|
||||
void DIEBlock::EmitValue(AsmPrinter *Asm, uint16_t Form) const {
|
||||
void DIEBlock::EmitValue(AsmPrinter *Asm, dwarf::Form Form) const {
|
||||
switch (Form) {
|
||||
default: llvm_unreachable("Improper form for block");
|
||||
case dwarf::DW_FORM_block1: Asm->EmitInt8(Size); break;
|
||||
@ -408,7 +409,7 @@ void DIEBlock::EmitValue(AsmPrinter *Asm, uint16_t Form) const {
|
||||
|
||||
/// SizeOf - Determine size of block data in bytes.
|
||||
///
|
||||
unsigned DIEBlock::SizeOf(AsmPrinter *AP, uint16_t Form) const {
|
||||
unsigned DIEBlock::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
|
||||
switch (Form) {
|
||||
case dwarf::DW_FORM_block1: return Size + sizeof(int8_t);
|
||||
case dwarf::DW_FORM_block2: return Size + sizeof(int16_t);
|
||||
|
@ -33,17 +33,17 @@ namespace llvm {
|
||||
class DIEAbbrevData {
|
||||
/// Attribute - Dwarf attribute code.
|
||||
///
|
||||
uint16_t Attribute;
|
||||
dwarf::Attribute Attribute;
|
||||
|
||||
/// Form - Dwarf form code.
|
||||
///
|
||||
uint16_t Form;
|
||||
dwarf::Form Form;
|
||||
public:
|
||||
DIEAbbrevData(uint16_t A, uint16_t F) : Attribute(A), Form(F) {}
|
||||
DIEAbbrevData(dwarf::Attribute A, dwarf::Form F) : Attribute(A), Form(F) {}
|
||||
|
||||
// Accessors.
|
||||
uint16_t getAttribute() const { return Attribute; }
|
||||
uint16_t getForm() const { return Form; }
|
||||
dwarf::Attribute getAttribute() const { return Attribute; }
|
||||
dwarf::Form getForm() const { return Form; }
|
||||
|
||||
/// Profile - Used to gather unique data for the abbreviation folding set.
|
||||
///
|
||||
@ -56,7 +56,7 @@ namespace llvm {
|
||||
class DIEAbbrev : public FoldingSetNode {
|
||||
/// Tag - Dwarf tag code.
|
||||
///
|
||||
uint16_t Tag;
|
||||
dwarf::Tag Tag;
|
||||
|
||||
/// ChildrenFlag - Dwarf children flag.
|
||||
///
|
||||
@ -71,10 +71,10 @@ namespace llvm {
|
||||
SmallVector<DIEAbbrevData, 12> Data;
|
||||
|
||||
public:
|
||||
DIEAbbrev(uint16_t T, uint16_t C) : Tag(T), ChildrenFlag(C), Data() {}
|
||||
DIEAbbrev(dwarf::Tag T, uint16_t C) : Tag(T), ChildrenFlag(C), Data() {}
|
||||
|
||||
// Accessors.
|
||||
uint16_t getTag() const { return Tag; }
|
||||
dwarf::Tag getTag() const { return Tag; }
|
||||
unsigned getNumber() const { return Number; }
|
||||
uint16_t getChildrenFlag() const { return ChildrenFlag; }
|
||||
const SmallVectorImpl<DIEAbbrevData> &getData() const { return Data; }
|
||||
@ -83,7 +83,7 @@ namespace llvm {
|
||||
|
||||
/// AddAttribute - Adds another set of attribute information to the
|
||||
/// abbreviation.
|
||||
void AddAttribute(uint16_t Attribute, uint16_t Form) {
|
||||
void AddAttribute(dwarf::Attribute Attribute, dwarf::Form Form) {
|
||||
Data.push_back(DIEAbbrevData(Attribute, Form));
|
||||
}
|
||||
|
||||
@ -136,13 +136,14 @@ namespace llvm {
|
||||
#endif
|
||||
public:
|
||||
explicit DIE(unsigned Tag)
|
||||
: Offset(0), Size(0), Abbrev(Tag, dwarf::DW_CHILDREN_no), Parent(0) {}
|
||||
: Offset(0), Size(0), Abbrev((dwarf::Tag)Tag, dwarf::DW_CHILDREN_no),
|
||||
Parent(0) {}
|
||||
virtual ~DIE();
|
||||
|
||||
// Accessors.
|
||||
DIEAbbrev &getAbbrev() { return Abbrev; }
|
||||
unsigned getAbbrevNumber() const { return Abbrev.getNumber(); }
|
||||
uint16_t getTag() const { return Abbrev.getTag(); }
|
||||
dwarf::Tag getTag() const { return Abbrev.getTag(); }
|
||||
unsigned getOffset() const { return Offset; }
|
||||
unsigned getSize() const { return Size; }
|
||||
const std::vector<DIE *> &getChildren() const { return Children; }
|
||||
@ -153,7 +154,8 @@ namespace llvm {
|
||||
|
||||
/// addValue - Add a value and attributes to a DIE.
|
||||
///
|
||||
void addValue(uint16_t Attribute, uint16_t Form, DIEValue *Value) {
|
||||
void addValue(dwarf::Attribute Attribute, dwarf::Form Form,
|
||||
DIEValue *Value) {
|
||||
Abbrev.AddAttribute(Attribute, Form);
|
||||
Values.push_back(Value);
|
||||
}
|
||||
@ -205,11 +207,11 @@ namespace llvm {
|
||||
|
||||
/// EmitValue - Emit value via the Dwarf writer.
|
||||
///
|
||||
virtual void EmitValue(AsmPrinter *AP, uint16_t Form) const = 0;
|
||||
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const = 0;
|
||||
|
||||
/// SizeOf - Return the size of a value in bytes.
|
||||
///
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, uint16_t Form) const = 0;
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const = 0;
|
||||
|
||||
#ifndef NDEBUG
|
||||
virtual void print(raw_ostream &O) const = 0;
|
||||
@ -227,7 +229,7 @@ namespace llvm {
|
||||
|
||||
/// BestForm - Choose the best form for integer.
|
||||
///
|
||||
static uint16_t BestForm(bool IsSigned, uint64_t Int) {
|
||||
static dwarf::Form BestForm(bool IsSigned, uint64_t Int) {
|
||||
if (IsSigned) {
|
||||
const int64_t SignedInt = Int;
|
||||
if ((char)Int == SignedInt) return dwarf::DW_FORM_data1;
|
||||
@ -243,13 +245,13 @@ namespace llvm {
|
||||
|
||||
/// EmitValue - Emit integer of appropriate size.
|
||||
///
|
||||
virtual void EmitValue(AsmPrinter *AP, uint16_t Form) const;
|
||||
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const;
|
||||
|
||||
uint64_t getValue() const { return Integer; }
|
||||
|
||||
/// SizeOf - Determine size of integer value in bytes.
|
||||
///
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, uint16_t Form) const;
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const;
|
||||
|
||||
// Implement isa/cast/dyncast.
|
||||
static bool classof(const DIEValue *I) { return I->getType() == isInteger; }
|
||||
@ -269,7 +271,7 @@ namespace llvm {
|
||||
|
||||
/// EmitValue - Emit expression value.
|
||||
///
|
||||
virtual void EmitValue(AsmPrinter *AP, uint16_t Form) const;
|
||||
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const;
|
||||
|
||||
/// getValue - Get MCExpr.
|
||||
///
|
||||
@ -277,7 +279,7 @@ namespace llvm {
|
||||
|
||||
/// SizeOf - Determine size of expression value in bytes.
|
||||
///
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, uint16_t Form) const;
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const;
|
||||
|
||||
// Implement isa/cast/dyncast.
|
||||
static bool classof(const DIEValue *E) { return E->getType() == isExpr; }
|
||||
@ -297,7 +299,7 @@ namespace llvm {
|
||||
|
||||
/// EmitValue - Emit label value.
|
||||
///
|
||||
virtual void EmitValue(AsmPrinter *AP, uint16_t Form) const;
|
||||
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const;
|
||||
|
||||
/// getValue - Get MCSymbol.
|
||||
///
|
||||
@ -305,7 +307,7 @@ namespace llvm {
|
||||
|
||||
/// SizeOf - Determine size of label value in bytes.
|
||||
///
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, uint16_t Form) const;
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const;
|
||||
|
||||
// Implement isa/cast/dyncast.
|
||||
static bool classof(const DIEValue *L) { return L->getType() == isLabel; }
|
||||
@ -327,11 +329,11 @@ namespace llvm {
|
||||
|
||||
/// EmitValue - Emit delta value.
|
||||
///
|
||||
virtual void EmitValue(AsmPrinter *AP, uint16_t Form) const;
|
||||
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const;
|
||||
|
||||
/// SizeOf - Determine size of delta value in bytes.
|
||||
///
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, uint16_t Form) const;
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const;
|
||||
|
||||
// Implement isa/cast/dyncast.
|
||||
static bool classof(const DIEValue *D) { return D->getType() == isDelta; }
|
||||
@ -357,11 +359,11 @@ namespace llvm {
|
||||
|
||||
/// EmitValue - Emit delta value.
|
||||
///
|
||||
virtual void EmitValue(AsmPrinter *AP, uint16_t Form) const;
|
||||
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const;
|
||||
|
||||
/// SizeOf - Determine size of delta value in bytes.
|
||||
///
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, uint16_t Form) const;
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const;
|
||||
|
||||
// Implement isa/cast/dyncast.
|
||||
static bool classof(const DIEValue *D) { return D->getType() == isString; }
|
||||
@ -386,11 +388,11 @@ namespace llvm {
|
||||
|
||||
/// EmitValue - Emit debug information entry offset.
|
||||
///
|
||||
virtual void EmitValue(AsmPrinter *AP, uint16_t Form) const;
|
||||
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const;
|
||||
|
||||
/// SizeOf - Determine size of debug information entry in bytes.
|
||||
///
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, uint16_t Form) const {
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
|
||||
return Form == dwarf::DW_FORM_ref_addr ? getRefAddrSize(AP)
|
||||
: sizeof(int32_t);
|
||||
}
|
||||
@ -412,9 +414,7 @@ namespace llvm {
|
||||
class DIEBlock : public DIEValue, public DIE {
|
||||
unsigned Size; // Size in bytes excluding size header.
|
||||
public:
|
||||
DIEBlock()
|
||||
: DIEValue(isBlock), DIE(0), Size(0) {}
|
||||
virtual ~DIEBlock() {}
|
||||
DIEBlock() : DIEValue(isBlock), DIE(0), Size(0) {}
|
||||
|
||||
/// ComputeSize - calculate the size of the block.
|
||||
///
|
||||
@ -422,7 +422,7 @@ namespace llvm {
|
||||
|
||||
/// BestForm - Choose the best form for data.
|
||||
///
|
||||
uint16_t BestForm() const {
|
||||
dwarf::Form BestForm() const {
|
||||
if ((unsigned char)Size == Size) return dwarf::DW_FORM_block1;
|
||||
if ((unsigned short)Size == Size) return dwarf::DW_FORM_block2;
|
||||
if ((unsigned int)Size == Size) return dwarf::DW_FORM_block4;
|
||||
@ -431,11 +431,11 @@ namespace llvm {
|
||||
|
||||
/// EmitValue - Emit block data.
|
||||
///
|
||||
virtual void EmitValue(AsmPrinter *AP, uint16_t Form) const;
|
||||
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const;
|
||||
|
||||
/// SizeOf - Determine size of block data in bytes.
|
||||
///
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, uint16_t Form) const;
|
||||
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const;
|
||||
|
||||
// Implement isa/cast/dyncast.
|
||||
static bool classof(const DIEValue *E) { return E->getType() == isBlock; }
|
||||
|
@ -96,7 +96,7 @@ int64_t CompileUnit::getDefaultLowerBound() const {
|
||||
}
|
||||
|
||||
/// addFlag - Add a flag that is true.
|
||||
void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
|
||||
void CompileUnit::addFlag(DIE *Die, dwarf::Attribute Attribute) {
|
||||
if (DD->getDwarfVersion() >= 4)
|
||||
Die->addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
|
||||
else
|
||||
@ -105,23 +105,32 @@ void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
|
||||
|
||||
/// addUInt - Add an unsigned integer attribute data and value.
|
||||
///
|
||||
void CompileUnit::addUInt(DIE *Die, uint16_t Attribute, uint16_t Form,
|
||||
uint64_t Integer) {
|
||||
void CompileUnit::addUInt(DIE *Die, dwarf::Attribute Attribute,
|
||||
Optional<dwarf::Form> Form, uint64_t Integer) {
|
||||
if (!Form)
|
||||
Form = DIEInteger::BestForm(false, Integer);
|
||||
DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
|
||||
DIEInteger(Integer);
|
||||
Die->addValue(Attribute, Form, Value);
|
||||
Die->addValue(Attribute, *Form, Value);
|
||||
}
|
||||
|
||||
void CompileUnit::addUInt(DIEBlock *Block, dwarf::Form Form, uint64_t Integer) {
|
||||
addUInt(Block, (dwarf::Attribute)0, Form, Integer);
|
||||
}
|
||||
|
||||
/// addSInt - Add an signed integer attribute data and value.
|
||||
///
|
||||
void CompileUnit::addSInt(DIE *Die, uint16_t Attribute, uint16_t Form,
|
||||
int64_t Integer) {
|
||||
void CompileUnit::addSInt(DIE *Die, dwarf::Attribute Attribute,
|
||||
Optional<dwarf::Form> Form, int64_t Integer) {
|
||||
if (!Form)
|
||||
Form = DIEInteger::BestForm(true, Integer);
|
||||
DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
|
||||
Die->addValue(Attribute, Form, Value);
|
||||
Die->addValue(Attribute, *Form, Value);
|
||||
}
|
||||
|
||||
void CompileUnit::addSInt(DIEBlock *Die, Optional<dwarf::Form> Form,
|
||||
int64_t Integer) {
|
||||
addSInt(Die, (dwarf::Attribute)0, Form, Integer);
|
||||
}
|
||||
|
||||
/// addString - Add a string attribute data and value. We always emit a
|
||||
@ -129,9 +138,9 @@ void CompileUnit::addSInt(DIE *Die, uint16_t Attribute, uint16_t Form,
|
||||
/// more predictable sizes. In the case of split dwarf we emit an index
|
||||
/// into another table which gets us the static offset into the string
|
||||
/// table.
|
||||
void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) {
|
||||
void CompileUnit::addString(DIE *Die, dwarf::Attribute Attribute, StringRef String) {
|
||||
DIEValue *Value;
|
||||
uint16_t Form;
|
||||
dwarf::Form Form;
|
||||
if (!DD->useSplitDwarf()) {
|
||||
MCSymbol *Symb = DU->getStringPoolEntry(String);
|
||||
if (Asm->needsRelocationsForDwarfStringPool())
|
||||
@ -152,7 +161,7 @@ void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) {
|
||||
|
||||
/// addLocalString - Add a string attribute data and value. This is guaranteed
|
||||
/// to be in the local string pool instead of indirected.
|
||||
void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute,
|
||||
void CompileUnit::addLocalString(DIE *Die, dwarf::Attribute Attribute,
|
||||
StringRef String) {
|
||||
MCSymbol *Symb = DU->getStringPoolEntry(String);
|
||||
DIEValue *Value;
|
||||
@ -167,24 +176,28 @@ void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute,
|
||||
|
||||
/// addExpr - Add a Dwarf expression attribute data and value.
|
||||
///
|
||||
void CompileUnit::addExpr(DIE *Die, uint16_t Attribute, uint16_t Form,
|
||||
const MCExpr *Expr) {
|
||||
void CompileUnit::addExpr(DIEBlock *Die, dwarf::Form Form, const MCExpr *Expr) {
|
||||
DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
|
||||
Die->addValue(Attribute, Form, Value);
|
||||
Die->addValue((dwarf::Attribute)0, Form, Value);
|
||||
}
|
||||
|
||||
/// addLabel - Add a Dwarf label attribute data and value.
|
||||
///
|
||||
void CompileUnit::addLabel(DIE *Die, uint16_t Attribute, uint16_t Form,
|
||||
void CompileUnit::addLabel(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
|
||||
const MCSymbol *Label) {
|
||||
DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
|
||||
Die->addValue(Attribute, Form, Value);
|
||||
}
|
||||
|
||||
void CompileUnit::addLabel(DIEBlock *Die, dwarf::Form Form,
|
||||
const MCSymbol *Label) {
|
||||
addLabel(Die, (dwarf::Attribute)0, Form, Label);
|
||||
}
|
||||
|
||||
/// addLabelAddress - Add a dwarf label attribute data and value using
|
||||
/// DW_FORM_addr or DW_FORM_GNU_addr_index.
|
||||
///
|
||||
void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute,
|
||||
void CompileUnit::addLabelAddress(DIE *Die, dwarf::Attribute Attribute,
|
||||
MCSymbol *Label) {
|
||||
if (Label)
|
||||
DD->addArangeLabel(SymbolCU(this, Label));
|
||||
@ -207,20 +220,20 @@ void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute,
|
||||
/// addOpAddress - Add a dwarf op address data and value using the
|
||||
/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
|
||||
///
|
||||
void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
|
||||
void CompileUnit::addOpAddress(DIEBlock *Die, const MCSymbol *Sym) {
|
||||
DD->addArangeLabel(SymbolCU(this, Sym));
|
||||
if (!DD->useSplitDwarf()) {
|
||||
addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
|
||||
addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
|
||||
addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
|
||||
addLabel(Die, dwarf::DW_FORM_udata, Sym);
|
||||
} else {
|
||||
addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
|
||||
addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
|
||||
addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
|
||||
addUInt(Die, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
|
||||
}
|
||||
}
|
||||
|
||||
/// addDelta - Add a label delta attribute data and value.
|
||||
///
|
||||
void CompileUnit::addDelta(DIE *Die, uint16_t Attribute, uint16_t Form,
|
||||
void CompileUnit::addDelta(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
|
||||
const MCSymbol *Hi, const MCSymbol *Lo) {
|
||||
DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
|
||||
Die->addValue(Attribute, Form, Value);
|
||||
@ -228,14 +241,14 @@ void CompileUnit::addDelta(DIE *Die, uint16_t Attribute, uint16_t Form,
|
||||
|
||||
/// addDIEEntry - Add a DIE attribute data and value.
|
||||
///
|
||||
void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, DIE *Entry) {
|
||||
void CompileUnit::addDIEEntry(DIE *Die, dwarf::Attribute Attribute, DIE *Entry) {
|
||||
// We currently only use ref4.
|
||||
Die->addValue(Attribute, dwarf::DW_FORM_ref4, createDIEEntry(Entry));
|
||||
}
|
||||
|
||||
/// addBlock - Add block data.
|
||||
///
|
||||
void CompileUnit::addBlock(DIE *Die, uint16_t Attribute, uint16_t Form,
|
||||
void CompileUnit::addBlock(DIE *Die, dwarf::Attribute Attribute,
|
||||
DIEBlock *Block) {
|
||||
Block->ComputeSize(Asm);
|
||||
DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
|
||||
@ -256,8 +269,8 @@ void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
|
||||
DD->getOrCreateSourceID(V.getContext().getFilename(),
|
||||
V.getContext().getDirectory(), getUniqueID());
|
||||
assert(FileID && "Invalid file id");
|
||||
addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
|
||||
addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
|
||||
addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
|
||||
addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
|
||||
}
|
||||
|
||||
/// addSourceLine - Add location information to specified debug information
|
||||
@ -273,8 +286,8 @@ void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
|
||||
unsigned FileID =
|
||||
DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(), getUniqueID());
|
||||
assert(FileID && "Invalid file id");
|
||||
addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
|
||||
addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
|
||||
addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
|
||||
addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
|
||||
}
|
||||
|
||||
/// addSourceLine - Add location information to specified debug information
|
||||
@ -292,8 +305,8 @@ void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
|
||||
unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(), SP.getDirectory(),
|
||||
getUniqueID());
|
||||
assert(FileID && "Invalid file id");
|
||||
addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
|
||||
addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
|
||||
addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
|
||||
addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
|
||||
}
|
||||
|
||||
/// addSourceLine - Add location information to specified debug information
|
||||
@ -309,8 +322,8 @@ void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
|
||||
unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(), Ty.getDirectory(),
|
||||
getUniqueID());
|
||||
assert(FileID && "Invalid file id");
|
||||
addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
|
||||
addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
|
||||
addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
|
||||
addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
|
||||
}
|
||||
|
||||
/// addSourceLine - Add location information to specified debug information
|
||||
@ -327,8 +340,8 @@ void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
|
||||
unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
|
||||
File.getDirectory(), getUniqueID());
|
||||
assert(FileID && "Invalid file id");
|
||||
addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
|
||||
addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
|
||||
addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
|
||||
addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
|
||||
}
|
||||
|
||||
/// addSourceLine - Add location information to specified debug information
|
||||
@ -346,8 +359,8 @@ void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
|
||||
unsigned FileID =
|
||||
DD->getOrCreateSourceID(FN, NS.getDirectory(), getUniqueID());
|
||||
assert(FileID && "Invalid file id");
|
||||
addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
|
||||
addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
|
||||
addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
|
||||
addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
|
||||
}
|
||||
|
||||
/// addVariableAddress - Add DW_AT_location attribute for a
|
||||
@ -364,37 +377,38 @@ void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
|
||||
}
|
||||
|
||||
/// addRegisterOp - Add register operand.
|
||||
void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
|
||||
void CompileUnit::addRegisterOp(DIEBlock *TheDie, unsigned Reg) {
|
||||
const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
|
||||
unsigned DWReg = RI->getDwarfRegNum(Reg, false);
|
||||
if (DWReg < 32)
|
||||
addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
|
||||
addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
|
||||
else {
|
||||
addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
|
||||
addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
|
||||
addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
|
||||
addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
|
||||
}
|
||||
}
|
||||
|
||||
/// addRegisterOffset - Add register offset.
|
||||
void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg, int64_t Offset) {
|
||||
void CompileUnit::addRegisterOffset(DIEBlock *TheDie, unsigned Reg,
|
||||
int64_t Offset) {
|
||||
const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
|
||||
unsigned DWReg = RI->getDwarfRegNum(Reg, false);
|
||||
const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
|
||||
if (Reg == TRI->getFrameRegister(*Asm->MF))
|
||||
// If variable offset is based in frame register then use fbreg.
|
||||
addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
|
||||
addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
|
||||
else if (DWReg < 32)
|
||||
addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
|
||||
addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
|
||||
else {
|
||||
addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
|
||||
addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
|
||||
addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
|
||||
addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
|
||||
}
|
||||
addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
|
||||
addSInt(TheDie, dwarf::DW_FORM_sdata, Offset);
|
||||
}
|
||||
|
||||
/// addAddress - Add an address attribute to a die based on the location
|
||||
/// provided.
|
||||
void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
|
||||
void CompileUnit::addAddress(DIE *Die, dwarf::Attribute Attribute,
|
||||
const MachineLocation &Location, bool Indirect) {
|
||||
DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
|
||||
|
||||
@ -403,12 +417,12 @@ void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
|
||||
else {
|
||||
addRegisterOffset(Block, Location.getReg(), Location.getOffset());
|
||||
if (Indirect && !Location.isReg()) {
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
|
||||
addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
|
||||
}
|
||||
}
|
||||
|
||||
// Now attach the location information to the DIE.
|
||||
addBlock(Die, Attribute, 0, Block);
|
||||
addBlock(Die, Attribute, Block);
|
||||
}
|
||||
|
||||
/// addComplexAddress - Start with the address based on the location provided,
|
||||
@ -417,7 +431,7 @@ void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
|
||||
/// the starting location. Add the DWARF information to the die.
|
||||
///
|
||||
void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
|
||||
uint16_t Attribute,
|
||||
dwarf::Attribute Attribute,
|
||||
const MachineLocation &Location) {
|
||||
DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
|
||||
unsigned N = DV.getNumAddrElements();
|
||||
@ -436,17 +450,17 @@ void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
|
||||
for (; i < N; ++i) {
|
||||
uint64_t Element = DV.getAddrElement(i);
|
||||
if (Element == DIBuilder::OpPlus) {
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
|
||||
addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
|
||||
addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
|
||||
addUInt(Block, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
|
||||
} else if (Element == DIBuilder::OpDeref) {
|
||||
if (!Location.isReg())
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
|
||||
addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
|
||||
} else
|
||||
llvm_unreachable("unknown DIBuilder Opcode");
|
||||
}
|
||||
|
||||
// Now attach the location information to the DIE.
|
||||
addBlock(Die, Attribute, 0, Block);
|
||||
addBlock(Die, Attribute, Block);
|
||||
}
|
||||
|
||||
/* Byref variables, in Blocks, are declared by the programmer as "SomeType
|
||||
@ -510,7 +524,7 @@ void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
|
||||
/// more information, read large comment just above here.
|
||||
///
|
||||
void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
|
||||
uint16_t Attribute,
|
||||
dwarf::Attribute Attribute,
|
||||
const MachineLocation &Location) {
|
||||
DIType Ty = DV.getType();
|
||||
DIType TmpTy = Ty;
|
||||
@ -560,30 +574,30 @@ void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
|
||||
// If we started with a pointer to the __Block_byref... struct, then
|
||||
// the first thing we need to do is dereference the pointer (DW_OP_deref).
|
||||
if (isPointer)
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
|
||||
addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
|
||||
|
||||
// Next add the offset for the '__forwarding' field:
|
||||
// DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
|
||||
// adding the offset if it's 0.
|
||||
if (forwardingFieldOffset > 0) {
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
|
||||
addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
|
||||
addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
|
||||
addUInt(Block, dwarf::DW_FORM_udata, forwardingFieldOffset);
|
||||
}
|
||||
|
||||
// Now dereference the __forwarding field to get to the real __Block_byref
|
||||
// struct: DW_OP_deref.
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
|
||||
addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
|
||||
|
||||
// Now that we've got the real __Block_byref... struct, add the offset
|
||||
// for the variable's field to get to the location of the actual variable:
|
||||
// DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
|
||||
if (varFieldOffset > 0) {
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
|
||||
addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
|
||||
addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
|
||||
addUInt(Block, dwarf::DW_FORM_udata, varFieldOffset);
|
||||
}
|
||||
|
||||
// Now attach the location information to the DIE.
|
||||
addBlock(Die, Attribute, 0, Block);
|
||||
addBlock(Die, Attribute, Block);
|
||||
}
|
||||
|
||||
/// isTypeSigned - Return true if the type is signed.
|
||||
@ -654,7 +668,7 @@ void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
|
||||
assert(MO.isImm() && "Invalid machine operand!");
|
||||
int SizeInBits = -1;
|
||||
bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
|
||||
uint16_t Form;
|
||||
dwarf::Form Form;
|
||||
|
||||
// If we're a signed constant definitely use sdata.
|
||||
if (SignedConstant) {
|
||||
@ -702,10 +716,10 @@ void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
|
||||
|
||||
// Output the constant to DWARF one byte at a time.
|
||||
for (; Start != Stop; Start += Incr)
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1,
|
||||
addUInt(Block, dwarf::DW_FORM_data1,
|
||||
(unsigned char)0xFF & FltPtr[Start]);
|
||||
|
||||
addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
|
||||
addBlock(Die, dwarf::DW_AT_const_value, Block);
|
||||
}
|
||||
|
||||
/// addConstantFPValue - Add constant value entry in variable DIE.
|
||||
@ -732,7 +746,7 @@ void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
|
||||
}
|
||||
|
||||
// Else use data for now unless it's larger than we can deal with.
|
||||
uint16_t Form;
|
||||
dwarf::Form Form;
|
||||
switch (CIBitWidth) {
|
||||
case 8:
|
||||
Form = dwarf::DW_FORM_data1;
|
||||
@ -770,10 +784,10 @@ void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
|
||||
c = Ptr64[i / 8] >> (8 * (i & 7));
|
||||
else
|
||||
c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, c);
|
||||
addUInt(Block, dwarf::DW_FORM_data1, c);
|
||||
}
|
||||
|
||||
addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
|
||||
addBlock(Die, dwarf::DW_AT_const_value, Block);
|
||||
}
|
||||
|
||||
/// addTemplateParams - Add template parameters into buffer.
|
||||
@ -857,7 +871,7 @@ DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
|
||||
}
|
||||
|
||||
/// addType - Add a new type attribute to the specified entity.
|
||||
void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
|
||||
void CompileUnit::addType(DIE *Entity, DIType Ty, dwarf::Attribute Attribute) {
|
||||
assert(Ty && "Trying to add a type that doesn't exist?");
|
||||
|
||||
// Check for pre-existence.
|
||||
@ -1001,7 +1015,7 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
|
||||
BTy.getEncoding());
|
||||
|
||||
uint64_t Size = BTy.getSizeInBits() >> 3;
|
||||
addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
|
||||
addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
|
||||
}
|
||||
|
||||
/// constructTypeDIE - Construct derived type die from DIDerivedType.
|
||||
@ -1022,7 +1036,7 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
|
||||
|
||||
// Add size if non-zero (derived types might be zero-sized.)
|
||||
if (Size && Tag != dwarf::DW_TAG_pointer_type)
|
||||
addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
|
||||
addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
|
||||
|
||||
if (Tag == dwarf::DW_TAG_ptr_to_member_type)
|
||||
addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
|
||||
@ -1182,7 +1196,7 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
|
||||
if (Property.isNonAtomicObjCProperty())
|
||||
PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
|
||||
if (PropertyAttributes)
|
||||
addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
|
||||
addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
|
||||
PropertyAttributes);
|
||||
|
||||
DIEEntry *Entry = getDIEEntry(Element);
|
||||
@ -1228,10 +1242,10 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
|
||||
// Add size if non-zero (derived types might be zero-sized.)
|
||||
// TODO: Do we care about size for enum forward declarations?
|
||||
if (Size)
|
||||
addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
|
||||
addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
|
||||
else if (!CTy.isForwardDecl())
|
||||
// Add zero size if it is not a forward declaration.
|
||||
addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
|
||||
addUInt(&Buffer, dwarf::DW_AT_byte_size, None, 0);
|
||||
|
||||
// If we're a forward decl, say so.
|
||||
if (CTy.isForwardDecl())
|
||||
@ -1301,8 +1315,8 @@ CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP,
|
||||
addOpAddress(Block, Asm->Mang->getSymbol(GV));
|
||||
// Emit DW_OP_stack_value to use the address as the immediate value of the
|
||||
// parameter, rather than a pointer to it.
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
|
||||
addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
|
||||
addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
|
||||
addBlock(ParamDIE, dwarf::DW_AT_location, Block);
|
||||
} else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
|
||||
assert(isa<MDString>(Val));
|
||||
addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
|
||||
@ -1410,9 +1424,9 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
|
||||
if (VK) {
|
||||
addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
|
||||
DIEBlock *Block = getDIEBlock();
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
|
||||
addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
|
||||
addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
|
||||
addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
|
||||
addUInt(Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
|
||||
addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
|
||||
ContainingTypeMap.insert(std::make_pair(SPDie,
|
||||
resolve(SP.getContainingType())));
|
||||
}
|
||||
@ -1539,18 +1553,17 @@ void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
|
||||
// Based on GCC's support for TLS:
|
||||
if (!DD->useSplitDwarf()) {
|
||||
// 1) Start with a constNu of the appropriate pointer size
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1,
|
||||
addUInt(Block, dwarf::DW_FORM_data1,
|
||||
PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
|
||||
// 2) containing the (relocated) offset of the TLS variable
|
||||
// within the module's TLS block.
|
||||
addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
|
||||
addExpr(Block, dwarf::DW_FORM_udata, Expr);
|
||||
} else {
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
|
||||
addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
|
||||
addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
|
||||
addUInt(Block, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
|
||||
}
|
||||
// 3) followed by a custom OP to make the debugger do a TLS lookup.
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1,
|
||||
dwarf::DW_OP_GNU_push_tls_address);
|
||||
addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_push_tls_address);
|
||||
} else
|
||||
addOpAddress(Block, Sym);
|
||||
// Do not create specification DIE if context is either compile unit
|
||||
@ -1560,13 +1573,13 @@ void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
|
||||
// Create specification DIE.
|
||||
VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
|
||||
addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, VariableDIE);
|
||||
addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
|
||||
addBlock(VariableSpecDIE, dwarf::DW_AT_location, Block);
|
||||
// A static member's declaration is already flagged as such.
|
||||
if (!SDMDecl.Verify())
|
||||
addFlag(VariableDIE, dwarf::DW_AT_declaration);
|
||||
addDie(VariableSpecDIE);
|
||||
} else {
|
||||
addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
|
||||
addBlock(VariableDIE, dwarf::DW_AT_location, Block);
|
||||
}
|
||||
// Add the linkage name.
|
||||
StringRef LinkageName = GV.getLinkageName();
|
||||
@ -1591,12 +1604,12 @@ void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
|
||||
DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
|
||||
Value *Ptr = CE->getOperand(0);
|
||||
addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
|
||||
addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
|
||||
SmallVector<Value *, 3> Idx(CE->op_begin() + 1, CE->op_end());
|
||||
addUInt(Block, 0, dwarf::DW_FORM_udata,
|
||||
addUInt(Block, dwarf::DW_FORM_udata,
|
||||
Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
|
||||
addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
|
||||
addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
|
||||
addBlock(VariableDIE, dwarf::DW_AT_location, Block);
|
||||
}
|
||||
|
||||
if (addToAccelTable) {
|
||||
@ -1631,12 +1644,12 @@ void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
|
||||
int64_t Count = SR.getCount();
|
||||
|
||||
if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
|
||||
addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
|
||||
addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
|
||||
|
||||
if (Count != -1 && Count != 0)
|
||||
// FIXME: An unbounded array should reference the expression that defines
|
||||
// the array.
|
||||
addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
|
||||
addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, None, LowerBound + Count - 1);
|
||||
|
||||
Buffer.addChild(DW_Subrange);
|
||||
}
|
||||
@ -1657,7 +1670,7 @@ void CompileUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType *CTy) {
|
||||
// Construct an anonymous type for index type.
|
||||
IdxTy = new DIE(dwarf::DW_TAG_base_type);
|
||||
addString(IdxTy, dwarf::DW_AT_name, "int");
|
||||
addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
|
||||
addUInt(IdxTy, dwarf::DW_AT_byte_size, None, sizeof(int32_t));
|
||||
addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
|
||||
dwarf::DW_ATE_signed);
|
||||
addDie(IdxTy);
|
||||
@ -1787,15 +1800,16 @@ DIE *CompileUnit::createMemberDIE(DIDerivedType DT, DIE &Buffer) {
|
||||
addSourceLine(MemberDie, DT);
|
||||
|
||||
DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
|
||||
addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
|
||||
addUInt(MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
|
||||
|
||||
uint64_t Size = DT.getSizeInBits();
|
||||
uint64_t FieldSize = getBaseTypeSize(DD, DT);
|
||||
|
||||
if (Size != FieldSize) {
|
||||
// Handle bitfield.
|
||||
addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, getBaseTypeSize(DD, DT) >> 3);
|
||||
addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
|
||||
addUInt(MemberDie, dwarf::DW_AT_byte_size, None,
|
||||
getBaseTypeSize(DD, DT) >> 3);
|
||||
addUInt(MemberDie, dwarf::DW_AT_bit_size, None, DT.getSizeInBits());
|
||||
|
||||
uint64_t Offset = DT.getOffsetInBits();
|
||||
uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
|
||||
@ -1806,15 +1820,15 @@ DIE *CompileUnit::createMemberDIE(DIDerivedType DT, DIE &Buffer) {
|
||||
// Maybe we need to work from the other end.
|
||||
if (Asm->getDataLayout().isLittleEndian())
|
||||
Offset = FieldSize - (Offset + Size);
|
||||
addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
|
||||
addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
|
||||
|
||||
// Here WD_AT_data_member_location points to the anonymous
|
||||
// field that includes this bit field.
|
||||
addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
|
||||
addUInt(MemLocationDie, dwarf::DW_FORM_udata, FieldOffset >> 3);
|
||||
|
||||
} else
|
||||
// This is not a bitfield.
|
||||
addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
|
||||
addUInt(MemLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
|
||||
|
||||
if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
|
||||
|
||||
@ -1823,17 +1837,17 @@ DIE *CompileUnit::createMemberDIE(DIDerivedType DT, DIE &Buffer) {
|
||||
// BaseAddr = ObAddr + *((*ObAddr) - Offset)
|
||||
|
||||
DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
|
||||
addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
|
||||
addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
|
||||
addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
|
||||
addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
|
||||
addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
|
||||
addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
|
||||
addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
|
||||
addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
|
||||
addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
|
||||
addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
|
||||
addUInt(VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
|
||||
addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
|
||||
addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
|
||||
addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
|
||||
|
||||
addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, VBaseLocationDie);
|
||||
addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
|
||||
} else
|
||||
addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
|
||||
addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
|
||||
|
||||
if (DT.isProtected())
|
||||
addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "DIE.h"
|
||||
#include "DwarfDebug.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "llvm/ADT/OwningPtr.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include "llvm/DebugInfo.h"
|
||||
@ -166,56 +167,63 @@ public:
|
||||
void addDie(DIE *Buffer) { CUDie->addChild(Buffer); }
|
||||
|
||||
/// addFlag - Add a flag that is true to the DIE.
|
||||
void addFlag(DIE *Die, uint16_t Attribute);
|
||||
void addFlag(DIE *Die, dwarf::Attribute Attribute);
|
||||
|
||||
/// addUInt - Add an unsigned integer attribute data and value.
|
||||
///
|
||||
void addUInt(DIE *Die, uint16_t Attribute, uint16_t Form, uint64_t Integer);
|
||||
void addUInt(DIE *Die, dwarf::Attribute Attribute, Optional<dwarf::Form> Form,
|
||||
uint64_t Integer);
|
||||
|
||||
void addUInt(DIEBlock *Block, dwarf::Form Form, uint64_t Integer);
|
||||
|
||||
/// addSInt - Add an signed integer attribute data and value.
|
||||
///
|
||||
void addSInt(DIE *Die, uint16_t Attribute, uint16_t Form, int64_t Integer);
|
||||
void addSInt(DIE *Die, dwarf::Attribute Attribute, Optional<dwarf::Form> Form,
|
||||
int64_t Integer);
|
||||
|
||||
void addSInt(DIEBlock *Die, Optional<dwarf::Form> Form, int64_t Integer);
|
||||
|
||||
/// addString - Add a string attribute data and value.
|
||||
///
|
||||
void addString(DIE *Die, uint16_t Attribute, const StringRef Str);
|
||||
void addString(DIE *Die, dwarf::Attribute Attribute, const StringRef Str);
|
||||
|
||||
/// addLocalString - Add a string attribute data and value.
|
||||
///
|
||||
void addLocalString(DIE *Die, uint16_t Attribute, const StringRef Str);
|
||||
void addLocalString(DIE *Die, dwarf::Attribute Attribute, const StringRef Str);
|
||||
|
||||
/// addExpr - Add a Dwarf expression attribute data and value.
|
||||
///
|
||||
void addExpr(DIE *Die, uint16_t Attribute, uint16_t Form, const MCExpr *Expr);
|
||||
void addExpr(DIEBlock *Die, dwarf::Form Form, const MCExpr *Expr);
|
||||
|
||||
/// addLabel - Add a Dwarf label attribute data and value.
|
||||
///
|
||||
void addLabel(DIE *Die, uint16_t Attribute, uint16_t Form,
|
||||
void addLabel(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
|
||||
const MCSymbol *Label);
|
||||
|
||||
void addLabel(DIEBlock *Die, dwarf::Form Form, const MCSymbol *Label);
|
||||
|
||||
/// addLabelAddress - Add a dwarf label attribute data and value using
|
||||
/// either DW_FORM_addr or DW_FORM_GNU_addr_index.
|
||||
///
|
||||
void addLabelAddress(DIE *Die, uint16_t Attribute, MCSymbol *Label);
|
||||
void addLabelAddress(DIE *Die, dwarf::Attribute Attribute, MCSymbol *Label);
|
||||
|
||||
/// addOpAddress - Add a dwarf op address data and value using the
|
||||
/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
|
||||
///
|
||||
void addOpAddress(DIE *Die, const MCSymbol *Label);
|
||||
void addOpAddress(DIE *Die, const MCSymbolRefExpr *Label);
|
||||
void addOpAddress(DIEBlock *Die, const MCSymbol *Label);
|
||||
|
||||
/// addDelta - Add a label delta attribute data and value.
|
||||
///
|
||||
void addDelta(DIE *Die, uint16_t Attribute, uint16_t Form, const MCSymbol *Hi,
|
||||
void addDelta(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form, const MCSymbol *Hi,
|
||||
const MCSymbol *Lo);
|
||||
|
||||
/// addDIEEntry - Add a DIE attribute data and value.
|
||||
///
|
||||
void addDIEEntry(DIE *Die, uint16_t Attribute, DIE *Entry);
|
||||
void addDIEEntry(DIE *Die, dwarf::Attribute Attribute, DIE *Entry);
|
||||
|
||||
/// addBlock - Add block data.
|
||||
///
|
||||
void addBlock(DIE *Die, uint16_t Attribute, uint16_t Form, DIEBlock *Block);
|
||||
void addBlock(DIE *Die, dwarf::Attribute Attribute, DIEBlock *Block);
|
||||
|
||||
/// addSourceLine - Add location information to specified debug information
|
||||
/// entry.
|
||||
@ -228,7 +236,7 @@ public:
|
||||
|
||||
/// addAddress - Add an address attribute to a die based on the location
|
||||
/// provided.
|
||||
void addAddress(DIE *Die, uint16_t Attribute, const MachineLocation &Location,
|
||||
void addAddress(DIE *Die, dwarf::Attribute Attribute, const MachineLocation &Location,
|
||||
bool Indirect = false);
|
||||
|
||||
/// addConstantValue - Add constant value entry in variable DIE.
|
||||
@ -244,17 +252,17 @@ public:
|
||||
void addTemplateParams(DIE &Buffer, DIArray TParams);
|
||||
|
||||
/// addRegisterOp - Add register operand.
|
||||
void addRegisterOp(DIE *TheDie, unsigned Reg);
|
||||
void addRegisterOp(DIEBlock *TheDie, unsigned Reg);
|
||||
|
||||
/// addRegisterOffset - Add register offset.
|
||||
void addRegisterOffset(DIE *TheDie, unsigned Reg, int64_t Offset);
|
||||
void addRegisterOffset(DIEBlock *TheDie, unsigned Reg, int64_t Offset);
|
||||
|
||||
/// addComplexAddress - Start with the address based on the location provided,
|
||||
/// and generate the DWARF information necessary to find the actual variable
|
||||
/// (navigating the extra location information encoded in the type) based on
|
||||
/// the starting location. Add the DWARF information to the die.
|
||||
///
|
||||
void addComplexAddress(const DbgVariable &DV, DIE *Die, uint16_t Attribute,
|
||||
void addComplexAddress(const DbgVariable &DV, DIE *Die, dwarf::Attribute Attribute,
|
||||
const MachineLocation &Location);
|
||||
|
||||
// FIXME: Should be reformulated in terms of addComplexAddress.
|
||||
@ -264,7 +272,7 @@ public:
|
||||
/// starting location. Add the DWARF information to the die. Obsolete,
|
||||
/// please use addComplexAddress instead.
|
||||
///
|
||||
void addBlockByrefAddress(const DbgVariable &DV, DIE *Die, uint16_t Attribute,
|
||||
void addBlockByrefAddress(const DbgVariable &DV, DIE *Die, dwarf::Attribute Attribute,
|
||||
const MachineLocation &Location);
|
||||
|
||||
/// addVariableAddress - Add DW_AT_location attribute for a
|
||||
@ -278,7 +286,7 @@ public:
|
||||
/// addType - Add a new type attribute to the specified entity. This takes
|
||||
/// and attribute parameter because DW_AT_friend attributes are also
|
||||
/// type references.
|
||||
void addType(DIE *Entity, DIType Ty, uint16_t Attribute = dwarf::DW_AT_type);
|
||||
void addType(DIE *Entity, DIType Ty, dwarf::Attribute Attribute = dwarf::DW_AT_type);
|
||||
|
||||
/// getOrCreateNameSpace - Create a DIE for DINameSpace.
|
||||
DIE *getOrCreateNameSpace(DINameSpace NS);
|
||||
|
@ -558,10 +558,10 @@ DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
|
||||
|
||||
// Add the call site information to the DIE.
|
||||
DILocation DL(Scope->getInlinedAt());
|
||||
TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
|
||||
TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, None,
|
||||
getOrCreateSourceID(DL.getFilename(), DL.getDirectory(),
|
||||
TheCU->getUniqueID()));
|
||||
TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
|
||||
TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, None, DL.getLineNumber());
|
||||
|
||||
// Add name to the name table, we do this here because we're guaranteed
|
||||
// to have concrete versions of our DW_TAG_inlined_subprogram nodes.
|
||||
@ -886,8 +886,8 @@ void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
|
||||
unsigned FileID = getOrCreateSourceID(Module.getContext().getFilename(),
|
||||
Module.getContext().getDirectory(),
|
||||
TheCU->getUniqueID());
|
||||
TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, 0, FileID);
|
||||
TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, 0, Module.getLineNumber());
|
||||
TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, None, FileID);
|
||||
TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, None, Module.getLineNumber());
|
||||
TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, EntityDie);
|
||||
StringRef Name = Module.getName();
|
||||
if (!Name.empty())
|
||||
@ -955,14 +955,14 @@ void DwarfDebug::computeInlinedDIEs() {
|
||||
for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
|
||||
AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
|
||||
DIE *ISP = *AI;
|
||||
FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
|
||||
FirstCU->addUInt(ISP, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
|
||||
}
|
||||
for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
|
||||
AE = AbstractSPDies.end(); AI != AE; ++AI) {
|
||||
DIE *ISP = AI->second;
|
||||
if (InlinedSubprogramDIEs.count(ISP))
|
||||
continue;
|
||||
FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
|
||||
FirstCU->addUInt(ISP, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2047,8 +2047,8 @@ void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
|
||||
|
||||
// Emit the DIE attribute values.
|
||||
for (unsigned i = 0, N = Values.size(); i < N; ++i) {
|
||||
unsigned Attr = AbbrevData[i].getAttribute();
|
||||
unsigned Form = AbbrevData[i].getForm();
|
||||
dwarf::Attribute Attr = AbbrevData[i].getAttribute();
|
||||
dwarf::Form Form = AbbrevData[i].getForm();
|
||||
assert(Form && "Too many attributes for DIE (check abbreviation)");
|
||||
|
||||
if (Asm->isVerbose())
|
||||
|
Loading…
x
Reference in New Issue
Block a user