Breakpad DWARF Reader: Change LineInfoHandler::AddLine to provide the line's length.
Breakpad's DWARF line number info parser provides a code address, file, and line number for each code/source pairing, but doesn't provide the length of the machine code. This makes that change, as discussed in the following thread: http://groups.google.com/group/google-breakpad-dev/browse_thread/thread/ed8d2fde79319368p This patch also makes the corresponding changes to the functioninfo.cc module, used by the Mac dumper. This patch has no effect on the Mac dumper's output. a=jimblandy, r=ccoutant git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@494 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
parent
e15bffe466
commit
8bfcc2683f
4 changed files with 50 additions and 28 deletions
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2006 Google Inc. All Rights Reserved.
|
// Copyright 2010 Google Inc. All Rights Reserved.
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without
|
// Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are
|
// modification, are permitted provided that the following conditions are
|
||||||
|
@ -844,18 +844,39 @@ void LineInfo::ReadLines() {
|
||||||
lengthstart += 4;
|
lengthstart += 4;
|
||||||
|
|
||||||
const char* lineptr = after_header_;
|
const char* lineptr = after_header_;
|
||||||
|
lsm.Reset(header_.default_is_stmt);
|
||||||
|
|
||||||
|
// The LineInfoHandler interface expects each line's length along
|
||||||
|
// with its address, but DWARF only provides addresses (sans
|
||||||
|
// length), and an end-of-sequence address; one infers the length
|
||||||
|
// from the next address. So we report a line only when we get the
|
||||||
|
// next line's address, or the end-of-sequence address.
|
||||||
|
bool have_pending_line = false;
|
||||||
|
uint64 pending_address = 0;
|
||||||
|
uint32 pending_file_num = 0, pending_line_num = 0, pending_column_num = 0;
|
||||||
|
|
||||||
while (lineptr < lengthstart + header_.total_length) {
|
while (lineptr < lengthstart + header_.total_length) {
|
||||||
lsm.Reset(header_.default_is_stmt);
|
size_t oplength;
|
||||||
while (!lsm.end_sequence) {
|
bool add_row = ProcessOneOpcode(reader_, handler_, header_,
|
||||||
size_t oplength;
|
lineptr, &lsm, &oplength, (uintptr)-1,
|
||||||
bool add_line = ProcessOneOpcode(reader_, handler_, header_,
|
NULL);
|
||||||
lineptr, &lsm, &oplength, (uintptr)-1,
|
if (add_row) {
|
||||||
NULL);
|
if (have_pending_line)
|
||||||
if (add_line)
|
handler_->AddLine(pending_address, lsm.address - pending_address,
|
||||||
handler_->AddLine(lsm.address, lsm.file_num, lsm.line_num,
|
pending_file_num, pending_line_num,
|
||||||
lsm.column_num);
|
pending_column_num);
|
||||||
lineptr += oplength;
|
if (lsm.end_sequence) {
|
||||||
|
lsm.Reset(header_.default_is_stmt);
|
||||||
|
have_pending_line = false;
|
||||||
|
} else {
|
||||||
|
pending_address = lsm.address;
|
||||||
|
pending_file_num = lsm.file_num;
|
||||||
|
pending_line_num = lsm.line_num;
|
||||||
|
pending_column_num = lsm.column_num;
|
||||||
|
have_pending_line = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
lineptr += oplength;
|
||||||
}
|
}
|
||||||
|
|
||||||
after_header_ = lengthstart + header_.total_length;
|
after_header_ = lengthstart + header_.total_length;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2006 Google Inc. All Rights Reserved.
|
// Copyright 2010 Google Inc. All Rights Reserved.
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without
|
// Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are
|
// modification, are permitted provided that the following conditions are
|
||||||
|
@ -167,12 +167,13 @@ class LineInfoHandler {
|
||||||
uint64 length) { }
|
uint64 length) { }
|
||||||
|
|
||||||
// Called when the line info reader has a new line, address pair
|
// Called when the line info reader has a new line, address pair
|
||||||
// ready for us. ADDRESS is the address of the code, FILE_NUM is
|
// ready for us. ADDRESS is the address of the code, LENGTH is the
|
||||||
// the file number containing the code, LINE_NUM is the line number in
|
// length of its machine code in bytes, FILE_NUM is the file number
|
||||||
// that file for the code, and COLUMN_NUM is the column number the code
|
// containing the code, LINE_NUM is the line number in that file for
|
||||||
// starts at, if we know it (0 otherwise).
|
// the code, and COLUMN_NUM is the column number the code starts at,
|
||||||
virtual void AddLine(uint64 address, uint32 file_num, uint32 line_num,
|
// if we know it (0 otherwise).
|
||||||
uint32 column_num) { }
|
virtual void AddLine(uint64 address, uint64 length,
|
||||||
|
uint32 file_num, uint32 line_num, uint32 column_num) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
// The base of DWARF2/3 debug info is a DIE (Debugging Information
|
// The base of DWARF2/3 debug info is a DIE (Debugging Information
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2006 Google Inc. All Rights Reserved.
|
// Copyright 2010 Google Inc. All Rights Reserved.
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without
|
// Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are
|
// modification, are permitted provided that the following conditions are
|
||||||
|
@ -89,7 +89,7 @@ void CULineInfoHandler::DefineFile(const string& name,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CULineInfoHandler::AddLine(uint64 address, uint32 file_num,
|
void CULineInfoHandler::AddLine(uint64 address, uint64 length, uint32 file_num,
|
||||||
uint32 line_num, uint32 column_num) {
|
uint32 line_num, uint32 column_num) {
|
||||||
if (file_num < files_->size()) {
|
if (file_num < files_->size()) {
|
||||||
linemap_->insert(make_pair(address, make_pair(files_->at(file_num).name.c_str(),
|
linemap_->insert(make_pair(address, make_pair(files_->at(file_num).name.c_str(),
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2006 Google Inc. All Rights Reserved.
|
// Copyright 2010 Google Inc. All Rights Reserved.
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without
|
// Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are
|
// modification, are permitted provided that the following conditions are
|
||||||
|
@ -92,13 +92,13 @@ class CULineInfoHandler: public LineInfoHandler {
|
||||||
|
|
||||||
|
|
||||||
// Called when the line info reader has a new line, address pair
|
// Called when the line info reader has a new line, address pair
|
||||||
// ready for us. ADDRESS is the address of the code, FILE_NUM is
|
// ready for us. ADDRESS is the address of the code, LENGTH is the
|
||||||
// the file number containing the code, LINE_NUM is the line number
|
// length of its machine code in bytes, FILE_NUM is the file number
|
||||||
// in that file for the code, and COLUMN_NUM is the column number
|
// containing the code, LINE_NUM is the line number in that file for
|
||||||
// the code starts at, if we know it (0 otherwise).
|
// the code, and COLUMN_NUM is the column number the code starts at,
|
||||||
virtual void AddLine(uint64 address, uint32 file_num, uint32 line_num,
|
// if we know it (0 otherwise).
|
||||||
uint32 column_num);
|
virtual void AddLine(uint64 address, uint64 length,
|
||||||
|
uint32 file_num, uint32 line_num, uint32 column_num);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LineMap* linemap_;
|
LineMap* linemap_;
|
||||||
|
|
Loading…
Reference in a new issue