mirror of
https://github.com/yuzu-emu/breakpad.git
synced 2024-12-22 23:55:42 +00:00
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
This commit is contained in:
parent
361f24eac7
commit
08730fc9a6
70
Makefile.am
70
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 \
|
||||
|
@ -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 \
|
||||
|
@ -528,6 +556,34 @@ 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 \
|
||||
|
@ -542,6 +598,20 @@ 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 = \
|
||||
|
|
393
Makefile.in
393
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 \
|
||||
|
@ -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 \
|
||||
|
@ -1436,6 +1535,38 @@ 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 \
|
||||
|
@ -1452,6 +1583,22 @@ TESTS_ENVIRONMENT =
|
|||
@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
|
||||
|
||||
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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__
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
268
src/processor/map_serializers-inl.h
Normal file
268
src/processor/map_serializers-inl.h
Normal file
|
@ -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__
|
164
src/processor/map_serializers.h
Normal file
164
src/processor/map_serializers.h
Normal file
|
@ -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__
|
388
src/processor/map_serializers_unittest.cc
Normal file
388
src/processor/map_serializers_unittest.cc
Normal file
|
@ -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();
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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)
|
||||
|
|
252
src/processor/simple_serializer-inl.h
Normal file
252
src/processor/simple_serializer-inl.h
Normal file
|
@ -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__
|
63
src/processor/simple_serializer.h
Normal file
63
src/processor/simple_serializer.h
Normal file
|
@ -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__
|
71
src/processor/static_address_map-inl.h
Normal file
71
src/processor/static_address_map-inl.h
Normal file
|
@ -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__
|
78
src/processor/static_address_map.h
Normal file
78
src/processor/static_address_map.h
Normal file
|
@ -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__
|
||||
|
235
src/processor/static_address_map_unittest.cc
Normal file
235
src/processor/static_address_map_unittest.cc
Normal file
|
@ -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();
|
||||
}
|
93
src/processor/static_contained_range_map-inl.h
Normal file
93
src/processor/static_contained_range_map-inl.h
Normal file
|
@ -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__
|
96
src/processor/static_contained_range_map.h
Normal file
96
src/processor/static_contained_range_map.h
Normal file
|
@ -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__
|
317
src/processor/static_contained_range_map_unittest.cc
Normal file
317
src/processor/static_contained_range_map_unittest.cc
Normal file
|
@ -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();
|
||||
}
|
130
src/processor/static_range_map-inl.h
Normal file
130
src/processor/static_range_map-inl.h
Normal file
|
@ -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__
|
106
src/processor/static_range_map.h
Normal file
106
src/processor/static_range_map.h
Normal file
|
@ -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__
|
427
src/processor/static_range_map_unittest.cc
Normal file
427
src/processor/static_range_map_unittest.cc
Normal file
|
@ -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();
|
||||
}
|
Loading…
Reference in a new issue