112 lines
3.1 KiB
C++
112 lines
3.1 KiB
C++
//===-- 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;
|
|
}
|