mirror of
https://github.com/yuzu-mirror/breakpad.git
synced 2025-12-31 21:50:04 +01:00
This is a big change. dwarf5 range lists are quite a bit more complicated than dwarf 4 range lists, both in the contextual information required, and in their own representation and interpretation. The big design choice here is how to pass the CU information all the way down to the reader. I chose a structure, because otherwise the parameter list gets very long and error prone (and has to be passed down several levels). This structure could be made a parto of the CU context itself, or the range handler, so it wouldn't have to be separately assembled at range-list read time, but both of those solutions get even more invasive, and harder to follow. I've tried to figure out how to break this into smaller changes, but it affects nearly everything that has to do with a compilation unit's own addresses and when decisions must be made about how to read them. Dependency injection will do that to you. It does add tests for range list reading, which did not exist before. Change-Id: I923b9a2c3379a0f52609bc05310097de5cbb7227 Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/2446635 Reviewed-by: Joshua Peraza <jperaza@chromium.org>
57 lines
2.2 KiB
C++
57 lines
2.2 KiB
C++
// Copyright (c) 2018 Google Inc.
|
|
// All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are
|
|
// met:
|
|
//
|
|
// * Redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer.
|
|
// * Redistributions in binary form must reproduce the above
|
|
// copyright notice, this list of conditions and the following disclaimer
|
|
// in the documentation and/or other materials provided with the
|
|
// distribution.
|
|
// * Neither the name of Google Inc. nor the names of its
|
|
// contributors may be used to endorse or promote products derived from
|
|
// this software without specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
// Original author: Gabriele Svelto <gsvelto@mozilla.com>
|
|
// <gabriele.svelto@gmail.com>
|
|
|
|
// dwarf_range_list_handler.cc: Implementation of DwarfRangeListHandler class.
|
|
// See dwarf_range_list_handler.h for details.
|
|
|
|
#include <algorithm>
|
|
|
|
#include "common/dwarf_range_list_handler.h"
|
|
|
|
namespace google_breakpad {
|
|
|
|
void DwarfRangeListHandler::AddRange(uint64_t begin, uint64_t end) {
|
|
Module::Range r(begin, end - begin);
|
|
|
|
ranges_->push_back(r);
|
|
}
|
|
|
|
void DwarfRangeListHandler::Finish() {
|
|
std::sort(ranges_->begin(), ranges_->end(),
|
|
[](const Module::Range& a, const Module::Range& b) {
|
|
return a.address < b.address;
|
|
}
|
|
);
|
|
}
|
|
|
|
} // namespace google_breakpad
|