forked from OSchip/llvm-project
parent
3eb2470eed
commit
eaa7433c85
|
@ -38,8 +38,7 @@ DWARFAbbreviationDeclaration::extract(DataExtractor data, uint32_t* offset_ptr,
|
||||||
}
|
}
|
||||||
|
|
||||||
return Tag != 0;
|
return Tag != 0;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
Tag = 0;
|
Tag = 0;
|
||||||
HasChildren = false;
|
HasChildren = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,13 +32,11 @@ bool DWARFAbbreviationDeclarationSet::extract(DataExtractor data,
|
||||||
return beginOffset != *offset_ptr;
|
return beginOffset != *offset_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DWARFAbbreviationDeclarationSet::dump(raw_ostream &OS) const {
|
void DWARFAbbreviationDeclarationSet::dump(raw_ostream &OS) const {
|
||||||
for (unsigned i = 0, e = Decls.size(); i != e; ++i)
|
for (unsigned i = 0, e = Decls.size(); i != e; ++i)
|
||||||
Decls[i].dump(OS);
|
Decls[i].dump(OS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const DWARFAbbreviationDeclaration*
|
const DWARFAbbreviationDeclaration*
|
||||||
DWARFAbbreviationDeclarationSet::getAbbreviationDeclaration(uint32_t abbrCode)
|
DWARFAbbreviationDeclarationSet::getAbbreviationDeclaration(uint32_t abbrCode)
|
||||||
const {
|
const {
|
||||||
|
@ -58,8 +56,8 @@ DWARFAbbreviationDeclarationSet::getAbbreviationDeclaration(uint32_t abbrCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
DWARFDebugAbbrev::DWARFDebugAbbrev() :
|
DWARFDebugAbbrev::DWARFDebugAbbrev() :
|
||||||
m_abbrevCollMap(),
|
AbbrevCollMap(),
|
||||||
m_prev_abbr_offset_pos(m_abbrevCollMap.end()) {}
|
PrevAbbrOffsetPos(AbbrevCollMap.end()) {}
|
||||||
|
|
||||||
|
|
||||||
void DWARFDebugAbbrev::parse(DataExtractor data) {
|
void DWARFDebugAbbrev::parse(DataExtractor data) {
|
||||||
|
@ -70,21 +68,21 @@ void DWARFDebugAbbrev::parse(DataExtractor data) {
|
||||||
DWARFAbbreviationDeclarationSet abbrevDeclSet;
|
DWARFAbbreviationDeclarationSet abbrevDeclSet;
|
||||||
|
|
||||||
if (abbrevDeclSet.extract(data, &offset))
|
if (abbrevDeclSet.extract(data, &offset))
|
||||||
m_abbrevCollMap[initial_cu_offset] = abbrevDeclSet;
|
AbbrevCollMap[initial_cu_offset] = abbrevDeclSet;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
m_prev_abbr_offset_pos = m_abbrevCollMap.end();
|
PrevAbbrOffsetPos = AbbrevCollMap.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DWARFDebugAbbrev::dump(raw_ostream &OS) const {
|
void DWARFDebugAbbrev::dump(raw_ostream &OS) const {
|
||||||
if (m_abbrevCollMap.empty()) {
|
if (AbbrevCollMap.empty()) {
|
||||||
OS << "< EMPTY >\n";
|
OS << "< EMPTY >\n";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWARFAbbreviationDeclarationCollMapConstIter pos;
|
DWARFAbbreviationDeclarationCollMapConstIter pos;
|
||||||
for (pos = m_abbrevCollMap.begin(); pos != m_abbrevCollMap.end(); ++pos) {
|
for (pos = AbbrevCollMap.begin(); pos != AbbrevCollMap.end(); ++pos) {
|
||||||
OS << format("Abbrev table for offset: 0x%8.8x\n", pos->first);
|
OS << format("Abbrev table for offset: 0x%8.8x\n", pos->first);
|
||||||
pos->second.dump(OS);
|
pos->second.dump(OS);
|
||||||
}
|
}
|
||||||
|
@ -92,17 +90,17 @@ void DWARFDebugAbbrev::dump(raw_ostream &OS) const {
|
||||||
|
|
||||||
const DWARFAbbreviationDeclarationSet*
|
const DWARFAbbreviationDeclarationSet*
|
||||||
DWARFDebugAbbrev::getAbbreviationDeclarationSet(uint64_t cu_abbr_offset) const {
|
DWARFDebugAbbrev::getAbbreviationDeclarationSet(uint64_t cu_abbr_offset) const {
|
||||||
DWARFAbbreviationDeclarationCollMapConstIter end = m_abbrevCollMap.end();
|
DWARFAbbreviationDeclarationCollMapConstIter end = AbbrevCollMap.end();
|
||||||
DWARFAbbreviationDeclarationCollMapConstIter pos;
|
DWARFAbbreviationDeclarationCollMapConstIter pos;
|
||||||
if (m_prev_abbr_offset_pos != end &&
|
if (PrevAbbrOffsetPos != end &&
|
||||||
m_prev_abbr_offset_pos->first == cu_abbr_offset) {
|
PrevAbbrOffsetPos->first == cu_abbr_offset) {
|
||||||
return &(m_prev_abbr_offset_pos->second);
|
return &(PrevAbbrOffsetPos->second);
|
||||||
} else {
|
} else {
|
||||||
pos = m_abbrevCollMap.find(cu_abbr_offset);
|
pos = AbbrevCollMap.find(cu_abbr_offset);
|
||||||
m_prev_abbr_offset_pos = pos;
|
PrevAbbrOffsetPos = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pos != m_abbrevCollMap.end())
|
if (pos != AbbrevCollMap.end())
|
||||||
return &(pos->second);
|
return &(pos->second);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,23 +47,25 @@ class DWARFAbbreviationDeclarationSet {
|
||||||
getAbbreviationDeclaration(uint32_t abbrCode) const;
|
getAbbreviationDeclaration(uint32_t abbrCode) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::map<uint64_t, DWARFAbbreviationDeclarationSet>
|
|
||||||
DWARFAbbreviationDeclarationCollMap;
|
|
||||||
typedef DWARFAbbreviationDeclarationCollMap::iterator
|
|
||||||
DWARFAbbreviationDeclarationCollMapIter;
|
|
||||||
typedef DWARFAbbreviationDeclarationCollMap::const_iterator
|
|
||||||
DWARFAbbreviationDeclarationCollMapConstIter;
|
|
||||||
|
|
||||||
class DWARFDebugAbbrev {
|
class DWARFDebugAbbrev {
|
||||||
|
public:
|
||||||
|
typedef std::map<uint64_t, DWARFAbbreviationDeclarationSet>
|
||||||
|
DWARFAbbreviationDeclarationCollMap;
|
||||||
|
typedef DWARFAbbreviationDeclarationCollMap::iterator
|
||||||
|
DWARFAbbreviationDeclarationCollMapIter;
|
||||||
|
typedef DWARFAbbreviationDeclarationCollMap::const_iterator
|
||||||
|
DWARFAbbreviationDeclarationCollMapConstIter;
|
||||||
|
|
||||||
|
private:
|
||||||
|
DWARFAbbreviationDeclarationCollMap AbbrevCollMap;
|
||||||
|
mutable DWARFAbbreviationDeclarationCollMapConstIter PrevAbbrOffsetPos;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DWARFDebugAbbrev();
|
DWARFDebugAbbrev();
|
||||||
const DWARFAbbreviationDeclarationSet *
|
const DWARFAbbreviationDeclarationSet *
|
||||||
getAbbreviationDeclarationSet(uint64_t cu_abbr_offset) const;
|
getAbbreviationDeclarationSet(uint64_t cu_abbr_offset) const;
|
||||||
void dump(raw_ostream &OS) const;
|
void dump(raw_ostream &OS) const;
|
||||||
void parse(DataExtractor data);
|
void parse(DataExtractor data);
|
||||||
protected:
|
|
||||||
DWARFAbbreviationDeclarationCollMap m_abbrevCollMap;
|
|
||||||
mutable DWARFAbbreviationDeclarationCollMapConstIter m_prev_abbr_offset_pos;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -351,8 +351,7 @@ DWARFDebugInfoEntryMinimal::getAttributeValue(const DWARFCompileUnit *cu,
|
||||||
|
|
||||||
const uint32_t attr_offset = offset;
|
const uint32_t attr_offset = offset;
|
||||||
form_value = DWARFFormValue(AbbrevDecl->getFormByIndex(idx));
|
form_value = DWARFFormValue(AbbrevDecl->getFormByIndex(idx));
|
||||||
if (form_value.extractValue(debug_info_data, &offset, cu))
|
if (form_value.extractValue(debug_info_data, &offset, cu)) {
|
||||||
{
|
|
||||||
if (end_attr_offset_ptr)
|
if (end_attr_offset_ptr)
|
||||||
*end_attr_offset_ptr = offset;
|
*end_attr_offset_ptr = offset;
|
||||||
return attr_offset;
|
return attr_offset;
|
||||||
|
|
|
@ -85,19 +85,16 @@ public:
|
||||||
// We know we are kept in a vector of contiguous entries, so we know
|
// We know we are kept in a vector of contiguous entries, so we know
|
||||||
// our parent will be some index behind "this".
|
// our parent will be some index behind "this".
|
||||||
ParentIdx = this - parent;
|
ParentIdx = this - parent;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
ParentIdx = 0;
|
ParentIdx = 0;
|
||||||
}
|
}
|
||||||
void setSibling(DWARFDebugInfoEntryMinimal *sibling) {
|
void setSibling(DWARFDebugInfoEntryMinimal *sibling) {
|
||||||
if (sibling)
|
if (sibling) {
|
||||||
{
|
|
||||||
// We know we are kept in a vector of contiguous entries, so we know
|
// We know we are kept in a vector of contiguous entries, so we know
|
||||||
// our sibling will be some index after "this".
|
// our sibling will be some index after "this".
|
||||||
SiblingIdx = sibling - this;
|
SiblingIdx = sibling - this;
|
||||||
sibling->setParent(getParent());
|
sibling->setParent(getParent());
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
SiblingIdx = 0;
|
SiblingIdx = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,156 +17,156 @@ using namespace llvm;
|
||||||
using namespace dwarf;
|
using namespace dwarf;
|
||||||
|
|
||||||
static const uint8_t form_sizes_addr4[] = {
|
static const uint8_t form_sizes_addr4[] = {
|
||||||
0, // 0x00 unused
|
0, // 0x00 unused
|
||||||
4, // 0x01 DW_FORM_addr
|
4, // 0x01 DW_FORM_addr
|
||||||
0, // 0x02 unused
|
0, // 0x02 unused
|
||||||
0, // 0x03 DW_FORM_block2
|
0, // 0x03 DW_FORM_block2
|
||||||
0, // 0x04 DW_FORM_block4
|
0, // 0x04 DW_FORM_block4
|
||||||
2, // 0x05 DW_FORM_data2
|
2, // 0x05 DW_FORM_data2
|
||||||
4, // 0x06 DW_FORM_data4
|
4, // 0x06 DW_FORM_data4
|
||||||
8, // 0x07 DW_FORM_data8
|
8, // 0x07 DW_FORM_data8
|
||||||
0, // 0x08 DW_FORM_string
|
0, // 0x08 DW_FORM_string
|
||||||
0, // 0x09 DW_FORM_block
|
0, // 0x09 DW_FORM_block
|
||||||
0, // 0x0a DW_FORM_block1
|
0, // 0x0a DW_FORM_block1
|
||||||
1, // 0x0b DW_FORM_data1
|
1, // 0x0b DW_FORM_data1
|
||||||
1, // 0x0c DW_FORM_flag
|
1, // 0x0c DW_FORM_flag
|
||||||
0, // 0x0d DW_FORM_sdata
|
0, // 0x0d DW_FORM_sdata
|
||||||
4, // 0x0e DW_FORM_strp
|
4, // 0x0e DW_FORM_strp
|
||||||
0, // 0x0f DW_FORM_udata
|
0, // 0x0f DW_FORM_udata
|
||||||
4, // 0x10 DW_FORM_ref_addr
|
4, // 0x10 DW_FORM_ref_addr
|
||||||
1, // 0x11 DW_FORM_ref1
|
1, // 0x11 DW_FORM_ref1
|
||||||
2, // 0x12 DW_FORM_ref2
|
2, // 0x12 DW_FORM_ref2
|
||||||
4, // 0x13 DW_FORM_ref4
|
4, // 0x13 DW_FORM_ref4
|
||||||
8, // 0x14 DW_FORM_ref8
|
8, // 0x14 DW_FORM_ref8
|
||||||
0, // 0x15 DW_FORM_ref_udata
|
0, // 0x15 DW_FORM_ref_udata
|
||||||
0, // 0x16 DW_FORM_indirect
|
0, // 0x16 DW_FORM_indirect
|
||||||
};
|
};
|
||||||
|
|
||||||
static const uint8_t form_sizes_addr8[] = {
|
static const uint8_t form_sizes_addr8[] = {
|
||||||
0, // 0x00 unused
|
0, // 0x00 unused
|
||||||
8, // 0x01 DW_FORM_addr
|
8, // 0x01 DW_FORM_addr
|
||||||
0, // 0x02 unused
|
0, // 0x02 unused
|
||||||
0, // 0x03 DW_FORM_block2
|
0, // 0x03 DW_FORM_block2
|
||||||
0, // 0x04 DW_FORM_block4
|
0, // 0x04 DW_FORM_block4
|
||||||
2, // 0x05 DW_FORM_data2
|
2, // 0x05 DW_FORM_data2
|
||||||
4, // 0x06 DW_FORM_data4
|
4, // 0x06 DW_FORM_data4
|
||||||
8, // 0x07 DW_FORM_data8
|
8, // 0x07 DW_FORM_data8
|
||||||
0, // 0x08 DW_FORM_string
|
0, // 0x08 DW_FORM_string
|
||||||
0, // 0x09 DW_FORM_block
|
0, // 0x09 DW_FORM_block
|
||||||
0, // 0x0a DW_FORM_block1
|
0, // 0x0a DW_FORM_block1
|
||||||
1, // 0x0b DW_FORM_data1
|
1, // 0x0b DW_FORM_data1
|
||||||
1, // 0x0c DW_FORM_flag
|
1, // 0x0c DW_FORM_flag
|
||||||
0, // 0x0d DW_FORM_sdata
|
0, // 0x0d DW_FORM_sdata
|
||||||
4, // 0x0e DW_FORM_strp
|
4, // 0x0e DW_FORM_strp
|
||||||
0, // 0x0f DW_FORM_udata
|
0, // 0x0f DW_FORM_udata
|
||||||
8, // 0x10 DW_FORM_ref_addr
|
8, // 0x10 DW_FORM_ref_addr
|
||||||
1, // 0x11 DW_FORM_ref1
|
1, // 0x11 DW_FORM_ref1
|
||||||
2, // 0x12 DW_FORM_ref2
|
2, // 0x12 DW_FORM_ref2
|
||||||
4, // 0x13 DW_FORM_ref4
|
4, // 0x13 DW_FORM_ref4
|
||||||
8, // 0x14 DW_FORM_ref8
|
8, // 0x14 DW_FORM_ref8
|
||||||
0, // 0x15 DW_FORM_ref_udata
|
0, // 0x15 DW_FORM_ref_udata
|
||||||
0, // 0x16 DW_FORM_indirect
|
0, // 0x16 DW_FORM_indirect
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t *
|
const uint8_t *
|
||||||
DWARFFormValue::getFixedFormSizesForAddressSize(uint8_t addr_size) {
|
DWARFFormValue::getFixedFormSizesForAddressSize(uint8_t addr_size) {
|
||||||
switch (addr_size) {
|
switch (addr_size) {
|
||||||
case 4: return form_sizes_addr4;
|
case 4: return form_sizes_addr4;
|
||||||
case 8: return form_sizes_addr8;
|
case 8: return form_sizes_addr8;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr,
|
DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr,
|
||||||
const DWARFCompileUnit* cu) {
|
const DWARFCompileUnit* cu) {
|
||||||
bool indirect = false;
|
bool indirect = false;
|
||||||
bool is_block = false;
|
bool is_block = false;
|
||||||
Value.data = NULL;
|
Value.data = NULL;
|
||||||
// Read the value for the form into value and follow and DW_FORM_indirect
|
// Read the value for the form into value and follow and DW_FORM_indirect
|
||||||
// instances we run into
|
// instances we run into
|
||||||
do {
|
do {
|
||||||
indirect = false;
|
indirect = false;
|
||||||
switch (Form) {
|
switch (Form) {
|
||||||
case DW_FORM_addr:
|
case DW_FORM_addr:
|
||||||
case DW_FORM_ref_addr:
|
case DW_FORM_ref_addr:
|
||||||
Value.uval = data.getUnsigned(offset_ptr, cu->getAddressByteSize());
|
Value.uval = data.getUnsigned(offset_ptr, cu->getAddressByteSize());
|
||||||
break;
|
break;
|
||||||
case DW_FORM_block:
|
case DW_FORM_block:
|
||||||
Value.uval = data.getULEB128(offset_ptr);
|
Value.uval = data.getULEB128(offset_ptr);
|
||||||
is_block = true;
|
is_block = true;
|
||||||
break;
|
break;
|
||||||
case DW_FORM_block1:
|
case DW_FORM_block1:
|
||||||
Value.uval = data.getU8(offset_ptr);
|
Value.uval = data.getU8(offset_ptr);
|
||||||
is_block = true;
|
is_block = true;
|
||||||
break;
|
break;
|
||||||
case DW_FORM_block2:
|
case DW_FORM_block2:
|
||||||
Value.uval = data.getU16(offset_ptr);
|
Value.uval = data.getU16(offset_ptr);
|
||||||
is_block = true;
|
is_block = true;
|
||||||
break;
|
break;
|
||||||
case DW_FORM_block4:
|
case DW_FORM_block4:
|
||||||
Value.uval = data.getU32(offset_ptr);
|
Value.uval = data.getU32(offset_ptr);
|
||||||
is_block = true;
|
is_block = true;
|
||||||
break;
|
break;
|
||||||
case DW_FORM_data1:
|
case DW_FORM_data1:
|
||||||
case DW_FORM_ref1:
|
case DW_FORM_ref1:
|
||||||
case DW_FORM_flag:
|
case DW_FORM_flag:
|
||||||
Value.uval = data.getU8(offset_ptr);
|
Value.uval = data.getU8(offset_ptr);
|
||||||
break;
|
break;
|
||||||
case DW_FORM_data2:
|
case DW_FORM_data2:
|
||||||
case DW_FORM_ref2:
|
case DW_FORM_ref2:
|
||||||
Value.uval = data.getU16(offset_ptr);
|
Value.uval = data.getU16(offset_ptr);
|
||||||
break;
|
break;
|
||||||
case DW_FORM_data4:
|
case DW_FORM_data4:
|
||||||
case DW_FORM_ref4:
|
case DW_FORM_ref4:
|
||||||
Value.uval = data.getU32(offset_ptr);
|
Value.uval = data.getU32(offset_ptr);
|
||||||
break;
|
break;
|
||||||
case DW_FORM_data8:
|
case DW_FORM_data8:
|
||||||
case DW_FORM_ref8:
|
case DW_FORM_ref8:
|
||||||
Value.uval = data.getU64(offset_ptr);
|
Value.uval = data.getU64(offset_ptr);
|
||||||
break;
|
break;
|
||||||
case DW_FORM_sdata:
|
case DW_FORM_sdata:
|
||||||
Value.sval = data.getSLEB128(offset_ptr);
|
Value.sval = data.getSLEB128(offset_ptr);
|
||||||
break;
|
break;
|
||||||
case DW_FORM_strp:
|
case DW_FORM_strp:
|
||||||
Value.uval = data.getU32(offset_ptr);
|
Value.uval = data.getU32(offset_ptr);
|
||||||
break;
|
break;
|
||||||
case DW_FORM_udata:
|
case DW_FORM_udata:
|
||||||
case DW_FORM_ref_udata:
|
case DW_FORM_ref_udata:
|
||||||
Value.uval = data.getULEB128(offset_ptr);
|
Value.uval = data.getULEB128(offset_ptr);
|
||||||
break;
|
break;
|
||||||
case DW_FORM_string:
|
case DW_FORM_string:
|
||||||
Value.cstr = data.getCStr(offset_ptr);
|
Value.cstr = data.getCStr(offset_ptr);
|
||||||
// Set the string value to also be the data for inlined cstr form
|
// Set the string value to also be the data for inlined cstr form
|
||||||
// values only so we can tell the differnence between DW_FORM_string
|
// values only so we can tell the differnence between DW_FORM_string
|
||||||
// and DW_FORM_strp form values
|
// and DW_FORM_strp form values
|
||||||
Value.data = (uint8_t*)Value.cstr;
|
Value.data = (uint8_t*)Value.cstr;
|
||||||
break;
|
break;
|
||||||
case DW_FORM_indirect:
|
case DW_FORM_indirect:
|
||||||
Form = data.getULEB128(offset_ptr);
|
Form = data.getULEB128(offset_ptr);
|
||||||
indirect = true;
|
indirect = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
} while (indirect);
|
|
||||||
|
|
||||||
if (is_block) {
|
|
||||||
StringRef str = data.getData().substr(*offset_ptr, Value.uval);
|
|
||||||
Value.data = NULL;
|
|
||||||
if (!str.empty()) {
|
|
||||||
Value.data = reinterpret_cast<const uint8_t *>(str.data());
|
|
||||||
*offset_ptr += Value.uval;
|
|
||||||
}
|
}
|
||||||
}
|
} while (indirect);
|
||||||
|
|
||||||
return true;
|
if (is_block) {
|
||||||
|
StringRef str = data.getData().substr(*offset_ptr, Value.uval);
|
||||||
|
Value.data = NULL;
|
||||||
|
if (!str.empty()) {
|
||||||
|
Value.data = reinterpret_cast<const uint8_t *>(str.data());
|
||||||
|
*offset_ptr += Value.uval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
DWARFFormValue::skipValue(DataExtractor debug_info_data, uint32_t* offset_ptr,
|
DWARFFormValue::skipValue(DataExtractor debug_info_data, uint32_t* offset_ptr,
|
||||||
const DWARFCompileUnit* cu) const {
|
const DWARFCompileUnit* cu) const {
|
||||||
return DWARFFormValue::skipValue(Form, debug_info_data, offset_ptr, cu);
|
return DWARFFormValue::skipValue(Form, debug_info_data, offset_ptr, cu);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -261,8 +261,7 @@ DWARFFormValue::dump(raw_ostream &OS, const DataExtractor *debug_str_data,
|
||||||
uint64_t uvalue = getUnsigned();
|
uint64_t uvalue = getUnsigned();
|
||||||
bool cu_relative_offset = false;
|
bool cu_relative_offset = false;
|
||||||
|
|
||||||
switch (Form)
|
switch (Form) {
|
||||||
{
|
|
||||||
case DW_FORM_addr: OS << format("0x%016x", uvalue); break;
|
case DW_FORM_addr: OS << format("0x%016x", uvalue); break;
|
||||||
case DW_FORM_flag:
|
case DW_FORM_flag:
|
||||||
case DW_FORM_data1: OS << format("0x%02x", uvalue); break;
|
case DW_FORM_data1: OS << format("0x%02x", uvalue); break;
|
||||||
|
@ -365,22 +364,21 @@ DWARFFormValue::getAsCString(const DataExtractor *debug_str_data_ptr) const {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t
|
uint64_t DWARFFormValue::getReference(const DWARFCompileUnit *cu) const {
|
||||||
DWARFFormValue::getReference(const DWARFCompileUnit *cu) const {
|
uint64_t die_offset = Value.uval;
|
||||||
uint64_t die_offset = Value.uval;
|
switch (Form) {
|
||||||
switch (Form) {
|
case DW_FORM_ref1:
|
||||||
case DW_FORM_ref1:
|
case DW_FORM_ref2:
|
||||||
case DW_FORM_ref2:
|
case DW_FORM_ref4:
|
||||||
case DW_FORM_ref4:
|
case DW_FORM_ref8:
|
||||||
case DW_FORM_ref8:
|
case DW_FORM_ref_udata:
|
||||||
case DW_FORM_ref_udata:
|
die_offset += (cu ? cu->getOffset() : 0);
|
||||||
die_offset += (cu ? cu->getOffset() : 0);
|
break;
|
||||||
break;
|
default:
|
||||||
default:
|
break;
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return die_offset;
|
return die_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -391,44 +389,41 @@ DWARFFormValue::resolveCompileUnitReferences(const DWARFCompileUnit* cu) {
|
||||||
case DW_FORM_ref4:
|
case DW_FORM_ref4:
|
||||||
case DW_FORM_ref8:
|
case DW_FORM_ref8:
|
||||||
case DW_FORM_ref_udata:
|
case DW_FORM_ref_udata:
|
||||||
Value.uval += cu->getOffset();
|
Value.uval += cu->getOffset();
|
||||||
Form = DW_FORM_ref_addr;
|
Form = DW_FORM_ref_addr;
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t *DWARFFormValue::BlockData() const {
|
const uint8_t *DWARFFormValue::BlockData() const {
|
||||||
if (!isInlinedCStr())
|
if (!isInlinedCStr())
|
||||||
return Value.data;
|
return Value.data;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DWARFFormValue::isBlockForm(uint16_t form) {
|
bool DWARFFormValue::isBlockForm(uint16_t form) {
|
||||||
switch (form)
|
switch (form) {
|
||||||
{
|
case DW_FORM_block:
|
||||||
case DW_FORM_block:
|
case DW_FORM_block1:
|
||||||
case DW_FORM_block1:
|
case DW_FORM_block2:
|
||||||
case DW_FORM_block2:
|
case DW_FORM_block4:
|
||||||
case DW_FORM_block4:
|
return true;
|
||||||
return true;
|
}
|
||||||
}
|
return false;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DWARFFormValue::isDataForm(uint16_t form) {
|
bool DWARFFormValue::isDataForm(uint16_t form) {
|
||||||
switch (form)
|
switch (form) {
|
||||||
{
|
case DW_FORM_sdata:
|
||||||
case DW_FORM_sdata:
|
case DW_FORM_udata:
|
||||||
case DW_FORM_udata:
|
case DW_FORM_data1:
|
||||||
case DW_FORM_data1:
|
case DW_FORM_data2:
|
||||||
case DW_FORM_data2:
|
case DW_FORM_data4:
|
||||||
case DW_FORM_data4:
|
case DW_FORM_data8:
|
||||||
case DW_FORM_data8:
|
return true;
|
||||||
return true;
|
}
|
||||||
}
|
return false;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ public:
|
||||||
void dump(raw_ostream &OS, const DataExtractor *debug_str_data,
|
void dump(raw_ostream &OS, const DataExtractor *debug_str_data,
|
||||||
const DWARFCompileUnit* cu) const;
|
const DWARFCompileUnit* cu) const;
|
||||||
bool extractValue(DataExtractor data, uint32_t *offset_ptr,
|
bool extractValue(DataExtractor data, uint32_t *offset_ptr,
|
||||||
const DWARFCompileUnit *cu);
|
const DWARFCompileUnit *cu);
|
||||||
bool isInlinedCStr() const {
|
bool isInlinedCStr() const {
|
||||||
return Value.data != NULL && Value.data == (uint8_t*)Value.cstr;
|
return Value.data != NULL && Value.data == (uint8_t*)Value.cstr;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue