xref: /aosp_15_r20/external/llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- DWARFDebugMacro.cpp -----------------------------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/DWARF/DWARFDebugMacro.h"
11*9880d681SAndroid Build Coastguard Worker #include "SyntaxHighlighting.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Dwarf.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Format.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
15*9880d681SAndroid Build Coastguard Worker 
16*9880d681SAndroid Build Coastguard Worker using namespace llvm;
17*9880d681SAndroid Build Coastguard Worker using namespace dwarf;
18*9880d681SAndroid Build Coastguard Worker using namespace syntax;
19*9880d681SAndroid Build Coastguard Worker 
dump(raw_ostream & OS) const20*9880d681SAndroid Build Coastguard Worker void DWARFDebugMacro::dump(raw_ostream &OS) const {
21*9880d681SAndroid Build Coastguard Worker   unsigned IndLevel = 0;
22*9880d681SAndroid Build Coastguard Worker   for (const Entry &E : Macros) {
23*9880d681SAndroid Build Coastguard Worker     // There should not be DW_MACINFO_end_file when IndLevel is Zero. However,
24*9880d681SAndroid Build Coastguard Worker     // this check handles the case of corrupted ".debug_macinfo" section.
25*9880d681SAndroid Build Coastguard Worker     if (IndLevel > 0)
26*9880d681SAndroid Build Coastguard Worker       IndLevel -= (E.Type == DW_MACINFO_end_file);
27*9880d681SAndroid Build Coastguard Worker     // Print indentation.
28*9880d681SAndroid Build Coastguard Worker     for (unsigned I = 0; I < IndLevel; I++)
29*9880d681SAndroid Build Coastguard Worker       OS << "  ";
30*9880d681SAndroid Build Coastguard Worker     IndLevel += (E.Type == DW_MACINFO_start_file);
31*9880d681SAndroid Build Coastguard Worker 
32*9880d681SAndroid Build Coastguard Worker     WithColor(OS, syntax::Macro).get() << MacinfoString(E.Type);
33*9880d681SAndroid Build Coastguard Worker     switch (E.Type) {
34*9880d681SAndroid Build Coastguard Worker     default:
35*9880d681SAndroid Build Coastguard Worker       // Got a corrupted ".debug_macinfo" section (invalid macinfo type).
36*9880d681SAndroid Build Coastguard Worker       break;
37*9880d681SAndroid Build Coastguard Worker     case DW_MACINFO_define:
38*9880d681SAndroid Build Coastguard Worker     case DW_MACINFO_undef:
39*9880d681SAndroid Build Coastguard Worker       OS << " - lineno: " << E.Line;
40*9880d681SAndroid Build Coastguard Worker       OS << " macro: " << E.MacroStr;
41*9880d681SAndroid Build Coastguard Worker       break;
42*9880d681SAndroid Build Coastguard Worker     case DW_MACINFO_start_file:
43*9880d681SAndroid Build Coastguard Worker       OS << " - lineno: " << E.Line;
44*9880d681SAndroid Build Coastguard Worker       OS << " filenum: " << E.File;
45*9880d681SAndroid Build Coastguard Worker       break;
46*9880d681SAndroid Build Coastguard Worker     case DW_MACINFO_end_file:
47*9880d681SAndroid Build Coastguard Worker       break;
48*9880d681SAndroid Build Coastguard Worker     case DW_MACINFO_vendor_ext:
49*9880d681SAndroid Build Coastguard Worker       OS << " - constant: " << E.ExtConstant;
50*9880d681SAndroid Build Coastguard Worker       OS << " string: " << E.ExtStr;
51*9880d681SAndroid Build Coastguard Worker       break;
52*9880d681SAndroid Build Coastguard Worker     }
53*9880d681SAndroid Build Coastguard Worker     OS << "\n";
54*9880d681SAndroid Build Coastguard Worker   }
55*9880d681SAndroid Build Coastguard Worker }
56*9880d681SAndroid Build Coastguard Worker 
parse(DataExtractor data)57*9880d681SAndroid Build Coastguard Worker void DWARFDebugMacro::parse(DataExtractor data) {
58*9880d681SAndroid Build Coastguard Worker   uint32_t Offset = 0;
59*9880d681SAndroid Build Coastguard Worker   while (data.isValidOffset(Offset)) {
60*9880d681SAndroid Build Coastguard Worker     // A macro list entry consists of:
61*9880d681SAndroid Build Coastguard Worker     Entry E;
62*9880d681SAndroid Build Coastguard Worker     // 1. Macinfo type
63*9880d681SAndroid Build Coastguard Worker     E.Type = data.getULEB128(&Offset);
64*9880d681SAndroid Build Coastguard Worker 
65*9880d681SAndroid Build Coastguard Worker     if (E.Type == 0) {
66*9880d681SAndroid Build Coastguard Worker       // Reached end of ".debug_macinfo" section.
67*9880d681SAndroid Build Coastguard Worker       return;
68*9880d681SAndroid Build Coastguard Worker     }
69*9880d681SAndroid Build Coastguard Worker 
70*9880d681SAndroid Build Coastguard Worker     switch (E.Type) {
71*9880d681SAndroid Build Coastguard Worker     default:
72*9880d681SAndroid Build Coastguard Worker       // Got a corrupted ".debug_macinfo" section (invalid macinfo type).
73*9880d681SAndroid Build Coastguard Worker       // Push the corrupted entry to the list and halt parsing.
74*9880d681SAndroid Build Coastguard Worker       E.Type = DW_MACINFO_invalid;
75*9880d681SAndroid Build Coastguard Worker       Macros.push_back(E);
76*9880d681SAndroid Build Coastguard Worker       return;
77*9880d681SAndroid Build Coastguard Worker     case DW_MACINFO_define:
78*9880d681SAndroid Build Coastguard Worker     case DW_MACINFO_undef:
79*9880d681SAndroid Build Coastguard Worker       // 2. Source line
80*9880d681SAndroid Build Coastguard Worker       E.Line = data.getULEB128(&Offset);
81*9880d681SAndroid Build Coastguard Worker       // 3. Macro string
82*9880d681SAndroid Build Coastguard Worker       E.MacroStr = data.getCStr(&Offset);
83*9880d681SAndroid Build Coastguard Worker       break;
84*9880d681SAndroid Build Coastguard Worker     case DW_MACINFO_start_file:
85*9880d681SAndroid Build Coastguard Worker       // 2. Source line
86*9880d681SAndroid Build Coastguard Worker       E.Line = data.getULEB128(&Offset);
87*9880d681SAndroid Build Coastguard Worker       // 3. Source file id
88*9880d681SAndroid Build Coastguard Worker       E.File = data.getULEB128(&Offset);
89*9880d681SAndroid Build Coastguard Worker       break;
90*9880d681SAndroid Build Coastguard Worker     case DW_MACINFO_end_file:
91*9880d681SAndroid Build Coastguard Worker       break;
92*9880d681SAndroid Build Coastguard Worker     case DW_MACINFO_vendor_ext:
93*9880d681SAndroid Build Coastguard Worker       // 2. Vendor extension constant
94*9880d681SAndroid Build Coastguard Worker       E.ExtConstant = data.getULEB128(&Offset);
95*9880d681SAndroid Build Coastguard Worker       // 3. Vendor extension string
96*9880d681SAndroid Build Coastguard Worker       E.ExtStr = data.getCStr(&Offset);
97*9880d681SAndroid Build Coastguard Worker       break;
98*9880d681SAndroid Build Coastguard Worker     }
99*9880d681SAndroid Build Coastguard Worker 
100*9880d681SAndroid Build Coastguard Worker     Macros.push_back(E);
101*9880d681SAndroid Build Coastguard Worker   }
102*9880d681SAndroid Build Coastguard Worker }
103