1 //===-- DWARFDebugMacinfoEntry.cpp ------------------------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "DWARFDebugMacinfoEntry.h"
11
12 #include "lldb/Utility/Stream.h"
13
14 using namespace lldb_private;
15 using namespace std;
16
DWARFDebugMacinfoEntry()17 DWARFDebugMacinfoEntry::DWARFDebugMacinfoEntry()
18 : m_type_code(0), m_line(0), m_op2() {
19 m_op2.cstr = NULL;
20 }
21
~DWARFDebugMacinfoEntry()22 DWARFDebugMacinfoEntry::~DWARFDebugMacinfoEntry() {}
23
GetCString() const24 const char *DWARFDebugMacinfoEntry::GetCString() const {
25 switch (m_type_code) {
26 case 0:
27 case DW_MACINFO_start_file:
28 case DW_MACINFO_end_file:
29 return NULL;
30 default:
31 break;
32 }
33 return m_op2.cstr;
34 }
35
Dump(Stream * s) const36 void DWARFDebugMacinfoEntry::Dump(Stream *s) const {
37 if (m_type_code) {
38 s->PutCString(DW_MACINFO_value_to_name(m_type_code));
39
40 switch (m_type_code) {
41 case DW_MACINFO_define:
42 s->Printf(" line:%u #define %s\n", (uint32_t)m_line, m_op2.cstr);
43 break;
44
45 case DW_MACINFO_undef:
46 s->Printf(" line:%u #undef %s\n", (uint32_t)m_line, m_op2.cstr);
47 break;
48
49 default:
50 s->Printf(" line:%u str: '%s'\n", (uint32_t)m_line, m_op2.cstr);
51 break;
52
53 case DW_MACINFO_start_file:
54 s->Printf(" line:%u file index: '%u'\n", (uint32_t)m_line,
55 (uint32_t)m_op2.file_idx);
56 break;
57
58 case DW_MACINFO_end_file:
59 break;
60 }
61 } else {
62 s->PutCString(" END\n");
63 }
64 }
65
Extract(const DWARFDataExtractor & mac_info_data,lldb::offset_t * offset_ptr)66 bool DWARFDebugMacinfoEntry::Extract(const DWARFDataExtractor &mac_info_data,
67 lldb::offset_t *offset_ptr) {
68 if (mac_info_data.ValidOffset(*offset_ptr)) {
69 m_type_code = mac_info_data.GetU8(offset_ptr);
70
71 switch (m_type_code) {
72
73 case DW_MACINFO_define:
74 case DW_MACINFO_undef:
75 // 2 operands:
76 // Arg 1: operand encodes the line number of the source line on which
77 // the relevant defining or undefining pre-processor directives
78 // appeared.
79 m_line = mac_info_data.GetULEB128(offset_ptr);
80 // Arg 2: define string
81 m_op2.cstr = mac_info_data.GetCStr(offset_ptr);
82 break;
83
84 case DW_MACINFO_start_file:
85 // 2 operands:
86 // Op 1: line number of the source line on which the inclusion
87 // pre-processor directive occurred.
88 m_line = mac_info_data.GetULEB128(offset_ptr);
89 // Op 2: a source file name index to a file number in the statement
90 // information table for the relevant compilation unit.
91 m_op2.file_idx = mac_info_data.GetULEB128(offset_ptr);
92 break;
93
94 case 0: // End of list
95 case DW_MACINFO_end_file:
96 // No operands
97 m_line = DW_INVALID_OFFSET;
98 m_op2.cstr = NULL;
99 break;
100 default:
101 // Vendor specific entries always have a ULEB128 and a string
102 m_line = mac_info_data.GetULEB128(offset_ptr);
103 m_op2.cstr = mac_info_data.GetCStr(offset_ptr);
104 break;
105 }
106 return true;
107 } else
108 m_type_code = 0;
109
110 return false;
111 }
112