dwarf_assert(desc, -1, file, line);
}
+#define DWARF_LINENO(line) \
+ safe_dwarf_lineno(line, __FILE__, __LINE__)
+
inline int
-safe_dwarf_lineno(const Dwarf_Line* line)
+safe_dwarf_lineno(const Dwarf_Line* line,
+ const std::string& errfile, int errline)
{
int lineno;
- DWARF_ASSERT("dwarf_lineno",
- dwarf_lineno(const_cast<Dwarf_Line*>(line), &lineno));
+ dwarf_assert("dwarf_lineno",
+ dwarf_lineno(const_cast<Dwarf_Line*>(line), &lineno),
+ errfile, errline);
return lineno;
}
+#define DWARF_LINEADDR(line) \
+ safe_dwarf_lineaddr(line, __FILE__, __LINE__)
+
inline Dwarf_Addr
-safe_dwarf_lineaddr(const Dwarf_Line* line)
+safe_dwarf_lineaddr(const Dwarf_Line* line,
+ const std::string& errfile, int errline)
{
Dwarf_Addr addr;
- DWARF_ASSERT("dwarf_lineaddr",
- dwarf_lineaddr(const_cast<Dwarf_Line*>(line), &addr));
+ dwarf_assert("dwarf_lineaddr",
+ dwarf_lineaddr(const_cast<Dwarf_Line*>(line), &addr),
+ errfile, errline);
return addr;
}
+#define DWARF_LINESRC(line) \
+ safe_dwarf_linesrc(line, NULL, NULL, __FILE__, __LINE__)
+#define DWARF_LINESRC2(line, mtime) \
+ safe_dwarf_linesrc(line, mtime, NULL, __FILE__, __LINE__)
+#define DWARF_LINESRC3(line, mtime, length) \
+ safe_dwarf_linesrc(line, mtime, length, __FILE__, __LINE__)
+
inline const char*
safe_dwarf_linesrc(const Dwarf_Line* line,
- Dwarf_Word* mtime = NULL,
- Dwarf_Word* length = NULL)
+ Dwarf_Word* mtime,
+ Dwarf_Word* length,
+ const std::string& errfile, int errline)
{
const char* linesrc =
dwarf_linesrc(const_cast<Dwarf_Line*>(line), mtime, length);
- DWARF_ASSERT("dwarf_linesrc", linesrc);
+ dwarf_assert("dwarf_linesrc", linesrc, errfile, errline);
return linesrc;
}
+#define DWARF_LINEPROLOGUEEND(line) \
+ safe_dwarf_lineprologueend(line, __FILE__, __LINE__)
+
inline bool
-safe_dwarf_lineprologueend(const Dwarf_Line* line)
+safe_dwarf_lineprologueend(const Dwarf_Line* line,
+ const std::string& errfile, int errline)
{
bool flag;
- DWARF_ASSERT("is_prologue_end",
- dwarf_lineprologueend(const_cast<Dwarf_Line*>(line), &flag));
+ dwarf_assert("is_prologue_end",
+ dwarf_lineprologueend(const_cast<Dwarf_Line*>(line), &flag),
+ errfile, errline);
return flag;
}
if (a == b)
return false;
- int lineno_a = safe_dwarf_lineno(a);
- int lineno_b = safe_dwarf_lineno(b);
+ int lineno_a = DWARF_LINENO(a);
+ int lineno_b = DWARF_LINENO(b);
if (lineno_a == lineno_b)
- return safe_dwarf_lineaddr(a) < safe_dwarf_lineaddr(b);
+ return DWARF_LINEADDR(a) < DWARF_LINEADDR(b);
return lineno_a < lineno_b;
}
{
assert(a || b);
if (a)
- return safe_dwarf_lineno(a) < lineno;
+ return DWARF_LINENO(a) < lineno;
else
- return lineno < safe_dwarf_lineno(b);
+ return lineno < DWARF_LINENO(b);
}
};
for (size_t i = 0; i < nlines_cu; i++)
{
Dwarf_Line *line = dwarf_onesrcline(lines_cu, i);
- const char *linesrc = safe_dwarf_linesrc(line);
+ const char *linesrc = DWARF_LINESRC(line);
if (strcmp(srcfile, linesrc))
continue;
lines->push_back(line);
clog << "found the following lines for %s:" << endl;
lines_t::iterator i;
for (i = lines->begin(); i != lines->end(); ++i)
- cout << safe_dwarf_lineno(*i) << " = " << hex
- << safe_dwarf_lineaddr(*i) << dec << endl;
+ cout << DWARF_LINENO(*i) << " = " << hex
+ << DWARF_LINEADDR(*i) << dec << endl;
}
}
return lines;
// dwarf_getsrc_die() uses binary search to find the Dwarf_Line, but will
// return the wrong line if not found.
Dwarf_Line *line = dwarf_getsrc_die(cu, func.entrypc);
- if (line && safe_dwarf_lineaddr(line) == func.entrypc)
+ if (line && DWARF_LINEADDR(line) == func.entrypc)
return line;
// Line not found (or line at wrong addr). We have to resort to a slower
for (size_t i = 0; i < nlines; i++)
{
line = dwarf_onesrcline(lines, i);
- if (dwarf_haspc(&func.die, safe_dwarf_lineaddr(line)))
+ if (dwarf_haspc(&func.die, DWARF_LINEADDR(line)))
return line;
}
return NULL;
lines_t lines_in_die;
for (lines_t::iterator line = range.first;
line != range.second; ++line)
- if (dwarf_haspc(die, safe_dwarf_lineaddr(*line)))
+ if (dwarf_haspc(die, DWARF_LINEADDR(*line)))
lines_in_die.push_back(*line);
return lines_in_die;
}
if (!start_line)
return;
- for (int lineno = safe_dwarf_lineno(start_line);;)
+ for (int lineno = DWARF_LINENO(start_line);;)
{
lines_range_t range = lineno_equal_range(cu_lines, lineno);
// break out if there are no more lines, otherwise, go to the next lineno
if (range.second == cu_lines->end())
break;
- lineno = safe_dwarf_lineno(*range.second);
+ lineno = DWARF_LINENO(*range.second);
}
}
for (lines_t::iterator line = matching_lines.begin();
line != matching_lines.end(); ++line)
{
- int lineno = safe_dwarf_lineno(*line);
- Dwarf_Addr addr = safe_dwarf_lineaddr(*line);
+ int lineno = DWARF_LINENO(*line);
+ Dwarf_Addr addr = DWARF_LINEADDR(*line);
bool is_new_addr = probed_addrs.insert(addr).second;
if (is_new_addr)
callback(addr, lineno, data);
{
entrypc_srcline_idx = (l + h) / 2;
Dwarf_Line* lr = dwarf_onesrcline(lines, entrypc_srcline_idx);
- Dwarf_Addr addr = safe_dwarf_lineaddr(lr);
+ Dwarf_Addr addr = DWARF_LINEADDR(lr);
if (addr == entrypc) { entrypc_srcline = lr; break; }
else if (l + 1 == h) { break; } // ran off bottom of tree
else if (addr < entrypc) { l = entrypc_srcline_idx; }
// the entrypc maps to a statement in the body rather than the
// declaration.
- int entrypc_srcline_lineno = safe_dwarf_lineno(entrypc_srcline);
+ int entrypc_srcline_lineno = DWARF_LINENO(entrypc_srcline);
unsigned postprologue_srcline_idx = entrypc_srcline_idx;
Dwarf_Line *postprologue_srcline = entrypc_srcline;
{
postprologue_srcline = dwarf_onesrcline(lines,
postprologue_srcline_idx);
- Dwarf_Addr lineaddr = safe_dwarf_lineaddr(postprologue_srcline);
- const char* linesrc = safe_dwarf_linesrc(postprologue_srcline);
- int lineno = safe_dwarf_lineno(postprologue_srcline);
- bool lineprologue_end = safe_dwarf_lineprologueend(postprologue_srcline);
+ Dwarf_Addr lineaddr = DWARF_LINEADDR(postprologue_srcline);
+ const char* linesrc = DWARF_LINESRC(postprologue_srcline);
+ int lineno = DWARF_LINENO(postprologue_srcline);
+ bool lineprologue_end = DWARF_LINEPROLOGUEEND(postprologue_srcline);
if (sess.verbose>2)
clog << _F("checking line record %#" PRIx64 "@%s:%d%s\n", lineaddr,
} // loop over srclines
- Dwarf_Addr postprologue_addr = safe_dwarf_lineaddr(postprologue_srcline);
+ Dwarf_Addr postprologue_addr = DWARF_LINEADDR(postprologue_srcline);
if (postprologue_addr >= highpc)
{
// pick addr of previous line record
Dwarf_Line *lr = dwarf_onesrcline(lines, postprologue_srcline_idx-1);
- postprologue_addr = safe_dwarf_lineaddr(lr);
+ postprologue_addr = DWARF_LINEADDR(lr);
}
it->prologue_end = postprologue_addr;
if (postprologue_addr == entrypc)
clog << _(" (naked)");
//TRANSLATORS: Here we're adding some classification datum (ie we went over)
- if (safe_dwarf_lineaddr(postprologue_srcline) >= highpc)
+ if (DWARF_LINEADDR(postprologue_srcline) >= highpc)
clog << _(" (tail-call?)");
//TRANSLATORS: Here we're adding some classification datum (ie it was marked)
- if (safe_dwarf_lineprologueend(postprologue_srcline))
+ if (DWARF_LINEPROLOGUEEND(postprologue_srcline))
clog << _(" (marked)");
clog << " = 0x" << hex << postprologue_addr << dec << "\n";