From 0e6f5c95d7b791c2a7d2c4056d9746f3fa1ff166 Mon Sep 17 00:00:00 2001 From: mmentovai Date: Wed, 26 Sep 2007 18:08:41 +0000 Subject: [PATCH] Allow Breakpad processor library to build on Solaris with the native Sun toolchain (#142). Patch by Alfred Peng. r=me. git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@213 4c0a9323-5329-0410-9bdc-e9ce6186880e --- .../processor/basic_source_line_resolver.h | 24 +++++++++++++++++++ src/google_breakpad/processor/code_module.h | 1 + .../processor/minidump_processor.h | 1 + src/google_breakpad/processor/process_state.h | 1 + src/processor/basic_source_line_resolver.cc | 13 ++++++++++ src/processor/contained_range_map-inl.h | 2 +- src/processor/minidump.cc | 2 +- src/processor/simple_symbol_supplier.cc | 4 ++-- 8 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/google_breakpad/processor/basic_source_line_resolver.h b/src/google_breakpad/processor/basic_source_line_resolver.h index 2052bacb..814b01ae 100644 --- a/src/google_breakpad/processor/basic_source_line_resolver.h +++ b/src/google_breakpad/processor/basic_source_line_resolver.h @@ -33,14 +33,28 @@ #ifndef GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__ #define GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__ +// TODO: Platforms that have no hash_map can use map, at the likely cost of +// performance. +#ifdef __SUNPRO_CC +#define BSLR_NO_HASH_MAP +#endif // __SUNPRO_CC + +#ifdef BSLR_NO_HASH_MAP +#include +#else // BSLR_NO_HASH_MAP #include +#endif // BSLR_NO_HASH_MAP #include "google_breakpad/processor/source_line_resolver_interface.h" namespace google_breakpad { using std::string; +#ifdef BSLR_NO_HASH_MAP +using std::map; +#else // BSLR_NO_HASH_MAP using __gnu_cxx::hash_map; +#endif // BSLR_NO_HASH_MAP class BasicSourceLineResolver : public SourceLineResolverInterface { public: @@ -65,13 +79,23 @@ class BasicSourceLineResolver : public SourceLineResolverInterface { struct Function; struct PublicSymbol; struct File; +#ifdef BSLR_NO_HASH_MAP + struct CompareString { + bool operator()(const string &s1, const string &s2) const; + }; +#else // BSLR_NO_HASH_MAP struct HashString { size_t operator()(const string &s) const; }; +#endif // BSLR_NO_HASH_MAP class Module; // All of the modules we've loaded +#ifdef BSLR_NO_HASH_MAP + typedef map ModuleMap; +#else // BSLR_NO_HASH_MAP typedef hash_map ModuleMap; +#endif // BSLR_NO_HASH_MAP ModuleMap *modules_; // Disallow unwanted copy ctor and assignment operator diff --git a/src/google_breakpad/processor/code_module.h b/src/google_breakpad/processor/code_module.h index 66cda97b..38ee956e 100644 --- a/src/google_breakpad/processor/code_module.h +++ b/src/google_breakpad/processor/code_module.h @@ -36,6 +36,7 @@ #define GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULE_H__ #include +#include "google_breakpad/common/breakpad_types.h" namespace google_breakpad { diff --git a/src/google_breakpad/processor/minidump_processor.h b/src/google_breakpad/processor/minidump_processor.h index fc0024bc..73447f97 100644 --- a/src/google_breakpad/processor/minidump_processor.h +++ b/src/google_breakpad/processor/minidump_processor.h @@ -31,6 +31,7 @@ #define GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__ #include +#include "google_breakpad/common/breakpad_types.h" namespace google_breakpad { diff --git a/src/google_breakpad/processor/process_state.h b/src/google_breakpad/processor/process_state.h index af95247e..afbbb193 100644 --- a/src/google_breakpad/processor/process_state.h +++ b/src/google_breakpad/processor/process_state.h @@ -37,6 +37,7 @@ #include #include #include "google_breakpad/processor/system_info.h" +#include "google_breakpad/common/breakpad_types.h" namespace google_breakpad { diff --git a/src/processor/basic_source_line_resolver.cc b/src/processor/basic_source_line_resolver.cc index e5d1bd7f..6baa1a8b 100644 --- a/src/processor/basic_source_line_resolver.cc +++ b/src/processor/basic_source_line_resolver.cc @@ -48,7 +48,9 @@ using std::map; using std::vector; using std::make_pair; +#ifndef BSLR_NO_HASH_MAP using __gnu_cxx::hash; +#endif // BSLR_NO_HASH_MAP namespace google_breakpad { @@ -116,7 +118,11 @@ class BasicSourceLineResolver::Module { private: friend class BasicSourceLineResolver; +#ifdef BSLR_NO_HASH_MAP + typedef map FileMap; +#else // BSLR_NO_HASH_MAP typedef hash_map FileMap; +#endif // BSLR_NO_HASH_MAP // The types for stack_info_. This is equivalent to MS DIA's // StackFrameTypeEnum. Each identifies a different type of frame @@ -594,8 +600,15 @@ bool BasicSourceLineResolver::Module::ParseStackInfo(char *stack_info_line) { return true; } +#ifdef BSLR_NO_HASH_MAP +bool BasicSourceLineResolver::CompareString::operator()( + const string &s1, const string &s2) const { + return strcmp(s1.c_str(), s2.c_str()) < 0; +} +#else // BSLR_NO_HASH_MAP size_t BasicSourceLineResolver::HashString::operator()(const string &s) const { return hash()(s.c_str()); } +#endif // BSLR_NO_HASH_MAP } // namespace google_breakpad diff --git a/src/processor/contained_range_map-inl.h b/src/processor/contained_range_map-inl.h index 97f9fdbe..cf5ff235 100644 --- a/src/processor/contained_range_map-inl.h +++ b/src/processor/contained_range_map-inl.h @@ -70,7 +70,7 @@ bool ContainedRangeMap::StoreRange( MapIterator iterator_base = map_->lower_bound(base); MapIterator iterator_high = map_->lower_bound(high); - MapConstIterator iterator_end = map_->end(); + MapIterator iterator_end = map_->end(); if (iterator_base == iterator_high && iterator_base != iterator_end && base >= iterator_base->second->base_) { diff --git a/src/processor/minidump.cc b/src/processor/minidump.cc index 3548fb95..93d4eb05 100644 --- a/src/processor/minidump.cc +++ b/src/processor/minidump.cc @@ -106,7 +106,7 @@ static inline void Swap(u_int32_t* value) { } -static void Swap(u_int64_t* value) { +static inline void Swap(u_int64_t* value) { u_int32_t* value32 = reinterpret_cast(value); Swap(&value32[0]); Swap(&value32[1]); diff --git a/src/processor/simple_symbol_supplier.cc b/src/processor/simple_symbol_supplier.cc index ca3805ce..df61e849 100644 --- a/src/processor/simple_symbol_supplier.cc +++ b/src/processor/simple_symbol_supplier.cc @@ -113,8 +113,8 @@ SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFileAtPath( string debug_file_extension; if (debug_file_name.size() > 4) debug_file_extension = debug_file_name.substr(debug_file_name.size() - 4); - transform(debug_file_extension.begin(), debug_file_extension.end(), - debug_file_extension.begin(), tolower); + std::transform(debug_file_extension.begin(), debug_file_extension.end(), + debug_file_extension.begin(), tolower); if (debug_file_extension == ".pdb") { path.append(debug_file_name.substr(0, debug_file_name.size() - 4)); } else {