DWARFDebugLine.cpp revision 5eccd36f1a8d917201b39697f3f1b6f45ecc139c
1b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer//===-- DWARFDebugLine.cpp ------------------------------------------------===//
2b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer//
3b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer//                     The LLVM Compiler Infrastructure
4b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer//
5b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer// This file is distributed under the University of Illinois Open Source
6b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer// License. See LICENSE.TXT for details.
7b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer//
8b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer//===----------------------------------------------------------------------===//
9b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
10b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer#include "DWARFDebugLine.h"
11b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer#include "llvm/Support/Dwarf.h"
12b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer#include "llvm/Support/Format.h"
13b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer#include "llvm/Support/raw_ostream.h"
147393c7f748acb10b143cab296ae98551b4c430f4Benjamin Kramer#include <algorithm>
15b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramerusing namespace llvm;
16b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramerusing namespace dwarf;
17b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
18b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramervoid DWARFDebugLine::Prologue::dump(raw_ostream &OS) const {
19b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  OS << "Line table prologue:\n"
20b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << format("   total_length: 0x%8.8x\n", TotalLength)
21b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << format("        version: %u\n", Version)
22b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << format("prologue_length: 0x%8.8x\n", PrologueLength)
23b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << format("min_inst_length: %u\n", MinInstLength)
24b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << format("default_is_stmt: %u\n", DefaultIsStmt)
25b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << format("      line_base: %i\n", LineBase)
26b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << format("     line_range: %u\n", LineRange)
27b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << format("    opcode_base: %u\n", OpcodeBase);
28b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
29b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  for (uint32_t i = 0; i < StandardOpcodeLengths.size(); ++i)
30b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    OS << format("standard_opcode_lengths[%s] = %u\n", LNStandardString(i+1),
31b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer                 StandardOpcodeLengths[i]);
32b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
33b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  if (!IncludeDirectories.empty())
34b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    for (uint32_t i = 0; i < IncludeDirectories.size(); ++i)
35b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      OS << format("include_directories[%3u] = '", i+1)
36b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer         << IncludeDirectories[i] << "'\n";
37b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
38b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  if (!FileNames.empty()) {
39b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    OS << "                Dir  Mod Time   File Len   File Name\n"
40b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer       << "                ---- ---------- ---------- -----------"
41b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer          "----------------\n";
42b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    for (uint32_t i = 0; i < FileNames.size(); ++i) {
43b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      const FileNameEntry& fileEntry = FileNames[i];
445eccd36f1a8d917201b39697f3f1b6f45ecc139cBenjamin Kramer      OS << format("file_names[%3u] %4" PRIu64 " ", i+1, fileEntry.DirIdx)
455eccd36f1a8d917201b39697f3f1b6f45ecc139cBenjamin Kramer         << format("0x%8.8" PRIx64 " 0x%8.8" PRIx64 " ",
465eccd36f1a8d917201b39697f3f1b6f45ecc139cBenjamin Kramer                   fileEntry.ModTime, fileEntry.Length)
47b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer         << fileEntry.Name << '\n';
48b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    }
49b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  }
50b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer}
51b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
52b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramervoid DWARFDebugLine::Row::postAppend() {
53b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  BasicBlock = false;
54b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  PrologueEnd = false;
55b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  EpilogueBegin = false;
56b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer}
57b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
58b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramervoid DWARFDebugLine::Row::reset(bool default_is_stmt) {
59b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  Address = 0;
60b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  Line = 1;
61b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  Column = 0;
62b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  File = 1;
63b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  Isa = 0;
64b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  IsStmt = default_is_stmt;
65b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  BasicBlock = false;
66b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  EndSequence = false;
67b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  PrologueEnd = false;
68b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  EpilogueBegin = false;
69b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer}
70b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
71b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramervoid DWARFDebugLine::Row::dump(raw_ostream &OS) const {
7241a964931a0e0943ceef28b0c691843bf8ca87b7Benjamin Kramer  OS << format("0x%16.16" PRIx64 " %6u %6u", Address, Line, Column)
73b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << format(" %6u %3u ", File, Isa)
74b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << (IsStmt ? " is_stmt" : "")
75b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << (BasicBlock ? " basic_block" : "")
76b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << (PrologueEnd ? " prologue_end" : "")
77b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << (EpilogueBegin ? " epilogue_begin" : "")
78b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << (EndSequence ? " end_sequence" : "")
79b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer     << '\n';
80b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer}
81b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
82b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramervoid DWARFDebugLine::LineTable::dump(raw_ostream &OS) const {
83b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  Prologue.dump(OS);
84b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  OS << '\n';
85b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
86b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  if (!Rows.empty()) {
87b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    OS << "Address            Line   Column File   ISA Flags\n"
88b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer       << "------------------ ------ ------ ------ --- -------------\n";
89b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    for (std::vector<Row>::const_iterator pos = Rows.begin(),
90b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer         end = Rows.end(); pos != end; ++pos)
91b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      pos->dump(OS);
92b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  }
93b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer}
94b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
956bc4e712dc35db68a621f54c176f6e0b14f40f97Nick LewyckyDWARFDebugLine::State::~State() {}
966bc4e712dc35db68a621f54c176f6e0b14f40f97Nick Lewycky
97b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramervoid DWARFDebugLine::State::appendRowToMatrix(uint32_t offset) {
98b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  ++row;  // Increase the row number.
99b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  LineTable::appendRow(*this);
100b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  Row::postAppend();
101b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer}
102b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
1036bc4e712dc35db68a621f54c176f6e0b14f40f97Nick LewyckyDWARFDebugLine::DumpingState::~DumpingState() {}
1046bc4e712dc35db68a621f54c176f6e0b14f40f97Nick Lewycky
105b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramervoid DWARFDebugLine::DumpingState::finalize(uint32_t offset) {
106b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  LineTable::dump(OS);
107b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer}
108b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
109b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramerconst DWARFDebugLine::LineTable *
110b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin KramerDWARFDebugLine::getLineTable(uint32_t offset) const {
111b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  LineTableConstIter pos = LineTableMap.find(offset);
112b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  if (pos != LineTableMap.end())
113b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    return &pos->second;
114b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  return 0;
115b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer}
116b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
117c26ed9b47ff77ca6244feda9e3837b49624605dbBenjamin Kramerconst DWARFDebugLine::LineTable *
118c26ed9b47ff77ca6244feda9e3837b49624605dbBenjamin KramerDWARFDebugLine::getOrParseLineTable(DataExtractor debug_line_data,
119c26ed9b47ff77ca6244feda9e3837b49624605dbBenjamin Kramer                                    uint32_t offset) {
1201d13d9ed969259d3be267cf0e2c6fe92c1baed49Benjamin Kramer  std::pair<LineTableIter, bool> pos =
1211d13d9ed969259d3be267cf0e2c6fe92c1baed49Benjamin Kramer    LineTableMap.insert(LineTableMapTy::value_type(offset, LineTable()));
1221d13d9ed969259d3be267cf0e2c6fe92c1baed49Benjamin Kramer  if (pos.second) {
123c26ed9b47ff77ca6244feda9e3837b49624605dbBenjamin Kramer    // Parse and cache the line table for at this offset.
124c26ed9b47ff77ca6244feda9e3837b49624605dbBenjamin Kramer    State state;
125c26ed9b47ff77ca6244feda9e3837b49624605dbBenjamin Kramer    if (!parseStatementTable(debug_line_data, &offset, state))
126c26ed9b47ff77ca6244feda9e3837b49624605dbBenjamin Kramer      return 0;
1271d13d9ed969259d3be267cf0e2c6fe92c1baed49Benjamin Kramer    pos.first->second = state;
128c26ed9b47ff77ca6244feda9e3837b49624605dbBenjamin Kramer  }
1291d13d9ed969259d3be267cf0e2c6fe92c1baed49Benjamin Kramer  return &pos.first->second;
130c26ed9b47ff77ca6244feda9e3837b49624605dbBenjamin Kramer}
131c26ed9b47ff77ca6244feda9e3837b49624605dbBenjamin Kramer
132b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramerbool
133b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin KramerDWARFDebugLine::parsePrologue(DataExtractor debug_line_data,
134b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer                              uint32_t *offset_ptr, Prologue *prologue) {
135b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  const uint32_t prologue_offset = *offset_ptr;
136b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
137b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  prologue->clear();
138b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  prologue->TotalLength = debug_line_data.getU32(offset_ptr);
139b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  prologue->Version = debug_line_data.getU16(offset_ptr);
140b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  if (prologue->Version != 2)
141b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    return false;
142b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
143b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  prologue->PrologueLength = debug_line_data.getU32(offset_ptr);
144b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  const uint32_t end_prologue_offset = prologue->PrologueLength + *offset_ptr;
145b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  prologue->MinInstLength = debug_line_data.getU8(offset_ptr);
146b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  prologue->DefaultIsStmt = debug_line_data.getU8(offset_ptr);
147b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  prologue->LineBase = debug_line_data.getU8(offset_ptr);
148b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  prologue->LineRange = debug_line_data.getU8(offset_ptr);
149b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  prologue->OpcodeBase = debug_line_data.getU8(offset_ptr);
150b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
151b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  prologue->StandardOpcodeLengths.reserve(prologue->OpcodeBase-1);
152b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  for (uint32_t i = 1; i < prologue->OpcodeBase; ++i) {
153b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint8_t op_len = debug_line_data.getU8(offset_ptr);
154b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    prologue->StandardOpcodeLengths.push_back(op_len);
155b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  }
156b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
157b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  while (*offset_ptr < end_prologue_offset) {
158b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    const char *s = debug_line_data.getCStr(offset_ptr);
159b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    if (s && s[0])
160b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      prologue->IncludeDirectories.push_back(s);
161b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    else
162b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      break;
163b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  }
164b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
165b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  while (*offset_ptr < end_prologue_offset) {
166b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    const char *name = debug_line_data.getCStr(offset_ptr);
167b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    if (name && name[0]) {
168b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      FileNameEntry fileEntry;
169b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      fileEntry.Name = name;
170b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      fileEntry.DirIdx = debug_line_data.getULEB128(offset_ptr);
171b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      fileEntry.ModTime = debug_line_data.getULEB128(offset_ptr);
172b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      fileEntry.Length = debug_line_data.getULEB128(offset_ptr);
173b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      prologue->FileNames.push_back(fileEntry);
174b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    } else {
175b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      break;
176b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    }
177b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  }
178b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
179b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  if (*offset_ptr != end_prologue_offset) {
180b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    fprintf(stderr, "warning: parsing line table prologue at 0x%8.8x should"
1813a79eac5b8b2fa9e1376a7833723b6bfc1d26570NAKAMURA Takumi                    " have ended at 0x%8.8x but it ended ad 0x%8.8x\n",
182b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            prologue_offset, end_prologue_offset, *offset_ptr);
183b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  }
184b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  return end_prologue_offset;
185b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer}
186b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
187b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramerbool
188b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin KramerDWARFDebugLine::parseStatementTable(DataExtractor debug_line_data,
189b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer                                    uint32_t *offset_ptr, State &state) {
190b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  const uint32_t debug_line_offset = *offset_ptr;
191b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
192b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  Prologue *prologue = &state.Prologue;
193b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
194b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  if (!parsePrologue(debug_line_data, offset_ptr, prologue)) {
195b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // Restore our offset and return false to indicate failure!
196b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    *offset_ptr = debug_line_offset;
197b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    return false;
198b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  }
199b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
200b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  const uint32_t end_offset = debug_line_offset + prologue->TotalLength +
201b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer                              sizeof(prologue->TotalLength);
202b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
2039013db3399d2847899ba32daf58844bba1aef6ddBenjamin Kramer  state.reset();
2049013db3399d2847899ba32daf58844bba1aef6ddBenjamin Kramer
205b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  while (*offset_ptr < end_offset) {
206b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    uint8_t opcode = debug_line_data.getU8(offset_ptr);
207b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
208b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    if (opcode == 0) {
209b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // Extended Opcodes always start with a zero opcode followed by
210b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // a uleb128 length so you can skip ones you don't know about
211b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      uint32_t ext_offset = *offset_ptr;
212b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      uint64_t len = debug_line_data.getULEB128(offset_ptr);
213b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      uint32_t arg_size = len - (*offset_ptr - ext_offset);
214b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
215b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      uint8_t sub_opcode = debug_line_data.getU8(offset_ptr);
216b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      switch (sub_opcode) {
217b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNE_end_sequence:
218b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Set the end_sequence register of the state machine to true and
219b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // append a row to the matrix using the current values of the
220b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // state-machine registers. Then reset the registers to the initial
221b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // values specified above. Every statement program sequence must end
222b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // with a DW_LNE_end_sequence instruction which creates a row whose
223b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // address is that of the byte after the last target machine instruction
224b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // of the sequence.
225b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.EndSequence = true;
226b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.appendRowToMatrix(*offset_ptr);
227b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.reset();
228b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
229b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
230b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNE_set_address:
231b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Takes a single relocatable address as an operand. The size of the
232b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // operand is the size appropriate to hold an address on the target
233b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // machine. Set the address register to the value given by the
234b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // relocatable address. All of the other statement program opcodes
235b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // that affect the address register add a delta to it. This instruction
236b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // stores a relocatable value into it instead.
237b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.Address = debug_line_data.getAddress(offset_ptr);
238b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
239b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
240b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNE_define_file:
241b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Takes 4 arguments. The first is a null terminated string containing
242b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // a source file name. The second is an unsigned LEB128 number
243b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // representing the directory index of the directory in which the file
244b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // was found. The third is an unsigned LEB128 number representing the
245b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // time of last modification of the file. The fourth is an unsigned
246b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // LEB128 number representing the length in bytes of the file. The time
247b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // and length fields may contain LEB128(0) if the information is not
248b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // available.
249b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        //
250b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // The directory index represents an entry in the include_directories
251b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // section of the statement program prologue. The index is LEB128(0)
252b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // if the file was found in the current directory of the compilation,
253b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // LEB128(1) if it was found in the first directory in the
254b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // include_directories section, and so on. The directory index is
255b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // ignored for file names that represent full path names.
256b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        //
257b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // The files are numbered, starting at 1, in the order in which they
258b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // appear; the names in the prologue come before names defined by
259b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // the DW_LNE_define_file instruction. These numbers are used in the
260b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // the file register of the state machine.
261b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        {
262b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer          FileNameEntry fileEntry;
263b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer          fileEntry.Name = debug_line_data.getCStr(offset_ptr);
264b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer          fileEntry.DirIdx = debug_line_data.getULEB128(offset_ptr);
265b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer          fileEntry.ModTime = debug_line_data.getULEB128(offset_ptr);
266b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer          fileEntry.Length = debug_line_data.getULEB128(offset_ptr);
267b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer          prologue->FileNames.push_back(fileEntry);
268b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        }
269b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
270b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
271b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      default:
272b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Length doesn't include the zero opcode byte or the length itself, but
273b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // it does include the sub_opcode, so we have to adjust for that below
274b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        (*offset_ptr) += arg_size;
275b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
276b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      }
277b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    } else if (opcode < prologue->OpcodeBase) {
278b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      switch (opcode) {
279b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // Standard Opcodes
280b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNS_copy:
281b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Takes no arguments. Append a row to the matrix using the
282b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // current values of the state-machine registers. Then set
283b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // the basic_block register to false.
284b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.appendRowToMatrix(*offset_ptr);
285b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
286b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
287b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNS_advance_pc:
288b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Takes a single unsigned LEB128 operand, multiplies it by the
289b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // min_inst_length field of the prologue, and adds the
290b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // result to the address register of the state machine.
291b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.Address += debug_line_data.getULEB128(offset_ptr) *
292b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer                         prologue->MinInstLength;
293b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
294b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
295b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNS_advance_line:
296b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Takes a single signed LEB128 operand and adds that value to
297b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // the line register of the state machine.
298b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.Line += debug_line_data.getSLEB128(offset_ptr);
299b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
300b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
301b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNS_set_file:
302b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Takes a single unsigned LEB128 operand and stores it in the file
303b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // register of the state machine.
304b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.File = debug_line_data.getULEB128(offset_ptr);
305b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
306b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
307b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNS_set_column:
308b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Takes a single unsigned LEB128 operand and stores it in the
309b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // column register of the state machine.
310b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.Column = debug_line_data.getULEB128(offset_ptr);
311b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
312b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
313b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNS_negate_stmt:
314b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Takes no arguments. Set the is_stmt register of the state
315b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // machine to the logical negation of its current value.
316b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.IsStmt = !state.IsStmt;
317b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
318b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
319b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNS_set_basic_block:
320b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Takes no arguments. Set the basic_block register of the
321b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // state machine to true
322b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.BasicBlock = true;
323b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
324b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
325b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNS_const_add_pc:
326b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Takes no arguments. Add to the address register of the state
327b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // machine the address increment value corresponding to special
328b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // opcode 255. The motivation for DW_LNS_const_add_pc is this:
329b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // when the statement program needs to advance the address by a
330b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // small amount, it can use a single special opcode, which occupies
331b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // a single byte. When it needs to advance the address by up to
332b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // twice the range of the last special opcode, it can use
333b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // DW_LNS_const_add_pc followed by a special opcode, for a total
334b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // of two bytes. Only if it needs to advance the address by more
335b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // than twice that range will it need to use both DW_LNS_advance_pc
336b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // and a special opcode, requiring three or more bytes.
337b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        {
338b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer          uint8_t adjust_opcode = 255 - prologue->OpcodeBase;
339b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer          uint64_t addr_offset = (adjust_opcode / prologue->LineRange) *
340b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer                                 prologue->MinInstLength;
341b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer          state.Address += addr_offset;
342b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        }
343b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
344b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
345b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNS_fixed_advance_pc:
346b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Takes a single uhalf operand. Add to the address register of
347b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // the state machine the value of the (unencoded) operand. This
348b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // is the only extended opcode that takes an argument that is not
349b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // a variable length number. The motivation for DW_LNS_fixed_advance_pc
350b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // is this: existing assemblers cannot emit DW_LNS_advance_pc or
351b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // special opcodes because they cannot encode LEB128 numbers or
352b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // judge when the computation of a special opcode overflows and
353b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // requires the use of DW_LNS_advance_pc. Such assemblers, however,
354b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // can use DW_LNS_fixed_advance_pc instead, sacrificing compression.
355b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.Address += debug_line_data.getU16(offset_ptr);
356b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
357b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
358b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNS_set_prologue_end:
359b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Takes no arguments. Set the prologue_end register of the
360b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // state machine to true
361b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.PrologueEnd = true;
362b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
363b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
364b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNS_set_epilogue_begin:
365b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Takes no arguments. Set the basic_block register of the
366b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // state machine to true
367b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.EpilogueBegin = true;
368b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
369b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
370b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      case DW_LNS_set_isa:
371b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Takes a single unsigned LEB128 operand and stores it in the
372b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // column register of the state machine.
373b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        state.Isa = debug_line_data.getULEB128(offset_ptr);
374b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
375b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
376b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      default:
377b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // Handle any unknown standard opcodes here. We know the lengths
378b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // of such opcodes because they are specified in the prologue
379b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        // as a multiple of LEB128 operands for each opcode.
380b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        {
381068d9a564b6010787992597f75e2065ceffb53eaBenjamin Kramer          assert(opcode - 1U < prologue->StandardOpcodeLengths.size());
382b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer          uint8_t opcode_length = prologue->StandardOpcodeLengths[opcode - 1];
383b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer          for (uint8_t i=0; i<opcode_length; ++i)
384b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer            debug_line_data.getULEB128(offset_ptr);
385b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        }
386b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        break;
387b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      }
388b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    } else {
389b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // Special Opcodes
390b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
391b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // A special opcode value is chosen based on the amount that needs
392b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // to be added to the line and address registers. The maximum line
393b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // increment for a special opcode is the value of the line_base
394b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // field in the header, plus the value of the line_range field,
395b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // minus 1 (line base + line range - 1). If the desired line
396b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // increment is greater than the maximum line increment, a standard
397017449d64b8920eb926e9e752e22d2f5921a6237NAKAMURA Takumi      // opcode must be used instead of a special opcode. The "address
398017449d64b8920eb926e9e752e22d2f5921a6237NAKAMURA Takumi      // advance" is calculated by dividing the desired address increment
399b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // by the minimum_instruction_length field from the header. The
400b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // special opcode is then calculated using the following formula:
401b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      //
402b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      //  opcode = (desired line increment - line_base) +
403b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      //           (line_range * address advance) + opcode_base
404b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      //
405b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // If the resulting opcode is greater than 255, a standard opcode
406b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // must be used instead.
407b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      //
408b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // To decode a special opcode, subtract the opcode_base from the
409b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // opcode itself to give the adjusted opcode. The amount to
410b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // increment the address register is the result of the adjusted
411b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // opcode divided by the line_range multiplied by the
412b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // minimum_instruction_length field from the header. That is:
413b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      //
414b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      //  address increment = (adjusted opcode / line_range) *
415b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      //                      minimum_instruction_length
416b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      //
417b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // The amount to increment the line register is the line_base plus
418b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // the result of the adjusted opcode modulo the line_range. That is:
419b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      //
420b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // line increment = line_base + (adjusted opcode % line_range)
421b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
422b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      uint8_t adjust_opcode = opcode - prologue->OpcodeBase;
423b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      uint64_t addr_offset = (adjust_opcode / prologue->LineRange) *
424b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer                             prologue->MinInstLength;
425b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      int32_t line_offset = prologue->LineBase +
426b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer                            (adjust_opcode % prologue->LineRange);
427b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      state.Line += line_offset;
428b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      state.Address += addr_offset;
429b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      state.appendRowToMatrix(*offset_ptr);
430b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    }
431b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  }
432b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
433b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  state.finalize(*offset_ptr);
434b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
435b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  return end_offset;
436b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer}
437b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
438b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramerstatic bool findMatchingAddress(const DWARFDebugLine::Row& row1,
439b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer                                const DWARFDebugLine::Row& row2) {
440b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  return row1.Address < row2.Address;
441b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer}
442b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer
443b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Krameruint32_t
444b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin KramerDWARFDebugLine::LineTable::lookupAddress(uint64_t address,
445b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer                                         uint64_t cu_high_pc) const {
446b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  uint32_t index = UINT32_MAX;
447b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  if (!Rows.empty()) {
448b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // Use the lower_bound algorithm to perform a binary search since we know
449b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    // that our line table data is ordered by address.
450b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    DWARFDebugLine::Row row;
451b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    row.Address = address;
452b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    typedef std::vector<Row>::const_iterator iterator;
453b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    iterator begin_pos = Rows.begin();
454b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    iterator end_pos = Rows.end();
455b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    iterator pos = std::lower_bound(begin_pos, end_pos, row,
456b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer                                    findMatchingAddress);
457b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    if (pos == end_pos) {
458b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      if (address < cu_high_pc)
459b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        return Rows.size()-1;
460b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    } else {
461b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // Rely on fact that we are using a std::vector and we can do
462b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // pointer arithmetic to find the row index (which will be one less
463b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // that what we found since it will find the first position after
464b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // the current address) since std::vector iterators are just
465b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      // pointers to the container type.
466b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      index = pos - begin_pos;
467b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      if (pos->Address > address) {
468b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        if (index > 0)
469b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer          --index;
470b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer        else
471b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer          index = UINT32_MAX;
472b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer      }
473b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer    }
474b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  }
475b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer  return index; // Failed to find address.
476b848e976110a2c4f0a6a9e252115ba291c844fbeBenjamin Kramer}
477