Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: src/common/dwarf/bytereader.h

Issue 1605153004: unittests: fix -Wnarrowing build errors (Closed) Base URL: https://chromium.googlesource.com/breakpad/breakpad.git@master
Patch Set: fix one more long line Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/common/dwarf/bytereader.cc » ('j') | src/common/linux/dump_symbols.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // -*- mode: C++ -*- 1 // -*- mode: C++ -*-
2 2
3 // Copyright (c) 2010 Google Inc. All Rights Reserved. 3 // Copyright (c) 2010 Google Inc. All Rights Reserved.
4 // 4 //
5 // Redistribution and use in source and binary forms, with or without 5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are 6 // modification, are permitted provided that the following conditions are
7 // met: 7 // met:
8 // 8 //
9 // * Redistributions of source code must retain the above copyright 9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer. 10 // notice, this list of conditions and the following disclaimer.
(...skipping 13 matching lines...) Expand all
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 30
31 #ifndef COMMON_DWARF_BYTEREADER_H__ 31 #ifndef COMMON_DWARF_BYTEREADER_H__
32 #define COMMON_DWARF_BYTEREADER_H__ 32 #define COMMON_DWARF_BYTEREADER_H__
33 33
34 #include <stdint.h>
34 #include <string> 35 #include <string>
35 #include "common/dwarf/types.h" 36 #include "common/dwarf/types.h"
36 #include "common/dwarf/dwarf2enums.h" 37 #include "common/dwarf/dwarf2enums.h"
37 38
38 namespace dwarf2reader { 39 namespace dwarf2reader {
39 40
40 // We can't use the obvious name of LITTLE_ENDIAN and BIG_ENDIAN 41 // We can't use the obvious name of LITTLE_ENDIAN and BIG_ENDIAN
41 // because it conflicts with a macro 42 // because it conflicts with a macro
42 enum Endianness { 43 enum Endianness {
43 ENDIANNESS_BIG, 44 ENDIANNESS_BIG,
44 ENDIANNESS_LITTLE 45 ENDIANNESS_LITTLE
45 }; 46 };
46 47
47 // A ByteReader knows how to read single- and multi-byte values of 48 // A ByteReader knows how to read single- and multi-byte values of
48 // various endiannesses, sizes, and encodings, as used in DWARF 49 // various endiannesses, sizes, and encodings, as used in DWARF
49 // debugging information and Linux C++ exception handling data. 50 // debugging information and Linux C++ exception handling data.
50 class ByteReader { 51 class ByteReader {
51 public: 52 public:
52 // Construct a ByteReader capable of reading one-, two-, four-, and 53 // Construct a ByteReader capable of reading one-, two-, four-, and
53 // eight-byte values according to ENDIANNESS, absolute machine-sized 54 // eight-byte values according to ENDIANNESS, absolute machine-sized
54 // addresses, DWARF-style "initial length" values, signed and 55 // addresses, DWARF-style "initial length" values, signed and
55 // unsigned LEB128 numbers, and Linux C++ exception handling data's 56 // unsigned LEB128 numbers, and Linux C++ exception handling data's
56 // encoded pointers. 57 // encoded pointers.
57 explicit ByteReader(enum Endianness endianness); 58 explicit ByteReader(enum Endianness endianness);
58 virtual ~ByteReader(); 59 virtual ~ByteReader();
59 60
60 // Read a single byte from BUFFER and return it as an unsigned 8 bit 61 // Read a single byte from BUFFER and return it as an unsigned 8 bit
61 // number. 62 // number.
62 uint8 ReadOneByte(const char* buffer) const; 63 uint8 ReadOneByte(const uint8_t *buffer) const;
63 64
64 // Read two bytes from BUFFER and return them as an unsigned 16 bit 65 // Read two bytes from BUFFER and return them as an unsigned 16 bit
65 // number, using this ByteReader's endianness. 66 // number, using this ByteReader's endianness.
66 uint16 ReadTwoBytes(const char* buffer) const; 67 uint16 ReadTwoBytes(const uint8_t *buffer) const;
67 68
68 // Read four bytes from BUFFER and return them as an unsigned 32 bit 69 // Read four bytes from BUFFER and return them as an unsigned 32 bit
69 // number, using this ByteReader's endianness. This function returns 70 // number, using this ByteReader's endianness. This function returns
70 // a uint64 so that it is compatible with ReadAddress and 71 // a uint64 so that it is compatible with ReadAddress and
71 // ReadOffset. The number it returns will never be outside the range 72 // ReadOffset. The number it returns will never be outside the range
72 // of an unsigned 32 bit integer. 73 // of an unsigned 32 bit integer.
73 uint64 ReadFourBytes(const char* buffer) const; 74 uint64 ReadFourBytes(const uint8_t *buffer) const;
74 75
75 // Read eight bytes from BUFFER and return them as an unsigned 64 76 // Read eight bytes from BUFFER and return them as an unsigned 64
76 // bit number, using this ByteReader's endianness. 77 // bit number, using this ByteReader's endianness.
77 uint64 ReadEightBytes(const char* buffer) const; 78 uint64 ReadEightBytes(const uint8_t *buffer) const;
78 79
79 // Read an unsigned LEB128 (Little Endian Base 128) number from 80 // Read an unsigned LEB128 (Little Endian Base 128) number from
80 // BUFFER and return it as an unsigned 64 bit integer. Set LEN to 81 // BUFFER and return it as an unsigned 64 bit integer. Set LEN to
81 // the number of bytes read. 82 // the number of bytes read.
82 // 83 //
83 // The unsigned LEB128 representation of an integer N is a variable 84 // The unsigned LEB128 representation of an integer N is a variable
84 // number of bytes: 85 // number of bytes:
85 // 86 //
86 // - If N is between 0 and 0x7f, then its unsigned LEB128 87 // - If N is between 0 and 0x7f, then its unsigned LEB128
87 // representation is a single byte whose value is N. 88 // representation is a single byte whose value is N.
88 // 89 //
89 // - Otherwise, its unsigned LEB128 representation is (N & 0x7f) | 90 // - Otherwise, its unsigned LEB128 representation is (N & 0x7f) |
90 // 0x80, followed by the unsigned LEB128 representation of N / 91 // 0x80, followed by the unsigned LEB128 representation of N /
91 // 128, rounded towards negative infinity. 92 // 128, rounded towards negative infinity.
92 // 93 //
93 // In other words, we break VALUE into groups of seven bits, put 94 // In other words, we break VALUE into groups of seven bits, put
94 // them in little-endian order, and then write them as eight-bit 95 // them in little-endian order, and then write them as eight-bit
95 // bytes with the high bit on all but the last. 96 // bytes with the high bit on all but the last.
96 uint64 ReadUnsignedLEB128(const char* buffer, size_t* len) const; 97 uint64 ReadUnsignedLEB128(const uint8_t *buffer, size_t *len) const;
97 98
98 // Read a signed LEB128 number from BUFFER and return it as an 99 // Read a signed LEB128 number from BUFFER and return it as an
99 // signed 64 bit integer. Set LEN to the number of bytes read. 100 // signed 64 bit integer. Set LEN to the number of bytes read.
100 // 101 //
101 // The signed LEB128 representation of an integer N is a variable 102 // The signed LEB128 representation of an integer N is a variable
102 // number of bytes: 103 // number of bytes:
103 // 104 //
104 // - If N is between -0x40 and 0x3f, then its signed LEB128 105 // - If N is between -0x40 and 0x3f, then its signed LEB128
105 // representation is a single byte whose value is N in two's 106 // representation is a single byte whose value is N in two's
106 // complement. 107 // complement.
107 // 108 //
108 // - Otherwise, its signed LEB128 representation is (N & 0x7f) | 109 // - Otherwise, its signed LEB128 representation is (N & 0x7f) |
109 // 0x80, followed by the signed LEB128 representation of N / 128, 110 // 0x80, followed by the signed LEB128 representation of N / 128,
110 // rounded towards negative infinity. 111 // rounded towards negative infinity.
111 // 112 //
112 // In other words, we break VALUE into groups of seven bits, put 113 // In other words, we break VALUE into groups of seven bits, put
113 // them in little-endian order, and then write them as eight-bit 114 // them in little-endian order, and then write them as eight-bit
114 // bytes with the high bit on all but the last. 115 // bytes with the high bit on all but the last.
115 int64 ReadSignedLEB128(const char* buffer, size_t* len) const; 116 int64 ReadSignedLEB128(const uint8_t *buffer, size_t *len) const;
116 117
117 // Indicate that addresses on this architecture are SIZE bytes long. SIZE 118 // Indicate that addresses on this architecture are SIZE bytes long. SIZE
118 // must be either 4 or 8. (DWARF allows addresses to be any number of 119 // must be either 4 or 8. (DWARF allows addresses to be any number of
119 // bytes in length from 1 to 255, but we only support 32- and 64-bit 120 // bytes in length from 1 to 255, but we only support 32- and 64-bit
120 // addresses at the moment.) You must call this before using the 121 // addresses at the moment.) You must call this before using the
121 // ReadAddress member function. 122 // ReadAddress member function.
122 // 123 //
123 // For data in a .debug_info section, or something that .debug_info 124 // For data in a .debug_info section, or something that .debug_info
124 // refers to like line number or macro data, the compilation unit 125 // refers to like line number or macro data, the compilation unit
125 // header's address_size field indicates the address size to use. Call 126 // header's address_size field indicates the address size to use. Call
126 // frame information doesn't indicate its address size (a shortcoming of 127 // frame information doesn't indicate its address size (a shortcoming of
127 // the spec); you must supply the appropriate size based on the 128 // the spec); you must supply the appropriate size based on the
128 // architecture of the target machine. 129 // architecture of the target machine.
129 void SetAddressSize(uint8 size); 130 void SetAddressSize(uint8 size);
130 131
131 // Return the current address size, in bytes. This is either 4, 132 // Return the current address size, in bytes. This is either 4,
132 // indicating 32-bit addresses, or 8, indicating 64-bit addresses. 133 // indicating 32-bit addresses, or 8, indicating 64-bit addresses.
133 uint8 AddressSize() const { return address_size_; } 134 uint8 AddressSize() const { return address_size_; }
134 135
135 // Read an address from BUFFER and return it as an unsigned 64 bit 136 // Read an address from BUFFER and return it as an unsigned 64 bit
136 // integer, respecting this ByteReader's endianness and address size. You 137 // integer, respecting this ByteReader's endianness and address size. You
137 // must call SetAddressSize before calling this function. 138 // must call SetAddressSize before calling this function.
138 uint64 ReadAddress(const char* buffer) const; 139 uint64 ReadAddress(const uint8_t *buffer) const;
139 140
140 // DWARF actually defines two slightly different formats: 32-bit DWARF 141 // DWARF actually defines two slightly different formats: 32-bit DWARF
141 // and 64-bit DWARF. This is *not* related to the size of registers or 142 // and 64-bit DWARF. This is *not* related to the size of registers or
142 // addresses on the target machine; it refers only to the size of section 143 // addresses on the target machine; it refers only to the size of section
143 // offsets and data lengths appearing in the DWARF data. One only needs 144 // offsets and data lengths appearing in the DWARF data. One only needs
144 // 64-bit DWARF when the debugging data itself is larger than 4GiB. 145 // 64-bit DWARF when the debugging data itself is larger than 4GiB.
145 // 32-bit DWARF can handle x86_64 or PPC64 code just fine, unless the 146 // 32-bit DWARF can handle x86_64 or PPC64 code just fine, unless the
146 // debugging data itself is very large. 147 // debugging data itself is very large.
147 // 148 //
148 // DWARF information identifies itself as 32-bit or 64-bit DWARF: each 149 // DWARF information identifies itself as 32-bit or 64-bit DWARF: each
(...skipping 16 matching lines...) Expand all
165 // 166 //
166 // A DWARF initial length is either: 167 // A DWARF initial length is either:
167 // 168 //
168 // - a byte count stored as an unsigned 32-bit value less than 169 // - a byte count stored as an unsigned 32-bit value less than
169 // 0xffffff00, indicating that the data whose length is being 170 // 0xffffff00, indicating that the data whose length is being
170 // measured uses the 32-bit DWARF format, or 171 // measured uses the 32-bit DWARF format, or
171 // 172 //
172 // - The 32-bit value 0xffffffff, followed by a 64-bit byte count, 173 // - The 32-bit value 0xffffffff, followed by a 64-bit byte count,
173 // indicating that the data whose length is being measured uses 174 // indicating that the data whose length is being measured uses
174 // the 64-bit DWARF format. 175 // the 64-bit DWARF format.
175 uint64 ReadInitialLength(const char* start, size_t* len); 176 uint64 ReadInitialLength(const uint8_t *start, size_t *len);
176 177
177 // Read an offset from BUFFER and return it as an unsigned 64 bit 178 // Read an offset from BUFFER and return it as an unsigned 64 bit
178 // integer, respecting the ByteReader's endianness. In 32-bit DWARF, the 179 // integer, respecting the ByteReader's endianness. In 32-bit DWARF, the
179 // offset is 4 bytes long; in 64-bit DWARF, the offset is eight bytes 180 // offset is 4 bytes long; in 64-bit DWARF, the offset is eight bytes
180 // long. You must call ReadInitialLength or SetOffsetSize before calling 181 // long. You must call ReadInitialLength or SetOffsetSize before calling
181 // this function; see the comments above for details. 182 // this function; see the comments above for details.
182 uint64 ReadOffset(const char* buffer) const; 183 uint64 ReadOffset(const uint8_t *buffer) const;
183 184
184 // Return the current offset size, in bytes. 185 // Return the current offset size, in bytes.
185 // A return value of 4 indicates that we are reading 32-bit DWARF. 186 // A return value of 4 indicates that we are reading 32-bit DWARF.
186 // A return value of 8 indicates that we are reading 64-bit DWARF. 187 // A return value of 8 indicates that we are reading 64-bit DWARF.
187 uint8 OffsetSize() const { return offset_size_; } 188 uint8 OffsetSize() const { return offset_size_; }
188 189
189 // Indicate that section offsets and lengths are SIZE bytes long. SIZE 190 // Indicate that section offsets and lengths are SIZE bytes long. SIZE
190 // must be either 4 (meaning 32-bit DWARF) or 8 (meaning 64-bit DWARF). 191 // must be either 4 (meaning 32-bit DWARF) or 8 (meaning 64-bit DWARF).
191 // Usually, you should not call this function yourself; instead, let a 192 // Usually, you should not call this function yourself; instead, let a
192 // call to ReadInitialLength establish the data's offset size 193 // call to ReadInitialLength establish the data's offset size
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 // There are also two options that fall outside that matrix 228 // There are also two options that fall outside that matrix
228 // altogether: the pointer may be omitted, or it may have padding to 229 // altogether: the pointer may be omitted, or it may have padding to
229 // align it on an appropriate address boundary. (That last option 230 // align it on an appropriate address boundary. (That last option
230 // may seem like it should be just another axis, but it is not.) 231 // may seem like it should be just another axis, but it is not.)
231 232
232 // Indicate that the exception handling data is loaded starting at 233 // Indicate that the exception handling data is loaded starting at
233 // SECTION_BASE, and that the start of its buffer in our own memory 234 // SECTION_BASE, and that the start of its buffer in our own memory
234 // is BUFFER_BASE. This allows us to find the address that a given 235 // is BUFFER_BASE. This allows us to find the address that a given
235 // byte in our buffer would have when loaded into the program the 236 // byte in our buffer would have when loaded into the program the
236 // data describes. We need this to resolve DW_EH_PE_pcrel pointers. 237 // data describes. We need this to resolve DW_EH_PE_pcrel pointers.
237 void SetCFIDataBase(uint64 section_base, const char *buffer_base); 238 void SetCFIDataBase(uint64 section_base, const uint8_t *buffer_base);
238 239
239 // Indicate that the base address of the program's ".text" section 240 // Indicate that the base address of the program's ".text" section
240 // is TEXT_BASE. We need this to resolve DW_EH_PE_textrel pointers. 241 // is TEXT_BASE. We need this to resolve DW_EH_PE_textrel pointers.
241 void SetTextBase(uint64 text_base); 242 void SetTextBase(uint64 text_base);
242 243
243 // Indicate that the base address for DW_EH_PE_datarel pointers is 244 // Indicate that the base address for DW_EH_PE_datarel pointers is
244 // DATA_BASE. The proper value depends on the ABI; it is usually the 245 // DATA_BASE. The proper value depends on the ABI; it is usually the
245 // address of the global offset table, held in a designated register in 246 // address of the global offset table, held in a designated register in
246 // position-independent code. You will need to look at the startup code 247 // position-independent code. You will need to look at the startup code
247 // for the target system to be sure. I tried; my eyes bled. 248 // for the target system to be sure. I tried; my eyes bled.
(...skipping 18 matching lines...) Expand all
266 bool UsableEncoding(DwarfPointerEncoding encoding) const; 267 bool UsableEncoding(DwarfPointerEncoding encoding) const;
267 268
268 // Read an encoded pointer from BUFFER using ENCODING; return the 269 // Read an encoded pointer from BUFFER using ENCODING; return the
269 // absolute address it represents, and set *LEN to the pointer's 270 // absolute address it represents, and set *LEN to the pointer's
270 // length in bytes, including any padding for aligned pointers. 271 // length in bytes, including any padding for aligned pointers.
271 // 272 //
272 // This function calls 'abort' if ENCODING is invalid or refers to a 273 // This function calls 'abort' if ENCODING is invalid or refers to a
273 // base address this reader hasn't been given, so you should check 274 // base address this reader hasn't been given, so you should check
274 // with ValidEncoding and UsableEncoding first if you would rather 275 // with ValidEncoding and UsableEncoding first if you would rather
275 // die in a more helpful way. 276 // die in a more helpful way.
276 uint64 ReadEncodedPointer(const char *buffer, DwarfPointerEncoding encoding, 277 uint64 ReadEncodedPointer(const uint8_t *buffer,
278 DwarfPointerEncoding encoding,
277 size_t *len) const; 279 size_t *len) const;
278 280
279 private: 281 private:
280 282
281 // Function pointer type for our address and offset readers. 283 // Function pointer type for our address and offset readers.
282 typedef uint64 (ByteReader::*AddressReader)(const char*) const; 284 typedef uint64 (ByteReader::*AddressReader)(const uint8_t *) const;
283 285
284 // Read an offset from BUFFER and return it as an unsigned 64 bit 286 // Read an offset from BUFFER and return it as an unsigned 64 bit
285 // integer. DWARF2/3 define offsets as either 4 or 8 bytes, 287 // integer. DWARF2/3 define offsets as either 4 or 8 bytes,
286 // generally depending on the amount of DWARF2/3 info present. 288 // generally depending on the amount of DWARF2/3 info present.
287 // This function pointer gets set by SetOffsetSize. 289 // This function pointer gets set by SetOffsetSize.
288 AddressReader offset_reader_; 290 AddressReader offset_reader_;
289 291
290 // Read an address from BUFFER and return it as an unsigned 64 bit 292 // Read an address from BUFFER and return it as an unsigned 64 bit
291 // integer. DWARF2/3 allow addresses to be any size from 0-255 293 // integer. DWARF2/3 allow addresses to be any size from 0-255
292 // bytes currently. Internally we support 4 and 8 byte addresses, 294 // bytes currently. Internally we support 4 and 8 byte addresses,
293 // and will CHECK on anything else. 295 // and will CHECK on anything else.
294 // This function pointer gets set by SetAddressSize. 296 // This function pointer gets set by SetAddressSize.
295 AddressReader address_reader_; 297 AddressReader address_reader_;
296 298
297 Endianness endian_; 299 Endianness endian_;
298 uint8 address_size_; 300 uint8 address_size_;
299 uint8 offset_size_; 301 uint8 offset_size_;
300 302
301 // Base addresses for Linux C++ exception handling data's encoded pointers. 303 // Base addresses for Linux C++ exception handling data's encoded pointers.
302 bool have_section_base_, have_text_base_, have_data_base_; 304 bool have_section_base_, have_text_base_, have_data_base_;
303 bool have_function_base_; 305 bool have_function_base_;
304 uint64 section_base_, text_base_, data_base_, function_base_; 306 uint64 section_base_, text_base_, data_base_, function_base_;
305 const char *buffer_base_; 307 const uint8_t *buffer_base_;
306 }; 308 };
307 309
308 } // namespace dwarf2reader 310 } // namespace dwarf2reader
309 311
310 #endif // COMMON_DWARF_BYTEREADER_H__ 312 #endif // COMMON_DWARF_BYTEREADER_H__
OLDNEW
« no previous file with comments | « no previous file | src/common/dwarf/bytereader.cc » ('j') | src/common/linux/dump_symbols.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698