aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiyangXie@gmail.com <SiyangXie@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e>2010-10-15 20:36:31 +0000
committerSiyangXie@gmail.com <SiyangXie@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e>2010-10-15 20:36:31 +0000
commit08730fc9a639e5b962f9a803ae8f5e91630e9484 (patch)
treeaf0d4fe8db2618401806a1c936320b756da37d08
parentFix some compiler warnings: char*->const char*, default in swtch. (diff)
downloadbreakpad-08730fc9a639e5b962f9a803ae8f5e91630e9484.tar.xz
Add static version of map wrappers and corresponding serializers.
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@714 4c0a9323-5329-0410-9bdc-e9ce6186880e
-rw-r--r--Makefile.am108
-rw-r--r--Makefile.in431
-rw-r--r--src/google_breakpad/processor/basic_source_line_resolver.h1
-rw-r--r--src/processor/address_map.h6
-rw-r--r--src/processor/contained_range_map.h4
-rw-r--r--src/processor/map_serializers-inl.h268
-rw-r--r--src/processor/map_serializers.h164
-rw-r--r--src/processor/map_serializers_unittest.cc388
-rw-r--r--src/processor/module_factory.h8
-rw-r--r--src/processor/range_map.h5
-rw-r--r--src/processor/simple_serializer-inl.h252
-rw-r--r--src/processor/simple_serializer.h63
-rw-r--r--src/processor/static_address_map-inl.h71
-rw-r--r--src/processor/static_address_map.h78
-rw-r--r--src/processor/static_address_map_unittest.cc235
-rw-r--r--src/processor/static_contained_range_map-inl.h93
-rw-r--r--src/processor/static_contained_range_map.h96
-rw-r--r--src/processor/static_contained_range_map_unittest.cc317
-rw-r--r--src/processor/static_range_map-inl.h130
-rw-r--r--src/processor/static_range_map.h106
-rw-r--r--src/processor/static_range_map_unittest.cc427
21 files changed, 3205 insertions, 46 deletions
diff --git a/Makefile.am b/Makefile.am
index 6b02a2be..f444a706 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -119,6 +119,8 @@ src_libbreakpad_a_SOURCES = \
src/processor/linked_ptr.h \
src/processor/logging.h \
src/processor/logging.cc \
+ src/processor/map_serializers-inl.h \
+ src/processor/map_serializers.h \
src/processor/minidump.cc \
src/processor/minidump_processor.cc \
src/processor/network_interface.h \
@@ -133,6 +135,8 @@ src_libbreakpad_a_SOURCES = \
src/processor/range_map-inl.h \
src/processor/range_map.h \
src/processor/scoped_ptr.h \
+ src/processor/simple_serializer-inl.h \
+ src/processor/simple_serializer.h \
src/processor/simple_symbol_supplier.cc \
src/processor/simple_symbol_supplier.h \
src/processor/windows_frame_info.h \
@@ -149,10 +153,16 @@ src_libbreakpad_a_SOURCES = \
src/processor/stackwalker_sparc.h \
src/processor/stackwalker_x86.cc \
src/processor/stackwalker_x86.h \
+ src/processor/static_address_map-inl.h \
+ src/processor/static_address_map.h \
+ src/processor/static_contained_range_map-inl.h \
+ src/processor/static_contained_range_map.h \
src/processor/static_map_iterator-inl.h \
src/processor/static_map_iterator.h \
src/processor/static_map-inl.h \
src/processor/static_map.h \
+ src/processor/static_range_map-inl.h \
+ src/processor/static_range_map.h \
src/processor/tokenize.cc \
src/processor/tokenize.h \
src/processor/udp_network.cc \
@@ -211,12 +221,16 @@ check_PROGRAMS += \
src/processor/contained_range_map_unittest \
src/processor/disassembler_x86_unittest \
src/processor/exploitability_unittest \
+ src/processor/map_serializers_unittest \
src/processor/minidump_processor_unittest \
src/processor/minidump_unittest \
src/processor/network_source_line_resolver_unittest \
src/processor/network_source_line_resolver_server_unittest \
src/processor/network_source_line_server_unittest \
+ src/processor/static_address_map_unittest \
+ src/processor/static_contained_range_map_unittest \
src/processor/static_map_unittest \
+ src/processor/static_range_map_unittest \
src/processor/pathname_stripper_unittest \
src/processor/postfix_evaluator_unittest \
src/processor/range_map_unittest \
@@ -273,7 +287,7 @@ src_client_linux_linux_client_unittest_SOURCES = \
src_client_linux_linux_client_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
src_client_linux_linux_client_unittest_LDADD = \
@@ -305,7 +319,7 @@ src_processor_binarystream_unittest_SOURCES = \
src_processor_binarystream_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
src_processor_binarystream_unittest_LDADD = \
@@ -318,7 +332,7 @@ src_processor_basic_source_line_resolver_unittest_SOURCES = \
src_processor_basic_source_line_resolver_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
src_processor_basic_source_line_resolver_unittest_LDADD = \
@@ -341,7 +355,7 @@ src_processor_cfi_frame_info_unittest_LDADD = \
src_processor_cfi_frame_info_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
@@ -400,6 +414,20 @@ src_processor_disassembler_x86_unittest_LDADD = \
src/processor/disassembler_x86.o \
src/third_party/libdisasm/libdisasm.a
+src_processor_map_serializers_unittest_SOURCES = \
+ src/processor/map_serializers_unittest.cc \
+ src/testing/gtest/src/gtest-all.cc \
+ src/testing/src/gmock-all.cc
+src_processor_map_serializers_unittest_CPPFLAGS = \
+ -I$(top_srcdir)/src \
+ -I$(top_srcdir)/src/testing/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest \
+ -I$(top_srcdir)/src/testing
+src_processor_map_serializers_unittest_LDADD = \
+ src/processor/logging.o \
+ src/processor/pathname_stripper.o
+
src_processor_minidump_processor_unittest_SOURCES = \
src/processor/minidump_processor_unittest.cc \
src/testing/gtest/src/gtest-all.cc \
@@ -407,7 +435,7 @@ src_processor_minidump_processor_unittest_SOURCES = \
src_processor_minidump_processor_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
src_processor_minidump_processor_unittest_LDADD = \
@@ -443,7 +471,7 @@ src_processor_minidump_unittest_SOURCES = \
src_processor_minidump_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
src_processor_minidump_unittest_LDADD = \
@@ -459,7 +487,7 @@ src_processor_network_source_line_resolver_unittest_SOURCES = \
src_processor_network_source_line_resolver_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
src_processor_network_source_line_resolver_unittest_LDADD = \
@@ -479,7 +507,7 @@ src_processor_network_source_line_resolver_server_unittest_SOURCES = \
src_processor_network_source_line_resolver_server_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
src_processor_network_source_line_resolver_server_unittest_LDADD = \
@@ -517,7 +545,7 @@ src_processor_network_source_line_server_unittest_SOURCES = \
src_processor_network_source_line_server_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
src_processor_network_source_line_server_unittest_LDADD = \
@@ -528,20 +556,62 @@ src_processor_network_source_line_server_unittest_LDADD = \
src/processor/pathname_stripper.o \
src/processor/udp_network.o
+src_processor_static_address_map_unittest_SOURCES = \
+ src/processor/static_address_map_unittest.cc \
+ src/testing/gtest/src/gtest-all.cc \
+ src/testing/src/gmock-all.cc
+src_processor_static_address_map_unittest_CPPFLAGS = \
+ -I$(top_srcdir)/src \
+ -I$(top_srcdir)/src/testing/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest \
+ -I$(top_srcdir)/src/testing
+src_processor_static_address_map_unittest_LDADD = \
+ src/processor/logging.o \
+ src/processor/pathname_stripper.o
+
+src_processor_static_contained_range_map_unittest_SOURCES = \
+ src/processor/static_contained_range_map_unittest.cc \
+ src/testing/gtest/src/gtest-all.cc \
+ src/testing/src/gmock-all.cc
+src_processor_static_contained_range_map_unittest_CPPFLAGS = \
+ -I$(top_srcdir)/src \
+ -I$(top_srcdir)/src/testing/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest \
+ -I$(top_srcdir)/src/testing
+src_processor_static_contained_range_map_unittest_LDADD = \
+ src/processor/logging.o \
+ src/processor/pathname_stripper.o
+
src_processor_static_map_unittest_SOURCES = \
src/processor/static_map_unittest.cc \
src/testing/gtest/src/gtest-all.cc \
src/testing/src/gmock-all.cc
src_processor_static_map_unittest_CPPFLAGS = \
- -I$(top_srcdir)/src \
- -I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
- -I$(top_srcdir)/src/testing/gtest \
- -I$(top_srcdir)/src/testing
+ -I$(top_srcdir)/src \
+ -I$(top_srcdir)/src/testing/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest \
+ -I$(top_srcdir)/src/testing
src_processor_static_map_unittest_LDADD = \
src/processor/logging.o \
src/processor/pathname_stripper.o
+src_processor_static_range_map_unittest_SOURCES = \
+ src/processor/static_range_map_unittest.cc \
+ src/testing/gtest/src/gtest-all.cc \
+ src/testing/src/gmock-all.cc
+src_processor_static_range_map_unittest_CPPFLAGS = \
+ -I$(top_srcdir)/src \
+ -I$(top_srcdir)/src/testing/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest \
+ -I$(top_srcdir)/src/testing
+src_processor_static_range_map_unittest_LDADD = \
+ src/processor/logging.o \
+ src/processor/pathname_stripper.o
+
src_processor_pathname_stripper_unittest_SOURCES = \
src/processor/pathname_stripper_unittest.cc
src_processor_pathname_stripper_unittest_LDADD = \
@@ -591,7 +661,7 @@ src_processor_stackwalker_amd64_unittest_LDADD = \
src_processor_stackwalker_amd64_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
@@ -606,7 +676,7 @@ src_processor_stackwalker_arm_unittest_LDADD = \
src_processor_stackwalker_arm_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
@@ -621,7 +691,7 @@ src_processor_stackwalker_x86_unittest_LDADD = \
src_processor_stackwalker_x86_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
@@ -637,7 +707,7 @@ src_processor_synth_minidump_unittest_SOURCES = \
src_processor_synth_minidump_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
@@ -651,7 +721,7 @@ src_common_test_assembler_unittest_SOURCES = \
src_common_test_assembler_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
diff --git a/Makefile.in b/Makefile.in
index 33054b33..275ba44e 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -88,12 +88,16 @@ check_PROGRAMS = $(am__EXEEXT_3) $(am__EXEEXT_4) $(am__EXEEXT_5)
@DISABLE_PROCESSOR_FALSE@ src/processor/contained_range_map_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_unittest \
+@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver_server_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_server_unittest \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_address_map_unittest \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_contained_range_map_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_map_unittest \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_range_map_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/postfix_evaluator_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/range_map_unittest \
@@ -216,7 +220,9 @@ am__src_libbreakpad_a_SOURCES_DIST = \
src/processor/exploitability_win.h \
src/processor/exploitability_win.cc src/processor/linked_ptr.h \
src/processor/logging.h src/processor/logging.cc \
- src/processor/minidump.cc src/processor/minidump_processor.cc \
+ src/processor/map_serializers-inl.h \
+ src/processor/map_serializers.h src/processor/minidump.cc \
+ src/processor/minidump_processor.cc \
src/processor/network_interface.h \
src/processor/network_source_line_resolver.cc \
src/processor/network_source_line_server.cc \
@@ -227,6 +233,8 @@ am__src_libbreakpad_a_SOURCES_DIST = \
src/processor/postfix_evaluator.h \
src/processor/process_state.cc src/processor/range_map-inl.h \
src/processor/range_map.h src/processor/scoped_ptr.h \
+ src/processor/simple_serializer-inl.h \
+ src/processor/simple_serializer.h \
src/processor/simple_symbol_supplier.cc \
src/processor/simple_symbol_supplier.h \
src/processor/windows_frame_info.h \
@@ -243,11 +251,17 @@ am__src_libbreakpad_a_SOURCES_DIST = \
src/processor/stackwalker_sparc.h \
src/processor/stackwalker_x86.cc \
src/processor/stackwalker_x86.h \
+ src/processor/static_address_map-inl.h \
+ src/processor/static_address_map.h \
+ src/processor/static_contained_range_map-inl.h \
+ src/processor/static_contained_range_map.h \
src/processor/static_map_iterator-inl.h \
src/processor/static_map_iterator.h \
src/processor/static_map-inl.h src/processor/static_map.h \
- src/processor/tokenize.cc src/processor/tokenize.h \
- src/processor/udp_network.cc src/processor/udp_network.h
+ src/processor/static_range_map-inl.h \
+ src/processor/static_range_map.h src/processor/tokenize.cc \
+ src/processor/tokenize.h src/processor/udp_network.cc \
+ src/processor/udp_network.h
@DISABLE_PROCESSOR_FALSE@am_src_libbreakpad_a_OBJECTS = src/processor/basic_code_modules.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/binarystream.$(OBJEXT) \
@@ -332,12 +346,16 @@ src_third_party_libdisasm_libdisasm_a_OBJECTS = \
@DISABLE_PROCESSOR_FALSE@ src/processor/contained_range_map_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_unittest$(EXEEXT) \
+@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver_server_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_server_unittest$(EXEEXT) \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_address_map_unittest$(EXEEXT) \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_contained_range_map_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_map_unittest$(EXEEXT) \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_range_map_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/postfix_evaluator_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/range_map_unittest$(EXEEXT) \
@@ -502,6 +520,18 @@ src_processor_exploitability_unittest_OBJECTS = \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \
@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a
+am__src_processor_map_serializers_unittest_SOURCES_DIST = \
+ src/processor/map_serializers_unittest.cc \
+ src/testing/gtest/src/gtest-all.cc \
+ src/testing/src/gmock-all.cc
+@DISABLE_PROCESSOR_FALSE@am_src_processor_map_serializers_unittest_OBJECTS = src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.$(OBJEXT) \
+@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.$(OBJEXT) \
+@DISABLE_PROCESSOR_FALSE@ src/testing/src/src_processor_map_serializers_unittest-gmock-all.$(OBJEXT)
+src_processor_map_serializers_unittest_OBJECTS = \
+ $(am_src_processor_map_serializers_unittest_OBJECTS)
+@DISABLE_PROCESSOR_FALSE@src_processor_map_serializers_unittest_DEPENDENCIES = \
+@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
am__src_processor_minidump_dump_SOURCES_DIST = \
src/processor/minidump_dump.cc
@DISABLE_PROCESSOR_FALSE@am_src_processor_minidump_dump_OBJECTS = src/processor/minidump_dump.$(OBJEXT)
@@ -769,6 +799,29 @@ src_processor_stackwalker_x86_unittest_OBJECTS = \
$(am_src_processor_stackwalker_x86_unittest_OBJECTS)
@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_x86_unittest_DEPENDENCIES = \
@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a
+am__src_processor_static_address_map_unittest_SOURCES_DIST = \
+ src/processor/static_address_map_unittest.cc \
+ src/testing/gtest/src/gtest-all.cc \
+ src/testing/src/gmock-all.cc
+@DISABLE_PROCESSOR_FALSE@am_src_processor_static_address_map_unittest_OBJECTS = src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.$(OBJEXT) \
+@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.$(OBJEXT) \
+@DISABLE_PROCESSOR_FALSE@ src/testing/src/src_processor_static_address_map_unittest-gmock-all.$(OBJEXT)
+src_processor_static_address_map_unittest_OBJECTS = \
+ $(am_src_processor_static_address_map_unittest_OBJECTS)
+@DISABLE_PROCESSOR_FALSE@src_processor_static_address_map_unittest_DEPENDENCIES = \
+@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
+am__src_processor_static_contained_range_map_unittest_SOURCES_DIST = \
+ src/processor/static_contained_range_map_unittest.cc \
+ src/testing/gtest/src/gtest-all.cc \
+ src/testing/src/gmock-all.cc
+@DISABLE_PROCESSOR_FALSE@am_src_processor_static_contained_range_map_unittest_OBJECTS = src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.$(OBJEXT) \
+@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-all.$(OBJEXT) \
+@DISABLE_PROCESSOR_FALSE@ src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.$(OBJEXT)
+src_processor_static_contained_range_map_unittest_OBJECTS = $(am_src_processor_static_contained_range_map_unittest_OBJECTS)
+@DISABLE_PROCESSOR_FALSE@src_processor_static_contained_range_map_unittest_DEPENDENCIES = \
+@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
am__src_processor_static_map_unittest_SOURCES_DIST = \
src/processor/static_map_unittest.cc \
src/testing/gtest/src/gtest-all.cc \
@@ -781,6 +834,18 @@ src_processor_static_map_unittest_OBJECTS = \
@DISABLE_PROCESSOR_FALSE@src_processor_static_map_unittest_DEPENDENCIES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
+am__src_processor_static_range_map_unittest_SOURCES_DIST = \
+ src/processor/static_range_map_unittest.cc \
+ src/testing/gtest/src/gtest-all.cc \
+ src/testing/src/gmock-all.cc
+@DISABLE_PROCESSOR_FALSE@am_src_processor_static_range_map_unittest_OBJECTS = src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.$(OBJEXT) \
+@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.$(OBJEXT) \
+@DISABLE_PROCESSOR_FALSE@ src/testing/src/src_processor_static_range_map_unittest-gmock-all.$(OBJEXT)
+src_processor_static_range_map_unittest_OBJECTS = \
+ $(am_src_processor_static_range_map_unittest_OBJECTS)
+@DISABLE_PROCESSOR_FALSE@src_processor_static_range_map_unittest_DEPENDENCIES = \
+@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
am__src_processor_synth_minidump_unittest_SOURCES_DIST = \
src/common/test_assembler.cc src/common/test_assembler.h \
src/processor/synth_minidump_unittest.cc \
@@ -824,6 +889,7 @@ SOURCES = $(src_client_linux_libbreakpad_client_a_SOURCES) \
$(src_processor_contained_range_map_unittest_SOURCES) \
$(src_processor_disassembler_x86_unittest_SOURCES) \
$(src_processor_exploitability_unittest_SOURCES) \
+ $(src_processor_map_serializers_unittest_SOURCES) \
$(src_processor_minidump_dump_SOURCES) \
$(src_processor_minidump_processor_unittest_SOURCES) \
$(src_processor_minidump_stackwalk_SOURCES) \
@@ -839,7 +905,10 @@ SOURCES = $(src_client_linux_libbreakpad_client_a_SOURCES) \
$(src_processor_stackwalker_arm_unittest_SOURCES) \
$(src_processor_stackwalker_selftest_SOURCES) \
$(src_processor_stackwalker_x86_unittest_SOURCES) \
+ $(src_processor_static_address_map_unittest_SOURCES) \
+ $(src_processor_static_contained_range_map_unittest_SOURCES) \
$(src_processor_static_map_unittest_SOURCES) \
+ $(src_processor_static_range_map_unittest_SOURCES) \
$(src_processor_synth_minidump_unittest_SOURCES)
DIST_SOURCES = \
$(am__src_client_linux_libbreakpad_client_a_SOURCES_DIST) \
@@ -855,6 +924,7 @@ DIST_SOURCES = \
$(am__src_processor_contained_range_map_unittest_SOURCES_DIST) \
$(am__src_processor_disassembler_x86_unittest_SOURCES_DIST) \
$(am__src_processor_exploitability_unittest_SOURCES_DIST) \
+ $(am__src_processor_map_serializers_unittest_SOURCES_DIST) \
$(am__src_processor_minidump_dump_SOURCES_DIST) \
$(am__src_processor_minidump_processor_unittest_SOURCES_DIST) \
$(am__src_processor_minidump_stackwalk_SOURCES_DIST) \
@@ -870,7 +940,10 @@ DIST_SOURCES = \
$(am__src_processor_stackwalker_arm_unittest_SOURCES_DIST) \
$(am__src_processor_stackwalker_selftest_SOURCES_DIST) \
$(am__src_processor_stackwalker_x86_unittest_SOURCES_DIST) \
+ $(am__src_processor_static_address_map_unittest_SOURCES_DIST) \
+ $(am__src_processor_static_contained_range_map_unittest_SOURCES_DIST) \
$(am__src_processor_static_map_unittest_SOURCES_DIST) \
+ $(am__src_processor_static_range_map_unittest_SOURCES_DIST) \
$(am__src_processor_synth_minidump_unittest_SOURCES_DIST)
DATA = $(dist_doc_DATA)
ETAGS = etags
@@ -1062,6 +1135,8 @@ lib_LIBRARIES = $(am__append_1) $(am__append_3)
@DISABLE_PROCESSOR_FALSE@ src/processor/linked_ptr.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.cc \
+@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers-inl.h \
+@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_interface.h \
@@ -1076,6 +1151,8 @@ lib_LIBRARIES = $(am__append_1) $(am__append_3)
@DISABLE_PROCESSOR_FALSE@ src/processor/range_map-inl.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/range_map.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/scoped_ptr.h \
+@DISABLE_PROCESSOR_FALSE@ src/processor/simple_serializer-inl.h \
+@DISABLE_PROCESSOR_FALSE@ src/processor/simple_serializer.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/windows_frame_info.h \
@@ -1092,10 +1169,16 @@ lib_LIBRARIES = $(am__append_1) $(am__append_3)
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.h \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_address_map-inl.h \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_address_map.h \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_contained_range_map-inl.h \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_contained_range_map.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_map_iterator-inl.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_map_iterator.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_map-inl.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_map.h \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_range_map-inl.h \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_range_map.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.cc \
@@ -1161,7 +1244,7 @@ TESTS_ENVIRONMENT =
@LINUX_HOST_TRUE@src_client_linux_linux_client_unittest_CPPFLAGS = \
@LINUX_HOST_TRUE@ -I$(top_srcdir)/src \
@LINUX_HOST_TRUE@ -I$(top_srcdir)/src/testing/include \
-@LINUX_HOST_TRUE@ -I$(top_srcdir)/src/testing/gtest/include \
+@LINUX_HOST_TRUE@ -I$(top_srcdir)/src/testing/gtest/include \
@LINUX_HOST_TRUE@ -I$(top_srcdir)/src/testing/gtest \
@LINUX_HOST_TRUE@ -I$(top_srcdir)/src/testing
@@ -1193,7 +1276,7 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@src_processor_binarystream_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@@ -1208,7 +1291,7 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@src_processor_basic_source_line_resolver_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@@ -1234,7 +1317,7 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@src_processor_cfi_frame_info_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@@ -1298,6 +1381,22 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \
@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a
+@DISABLE_PROCESSOR_FALSE@src_processor_map_serializers_unittest_SOURCES = \
+@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers_unittest.cc \
+@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/gtest-all.cc \
+@DISABLE_PROCESSOR_FALSE@ src/testing/src/gmock-all.cc
+
+@DISABLE_PROCESSOR_FALSE@src_processor_map_serializers_unittest_CPPFLAGS = \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
+
+@DISABLE_PROCESSOR_FALSE@src_processor_map_serializers_unittest_LDADD = \
+@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
+
@DISABLE_PROCESSOR_FALSE@src_processor_minidump_processor_unittest_SOURCES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor_unittest.cc \
@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/gtest-all.cc \
@@ -1306,7 +1405,7 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@src_processor_minidump_processor_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@@ -1344,7 +1443,7 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@src_processor_minidump_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@@ -1362,7 +1461,7 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_resolver_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@@ -1384,7 +1483,7 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_resolver_server_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@@ -1424,7 +1523,7 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_server_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@@ -1436,22 +1535,70 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.o
+@DISABLE_PROCESSOR_FALSE@src_processor_static_address_map_unittest_SOURCES = \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_address_map_unittest.cc \
+@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/gtest-all.cc \
+@DISABLE_PROCESSOR_FALSE@ src/testing/src/gmock-all.cc
+
+@DISABLE_PROCESSOR_FALSE@src_processor_static_address_map_unittest_CPPFLAGS = \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
+
+@DISABLE_PROCESSOR_FALSE@src_processor_static_address_map_unittest_LDADD = \
+@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
+
+@DISABLE_PROCESSOR_FALSE@src_processor_static_contained_range_map_unittest_SOURCES = \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_contained_range_map_unittest.cc \
+@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/gtest-all.cc \
+@DISABLE_PROCESSOR_FALSE@ src/testing/src/gmock-all.cc
+
+@DISABLE_PROCESSOR_FALSE@src_processor_static_contained_range_map_unittest_CPPFLAGS = \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
+
+@DISABLE_PROCESSOR_FALSE@src_processor_static_contained_range_map_unittest_LDADD = \
+@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
+
@DISABLE_PROCESSOR_FALSE@src_processor_static_map_unittest_SOURCES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_map_unittest.cc \
@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/gtest-all.cc \
@DISABLE_PROCESSOR_FALSE@ src/testing/src/gmock-all.cc
@DISABLE_PROCESSOR_FALSE@src_processor_static_map_unittest_CPPFLAGS = \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@DISABLE_PROCESSOR_FALSE@src_processor_static_map_unittest_LDADD = \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
+@DISABLE_PROCESSOR_FALSE@src_processor_static_range_map_unittest_SOURCES = \
+@DISABLE_PROCESSOR_FALSE@ src/processor/static_range_map_unittest.cc \
+@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/gtest-all.cc \
+@DISABLE_PROCESSOR_FALSE@ src/testing/src/gmock-all.cc
+
+@DISABLE_PROCESSOR_FALSE@src_processor_static_range_map_unittest_CPPFLAGS = \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
+
+@DISABLE_PROCESSOR_FALSE@src_processor_static_range_map_unittest_LDADD = \
+@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
+
@DISABLE_PROCESSOR_FALSE@src_processor_pathname_stripper_unittest_SOURCES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper_unittest.cc
@@ -1507,7 +1654,7 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_amd64_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@@ -1524,7 +1671,7 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_arm_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@@ -1541,7 +1688,7 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_x86_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@@ -1558,7 +1705,7 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@src_processor_synth_minidump_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@@ -1573,7 +1720,7 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@src_common_test_assembler_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@@ -2254,6 +2401,18 @@ src/testing/src/src_processor_exploitability_unittest-gmock-all.$(OBJEXT): \
src/processor/exploitability_unittest$(EXEEXT): $(src_processor_exploitability_unittest_OBJECTS) $(src_processor_exploitability_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/exploitability_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_exploitability_unittest_OBJECTS) $(src_processor_exploitability_unittest_LDADD) $(LIBS)
+src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.$(OBJEXT): \
+ src/processor/$(am__dirstamp) \
+ src/processor/$(DEPDIR)/$(am__dirstamp)
+src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.$(OBJEXT): \
+ src/testing/gtest/src/$(am__dirstamp) \
+ src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+src/testing/src/src_processor_map_serializers_unittest-gmock-all.$(OBJEXT): \
+ src/testing/src/$(am__dirstamp) \
+ src/testing/src/$(DEPDIR)/$(am__dirstamp)
+src/processor/map_serializers_unittest$(EXEEXT): $(src_processor_map_serializers_unittest_OBJECTS) $(src_processor_map_serializers_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
+ @rm -f src/processor/map_serializers_unittest$(EXEEXT)
+ $(CXXLINK) $(src_processor_map_serializers_unittest_OBJECTS) $(src_processor_map_serializers_unittest_LDADD) $(LIBS)
src/processor/minidump_dump.$(OBJEXT): src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/minidump_dump$(EXEEXT): $(src_processor_minidump_dump_OBJECTS) $(src_processor_minidump_dump_DEPENDENCIES) src/processor/$(am__dirstamp)
@@ -2417,6 +2576,30 @@ src/testing/src/src_processor_stackwalker_x86_unittest-gmock-all.$(OBJEXT): \
src/processor/stackwalker_x86_unittest$(EXEEXT): $(src_processor_stackwalker_x86_unittest_OBJECTS) $(src_processor_stackwalker_x86_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/stackwalker_x86_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_stackwalker_x86_unittest_OBJECTS) $(src_processor_stackwalker_x86_unittest_LDADD) $(LIBS)
+src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.$(OBJEXT): \
+ src/processor/$(am__dirstamp) \
+ src/processor/$(DEPDIR)/$(am__dirstamp)
+src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.$(OBJEXT): \
+ src/testing/gtest/src/$(am__dirstamp) \
+ src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+src/testing/src/src_processor_static_address_map_unittest-gmock-all.$(OBJEXT): \
+ src/testing/src/$(am__dirstamp) \
+ src/testing/src/$(DEPDIR)/$(am__dirstamp)
+src/processor/static_address_map_unittest$(EXEEXT): $(src_processor_static_address_map_unittest_OBJECTS) $(src_processor_static_address_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
+ @rm -f src/processor/static_address_map_unittest$(EXEEXT)
+ $(CXXLINK) $(src_processor_static_address_map_unittest_OBJECTS) $(src_processor_static_address_map_unittest_LDADD) $(LIBS)
+src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.$(OBJEXT): \
+ src/processor/$(am__dirstamp) \
+ src/processor/$(DEPDIR)/$(am__dirstamp)
+src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-all.$(OBJEXT): \
+ src/testing/gtest/src/$(am__dirstamp) \
+ src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.$(OBJEXT): \
+ src/testing/src/$(am__dirstamp) \
+ src/testing/src/$(DEPDIR)/$(am__dirstamp)
+src/processor/static_contained_range_map_unittest$(EXEEXT): $(src_processor_static_contained_range_map_unittest_OBJECTS) $(src_processor_static_contained_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
+ @rm -f src/processor/static_contained_range_map_unittest$(EXEEXT)
+ $(CXXLINK) $(src_processor_static_contained_range_map_unittest_OBJECTS) $(src_processor_static_contained_range_map_unittest_LDADD) $(LIBS)
src/processor/src_processor_static_map_unittest-static_map_unittest.$(OBJEXT): \
src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
@@ -2429,6 +2612,18 @@ src/testing/src/src_processor_static_map_unittest-gmock-all.$(OBJEXT): \
src/processor/static_map_unittest$(EXEEXT): $(src_processor_static_map_unittest_OBJECTS) $(src_processor_static_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/static_map_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_static_map_unittest_OBJECTS) $(src_processor_static_map_unittest_LDADD) $(LIBS)
+src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.$(OBJEXT): \
+ src/processor/$(am__dirstamp) \
+ src/processor/$(DEPDIR)/$(am__dirstamp)
+src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.$(OBJEXT): \
+ src/testing/gtest/src/$(am__dirstamp) \
+ src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+src/testing/src/src_processor_static_range_map_unittest-gmock-all.$(OBJEXT): \
+ src/testing/src/$(am__dirstamp) \
+ src/testing/src/$(DEPDIR)/$(am__dirstamp)
+src/processor/static_range_map_unittest$(EXEEXT): $(src_processor_static_range_map_unittest_OBJECTS) $(src_processor_static_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
+ @rm -f src/processor/static_range_map_unittest$(EXEEXT)
+ $(CXXLINK) $(src_processor_static_range_map_unittest_OBJECTS) $(src_processor_static_range_map_unittest_LDADD) $(LIBS)
src/common/src_processor_synth_minidump_unittest-test_assembler.$(OBJEXT): \
src/common/$(am__dirstamp) \
src/common/$(DEPDIR)/$(am__dirstamp)
@@ -2511,6 +2706,7 @@ mostlyclean-compile:
-rm -f src/processor/src_processor_cfi_frame_info_unittest-cfi_frame_info_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_disassembler_x86_unittest-disassembler_x86_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_exploitability_unittest-exploitability_unittest.$(OBJEXT)
+ -rm -f src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_minidump_unittest-minidump_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_minidump_unittest-synth_minidump.$(OBJEXT)
@@ -2520,7 +2716,10 @@ mostlyclean-compile:
-rm -f src/processor/src_processor_stackwalker_amd64_unittest-stackwalker_amd64_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_stackwalker_arm_unittest-stackwalker_arm_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_stackwalker_x86_unittest-stackwalker_x86_unittest.$(OBJEXT)
+ -rm -f src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.$(OBJEXT)
+ -rm -f src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_static_map_unittest-static_map_unittest.$(OBJEXT)
+ -rm -f src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_synth_minidump_unittest-synth_minidump.$(OBJEXT)
-rm -f src/processor/src_processor_synth_minidump_unittest-synth_minidump_unittest.$(OBJEXT)
-rm -f src/processor/stackwalker.$(OBJEXT)
@@ -2544,6 +2743,7 @@ mostlyclean-compile:
-rm -f src/testing/gtest/src/src_processor_disassembler_x86_unittest-gtest_main.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_exploitability_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_exploitability_unittest-gtest_main.$(OBJEXT)
+ -rm -f src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_minidump_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_minidump_unittest-gtest_main.$(OBJEXT)
@@ -2556,7 +2756,10 @@ mostlyclean-compile:
-rm -f src/testing/gtest/src/src_processor_stackwalker_arm_unittest-gtest_main.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_stackwalker_x86_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_stackwalker_x86_unittest-gtest_main.$(OBJEXT)
+ -rm -f src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.$(OBJEXT)
+ -rm -f src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_static_map_unittest-gtest-all.$(OBJEXT)
+ -rm -f src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_synth_minidump_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_synth_minidump_unittest-gtest_main.$(OBJEXT)
-rm -f src/testing/src/src_client_linux_linux_client_unittest-gmock-all.$(OBJEXT)
@@ -2566,6 +2769,7 @@ mostlyclean-compile:
-rm -f src/testing/src/src_processor_cfi_frame_info_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_disassembler_x86_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_exploitability_unittest-gmock-all.$(OBJEXT)
+ -rm -f src/testing/src/src_processor_map_serializers_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_minidump_processor_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_minidump_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_network_source_line_resolver_server_unittest-gmock-all.$(OBJEXT)
@@ -2574,7 +2778,10 @@ mostlyclean-compile:
-rm -f src/testing/src/src_processor_stackwalker_amd64_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_stackwalker_arm_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_stackwalker_x86_unittest-gmock-all.$(OBJEXT)
+ -rm -f src/testing/src/src_processor_static_address_map_unittest-gmock-all.$(OBJEXT)
+ -rm -f src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_static_map_unittest-gmock-all.$(OBJEXT)
+ -rm -f src/testing/src/src_processor_static_range_map_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_synth_minidump_unittest-gmock-all.$(OBJEXT)
-rm -f src/third_party/libdisasm/ia32_implicit.$(OBJEXT)
-rm -f src/third_party/libdisasm/ia32_insn.$(OBJEXT)
@@ -2652,6 +2859,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_cfi_frame_info_unittest-cfi_frame_info_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_disassembler_x86_unittest-disassembler_x86_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_exploitability_unittest-exploitability_unittest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_map_serializers_unittest-map_serializers_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_minidump_processor_unittest-minidump_processor_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_minidump_unittest-minidump_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_minidump_unittest-synth_minidump.Po@am__quote@
@@ -2661,7 +2869,10 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_stackwalker_amd64_unittest-stackwalker_amd64_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_stackwalker_arm_unittest-stackwalker_arm_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_stackwalker_x86_unittest-stackwalker_x86_unittest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_static_address_map_unittest-static_address_map_unittest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_static_map_unittest-static_map_unittest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_static_range_map_unittest-static_range_map_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_synth_minidump_unittest-synth_minidump.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_synth_minidump_unittest-synth_minidump_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker.Po@am__quote@
@@ -2685,6 +2896,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_disassembler_x86_unittest-gtest_main.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_exploitability_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_exploitability_unittest-gtest_main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_map_serializers_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_unittest-gtest_main.Po@am__quote@
@@ -2697,7 +2909,10 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_stackwalker_arm_unittest-gtest_main.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_stackwalker_x86_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_stackwalker_x86_unittest-gtest_main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_static_address_map_unittest-gtest-all.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_static_contained_range_map_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_static_map_unittest-gtest-all.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_static_range_map_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_synth_minidump_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_synth_minidump_unittest-gtest_main.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_client_linux_linux_client_unittest-gmock-all.Po@am__quote@
@@ -2707,6 +2922,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_cfi_frame_info_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_disassembler_x86_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_exploitability_unittest-gmock-all.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_map_serializers_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_minidump_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gmock-all.Po@am__quote@
@@ -2715,7 +2931,10 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_stackwalker_amd64_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_stackwalker_arm_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_stackwalker_x86_unittest-gmock-all.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_static_address_map_unittest-gmock-all.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_static_contained_range_map_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_static_map_unittest-gmock-all.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_static_range_map_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_synth_minidump_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/ia32_implicit.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/ia32_insn.Po@am__quote@
@@ -3282,6 +3501,48 @@ src/testing/src/src_processor_exploitability_unittest-gmock-all.obj: src/testing
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_exploitability_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_exploitability_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
+src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.o: src/processor/map_serializers_unittest.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/src_processor_map_serializers_unittest-map_serializers_unittest.Tpo -c -o src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.o `test -f 'src/processor/map_serializers_unittest.cc' || echo '$(srcdir)/'`src/processor/map_serializers_unittest.cc
+@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_map_serializers_unittest-map_serializers_unittest.Tpo src/processor/$(DEPDIR)/src_processor_map_serializers_unittest-map_serializers_unittest.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/processor/map_serializers_unittest.cc' object='src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.o `test -f 'src/processor/map_serializers_unittest.cc' || echo '$(srcdir)/'`src/processor/map_serializers_unittest.cc
+
+src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.obj: src/processor/map_serializers_unittest.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/src_processor_map_serializers_unittest-map_serializers_unittest.Tpo -c -o src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.obj `if test -f 'src/processor/map_serializers_unittest.cc'; then $(CYGPATH_W) 'src/processor/map_serializers_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/map_serializers_unittest.cc'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_map_serializers_unittest-map_serializers_unittest.Tpo src/processor/$(DEPDIR)/src_processor_map_serializers_unittest-map_serializers_unittest.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/processor/map_serializers_unittest.cc' object='src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.obj `if test -f 'src/processor/map_serializers_unittest.cc'; then $(CYGPATH_W) 'src/processor/map_serializers_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/map_serializers_unittest.cc'; fi`
+
+src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.o: src/testing/gtest/src/gtest-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.o -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_map_serializers_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_map_serializers_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_map_serializers_unittest-gtest-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
+
+src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.obj: src/testing/gtest/src/gtest-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.obj -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_map_serializers_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_map_serializers_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_map_serializers_unittest-gtest-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
+
+src/testing/src/src_processor_map_serializers_unittest-gmock-all.o: src/testing/src/gmock-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_map_serializers_unittest-gmock-all.o -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_map_serializers_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_map_serializers_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/src/$(DEPDIR)/src_processor_map_serializers_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_map_serializers_unittest-gmock-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_map_serializers_unittest-gmock-all.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_map_serializers_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
+
+src/testing/src/src_processor_map_serializers_unittest-gmock-all.obj: src/testing/src/gmock-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_map_serializers_unittest-gmock-all.obj -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_map_serializers_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_map_serializers_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/src/$(DEPDIR)/src_processor_map_serializers_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_map_serializers_unittest-gmock-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_map_serializers_unittest-gmock-all.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_map_serializers_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
+
src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.o: src/processor/minidump_processor_unittest.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/src_processor_minidump_processor_unittest-minidump_processor_unittest.Tpo -c -o src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.o `test -f 'src/processor/minidump_processor_unittest.cc' || echo '$(srcdir)/'`src/processor/minidump_processor_unittest.cc
@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_minidump_processor_unittest-minidump_processor_unittest.Tpo src/processor/$(DEPDIR)/src_processor_minidump_processor_unittest-minidump_processor_unittest.Po
@@ -3744,6 +4005,90 @@ src/testing/src/src_processor_stackwalker_x86_unittest-gmock-all.obj: src/testin
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_x86_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_stackwalker_x86_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
+src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.o: src/processor/static_address_map_unittest.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/src_processor_static_address_map_unittest-static_address_map_unittest.Tpo -c -o src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.o `test -f 'src/processor/static_address_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_address_map_unittest.cc
+@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_static_address_map_unittest-static_address_map_unittest.Tpo src/processor/$(DEPDIR)/src_processor_static_address_map_unittest-static_address_map_unittest.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/processor/static_address_map_unittest.cc' object='src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.o `test -f 'src/processor/static_address_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_address_map_unittest.cc
+
+src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.obj: src/processor/static_address_map_unittest.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/src_processor_static_address_map_unittest-static_address_map_unittest.Tpo -c -o src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.obj `if test -f 'src/processor/static_address_map_unittest.cc'; then $(CYGPATH_W) 'src/processor/static_address_map_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/static_address_map_unittest.cc'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_static_address_map_unittest-static_address_map_unittest.Tpo src/processor/$(DEPDIR)/src_processor_static_address_map_unittest-static_address_map_unittest.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/processor/static_address_map_unittest.cc' object='src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.obj `if test -f 'src/processor/static_address_map_unittest.cc'; then $(CYGPATH_W) 'src/processor/static_address_map_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/static_address_map_unittest.cc'; fi`
+
+src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.o: src/testing/gtest/src/gtest-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.o -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_static_address_map_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_static_address_map_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_static_address_map_unittest-gtest-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
+
+src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.obj: src/testing/gtest/src/gtest-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.obj -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_static_address_map_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_static_address_map_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_static_address_map_unittest-gtest-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
+
+src/testing/src/src_processor_static_address_map_unittest-gmock-all.o: src/testing/src/gmock-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_static_address_map_unittest-gmock-all.o -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_static_address_map_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_static_address_map_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/src/$(DEPDIR)/src_processor_static_address_map_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_static_address_map_unittest-gmock-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_static_address_map_unittest-gmock-all.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_static_address_map_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
+
+src/testing/src/src_processor_static_address_map_unittest-gmock-all.obj: src/testing/src/gmock-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_static_address_map_unittest-gmock-all.obj -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_static_address_map_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_static_address_map_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/src/$(DEPDIR)/src_processor_static_address_map_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_static_address_map_unittest-gmock-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_static_address_map_unittest-gmock-all.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_static_address_map_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
+
+src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.o: src/processor/static_contained_range_map_unittest.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.Tpo -c -o src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.o `test -f 'src/processor/static_contained_range_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_contained_range_map_unittest.cc
+@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.Tpo src/processor/$(DEPDIR)/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/processor/static_contained_range_map_unittest.cc' object='src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.o `test -f 'src/processor/static_contained_range_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_contained_range_map_unittest.cc
+
+src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.obj: src/processor/static_contained_range_map_unittest.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.Tpo -c -o src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.obj `if test -f 'src/processor/static_contained_range_map_unittest.cc'; then $(CYGPATH_W) 'src/processor/static_contained_range_map_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/static_contained_range_map_unittest.cc'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.Tpo src/processor/$(DEPDIR)/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/processor/static_contained_range_map_unittest.cc' object='src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.obj `if test -f 'src/processor/static_contained_range_map_unittest.cc'; then $(CYGPATH_W) 'src/processor/static_contained_range_map_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/static_contained_range_map_unittest.cc'; fi`
+
+src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-all.o: src/testing/gtest/src/gtest-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-all.o -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_static_contained_range_map_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_static_contained_range_map_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_static_contained_range_map_unittest-gtest-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-all.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
+
+src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-all.obj: src/testing/gtest/src/gtest-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-all.obj -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_static_contained_range_map_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_static_contained_range_map_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_static_contained_range_map_unittest-gtest-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-all.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
+
+src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.o: src/testing/src/gmock-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.o -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_static_contained_range_map_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/src/$(DEPDIR)/src_processor_static_contained_range_map_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_static_contained_range_map_unittest-gmock-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
+
+src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.obj: src/testing/src/gmock-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.obj -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_static_contained_range_map_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/src/$(DEPDIR)/src_processor_static_contained_range_map_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_static_contained_range_map_unittest-gmock-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
+
src/processor/src_processor_static_map_unittest-static_map_unittest.o: src/processor/static_map_unittest.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_static_map_unittest-static_map_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/src_processor_static_map_unittest-static_map_unittest.Tpo -c -o src/processor/src_processor_static_map_unittest-static_map_unittest.o `test -f 'src/processor/static_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_map_unittest.cc
@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_static_map_unittest-static_map_unittest.Tpo src/processor/$(DEPDIR)/src_processor_static_map_unittest-static_map_unittest.Po
@@ -3786,6 +4131,48 @@ src/testing/src/src_processor_static_map_unittest-gmock-all.obj: src/testing/src
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_static_map_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
+src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.o: src/processor/static_range_map_unittest.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/src_processor_static_range_map_unittest-static_range_map_unittest.Tpo -c -o src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.o `test -f 'src/processor/static_range_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_range_map_unittest.cc
+@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_static_range_map_unittest-static_range_map_unittest.Tpo src/processor/$(DEPDIR)/src_processor_static_range_map_unittest-static_range_map_unittest.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/processor/static_range_map_unittest.cc' object='src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.o `test -f 'src/processor/static_range_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_range_map_unittest.cc
+
+src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.obj: src/processor/static_range_map_unittest.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/src_processor_static_range_map_unittest-static_range_map_unittest.Tpo -c -o src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.obj `if test -f 'src/processor/static_range_map_unittest.cc'; then $(CYGPATH_W) 'src/processor/static_range_map_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/static_range_map_unittest.cc'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_static_range_map_unittest-static_range_map_unittest.Tpo src/processor/$(DEPDIR)/src_processor_static_range_map_unittest-static_range_map_unittest.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/processor/static_range_map_unittest.cc' object='src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.obj `if test -f 'src/processor/static_range_map_unittest.cc'; then $(CYGPATH_W) 'src/processor/static_range_map_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/static_range_map_unittest.cc'; fi`
+
+src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.o: src/testing/gtest/src/gtest-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.o -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_static_range_map_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_static_range_map_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_static_range_map_unittest-gtest-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
+
+src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.obj: src/testing/gtest/src/gtest-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.obj -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_static_range_map_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_static_range_map_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_static_range_map_unittest-gtest-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
+
+src/testing/src/src_processor_static_range_map_unittest-gmock-all.o: src/testing/src/gmock-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_static_range_map_unittest-gmock-all.o -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_static_range_map_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_static_range_map_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/src/$(DEPDIR)/src_processor_static_range_map_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_static_range_map_unittest-gmock-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_static_range_map_unittest-gmock-all.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_static_range_map_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
+
+src/testing/src/src_processor_static_range_map_unittest-gmock-all.obj: src/testing/src/gmock-all.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_static_range_map_unittest-gmock-all.obj -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_static_range_map_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_static_range_map_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) src/testing/src/$(DEPDIR)/src_processor_static_range_map_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_static_range_map_unittest-gmock-all.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_static_range_map_unittest-gmock-all.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_static_range_map_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
+
src/common/src_processor_synth_minidump_unittest-test_assembler.o: src/common/test_assembler.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_synth_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/src_processor_synth_minidump_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/src_processor_synth_minidump_unittest-test_assembler.Tpo -c -o src/common/src_processor_synth_minidump_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc
@am__fastdepCXX_TRUE@ $(am__mv) src/common/$(DEPDIR)/src_processor_synth_minidump_unittest-test_assembler.Tpo src/common/$(DEPDIR)/src_processor_synth_minidump_unittest-test_assembler.Po
diff --git a/src/google_breakpad/processor/basic_source_line_resolver.h b/src/google_breakpad/processor/basic_source_line_resolver.h
index e6c13532..4019049d 100644
--- a/src/google_breakpad/processor/basic_source_line_resolver.h
+++ b/src/google_breakpad/processor/basic_source_line_resolver.h
@@ -64,6 +64,7 @@ class BasicSourceLineResolver : public SourceLineResolverBase {
private:
// friend declarations:
friend class BasicModuleFactory;
+ template<class> friend class SimpleSerializer;
// Function derives from SourceLineResolverBase::Function.
struct Function;
diff --git a/src/processor/address_map.h b/src/processor/address_map.h
index 14139e7a..1650882e 100644
--- a/src/processor/address_map.h
+++ b/src/processor/address_map.h
@@ -42,6 +42,9 @@
namespace google_breakpad {
+// Forward declarations (for later friend declarations).
+template<class, class> class AddressMapSerializer;
+
template<typename AddressType, typename EntryType>
class AddressMap {
public:
@@ -65,6 +68,8 @@ class AddressMap {
void Clear();
private:
+ friend class AddressMapSerializer<AddressType, EntryType>;
+
// Convenience types.
typedef std::map<AddressType, EntryType> AddressToEntryMap;
typedef typename AddressToEntryMap::const_iterator MapConstIterator;
@@ -77,4 +82,3 @@ class AddressMap {
} // namespace google_breakpad
#endif // PROCESSOR_ADDRESS_MAP_H__
-
diff --git a/src/processor/contained_range_map.h b/src/processor/contained_range_map.h
index f30016f3..dfc95484 100644
--- a/src/processor/contained_range_map.h
+++ b/src/processor/contained_range_map.h
@@ -66,6 +66,8 @@
namespace google_breakpad {
+// Forward declarations (for later friend declarations of specialized template).
+template<class, class> class ContainedRangeMapSerializer;
template<typename AddressType, typename EntryType>
class ContainedRangeMap {
@@ -103,6 +105,8 @@ class ContainedRangeMap {
void Clear();
private:
+ friend class ContainedRangeMapSerializer<AddressType, EntryType>;
+
// AddressToRangeMap stores pointers. This makes reparenting simpler in
// StoreRange, because it doesn't need to copy entire objects.
typedef std::map<AddressType, ContainedRangeMap *> AddressToRangeMap;
diff --git a/src/processor/map_serializers-inl.h b/src/processor/map_serializers-inl.h
new file mode 100644
index 00000000..760c52e3
--- /dev/null
+++ b/src/processor/map_serializers-inl.h
@@ -0,0 +1,268 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// map_serializers_inl.h: implementation for serializing std::map and its
+// wrapper classes.
+//
+// See map_serializers.h for documentation.
+//
+// Author: Siyang Xie (lambxsy@google.com)
+
+#ifndef PROCESSOR_MAP_SERIALIZERS_INL_H__
+#define PROCESSOR_MAP_SERIALIZERS_INL_H__
+
+#include <map>
+#include <string>
+
+#include "processor/map_serializers.h"
+#include "processor/simple_serializer.h"
+
+#include "processor/address_map-inl.h"
+#include "processor/range_map-inl.h"
+#include "processor/contained_range_map-inl.h"
+
+#include "processor/logging.h"
+
+namespace google_breakpad {
+
+template<typename Key, typename Value>
+size_t StdMapSerializer<Key, Value>::SizeOf(
+ const std::map<Key, Value> &m) const {
+ size_t size = 0;
+ size_t header_size = (1 + m.size()) * sizeof(u_int32_t);
+ size += header_size;
+
+ typename std::map<Key, Value>::const_iterator iter;
+ for (iter = m.begin(); iter != m.end(); ++iter) {
+ size += key_serializer_.SizeOf(iter->first);
+ size += value_serializer_.SizeOf(iter->second);
+ }
+ return size;
+}
+
+template<typename Key, typename Value>
+char *StdMapSerializer<Key, Value>::Write(const std::map<Key, Value> &m,
+ char *dest) const {
+ if (!dest) {
+ BPLOG(ERROR) << "StdMapSerializer failed: write to NULL address.";
+ return NULL;
+ }
+ char *start_address = dest;
+
+ // Write header:
+ // Number of nodes.
+ dest = SimpleSerializer<u_int32_t>::Write(m.size(), dest);
+ // Nodes offsets.
+ u_int32_t *offsets = reinterpret_cast<u_int32_t*>(dest);
+ dest += sizeof(u_int32_t) * m.size();
+
+ char *key_address = dest;
+ dest += sizeof(Key) * m.size();
+
+ // Traverse map.
+ typename std::map<Key, Value>::const_iterator iter;
+ int index = 0;
+ for (iter = m.begin(); iter != m.end(); ++iter, ++index) {
+ offsets[index] = static_cast<u_int32_t>(dest - start_address);
+ key_address = key_serializer_.Write(iter->first, key_address);
+ dest = value_serializer_.Write(iter->second, dest);
+ }
+ return dest;
+}
+
+template<typename Key, typename Value>
+char *StdMapSerializer<Key, Value>::Serialize(
+ const std::map<Key, Value> &m, unsigned int *size) const {
+ // Compute size of memory to be allocated.
+ unsigned int size_to_alloc = SizeOf(m);
+ // Allocate memory.
+ char *serialized_data =
+ reinterpret_cast<char*>(operator new(size_to_alloc));
+ if (!serialized_data) {
+ BPLOG(INFO) << "StdMapSerializer memory allocation failed.";
+ if (size) *size = 0;
+ return NULL;
+ }
+ // Write serialized data into memory.
+ Write(m, serialized_data);
+
+ if (size) *size = size_to_alloc;
+ return serialized_data;
+}
+
+template<typename Address, typename Entry>
+size_t RangeMapSerializer<Address, Entry>::SizeOf(
+ const RangeMap<Address, Entry> &m) const {
+ size_t size = 0;
+ size_t header_size = (1 + m.map_.size()) * sizeof(u_int32_t);
+ size += header_size;
+
+ typename std::map<Address, Range>::const_iterator iter;
+ for (iter = m.map_.begin(); iter != m.map_.end(); ++iter) {
+ // Size of key (high address).
+ size += address_serializer_.SizeOf(iter->first);
+ // Size of base (low address).
+ size += address_serializer_.SizeOf(iter->second.base());
+ // Size of entry.
+ size += entry_serializer_.SizeOf(iter->second.entry());
+ }
+ return size;
+}
+
+template<typename Address, typename Entry>
+char *RangeMapSerializer<Address, Entry>::Write(
+ const RangeMap<Address, Entry> &m, char *dest) const {
+ if (!dest) {
+ BPLOG(ERROR) << "RangeMapSerializer failed: write to NULL address.";
+ return NULL;
+ }
+ char *start_address = dest;
+
+ // Write header:
+ // Number of nodes.
+ dest = SimpleSerializer<u_int32_t>::Write(m.map_.size(), dest);
+ // Nodes offsets.
+ u_int32_t *offsets = reinterpret_cast<u_int32_t*>(dest);
+ dest += sizeof(u_int32_t) * m.map_.size();
+
+ char *key_address = dest;
+ dest += sizeof(Address) * m.map_.size();
+
+ // Traverse map.
+ typename std::map<Address, Range>::const_iterator iter;
+ int index = 0;
+ for (iter = m.map_.begin(); iter != m.map_.end(); ++iter, ++index) {
+ offsets[index] = static_cast<u_int32_t>(dest - start_address);
+ key_address = address_serializer_.Write(iter->first, key_address);
+ dest = address_serializer_.Write(iter->second.base(), dest);
+ dest = entry_serializer_.Write(iter->second.entry(), dest);
+ }
+ return dest;
+}
+
+template<typename Address, typename Entry>
+char *RangeMapSerializer<Address, Entry>::Serialize(
+ const RangeMap<Address, Entry> &m, unsigned int *size) const {
+ // Compute size of memory to be allocated.
+ unsigned int size_to_alloc = SizeOf(m);
+ // Allocate memory.
+ char *serialized_data =
+ reinterpret_cast<char*>(operator new(size_to_alloc));
+ if (!serialized_data) {
+ BPLOG(INFO) << "RangeMapSerializer memory allocation failed.";
+ if (size) *size = 0;
+ return NULL;
+ }
+
+ // Write serialized data into memory.
+ Write(m, serialized_data);
+
+ if (size) *size = size_to_alloc;
+ return serialized_data;
+}
+
+
+template<class AddrType, class EntryType>
+size_t ContainedRangeMapSerializer<AddrType, EntryType>::SizeOf(
+ const ContainedRangeMap<AddrType, EntryType> *m) const {
+ size_t size = 0;
+ size_t header_size = addr_serializer_.SizeOf(m->base_)
+ + entry_serializer_.SizeOf(m->entry_)
+ + sizeof(u_int32_t);
+ size += header_size;
+ // In case m.map_ == NULL, we treat it as an empty map:
+ size += sizeof(u_int32_t);
+ if (m->map_) {
+ size += m->map_->size() * sizeof(u_int32_t);
+ typename Map::const_iterator iter;
+ for (iter = m->map_->begin(); iter != m->map_->end(); ++iter) {
+ size += addr_serializer_.SizeOf(iter->first);
+ // Recursive calculation of size:
+ size += SizeOf(iter->second);
+ }
+ }
+ return size;
+}
+
+template<class AddrType, class EntryType>
+char *ContainedRangeMapSerializer<AddrType, EntryType>::Write(
+ const ContainedRangeMap<AddrType, EntryType> *m, char *dest) const {
+ if (!dest) {
+ BPLOG(ERROR) << "StdMapSerializer failed: write to NULL address.";
+ return NULL;
+ }
+ dest = addr_serializer_.Write(m->base_, dest);
+ dest = SimpleSerializer<u_int32_t>::Write(entry_serializer_.SizeOf(m->entry_),
+ dest);
+ dest = entry_serializer_.Write(m->entry_, dest);
+
+ // Write map<<AddrType, ContainedRangeMap*>:
+ char *map_address = dest;
+ if (m->map_ == NULL) {
+ dest = SimpleSerializer<u_int32_t>::Write(0, dest);
+ } else {
+ dest = SimpleSerializer<u_int32_t>::Write(m->map_->size(), dest);
+ u_int32_t *offsets = reinterpret_cast<u_int32_t*>(dest);
+ dest += sizeof(u_int32_t) * m->map_->size();
+
+ char *key_address = dest;
+ dest += sizeof(AddrType) * m->map_->size();
+
+ // Traverse map.
+ typename Map::const_iterator iter;
+ int index = 0;
+ for (iter = m->map_->begin(); iter != m->map_->end(); ++iter, ++index) {
+ offsets[index] = static_cast<u_int32_t>(dest - map_address);
+ key_address = addr_serializer_.Write(iter->first, key_address);
+ // Recursively write.
+ dest = Write(iter->second, dest);
+ }
+ }
+ return dest;
+}
+
+template<class AddrType, class EntryType>
+char *ContainedRangeMapSerializer<AddrType, EntryType>::Serialize(
+ const ContainedRangeMap<AddrType, EntryType> *m, unsigned int *size) const {
+ unsigned int size_to_alloc = SizeOf(m);
+ // Allocating memory.
+ char *serialized_data = reinterpret_cast<char*>(operator new(size_to_alloc));
+ if (!serialized_data) {
+ BPLOG(INFO) << "ContainedRangeMapSerializer memory allocation failed.";
+ if (size) *size = 0;
+ return NULL;
+ }
+ Write(m, serialized_data);
+ if (size) *size = size_to_alloc;
+ return serialized_data;
+}
+
+} // namespace google_breakpad
+
+#endif // PROCESSOR_MAP_SERIALIZERS_INL_H__
diff --git a/src/processor/map_serializers.h b/src/processor/map_serializers.h
new file mode 100644
index 00000000..9c68e3f7
--- /dev/null
+++ b/src/processor/map_serializers.h
@@ -0,0 +1,164 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// map_serializers.h: defines templates for serializing std::map and its
+// wrappers: AddressMap, RangeMap, and ContainedRangeMap.
+//
+// Author: Siyang Xie (lambxsy@google.com)
+
+
+#ifndef PROCESSOR_MAP_SERIALIZERS_H__
+#define PROCESSOR_MAP_SERIALIZERS_H__
+
+#include <map>
+#include <string>
+
+#include "processor/simple_serializer.h"
+
+#include "processor/address_map-inl.h"
+#include "processor/range_map-inl.h"
+#include "processor/contained_range_map-inl.h"
+
+namespace google_breakpad {
+
+// StdMapSerializer allocates memory and serializes an std::map instance into a
+// chunk of memory data.
+template<typename Key, typename Value>
+class StdMapSerializer {
+ public:
+ // Calculate the memory size of serialized data.
+ size_t SizeOf(const std::map<Key, Value> &m) const;
+
+ // Writes the serialized data to memory with start address = dest,
+ // and returns the "end" of data, i.e., return the address follow the final
+ // byte of data.
+ // NOTE: caller has to allocate enough memory before invoke Write() method.
+ char* Write(const std::map<Key, Value> &m, char* dest) const;
+
+ // Serializes a std::map object into a chunk of memory data with format
+ // described in "StaticMap.h" comment.
+ // Returns a pointer to the serialized data. If size != NULL, *size is set
+ // to the size of serialized data, i.e., SizeOf(m).
+ char* Serialize(const std::map<Key, Value> &m, unsigned int *size) const;
+
+ private:
+ SimpleSerializer<Key> key_serializer_;
+ SimpleSerializer<Value> value_serializer_;
+};
+
+// AddressMapSerializer allocates memory and serializes an AddressMap into a
+// chunk of memory data.
+template<typename Addr, typename Entry>
+class AddressMapSerializer {
+ public:
+ // Calculate the memory size of serialized data.
+ size_t SizeOf(const AddressMap<Addr, Entry> &m) const {
+ return std_map_serializer_.SizeOf(m.map_);
+ }
+
+ // Write the serialized data to specified memory location. Return the "end"
+ // of data, i.e., return the address after the final byte of data.
+ // NOTE: caller has to allocate enough memory before invoke Write() method.
+ char* Write(const AddressMap<Addr, Entry> &m, char *dest) const {
+ return std_map_serializer_.Write(m.map_, dest);
+ }
+
+ // Serializes an AddressMap object into a chunk of memory data.
+ // Returns a pointer to the serialized data. If size != NULL, *size is set
+ // to the size of serialized data, i.e., SizeOf(m).
+ char* Serialize(const AddressMap<Addr, Entry> &m, unsigned int *size) const {
+ return std_map_serializer_.Serialize(m.map_, size);
+ }
+
+ private:
+ // AddressMapSerializer is a simple wrapper of StdMapSerializer, just as
+ // AddressMap is a simple wrapper of std::map.
+ StdMapSerializer<Addr, Entry> std_map_serializer_;
+};
+
+// RangeMapSerializer allocates memory and serializes a RangeMap instance into a
+// chunk of memory data.
+template<typename Address, typename Entry>
+class RangeMapSerializer {
+ public:
+ // Calculate the memory size of serialized data.
+ size_t SizeOf(const RangeMap<Address, Entry> &m) const;
+
+ // Write the serialized data to specified memory location. Return the "end"
+ // of data, i.e., return the address after the final byte of data.
+ // NOTE: caller has to allocate enough memory before invoke Write() method.
+ char* Write(const RangeMap<Address, Entry> &m, char* dest) const;
+
+ // Serializes a RangeMap object into a chunk of memory data.
+ // Returns a pointer to the serialized data. If size != NULL, *size is set
+ // to the size of serialized data, i.e., SizeOf(m).
+ char* Serialize(const RangeMap<Address, Entry> &m, unsigned int *size) const;
+
+ private:
+ // Convenient type name for Range.
+ typedef typename RangeMap<Address, Entry>::Range Range;
+
+ // Serializer for RangeMap's key and Range::base_.
+ SimpleSerializer<Address> address_serializer_;
+ // Serializer for RangeMap::Range::entry_.
+ SimpleSerializer<Entry> entry_serializer_;
+};
+
+// ContainedRangeMapSerializer allocates memory and serializes a
+// ContainedRangeMap instance into a chunk of memory data.
+template<class AddrType, class EntryType>
+class ContainedRangeMapSerializer {
+ public:
+ // Calculate the memory size of serialized data.
+ size_t SizeOf(const ContainedRangeMap<AddrType, EntryType> *m) const;
+
+ // Write the serialized data to specified memory location. Return the "end"
+ // of data, i.e., return the address after the final byte of data.
+ // NOTE: caller has to allocate enough memory before invoke Write() method.
+ char* Write(const ContainedRangeMap<AddrType, EntryType> *m,
+ char* dest) const;
+
+ // Serializes a ContainedRangeMap object into a chunk of memory data.
+ // Returns a pointer to the serialized data. If size != NULL, *size is set
+ // to the size of serialized data, i.e., SizeOf(m).
+ char* Serialize(const ContainedRangeMap<AddrType, EntryType> *m,
+ unsigned int *size) const;
+
+ private:
+ // Convenient type name for the underlying map type.
+ typedef std::map<AddrType, ContainedRangeMap<AddrType, EntryType>*> Map;
+
+ // Serializer for addresses and entries stored in ContainedRangeMap.
+ SimpleSerializer<AddrType> addr_serializer_;
+ SimpleSerializer<EntryType> entry_serializer_;
+};
+
+} // namespace google_breakpad
+
+#endif // PROCESSOR_MAP_SERIALIZERS_H__
diff --git a/src/processor/map_serializers_unittest.cc b/src/processor/map_serializers_unittest.cc
new file mode 100644
index 00000000..b1e3f868
--- /dev/null
+++ b/src/processor/map_serializers_unittest.cc
@@ -0,0 +1,388 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// map_serializers_unittest.cc: Unit tests for std::map serializer and
+// std::map wrapper serializers.
+//
+// Author: Siyang Xie (lambxsy@google.com)
+
+#include <climits>
+#include <map>
+#include <string>
+#include <utility>
+#include <iostream>
+#include <sstream>
+
+#include "breakpad_googletest_includes.h"
+#include "map_serializers-inl.h"
+
+#include "processor/address_map-inl.h"
+#include "processor/range_map-inl.h"
+#include "processor/contained_range_map-inl.h"
+
+typedef int32_t AddrType;
+typedef int32_t EntryType;
+
+const int kSizeOfInt = 4;
+
+class TestStdMapSerializer : public ::testing::Test {
+ protected:
+ void SetUp() {
+ serialized_size_ = 0;
+ serialized_data_ = NULL;
+ }
+
+ void TearDown() {
+ delete serialized_data_;
+ }
+
+ std::map<AddrType, EntryType> std_map_;
+ google_breakpad::StdMapSerializer<AddrType, EntryType> serializer_;
+ u_int32_t serialized_size_;
+ char *serialized_data_;
+};
+
+TEST_F(TestStdMapSerializer, EmptyMapTestCase) {
+ const int32_t correct_data[] = { 0 };
+ u_int32_t correct_size = sizeof(correct_data);
+
+ // std_map_ is empty.
+ serialized_data_ = serializer_.Serialize(std_map_, &serialized_size_);
+
+ EXPECT_EQ(correct_size, serialized_size_);
+ EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
+}
+
+TEST_F(TestStdMapSerializer, MapWithTwoElementsTestCase) {
+ const int32_t correct_data[] = {
+ // # of nodes
+ 2,
+ // Offsets
+ 20, 24,
+ // Keys
+ 1, 3,
+ // Values
+ 2, 6
+ };
+ u_int32_t correct_size = sizeof(correct_data);
+
+ std_map_.insert(std::make_pair(1, 2));
+ std_map_.insert(std::make_pair(3, 6));
+
+ serialized_data_ = serializer_.Serialize(std_map_, &serialized_size_);
+
+ EXPECT_EQ(correct_size, serialized_size_);
+ EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
+}
+
+TEST_F(TestStdMapSerializer, MapWithFiveElementsTestCase) {
+ const int32_t correct_data[] = {
+ // # of nodes
+ 5,
+ // Offsets
+ 44, 48, 52, 56, 60,
+ // Keys
+ 1, 2, 3, 4, 5,
+ // Values
+ 11, 12, 13, 14, 15
+ };
+ u_int32_t correct_size = sizeof(correct_data);
+
+ for (int i = 1; i < 6; ++i)
+ std_map_.insert(std::make_pair(i, 10 + i));
+
+ serialized_data_ = serializer_.Serialize(std_map_, &serialized_size_);
+
+ EXPECT_EQ(correct_size, serialized_size_);
+ EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
+}
+
+class TestAddressMapSerializer : public ::testing::Test {
+ protected:
+ void SetUp() {
+ serialized_size_ = 0;
+ serialized_data_ = 0;
+ }
+
+ void TearDown() {
+ delete serialized_data_;
+ }
+
+ google_breakpad::AddressMap<AddrType, EntryType> address_map_;
+ google_breakpad::AddressMapSerializer<AddrType, EntryType> serializer_;
+ u_int32_t serialized_size_;
+ char *serialized_data_;
+};
+
+TEST_F(TestAddressMapSerializer, EmptyMapTestCase) {
+ const int32_t correct_data[] = { 0 };
+ u_int32_t correct_size = sizeof(correct_data);
+
+ // std_map_ is empty.
+ serialized_data_ = serializer_.Serialize(address_map_, &serialized_size_);
+
+ EXPECT_EQ(correct_size, serialized_size_);
+ EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
+}
+
+TEST_F(TestAddressMapSerializer, MapWithTwoElementsTestCase) {
+ const int32_t correct_data[] = {
+ // # of nodes
+ 2,
+ // Offsets
+ 20, 24,
+ // Keys
+ 1, 3,
+ // Values
+ 2, 6
+ };
+ u_int32_t correct_size = sizeof(correct_data);
+
+ address_map_.Store(1, 2);
+ address_map_.Store(3, 6);
+
+ serialized_data_ = serializer_.Serialize(address_map_, &serialized_size_);
+
+ EXPECT_EQ(correct_size, serialized_size_);
+ EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
+}
+
+TEST_F(TestAddressMapSerializer, MapWithFourElementsTestCase) {
+ const int32_t correct_data[] = {
+ // # of nodes
+ 4,
+ // Offsets
+ 36, 40, 44, 48,
+ // Keys
+ -6, -4, 8, 123,
+ // Values
+ 2, 3, 5, 8
+ };
+ u_int32_t correct_size = sizeof(correct_data);
+
+ address_map_.Store(-6, 2);
+ address_map_.Store(-4, 3);
+ address_map_.Store(8, 5);
+ address_map_.Store(123, 8);
+
+ serialized_data_ = serializer_.Serialize(address_map_, &serialized_size_);
+
+ EXPECT_EQ(correct_size, serialized_size_);
+ EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
+}
+
+
+class TestRangeMapSerializer : public ::testing::Test {
+ protected:
+ void SetUp() {
+ serialized_size_ = 0;
+ serialized_data_ = 0;
+ }
+
+ void TearDown() {
+ delete serialized_data_;
+ }
+
+ google_breakpad::RangeMap<AddrType, EntryType> range_map_;
+ google_breakpad::RangeMapSerializer<AddrType, EntryType> serializer_;
+ u_int32_t serialized_size_;
+ char *serialized_data_;
+};
+
+TEST_F(TestRangeMapSerializer, EmptyMapTestCase) {
+ const int32_t correct_data[] = { 0 };
+ u_int32_t correct_size = sizeof(correct_data);
+
+ // range_map_ is empty.
+ serialized_data_ = serializer_.Serialize(range_map_, &serialized_size_);
+
+ EXPECT_EQ(correct_size, serialized_size_);
+ EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
+}
+
+TEST_F(TestRangeMapSerializer, MapWithOneRangeTestCase) {
+ const int32_t correct_data[] = {
+ // # of nodes
+ 1,
+ // Offsets
+ 12,
+ // Keys: high address
+ 10,
+ // Values: (low address, entry) pairs
+ 1, 6
+ };
+ u_int32_t correct_size = sizeof(correct_data);
+
+ range_map_.StoreRange(1, 10, 6);
+
+ serialized_data_ = serializer_.Serialize(range_map_, &serialized_size_);
+
+ EXPECT_EQ(correct_size, serialized_size_);
+ EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
+}
+
+TEST_F(TestRangeMapSerializer, MapWithThreeRangesTestCase) {
+ const int32_t correct_data[] = {
+ // # of nodes
+ 3,
+ // Offsets
+ 28, 36, 44,
+ // Keys: high address
+ 5, 9, 20,
+ // Values: (low address, entry) pairs
+ 2, 1, 6, 2, 10, 3
+ };
+ u_int32_t correct_size = sizeof(correct_data);
+
+ ASSERT_TRUE(range_map_.StoreRange(2, 4, 1));
+ ASSERT_TRUE(range_map_.StoreRange(6, 4, 2));
+ ASSERT_TRUE(range_map_.StoreRange(10, 11, 3));
+
+ serialized_data_ = serializer_.Serialize(range_map_, &serialized_size_);
+
+ EXPECT_EQ(correct_size, serialized_size_);
+ EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
+}
+
+
+class TestContainedRangeMapSerializer : public ::testing::Test {
+ protected:
+ void SetUp() {
+ serialized_size_ = 0;
+ serialized_data_ = 0;
+ }
+
+ void TearDown() {
+ delete serialized_data_;
+ }
+
+ google_breakpad::ContainedRangeMap<AddrType, EntryType> crm_map_;
+ google_breakpad::ContainedRangeMapSerializer<AddrType, EntryType> serializer_;
+ u_int32_t serialized_size_;
+ char *serialized_data_;
+};
+
+TEST_F(TestContainedRangeMapSerializer, EmptyMapTestCase) {
+ const int32_t correct_data[] = {
+ 0, // base address of root
+ 4, // size of entry
+ 0, // entry stored at root
+ 0 // empty map stored at root
+ };
+ u_int32_t correct_size = sizeof(correct_data);
+
+ // crm_map_ is empty.
+ serialized_data_ = serializer_.Serialize(&crm_map_, &serialized_size_);
+
+ EXPECT_EQ(correct_size, serialized_size_);
+ EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
+}
+
+TEST_F(TestContainedRangeMapSerializer, MapWithOneRangeTestCase) {
+ const int32_t correct_data[] = {
+ 0, // base address of root
+ 4, // size of entry
+ 0, // entry stored at root
+ // Map stored at root node:
+ 1, // # of nodes
+ 12, // offset
+ 9, // key
+ // value: a child ContainedRangeMap
+ 3, // base address of child CRM
+ 4, // size of entry
+ -1, // entry stored in child CRM
+ 0 // empty sub-map stored in child CRM
+ };
+ u_int32_t correct_size = sizeof(correct_data);
+
+ crm_map_.StoreRange(3, 7, -1);
+
+ serialized_data_ = serializer_.Serialize(&crm_map_, &serialized_size_);
+
+ EXPECT_EQ(correct_size, serialized_size_);
+ EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
+}
+
+TEST_F(TestContainedRangeMapSerializer, MapWithTwoLevelsTestCase) {
+ // Tree structure of ranges:
+ // root level 0
+ // |
+ // map
+ // / \ level 1: child1, child2
+ // 2~8 10~20
+ // | |
+ // map map
+ // / \ |
+ // 3~4 6~7 16-20 level 2: grandchild1, grandchild2, grandchild3
+
+ const int32_t correct_data[] = {
+ // root: base, entry_size, entry
+ 0, 4, 0,
+ // root's map: # of nodes, offset1, offset2, key1, key2
+ 2, 20, 84, 8, 20,
+ // child1: base, entry_size, entry:
+ 2, 4, -1,
+ // child1's map: # of nodes, offset1, offset2, key1, key2
+ 2, 20, 36, 4, 7,
+ // grandchild1: base, entry_size, entry, empty_map
+ 3, 4, -1, 0,
+ // grandchild2: base, entry_size, entry, empty_map
+ 6, 4, -1, 0,
+ // child2: base, entry_size, entry:
+ 10, 4, -1,
+ // child2's map: # of nodes, offset1, key1
+ 1, 12, 20,
+ // grandchild3: base, entry_size, entry, empty_map
+ 16, 4, -1, 0
+ };
+ u_int32_t correct_size = sizeof(correct_data);
+
+ // Store child1.
+ ASSERT_TRUE(crm_map_.StoreRange(2, 7, -1));
+ // Store child2.
+ ASSERT_TRUE(crm_map_.StoreRange(10, 11, -1));
+ // Store grandchild1.
+ ASSERT_TRUE(crm_map_.StoreRange(3, 2, -1));
+ // Store grandchild2.
+ ASSERT_TRUE(crm_map_.StoreRange(6, 2, -1));
+ // Store grandchild3.
+ ASSERT_TRUE(crm_map_.StoreRange(16, 5, -1));
+
+ serialized_data_ = serializer_.Serialize(&crm_map_, &serialized_size_);
+
+ EXPECT_EQ(correct_size, serialized_size_);
+ EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
+}
+
+
+int main(int argc, char *argv[]) {
+ ::testing::InitGoogleTest(&argc, argv);
+
+ return RUN_ALL_TESTS();
+}
diff --git a/src/processor/module_factory.h b/src/processor/module_factory.h
index 6065493d..e0e528e5 100644
--- a/src/processor/module_factory.h
+++ b/src/processor/module_factory.h
@@ -44,15 +44,15 @@ namespace google_breakpad {
class ModuleFactory {
public:
virtual ~ModuleFactory() { };
- virtual SourceLineResolverBase::Module*
- CreateModule(const string &name) const = 0;
+ virtual SourceLineResolverBase::Module* CreateModule(
+ const string &name) const = 0;
};
class BasicModuleFactory : public ModuleFactory {
public:
virtual ~BasicModuleFactory() { }
- virtual BasicSourceLineResolver::Module*
- CreateModule(const string &name) const {
+ virtual BasicSourceLineResolver::Module* CreateModule(
+ const string &name) const {
return new BasicSourceLineResolver::Module(name);
}
};
diff --git a/src/processor/range_map.h b/src/processor/range_map.h
index a7b67412..bf6dee17 100644
--- a/src/processor/range_map.h
+++ b/src/processor/range_map.h
@@ -46,6 +46,8 @@
namespace google_breakpad {
+// Forward declarations (for later friend declarations of specialized template).
+template<class, class> class RangeMapSerializer;
template<typename AddressType, typename EntryType>
class RangeMap {
@@ -93,6 +95,9 @@ class RangeMap {
void Clear();
private:
+ // Friend declarations.
+ friend class RangeMapSerializer<AddressType, EntryType>;
+
class Range {
public:
Range(const AddressType &base, const EntryType &entry)
diff --git a/src/processor/simple_serializer-inl.h b/src/processor/simple_serializer-inl.h
new file mode 100644
index 00000000..a6f54961
--- /dev/null
+++ b/src/processor/simple_serializer-inl.h
@@ -0,0 +1,252 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// simple_serializer-inl.h: template specializations for following types:
+// bool, const char *(C-string), string,
+// Line, Function, PublicSymbol, WindowsFrameInfo and their linked pointers.
+//
+// See simple_serializer.h for moredocumentation.
+//
+// Author: Siyang Xie (lambxsy@google.com)
+
+#ifndef PROCESSOR_SIMPLE_SERIALIZER_INL_H__
+#define PROCESSOR_SIMPLE_SERIALIZER_INL_H__
+
+#include <string>
+
+#include "processor/simple_serializer.h"
+#include "map_serializers-inl.h"
+
+#include "google_breakpad/processor/basic_source_line_resolver.h"
+#include "processor/basic_source_line_resolver_types.h"
+#include "processor/linked_ptr.h"
+#include "processor/windows_frame_info.h"
+
+namespace google_breakpad {
+
+// Specializations of SimpleSerializer: bool
+template<>
+class SimpleSerializer<bool> {
+ public:
+ static size_t SizeOf(bool boolean) { return 1; }
+
+ static char *Write(bool boolean, char *dest) {
+ *dest = static_cast<char>(boolean? 255 : 0);
+ return ++dest;
+ }
+};
+
+// Specializations of SimpleSerializer: string
+template<>
+class SimpleSerializer<string> {
+ public:
+ static size_t SizeOf(const string &str) { return str.size() + 1; }
+
+ static char *Write(const string &str, char *dest) {
+ strcpy(dest, str.c_str());
+ return dest + SizeOf(str);
+ }
+};
+
+// Specializations of SimpleSerializer: C-string
+template<>
+class SimpleSerializer<const char*> {
+ public:
+ static size_t SizeOf(const char *cstring) {
+ return strlen(cstring) + 1;
+ }
+
+ static char *Write(const char *cstring, char *dest) {
+ strcpy(dest, cstring);
+ return dest + SizeOf(cstring);
+ }
+};
+
+// Specializations of SimpleSerializer: Line
+template<>
+class SimpleSerializer<BasicSourceLineResolver::Line> {
+ typedef BasicSourceLineResolver::Line Line;
+ public:
+ static size_t SizeOf(const Line &line) {
+ return SimpleSerializer<MemAddr>::SizeOf(line.address)
+ + SimpleSerializer<MemAddr>::SizeOf(line.size)
+ + SimpleSerializer<int32_t>::SizeOf(line.source_file_id)
+ + SimpleSerializer<int32_t>::SizeOf(line.line);
+ }
+ static char *Write(const Line &line, char *dest) {
+ dest = SimpleSerializer<MemAddr>::Write(line.address, dest);
+ dest = SimpleSerializer<MemAddr>::Write(line.size, dest);
+ dest = SimpleSerializer<int32_t>::Write(line.source_file_id, dest);
+ dest = SimpleSerializer<int32_t>::Write(line.line, dest);
+ return dest;
+ }
+};
+
+// Specializations of SimpleSerializer: PublicSymbol
+template<>
+class SimpleSerializer<BasicSourceLineResolver::PublicSymbol> {
+ typedef BasicSourceLineResolver::PublicSymbol PublicSymbol;
+ public:
+ static size_t SizeOf(const PublicSymbol &pubsymbol) {
+ return SimpleSerializer<string>::SizeOf(pubsymbol.name)
+ + SimpleSerializer<MemAddr>::SizeOf(pubsymbol.address)
+ + SimpleSerializer<int32_t>::SizeOf(pubsymbol.parameter_size);
+ }
+ static char *Write(const PublicSymbol &pubsymbol, char *dest) {
+ dest = SimpleSerializer<string>::Write(pubsymbol.name, dest);
+ dest = SimpleSerializer<MemAddr>::Write(pubsymbol.address, dest);
+ dest = SimpleSerializer<int32_t>::Write(pubsymbol.parameter_size, dest);
+ return dest;
+ }
+};
+
+// Specializations of SimpleSerializer: WindowsFrameInfo
+template<>
+class SimpleSerializer<WindowsFrameInfo> {
+ public:
+ static size_t SizeOf(const WindowsFrameInfo &wfi) {
+ unsigned int size = 0;
+ size += SimpleSerializer<int32_t>::SizeOf(wfi.valid);
+ size += SimpleSerializer<u_int32_t>::SizeOf(wfi.prolog_size);
+ size += SimpleSerializer<u_int32_t>::SizeOf(wfi.epilog_size);
+ size += SimpleSerializer<u_int32_t>::SizeOf(wfi.parameter_size);
+ size += SimpleSerializer<u_int32_t>::SizeOf(wfi.saved_register_size);
+ size += SimpleSerializer<u_int32_t>::SizeOf(wfi.local_size);
+ size += SimpleSerializer<u_int32_t>::SizeOf(wfi.max_stack_size);
+ size += SimpleSerializer<bool>::SizeOf(wfi.allocates_base_pointer);
+ size += SimpleSerializer<string>::SizeOf(wfi.program_string);
+ return size;
+ }
+ static char *Write(const WindowsFrameInfo &wfi, char *dest) {
+ dest = SimpleSerializer<int32_t>::Write(wfi.valid, dest);
+ dest = SimpleSerializer<u_int32_t>::Write(wfi.prolog_size, dest);
+ dest = SimpleSerializer<u_int32_t>::Write(wfi.epilog_size, dest);
+ dest = SimpleSerializer<u_int32_t>::Write(wfi.parameter_size, dest);
+ dest = SimpleSerializer<u_int32_t>::Write(wfi.saved_register_size, dest);
+ dest = SimpleSerializer<u_int32_t>::Write(wfi.local_size, dest);
+ dest = SimpleSerializer<u_int32_t>::Write(wfi.max_stack_size, dest);
+ dest = SimpleSerializer<bool>::Write(wfi.allocates_base_pointer, dest);
+ return SimpleSerializer<string>::Write(wfi.program_string, dest);
+ }
+};
+
+// Specializations of SimpleSerializer: Linked_ptr version of
+// Line, Function, PublicSymbol, WindowsFrameInfo.
+template<>
+class SimpleSerializer< linked_ptr<BasicSourceLineResolver::Line> > {
+ typedef BasicSourceLineResolver::Line Line;
+ public:
+ static size_t SizeOf(const linked_ptr<Line> &lineptr) {
+ if (lineptr.get() == NULL) return 0;
+ return SimpleSerializer<Line>::SizeOf(*(lineptr.get()));
+ }
+ static char *Write(const linked_ptr<Line> &lineptr, char *dest) {
+ if (lineptr.get())
+ dest = SimpleSerializer<Line>::Write(*(lineptr.get()), dest);
+ return dest;
+ }
+};
+
+template<>
+class SimpleSerializer<BasicSourceLineResolver::Function> {
+ // Convenient type names.
+ typedef BasicSourceLineResolver::Function Function;
+ typedef BasicSourceLineResolver::Line Line;
+ public:
+ static size_t SizeOf(const Function &func) {
+ unsigned int size = 0;
+ size += SimpleSerializer<string>::SizeOf(func.name);
+ size += SimpleSerializer<MemAddr>::SizeOf(func.address);
+ size += SimpleSerializer<MemAddr>::SizeOf(func.size);
+ size += SimpleSerializer<int32_t>::SizeOf(func.parameter_size);
+ size += range_map_serializer_.SizeOf(func.lines);
+ return size;
+ }
+
+ static char *Write(const Function &func, char *dest) {
+ dest = SimpleSerializer<string>::Write(func.name, dest);
+ dest = SimpleSerializer<MemAddr>::Write(func.address, dest);
+ dest = SimpleSerializer<MemAddr>::Write(func.size, dest);
+ dest = SimpleSerializer<int32_t>::Write(func.parameter_size, dest);
+ dest = range_map_serializer_.Write(func.lines, dest);
+ return dest;
+ }
+ private:
+ // This static member is defined in module_serializer.cc.
+ static RangeMapSerializer< MemAddr, linked_ptr<Line> > range_map_serializer_;
+};
+
+template<>
+class SimpleSerializer< linked_ptr<BasicSourceLineResolver::Function> > {
+ typedef BasicSourceLineResolver::Function Function;
+ public:
+ static size_t SizeOf(const linked_ptr<Function> &func) {
+ if (!func.get()) return 0;
+ return SimpleSerializer<Function>::SizeOf(*(func.get()));
+ }
+
+ static char *Write(const linked_ptr<Function> &func, char *dest) {
+ if (func.get())
+ dest = SimpleSerializer<Function>::Write(*(func.get()), dest);
+ return dest;
+ }
+};
+
+template<>
+class SimpleSerializer< linked_ptr<BasicSourceLineResolver::PublicSymbol> > {
+ typedef BasicSourceLineResolver::PublicSymbol PublicSymbol;
+ public:
+ static size_t SizeOf(const linked_ptr<PublicSymbol> &pubsymbol) {
+ if (pubsymbol.get() == NULL) return 0;
+ return SimpleSerializer<PublicSymbol>::SizeOf(*(pubsymbol.get()));
+ }
+ static char *Write(const linked_ptr<PublicSymbol> &pubsymbol, char *dest) {
+ if (pubsymbol.get())
+ dest = SimpleSerializer<PublicSymbol>::Write(*(pubsymbol.get()), dest);
+ return dest;
+ }
+};
+
+template<>
+class SimpleSerializer< linked_ptr<WindowsFrameInfo> > {
+ public:
+ static size_t SizeOf(const linked_ptr<WindowsFrameInfo> &wfi) {
+ if (wfi.get() == NULL) return 0;
+ return SimpleSerializer<WindowsFrameInfo>::SizeOf(*(wfi.get()));
+ }
+ static char *Write(const linked_ptr<WindowsFrameInfo> &wfi, char *dest) {
+ if (wfi.get())
+ dest = SimpleSerializer<WindowsFrameInfo>::Write(*(wfi.get()), dest);
+ return dest;
+ }
+};
+
+} // namespace google_breakpad
+
+#endif // PROCESSOR_SIMPLE_SERIALIZER_INL_H__
diff --git a/src/processor/simple_serializer.h b/src/processor/simple_serializer.h
new file mode 100644
index 00000000..a1ca4f30
--- /dev/null
+++ b/src/processor/simple_serializer.h
@@ -0,0 +1,63 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// simple_serializer.h: SimpleSerializer is a template for calculating size and
+// writing to specific memory location for objects of primitive types, C-style
+// string, string, breakpad types/structs etc.
+// All specializations of SimpleSerializer template are defined in the
+// "simple_serializer-inl.h" file.
+//
+// Author: Siyang Xie (lambxsy@google.com)
+
+#ifndef PROCESSOR_SIMPLE_SERIALIZER_H__
+#define PROCESSOR_SIMPLE_SERIALIZER_H__
+
+#include <sys/types.h>
+
+namespace google_breakpad {
+
+typedef u_int64_t MemAddr;
+
+// Default implementation of SimpleSerializer template.
+// Specializations are defined in "simple_serializer-inl.h".
+template<class Type> class SimpleSerializer {
+ public:
+ // Calculate and return the size of the 'item'.
+ static size_t SizeOf(const Type &item) { return sizeof(item); }
+ // Write 'item' to memory location 'dest', and return to the "end" address of
+ // data written, i.e., the address after the final byte written.
+ static char *Write(const Type &item, char *dest) {
+ new (dest) Type(item);
+ return dest + SizeOf(item);
+ }
+};
+
+} // namespace google_breakpad
+
+#endif // PROCESSOR_SIMPLE_SERIALIZER_H__
diff --git a/src/processor/static_address_map-inl.h b/src/processor/static_address_map-inl.h
new file mode 100644
index 00000000..67e07976
--- /dev/null
+++ b/src/processor/static_address_map-inl.h
@@ -0,0 +1,71 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// static_address_map-inl.h: StaticAddressMap implementation.
+//
+// See static_address_map.h for documentation.
+//
+// Author: Siyang Xie (lambxsy@google.com)
+
+#ifndef PROCESSOR_STATIC_ADDRESS_MAP_INL_H__
+#define PROCESSOR_STATIC_ADDRESS_MAP_INL_H__
+
+#include "processor/static_address_map.h"
+
+#include "processor/logging.h"
+
+namespace google_breakpad {
+
+template<typename AddressType, typename EntryType>
+bool StaticAddressMap<AddressType, EntryType>::Retrieve(
+ const AddressType &address,
+ const EntryType *&entry, AddressType *entry_address) const {
+
+ // upper_bound gives the first element whose key is greater than address,
+ // but we want the first element whose key is less than or equal to address.
+ // Decrement the iterator to get there, but not if the upper_bound already
+ // points to the beginning of the map - in that case, address is lower than
+ // the lowest stored key, so return false.
+
+ MapConstIterator iterator = map_.upper_bound(address);
+ if (iterator == map_.begin())
+ return false;
+ --iterator;
+
+ entry = iterator.GetValuePtr();
+ // Make sure AddressType is a copyable basic type
+ if (entry_address)
+ *entry_address = iterator.GetKey();
+
+ return true;
+}
+
+} // namespace google_breakpad
+
+#endif // PROCESSOR_STATIC_ADDRESS_MAP_INL_H__
diff --git a/src/processor/static_address_map.h b/src/processor/static_address_map.h
new file mode 100644
index 00000000..6bafc667
--- /dev/null
+++ b/src/processor/static_address_map.h
@@ -0,0 +1,78 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// static_address_map.h: StaticAddressMap.
+//
+// StaticAddressMap is a wrapper class of StaticMap, just as AddressMap wraps
+// std::map. StaticAddressMap provides read-only Retrieve() operation, similar
+// as AddressMap. However, the difference between StaticAddressMap and
+// AddressMap is that StaticAddressMap does not support dynamic operation
+// Store() due to the static nature of the underlying StaticMap.
+//
+// See address_map.h for reference.
+//
+// Author: Siyang Xie (lambxsy@google.com)
+
+#ifndef PROCESSOR_STATIC_ADDRESS_MAP_H__
+#define PROCESSOR_STATIC_ADDRESS_MAP_H__
+
+#include "processor/static_map-inl.h"
+
+namespace google_breakpad {
+
+// AddressType MUST be a basic type, e.g.: integer types etc
+// EntryType could be a complex type, so we retrieve its pointer instead.
+template<typename AddressType, typename EntryType>
+class StaticAddressMap {
+ public:
+ StaticAddressMap(): map_() { }
+ explicit StaticAddressMap(const char *map_data): map_(map_data) { }
+
+ // Locates the entry stored at the highest address less than or equal to
+ // the address argument. If there is no such range, returns false. The
+ // entry is returned in entry, which is a required argument. If
+ // entry_address is not NULL, it will be set to the address that the entry
+ // was stored at.
+ bool Retrieve(const AddressType &address,
+ const EntryType *&entry, AddressType *entry_address) const;
+
+ private:
+ friend class ModuleComparer;
+ // Convenience types.
+ typedef StaticAddressMap* SelfPtr;
+ typedef StaticMap<AddressType, EntryType> AddressToEntryMap;
+ typedef typename AddressToEntryMap::const_iterator MapConstIterator;
+
+ AddressToEntryMap map_;
+};
+
+} // namespace google_breakpad
+
+#endif // PROCESSOR_STATIC_ADDRESS_MAP_H__
+
diff --git a/src/processor/static_address_map_unittest.cc b/src/processor/static_address_map_unittest.cc
new file mode 100644
index 00000000..b1edbe77
--- /dev/null
+++ b/src/processor/static_address_map_unittest.cc
@@ -0,0 +1,235 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// static_address_map_unittest.cc: Unit tests for StaticAddressMap.
+//
+// Author: Siyang Xie (lambxsy@google.com)
+
+#include <climits>
+#include <cstdlib>
+#include <ctime>
+#include <string>
+#include <iostream>
+#include <sstream>
+
+#include "breakpad_googletest_includes.h"
+#include "processor/address_map-inl.h"
+#include "processor/static_address_map-inl.h"
+#include "processor/simple_serializer-inl.h"
+#include "map_serializers-inl.h"
+
+typedef google_breakpad::StaticAddressMap<int, char> TestMap;
+typedef google_breakpad::AddressMap<int, std::string> AddrMap;
+
+class TestStaticAddressMap : public ::testing::Test {
+ protected:
+ void SetUp() {
+ for (int testcase = 0; testcase < kNumberTestCases; ++testcase) {
+ testdata[testcase] = new int[testsize[testcase]];
+ }
+
+ // Test data set0: NULL (empty map)
+
+ // Test data set1: single element.
+ testdata[1][0] = 10;
+
+ // Test data set2: six elements.
+ const int tempdata[] = {5, 10, 14, 15, 16, 20};
+ for (int i = 0; i < testsize[2]; ++i)
+ testdata[2][i] = tempdata[i];
+
+ // Test data set3:
+ srand(time(NULL));
+ for (int i = 0; i < testsize[3]; ++i)
+ testdata[3][i] = rand();
+
+ // Setup maps.
+ std::stringstream sstream;
+ for (int testcase = 0; testcase < kNumberTestCases; ++testcase) {
+ for (int data_item = 0; data_item < testsize[testcase]; ++data_item) {
+ sstream.clear();
+ sstream << "test " << testdata[testcase][data_item];
+ addr_map[testcase].Store(testdata[testcase][data_item], sstream.str());
+ }
+ map_data[testcase] = serializer.Serialize(addr_map[testcase], NULL);
+ test_map[testcase] = TestMap(map_data[testcase]);
+ }
+ }
+
+ void TearDown() {
+ for (int i = 0; i < kNumberTestCases; ++i) {
+ delete map_data[i];
+ delete [] testdata[i];
+ }
+ }
+
+ void CompareRetrieveResult(int testcase, int target) {
+ int address;
+ int address_test;
+ std::string entry;
+ std::string entry_test;
+ const char *entry_cstring = NULL;
+ bool found;
+ bool found_test;
+
+ found = addr_map[testcase].Retrieve(target, &entry, &address);
+ found_test =
+ test_map[testcase].Retrieve(target, entry_cstring, &address_test);
+
+ ASSERT_EQ(found, found_test);
+
+ if (found && found_test) {
+ ASSERT_EQ(address, address_test);
+ entry_test = entry_cstring;
+ ASSERT_EQ(entry, entry_test);
+ }
+ }
+
+ void RetrieveTester(int testcase) {
+ int target;
+ target = INT_MIN;
+ CompareRetrieveResult(testcase, target);
+ target = INT_MAX;
+ CompareRetrieveResult(testcase, target);
+
+ srand(time(0));
+ for (int data_item = 0; data_item < testsize[testcase]; ++data_item) {
+ // Retrive (aka, search) for target address and compare results from
+ // AddressMap and StaticAddressMap.
+
+ // First, assign the search target to be one of original testdata that is
+ // known to exist in the map.
+ target = testdata[testcase][data_item];
+ CompareRetrieveResult(testcase, target);
+ // Then, add +2 / -1 bias to target value, in order to test searching for
+ // a target address not stored in the map.
+ target -= 1;
+ CompareRetrieveResult(testcase, target);
+ target += 3;
+ CompareRetrieveResult(testcase, target);
+ // Repeatedly test searching for random target addresses.
+ target = rand();
+ CompareRetrieveResult(testcase, target);
+ }
+ }
+
+ // Test data sets:
+ static const int kNumberTestCases = 4;
+ static const int testsize[];
+ int *testdata[kNumberTestCases];
+
+ AddrMap addr_map[kNumberTestCases];
+ TestMap test_map[kNumberTestCases];
+ char *map_data[kNumberTestCases];
+ google_breakpad::AddressMapSerializer<int, std::string> serializer;
+};
+
+const int TestStaticAddressMap::testsize[] = {0, 1, 6, 1000};
+
+TEST_F(TestStaticAddressMap, TestEmptyMap) {
+ int testcase = 0;
+ int target;
+ target = INT_MIN;
+ CompareRetrieveResult(testcase, target);
+ target = INT_MAX;
+ CompareRetrieveResult(testcase, target);
+ for (int data_item = 0; data_item < testsize[testcase]; ++data_item) {
+ target = testdata[testcase][data_item];
+ CompareRetrieveResult(testcase, target);
+ target -= 1;
+ CompareRetrieveResult(testcase, target);
+ target += 3;
+ CompareRetrieveResult(testcase, target);
+ target = rand();
+ CompareRetrieveResult(testcase, target);
+ }
+}
+
+TEST_F(TestStaticAddressMap, TestOneElementMap) {
+ int testcase = 1;
+ int target;
+ target = INT_MIN;
+ CompareRetrieveResult(testcase, target);
+ target = INT_MAX;
+ CompareRetrieveResult(testcase, target);
+ for (int data_item = 0; data_item < testsize[testcase]; ++data_item) {
+ target = testdata[testcase][data_item];
+ CompareRetrieveResult(testcase, target);
+ target -= 1;
+ CompareRetrieveResult(testcase, target);
+ target += 3;
+ CompareRetrieveResult(testcase, target);
+ target = rand();
+ CompareRetrieveResult(testcase, target);
+ }
+}
+
+TEST_F(TestStaticAddressMap, TestSixElementsMap) {
+ int testcase = 2;
+ int target;
+ target = INT_MIN;
+ CompareRetrieveResult(testcase, target);
+ target = INT_MAX;
+ CompareRetrieveResult(testcase, target);
+ for (int data_item = 0; data_item < testsize[testcase]; ++data_item) {
+ target = testdata[testcase][data_item];
+ CompareRetrieveResult(testcase, target);
+ target -= 1;
+ CompareRetrieveResult(testcase, target);
+ target += 3;
+ CompareRetrieveResult(testcase, target);
+ target = rand();
+ CompareRetrieveResult(testcase, target);
+ }
+}
+
+TEST_F(TestStaticAddressMap, Test1000RandomElementsMap) {
+ int testcase = 3;
+ int target;
+ target = INT_MIN;
+ CompareRetrieveResult(testcase, target);
+ target = INT_MAX;
+ CompareRetrieveResult(testcase, target);
+ for (int data_item = 0; data_item < testsize[testcase]; ++data_item) {
+ target = testdata[testcase][data_item];
+ CompareRetrieveResult(testcase, target);
+ target -= 1;
+ CompareRetrieveResult(testcase, target);
+ target += 3;
+ CompareRetrieveResult(testcase, target);
+ target = rand();
+ CompareRetrieveResult(testcase, target);
+ }
+}
+
+int main(int argc, char *argv[]) {
+ ::testing::InitGoogleTest(&argc, argv);
+
+ return RUN_ALL_TESTS();
+}
diff --git a/src/processor/static_contained_range_map-inl.h b/src/processor/static_contained_range_map-inl.h
new file mode 100644
index 00000000..57bfbcb5
--- /dev/null
+++ b/src/processor/static_contained_range_map-inl.h
@@ -0,0 +1,93 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// static_contained_range_map-inl.h: Hierarchically-organized range map,
+// i.e., StaticContainedRangeMap implementation.
+//
+// See static_contained_range_map.h for documentation.
+//
+// Author: Siyang Xie (lambxsy@google.com)
+
+#ifndef PROCESSOR_STATIC_CONTAINED_RANGE_MAP_INL_H__
+#define PROCESSOR_STATIC_CONTAINED_RANGE_MAP_INL_H__
+
+#include "processor/static_contained_range_map.h"
+#include "processor/logging.h"
+
+namespace google_breakpad {
+
+template<typename AddressType, typename EntryType>
+StaticContainedRangeMap<AddressType, EntryType>::StaticContainedRangeMap(
+ const char *base)
+ : base_(*(reinterpret_cast<const AddressType*>(base))),
+ entry_size_(*(reinterpret_cast<const u_int32_t*>(base + sizeof(base_)))),
+ entry_ptr_(reinterpret_cast<const EntryType *>(
+ base + sizeof(base_) + sizeof(entry_size_))),
+ map_(base + sizeof(base_) + sizeof(entry_size_) + entry_size_) {
+
+ if (entry_size_ == 0)
+ entry_ptr_ = NULL;
+}
+
+
+template<typename AddressType, typename EntryType>
+bool StaticContainedRangeMap<AddressType, EntryType>::RetrieveRange(
+ const AddressType &address, const EntryType *&entry) const {
+
+ // Get an iterator to the child range whose high address is equal to or
+ // greater than the supplied address. If the supplied address is higher
+ // than all of the high addresses in the range, then this range does not
+ // contain a child at address, so return false. If the supplied address
+ // is lower than the base address of the child range, then it is not within
+ // the child range, so return false.
+ MapConstIterator iterator = map_.lower_bound(address);
+
+ if (iterator == map_.end())
+ return false;
+
+ const char *memory_child =
+ reinterpret_cast<const char*>(iterator.GetValuePtr());
+
+ StaticContainedRangeMap child_map(memory_child);
+
+ if (address < child_map.base_)
+ return false;
+
+ // The child in iterator->second contains the specified address. Find out
+ // if it has a more-specific descendant that also contains it. If it does,
+ // it will set |entry| appropriately. If not, set |entry| to the child.
+ if (!child_map.RetrieveRange(address, entry))
+ entry = child_map.entry_ptr_;
+
+ return true;
+}
+
+} // namespace google_breakpad
+
+#endif // PROCESSOR_STATIC_CONTAINED_RANGE_MAP_INL_H__
diff --git a/src/processor/static_contained_range_map.h b/src/processor/static_contained_range_map.h
new file mode 100644
index 00000000..4d26e63f
--- /dev/null
+++ b/src/processor/static_contained_range_map.h
@@ -0,0 +1,96 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// static_contained_range_map.h: StaticContainedRangeMap.
+//
+// StaticContainedRangeMap is similar to ContainedRangeMap. However,
+// StaticContainedRangeMap wraps a StaticMap instead of std::map, and does not
+// support dynamic operations like StoreRange(...).
+// StaticContainedRangeMap provides same RetrieveRange(...) interfaces as
+// ContainedRangeMap.
+//
+// Please see contained_range_map.h for more documentation.
+//
+// Author: Siyang Xie (lambxsy@google.com)
+
+#ifndef PROCESSOR_STATIC_CONTAINED_RANGE_MAP_H__
+#define PROCESSOR_STATIC_CONTAINED_RANGE_MAP_H__
+
+#include "processor/static_map-inl.h"
+
+namespace google_breakpad {
+
+template<typename AddressType, typename EntryType>
+class StaticContainedRangeMap {
+ public:
+ StaticContainedRangeMap(): base_(), entry_size_(), entry_ptr_(), map_() { }
+ explicit StaticContainedRangeMap(const char *base);
+
+ // Retrieves the most specific (smallest) descendant range encompassing
+ // the specified address. This method will only return entries held by
+ // child ranges, and not the entry contained by |this|. This is necessary
+ // to support a sparsely-populated root range. If no descendant range
+ // encompasses the address, returns false.
+ bool RetrieveRange(const AddressType &address, const EntryType *&entry) const;
+
+ private:
+ friend class ModuleComparer;
+ // AddressToRangeMap stores pointers. This makes reparenting simpler in
+ // StoreRange, because it doesn't need to copy entire objects.
+ typedef StaticContainedRangeMap* SelfPtr;
+ typedef
+ StaticMap<AddressType, StaticContainedRangeMap> AddressToRangeMap;
+ typedef typename AddressToRangeMap::const_iterator MapConstIterator;
+
+ // The base address of this range. The high address does not need to
+ // be stored, because it is used as the key to an object in its parent's
+ // map, and all ContainedRangeMaps except for the root range are contained
+ // within maps. The root range does not actually contain an entry, so its
+ // base_ field is meaningless, and the fact that it has no parent and thus
+ // no key is unimportant. For this reason, the base_ field should only be
+ // is accessed on child ContainedRangeMap objects, and never on |this|.
+ AddressType base_;
+
+ // The entry corresponding to this range. The root range does not
+ // actually contain an entry, so its entry_ field is meaningless. For
+ // this reason, the entry_ field should only be accessed on child
+ // ContainedRangeMap objects, and never on |this|.
+ u_int32_t entry_size_;
+ const EntryType *entry_ptr_;
+
+ // The map containing child ranges, keyed by each child range's high
+ // address. This is a pointer to avoid allocating map structures for
+ // leaf nodes, where they are not needed.
+ AddressToRangeMap map_;
+};
+
+} // namespace google_breakpad
+
+
+#endif // PROCESSOR_STATIC_CONTAINED_RANGE_MAP_H__
diff --git a/src/processor/static_contained_range_map_unittest.cc b/src/processor/static_contained_range_map_unittest.cc
new file mode 100644
index 00000000..908e11c1
--- /dev/null
+++ b/src/processor/static_contained_range_map_unittest.cc
@@ -0,0 +1,317 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// static_contained_range_map_unittest.cc: Unit tests for
+// StaticContainedRangeMap.
+//
+// Author: Siyang Xie (lambxsy@google.com)
+
+#include "breakpad_googletest_includes.h"
+#include "processor/contained_range_map-inl.h"
+#include "processor/static_contained_range_map-inl.h"
+#include "processor/simple_serializer-inl.h"
+#include "processor/map_serializers-inl.h"
+
+#include "processor/scoped_ptr.h"
+#include "processor/logging.h"
+
+namespace {
+ // Each element in test_data contains the expected result when calling
+ // RetrieveRange on an address.
+ const int test_data[] = {
+ 0, // 0
+ 0, // 1
+ 0, // 2
+ 0, // 3
+ 0, // 4
+ 0, // 5
+ 0, // 6
+ 0, // 7
+ 9, // 8
+ 7, // 9
+ 1, // 10
+ 5, // 11
+ 6, // 12
+ 6, // 13
+ 6, // 14
+ 6, // 15
+ 6, // 16
+ 6, // 17
+ 6, // 18
+ 5, // 19
+ 7, // 20
+ 8, // 21
+ 0, // 22
+ 0, // 23
+ 0, // 24
+ 0, // 25
+ 0, // 26
+ 0, // 27
+ 0, // 28
+ 0, // 29
+ 10, // 30
+ 10, // 31
+ 10, // 32
+ 11, // 33
+ 11, // 34
+ 11, // 35
+ 0, // 36
+ 0, // 37
+ 0, // 38
+ 0, // 39
+ 14, // 40
+ 14, // 41
+ 14, // 42
+ 14, // 43
+ 15, // 44
+ 15, // 45
+ 15, // 46
+ 15, // 47
+ 0, // 48
+ 0, // 49
+ 19, // 50
+ 18, // 51
+ 18, // 52
+ 18, // 53
+ 18, // 54
+ 18, // 55
+ 18, // 56
+ 18, // 57
+ 18, // 58
+ 20, // 59
+ 21, // 60
+ 25, // 61
+ 26, // 62
+ 26, // 63
+ 26, // 64
+ 26, // 65
+ 26, // 66
+ 26, // 67
+ 24, // 68
+ 22, // 69
+ 30, // 70
+ 30, // 71
+ 30, // 72
+ 30, // 73
+ 31, // 74
+ 31, // 75
+ 30, // 76
+ 32, // 77
+ 32, // 78
+ 30, // 79
+ 34, // 80
+ 35, // 81
+ 36, // 82
+ 39, // 83
+ 38, // 84
+ 37, // 85
+ 43, // 86
+ 44, // 87
+ 41, // 88
+ 45, // 89
+ 42, // 90
+ 0, // 91
+ 0, // 92
+ 0, // 93
+ 0, // 94
+ 0, // 95
+ 0, // 96
+ 0, // 97
+ 0, // 98
+ 0 // 99
+ };
+} // namespace
+
+
+typedef google_breakpad::ContainedRangeMap<unsigned int, int> CRMMap;
+typedef google_breakpad::StaticContainedRangeMap<unsigned int, int> TestMap;
+using google_breakpad::scoped_ptr;
+
+class TestStaticCRMMap : public ::testing::Test {
+ protected:
+ void SetUp();
+
+ // A referrence map for testing StaticCRMMap.
+ google_breakpad::ContainedRangeMap<unsigned int, int> crm_map_;
+
+ // Static version of crm_map using serialized data of crm_map.
+ // The goal of testing is to make sure TestMap provides same results for
+ // lookup operation(s) as CRMMap does.
+ google_breakpad::StaticContainedRangeMap<unsigned int, int> test_map_;
+
+ google_breakpad::ContainedRangeMapSerializer<unsigned int, int> serializer_;
+
+ scoped_ptr<char> serialized_data_;
+};
+
+void TestStaticCRMMap::SetUp() {
+ // First, do the StoreRange tests. This validates the containment
+ // rules.
+ // We confirm the referrence map correctly stores data during setup.
+ ASSERT_TRUE (crm_map_.StoreRange(10, 10, 1));
+ ASSERT_FALSE(crm_map_.StoreRange(10, 10, 2)); // exactly equal to 1
+ ASSERT_FALSE(crm_map_.StoreRange(11, 10, 3)); // begins inside 1 and extends up
+ ASSERT_FALSE(crm_map_.StoreRange( 9, 10, 4)); // begins below 1 and ends inside
+ ASSERT_TRUE (crm_map_.StoreRange(11, 9, 5)); // contained by existing
+ ASSERT_TRUE (crm_map_.StoreRange(12, 7, 6));
+ ASSERT_TRUE (crm_map_.StoreRange( 9, 12, 7)); // contains existing
+ ASSERT_TRUE (crm_map_.StoreRange( 9, 13, 8));
+ ASSERT_TRUE (crm_map_.StoreRange( 8, 14, 9));
+ ASSERT_TRUE (crm_map_.StoreRange(30, 3, 10));
+ ASSERT_TRUE (crm_map_.StoreRange(33, 3, 11));
+ ASSERT_TRUE (crm_map_.StoreRange(30, 6, 12)); // storable but totally masked
+ ASSERT_TRUE (crm_map_.StoreRange(40, 8, 13)); // will be totally masked
+ ASSERT_TRUE (crm_map_.StoreRange(40, 4, 14));
+ ASSERT_TRUE (crm_map_.StoreRange(44, 4, 15));
+ ASSERT_FALSE(crm_map_.StoreRange(32, 10, 16)); // begins in #10, ends in #14
+ ASSERT_FALSE(crm_map_.StoreRange(50, 0, 17)); // zero length
+ ASSERT_TRUE (crm_map_.StoreRange(50, 10, 18));
+ ASSERT_TRUE (crm_map_.StoreRange(50, 1, 19));
+ ASSERT_TRUE (crm_map_.StoreRange(59, 1, 20));
+ ASSERT_TRUE (crm_map_.StoreRange(60, 1, 21));
+ ASSERT_TRUE (crm_map_.StoreRange(69, 1, 22));
+ ASSERT_TRUE (crm_map_.StoreRange(60, 10, 23));
+ ASSERT_TRUE (crm_map_.StoreRange(68, 1, 24));
+ ASSERT_TRUE (crm_map_.StoreRange(61, 1, 25));
+ ASSERT_TRUE (crm_map_.StoreRange(61, 8, 26));
+ ASSERT_FALSE(crm_map_.StoreRange(59, 9, 27));
+ ASSERT_FALSE(crm_map_.StoreRange(59, 10, 28));
+ ASSERT_FALSE(crm_map_.StoreRange(59, 11, 29));
+ ASSERT_TRUE (crm_map_.StoreRange(70, 10, 30));
+ ASSERT_TRUE (crm_map_.StoreRange(74, 2, 31));
+ ASSERT_TRUE (crm_map_.StoreRange(77, 2, 32));
+ ASSERT_FALSE(crm_map_.StoreRange(72, 6, 33));
+ ASSERT_TRUE (crm_map_.StoreRange(80, 3, 34));
+ ASSERT_TRUE (crm_map_.StoreRange(81, 1, 35));
+ ASSERT_TRUE (crm_map_.StoreRange(82, 1, 36));
+ ASSERT_TRUE (crm_map_.StoreRange(83, 3, 37));
+ ASSERT_TRUE (crm_map_.StoreRange(84, 1, 38));
+ ASSERT_TRUE (crm_map_.StoreRange(83, 1, 39));
+ ASSERT_TRUE (crm_map_.StoreRange(86, 5, 40));
+ ASSERT_TRUE (crm_map_.StoreRange(88, 1, 41));
+ ASSERT_TRUE (crm_map_.StoreRange(90, 1, 42));
+ ASSERT_TRUE (crm_map_.StoreRange(86, 1, 43));
+ ASSERT_TRUE (crm_map_.StoreRange(87, 1, 44));
+ ASSERT_TRUE (crm_map_.StoreRange(89, 1, 45));
+ ASSERT_TRUE (crm_map_.StoreRange(87, 4, 46));
+ ASSERT_TRUE (crm_map_.StoreRange(87, 3, 47));
+ ASSERT_FALSE(crm_map_.StoreRange(86, 2, 48));
+
+ // Serialize crm_map to generate serialized data.
+ unsigned int size;
+ serialized_data_.reset(serializer_.Serialize(&crm_map_, &size));
+ BPLOG(INFO) << "Serialized data size: " << size << " Bytes.";
+
+ // Construct test_map_ from serialized data.
+ test_map_ = TestMap(serialized_data_.get());
+}
+
+TEST_F(TestStaticCRMMap, TestEmptyMap) {
+ CRMMap empty_crm_map;
+
+ unsigned int size;
+ scoped_ptr<char> serialized_data;
+ serialized_data.reset(serializer_.Serialize(&empty_crm_map, &size));
+ scoped_ptr<TestMap> test_map(new TestMap(serialized_data.get()));
+
+ const unsigned int kCorrectSizeForEmptyMap = 16;
+ ASSERT_EQ(kCorrectSizeForEmptyMap, size);
+
+ const int *entry_test;
+ ASSERT_FALSE(test_map->RetrieveRange(-1, entry_test));
+ ASSERT_FALSE(test_map->RetrieveRange(0, entry_test));
+ ASSERT_FALSE(test_map->RetrieveRange(10, entry_test));
+}
+
+TEST_F(TestStaticCRMMap, TestSingleElementMap) {
+ CRMMap crm_map;
+ // Test on one element:
+ int entry = 1;
+ crm_map.StoreRange(10, 10, entry);
+
+ unsigned int size;
+ scoped_ptr<char> serialized_data;
+ serialized_data.reset(serializer_.Serialize(&crm_map, &size));
+ scoped_ptr<TestMap> test_map(new TestMap(serialized_data.get()));
+
+ const unsigned int kCorrectSizeForSingleElementMap = 40;
+ ASSERT_EQ(kCorrectSizeForSingleElementMap, size);
+
+ const int *entry_test;
+ ASSERT_FALSE(test_map->RetrieveRange(-1, entry_test));
+ ASSERT_FALSE(test_map->RetrieveRange(0, entry_test));
+ ASSERT_TRUE(test_map->RetrieveRange(10, entry_test));
+ ASSERT_EQ(*entry_test, entry);
+ ASSERT_TRUE(test_map->RetrieveRange(13, entry_test));
+ ASSERT_EQ(*entry_test, entry);
+}
+
+TEST_F(TestStaticCRMMap, RunTestData) {
+ unsigned int test_high = sizeof(test_data) / sizeof(test_data[0]);
+
+ // Now, do the RetrieveRange tests. This further validates that the
+ // objects were stored properly and that retrieval returns the correct
+ // object.
+ // If GENERATE_TEST_DATA is defined, instead of the retrieval tests, a
+ // new test_data array will be printed. Exercise caution when doing this.
+ // Be sure to verify the results manually!
+#ifdef GENERATE_TEST_DATA
+ printf(" const int test_data[] = {\n");
+#endif // GENERATE_TEST_DATA
+
+ for (unsigned int address = 0; address < test_high; ++address) {
+ const int *entryptr;
+ int value = 0;
+ if (test_map_.RetrieveRange(address, entryptr))
+ value = *entryptr;
+
+#ifndef GENERATE_TEST_DATA
+ // Don't use ASSERT inside the loop because it won't show the failed
+ // |address|, and the line number will always be the same. That makes
+ // it difficult to figure out which test failed.
+ EXPECT_EQ(value, test_data[address]) << "FAIL: retrieve address "
+ << address;
+#else // !GENERATE_TEST_DATA
+ printf(" %d%c%s // %d\n", value,
+ address == test_high - 1 ? ' ' : ',',
+ value < 10 ? " " : "",
+ address);
+#endif // !GENERATE_TEST_DATA
+ }
+
+#ifdef GENERATE_TEST_DATA
+ printf(" };\n");
+#endif // GENERATE_TEST_DATA
+}
+
+int main(int argc, char *argv[]) {
+ ::testing::InitGoogleTest(&argc, argv);
+
+ return RUN_ALL_TESTS();
+}
diff --git a/src/processor/static_range_map-inl.h b/src/processor/static_range_map-inl.h
new file mode 100644
index 00000000..f6cef1a9
--- /dev/null
+++ b/src/processor/static_range_map-inl.h
@@ -0,0 +1,130 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// static_range_map-inl.h: StaticRangeMap implementation.
+//
+// See static_range_map.h for documentation.
+//
+// Author: Siyang Xie (lambxsy@google.com)
+
+#ifndef PROCESSOR_STATIC_RANGE_MAP_INL_H__
+#define PROCESSOR_STATIC_RANGE_MAP_INL_H__
+
+#include "processor/static_range_map.h"
+#include "processor/logging.h"
+
+namespace google_breakpad {
+
+template<typename AddressType, typename EntryType>
+bool StaticRangeMap<AddressType, EntryType>::RetrieveRange(
+ const AddressType &address, const EntryType *&entry,
+ AddressType *entry_base, AddressType *entry_size) const {
+ MapConstIterator iterator = map_.lower_bound(address);
+ if (iterator == map_.end())
+ return false;
+
+ // The map is keyed by the high address of each range, so |address| is
+ // guaranteed to be lower than the range's high address. If |range| is
+ // not directly preceded by another range, it's possible for address to
+ // be below the range's low address, though. When that happens, address
+ // references something not within any range, so return false.
+
+ const Range *range = iterator.GetValuePtr();
+
+ // Make sure AddressType and EntryType are copyable basic types
+ // e.g.: integer types, pointers etc
+ if (address < range->base())
+ return false;
+
+ entry = range->entryptr();
+ if (entry_base)
+ *entry_base = range->base();
+ if (entry_size)
+ *entry_size = iterator.GetKey() - range->base() + 1;
+
+ return true;
+}
+
+
+template<typename AddressType, typename EntryType>
+bool StaticRangeMap<AddressType, EntryType>::RetrieveNearestRange(
+ const AddressType &address, const EntryType *&entry,
+ AddressType *entry_base, AddressType *entry_size) const {
+ // If address is within a range, RetrieveRange can handle it.
+ if (RetrieveRange(address, entry, entry_base, entry_size))
+ return true;
+
+ // upper_bound gives the first element whose key is greater than address,
+ // but we want the first element whose key is less than or equal to address.
+ // Decrement the iterator to get there, but not if the upper_bound already
+ // points to the beginning of the map - in that case, address is lower than
+ // the lowest stored key, so return false.
+
+ MapConstIterator iterator = map_.upper_bound(address);
+ if (iterator == map_.begin())
+ return false;
+ --iterator;
+
+ const Range *range = iterator.GetValuePtr();
+ entry = range->entryptr();
+ if (entry_base)
+ *entry_base = range->base();
+ if (entry_size)
+ *entry_size = iterator.GetKey() - range->base() + 1;
+
+ return true;
+}
+
+template<typename AddressType, typename EntryType>
+bool StaticRangeMap<AddressType, EntryType>::RetrieveRangeAtIndex(
+ int index, const EntryType *&entry,
+ AddressType *entry_base, AddressType *entry_size) const {
+
+ if (index >= GetCount()) {
+ BPLOG(ERROR) << "Index out of range: " << index << "/" << GetCount();
+ return false;
+ }
+
+ MapConstIterator iterator = map_.IteratorAtIndex(index);
+
+ const Range *range = iterator.GetValuePtr();
+
+ entry = range->entryptr();
+ if (entry_base)
+ *entry_base = range->base();
+ if (entry_size)
+ *entry_size = iterator.GetKey() - range->base() + 1;
+
+ return true;
+}
+
+} // namespace google_breakpad
+
+
+#endif // PROCESSOR_STATIC_RANGE_MAP_INL_H__
diff --git a/src/processor/static_range_map.h b/src/processor/static_range_map.h
new file mode 100644
index 00000000..096bbbba
--- /dev/null
+++ b/src/processor/static_range_map.h
@@ -0,0 +1,106 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// static_range_map.h: StaticRangeMap.
+//
+// StaticRangeMap is similar as RangeMap. However, StaticRangeMap wraps a
+// StaticMap instead of std::map, and does not support dynamic operations like
+// StoreRange(...). StaticRangeMap provides same Retrieve*() interfaces as
+// RangeMap. Please see range_map.h for more documentation.
+//
+// Author: Siyang Xie (lambxsy@google.com)
+
+#ifndef PROCESSOR_STATIC_RANGE_MAP_H__
+#define PROCESSOR_STATIC_RANGE_MAP_H__
+
+
+#include "processor/static_map-inl.h"
+
+namespace google_breakpad {
+
+// AddressType is basic type, e.g.: integer types, pointers etc
+// EntryType could be a complex type, so we retrieve its pointer instead.
+template<typename AddressType, typename EntryType>
+class StaticRangeMap {
+ public:
+ StaticRangeMap(): map_() { }
+ explicit StaticRangeMap(const char *memory): map_(memory) { }
+
+ // Locates the range encompassing the supplied address. If there is
+ // no such range, returns false. entry_base and entry_size, if non-NULL,
+ // are set to the base and size of the entry's range.
+ bool RetrieveRange(const AddressType &address, const EntryType *&entry,
+ AddressType *entry_base, AddressType *entry_size) const;
+
+ // Locates the range encompassing the supplied address, if one exists.
+ // If no range encompasses the supplied address, locates the nearest range
+ // to the supplied address that is lower than the address. Returns false
+ // if no range meets these criteria. entry_base and entry_size, if
+ // non-NULL, are set to the base and size of the entry's range.
+ bool RetrieveNearestRange(const AddressType &address, const EntryType *&entry,
+ AddressType *entry_base, AddressType *entry_size)
+ const;
+
+ // Treating all ranges as a list ordered by the address spaces that they
+ // occupy, locates the range at the index specified by index. Returns
+ // false if index is larger than the number of ranges stored. entry_base
+ // and entry_size, if non-NULL, are set to the base and size of the entry's
+ // range.
+ //
+ // RetrieveRangeAtIndex is not optimized for speedy operation.
+ bool RetrieveRangeAtIndex(int index, const EntryType *&entry,
+ AddressType *entry_base, AddressType *entry_size)
+ const;
+
+ // Returns the number of ranges stored in the RangeMap.
+ inline unsigned int GetCount() const { return map_.size(); }
+
+ private:
+ friend class ModuleComparer;
+ class Range {
+ public:
+ AddressType base() const {
+ return *(reinterpret_cast<const AddressType*>(this));
+ }
+ const EntryType* entryptr() const {
+ return reinterpret_cast<const EntryType*>(this + sizeof(AddressType));
+ }
+ };
+
+ // Convenience types.
+ typedef StaticRangeMap* SelfPtr;
+ typedef StaticMap<AddressType, Range> AddressToRangeMap;
+ typedef typename AddressToRangeMap::const_iterator MapConstIterator;
+
+ AddressToRangeMap map_;
+};
+
+} // namespace google_breakpad
+
+#endif // PROCESSOR_STATIC_RANGE_MAP_H__
diff --git a/src/processor/static_range_map_unittest.cc b/src/processor/static_range_map_unittest.cc
new file mode 100644
index 00000000..d4163e28
--- /dev/null
+++ b/src/processor/static_range_map_unittest.cc
@@ -0,0 +1,427 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// static_range_map_unittest.cc: Unit tests for StaticRangeMap.
+//
+// Author: Siyang Xie (lambxsy@google.com)
+
+#include "breakpad_googletest_includes.h"
+#include "processor/range_map-inl.h"
+#include "processor/static_range_map-inl.h"
+#include "processor/simple_serializer-inl.h"
+#include "processor/map_serializers-inl.h"
+
+#include "processor/logging.h"
+#include "processor/scoped_ptr.h"
+
+using google_breakpad::StaticRangeMap;
+using google_breakpad::RangeMap;
+
+// Types used for testing.
+typedef int AddressType;
+typedef int EntryType;
+typedef StaticRangeMap< AddressType, EntryType > TestMap;
+typedef RangeMap< AddressType, EntryType > RMap;
+
+// RangeTest contains data to use for store and retrieve tests. See
+// RunTests for descriptions of the tests.
+struct RangeTest {
+ // Base address to use for test
+ AddressType address;
+
+ // Size of range to use for test
+ AddressType size;
+
+ // Unique ID of range - unstorable ranges must have unique IDs too
+ EntryType id;
+
+ // Whether this range is expected to be stored successfully or not
+ bool expect_storable;
+};
+
+// A RangeTestSet encompasses multiple RangeTests, which are run in
+// sequence on the same RangeMap.
+struct RangeTestSet {
+ // An array of RangeTests
+ const RangeTest* range_tests;
+
+ // The number of tests in the set
+ unsigned int range_test_count;
+};
+
+namespace {
+ // These tests will be run sequentially. The first set of tests exercises
+ // most functions of RangeTest, and verifies all of the bounds-checking.
+ const RangeTest range_tests_0[] = {
+ { INT_MIN, 16, 1, true }, // lowest possible range
+ { -2, 5, 2, true }, // a range through zero
+ { INT_MAX - 9, 11, 3, false }, // tests anti-overflow
+ { INT_MAX - 9, 10, 4, true }, // highest possible range
+ { 5, 0, 5, false }, // tests anti-zero-size
+ { 5, 1, 6, true }, // smallest possible range
+ { -20, 15, 7, true }, // entirely negative
+
+ { 10, 10, 10, true }, // causes the following tests to fail
+ { 9, 10, 11, false }, // one-less base, one-less high
+ { 9, 11, 12, false }, // one-less base, identical high
+ { 9, 12, 13, false }, // completely contains existing
+ { 10, 9, 14, false }, // identical base, one-less high
+ { 10, 10, 15, false }, // exactly identical to existing range
+ { 10, 11, 16, false }, // identical base, one-greater high
+ { 11, 8, 17, false }, // contained completely within
+ { 11, 9, 18, false }, // one-greater base, identical high
+ { 11, 10, 19, false }, // one-greater base, one-greater high
+ { 9, 2, 20, false }, // overlaps bottom by one
+ { 10, 1, 21, false }, // overlaps bottom by one, contained
+ { 19, 1, 22, false }, // overlaps top by one, contained
+ { 19, 2, 23, false }, // overlaps top by one
+
+ { 9, 1, 24, true }, // directly below without overlap
+ { 20, 1, 25, true }, // directly above without overlap
+
+ { 6, 3, 26, true }, // exactly between two ranges, gapless
+ { 7, 3, 27, false }, // tries to span two ranges
+ { 7, 5, 28, false }, // tries to span three ranges
+ { 4, 20, 29, false }, // tries to contain several ranges
+
+ { 30, 50, 30, true },
+ { 90, 25, 31, true },
+ { 35, 65, 32, false }, // tries to span two noncontiguous
+ { 120, 10000, 33, true }, // > 8-bit
+ { 20000, 20000, 34, true }, // > 8-bit
+ { 0x10001, 0x10001, 35, true }, // > 16-bit
+
+ { 27, -1, 36, false } // tests high < base
+ };
+
+ // Attempt to fill the entire space. The entire space must be filled with
+ // three stores because AddressType is signed for these tests, so RangeMap
+ // treats the size as signed and rejects sizes that appear to be negative.
+ // Even if these tests were run as unsigned, two stores would be needed
+ // to fill the space because the entire size of the space could only be
+ // described by using one more bit than would be present in AddressType.
+ const RangeTest range_tests_1[] = {
+ { INT_MIN, INT_MAX, 50, true }, // From INT_MIN to -2, inclusive
+ { -1, 2, 51, true }, // From -1 to 0, inclusive
+ { 1, INT_MAX, 52, true }, // From 1 to INT_MAX, inclusive
+ { INT_MIN, INT_MAX, 53, false }, // Can't fill the space twice
+ { -1, 2, 54, false },
+ { 1, INT_MAX, 55, false },
+ { -3, 6, 56, false }, // -3 to 2, inclusive - spans 3 ranges
+ };
+
+ // A light round of testing to verify that RetrieveRange does the right
+ // the right thing at the extremities of the range when nothing is stored
+ // there. Checks are forced without storing anything at the extremities
+ // by setting size = 0.
+ const RangeTest range_tests_2[] = {
+ { INT_MIN, 0, 100, false }, // makes RetrieveRange check low end
+ { -1, 3, 101, true },
+ { INT_MAX, 0, 102, false }, // makes RetrieveRange check high end
+ };
+
+ // Similar to the previous test set, but with a couple of ranges closer
+ // to the extremities.
+ const RangeTest range_tests_3[] = {
+ { INT_MIN + 1, 1, 110, true },
+ { INT_MAX - 1, 1, 111, true },
+ { INT_MIN, 0, 112, false }, // makes RetrieveRange check low end
+ { INT_MAX, 0, 113, false } // makes RetrieveRange check high end
+ };
+
+ // The range map is cleared between sets of tests listed here.
+ const RangeTestSet range_test_sets[] = {
+ { range_tests_0, sizeof(range_tests_0) / sizeof(RangeTest) },
+ { range_tests_1, sizeof(range_tests_1) / sizeof(RangeTest) },
+ { range_tests_2, sizeof(range_tests_2) / sizeof(RangeTest) },
+ { range_tests_3, sizeof(range_tests_3) / sizeof(RangeTest) },
+ { range_tests_0, sizeof(range_tests_0) / sizeof(RangeTest) } // Run again
+ };
+}
+
+class TestStaticRangeMap : public ::testing::Test {
+ protected:
+ void SetUp() {
+ kTestCasesCount_ = sizeof(range_test_sets) / sizeof(RangeTestSet);
+ }
+
+ // StoreTest uses the data in a RangeTest and calls StoreRange on the
+ // test RangeMap. It returns true if the expected result occurred, and
+ // false if something else happened.
+ void StoreTest(RMap* range_map, const RangeTest* range_test);
+
+ // RetrieveTest uses the data in RangeTest and calls RetrieveRange on the
+ // test RangeMap. If it retrieves the expected value (which can be no
+ // map entry at the specified range,) it returns true, otherwise, it returns
+ // false. RetrieveTest will check the values around the base address and
+ // the high address of a range to guard against off-by-one errors.
+ void RetrieveTest(TestMap* range_map, const RangeTest* range_test);
+
+ // Test RetrieveRangeAtIndex, which is supposed to return objects in order
+ // according to their addresses. This test is performed by looping through
+ // the map, calling RetrieveRangeAtIndex for all possible indices in sequence,
+ // and verifying that each call returns a different object than the previous
+ // call, and that ranges are returned with increasing base addresses. Returns
+ // false if the test fails.
+ void RetrieveIndexTest(const TestMap* range_map, int set);
+
+ void RunTestCase(int test_case);
+
+ unsigned int kTestCasesCount_;
+ google_breakpad::RangeMapSerializer<AddressType, EntryType> serializer_;
+};
+
+void TestStaticRangeMap::StoreTest(RMap* range_map,
+ const RangeTest* range_test) {
+ bool stored = range_map->StoreRange(range_test->address,
+ range_test->size,
+ range_test->id);
+ EXPECT_EQ(stored, range_test->expect_storable)
+ << "StoreRange id " << range_test->id << "FAILED";
+}
+
+void TestStaticRangeMap::RetrieveTest(TestMap* range_map,
+ const RangeTest* range_test) {
+ for (unsigned int side = 0; side <= 1; ++side) {
+ // When side == 0, check the low side (base address) of each range.
+ // When side == 1, check the high side (base + size) of each range.
+
+ // Check one-less and one-greater than the target address in addition
+ // to the target address itself.
+
+ // If the size of the range is only 1, don't check one greater than
+ // the base or one less than the high - for a successfully stored
+ // range, these tests would erroneously fail because the range is too
+ // small.
+ AddressType low_offset = -1;
+ AddressType high_offset = 1;
+ if (range_test->size == 1) {
+ if (!side) // When checking the low side,
+ high_offset = 0; // don't check one over the target.
+ else // When checking the high side,
+ low_offset = 0; // don't check one under the target.
+ }
+
+ for (AddressType offset = low_offset; offset <= high_offset; ++offset) {
+ AddressType address =
+ offset +
+ (!side ? range_test->address :
+ range_test->address + range_test->size - 1);
+
+ bool expected_result = false; // This is correct for tests not stored.
+ if (range_test->expect_storable) {
+ if (offset == 0) // When checking the target address,
+ expected_result = true; // test should always succeed.
+ else if (offset == -1) // When checking one below the target,
+ expected_result = side; // should fail low and succeed high.
+ else // When checking one above the target,
+ expected_result = !side; // should succeed low and fail high.
+ }
+
+ const EntryType* id;
+ AddressType retrieved_base;
+ AddressType retrieved_size;
+ bool retrieved = range_map->RetrieveRange(address, id,
+ &retrieved_base,
+ &retrieved_size);
+
+ bool observed_result = retrieved && *id == range_test->id;
+ EXPECT_EQ(observed_result, expected_result)
+ << "RetrieveRange id " << range_test->id
+ << ", side " << side << ", offset " << offset << " FAILED.";
+
+ // If a range was successfully retrieved, check that the returned
+ // bounds match the range as stored.
+ if (observed_result == true) {
+ EXPECT_EQ(retrieved_base, range_test->address)
+ << "RetrieveRange id " << range_test->id
+ << ", side " << side << ", offset " << offset << " FAILED.";
+ EXPECT_EQ(retrieved_size, range_test->size)
+ << "RetrieveRange id " << range_test->id
+ << ", side " << side << ", offset " << offset << " FAILED.";
+ }
+
+ // Now, check RetrieveNearestRange. The nearest range is always
+ // expected to be different from the test range when checking one
+ // less than the low side.
+ bool expected_nearest = range_test->expect_storable;
+ if (!side && offset < 0)
+ expected_nearest = false;
+
+ AddressType nearest_base;
+ AddressType nearest_size;
+ bool retrieved_nearest = range_map->RetrieveNearestRange(address,
+ id,
+ &nearest_base,
+ &nearest_size);
+
+ // When checking one greater than the high side, RetrieveNearestRange
+ // should usually return the test range. When a different range begins
+ // at that address, though, then RetrieveNearestRange should return the
+ // range at the address instead of the test range.
+ if (side && offset > 0 && nearest_base == address) {
+ expected_nearest = false;
+ }
+
+ bool observed_nearest = retrieved_nearest &&
+ *id == range_test->id;
+
+ EXPECT_EQ(observed_nearest, expected_nearest)
+ << "RetrieveRange id " << range_test->id
+ << ", side " << side << ", offset " << offset << " FAILED.";
+
+ // If a range was successfully retrieved, check that the returned
+ // bounds match the range as stored.
+ if (expected_nearest ==true) {
+ EXPECT_EQ(nearest_base, range_test->address)
+ << "RetrieveRange id " << range_test->id
+ << ", side " << side << ", offset " << offset << " FAILED.";
+ EXPECT_EQ(nearest_size, range_test->size)
+ << "RetrieveRange id " << range_test->id
+ << ", side " << side << ", offset " << offset << " FAILED.";
+ }
+ }
+ }
+}
+
+void TestStaticRangeMap::RetrieveIndexTest(const TestMap* range_map, int set) {
+ AddressType last_base = 0;
+ const EntryType* last_entry = 0;
+ const EntryType* entry;
+ int object_count = range_map->GetCount();
+ for (int object_index = 0; object_index < object_count; ++object_index) {
+ AddressType base;
+ ASSERT_TRUE(range_map->RetrieveRangeAtIndex(object_index,
+ entry,
+ &base,
+ NULL))
+ << "FAILED: RetrieveRangeAtIndex set " << set
+ << " index " << object_index;
+
+ ASSERT_TRUE(entry) << "FAILED: RetrieveRangeAtIndex set " << set
+ << " index " << object_index;
+
+ // It's impossible to do these comparisons unless there's a previous
+ // object to compare against.
+ if (last_entry) {
+ // The object must be different from the last_entry one.
+ EXPECT_NE(*entry, *last_entry) << "FAILED: RetrieveRangeAtIndex set "
+ << set << " index " << object_index;
+ // Each object must have a base greater than the previous object's base.
+ EXPECT_GT(base, last_base) << "FAILED: RetrieveRangeAtIndex set " << set
+ << " index " << object_index;
+ }
+ last_entry = entry;
+ last_base = base;
+ }
+
+ // Make sure that RetrieveRangeAtIndex doesn't allow lookups at indices that
+ // are too high.
+ ASSERT_FALSE(range_map->RetrieveRangeAtIndex(
+ object_count, entry, NULL, NULL)) << "FAILED: RetrieveRangeAtIndex set "
+ << set << " index " << object_count
+ << " (too large)";
+}
+
+// RunTests runs a series of test sets.
+void TestStaticRangeMap::RunTestCase(int test_case) {
+ // Maintain the range map in a pointer so that deletion can be meaningfully
+ // tested.
+ RMap* rmap = new RMap();
+
+ const RangeTest* range_tests = range_test_sets[test_case].range_tests;
+ unsigned int range_test_count = range_test_sets[test_case].range_test_count;
+
+ // Run the StoreRange test, which validates StoreRange and initializes
+ // the RangeMap with data for the RetrieveRange test.
+ int stored_count = 0; // The number of ranges successfully stored
+ for (unsigned int range_test_index = 0;
+ range_test_index < range_test_count;
+ ++range_test_index) {
+ const RangeTest* range_test = &range_tests[range_test_index];
+ StoreTest(rmap, range_test);
+
+ if (range_test->expect_storable)
+ ++stored_count;
+ }
+
+ char *memaddr = serializer_.Serialize(*rmap, NULL);
+ TestMap* static_range_map = new TestMap(memaddr);
+
+ // The RangeMap's own count of objects should also match.
+ EXPECT_EQ(static_range_map->GetCount(), stored_count);
+
+ // Run the RetrieveRange test
+ for (unsigned int range_test_index = 0;
+ range_test_index < range_test_count;
+ ++range_test_index) {
+ const RangeTest* range_test = &range_tests[range_test_index];
+ RetrieveTest(static_range_map, range_test);
+ }
+
+ RetrieveIndexTest(static_range_map, test_case);
+
+ // Clear the map between test sets. If this is the final test set,
+ // delete the map instead to test destruction.
+ delete memaddr;
+ delete static_range_map;
+ rmap->Clear();
+ delete rmap;
+}
+
+TEST_F(TestStaticRangeMap, TestCase0) {
+ int test_case = 0;
+ RunTestCase(test_case);
+}
+
+TEST_F(TestStaticRangeMap, TestCase1) {
+ int test_case = 1;
+ RunTestCase(test_case);
+}
+
+TEST_F(TestStaticRangeMap, TestCase2) {
+ int test_case = 2;
+ RunTestCase(test_case);
+}
+
+TEST_F(TestStaticRangeMap, TestCase3) {
+ int test_case = 3;
+ RunTestCase(test_case);
+}
+
+TEST_F(TestStaticRangeMap, RunTestCase0Again) {
+ int test_case = 0;
+ RunTestCase(test_case);
+}
+
+int main(int argc, char *argv[]) {
+ ::testing::InitGoogleTest(&argc, argv);
+
+ return RUN_ALL_TESTS();
+}