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