| //===-- DWARFDebugMacinfoEntry.cpp ------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "DWARFDebugMacinfoEntry.h" |
| |
| #include "lldb/Utility/Stream.h" |
| |
| using namespace lldb_private; |
| using namespace std; |
| |
| DWARFDebugMacinfoEntry::DWARFDebugMacinfoEntry() |
| : m_type_code(0), m_line(0), m_op2() { |
| m_op2.cstr = NULL; |
| } |
| |
| DWARFDebugMacinfoEntry::~DWARFDebugMacinfoEntry() {} |
| |
| const char *DWARFDebugMacinfoEntry::GetCString() const { |
| switch (m_type_code) { |
| case 0: |
| case DW_MACINFO_start_file: |
| case DW_MACINFO_end_file: |
| return NULL; |
| default: |
| break; |
| } |
| return m_op2.cstr; |
| } |
| |
| void DWARFDebugMacinfoEntry::Dump(Stream *s) const { |
| if (m_type_code) { |
| s->PutCString(DW_MACINFO_value_to_name(m_type_code)); |
| |
| switch (m_type_code) { |
| case DW_MACINFO_define: |
| s->Printf(" line:%u #define %s\n", (uint32_t)m_line, m_op2.cstr); |
| break; |
| |
| case DW_MACINFO_undef: |
| s->Printf(" line:%u #undef %s\n", (uint32_t)m_line, m_op2.cstr); |
| break; |
| |
| default: |
| s->Printf(" line:%u str: '%s'\n", (uint32_t)m_line, m_op2.cstr); |
| break; |
| |
| case DW_MACINFO_start_file: |
| s->Printf(" line:%u file index: '%u'\n", (uint32_t)m_line, |
| (uint32_t)m_op2.file_idx); |
| break; |
| |
| case DW_MACINFO_end_file: |
| break; |
| } |
| } else { |
| s->PutCString(" END\n"); |
| } |
| } |
| |
| bool DWARFDebugMacinfoEntry::Extract(const DWARFDataExtractor &mac_info_data, |
| lldb::offset_t *offset_ptr) { |
| if (mac_info_data.ValidOffset(*offset_ptr)) { |
| m_type_code = mac_info_data.GetU8(offset_ptr); |
| |
| switch (m_type_code) { |
| |
| case DW_MACINFO_define: |
| case DW_MACINFO_undef: |
| // 2 operands: |
| // Arg 1: operand encodes the line number of the source line on which |
| // the relevant defining or undefining pre-processor directives |
| // appeared. |
| m_line = mac_info_data.GetULEB128(offset_ptr); |
| // Arg 2: define string |
| m_op2.cstr = mac_info_data.GetCStr(offset_ptr); |
| break; |
| |
| case DW_MACINFO_start_file: |
| // 2 operands: |
| // Op 1: line number of the source line on which the inclusion |
| // pre-processor directive occurred. |
| m_line = mac_info_data.GetULEB128(offset_ptr); |
| // Op 2: a source file name index to a file number in the statement |
| // information table for the relevant compilation unit. |
| m_op2.file_idx = mac_info_data.GetULEB128(offset_ptr); |
| break; |
| |
| case 0: // End of list |
| case DW_MACINFO_end_file: |
| // No operands |
| m_line = DW_INVALID_OFFSET; |
| m_op2.cstr = NULL; |
| break; |
| default: |
| // Vendor specific entries always have a ULEB128 and a string |
| m_line = mac_info_data.GetULEB128(offset_ptr); |
| m_op2.cstr = mac_info_data.GetCStr(offset_ptr); |
| break; |
| } |
| return true; |
| } else |
| m_type_code = 0; |
| |
| return false; |
| } |