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/Core/Stream.h"
13
14 using namespace lldb_private;
15 using namespace std;
16
DWARFDebugMacinfoEntry()17 DWARFDebugMacinfoEntry::DWARFDebugMacinfoEntry() :
18 m_type_code(0),
19 m_line(0),
20 m_op2()
21 {
22 m_op2.cstr = NULL;
23 }
24
~DWARFDebugMacinfoEntry()25 DWARFDebugMacinfoEntry::~DWARFDebugMacinfoEntry()
26 {
27 }
28
29 const char*
GetCString() const30 DWARFDebugMacinfoEntry::GetCString() const
31 {
32 switch (m_type_code)
33 {
34 case 0:
35 case DW_MACINFO_start_file:
36 case DW_MACINFO_end_file:
37 return NULL;
38 default:
39 break;
40 }
41 return m_op2.cstr;
42 }
43
44
45
46 void
Dump(Stream * s) const47 DWARFDebugMacinfoEntry::Dump(Stream *s) const
48 {
49 if (m_type_code)
50 {
51 s->PutCString(DW_MACINFO_value_to_name(m_type_code));
52
53 switch (m_type_code)
54 {
55 case DW_MACINFO_define:
56 s->Printf(" line:%u #define %s\n", (uint32_t)m_line, m_op2.cstr);
57 break;
58
59 case DW_MACINFO_undef:
60 s->Printf(" line:%u #undef %s\n", (uint32_t)m_line, m_op2.cstr);
61 break;
62
63 default:
64 s->Printf(" line:%u str: '%s'\n", (uint32_t)m_line, m_op2.cstr);
65 break;
66
67 case DW_MACINFO_start_file:
68 s->Printf(" line:%u file index: '%u'\n", (uint32_t)m_line, (uint32_t)m_op2.file_idx);
69 break;
70
71 case DW_MACINFO_end_file:
72 break;
73 }
74 }
75 else
76 {
77 s->PutCString(" END\n");
78 }
79 }
80
81
82 bool
Extract(const DataExtractor & mac_info_data,lldb::offset_t * offset_ptr)83 DWARFDebugMacinfoEntry::Extract(const DataExtractor& mac_info_data, lldb::offset_t* offset_ptr)
84 {
85 if (mac_info_data.ValidOffset(*offset_ptr))
86 {
87 m_type_code = mac_info_data.GetU8(offset_ptr);
88
89 switch (m_type_code)
90 {
91
92 case DW_MACINFO_define:
93 case DW_MACINFO_undef:
94 // 2 operands:
95 // Arg 1: operand encodes the line number of the source line on which
96 // the relevant defining or undefining pre-processor directives
97 // appeared.
98 m_line = mac_info_data.GetULEB128(offset_ptr);
99 // Arg 2: define string
100 m_op2.cstr = mac_info_data.GetCStr(offset_ptr);
101 break;
102
103 case DW_MACINFO_start_file:
104 // 2 operands:
105 // Op 1: line number of the source line on which the inclusion
106 // pre-processor directive occurred.
107 m_line = mac_info_data.GetULEB128(offset_ptr);
108 // Op 2: a source file name index to a file number in the statement
109 // information table for the relevant compilation unit.
110 m_op2.file_idx = mac_info_data.GetULEB128(offset_ptr);
111 break;
112
113 case 0: // End of list
114 case DW_MACINFO_end_file:
115 // No operands
116 m_line = DW_INVALID_OFFSET;
117 m_op2.cstr = NULL;
118 break;
119 default:
120 // Vendor specific entries always have a ULEB128 and a string
121 m_line = mac_info_data.GetULEB128(offset_ptr);
122 m_op2.cstr = mac_info_data.GetCStr(offset_ptr);
123 break;
124 }
125 return true;
126 }
127 else
128 m_type_code = 0;
129
130 return false;
131 }
132
133