• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2021 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/profiler/chrome_unwind_info_android_32.h"
6 
7 #include "base/containers/buffer_iterator.h"
8 
9 namespace base {
10 
ChromeUnwindInfoAndroid32(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)11 ChromeUnwindInfoAndroid32::ChromeUnwindInfoAndroid32(
12     span<const uint8_t> unwind_instruction_table,
13     span<const uint8_t> function_offset_table,
14     span<const FunctionTableEntry> function_table,
15     span<const uint32_t> page_table)
16     : unwind_instruction_table(unwind_instruction_table),
17       function_offset_table(function_offset_table),
18       function_table(function_table),
19       page_table(page_table) {}
20 
21 ChromeUnwindInfoAndroid32::~ChromeUnwindInfoAndroid32() = default;
22 ChromeUnwindInfoAndroid32::ChromeUnwindInfoAndroid32(
23     const ChromeUnwindInfoAndroid32& other) = default;
24 ChromeUnwindInfoAndroid32& ChromeUnwindInfoAndroid32::operator=(
25     const ChromeUnwindInfoAndroid32& other) = default;
26 
27 ChromeUnwindInfoAndroid32::ChromeUnwindInfoAndroid32(
28     ChromeUnwindInfoAndroid32&& other) = default;
29 ChromeUnwindInfoAndroid32& ChromeUnwindInfoAndroid32::operator=(
30     ChromeUnwindInfoAndroid32&& other) = default;
31 
CreateChromeUnwindInfoAndroid32(span<const uint8_t> data)32 ChromeUnwindInfoAndroid32 CreateChromeUnwindInfoAndroid32(
33     span<const uint8_t> data) {
34   BufferIterator<const uint8_t> data_iterator(data);
35 
36   const auto* header = data_iterator.Object<ChromeUnwindInfoAndroid32Header>();
37   DCHECK(header);
38 
39   data_iterator.Seek(header->page_table_byte_offset);
40   const auto page_table =
41       data_iterator.Span<uint32_t>(header->page_table_entries);
42   DCHECK(!page_table.empty());
43 
44   data_iterator.Seek(header->function_offset_table_byte_offset);
45   const auto function_offset_table =
46       data_iterator.Span<uint8_t>(header->function_offset_table_size_in_bytes);
47   DCHECK(!function_offset_table.empty());
48 
49   data_iterator.Seek(header->function_table_byte_offset);
50   const auto function_table =
51       data_iterator.Span<FunctionTableEntry>(header->function_table_entries);
52   DCHECK(!function_table.empty());
53 
54   data_iterator.Seek(header->unwind_instruction_table_byte_offset);
55   const auto unwind_instruction_table = data_iterator.Span<uint8_t>(
56       header->unwind_instruction_table_size_in_bytes);
57   DCHECK(!unwind_instruction_table.empty());
58 
59   return ChromeUnwindInfoAndroid32{unwind_instruction_table,
60                                    function_offset_table, function_table,
61                                    page_table};
62 }
63 
64 }  // namespace base
65