1eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// Copyright (c) 2010, Google Inc. 2eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// All rights reserved. 3eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// 4eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// Redistribution and use in source and binary forms, with or without 5eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// modification, are permitted provided that the following conditions are 6eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// met: 7eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// 8eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// * Redistributions of source code must retain the above copyright 9eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// notice, this list of conditions and the following disclaimer. 10eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// * Redistributions in binary form must reproduce the above 11eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// copyright notice, this list of conditions and the following disclaimer 12eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// in the documentation and/or other materials provided with the 13eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// distribution. 14eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// * Neither the name of Google Inc. nor the names of its 15eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// contributors may be used to endorse or promote products derived from 16eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// this software without specific prior written permission. 17eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// 18eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// 30eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// module_serializer.cc: ModuleSerializer implementation. 31eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// 32eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// See module_serializer.h for documentation. 33eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// 34eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// Author: Siyang Xie (lambxsy@google.com) 35eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 36eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com#include "processor/module_serializer.h" 37eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 38eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com#include <map> 39eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com#include <string> 40eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 41eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com#include "processor/basic_code_module.h" 42eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com#include "processor/logging.h" 43eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 44eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.comnamespace google_breakpad { 45eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 46eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// Definition of static member variable in SimplerSerializer<Funcion>, which 47eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com// is declared in file "simple_serializer-inl.h" 48eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.comRangeMapSerializer< MemAddr, linked_ptr<BasicSourceLineResolver::Line> > 49eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.comSimpleSerializer<BasicSourceLineResolver::Function>::range_map_serializer_; 50eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 51eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.comsize_t ModuleSerializer::SizeOf(const BasicSourceLineResolver::Module &module) { 52eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com size_t total_size_alloc_ = 0; 53eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 542d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com // Size of the "is_corrupt" flag. 552d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com total_size_alloc_ += SimpleSerializer<bool>::SizeOf(module.is_corrupt_); 562d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com 57eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Compute memory size for each map component in Module class. 58eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com int map_index = 0; 59eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com map_sizes_[map_index++] = files_serializer_.SizeOf(module.files_); 60eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com map_sizes_[map_index++] = functions_serializer_.SizeOf(module.functions_); 61eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com map_sizes_[map_index++] = pubsym_serializer_.SizeOf(module.public_symbols_); 62eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com for (int i = 0; i < WindowsFrameInfo::STACK_INFO_LAST; ++i) 63eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com map_sizes_[map_index++] = 64eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com wfi_serializer_.SizeOf(&(module.windows_frame_info_[i])); 65eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com map_sizes_[map_index++] = cfi_init_rules_serializer_.SizeOf( 66eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com module.cfi_initial_rules_); 67eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com map_sizes_[map_index++] = cfi_delta_rules_serializer_.SizeOf( 68eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com module.cfi_delta_rules_); 69eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 70eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Header size. 712d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com total_size_alloc_ += kNumberMaps_ * sizeof(uint32_t); 72eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 732d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com for (int i = 0; i < kNumberMaps_; ++i) { 742d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com total_size_alloc_ += map_sizes_[i]; 752d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com } 76eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 77eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Extra one byte for null terminator for C-string copy safety. 782d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com total_size_alloc_ += SimpleSerializer<char>::SizeOf(0); 79eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 80eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com return total_size_alloc_; 81eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com} 82eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 83eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.comchar *ModuleSerializer::Write(const BasicSourceLineResolver::Module &module, 84eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com char *dest) { 852d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com // Write the is_corrupt flag. 862d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com dest = SimpleSerializer<bool>::Write(module.is_corrupt_, dest); 87eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Write header. 886162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com memcpy(dest, map_sizes_, kNumberMaps_ * sizeof(uint32_t)); 896162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com dest += kNumberMaps_ * sizeof(uint32_t); 90eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Write each map. 91eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com dest = files_serializer_.Write(module.files_, dest); 92eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com dest = functions_serializer_.Write(module.functions_, dest); 93eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com dest = pubsym_serializer_.Write(module.public_symbols_, dest); 94eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com for (int i = 0; i < WindowsFrameInfo::STACK_INFO_LAST; ++i) 95eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com dest = wfi_serializer_.Write(&(module.windows_frame_info_[i]), dest); 96eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com dest = cfi_init_rules_serializer_.Write(module.cfi_initial_rules_, dest); 97eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com dest = cfi_delta_rules_serializer_.Write(module.cfi_delta_rules_, dest); 98eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Write a null terminator. 99eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com dest = SimpleSerializer<char>::Write(0, dest); 100eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com return dest; 101eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com} 102eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 103eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.comchar* ModuleSerializer::Serialize( 104eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com const BasicSourceLineResolver::Module &module, unsigned int *size) { 105eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Compute size of memory to allocate. 106eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com unsigned int size_to_alloc = SizeOf(module); 107eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 108eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Allocate memory for serialized data. 109bbd8e82a7fa12d8c56882ec6a9d6d42bebd7983cSiyangXie@gmail.com char *serialized_data = new char[size_to_alloc]; 110eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com if (!serialized_data) { 111eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com BPLOG(ERROR) << "ModuleSerializer: memory allocation failed, " 112eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com << "size to alloc: " << size_to_alloc; 113eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com if (size) *size = 0; 114eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com return NULL; 115eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com } 116eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 117eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Write serialized data to allocated memory chunk. 118eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com char *end_address = Write(module, serialized_data); 119eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Verify the allocated memory size is equal to the size of data been written. 120eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com unsigned int size_written = 121eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com static_cast<unsigned int>(end_address - serialized_data); 122eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com if (size_to_alloc != size_written) { 123eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com BPLOG(ERROR) << "size_to_alloc differs from size_written: " 124eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com << size_to_alloc << " vs " << size_written; 125eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com } 126eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 127eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Set size and return the start address of memory chunk. 128eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com if (size) 129eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com *size = size_to_alloc; 130eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com return serialized_data; 131eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com} 132eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 133eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.combool ModuleSerializer::SerializeModuleAndLoadIntoFastResolver( 134eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com const BasicSourceLineResolver::ModuleMap::const_iterator &iter, 135eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com FastSourceLineResolver *fast_resolver) { 136eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com BPLOG(INFO) << "Converting symbol " << iter->first.c_str(); 137eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 138eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Cast SourceLineResolverBase::Module* to BasicSourceLineResolver::Module*. 139eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com BasicSourceLineResolver::Module* basic_module = 140eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com dynamic_cast<BasicSourceLineResolver::Module*>(iter->second); 141eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 142eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com unsigned int size = 0; 143bbd8e82a7fa12d8c56882ec6a9d6d42bebd7983cSiyangXie@gmail.com scoped_array<char> symbol_data(Serialize(*basic_module, &size)); 144eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com if (!symbol_data.get()) { 145eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com BPLOG(ERROR) << "Serialization failed for module: " << basic_module->name_; 146eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com return false; 147eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com } 148eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com BPLOG(INFO) << "Serialized Symbol Size " << size; 149eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 150eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Copy the data into string. 151eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Must pass string to LoadModuleUsingMapBuffer(), instead of passing char* to 152eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // LoadModuleUsingMemoryBuffer(), becaused of data ownership/lifetime issue. 153eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com string symbol_data_string(symbol_data.get(), size); 154eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com symbol_data.reset(); 155eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 156eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com scoped_ptr<CodeModule> code_module( 157eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com new BasicCodeModule(0, 0, iter->first, "", "", "", "")); 158eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 159eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com return fast_resolver->LoadModuleUsingMapBuffer(code_module.get(), 160eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com symbol_data_string); 161eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com} 162eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 163eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.comvoid ModuleSerializer::ConvertAllModules( 164eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com const BasicSourceLineResolver *basic_resolver, 165eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com FastSourceLineResolver *fast_resolver) { 166eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Check for NULL pointer. 167eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com if (!basic_resolver || !fast_resolver) 168eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com return; 169eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 170eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Traverse module list in basic resolver. 171eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com BasicSourceLineResolver::ModuleMap::const_iterator iter; 172eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com iter = basic_resolver->modules_->begin(); 173eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com for (; iter != basic_resolver->modules_->end(); ++iter) 174eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com SerializeModuleAndLoadIntoFastResolver(iter, fast_resolver); 175eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com} 176eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 177eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.combool ModuleSerializer::ConvertOneModule( 178eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com const string &moduleid, 179eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com const BasicSourceLineResolver *basic_resolver, 180eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com FastSourceLineResolver *fast_resolver) { 181eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com // Check for NULL pointer. 182eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com if (!basic_resolver || !fast_resolver) 183eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com return false; 184eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 185eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com BasicSourceLineResolver::ModuleMap::const_iterator iter; 186eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com iter = basic_resolver->modules_->find(moduleid); 187eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com if (iter == basic_resolver->modules_->end()) 188eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com return false; 189eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 190eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com return SerializeModuleAndLoadIntoFastResolver(iter, fast_resolver); 191eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com} 192eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 193eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.comchar* ModuleSerializer::SerializeSymbolFileData( 194eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com const string &symbol_data, unsigned int *size) { 195eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com scoped_ptr<BasicSourceLineResolver::Module> module( 196eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com new BasicSourceLineResolver::Module("no name")); 197eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com scoped_array<char> buffer(new char[symbol_data.size() + 1]); 1982d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com memcpy(buffer.get(), symbol_data.c_str(), symbol_data.size()); 1992d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com buffer.get()[symbol_data.size()] = '\0'; 2002d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com if (!module->LoadMapFromMemory(buffer.get(), symbol_data.size() + 1)) { 201eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com return NULL; 202eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com } 203bbd8e82a7fa12d8c56882ec6a9d6d42bebd7983cSiyangXie@gmail.com buffer.reset(NULL); 204eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com return Serialize(*(module.get()), size); 205eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com} 206eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com 207eabfff133dd08207af3f7ea828ea09b9c4dfeffaSiyangXie@gmail.com} // namespace google_breakpad 208