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 Workervoid 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 Workervoid 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