]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfoEntry.cpp
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / source / Plugins / SymbolFile / DWARF / DWARFDebugMacinfoEntry.cpp
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
17 DWARFDebugMacinfoEntry::DWARFDebugMacinfoEntry() :
18     m_type_code(0),
19     m_line(0),
20     m_op2()
21 {
22     m_op2.cstr = NULL;
23 }
24
25 DWARFDebugMacinfoEntry::~DWARFDebugMacinfoEntry()
26 {
27 }
28
29 const char*
30 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
47 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
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