X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FDebugInfo%2FDWARFFormValue.cpp;h=705efe5549b674f219f4e7493bf6a7f162a8e2d3;hb=865375ca7f68e60c0234916dd6bb365bb674bddb;hp=8d018b659d52bf97fbc3ff15e89445f945618bf0;hpb=4aa3fea8b13b91800c908f8e7d74fad96adba69a;p=oota-llvm.git diff --git a/lib/DebugInfo/DWARFFormValue.cpp b/lib/DebugInfo/DWARFFormValue.cpp index 8d018b659d5..705efe5549b 100644 --- a/lib/DebugInfo/DWARFFormValue.cpp +++ b/lib/DebugInfo/DWARFFormValue.cpp @@ -9,6 +9,7 @@ #include "DWARFFormValue.h" #include "DWARFCompileUnit.h" +#include "DWARFContext.h" #include "llvm/Support/Dwarf.h" #include "llvm/Support/Format.h" #include "llvm/Support/raw_ostream.h" @@ -79,76 +80,76 @@ DWARFFormValue::getFixedFormSizesForAddressSize(uint8_t addr_size) { bool DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr, - const DWARFCompileUnit* cu) { + const DWARFCompileUnit *cu) { bool indirect = false; bool is_block = false; Value.data = NULL; // Read the value for the form into value and follow and DW_FORM_indirect // instances we run into do { - indirect = false; - switch (Form) { - case DW_FORM_addr: - case DW_FORM_ref_addr: - Value.uval = data.getUnsigned(offset_ptr, cu->getAddressByteSize()); - break; - case DW_FORM_block: - Value.uval = data.getULEB128(offset_ptr); - is_block = true; - break; - case DW_FORM_block1: - Value.uval = data.getU8(offset_ptr); - is_block = true; - break; - case DW_FORM_block2: - Value.uval = data.getU16(offset_ptr); - is_block = true; - break; - case DW_FORM_block4: - Value.uval = data.getU32(offset_ptr); - is_block = true; - break; - case DW_FORM_data1: - case DW_FORM_ref1: - case DW_FORM_flag: - Value.uval = data.getU8(offset_ptr); - break; - case DW_FORM_data2: - case DW_FORM_ref2: - Value.uval = data.getU16(offset_ptr); - break; - case DW_FORM_data4: - case DW_FORM_ref4: - Value.uval = data.getU32(offset_ptr); - break; - case DW_FORM_data8: - case DW_FORM_ref8: - Value.uval = data.getU64(offset_ptr); - break; - case DW_FORM_sdata: - Value.sval = data.getSLEB128(offset_ptr); - break; - case DW_FORM_strp: - Value.uval = data.getU32(offset_ptr); - break; - case DW_FORM_udata: - case DW_FORM_ref_udata: - Value.uval = data.getULEB128(offset_ptr); - break; - case DW_FORM_string: - Value.cstr = data.getCStr(offset_ptr); - // 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 - // and DW_FORM_strp form values - Value.data = (uint8_t*)Value.cstr; - break; - case DW_FORM_indirect: - Form = data.getULEB128(offset_ptr); - indirect = true; - break; - default: - return false; - } + indirect = false; + switch (Form) { + case DW_FORM_addr: + case DW_FORM_ref_addr: + Value.uval = data.getUnsigned(offset_ptr, cu->getAddressByteSize()); + break; + case DW_FORM_block: + Value.uval = data.getULEB128(offset_ptr); + is_block = true; + break; + case DW_FORM_block1: + Value.uval = data.getU8(offset_ptr); + is_block = true; + break; + case DW_FORM_block2: + Value.uval = data.getU16(offset_ptr); + is_block = true; + break; + case DW_FORM_block4: + Value.uval = data.getU32(offset_ptr); + is_block = true; + break; + case DW_FORM_data1: + case DW_FORM_ref1: + case DW_FORM_flag: + Value.uval = data.getU8(offset_ptr); + break; + case DW_FORM_data2: + case DW_FORM_ref2: + Value.uval = data.getU16(offset_ptr); + break; + case DW_FORM_data4: + case DW_FORM_ref4: + Value.uval = data.getU32(offset_ptr); + break; + case DW_FORM_data8: + case DW_FORM_ref8: + Value.uval = data.getU64(offset_ptr); + break; + case DW_FORM_sdata: + Value.sval = data.getSLEB128(offset_ptr); + break; + case DW_FORM_strp: + Value.uval = data.getU32(offset_ptr); + break; + case DW_FORM_udata: + case DW_FORM_ref_udata: + Value.uval = data.getULEB128(offset_ptr); + break; + case DW_FORM_string: + Value.cstr = data.getCStr(offset_ptr); + // 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 + // and DW_FORM_strp form values + Value.data = (uint8_t*)Value.cstr; + break; + case DW_FORM_indirect: + Form = data.getULEB128(offset_ptr); + indirect = true; + break; + default: + return false; + } } while (indirect); if (is_block) { @@ -165,7 +166,7 @@ DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr, bool 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); } @@ -256,8 +257,8 @@ DWARFFormValue::skipValue(uint16_t form, DataExtractor debug_info_data, } void -DWARFFormValue::dump(raw_ostream &OS, const DataExtractor *debug_str_data, - const DWARFCompileUnit *cu) const { +DWARFFormValue::dump(raw_ostream &OS, const DWARFCompileUnit *cu) const { + DataExtractor debug_str_data(cu->getContext().getStringSection(), true, 0); uint64_t uvalue = getUnsigned(); bool cu_relative_offset = false; @@ -302,19 +303,16 @@ DWARFFormValue::dump(raw_ostream &OS, const DataExtractor *debug_str_data, case DW_FORM_sdata: OS << getSigned(); break; case DW_FORM_udata: OS << getUnsigned(); break; - case DW_FORM_strp: - if (debug_str_data) { - OS << format(" .debug_str[0x%8.8x] = ", (uint32_t)uvalue); - const char* dbg_str = getAsCString(debug_str_data); - if (dbg_str) { - OS << '"'; - OS.write_escaped(dbg_str); - OS << '"'; - } - } else { - OS << format("0x%08x", uvalue); + case DW_FORM_strp: { + OS << format(" .debug_str[0x%8.8x] = ", (uint32_t)uvalue); + const char* dbg_str = getAsCString(&debug_str_data); + if (dbg_str) { + OS << '"'; + OS.write_escaped(dbg_str); + OS << '"'; } break; + } case DW_FORM_ref_addr: OS << format("0x%016x", uvalue); break; @@ -382,25 +380,25 @@ uint64_t DWARFFormValue::getReference(const DWARFCompileUnit *cu) const { } bool -DWARFFormValue::resolveCompileUnitReferences(const DWARFCompileUnit* cu) { - switch (Form) { - case DW_FORM_ref1: - case DW_FORM_ref2: - case DW_FORM_ref4: - case DW_FORM_ref8: - case DW_FORM_ref_udata: - Value.uval += cu->getOffset(); - Form = DW_FORM_ref_addr; - return true; - default: - break; - } - return false; +DWARFFormValue::resolveCompileUnitReferences(const DWARFCompileUnit *cu) { + switch (Form) { + case DW_FORM_ref1: + case DW_FORM_ref2: + case DW_FORM_ref4: + case DW_FORM_ref8: + case DW_FORM_ref_udata: + Value.uval += cu->getOffset(); + Form = DW_FORM_ref_addr; + return true; + default: + break; + } + return false; } const uint8_t *DWARFFormValue::BlockData() const { if (!isInlinedCStr()) - return Value.data; + return Value.data; return NULL; }