xref: /aosp_15_r20/external/google-breakpad/src/processor/map_serializers-inl.h (revision 9712c20fc9bbfbac4935993a2ca0b3958c5adad2)
1*9712c20fSFrederick Mayle // Copyright 2010 Google LLC
2*9712c20fSFrederick Mayle //
3*9712c20fSFrederick Mayle // Redistribution and use in source and binary forms, with or without
4*9712c20fSFrederick Mayle // modification, are permitted provided that the following conditions are
5*9712c20fSFrederick Mayle // met:
6*9712c20fSFrederick Mayle //
7*9712c20fSFrederick Mayle //     * Redistributions of source code must retain the above copyright
8*9712c20fSFrederick Mayle // notice, this list of conditions and the following disclaimer.
9*9712c20fSFrederick Mayle //     * Redistributions in binary form must reproduce the above
10*9712c20fSFrederick Mayle // copyright notice, this list of conditions and the following disclaimer
11*9712c20fSFrederick Mayle // in the documentation and/or other materials provided with the
12*9712c20fSFrederick Mayle // distribution.
13*9712c20fSFrederick Mayle //     * Neither the name of Google LLC nor the names of its
14*9712c20fSFrederick Mayle // contributors may be used to endorse or promote products derived from
15*9712c20fSFrederick Mayle // this software without specific prior written permission.
16*9712c20fSFrederick Mayle //
17*9712c20fSFrederick Mayle // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*9712c20fSFrederick Mayle // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*9712c20fSFrederick Mayle // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*9712c20fSFrederick Mayle // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*9712c20fSFrederick Mayle // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*9712c20fSFrederick Mayle // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*9712c20fSFrederick Mayle // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*9712c20fSFrederick Mayle // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*9712c20fSFrederick Mayle // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*9712c20fSFrederick Mayle // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*9712c20fSFrederick Mayle // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*9712c20fSFrederick Mayle //
29*9712c20fSFrederick Mayle // map_serializers_inl.h: implementation for serializing std::map and its
30*9712c20fSFrederick Mayle // wrapper classes.
31*9712c20fSFrederick Mayle //
32*9712c20fSFrederick Mayle // See map_serializers.h for documentation.
33*9712c20fSFrederick Mayle //
34*9712c20fSFrederick Mayle // Author: Siyang Xie ([email protected])
35*9712c20fSFrederick Mayle 
36*9712c20fSFrederick Mayle #ifndef PROCESSOR_MAP_SERIALIZERS_INL_H__
37*9712c20fSFrederick Mayle #define PROCESSOR_MAP_SERIALIZERS_INL_H__
38*9712c20fSFrederick Mayle 
39*9712c20fSFrederick Mayle #include <map>
40*9712c20fSFrederick Mayle #include <string>
41*9712c20fSFrederick Mayle 
42*9712c20fSFrederick Mayle #include "processor/map_serializers.h"
43*9712c20fSFrederick Mayle #include "processor/simple_serializer.h"
44*9712c20fSFrederick Mayle 
45*9712c20fSFrederick Mayle #include "processor/address_map-inl.h"
46*9712c20fSFrederick Mayle #include "processor/range_map-inl.h"
47*9712c20fSFrederick Mayle #include "processor/contained_range_map-inl.h"
48*9712c20fSFrederick Mayle 
49*9712c20fSFrederick Mayle #include "processor/logging.h"
50*9712c20fSFrederick Mayle 
51*9712c20fSFrederick Mayle namespace google_breakpad {
52*9712c20fSFrederick Mayle 
53*9712c20fSFrederick Mayle template<typename Key, typename Value>
SizeOf(const std::map<Key,Value> & m)54*9712c20fSFrederick Mayle size_t StdMapSerializer<Key, Value>::SizeOf(
55*9712c20fSFrederick Mayle     const std::map<Key, Value>& m) const {
56*9712c20fSFrederick Mayle   size_t size = 0;
57*9712c20fSFrederick Mayle   size_t header_size = (1 + m.size()) * sizeof(uint32_t);
58*9712c20fSFrederick Mayle   size += header_size;
59*9712c20fSFrederick Mayle 
60*9712c20fSFrederick Mayle   typename std::map<Key, Value>::const_iterator iter;
61*9712c20fSFrederick Mayle   for (iter = m.begin(); iter != m.end(); ++iter) {
62*9712c20fSFrederick Mayle     size += key_serializer_.SizeOf(iter->first);
63*9712c20fSFrederick Mayle     size += value_serializer_.SizeOf(iter->second);
64*9712c20fSFrederick Mayle   }
65*9712c20fSFrederick Mayle   return size;
66*9712c20fSFrederick Mayle }
67*9712c20fSFrederick Mayle 
68*9712c20fSFrederick Mayle template<typename Key, typename Value>
Write(const std::map<Key,Value> & m,char * dest)69*9712c20fSFrederick Mayle char* StdMapSerializer<Key, Value>::Write(const std::map<Key, Value>& m,
70*9712c20fSFrederick Mayle                                           char* dest) const {
71*9712c20fSFrederick Mayle   if (!dest) {
72*9712c20fSFrederick Mayle     BPLOG(ERROR) << "StdMapSerializer failed: write to NULL address.";
73*9712c20fSFrederick Mayle     return NULL;
74*9712c20fSFrederick Mayle   }
75*9712c20fSFrederick Mayle   char* start_address = dest;
76*9712c20fSFrederick Mayle 
77*9712c20fSFrederick Mayle   // Write header:
78*9712c20fSFrederick Mayle   // Number of nodes.
79*9712c20fSFrederick Mayle   dest = SimpleSerializer<uint32_t>::Write(m.size(), dest);
80*9712c20fSFrederick Mayle   // Nodes offsets.
81*9712c20fSFrederick Mayle   uint32_t* offsets = reinterpret_cast<uint32_t*>(dest);
82*9712c20fSFrederick Mayle   dest += sizeof(uint32_t) * m.size();
83*9712c20fSFrederick Mayle 
84*9712c20fSFrederick Mayle   char* key_address = dest;
85*9712c20fSFrederick Mayle   dest += sizeof(Key) * m.size();
86*9712c20fSFrederick Mayle 
87*9712c20fSFrederick Mayle   // Traverse map.
88*9712c20fSFrederick Mayle   typename std::map<Key, Value>::const_iterator iter;
89*9712c20fSFrederick Mayle   int index = 0;
90*9712c20fSFrederick Mayle   for (iter = m.begin(); iter != m.end(); ++iter, ++index) {
91*9712c20fSFrederick Mayle     offsets[index] = static_cast<uint32_t>(dest - start_address);
92*9712c20fSFrederick Mayle     key_address = key_serializer_.Write(iter->first, key_address);
93*9712c20fSFrederick Mayle     dest = value_serializer_.Write(iter->second, dest);
94*9712c20fSFrederick Mayle   }
95*9712c20fSFrederick Mayle   return dest;
96*9712c20fSFrederick Mayle }
97*9712c20fSFrederick Mayle 
98*9712c20fSFrederick Mayle template<typename Key, typename Value>
Serialize(const std::map<Key,Value> & m,unsigned int * size)99*9712c20fSFrederick Mayle char* StdMapSerializer<Key, Value>::Serialize(
100*9712c20fSFrederick Mayle     const std::map<Key, Value>& m, unsigned int* size) const {
101*9712c20fSFrederick Mayle   // Compute size of memory to be allocated.
102*9712c20fSFrederick Mayle   unsigned int size_to_alloc = SizeOf(m);
103*9712c20fSFrederick Mayle   // Allocate memory.
104*9712c20fSFrederick Mayle   char* serialized_data = new char[size_to_alloc];
105*9712c20fSFrederick Mayle   if (!serialized_data) {
106*9712c20fSFrederick Mayle     BPLOG(INFO) << "StdMapSerializer memory allocation failed.";
107*9712c20fSFrederick Mayle     if (size) *size = 0;
108*9712c20fSFrederick Mayle     return NULL;
109*9712c20fSFrederick Mayle   }
110*9712c20fSFrederick Mayle   // Write serialized data into memory.
111*9712c20fSFrederick Mayle   Write(m, serialized_data);
112*9712c20fSFrederick Mayle 
113*9712c20fSFrederick Mayle   if (size) *size = size_to_alloc;
114*9712c20fSFrederick Mayle   return serialized_data;
115*9712c20fSFrederick Mayle }
116*9712c20fSFrederick Mayle 
117*9712c20fSFrederick Mayle template<typename Address, typename Entry>
SizeOf(const RangeMap<Address,Entry> & m)118*9712c20fSFrederick Mayle size_t RangeMapSerializer<Address, Entry>::SizeOf(
119*9712c20fSFrederick Mayle     const RangeMap<Address, Entry>& m) const {
120*9712c20fSFrederick Mayle   size_t size = 0;
121*9712c20fSFrederick Mayle   size_t header_size = (1 + m.map_.size()) * sizeof(uint32_t);
122*9712c20fSFrederick Mayle   size += header_size;
123*9712c20fSFrederick Mayle 
124*9712c20fSFrederick Mayle   typename std::map<Address, Range>::const_iterator iter;
125*9712c20fSFrederick Mayle   for (iter = m.map_.begin(); iter != m.map_.end(); ++iter) {
126*9712c20fSFrederick Mayle     // Size of key (high address).
127*9712c20fSFrederick Mayle     size += address_serializer_.SizeOf(iter->first);
128*9712c20fSFrederick Mayle     // Size of base (low address).
129*9712c20fSFrederick Mayle     size += address_serializer_.SizeOf(iter->second.base());
130*9712c20fSFrederick Mayle     // Size of entry.
131*9712c20fSFrederick Mayle     size += entry_serializer_.SizeOf(iter->second.entry());
132*9712c20fSFrederick Mayle   }
133*9712c20fSFrederick Mayle   return size;
134*9712c20fSFrederick Mayle }
135*9712c20fSFrederick Mayle 
136*9712c20fSFrederick Mayle template<typename Address, typename Entry>
Write(const RangeMap<Address,Entry> & m,char * dest)137*9712c20fSFrederick Mayle char* RangeMapSerializer<Address, Entry>::Write(
138*9712c20fSFrederick Mayle     const RangeMap<Address, Entry>& m, char* dest) const {
139*9712c20fSFrederick Mayle   if (!dest) {
140*9712c20fSFrederick Mayle     BPLOG(ERROR) << "RangeMapSerializer failed: write to NULL address.";
141*9712c20fSFrederick Mayle     return NULL;
142*9712c20fSFrederick Mayle   }
143*9712c20fSFrederick Mayle   char* start_address = dest;
144*9712c20fSFrederick Mayle 
145*9712c20fSFrederick Mayle   // Write header:
146*9712c20fSFrederick Mayle   // Number of nodes.
147*9712c20fSFrederick Mayle   dest = SimpleSerializer<uint32_t>::Write(m.map_.size(), dest);
148*9712c20fSFrederick Mayle   // Nodes offsets.
149*9712c20fSFrederick Mayle   uint32_t* offsets = reinterpret_cast<uint32_t*>(dest);
150*9712c20fSFrederick Mayle   dest += sizeof(uint32_t) * m.map_.size();
151*9712c20fSFrederick Mayle 
152*9712c20fSFrederick Mayle   char* key_address = dest;
153*9712c20fSFrederick Mayle   dest += sizeof(Address) * m.map_.size();
154*9712c20fSFrederick Mayle 
155*9712c20fSFrederick Mayle   // Traverse map.
156*9712c20fSFrederick Mayle   typename std::map<Address, Range>::const_iterator iter;
157*9712c20fSFrederick Mayle   int index = 0;
158*9712c20fSFrederick Mayle   for (iter = m.map_.begin(); iter != m.map_.end(); ++iter, ++index) {
159*9712c20fSFrederick Mayle     offsets[index] = static_cast<uint32_t>(dest - start_address);
160*9712c20fSFrederick Mayle     key_address = address_serializer_.Write(iter->first, key_address);
161*9712c20fSFrederick Mayle     dest = address_serializer_.Write(iter->second.base(), dest);
162*9712c20fSFrederick Mayle     dest = entry_serializer_.Write(iter->second.entry(), dest);
163*9712c20fSFrederick Mayle   }
164*9712c20fSFrederick Mayle   return dest;
165*9712c20fSFrederick Mayle }
166*9712c20fSFrederick Mayle 
167*9712c20fSFrederick Mayle template<typename Address, typename Entry>
Serialize(const RangeMap<Address,Entry> & m,unsigned int * size)168*9712c20fSFrederick Mayle char* RangeMapSerializer<Address, Entry>::Serialize(
169*9712c20fSFrederick Mayle     const RangeMap<Address, Entry>& m, unsigned int* size) const {
170*9712c20fSFrederick Mayle   // Compute size of memory to be allocated.
171*9712c20fSFrederick Mayle   unsigned int size_to_alloc = SizeOf(m);
172*9712c20fSFrederick Mayle   // Allocate memory.
173*9712c20fSFrederick Mayle   char* serialized_data = new char[size_to_alloc];
174*9712c20fSFrederick Mayle   if (!serialized_data) {
175*9712c20fSFrederick Mayle     BPLOG(INFO) << "RangeMapSerializer memory allocation failed.";
176*9712c20fSFrederick Mayle     if (size) *size = 0;
177*9712c20fSFrederick Mayle     return NULL;
178*9712c20fSFrederick Mayle   }
179*9712c20fSFrederick Mayle 
180*9712c20fSFrederick Mayle   // Write serialized data into memory.
181*9712c20fSFrederick Mayle   Write(m, serialized_data);
182*9712c20fSFrederick Mayle 
183*9712c20fSFrederick Mayle   if (size) *size = size_to_alloc;
184*9712c20fSFrederick Mayle   return serialized_data;
185*9712c20fSFrederick Mayle }
186*9712c20fSFrederick Mayle 
187*9712c20fSFrederick Mayle 
188*9712c20fSFrederick Mayle template<class AddrType, class EntryType>
SizeOf(const ContainedRangeMap<AddrType,EntryType> * m)189*9712c20fSFrederick Mayle size_t ContainedRangeMapSerializer<AddrType, EntryType>::SizeOf(
190*9712c20fSFrederick Mayle     const ContainedRangeMap<AddrType, EntryType>* m) const {
191*9712c20fSFrederick Mayle   size_t size = 0;
192*9712c20fSFrederick Mayle   size_t header_size = addr_serializer_.SizeOf(m->base_)
193*9712c20fSFrederick Mayle                        + entry_serializer_.SizeOf(m->entry_)
194*9712c20fSFrederick Mayle                        + sizeof(uint32_t);
195*9712c20fSFrederick Mayle   size += header_size;
196*9712c20fSFrederick Mayle   // In case m.map_ == NULL, we treat it as an empty map:
197*9712c20fSFrederick Mayle   size += sizeof(uint32_t);
198*9712c20fSFrederick Mayle   if (m->map_) {
199*9712c20fSFrederick Mayle     size += m->map_->size() * sizeof(uint32_t);
200*9712c20fSFrederick Mayle     typename Map::const_iterator iter;
201*9712c20fSFrederick Mayle     for (iter = m->map_->begin(); iter != m->map_->end(); ++iter) {
202*9712c20fSFrederick Mayle       size += addr_serializer_.SizeOf(iter->first);
203*9712c20fSFrederick Mayle       // Recursive calculation of size:
204*9712c20fSFrederick Mayle       size += SizeOf(iter->second);
205*9712c20fSFrederick Mayle     }
206*9712c20fSFrederick Mayle   }
207*9712c20fSFrederick Mayle   return size;
208*9712c20fSFrederick Mayle }
209*9712c20fSFrederick Mayle 
210*9712c20fSFrederick Mayle template<class AddrType, class EntryType>
Write(const ContainedRangeMap<AddrType,EntryType> * m,char * dest)211*9712c20fSFrederick Mayle char* ContainedRangeMapSerializer<AddrType, EntryType>::Write(
212*9712c20fSFrederick Mayle     const ContainedRangeMap<AddrType, EntryType>* m, char* dest) const {
213*9712c20fSFrederick Mayle   if (!dest) {
214*9712c20fSFrederick Mayle     BPLOG(ERROR) << "StdMapSerializer failed: write to NULL address.";
215*9712c20fSFrederick Mayle     return NULL;
216*9712c20fSFrederick Mayle   }
217*9712c20fSFrederick Mayle   dest = addr_serializer_.Write(m->base_, dest);
218*9712c20fSFrederick Mayle   dest = SimpleSerializer<uint32_t>::Write(entry_serializer_.SizeOf(m->entry_),
219*9712c20fSFrederick Mayle                                             dest);
220*9712c20fSFrederick Mayle   dest = entry_serializer_.Write(m->entry_, dest);
221*9712c20fSFrederick Mayle 
222*9712c20fSFrederick Mayle   // Write map<<AddrType, ContainedRangeMap*>:
223*9712c20fSFrederick Mayle   char* map_address = dest;
224*9712c20fSFrederick Mayle   if (m->map_ == NULL) {
225*9712c20fSFrederick Mayle     dest = SimpleSerializer<uint32_t>::Write(0, dest);
226*9712c20fSFrederick Mayle   } else {
227*9712c20fSFrederick Mayle     dest = SimpleSerializer<uint32_t>::Write(m->map_->size(), dest);
228*9712c20fSFrederick Mayle     uint32_t* offsets = reinterpret_cast<uint32_t*>(dest);
229*9712c20fSFrederick Mayle     dest += sizeof(uint32_t) * m->map_->size();
230*9712c20fSFrederick Mayle 
231*9712c20fSFrederick Mayle     char* key_address = dest;
232*9712c20fSFrederick Mayle     dest += sizeof(AddrType) * m->map_->size();
233*9712c20fSFrederick Mayle 
234*9712c20fSFrederick Mayle     // Traverse map.
235*9712c20fSFrederick Mayle     typename Map::const_iterator iter;
236*9712c20fSFrederick Mayle     int index = 0;
237*9712c20fSFrederick Mayle     for (iter = m->map_->begin(); iter != m->map_->end(); ++iter, ++index) {
238*9712c20fSFrederick Mayle       offsets[index] = static_cast<uint32_t>(dest - map_address);
239*9712c20fSFrederick Mayle       key_address = addr_serializer_.Write(iter->first, key_address);
240*9712c20fSFrederick Mayle       // Recursively write.
241*9712c20fSFrederick Mayle       dest = Write(iter->second, dest);
242*9712c20fSFrederick Mayle     }
243*9712c20fSFrederick Mayle   }
244*9712c20fSFrederick Mayle   return dest;
245*9712c20fSFrederick Mayle }
246*9712c20fSFrederick Mayle 
247*9712c20fSFrederick Mayle template<class AddrType, class EntryType>
Serialize(const ContainedRangeMap<AddrType,EntryType> * m,unsigned int * size)248*9712c20fSFrederick Mayle char* ContainedRangeMapSerializer<AddrType, EntryType>::Serialize(
249*9712c20fSFrederick Mayle     const ContainedRangeMap<AddrType, EntryType>* m, unsigned int* size) const {
250*9712c20fSFrederick Mayle   unsigned int size_to_alloc = SizeOf(m);
251*9712c20fSFrederick Mayle   // Allocating memory.
252*9712c20fSFrederick Mayle   char* serialized_data = new char[size_to_alloc];
253*9712c20fSFrederick Mayle   if (!serialized_data) {
254*9712c20fSFrederick Mayle     BPLOG(INFO) << "ContainedRangeMapSerializer memory allocation failed.";
255*9712c20fSFrederick Mayle     if (size) *size = 0;
256*9712c20fSFrederick Mayle     return NULL;
257*9712c20fSFrederick Mayle   }
258*9712c20fSFrederick Mayle   Write(m, serialized_data);
259*9712c20fSFrederick Mayle   if (size) *size = size_to_alloc;
260*9712c20fSFrederick Mayle   return serialized_data;
261*9712c20fSFrederick Mayle }
262*9712c20fSFrederick Mayle 
263*9712c20fSFrederick Mayle }  // namespace google_breakpad
264*9712c20fSFrederick Mayle 
265*9712c20fSFrederick Mayle #endif  // PROCESSOR_MAP_SERIALIZERS_INL_H__
266