attr.cc
Go to the documentation of this file.
1 // Copyright 2016 Google Inc. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "dwarf/attr.h"
16 
17 #include "dwarf/debug_info.h"
18 #include "dwarf/dwarf_util.h"
19 #include "dwarf_constants.h"
20 #include "util.h"
21 
23 using namespace dwarf2reader;
24 
25 namespace bloaty {
26 namespace dwarf {
27 
28 absl::optional<uint64_t> AttrValue::ToUint(const CU& cu) const {
29  if (IsUint()) return GetUint(cu);
31  switch (str.size()) {
32  case 1:
33  return ReadFixed<uint8_t>(&str);
34  case 2:
35  return ReadFixed<uint8_t>(&str);
36  case 4:
37  return ReadFixed<uint32_t>(&str);
38  case 8:
39  return ReadFixed<uint64_t>(&str);
40  }
41  return absl::nullopt;
42 }
43 
44 uint64_t AttrValue::GetUint(const CU& cu) const {
45  if (type_ == Type::kUnresolvedUint) {
46  return ResolveIndirectAddress(cu);
47  } else {
48  assert(type_ == Type::kUint);
49  return uint_;
50  }
51 }
52 
54  if (type_ == Type::kUnresolvedString) {
55  return ResolveDoubleIndirectString(cu);
56  } else {
57  assert(type_ == Type::kString);
58  return string_;
59  }
60 }
61 
62 template <class D>
63 string_view AttrValue::ReadBlock(string_view* data) {
64  D len = ReadFixed<D>(data);
65  return ReadBytes(len, data);
66 }
67 
68 string_view AttrValue::ReadVariableBlock(string_view* data) {
69  uint64_t len = ReadLEB128<uint64_t>(data);
70  return ReadBytes(len, data);
71 }
72 
73 string_view AttrValue::ResolveIndirectString(const CU& cu, uint64_t ofs) {
76  return ret;
77 }
78 
79 template <class D>
80 string_view AttrValue::ReadIndirectString(const CU& cu, string_view* data) {
81  return ResolveIndirectString(cu, ReadFixed<D>(data));
82 }
83 
85 AttrValue::ResolveDoubleIndirectString(const CU &cu) const {
86  uint64_t ofs = uint_;
87  string_view offsets = cu.dwarf().debug_str_offsets;
88  uint64_t ofs2;
89  if (cu.unit_sizes().dwarf64()) {
90  SkipBytes((ofs * 8) + cu.str_offsets_base(), &offsets);
91  ofs2 = ReadFixed<uint64_t>(&offsets);
92  } else {
93  SkipBytes((ofs * 4) + cu.str_offsets_base(), &offsets);
94  ofs2 = ReadFixed<uint32_t>(&offsets);
95  }
98  return ret;
99 }
100 
101 uint64_t AttrValue::ResolveIndirectAddress(const CU& cu) const {
102  return ReadIndirectAddress(cu, uint_);
103 }
104 
105 AttrValue AttrValue::ParseAttr(const CU& cu, uint8_t form, string_view* data) {
106  switch (form) {
107  case DW_FORM_indirect: {
108  uint16_t indirect_form = ReadLEB128<uint16_t>(data);
109  if (indirect_form == DW_FORM_indirect) {
110  THROW("indirect attribute has indirect form type");
111  }
112  return ParseAttr(cu, indirect_form, data);
113  }
114  case DW_FORM_ref1:
115  return AttrValue(form, ReadFixed<uint8_t>(data));
116  case DW_FORM_ref2:
117  return AttrValue(form, ReadFixed<uint16_t>(data));
118  case DW_FORM_ref4:
119  return AttrValue(form, ReadFixed<uint32_t>(data));
120  case DW_FORM_ref_sig8:
121  case DW_FORM_ref8:
122  return AttrValue(form, ReadFixed<uint64_t>(data));
123  case DW_FORM_ref_udata:
124  case DW_FORM_strx1:
125  return AttrValue::UnresolvedString(form, ReadFixed<uint8_t>(data));
126  case DW_FORM_strx2:
127  return AttrValue::UnresolvedString(form, ReadFixed<uint16_t>(data));
128  case DW_FORM_strx4:
129  return AttrValue::UnresolvedString(form, ReadFixed<uint32_t>(data));
130  case DW_FORM_strx:
131  return AttrValue::UnresolvedString(form, ReadLEB128<uint64_t>(data));
132  case DW_FORM_addrx1:
133  return AttrValue::UnresolvedUint(form, ReadFixed<uint8_t>(data));
134  case DW_FORM_addrx2:
135  return AttrValue::UnresolvedUint(form, ReadFixed<uint16_t>(data));
136  case DW_FORM_addrx3:
137  return AttrValue::UnresolvedUint(form, ReadFixed<uint32_t, 3>(data));
138  case DW_FORM_addrx4:
139  return AttrValue::UnresolvedUint(form, ReadFixed<uint32_t>(data));
140  case DW_FORM_addrx:
141  return AttrValue::UnresolvedUint(form, ReadLEB128<uint64_t>(data));
142  case DW_FORM_addr:
143  address_size:
144  switch (cu.unit_sizes().address_size()) {
145  case 4:
146  return AttrValue(form, ReadFixed<uint32_t>(data));
147  case 8:
148  return AttrValue(form, ReadFixed<uint64_t>(data));
149  default:
151  }
152  case DW_FORM_ref_addr:
153  if (cu.unit_sizes().dwarf_version() <= 2) {
154  goto address_size;
155  }
157  case DW_FORM_sec_offset:
158  if (cu.unit_sizes().dwarf64()) {
159  return AttrValue(form, ReadFixed<uint64_t>(data));
160  } else {
161  return AttrValue(form, ReadFixed<uint32_t>(data));
162  }
163  case DW_FORM_udata:
164  return AttrValue(form, ReadLEB128<uint64_t>(data));
165  case DW_FORM_block1:
166  return AttrValue(form, ReadBlock<uint8_t>(data));
167  case DW_FORM_block2:
168  return AttrValue(form, ReadBlock<uint16_t>(data));
169  case DW_FORM_block4:
170  return AttrValue(form, ReadBlock<uint32_t>(data));
171  case DW_FORM_block:
172  case DW_FORM_exprloc:
173  return AttrValue(form, ReadVariableBlock(data));
174  case DW_FORM_string:
175  return AttrValue(form, ReadNullTerminated(data));
176  case DW_FORM_strp:
177  if (cu.unit_sizes().dwarf64()) {
178  return AttrValue(form, ReadIndirectString<uint64_t>(cu, data));
179  } else {
180  return AttrValue(form, ReadIndirectString<uint32_t>(cu, data));
181  }
182  case DW_FORM_data1:
183  return AttrValue(form, ReadBytes(1, data));
184  case DW_FORM_data2:
185  return AttrValue(form, ReadBytes(2, data));
186  case DW_FORM_data4:
187  return AttrValue(form, ReadBytes(4, data));
188  case DW_FORM_data8:
189  return AttrValue(form, ReadBytes(8, data));
190  case DW_FORM_loclistx:
191  case DW_FORM_rnglistx:
192  return AttrValue(form, ReadLEB128<uint64_t>(data));
193 
194  // Bloaty doesn't currently care about any bool or signed data.
195  // So we fudge it a bit and just stuff these in a uint64.
197  return AttrValue(form, 1);
198  case DW_FORM_flag:
199  return AttrValue(form, ReadFixed<uint8_t>(data));
200  case DW_FORM_sdata:
201  return AttrValue(form, ReadLEB128<uint64_t>(data));
202  default:
203  THROWF("Don't know how to parse DWARF form: $0", form);
204  }
205 }
206 
207 } // namepsace dwarf
208 } // namespace bloaty
dwarf2reader::DW_FORM_flag
@ DW_FORM_flag
Definition: dwarf_constants.h:139
dwarf2reader::DW_FORM_strx2
@ DW_FORM_strx2
Definition: dwarf_constants.h:169
xds_interop_client.str
str
Definition: xds_interop_client.py:487
dwarf2reader::DW_FORM_data8
@ DW_FORM_data8
Definition: dwarf_constants.h:134
dwarf2reader::DW_FORM_addrx
@ DW_FORM_addrx
Definition: dwarf_constants.h:156
dwarf2reader::DW_FORM_strp
@ DW_FORM_strp
Definition: dwarf_constants.h:141
dwarf2reader::DW_FORM_block2
@ DW_FORM_block2
Definition: dwarf_constants.h:130
bloaty
Definition: bloaty.cc:69
dwarf2reader::DW_FORM_sdata
@ DW_FORM_sdata
Definition: dwarf_constants.h:140
attr.h
bloaty::dwarf::CompilationUnitSizes::dwarf_version
uint8_t dwarf_version() const
Definition: debug_info.h:97
dwarf2reader::DW_FORM_ref2
@ DW_FORM_ref2
Definition: dwarf_constants.h:145
dwarf2reader::DW_FORM_addrx4
@ DW_FORM_addrx4
Definition: dwarf_constants.h:175
dwarf2reader::DW_FORM_ref_sig8
@ DW_FORM_ref_sig8
Definition: dwarf_constants.h:162
dwarf2reader::DW_FORM_strx4
@ DW_FORM_strx4
Definition: dwarf_constants.h:171
dwarf2reader::DW_FORM_flag_present
@ DW_FORM_flag_present
Definition: dwarf_constants.h:153
uint16_t
unsigned short uint16_t
Definition: stdint-msvc2008.h:79
dwarf2reader::DW_FORM_block
@ DW_FORM_block
Definition: dwarf_constants.h:136
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
dwarf2reader::DW_FORM_addrx2
@ DW_FORM_addrx2
Definition: dwarf_constants.h:173
type_
std::string type_
Definition: client_channel_stress_test.cc:212
dwarf2reader::DW_FORM_data2
@ DW_FORM_data2
Definition: dwarf_constants.h:132
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
bloaty::dwarf::File::debug_str_offsets
absl::string_view debug_str_offsets
Definition: debug_info.h:76
dwarf2reader::DW_FORM_ref1
@ DW_FORM_ref1
Definition: dwarf_constants.h:144
bloaty::dwarf::CU::str_offsets_base
uint64_t str_offsets_base() const
Definition: debug_info.h:250
dwarf2reader::DW_FORM_addr
@ DW_FORM_addr
Definition: dwarf_constants.h:129
bloaty::SkipBytes
void SkipBytes(size_t bytes, absl::string_view *data)
Definition: bloaty/src/util.h:174
dwarf2reader::DW_FORM_ref8
@ DW_FORM_ref8
Definition: dwarf_constants.h:147
THROW
#define THROW(msg)
Definition: bloaty/src/util.h:45
dwarf2reader::DW_FORM_rnglistx
@ DW_FORM_rnglistx
Definition: dwarf_constants.h:166
bloaty::dwarf::CU
Definition: debug_info.h:241
dwarf_util.h
dwarf2reader::DW_FORM_strx
@ DW_FORM_strx
Definition: dwarf_constants.h:155
dwarf2reader::DW_FORM_data1
@ DW_FORM_data1
Definition: dwarf_constants.h:138
dwarf_constants.h
dwarf2reader::DW_FORM_udata
@ DW_FORM_udata
Definition: dwarf_constants.h:142
uint64_t
unsigned __int64 uint64_t
Definition: stdint-msvc2008.h:90
dwarf2reader::DW_FORM_strx1
@ DW_FORM_strx1
Definition: dwarf_constants.h:168
bloaty::dwarf::CompilationUnitSizes::dwarf64
bool dwarf64() const
Definition: debug_info.h:91
absl::optional< uint64_t >
dwarf2reader::DW_FORM_data4
@ DW_FORM_data4
Definition: dwarf_constants.h:133
dwarf2reader::DW_FORM_ref_udata
@ DW_FORM_ref_udata
Definition: dwarf_constants.h:148
dwarf2reader
Definition: dwarf_constants.h:20
dwarf2reader::DW_FORM_exprloc
@ DW_FORM_exprloc
Definition: dwarf_constants.h:152
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
dwarf2reader::DW_FORM_block4
@ DW_FORM_block4
Definition: dwarf_constants.h:131
string_
std::string string_
Definition: json_reader.cc:136
dwarf2reader::DW_FORM_ref4
@ DW_FORM_ref4
Definition: dwarf_constants.h:146
dwarf2reader::DW_FORM_indirect
@ DW_FORM_indirect
Definition: dwarf_constants.h:149
dwarf2reader::DW_FORM_string
@ DW_FORM_string
Definition: dwarf_constants.h:135
bloaty::dwarf::File::debug_str
absl::string_view debug_str
Definition: debug_info.h:75
GetString
static bool GetString(std::string *out, CBS *cbs)
Definition: ssl_ctx_api.cc:228
BLOATY_UNREACHABLE
#define BLOATY_UNREACHABLE()
Definition: bloaty/src/util.h:53
bloaty::dwarf::CompilationUnitSizes::address_size
uint8_t address_size() const
Definition: debug_info.h:94
dwarf2reader::DW_FORM_addrx3
@ DW_FORM_addrx3
Definition: dwarf_constants.h:174
dwarf2reader::DW_FORM_loclistx
@ DW_FORM_loclistx
Definition: dwarf_constants.h:165
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
debug_info.h
string_view
absl::string_view string_view
Definition: attr.cc:22
bloaty::ReadNullTerminated
absl::string_view ReadNullTerminated(absl::string_view *data)
Definition: third_party/bloaty/src/util.cc:26
dwarf2reader::DW_FORM_block1
@ DW_FORM_block1
Definition: dwarf_constants.h:137
bloaty::dwarf::CU::dwarf
const File & dwarf() const
Definition: debug_info.h:245
bloaty::dwarf::CU::unit_sizes
const CompilationUnitSizes & unit_sizes() const
Definition: debug_info.h:246
THROWF
#define THROWF(...)
Definition: bloaty/src/util.h:46
dwarf2reader::DW_FORM_ref_addr
@ DW_FORM_ref_addr
Definition: dwarf_constants.h:143
dwarf2reader::DW_FORM_sec_offset
@ DW_FORM_sec_offset
Definition: dwarf_constants.h:151
bloaty::dwarf::ReadIndirectAddress
uint64_t ReadIndirectAddress(const CU &cu, uint64_t val)
Definition: debug_info.h:326
bloaty::dwarf::CU::AddIndirectString
void AddIndirectString(absl::string_view range) const
Definition: debug_info.h:254
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
dwarf2reader::DW_FORM_addrx1
@ DW_FORM_addrx1
Definition: dwarf_constants.h:172
ABSL_FALLTHROUGH_INTENDED
#define ABSL_FALLTHROUGH_INTENDED
Definition: abseil-cpp/absl/base/attributes.h:641
bloaty::ReadBytes
absl::string_view ReadBytes(size_t bytes, absl::string_view *data)
Definition: bloaty/src/util.h:165
bloaty::dwarf::AttrValue
Definition: attr.h:28
bloaty::dwarf::ReadDebugStrEntry
absl::string_view ReadDebugStrEntry(absl::string_view debug_str, size_t ofs)
Definition: dwarf_util.cc:69


grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:45