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