64 lines
2.4 KiB
C++
64 lines
2.4 KiB
C++
// Copyright 2021 The Chromium Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "base/profiler/chrome_unwind_info_android.h"
|
|
|
|
#include "base/containers/buffer_iterator.h"
|
|
|
|
namespace base {
|
|
|
|
ChromeUnwindInfoAndroid::ChromeUnwindInfoAndroid(
|
|
span<const uint8_t> unwind_instruction_table,
|
|
span<const uint8_t> function_offset_table,
|
|
span<const FunctionTableEntry> function_table,
|
|
span<const uint32_t> page_table)
|
|
: unwind_instruction_table(unwind_instruction_table),
|
|
function_offset_table(function_offset_table),
|
|
function_table(function_table),
|
|
page_table(page_table) {}
|
|
|
|
ChromeUnwindInfoAndroid::~ChromeUnwindInfoAndroid() = default;
|
|
ChromeUnwindInfoAndroid::ChromeUnwindInfoAndroid(
|
|
const ChromeUnwindInfoAndroid& other) = default;
|
|
ChromeUnwindInfoAndroid& ChromeUnwindInfoAndroid::operator=(
|
|
const ChromeUnwindInfoAndroid& other) = default;
|
|
|
|
ChromeUnwindInfoAndroid::ChromeUnwindInfoAndroid(
|
|
ChromeUnwindInfoAndroid&& other) = default;
|
|
ChromeUnwindInfoAndroid& ChromeUnwindInfoAndroid::operator=(
|
|
ChromeUnwindInfoAndroid&& other) = default;
|
|
|
|
ChromeUnwindInfoAndroid CreateChromeUnwindInfoAndroid(
|
|
span<const uint8_t> data) {
|
|
BufferIterator<const uint8_t> data_iterator(data);
|
|
|
|
const auto* header = data_iterator.Object<ChromeUnwindInfoHeaderAndroid>();
|
|
DCHECK(header);
|
|
|
|
data_iterator.Seek(header->page_table_byte_offset);
|
|
const auto page_table =
|
|
data_iterator.Span<uint32_t>(header->page_table_entries);
|
|
DCHECK(!page_table.empty());
|
|
|
|
data_iterator.Seek(header->function_offset_table_byte_offset);
|
|
const auto function_offset_table =
|
|
data_iterator.Span<uint8_t>(header->function_offset_table_size_in_bytes);
|
|
DCHECK(!function_offset_table.empty());
|
|
|
|
data_iterator.Seek(header->function_table_byte_offset);
|
|
const auto function_table =
|
|
data_iterator.Span<FunctionTableEntry>(header->function_table_entries);
|
|
DCHECK(!function_table.empty());
|
|
|
|
data_iterator.Seek(header->unwind_instruction_table_byte_offset);
|
|
const auto unwind_instruction_table = data_iterator.Span<uint8_t>(
|
|
header->unwind_instruction_table_size_in_bytes);
|
|
DCHECK(!unwind_instruction_table.empty());
|
|
|
|
return ChromeUnwindInfoAndroid{unwind_instruction_table,
|
|
function_offset_table, function_table,
|
|
page_table};
|
|
}
|
|
|
|
} // namespace base
|