aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authornealsid <nealsid@4c0a9323-5329-0410-9bdc-e9ce6186880e>2008-10-08 23:56:02 +0000
committernealsid <nealsid@4c0a9323-5329-0410-9bdc-e9ce6186880e>2008-10-08 23:56:02 +0000
commitcb4aa6b804d9c4a5d43aa50bfbc46257bc55c001 (patch)
tree43e29af9b6c3a85db4964e3b53b4e8ad64f2ca6b /src
parentGenerate Windows full memory dumps as a separate file. Patch by Huan Ren (diff)
downloadbreakpad-cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001.tar.xz
Added DWARF support to Breakpad client. Thanks to Google for open sourcing their DWARF code!
Modified dump_syms to detect dSYM bundles or a binary with DWARF data appropriately, and convert data from DWARF reader to dump_syms native structures R=danny.berlin (original writer of DWARF code) git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@286 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src')
-rw-r--r--src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj170
-rw-r--r--src/client/mac/handler/obj-cTestCases-Info.plist20
-rw-r--r--src/client/mac/handler/testcases/dwarftests.h46
-rw-r--r--src/client/mac/handler/testcases/dwarftests.mm60
-rw-r--r--src/client/mac/handler/testcases/testdata/dump_syms_dwarf_databin0 -> 702795 bytes
-rw-r--r--src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym5161
-rw-r--r--src/common/mac/dump_syms.h21
-rw-r--r--src/common/mac/dump_syms.mm327
-rw-r--r--src/common/mac/dwarf/bytereader-inl.h141
-rw-r--r--src/common/mac/dwarf/bytereader.cc62
-rw-r--r--src/common/mac/dwarf/bytereader.h132
-rw-r--r--src/common/mac/dwarf/dwarf2enums.h490
-rw-r--r--src/common/mac/dwarf/dwarf2reader.cc830
-rw-r--r--src/common/mac/dwarf/dwarf2reader.h393
-rw-r--r--src/common/mac/dwarf/functioninfo.cc198
-rw-r--r--src/common/mac/dwarf/functioninfo.h175
-rw-r--r--src/common/mac/dwarf/line_state_machine.h61
-rw-r--r--src/common/mac/dwarf/types.h46
-rw-r--r--src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj20
-rw-r--r--src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj61
-rw-r--r--src/tools/mac/dump_syms/dump_syms_tool.mm142
21 files changed, 8525 insertions, 31 deletions
diff --git a/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj b/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj
index c0b09e8b..9a84a0e0 100644
--- a/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj
+++ b/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj
@@ -49,6 +49,18 @@
D2F6511E0BEF973600920385 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FC0BEF947200920385 /* macho_id.cc */; };
D2F6511F0BEF973900920385 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FE0BEF947200920385 /* macho_utilities.cc */; };
D2F651210BEF975400920385 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F6510C0BEF94EB00920385 /* macho_walker.cc */; };
+ F93A887D0E8B4C8C0026AF89 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F6510C0BEF94EB00920385 /* macho_walker.cc */; };
+ F93A887E0E8B4C8C0026AF89 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FC0BEF947200920385 /* macho_id.cc */; };
+ F93A887F0E8B4C8C0026AF89 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FE0BEF947200920385 /* macho_utilities.cc */; };
+ F93A88800E8B4C8C0026AF89 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FA0BEF947200920385 /* file_id.cc */; };
+ F93A88860E8B4C9A0026AF89 /* dwarftests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9721F310E8B07E800D7E813 /* dwarftests.mm */; };
+ F93A88870E8B4C9A0026AF89 /* dump_syms.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9721F390E8B0D0D00D7E813 /* dump_syms.mm */; };
+ F93A88880E8B4C9A0026AF89 /* bytereader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9721F760E8B0DC700D7E813 /* bytereader.cc */; };
+ F93A88890E8B4C9A0026AF89 /* dwarf2reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9721F770E8B0DC700D7E813 /* dwarf2reader.cc */; };
+ F93A888A0E8B4C9A0026AF89 /* functioninfo.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9721F780E8B0DC700D7E813 /* functioninfo.cc */; };
+ F93A888B0E8B4C9A0026AF89 /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = F9721FA80E8B0E4800D7E813 /* md5.c */; };
+ F9721F6C0E8B0D7000D7E813 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9721F6B0E8B0D7000D7E813 /* Cocoa.framework */; };
+ F9721FA20E8B0E2300D7E813 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */; };
F982089C0DB3280D0017AECA /* breakpad_nlist_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = F982089B0DB3280D0017AECA /* breakpad_nlist_test.cc */; };
F98208A30DB32CAE0017AECA /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; };
F9AE5B390DBFDBDB00505983 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F651070BEF949A00920385 /* dynamic_images.cc */; };
@@ -114,6 +126,18 @@
D2F6510D0BEF94EB00920385 /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_walker.h; path = ../../../common/mac/macho_walker.h; sourceTree = SOURCE_ROOT; };
F917C4F70E03265A00F86017 /* breakpad_exc_server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = breakpad_exc_server.c; sourceTree = "<group>"; };
F917C4F80E03265A00F86017 /* breakpad_exc_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_exc_server.h; sourceTree = "<group>"; };
+ F93A88750E8B4C700026AF89 /* octestcases.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = octestcases.octest; sourceTree = BUILT_PRODUCTS_DIR; };
+ F93A88760E8B4C700026AF89 /* obj-cTestCases-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "obj-cTestCases-Info.plist"; sourceTree = "<group>"; };
+ F9721F300E8B07E800D7E813 /* dwarftests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dwarftests.h; sourceTree = "<group>"; };
+ F9721F310E8B07E800D7E813 /* dwarftests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = dwarftests.mm; sourceTree = "<group>"; };
+ F9721F380E8B0CFC00D7E813 /* dump_syms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dump_syms.h; path = ../../../common/mac/dump_syms.h; sourceTree = SOURCE_ROOT; };
+ F9721F390E8B0D0D00D7E813 /* dump_syms.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = dump_syms.mm; path = ../../../common/mac/dump_syms.mm; sourceTree = SOURCE_ROOT; };
+ F9721F6B0E8B0D7000D7E813 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
+ F9721F760E8B0DC700D7E813 /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/mac/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; };
+ F9721F770E8B0DC700D7E813 /* dwarf2reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader.cc; path = ../../../common/mac/dwarf/dwarf2reader.cc; sourceTree = SOURCE_ROOT; };
+ F9721F780E8B0DC700D7E813 /* functioninfo.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = functioninfo.cc; path = ../../../common/mac/dwarf/functioninfo.cc; sourceTree = SOURCE_ROOT; };
+ F9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = /System/Library/Frameworks/SenTestingKit.framework; sourceTree = "<absolute>"; };
+ F9721FA80E8B0E4800D7E813 /* md5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = md5.c; path = ../../../common/md5.c; sourceTree = SOURCE_ROOT; };
F982089A0DB3280D0017AECA /* breakpad_nlist_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_nlist_test.h; sourceTree = "<group>"; };
F982089B0DB3280D0017AECA /* breakpad_nlist_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_test.cc; sourceTree = "<group>"; };
F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_64.cc; sourceTree = "<group>"; };
@@ -150,6 +174,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ F93A88720E8B4C700026AF89 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
F9AE19C00DB04A9500C98454 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@@ -161,6 +192,8 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ F9721F6C0E8B0D7000D7E813 /* Cocoa.framework in Frameworks */,
+ F9721FA20E8B0E2300D7E813 /* SenTestingKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -170,6 +203,12 @@
08FB7794FE84155DC02AAC07 /* MinidumpWriter */ = {
isa = PBXGroup;
children = (
+ F9721FA80E8B0E4800D7E813 /* md5.c */,
+ F9721F760E8B0DC700D7E813 /* bytereader.cc */,
+ F9721F770E8B0DC700D7E813 /* dwarf2reader.cc */,
+ F9721F780E8B0DC700D7E813 /* functioninfo.cc */,
+ F9721F390E8B0D0D00D7E813 /* dump_syms.mm */,
+ F9721F380E8B0CFC00D7E813 /* dump_syms.h */,
F917C4F70E03265A00F86017 /* breakpad_exc_server.c */,
F917C4F80E03265A00F86017 /* breakpad_exc_server.h */,
F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */,
@@ -191,6 +230,7 @@
1AB674ADFE9D54B511CA2CBB /* Products */,
F9AE19B50DB040E300C98454 /* minidump_tests32-Info.plist */,
F9AE5B340DBFDBA300505983 /* minidump_tests64-Info.plist */,
+ F93A88760E8B4C700026AF89 /* obj-cTestCases-Info.plist */,
);
name = MinidumpWriter;
sourceTree = "<group>";
@@ -213,6 +253,7 @@
9B7CA84E0B1297F200CD3A1D /* unit_test */,
F9AE19C30DB04A9500C98454 /* minidump_tests64.cptest */,
F9AE5B330DBFDBA300505983 /* minidump_tests32.cptest */,
+ F93A88750E8B4C700026AF89 /* octestcases.octest */,
);
name = Products;
sourceTree = "<group>";
@@ -220,6 +261,8 @@
9B37CEEA0AF98EB600FA4BD4 /* Frameworks */ = {
isa = PBXGroup;
children = (
+ F9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */,
+ F9721F6B0E8B0D7000D7E813 /* Cocoa.framework */,
9B37CEEB0AF98ECD00FA4BD4 /* CoreFoundation.framework */,
);
name = Frameworks;
@@ -252,6 +295,8 @@
F982089B0DB3280D0017AECA /* breakpad_nlist_test.cc */,
F9C5A4200DB82DD800209C76 /* DynamicImagesTests.h */,
F9C5A4210DB82DD800209C76 /* DynamicImagesTests.cc */,
+ F9721F300E8B07E800D7E813 /* dwarftests.h */,
+ F9721F310E8B07E800D7E813 /* dwarftests.mm */,
);
path = testcases;
sourceTree = "<group>";
@@ -309,6 +354,24 @@
productReference = 9BD82A9B0B00267E0055103E /* handler_test */;
productType = "com.apple.product-type.tool";
};
+ F93A88740E8B4C700026AF89 /* obj-c_TestCases */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = F93A88790E8B4C700026AF89 /* Build configuration list for PBXNativeTarget "obj-c_TestCases" */;
+ buildPhases = (
+ F93A88700E8B4C700026AF89 /* Resources */,
+ F93A88710E8B4C700026AF89 /* Sources */,
+ F93A88720E8B4C700026AF89 /* Frameworks */,
+ F93A88730E8B4C700026AF89 /* ShellScript */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "obj-c_TestCases";
+ productName = octestcases;
+ productReference = F93A88750E8B4C700026AF89 /* octestcases.octest */;
+ productType = "com.apple.product-type.bundle";
+ };
F9AE19C20DB04A9500C98454 /* minidump_tests64 */ = {
isa = PBXNativeTarget;
buildConfigurationList = F9AE19C70DB04AA200C98454 /* Build configuration list for PBXNativeTarget "minidump_tests64" */;
@@ -362,11 +425,19 @@
9B7CA84D0B1297F200CD3A1D /* unit_test */,
F9AE19C20DB04A9500C98454 /* minidump_tests64 */,
F9AE5B320DBFDBA300505983 /* minidump_tests32 */,
+ F93A88740E8B4C700026AF89 /* obj-c_TestCases */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
+ F93A88700E8B4C700026AF89 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
F9AE19BE0DB04A9500C98454 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@@ -384,6 +455,19 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
+ F93A88730E8B4C700026AF89 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n";
+ };
F9AE19C10DB04A9500C98454 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@@ -408,7 +492,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n";
+ shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n\n";
};
/* End PBXShellScriptBuildPhase section */
@@ -462,6 +546,23 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ F93A88710E8B4C700026AF89 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ F93A88860E8B4C9A0026AF89 /* dwarftests.mm in Sources */,
+ F93A88870E8B4C9A0026AF89 /* dump_syms.mm in Sources */,
+ F93A88880E8B4C9A0026AF89 /* bytereader.cc in Sources */,
+ F93A88890E8B4C9A0026AF89 /* dwarf2reader.cc in Sources */,
+ F93A888A0E8B4C9A0026AF89 /* functioninfo.cc in Sources */,
+ F93A888B0E8B4C9A0026AF89 /* md5.c in Sources */,
+ F93A887D0E8B4C8C0026AF89 /* macho_walker.cc in Sources */,
+ F93A887E0E8B4C8C0026AF89 /* macho_id.cc in Sources */,
+ F93A887F0E8B4C8C0026AF89 /* macho_utilities.cc in Sources */,
+ F93A88800E8B4C8C0026AF89 /* file_id.cc in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
F9AE19BF0DB04A9500C98454 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -614,6 +715,62 @@
};
name = Release;
};
+ F93A88770E8B4C700026AF89 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
+ GCC_CHAR_IS_UNSIGNED_CHAR = YES;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INFOPLIST_FILE = "obj-cTestCases-Info.plist";
+ INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
+ OTHER_LDFLAGS = (
+ "-lcrypto",
+ "-framework",
+ Cocoa,
+ "-framework",
+ SenTestingKit,
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = octestcases;
+ USER_HEADER_SEARCH_PATHS = "../../../..//**";
+ WRAPPER_EXTENSION = octest;
+ };
+ name = Debug;
+ };
+ F93A88780E8B4C700026AF89 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
+ GCC_CHAR_IS_UNSIGNED_CHAR = YES;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_MODEL_TUNING = G5;
+ INFOPLIST_FILE = "obj-cTestCases-Info.plist";
+ INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
+ OTHER_LDFLAGS = (
+ "-lcrypto",
+ "-framework",
+ Cocoa,
+ "-framework",
+ SenTestingKit,
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = octestcases;
+ USER_HEADER_SEARCH_PATHS = "../../../..//**";
+ WRAPPER_EXTENSION = octest;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
F9AE19C40DB04A9500C98454 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -697,6 +854,7 @@
Carbon,
"-framework",
CPlusTest,
+ "-lcrypto",
);
PREBINDING = NO;
PRODUCT_NAME = minidump_tests32;
@@ -719,6 +877,7 @@
INFOPLIST_FILE = "minidump_tests32-Info.plist";
INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
OTHER_LDFLAGS = (
+ "-lcrypto",
"-framework",
Carbon,
"-framework",
@@ -771,6 +930,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
+ F93A88790E8B4C700026AF89 /* Build configuration list for PBXNativeTarget "obj-c_TestCases" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ F93A88770E8B4C700026AF89 /* Debug */,
+ F93A88780E8B4C700026AF89 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
F9AE19C70DB04AA200C98454 /* Build configuration list for PBXNativeTarget "minidump_tests64" */ = {
isa = XCConfigurationList;
buildConfigurations = (
diff --git a/src/client/mac/handler/obj-cTestCases-Info.plist b/src/client/mac/handler/obj-cTestCases-Info.plist
new file mode 100644
index 00000000..65013556
--- /dev/null
+++ b/src/client/mac/handler/obj-cTestCases-Info.plist
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.yourcompany.${PRODUCT_NAME:identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>BNDL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+</dict>
+</plist>
diff --git a/src/client/mac/handler/testcases/dwarftests.h b/src/client/mac/handler/testcases/dwarftests.h
new file mode 100644
index 00000000..21ff7a44
--- /dev/null
+++ b/src/client/mac/handler/testcases/dwarftests.h
@@ -0,0 +1,46 @@
+// Copyright (c) 2008, 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.
+
+//
+// dwarftests.h
+// minidump_test
+//
+// Created by Neal Sidhwaney on 9/24/08.
+// Copyright 2008 Google Inc. All rights reserved.
+//
+
+#import <SenTestingKit/SenTestingKit.h>
+
+
+@interface dwarftests : SenTestCase {
+
+}
+
+- (void) testDWARFSymbolFileGeneration;
+
+@end
diff --git a/src/client/mac/handler/testcases/dwarftests.mm b/src/client/mac/handler/testcases/dwarftests.mm
new file mode 100644
index 00000000..40c69aff
--- /dev/null
+++ b/src/client/mac/handler/testcases/dwarftests.mm
@@ -0,0 +1,60 @@
+// Copyright (c) 2008, 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.
+
+//
+// dwarftests.m
+// minidump_test
+//
+// Created by Neal Sidhwaney on 9/24/08.
+// Copyright 2008 Google Inc. All rights reserved.
+//
+
+#import "dwarftests.h"
+#import "dump_syms.h"
+
+@implementation dwarftests
+- (void) testDWARFSymbolFileGeneration {
+ NSString *inputBreakpadSymbolFile = @"testcases/testdata/dump_syms_i386_breakpad.sym";
+ NSString *outputBreakpadSymbolFile = @"/tmp/dump_syms_i386.breakpad";
+
+ DumpSymbols *dump = [[DumpSymbols alloc] initWithContentsOfFile:@"testcases/testdata/dump_syms_dwarf_data"];
+
+ STAssertNotNil(dump, @"DumpSymbols is nil");
+ [dump setArchitecture:@"i386"];
+ [dump writeSymbolFile:outputBreakpadSymbolFile];
+
+ NSData *d = [[NSData alloc] initWithContentsOfFile:inputBreakpadSymbolFile];
+ STAssertNotNil(d, @"Input breakpad symbol file not found");
+
+ NSData *d1 = [[NSData alloc] initWithContentsOfFile:outputBreakpadSymbolFile];
+ STAssertNotNil(d1, @"Output breakpad symbol file not found");
+
+ STAssertTrue([d isEqualToData:d1],
+ @"Symbol files were not equal!",nil);
+}
+@end
diff --git a/src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data b/src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data
new file mode 100644
index 00000000..5be17aee
--- /dev/null
+++ b/src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data
Binary files differ
diff --git a/src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym b/src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym
new file mode 100644
index 00000000..ebd8281f
--- /dev/null
+++ b/src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym
@@ -0,0 +1,5161 @@
+MODULE mac x86 94BF873C47A73BC07125291390B4C5F10 dump_syms_dwarf_data
+FILE 1 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/libkern/i386/OSByteOrder.h
+FILE 2 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/architecture/byte_order.h
+FILE 3 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/dump_syms.mm
+FILE 4 /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSRange.h
+FILE 5 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/new
+FILE 6 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/hash_fun.h
+FILE 7 ../../../common/mac/dwarf/dwarf2reader.h
+FILE 8 ../../../common/mac/file_id.h
+FILE 9 ../../../common/mac/dwarf/functioninfo.h
+FILE 10 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_tree.h
+FILE 11 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_iterator.h
+FILE 12 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/hashtable.h
+FILE 13 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_pair.h
+FILE 14 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/new_allocator.h
+FILE 15 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/allocator.h
+FILE 16 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_vector.h
+FILE 17 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h
+FILE 18 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h
+FILE 19 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_algo.h
+FILE 20 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_map.h
+FILE 21 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_construct.h
+FILE 22 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_function.h
+FILE 23 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/hash_map
+FILE 24 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/basic_string.h
+FILE 25 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_algobase.h
+FILE 26 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_list.h
+FILE 27 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/list.tcc
+FILE 28 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_uninitialized.h
+FILE 29 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/vector.tcc
+FILE 30 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/dwarf/functioninfo.cc
+FILE 31 ../../../common/mac/dwarf/dwarf2reader.h
+FILE 32 ../../../common/mac/dwarf/functioninfo.h
+FILE 33 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_pair.h
+FILE 34 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/hashtable.h
+FILE 35 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/memory
+FILE 36 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/new_allocator.h
+FILE 37 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/basic_string.h
+FILE 38 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_iterator.h
+FILE 39 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_vector.h
+FILE 40 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_tree.h
+FILE 41 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_function.h
+FILE 42 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/hash_map
+FILE 43 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_construct.h
+FILE 44 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_algobase.h
+FILE 45 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_map.h
+FILE 46 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_uninitialized.h
+FILE 47 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/vector.tcc
+FILE 48 /g/code/breakpad-staging/src/tools/mac/dump_syms/dump_syms_tool.mm
+FILE 49 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/file_id.cc
+FILE 50 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/architecture/byte_order.h
+FILE 51 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/macho_id.cc
+FILE 52 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/libkern/i386/OSByteOrder.h
+FILE 53 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/architecture/byte_order.h
+FILE 54 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/macho_walker.cc
+FILE 55 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/libkern/i386/OSByteOrder.h
+FILE 56 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/architecture/byte_order.h
+FILE 57 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/macho_utilities.cc
+FILE 58 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/dwarf/bytereader.cc
+FILE 59 ../../../common/mac/dwarf/bytereader-inl.h
+FILE 60 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/dwarf/dwarf2reader.cc
+FILE 61 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_algobase.h
+FILE 62 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_deque.h
+FILE 63 ../../../common/mac/dwarf/bytereader.h
+FILE 64 ../../../common/mac/dwarf/bytereader-inl.h
+FILE 65 ../../../common/mac/dwarf/line_state_machine.h
+FILE 66 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_list.h
+FILE 67 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/memory
+FILE 68 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/new_allocator.h
+FILE 69 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/allocator.h
+FILE 70 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_pair.h
+FILE 71 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_vector.h
+FILE 72 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_iterator.h
+FILE 73 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_construct.h
+FILE 74 ../../../common/mac/dwarf/dwarf2reader.h
+FILE 75 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_stack.h
+FILE 76 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/deque.tcc
+FILE 77 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/list.tcc
+FILE 78 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/vector.tcc
+FILE 79 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_uninitialized.h
+FILE 80 /var/tmp/gcc/gcc-5484~1/src/gcc/libgcc2.c
+FUNC 162a 28 0 _OSSwapInt16
+162a 10 44 1
+163a 16 46 1
+1650 2 47 1
+FUNC 1652 1c 0 _OSSwapInt32
+1652 f 53 1
+1661 8 55 1
+1669 3 56 1
+166c 2 57 1
+FUNC 166e 2b 0 _OSSwapInt64
+166e 12 64 1
+1680 11 69 1
+1691 6 70 1
+1697 2 71 1
+1699 1 71 1
+FUNC 169a 1e 0 NXSwapShort
+169a 10 43 2
+16aa c 45 2
+16b6 2 46 2
+FUNC 16b8 19 0 NXSwapInt
+16b8 f 52 2
+16c7 8 54 2
+16cf 2 55 2
+16d1 1 55 2
+FUNC 16d2 19 0 NXSwapLong
+16d2 f 61 2
+16e1 8 63 2
+16e9 2 64 2
+16eb 1 64 2
+FUNC 16ec 1f 0 NXSwapLongLong
+16ec 12 70 2
+16fe b 72 2
+1709 2 73 2
+170b 1 73 2
+FUNC 170c 181 0 -[DumpSymbols convertCPlusPlusSymbols:]
+170c 14 128 3
+1720 54 130 3
+1774 f 132 3
+1783 7 133 3
+178a 1a 136 3
+17a4 5 138 3
+17a9 1a 139 3
+17c3 23 140 3
+17e6 7 141 3
+17ed 44 142 3
+1831 1e 145 3
+184f 29 138 3
+1878 b 148 3
+1883 3 150 3
+1886 7 151 3
+188d 1 151 3
+FUNC 188e 323 0 -[DumpSymbols convertSymbols]
+188e 14 154 3
+18a2 1f 155 3
+18c1 3e 156 3
+18ff 2b 160 3
+192a c 162 3
+1936 43 164 3
+1979 2a 165 3
+19a3 20 168 3
+19c3 d 169 3
+19d0 1e 171 3
+19ee 11 162 3
+19ff 7 181 3
+1a06 6 182 3
+1a0c 5 184 3
+1a11 15 185 3
+1a26 6 18 4
+1a2c 6 19 4
+1a32 6 20 4
+1a38 6 185 4
+1a3e 28 186 4
+1a66 21 187 4
+1a87 1a 188 4
+1aa1 a 190 4
+1aab c 194 4
+1ab7 43 198 4
+1afa 21 199 4
+1b1b 20 202 4
+1b3b 2e 203 4
+1b69 1e 194 4
+1b87 c 184 4
+1b93 17 207 4
+1baa 7 208 4
+1bb1 1 208 4
+FUNC 1bb2 4a2 0 -[DumpSymbols addFunction:line:address:section:]
+1bb2 21 211 4
+1bd3 2f 212 4
+1c02 e 214 4
+1c10 4 219 4
+1c14 2a 221 4
+1c3e 22 223 4
+1c60 6 224 4
+1c66 2a 225 4
+1c90 4 226 4
+1c94 2e 230 4
+1cc2 2e 233 4
+1cf0 2e 236 4
+1d1e a 239 4
+1d28 2b 253 4
+1d53 e 254 4
+1d61 3c 255 4
+1d9d 22 32 4
+1dbf 3 256 4
+1dc2 6 259 4
+1dc8 a 260 4
+1dd2 3c 261 4
+1e0e 25 262 4
+1e33 2a 263 4
+1e5d 22 265 4
+1e7f 26 270 4
+1ea5 6 272 4
+1eab 37 273 4
+1ee2 2a 274 4
+1f0c 17 275 4
+1f23 43 278 4
+1f66 2e 279 4
+1f94 23 282 4
+1fb7 43 285 4
+1ffa 52 287 4
+204c 8 289 4
+FUNC 2054 5a4 0 -[DumpSymbols processSymbolItem:stringTable:]
+2054 18 292 4
+206c 8 293 4
+2074 4 294 4
+2078 16 297 4
+208e c 298 4
+209a f 300 4
+20a9 b 301 4
+20b4 16 303 4
+20ca 4d 309 4
+2117 38 311 4
+214f 30 315 4
+217f 60 317 4
+21df d 322 4
+21ec 2b 325 4
+2217 3a 327 4
+2251 f 332 4
+2260 2d 333 4
+228d 1a 334 4
+22a7 32 335 4
+22d9 20 342 4
+22f9 c 343 4
+2305 24 348 4
+2329 a 349 4
+2333 3c 350 4
+236f 2a 352 4
+2399 1c 353 4
+23b5 9 354 4
+23be f 356 4
+23cd 2d 357 4
+23fa 2f 358 4
+2429 20 360 4
+2449 c 361 4
+2455 7 363 4
+245c 21 365 4
+247d 4a 368 4
+24c7 9 370 4
+24d0 1a 371 4
+24ea 4b 372 4
+2535 4 373 4
+2539 5 371 4
+253e 29 374 4
+2567 2d 376 4
+2594 4b 378 4
+25df 4 379 4
+25e3 a 382 4
+25ed b 383 4
+FUNC 25f8 c9 0 -[DumpSymbols loadSymbolInfo:offset:]
+25f8 13 391 4
+260b 2b 392 4
+2636 2a 393 4
+2660 2d 395 4
+268d 2e 398 4
+26bb 6 399 4
+26c1 1 399 4
+FUNC 26c2 2be 0 -[DumpSymbols loadSTABSSymbolInfo:offset:]
+26c2 16 537 4
+26d8 9 538 4
+26e1 10 539 4
+26f1 2e 540 4
+271f 9 542 4
+2728 22 543 4
+274a 4 544 4
+274e a 546 4
+2758 3c 547 4
+2794 c 549 4
+27a0 e 550 4
+27ae 6 551 4
+27b4 25 552 4
+27d9 25 553 4
+27fe 25 554 4
+2823 c 555 4
+282f c 556 4
+283b c 559 4
+2847 23 562 4
+286a a 563 4
+2874 a 564 4
+287e 2e 565 4
+28ac 39 566 4
+28e5 2e 570 4
+2913 4 571 4
+2917 17 559 4
+292e 25 575 4
+2953 9 576 4
+295c 17 549 4
+2973 4 579 4
+2977 9 580 4
+FUNC 2980 28a 0 -[DumpSymbols loadSymbolInfo64:offset:]
+2980 16 583 4
+2996 9 585 4
+299f 10 586 4
+29af 2e 587 4
+29dd 9 589 4
+29e6 22 590 4
+2a08 4 591 4
+2a0c c 593 4
+2a18 e 594 4
+2a26 6 595 4
+2a2c 25 596 4
+2a51 25 597 4
+2a76 25 598 4
+2a9b 9 599 4
+2aa4 c 600 4
+2ab0 c 603 4
+2abc 17 604 4
+2ad3 23 609 4
+2af6 a 610 4
+2b00 a 611 4
+2b0a 2e 612 4
+2b38 37 613 4
+2b6f 2e 615 4
+2b9d 4 616 4
+2ba1 17 603 4
+2bb8 25 620 4
+2bdd 9 621 4
+2be6 17 593 4
+2bfd 4 624 4
+2c01 9 625 4
+FUNC 2c0a 199 0 -[DumpSymbols loadSymbolInfoForArchitecture]
+2c0a 13 628 4
+2c1d 41 630 4
+2c5e 2b 631 4
+2c89 1a 632 4
+2ca3 40 634 4
+2ce3 40 635 4
+2d23 5f 637 4
+2d82 17 639 4
+2d99 4 640 4
+2d9d 6 641 4
+2da3 1 641 4
+FUNC 2da4 3e5 0 -[DumpSymbols loadHeader:offset:]
+2da4 18 728 4
+2dbc 9 729 4
+2dc5 10 730 4
+2dd5 2e 731 4
+2e03 9 733 4
+2e0c 2b 734 4
+2e37 1e 736 4
+2e55 c 738 4
+2e61 e 739 4
+2e6f 6 740 4
+2e75 50 742 4
+2ec5 2e 743 4
+2ef3 2e 744 4
+2f21 2e 745 4
+2f4f 20 746 4
+2f6f 1b7 755 4
+3126 9 757 4
+312f 25 761 4
+3154 9 762 4
+315d 17 738 4
+3174 a 765 4
+317e b 766 4
+3189 1 766 4
+FUNC 318a 41d 0 -[DumpSymbols loadHeader64:offset:]
+318a 18 769 4
+31a2 9 771 4
+31ab 10 772 4
+31bb 2e 773 4
+31e9 9 775 4
+31f2 c 777 4
+31fe 2b 778 4
+3229 e 779 4
+3237 6 780 4
+323d 50 781 4
+328d 49 782 4
+32d6 49 783 4
+331f 2e 784 4
+334d 9 785 4
+3356 29 786 4
+337f 1c5 794 4
+3544 9 795 4
+354d 25 799 4
+3572 9 800 4
+357b 17 777 4
+3592 a 803 4
+359c b 804 4
+35a7 1 804 4
+FUNC 35a8 52a 0 -[DumpSymbols loadModuleInfo]
+35a8 14 807 4
+35bc e 808 4
+35ca 41 810 4
+360b 1a 811 4
+3625 6 812 4
+362b 6 814 4
+3631 17 815 4
+3648 c 816 4
+3654 29 820 4
+367d 29 821 4
+36a6 29 822 4
+36cf 35 824 4
+3704 12 826 4
+3716 17 827 4
+372d c 828 4
+3739 3c 832 4
+3775 a 834 4
+377f 9 836 4
+3788 25 837 4
+37ad c 839 4
+37b9 54 840 4
+380d 57 841 4
+3864 57 842 4
+38bb 57 843 4
+3912 57 844 4
+3969 1c 846 4
+3985 4b 847 4
+39d0 49 849 4
+3a19 13 839 4
+3a2c 6 851 4
+3a32 3c 852 4
+3a6e 3a 854 4
+3aa8 17 857 4
+3abf c 858 4
+3acb 7 859 4
+FUNC 3ad2 b6 0 WriteFormat
+3ad2 10 862 4
+3ae2 6 867 4
+3ae8 24 868 4
+3b0c 27 869 4
+3b33 40 870 4
+3b73 c 873 4
+3b7f 9 874 4
+FUNC 3b88 35 0 -[DumpSymbols availableArchitectures]
+3b88 13 1140 4
+3b9b 1c 1141 4
+3bb7 6 1142 4
+3bbd 1 1142 4
+FUNC 3bbe 1b4 0 -[DumpSymbols setArchitecture:]
+3bbe 13 1158 4
+3bd1 1a 1159 4
+3beb 4 1160 4
+3bef 2a 1162 4
+3c19 9 1163 4
+3c22 2a 1165 4
+3c4c 9 1166 4
+3c55 9 1167 4
+3c5e 2a 1169 4
+3c88 6 1170 4
+3c8e 2a 1172 4
+3cb8 6 1173 4
+3cbe 2a 1175 4
+3ce8 4 1176 4
+3cec 6 1179 4
+3cf2 2c 1180 4
+3d1e 9 1181 4
+3d27 1c 1183 4
+3d43 1f 1184 4
+3d62 a 1187 4
+3d6c 6 1188 4
+FUNC 3d72 14 0 -[DumpSymbols architecture]
+3d72 c 1191 4
+3d7e 6 1192 4
+3d84 2 1193 4
+FUNC 3d86 e7 0 -[DumpSymbols writeSymbolFile:]
+3d86 13 1196 4
+3d99 1a 1197 4
+3db3 48 1200 4
+3dfb 9 1201 4
+3e04 1e 1203 4
+3e22 6 1205 4
+3e28 9 1206 4
+3e31 21 1208 4
+3e52 b 1210 4
+3e5d a 1212 4
+3e67 6 1213 4
+3e6d 1 1213 4
+FUNC 3e6e 65 0 -[MachSection initWithMachSection:andNumber:]
+3e6e 13 1219 4
+3e81 37 1220 4
+3eb8 9 1221 4
+3ec1 9 1222 4
+3eca 3 1225 4
+3ecd 6 1226 4
+3ed3 1 1226 4
+FUNC 3ed4 14 0 -[MachSection sectionPointer]
+3ed4 c 1228 4
+3ee0 6 1229 4
+3ee6 2 1230 4
+FUNC 3ee8 14 0 -[MachSection sectionNumber]
+3ee8 c 1232 4
+3ef4 6 1233 4
+3efa 2 1234 4
+FUNC 3efc 17c 0 -[DumpSymbols processDWARFSourceFileInfo:]
+3efc 14 459 4
+3f10 a 460 4
+3f1a 3c 461 4
+3f56 20 463 4
+3f76 5 464 4
+3f7b 3a 465 4
+3fb5 1d 466 4
+3fd2 3a 467 4
+400c 2a 468 4
+4036 3b 464 4
+4071 7 471 4
+FUNC 4078 1d7 0 DumpFunctionMap
+4078 15 82 4
+408d 13 83 4
+40a0 1e 85 4
+40be 42 89 4
+4100 20 90 4
+4120 2b 91 4
+414b 1a 92 4
+4165 23 93 4
+4188 46 96 4
+41ce 46 99 4
+4214 33 83 4
+4247 8 102 4
+424f 1 102 4
+FUNC 4250 3ef 0 -[DumpSymbols processDWARFFunctionInfo:]
+4250 15 473 4
+4265 25 474 4
+428a 1e 476 4
+42a8 a 480 4
+42b2 3c 481 4
+42ee 3d 483 4
+432b 23 485 4
+434e 26 487 4
+4374 6 489 4
+437a 37 490 4
+43b1 2a 491 4
+43db 17 492 4
+43f2 30 496 4
+4422 3d 497 4
+445f 2e 498 4
+448d 30 502 4
+44bd 64 504 4
+4521 34 507 4
+4555 9d 509 4
+45f2 45 474 4
+4637 8 513 4
+463f 1 513 4
+FUNC 4640 1f5 0 -[DumpSymbols processDWARFLineNumberInfo:]
+4640 15 515 4
+4655 25 516 4
+467a 39 520 4
+46b3 26 521 4
+46d9 6 523 4
+46df 37 524 4
+4716 2a 525 4
+4740 17 526 4
+4757 30 529 4
+4787 61 531 4
+47e8 45 516 4
+482d 8 534 4
+4835 1 534 4
+FUNC 4836 10f 0 -[DumpSymbols dealloc]
+4836 13 1145 4
+4849 1c 1146 4
+4865 1c 1147 4
+4881 1c 1148 4
+489d 1c 1149 4
+48b9 1c 1150 4
+48d5 1c 1151 4
+48f1 25 1152 4
+4916 29 1154 4
+493f 6 1155 4
+4945 1 1155 4
+FUNC 4946 512 0 -[DumpSymbols loadDWARFSymbolInfo:offset:]
+4946 17 402 4
+495d 9 405 4
+4966 10 406 4
+4976 2b 408 4
+49a1 38 409 4
+49d9 3a 410 4
+4a13 2e 411 4
+4a41 31 416 4
+4a72 e 418 4
+4a80 24 420 4
+4aa4 5 422 4
+4aa9 b 424 4
+4ab4 b 425 4
+4abf e 426 4
+4acd 2b 427 4
+4af8 2b 428 4
+4b23 2c 431 4
+4b4f 52 439 4
+4ba1 34 444 4
+4bd5 1a 446 4
+4bef 21 451 4
+4c10 1e 452 4
+4c2e 21 453 4
+4c4f 40 422 4
+4c8f 6 453 4
+4c95 170 422 4
+4e05 43 456 4
+4e48 10 457 4
+FUNC 4e58 4fd 0 -[DumpSymbols generateSectionDictionary:]
+4e58 18 663 4
+4e70 10 665 4
+4e80 2e 666 4
+4eae 9 668 4
+4eb7 2b 669 4
+4ee2 7 670 4
+4ee9 2e 672 4
+4f17 d 676 4
+4f24 32 678 4
+4f56 29 680 4
+4f7f a 684 4
+4f89 3c 685 4
+4fc5 31 688 4
+4ff6 5d 689 4
+5053 26 692 4
+5079 21 694 4
+509a c 698 4
+50a6 e 699 4
+50b4 6 700 4
+50ba 9 701 4
+50c3 2e 702 4
+50f1 c 704 4
+50fd 3c 706 4
+5139 66 709 4
+519f 1c 712 4
+51bb fb 714 4
+52b6 6 717 4
+52bc 5 718 4
+52c1 19 704 4
+52da 25 714 4
+52ff 2e 722 4
+532d 9 723 4
+5336 17 698 4
+534d 8 725 4
+5355 1 725 4
+FUNC 5356 24a 0 -[DumpSymbols getSectionMapForArchitecture:]
+5356 14 643 4
+536a 43 645 4
+53ad 1a 648 4
+53c7 1c 645 4
+53e3 18 648 4
+53fb 40 650 4
+543b 20 651 4
+545b 17 652 4
+5472 16 651 4
+5488 cb 652 4
+5553 11 654 4
+5564 32 657 4
+5596 a 658 4
+FUNC 55a0 3fe 0 -[DumpSymbols initWithContentsOfFile:]
+55a0 14 1056 4
+55b4 3b 1057 4
+55ef 44 1059 4
+5633 17 1060 4
+564a c 1061 4
+5656 1f 1064 4
+5675 2b 1067 4
+56a0 a 1069 4
+56aa 35 1083 4
+56df 2 1087 4
+56e1 1a 1088 4
+56fb 3d 1087 4
+5738 33 1092 4
+576b 6 1094 4
+5771 e 1095 4
+577f 17 1096 4
+5796 c 1097 4
+57a2 1c 1101 4
+57be 1f 1103 4
+57dd 18 1104 4
+57f5 23 1107 4
+5818 25 1109 4
+583d 1c 1107 4
+5859 17 1110 4
+5870 c 1111 4
+587c 2a 1115 4
+58a6 8 1116 4
+58ae a 1118 4
+58b8 9 1119 4
+58c1 d 1122 4
+58ce 29 1124 4
+58f7 20 1126 4
+5917 20 1128 4
+5937 57 1132 4
+598e 9 1136 4
+5997 7 1137 4
+FUNC 599e d74 0 -[DumpSymbols outputSymbolFile:]
+599e 18 877 4
+59b6 2e 879 4
+59e4 30 880 4
+5a14 5d 882 4
+5a71 30 883 4
+5aa1 5d 885 4
+5afe 2e 888 4
+5b2c 38 891 4
+5b64 46 892 4
+5baa 26 893 4
+5bd0 20 895 4
+5bf0 20 904 4
+5c10 30 898 4
+5c40 f 899 4
+5c4f 1e 904 4
+5c6d 17 907 4
+5c84 17 908 4
+5c9b 44 911 4
+5cdf 44 914 4
+5d23 a 917 4
+5d2d 36 921 4
+5d63 30 923 4
+5d93 9 18 4
+5d9c 9 19 4
+5da5 c 20 4
+5db1 56 923 4
+5e07 74 925 4
+5e7b f 927 4
+5e8a 44 932 4
+5ece 20 933 4
+5eee c 934 4
+5efa 4e 935 4
+5f48 41 936 4
+5f89 f 937 4
+5f98 14 934 4
+5fac 7 941 4
+5fb3 14 942 4
+5fc7 14 943 4
+5fdb 1d 946 4
+5ff8 c 948 4
+6004 24 949 4
+6028 29 950 4
+6051 9 953 4
+605a 28 954 4
+6082 2e 955 4
+60b0 1e 957 4
+60ce 7 959 4
+60d5 26 962 4
+60fb 2a 963 4
+6125 2a 964 4
+614f 6 966 4
+6155 2a 967 4
+617f e 971 4
+618d 43 972 4
+61d0 4c 974 4
+621c 8 975 4
+6224 2e 979 4
+6252 2e 982 4
+6280 2e 985 4
+62ae 2e 988 4
+62dc 2e 991 4
+630a 2e 994 4
+6338 2e 997 4
+6366 2e 1000 4
+6394 54 1004 4
+63e8 c 1005 4
+63f4 e 1007 4
+6402 27 1008 4
+6429 8 1009 4
+6431 34 1010 4
+6465 24 1012 4
+6489 2 1013 4
+648b 2a 1017 4
+64b5 a 1019 4
+64bf 14 1020 4
+64d3 1d 1021 4
+64f0 a 1025 4
+64fa 32 1026 4
+652c 33 1028 4
+655f c 1029 4
+656b 55 1034 4
+65c0 f 1036 4
+65cf 16 1040 4
+65e5 61 1041 4
+6646 f 1043 4
+6655 47 1046 4
+669c c 1048 4
+66a8 11 948 4
+66b9 4e 1052 4
+6707 b 1053 4
+FUNC 6712 11 0 operator new
+6712 c 94 5
+671e 5 94 5
+6723 1 94 5
+FUNC 6724 e 0 operator delete
+6724 c 98 5
+6730 2 98 5
+6732 c 74 6
+673e 7 76 6
+6745 2 77 6
+6747 1a 78 6
+6761 d 77 6
+676e 3 79 6
+6771 2 80 6
+6773 1 80 6
+6774 c 94 6
+6780 d 95 6
+678d 1 95 6
+678e 13 127 7
+67a1 2a 127 7
+67cb 1 127 7
+67cc 13 127 7
+67df 2a 127 7
+6809 1 127 7
+680a 13 127 7
+681d 2a 127 7
+6847 1 127 7
+6848 c 131 7
+6854 2 131 7
+6856 24 142 7
+687a 2 142 7
+687c 18 150 7
+6894 2 150 7
+6896 12 299 7
+68a8 12 299 7
+68ba 13 301 7
+68cd 2a 301 7
+68f7 1 301 7
+68f8 13 301 7
+690b 2a 301 7
+6935 1 301 7
+6936 13 301 7
+6949 2a 301 7
+6973 1 301 7
+6974 39 308 7
+69ad b 308 7
+69b8 18 314 7
+69d0 7 314 7
+69d7 1 314 7
+69d8 24 323 7
+69fc 2 323 7
+69fe 24 332 7
+6a22 2 332 7
+6a24 24 345 7
+6a48 2 345 7
+6a4a 18 354 7
+6a62 2 354 7
+6a64 18 360 7
+6a7c 2 360 7
+6a7e c 44 8
+6a8a 2 44 8
+6a8c 13 55 9
+6a9f 35 55 9
+6ad4 13 91 9
+6ae7 73 96 9
+6b5a 13 98 9
+6b6d 35 98 9
+6ba2 c 74 9
+6bae 1a 75 9
+6bc8 2 76 9
+6bca c 287 10
+6bd6 14 288 10
+6bea c 249 10
+6bf6 a 250 10
+6c00 c 613 11
+6c0c 7 614 11
+6c13 1 614 11
+6c14 c 241 11
+6c20 c 242 11
+6c2c c 245 11
+6c38 a 246 11
+6c42 c 241 11
+6c4e c 242 11
+6c5a c 287 11
+6c66 14 288 11
+6c7a c 249 11
+6c86 a 250 11
+6c90 c 185 12
+6c9c 18 186 12
+6cb4 c 203 12
+6cc0 14 204 12
+6cd4 c 69 13
+6ce0 d 69 13
+6ced 1 69 13
+6cee c 89 13
+6cfa 20 90 13
+6d1a c 69 13
+6d26 d 69 13
+6d33 1 69 13
+6d34 c 69 13
+6d40 d 69 13
+6d4d 1 69 13
+6d4e c 253 13
+6d5a 14 255 13
+6d6e 5 256 13
+6d73 1 256 13
+6d74 c 253 13
+6d80 14 255 13
+6d94 5 256 13
+6d99 1 256 13
+6d9a c 461 13
+6da6 8 462 13
+6dae c 461 13
+6dba 8 462 13
+6dc2 c 65 14
+6dce 2 65 14
+6dd0 c 72 14
+6ddc 2 72 14
+6dde c 97 15
+6dea d 97 15
+6df7 1 97 15
+6df8 c 105 15
+6e04 d 105 15
+6e11 1 105 15
+6e12 c 105 15
+6e1e d 105 15
+6e2b 1 105 15
+6e2c c 67 15
+6e38 2 67 15
+6e3a c 99 15
+6e46 14 100 15
+6e5a c 99 15
+6e66 14 100 15
+6e7a 10 93 16
+6e8a 1b 94 16
+6ea5 1 94 16
+6ea6 c 65 16
+6eb2 2 65 16
+6eb4 c 72 16
+6ec0 2 72 16
+6ec2 c 97 16
+6ece d 97 16
+6edb 1 97 16
+6edc c 105 16
+6ee8 d 105 16
+6ef5 1 105 16
+6ef6 c 105 16
+6f02 d 105 16
+6f0f 1 105 16
+6f10 c 67 16
+6f1c 2 67 16
+6f1e c 99 16
+6f2a 14 100 16
+6f3e c 99 16
+6f4a 14 100 16
+6f5e 10 93 16
+6f6e 1b 94 16
+6f89 1 94 16
+6f8a c 603 16
+6f96 c 603 16
+6fa2 c 333 16
+6fae 17 334 16
+6fc5 1 334 16
+6fc6 c 351 16
+6fd2 1a 352 16
+6fec c 665 16
+6ff8 5 666 16
+6ffd 1 666 16
+6ffe c 608 16
+700a 14 609 16
+701e c 665 16
+702a 5 666 16
+702f 1 666 16
+7030 d 693 16
+703d 28 694 16
+7065 1 694 16
+7066 c 603 16
+7072 c 603 16
+707e c 628 16
+708a 27 629 16
+70b1 1 629 16
+70b2 c 84 16
+70be 1f 85 16
+70dd 1 85 16
+70de 10 144 16
+70ee 22 145 16
+7110 c 189 16
+711c a 190 16
+7126 c 193 16
+7132 d 194 16
+713f 1 194 16
+7140 c 84 16
+714c 17 85 16
+7163 1 85 16
+7164 c 144 16
+7170 21 145 16
+7191 1 145 16
+7192 c 84 16
+719e 1d 85 16
+71bb 1 85 16
+71bc 10 144 16
+71cc 20 145 16
+71ec c 89 16
+71f8 20 90 16
+7218 d 89 16
+7225 70 90 16
+7295 1 90 16
+7296 c 164 17
+72a2 6 165 17
+72a8 c 92 18
+72b4 11 97 18
+72c5 1 97 18
+72c6 c 114 18
+72d2 27 118 18
+72f9 1 118 18
+72fa c 150 18
+7306 14 155 18
+731a c 172 18
+7326 27 175 18
+734d 1 175 18
+734e c 2625 19
+735a 15 2642 19
+736f 2 2646 19
+7371 8 2648 19
+7379 6 2649 19
+737f 12 2650 19
+7391 e 2651 19
+739f 6 2653 19
+73a5 4 2654 19
+73a9 e 2655 19
+73b7 6 2658 19
+73bd 6 2646 19
+73c3 5 2660 19
+73c8 13 225 19
+73db b 227 19
+73e6 e 228 19
+73f4 1c 229 19
+7410 20 230 19
+7430 6 231 19
+7436 c 72 19
+7442 2 72 19
+7444 c 105 19
+7450 d 105 19
+745d 1 105 19
+745e c 105 19
+746a d 105 19
+7477 1 105 19
+7478 c 80 19
+7484 d 80 19
+7491 1 80 19
+7492 c 67 19
+749e 2 67 19
+74a0 c 99 19
+74ac 14 100 19
+74c0 10 93 19
+74d0 1b 94 19
+74eb 1 94 19
+74ec c 238 19
+74f8 a 239 19
+7502 c 585 19
+750e 1a 588 19
+7528 c 243 20
+7534 d 244 20
+7541 1 244 20
+7542 c 596 20
+754e 1a 597 20
+7568 c 260 20
+7574 d 261 20
+7581 1 261 20
+7582 c 65 20
+758e 2 65 20
+7590 c 72 20
+759c 2 72 20
+759e c 97 20
+75aa d 97 20
+75b7 1 97 20
+75b8 c 105 20
+75c4 d 105 20
+75d1 1 105 20
+75d2 c 72 20
+75de 2 72 20
+75e0 c 105 20
+75ec d 105 20
+75f9 1 105 20
+75fa c 397 20
+7606 d 397 20
+7613 1 397 20
+7614 c 105 20
+7620 d 105 20
+762d 1 105 20
+762e c 496 20
+763a 8 497 20
+7642 c 488 20
+764e 8 489 20
+7656 c 65 20
+7662 2 65 20
+7664 c 72 20
+7670 2 72 20
+7672 c 97 20
+767e d 97 20
+768b 1 97 20
+768c c 105 20
+7698 d 105 20
+76a5 1 105 20
+76a6 c 72 20
+76b2 2 72 20
+76b4 c 105 20
+76c0 d 105 20
+76cd 1 105 20
+76ce c 397 20
+76da d 397 20
+76e7 1 397 20
+76e8 c 105 20
+76f4 d 105 20
+7701 1 105 20
+7702 c 496 20
+770e 8 497 20
+7716 c 488 20
+7722 8 489 20
+772a c 84 20
+7736 2f 85 20
+7765 2 86 20
+7767 1 86 20
+7768 c 80 20
+7774 d 80 20
+7781 1 80 20
+7782 c 96 20
+778e 12 97 20
+77a0 2 98 20
+77a2 c 84 20
+77ae 2f 85 20
+77dd 2 86 20
+77df 1 86 20
+77e0 c 80 20
+77ec d 80 20
+77f9 1 80 20
+77fa c 96 20
+7806 12 97 20
+7818 2 98 20
+781a c 107 20
+7826 d 107 20
+7833 1 107 20
+7834 c 171 21
+7840 2 173 21
+7842 12 174 21
+7854 c 173 21
+7860 2 174 21
+7862 c 167 21
+786e a 168 21
+7878 c 581 21
+7884 1a 582 21
+789e c 234 21
+78aa d 235 21
+78b7 1 235 21
+78b8 c 592 21
+78c4 1a 593 21
+78de c 251 21
+78ea d 252 21
+78f7 1 252 21
+78f8 c 167 21
+7904 a 168 21
+790e c 581 21
+791a 1a 582 21
+7934 c 234 21
+7940 d 235 21
+794d 1 235 21
+794e c 592 21
+795a 1a 593 21
+7974 c 251 21
+7980 d 252 21
+798d 1 252 21
+798e c 546 22
+799a 5 547 22
+799f 1 547 22
+79a0 c 128 22
+79ac 13 129 22
+79bf 1 129 22
+79c0 c 395 22
+79cc 22 396 22
+79ee c 198 23
+79fa d 199 23
+7a07 1 199 23
+7a08 c 65 23
+7a14 2 65 23
+7a16 c 72 23
+7a22 2 72 23
+7a24 c 97 23
+7a30 d 97 23
+7a3d 1 97 23
+7a3e c 105 23
+7a4a d 105 23
+7a57 1 105 23
+7a58 c 65 23
+7a64 2 65 23
+7a66 c 72 23
+7a72 2 72 23
+7a74 c 105 23
+7a80 d 105 23
+7a8d 1 105 23
+7a8e c 97 23
+7a9a d 97 23
+7aa7 1 97 23
+7aa8 c 72 23
+7ab4 2 72 23
+7ab6 c 105 23
+7ac2 d 105 23
+7acf 1 105 23
+7ad0 c 93 23
+7adc d 94 23
+7ae9 1 94 23
+7aea c 120 23
+7af6 6 122 23
+7afc 1d 123 23
+7b19 1 123 23
+7b1a c 108 23
+7b26 43 109 23
+7b69 1 109 23
+7b6a c 65 23
+7b76 2 65 23
+7b78 c 103 23
+7b84 d 103 23
+7b91 1 103 23
+7b92 c 65 23
+7b9e 2 65 23
+7ba0 c 103 23
+7bac d 103 23
+7bb9 1 103 23
+7bba c 93 23
+7bc6 d 94 23
+7bd3 1 94 23
+7bd4 c 120 23
+7be0 6 122 23
+7be6 1d 123 23
+7c03 1 123 23
+7c04 c 108 23
+7c10 43 109 23
+7c53 1 109 23
+7c54 c 188 23
+7c60 12 189 23
+7c72 2 190 23
+7c74 c 35 23
+7c80 d 35 23
+7c8d 1 35 23
+7c8e c 107 23
+7c9a d 107 23
+7ca7 1 107 23
+7ca8 c 171 23
+7cb4 2 173 23
+7cb6 12 174 23
+7cc8 c 173 23
+7cd4 2 174 23
+7cd6 d 272 23
+7ce3 8c 273 23
+7d6f 1 273 23
+7d70 c 93 23
+7d7c d 94 23
+7d89 1 94 23
+7d8a c 120 23
+7d96 6 122 23
+7d9c 1d 123 23
+7db9 1 123 23
+7dba c 108 23
+7dc6 3d 109 23
+7e03 1 109 23
+7e04 c 188 23
+7e10 12 189 23
+7e22 2 190 23
+7e24 d 272 23
+7e31 8c 273 23
+7ebd 1 273 23
+7ebe c 595 23
+7eca 2b 596 23
+7ef5 1 596 23
+7ef6 c 613 23
+7f02 7 614 23
+7f09 1 614 23
+7f0a c 65 23
+7f16 2 65 23
+7f18 c 72 23
+7f24 2 72 23
+7f26 c 103 23
+7f32 d 103 23
+7f3f 1 103 23
+7f40 c 105 23
+7f4c d 105 23
+7f59 1 105 23
+7f5a c 65 23
+7f66 2 65 23
+7f68 c 72 23
+7f74 2 72 23
+7f76 c 103 23
+7f82 d 103 23
+7f8f 1 103 23
+7f90 c 105 23
+7f9c d 105 23
+7fa9 1 105 23
+7faa c 105 23
+7fb6 d 105 23
+7fc3 1 105 23
+7fc4 c 574 23
+7fd0 d 575 23
+7fdd 1 575 23
+7fde c 574 23
+7fea d 575 23
+7ff7 1 575 23
+7ff8 c 550 23
+8004 5 551 23
+8009 1 551 23
+800a c 599 23
+8016 2f 600 23
+8045 1 600 23
+8046 c 84 23
+8052 1e 85 23
+8070 c 546 23
+807c 5 547 23
+8081 1 547 23
+8082 c 550 23
+808e 5 551 23
+8093 1 551 23
+8094 c 128 23
+80a0 13 129 23
+80b3 1 129 23
+80b4 c 84 23
+80c0 1e 85 23
+80de c 65 23
+80ea 2 65 23
+80ec c 103 23
+80f8 d 103 23
+8105 1 103 23
+8106 c 65 23
+8112 2 65 23
+8114 c 72 23
+8120 2 72 23
+8122 c 105 23
+812e d 105 23
+813b 1 105 23
+813c c 103 23
+8148 d 103 23
+8155 1 103 23
+8156 c 105 23
+8162 d 105 23
+816f 1 105 23
+8170 c 80 23
+817c d 80 23
+8189 1 80 23
+818a c 67 23
+8196 2 67 23
+8198 c 99 23
+81a4 14 100 23
+81b8 10 93 23
+81c8 1b 94 23
+81e3 1 94 23
+81e4 c 99 23
+81f0 14 100 23
+8204 c 107 23
+8210 2 107 23
+8212 c 171 23
+821e 2 173 23
+8220 12 174 23
+8232 c 173 23
+823e 2 174 23
+8240 c 107 23
+824c d 107 23
+8259 1 107 23
+825a c 67 23
+8266 2 67 23
+8268 c 99 23
+8274 14 100 23
+8288 c 403 23
+8294 1c 404 23
+82b0 a 406 23
+82ba a 407 23
+82c4 c 408 23
+82d0 e 409 23
+82de c 553 23
+82ea 36 554 23
+8320 2 555 23
+8322 c 103 23
+832e d 103 23
+833b 1 103 23
+833c 10 350 23
+834c 1b 351 23
+8367 1 351 23
+8368 c 69 23
+8374 2 69 23
+8376 c 107 23
+8382 d 107 23
+838f 1 107 23
+8390 c 93 23
+839c d 94 23
+83a9 1 94 23
+83aa c 359 23
+83b6 1e 360 23
+83d4 d 387 23
+83e1 35 389 23
+8416 17 390 23
+842d 1 390 23
+842e c 1051 23
+843a 2 1054 23
+843c 1a 1056 23
+8456 e 1057 23
+8464 12 1058 23
+8476 6 1059 23
+847c 6 1054 23
+8482 2 1059 23
+8484 d 569 23
+8491 58 570 23
+84e9 1 570 23
+84ea c 147 23
+84f6 31 148 23
+8527 1 148 23
+8528 c 92 23
+8534 d 92 23
+8541 1 92 23
+8542 c 67 23
+854e 2 67 23
+8550 c 99 23
+855c 14 100 23
+8570 c 403 23
+857c 1c 404 23
+8598 a 406 23
+85a2 a 407 23
+85ac c 408 23
+85b8 e 409 23
+85c6 c 553 23
+85d2 36 554 23
+8608 2 555 23
+860a c 103 23
+8616 d 103 23
+8623 1 103 23
+8624 10 350 23
+8634 1b 351 23
+864f 1 351 23
+8650 c 69 23
+865c d 69 23
+8669 1 69 23
+866a c 69 23
+8676 30 69 23
+86a6 c 107 23
+86b2 d 107 23
+86bf 1 107 23
+86c0 c 93 23
+86cc d 94 23
+86d9 1 94 23
+86da c 359 23
+86e6 1e 360 23
+8704 d 387 23
+8711 35 389 23
+8746 17 390 23
+875d 1 390 23
+875e c 1051 23
+876a 2 1054 23
+876c 1a 1056 23
+8786 e 1057 23
+8794 12 1058 23
+87a6 6 1059 23
+87ac 6 1054 23
+87b2 2 1059 23
+87b4 d 569 23
+87c1 58 570 23
+8819 1 570 23
+881a c 147 23
+8826 31 148 23
+8857 1 148 23
+8858 c 92 23
+8864 d 92 23
+8871 1 92 23
+8872 c 603 23
+887e c 603 23
+888a c 333 23
+8896 17 334 23
+88ad 1 334 23
+88ae c 653 23
+88ba 2a 654 23
+88e4 c 494 23
+88f0 36 495 23
+8926 c 351 23
+8932 1a 352 23
+894c c 2115 24
+8958 1c 2116 24
+8974 c 199 24
+8980 17 200 24
+8997 1 200 24
+8998 c 80 24
+89a4 d 80 24
+89b1 1 80 24
+89b2 c 67 24
+89be 2 67 24
+89c0 c 99 24
+89cc 14 100 24
+89e0 10 93 24
+89f0 1b 94 24
+8a0b 1 94 24
+8a0c c 99 24
+8a18 14 100 24
+8a2c c 84 24
+8a38 2f 85 24
+8a67 2 86 24
+8a69 1 86 24
+8a6a c 96 24
+8a76 12 97 24
+8a88 2 98 24
+8a8a c 107 24
+8a96 2 107 24
+8a98 c 171 24
+8aa4 2 173 24
+8aa6 12 174 24
+8ab8 c 173 24
+8ac4 2 174 24
+8ac6 c 407 24
+8ad2 7 408 24
+8ad9 1 408 24
+8ada c 603 24
+8ae6 c 603 24
+8af2 c 351 24
+8afe 1a 352 24
+8b18 c 333 24
+8b24 17 334 24
+8b3b 1 334 24
+8b3c c 653 24
+8b48 2a 654 24
+8b72 c 613 24
+8b7e 7 614 24
+8b85 1 614 24
+8b86 c 494 24
+8b92 36 495 24
+8bc8 c 107 24
+8bd4 d 107 24
+8be1 1 107 24
+8be2 c 92 25
+8bee 8 97 25
+8bf6 a 98 25
+8c00 a 99 25
+8c0a c 733 25
+8c16 12 735 25
+8c28 18 736 25
+8c40 1a 737 25
+8c5a c 595 25
+8c66 2b 596 25
+8c91 1 596 25
+8c92 c 599 25
+8c9e 2f 600 25
+8ccd 1 600 25
+8cce c 92 25
+8cda 8 97 25
+8ce2 a 98 25
+8cec a 99 25
+8cf6 c 733 25
+8d02 12 735 25
+8d14 18 736 25
+8d2c 1a 737 25
+8d46 c 84 25
+8d52 2f 85 25
+8d81 2 86 25
+8d83 1 86 25
+8d84 c 96 25
+8d90 12 97 25
+8da2 2 98 25
+8da4 c 407 25
+8db0 7 408 25
+8db7 1 408 25
+8db8 c 93 25
+8dc4 d 94 25
+8dd1 1 94 25
+8dd2 c 120 25
+8dde 6 122 25
+8de4 1d 123 25
+8e01 1 123 25
+8e02 c 108 25
+8e0e 3d 109 25
+8e4b 1 109 25
+8e4c c 272 25
+8e58 4b 273 25
+8ea3 1 273 25
+8ea4 c 188 25
+8eb0 12 189 25
+8ec2 2 190 25
+8ec4 c 603 25
+8ed0 c 603 25
+8edc c 342 25
+8ee8 1f 343 25
+8f07 1 343 25
+8f08 c 360 25
+8f14 20 361 25
+8f34 c 665 25
+8f40 5 666 25
+8f45 1 666 25
+8f46 d 758 25
+8f53 2b 759 25
+8f7e c 402 25
+8f8a 30 403 25
+8fba c 587 25
+8fc6 26 588 25
+8fec c 509 25
+8ff8 15 511 25
+900d 79 513 25
+9086 21 517 25
+90a7 1 517 25
+90a8 c 224 25
+90b4 14 225 25
+90c8 c 591 25
+90d4 26 592 25
+90fa c 449 25
+9106 3d 451 25
+9143 1 451 25
+9144 c 103 25
+9150 d 103 25
+915d 1 103 25
+915e 10 285 25
+916e 1b 286 25
+9189 1 286 25
+918a c 93 25
+9196 d 94 25
+91a3 1 94 25
+91a4 c 300 25
+91b0 1e 301 25
+91ce d 620 25
+91db 56 622 25
+9231 17 623 25
+9248 c 1078 25
+9254 9 1080 25
+925d 1a 1082 25
+9277 2 1083 25
+9279 8 1085 25
+9281 12 1086 25
+9293 6 1087 25
+9299 6 1083 25
+929f 1b 1089 25
+92ba 1d 1080 25
+92d7 c 1091 25
+92e3 1 1091 25
+92e4 d 360 25
+92f1 77 361 25
+9368 c 93 25
+9374 d 93 25
+9381 1 93 25
+9382 c 72 25
+938e 2 72 25
+9390 c 105 25
+939c d 105 25
+93a9 1 105 25
+93aa c 301 26
+93b6 d 301 26
+93c3 1 301 26
+93c4 c 93 26
+93d0 d 94 26
+93dd 1 94 26
+93de c 120 26
+93ea 6 122 26
+93f0 1d 123 26
+940d 1 123 26
+940e c 108 26
+941a 3d 109 26
+9457 1 109 26
+9458 c 188 26
+9464 12 189 26
+9476 2 190 26
+9478 c 272 26
+9484 4b 273 26
+94cf 1 273 26
+94d0 c 603 26
+94dc c 603 26
+94e8 c 342 26
+94f4 1f 343 26
+9513 1 343 26
+9514 c 360 26
+9520 20 361 26
+9540 c 661 26
+954c 2d 662 26
+9579 1 662 26
+957a c 206 26
+9586 e 211 26
+9594 8 212 26
+959c b 213 26
+95a7 1 213 26
+95a8 c 649 26
+95b4 19 650 26
+95cd 1 650 26
+95ce c 665 26
+95da 5 666 26
+95df 1 666 26
+95e0 d 758 26
+95ed 2b 759 26
+9618 c 665 26
+9624 5 666 26
+9629 1 666 26
+962a d 758 26
+9637 2b 759 26
+9662 c 449 26
+966e 3d 451 26
+96ab 1 451 26
+96ac c 402 26
+96b8 30 403 26
+96e8 c 587 26
+96f4 26 588 26
+971a c 591 26
+9726 26 592 26
+974c c 103 26
+9758 d 103 26
+9765 1 103 26
+9766 10 285 26
+9776 1b 286 26
+9791 1 286 26
+9792 c 93 26
+979e d 94 26
+97ab 1 94 26
+97ac c 300 26
+97b8 1e 301 26
+97d6 d 620 26
+97e3 56 622 26
+9839 17 623 26
+9850 c 1078 26
+985c 9 1080 26
+9865 1a 1082 26
+987f 2 1083 26
+9881 8 1085 26
+9889 12 1086 26
+989b 6 1087 26
+98a1 6 1083 26
+98a7 1b 1089 26
+98c2 1d 1080 26
+98df c 1091 26
+98eb 1 1091 26
+98ec d 360 26
+98f9 77 361 26
+9970 c 69 26
+997c 20 69 26
+999c d 103 26
+99a9 5c 104 26
+9a05 1 104 26
+9a06 c 69 26
+9a12 2c 69 26
+9a3e d 103 26
+9a4b 5c 104 26
+9aa7 1 104 26
+9aa8 c 661 26
+9ab4 2d 662 26
+9ae1 1 662 26
+9ae2 c 649 26
+9aee 19 650 26
+9b07 1 650 26
+9b08 c 665 26
+9b14 5 666 26
+9b19 1 666 26
+9b1a d 758 26
+9b27 2b 759 26
+9b52 c 72 26
+9b5e 2 72 26
+9b60 c 105 26
+9b6c d 105 26
+9b79 1 105 26
+9b7a c 69 26
+9b86 2 69 26
+9b88 c 107 26
+9b94 d 107 26
+9ba1 1 107 26
+9ba2 c 93 26
+9bae d 94 26
+9bbb 1 94 26
+9bbc c 315 26
+9bc8 1e 316 26
+9be6 d 699 26
+9bf3 28 700 26
+9c1b 1 700 26
+9c1c c 621 26
+9c28 d 623 26
+9c35 5 624 26
+FUNC 9c3a 4b 0 fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*> > >, __gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*>
+9c3a c 539 26
+9c46 8 541 26
+9c4e 2 542 26
+9c50 12 543 26
+9c62 21 542 26
+9c83 2 543 26
+9c85 1 543 26
+9c86 c 560 26
+9c92 4 567 26
+9c96 1b 568 26
+9cb1 1 568 26
+9cb2 c 171 26
+9cbe 2 173 26
+9cc0 1a 174 26
+9cda 21 173 26
+9cfb 2 174 26
+9cfd 1 174 26
+9cfe c 97 26
+9d0a 7 98 26
+9d11 1 98 26
+9d12 c 83 26
+9d1e 1d 85 26
+9d3b 5 86 26
+9d40 16 88 26
+9d56 c 296 26
+9d62 1d 297 26
+9d7f 1 297 26
+9d80 d 603 26
+9d8d e 605 26
+9d9b 9 606 26
+9da4 3c 609 26
+9de0 b 610 26
+9deb 11 609 26
+9dfc b 612 26
+9e07 12 614 26
+9e19 b 615 26
+9e24 13 612 26
+9e37 8 615 26
+9e3f 1 615 26
+9e40 d 749 26
+9e4d 15 751 26
+9e62 1a 752 26
+9e7c b 754 26
+9e87 49 755 26
+9ed0 3b 756 26
+9f0b 12 754 26
+9f1d 15 758 26
+9f32 8 759 26
+9f3a 1c 760 26
+9f56 f 761 26
+9f65 41 762 26
+9fa6 c 97 26
+9fb2 7 98 26
+9fb9 1 98 26
+9fba c 83 26
+9fc6 1d 85 26
+9fe3 5 86 26
+9fe8 17 88 26
+9fff 1 88 26
+a000 c 296 26
+a00c 1d 297 26
+a029 1 297 26
+a02a d 603 26
+a037 e 605 26
+a045 9 606 26
+a04e 3c 609 26
+a08a b 610 26
+a095 11 609 26
+a0a6 b 612 26
+a0b1 12 614 26
+a0c3 b 615 26
+a0ce 13 612 26
+a0e1 8 615 26
+a0e9 1 615 26
+a0ea d 749 26
+a0f7 15 751 26
+a10c 1a 752 26
+a126 b 754 26
+a131 49 755 26
+a17a 3b 756 26
+a1b5 12 754 26
+a1c7 15 758 26
+a1dc 8 759 26
+a1e4 1c 760 26
+a200 f 761 26
+a20f 41 762 26
+a250 d 699 26
+a25d 28 700 26
+a285 1 700 26
+a286 c 621 26
+a292 d 623 26
+a29f 5 624 26
+FUNC a2a4 4b 0 fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*> > >, __gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*>
+a2a4 c 539 26
+a2b0 8 541 26
+a2b8 2 542 26
+a2ba 12 543 26
+a2cc 21 542 26
+a2ed 2 543 26
+a2ef 1 543 26
+a2f0 c 560 26
+a2fc 4 567 26
+a300 1b 568 26
+a31b 1 568 26
+a31c c 171 26
+a328 2 173 26
+a32a 1a 174 26
+a344 21 173 26
+a365 2 174 26
+a367 1 174 26
+a368 c 65 26
+a374 2 65 26
+a376 c 103 26
+a382 d 103 26
+a38f 1 103 26
+a390 10 322 26
+a3a0 1b 324 26
+a3bb 1 324 26
+a3bc d 69 27
+a3c9 8 72 27
+a3d1 2 73 27
+a3d3 6 75 27
+a3d9 8 76 27
+a3e1 35 77 27
+a416 12 78 27
+a428 a 73 27
+a432 5 78 27
+a437 1 78 27
+a438 c 331 27
+a444 18 332 27
+a45c c 392 27
+a468 d 392 27
+a475 1 392 27
+a476 c 211 27
+a482 10 211 27
+a492 c 107 27
+a49e d 107 27
+a4ab 1 107 27
+a4ac c 171 27
+a4b8 2 173 27
+a4ba 12 174 27
+a4cc c 173 27
+a4d8 2 174 27
+a4da c 272 27
+a4e6 4b 273 27
+a531 1 273 27
+a532 13 196 27
+a545 10 196 27
+a555 2f 197 27
+a584 1a 198 27
+a59e 13 196 27
+a5b1 10 196 27
+a5c1 2f 197 27
+a5f0 1a 198 27
+a60a c 97 27
+a616 7 98 27
+a61d 1 98 27
+a61e c 83 27
+a62a 1d 85 27
+a647 5 86 27
+a64c 10 88 27
+a65c c 116 27
+a668 1e 117 27
+a686 d 100 27
+a693 12 101 27
+a6a5 19 103 27
+a6be b 104 27
+a6c9 3a 105 27
+a703 1 105 27
+a704 c 97 27
+a710 7 98 27
+a717 1 98 27
+a718 c 83 27
+a724 1d 85 27
+a741 5 86 27
+a746 10 88 27
+a756 c 116 27
+a762 1e 117 27
+a780 d 100 27
+a78d 12 101 27
+a79f 19 103 27
+a7b8 b 104 27
+a7c3 3a 105 27
+a7fd 1 105 27
+FUNC a7fe 60 0 copy_b<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*>
+a7fe d 422 27
+a80b 12 424 27
+a81d 2e 425 27
+a84b 13 426 27
+a85e c 432 27
+a86a 4 440 27
+a86e 1b 443 27
+a889 1 443 27
+FUNC a88a 64 0 copy_b_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*> > > >
+a88a e 480 27
+a898 56 482 27
+a8ee c 504 27
+a8fa 4 514 27
+a8fe 4 515 27
+a902 1b 517 27
+a91d 1 517 27
+FUNC a91e 32 0 fill_n<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, long unsigned int, __gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*>
+a91e c 614 27
+a92a 8 616 27
+a932 2 617 27
+a934 8 618 27
+a93c f 617 27
+a94b 5 619 27
+a950 c 636 27
+a95c 4 641 27
+a960 1b 642 27
+a97b 1 642 27
+a97c c 182 28
+a988 1b 183 28
+a9a3 1 183 28
+a9a4 c 214 28
+a9b0 23 218 28
+a9d3 1 218 28
+a9d4 c 308 28
+a9e0 1b 310 28
+a9fb 1 310 28
+a9fc c 200 28
+aa08 19 201 28
+aa21 42 203 28
+aa63 15 205 28
+aa78 d 990 28
+aa85 11 992 28
+aa96 c 993 28
+aaa2 15 995 28
+aab7 c 996 28
+aac3 4a 998 28
+ab0d f 1001 28
+ab1c 1c 998 28
+ab38 1a 1003 28
+ab52 5 1004 28
+ab57 1f 1007 28
+ab76 1c 1008 28
+ab92 19 1009 28
+abab 19 1010 28
+abc4 1a 1011 28
+abde a 1004 28
+abe8 11 1001 28
+abf9 15 1014 28
+ac0e 13 1028 28
+ac21 b 1016 28
+ac2c 9 1018 28
+ac35 19 1023 28
+ac4e 23 1024 28
+ac71 19 1025 28
+ac8a 1d 1021 28
+aca7 1a 1018 28
+acc1 b 1028 28
+accc b 1016 28
+acd7 1e 1028 28
+acf5 1 1028 28
+acf6 10 436 28
+ad06 16 438 28
+ad1c 37 439 28
+ad53 1 439 28
+ad54 10 211 28
+ad64 37 212 28
+ad9b 1 212 28
+FUNC ad9c 32 0 fill_n<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, long unsigned int, __gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*>
+ad9c c 614 28
+ada8 8 616 28
+adb0 2 617 28
+adb2 8 618 28
+adba f 617 28
+adc9 5 619 28
+adce c 636 28
+adda 4 641 28
+adde 1b 642 28
+adf9 1 642 28
+adfa c 182 28
+ae06 1b 183 28
+ae21 1 183 28
+ae22 c 214 28
+ae2e 23 218 28
+ae51 1 218 28
+ae52 c 308 28
+ae5e 1b 310 28
+ae79 1 310 28
+ae7a c 200 28
+ae86 19 201 28
+ae9f 42 203 28
+aee1 15 205 28
+aef6 d 990 28
+af03 11 992 28
+af14 c 993 28
+af20 15 995 28
+af35 c 996 28
+af41 4a 998 28
+af8b f 1001 28
+af9a 1c 998 28
+afb6 1a 1003 28
+afd0 5 1004 28
+afd5 1f 1007 28
+aff4 1c 1008 28
+b010 19 1009 28
+b029 19 1010 28
+b042 1a 1011 28
+b05c a 1004 28
+b066 11 1001 28
+b077 15 1014 28
+b08c 13 1028 28
+b09f b 1016 28
+b0aa 9 1018 28
+b0b3 19 1023 28
+b0cc 23 1024 28
+b0ef 19 1025 28
+b108 1d 1021 28
+b125 1a 1018 28
+b13f b 1028 28
+b14a b 1016 28
+b155 1e 1028 28
+b173 1 1028 28
+b174 10 436 28
+b184 16 438 28
+b19a 37 439 28
+b1d1 1 439 28
+b1d2 10 211 28
+b1e2 37 212 28
+b219 1 212 28
+FUNC b21a 60 0 copy_b<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*>
+b21a d 422 28
+b227 12 424 28
+b239 2e 425 28
+b267 13 426 28
+b27a c 432 28
+b286 4 440 28
+b28a 1b 443 28
+b2a5 1 443 28
+FUNC b2a6 64 0 copy_b_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*> > > >
+b2a6 e 480 28
+b2b4 56 482 28
+b30a c 504 28
+b316 4 514 28
+b31a 4 515 28
+b31e 1b 517 28
+b339 1 517 28
+FUNC b33a 43 0 fill_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*> > >, long unsigned int, __gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*>
+b33a c 614 28
+b346 8 616 28
+b34e 2 617 28
+b350 12 618 28
+b362 16 617 28
+b378 5 619 28
+b37d 1 619 28
+b37e c 636 28
+b38a 4 641 28
+b38e 1b 642 28
+b3a9 1 642 28
+b3aa c 182 28
+b3b6 1b 183 28
+b3d1 1 183 28
+b3d2 c 214 28
+b3de 23 218 28
+b401 1 218 28
+b402 c 308 28
+b40e 1b 310 28
+b429 1 310 28
+FUNC b42a 43 0 fill_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*> > >, long unsigned int, __gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*>
+b42a c 614 28
+b436 8 616 28
+b43e 2 617 28
+b440 12 618 28
+b452 16 617 28
+b468 5 619 28
+b46d 1 619 28
+b46e c 636 28
+b47a 4 641 28
+b47e 1b 642 28
+b499 1 642 28
+b49a c 182 28
+b4a6 1b 183 28
+b4c1 1 183 28
+b4c2 c 214 28
+b4ce 23 218 28
+b4f1 1 218 28
+b4f2 c 308 28
+b4fe 1b 310 28
+b519 1 310 28
+FUNC b51a 3f 0 copy<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*>
+b51a c 298 28
+b526 22 300 28
+b548 11 301 28
+b559 1 301 28
+b55a c 307 28
+b566 4 315 28
+b56a 1b 317 28
+b585 1 317 28
+FUNC b586 27 0 copy_n<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, __gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**>
+b586 c 325 28
+b592 1b 326 28
+b5ad 1 326 28
+b5ae c 376 28
+b5ba 4 384 28
+b5be 4 385 28
+b5c2 1b 387 28
+b5dd 1 387 28
+b5de c 73 28
+b5ea 1b 74 28
+b605 1 74 28
+b606 c 108 28
+b612 23 113 28
+b635 1 113 28
+b636 c 252 28
+b642 1b 254 28
+b65d 1 254 28
+FUNC b65e 66 0 _M_allocate_and_copy<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**>
+b65e c 761 28
+b66a 15 763 28
+b67f 40 766 28
+b6bf 3 768 28
+b6c2 2 773 28
+b6c4 13 69 29
+b6d7 15 71 29
+b6ec e 72 29
+b6fa 19 73 29
+b713 e 75 29
+b721 28 78 29
+b749 3e 79 29
+b787 30 81 29
+b7b7 8 84 29
+b7bf 11 85 29
+b7d0 18 86 29
+FUNC b7e8 40 0 copy_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*> > >, __gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**>
+b7e8 d 334 29
+b7f5 33 335 29
+b828 c 376 29
+b834 4 384 29
+b838 4 385 29
+b83c 1b 387 29
+b857 1 387 29
+b858 c 73 29
+b864 1b 74 29
+b87f 1 74 29
+b880 c 108 29
+b88c 23 113 29
+b8af 1 113 29
+b8b0 c 252 29
+b8bc 1b 254 29
+b8d7 1 254 29
+FUNC b8d8 64 0 copy_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*> > > >
+b8d8 e 352 29
+b8e6 56 354 29
+b93c c 376 29
+b948 4 384 29
+b94c 4 385 29
+b950 1b 387 29
+b96b 1 387 29
+b96c c 73 29
+b978 1b 74 29
+b993 1 74 29
+b994 c 108 29
+b9a0 23 113 29
+b9c3 1 113 29
+b9c4 c 252 29
+b9d0 1b 254 29
+b9eb 1 254 29
+b9ec 14 311 29
+ba00 b 313 29
+ba0b 24 315 29
+ba2f 8 318 29
+ba37 23 319 29
+ba5a 15 320 29
+ba6f c 321 29
+ba7b 51 323 29
+bacc 14 327 29
+bae0 30 328 29
+bb10 35 330 29
+bb45 48 334 29
+bb8d 17 338 29
+bba4 43 339 29
+bbe7 14 342 29
+bbfb 1e 343 29
+bc19 e 348 29
+bc27 1e 349 29
+bc45 e 350 29
+bc53 1d 353 29
+bc70 8 354 29
+bc78 e 355 29
+bc86 27 357 29
+bcad 6 358 29
+bcb3 4d 361 29
+bd00 40 365 29
+bd40 18 367 29
+bd58 4d 368 29
+bda5 3e 379 29
+bde3 30 381 29
+be13 12 384 29
+be25 13 385 29
+be38 22 386 29
+be5a c 657 29
+be66 22 658 29
+be88 c 578 29
+be94 15 580 29
+bea9 15 581 29
+bebe 37 582 29
+bef5 c 583 29
+bf01 1 583 29
+bf02 d 335 29
+bf0f 4e 337 29
+bf5d 4d 338 29
+bfaa d 134 29
+bfb7 65 135 29
+FUNC c01c 3f 0 copy<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*>
+c01c c 298 29
+c028 22 300 29
+c04a 11 301 29
+c05b 1 301 29
+c05c c 307 29
+c068 4 315 29
+c06c 1b 317 29
+c087 1 317 29
+FUNC c088 27 0 copy_n<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, __gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**>
+c088 c 325 29
+c094 1b 326 29
+c0af 1 326 29
+c0b0 c 376 29
+c0bc 4 384 29
+c0c0 4 385 29
+c0c4 1b 387 29
+c0df 1 387 29
+c0e0 c 73 29
+c0ec 1b 74 29
+c107 1 74 29
+c108 c 108 29
+c114 23 113 29
+c137 1 113 29
+c138 c 252 29
+c144 1b 254 29
+c15f 1 254 29
+FUNC c160 66 0 _M_allocate_and_copy<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**>
+c160 c 761 29
+c16c 15 763 29
+c181 40 766 29
+c1c1 3 768 29
+c1c4 2 773 29
+c1c6 13 69 29
+c1d9 15 71 29
+c1ee e 72 29
+c1fc 19 73 29
+c215 e 75 29
+c223 28 78 29
+c24b 3e 79 29
+c289 30 81 29
+c2b9 8 84 29
+c2c1 11 85 29
+c2d2 18 86 29
+FUNC c2ea 40 0 copy_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*> > >, __gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**>
+c2ea d 334 29
+c2f7 33 335 29
+c32a c 376 29
+c336 4 384 29
+c33a 4 385 29
+c33e 1b 387 29
+c359 1 387 29
+c35a c 73 29
+c366 1b 74 29
+c381 1 74 29
+c382 c 108 29
+c38e 23 113 29
+c3b1 1 113 29
+c3b2 c 252 29
+c3be 1b 254 29
+c3d9 1 254 29
+FUNC c3da 64 0 copy_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*> > > >
+c3da e 352 29
+c3e8 56 354 29
+c43e c 376 29
+c44a 4 384 29
+c44e 4 385 29
+c452 1b 387 29
+c46d 1 387 29
+c46e c 73 29
+c47a 1b 74 29
+c495 1 74 29
+c496 c 108 29
+c4a2 23 113 29
+c4c5 1 113 29
+c4c6 c 252 29
+c4d2 1b 254 29
+c4ed 1 254 29
+c4ee 14 311 29
+c502 b 313 29
+c50d 24 315 29
+c531 8 318 29
+c539 23 319 29
+c55c 15 320 29
+c571 c 321 29
+c57d 51 323 29
+c5ce 14 327 29
+c5e2 30 328 29
+c612 35 330 29
+c647 48 334 29
+c68f 17 338 29
+c6a6 43 339 29
+c6e9 14 342 29
+c6fd 1e 343 29
+c71b e 348 29
+c729 1e 349 29
+c747 e 350 29
+c755 1d 353 29
+c772 8 354 29
+c77a e 355 29
+c788 27 357 29
+c7af 6 358 29
+c7b5 4d 361 29
+c802 40 365 29
+c842 18 367 29
+c85a 4d 368 29
+c8a7 3e 379 29
+c8e5 30 381 29
+c915 12 384 29
+c927 13 385 29
+c93a 22 386 29
+c95c c 657 29
+c968 22 658 29
+c98a c 578 29
+c996 15 580 29
+c9ab 15 581 29
+c9c0 37 582 29
+c9f7 c 583 29
+ca03 1 583 29
+ca04 d 335 29
+ca11 4e 337 29
+ca5f 4d 338 29
+caac d 134 29
+cab9 65 135 29
+cb1e 39 135 30
+cb57 5 102 30
+cb5c 6 103 30
+cb62 18 136 30
+cb7a 10 137 30
+cb8a 17 138 30
+cba1 2 139 30
+cba3 1 139 30
+cba4 2d 144 30
+cbd1 a 145 30
+cbdb 58 146 30
+cc33 35 147 30
+cc68 32 146 30
+cc9a 2a 147 30
+ccc4 82 152 30
+cd46 18 153 30
+cd5e 1c 152 30
+cd7a 2f 153 30
+cda9 e 154 30
+cdb7 28 155 30
+cddf 12 157 30
+cdf1 2 158 30
+cdf3 12 160 30
+ce05 2 161 30
+ce07 c 163 30
+ce13 2 164 30
+ce15 2c 166 30
+ce41 8 172 30
+ce49 1 172 30
+ce4a 20 84 30
+ce6a 1c 85 30
+ce86 9c 87 30
+cf22 4f 89 30
+cf71 19 87 30
+cf8a 25 90 30
+cfaf 30 93 30
+cfdf 7 95 30
+cfe6 19 174 30
+cfff 1c 175 30
+d01b 65 177 30
+d080 5 178 30
+d085 1 178 30
+d086 20 111 30
+d0a6 1c 112 30
+d0c2 c 126 30
+d0ce 23 115 30
+d0f1 26 116 30
+d117 1a 117 30
+d131 d 118 30
+d13e 1b 119 30
+d159 5f 120 30
+d1b8 c 124 30
+d1c4 1c 115 30
+d1e0 3 126 30
+d1e3 7 129 30
+d1ea 13 52 30
+d1fd 45 54 30
+d242 15 55 30
+d257 6 56 30
+d25d 1 56 30
+d25e 2c 60 30
+d28a 45 62 30
+d2cf 2f 65 30
+d2fe 24 66 30
+d322 b 68 30
+d32d e 69 30
+d33b 19 71 30
+d354 17 72 30
+d36b 93 74 30
+d3fe 64 77 30
+d462 30 79 30
+d492 7 81 30
+d499 1 81 30
+d49a 14 38 30
+d4ae 36 40 30
+d4e4 41 43 30
+d525 41 44 30
+d566 67 45 30
+d5cd 10 46 30
+d5dd 13 45 30
+d5f0 15 47 30
+d605 e 48 30
+d613 3d 49 30
+d650 20 50 30
+d670 14 38 30
+d684 36 40 30
+d6ba 41 43 30
+d6fb 41 44 30
+d73c 67 45 30
+d7a3 10 46 30
+d7b3 13 45 30
+d7c6 15 47 30
+d7db e 48 30
+d7e9 3d 49 30
+d826 20 50 30
+d846 12 125 31
+d858 12 125 31
+d86a 13 55 32
+d87d 35 55 32
+d8b2 13 98 32
+d8c5 35 98 32
+d8fa c 35 32
+d906 d 35 32
+d913 1 35 32
+d914 d 22 32
+d921 40 22 32
+d961 1 22 32
+d962 c 89 33
+d96e 1e 90 33
+d98c c 207 34
+d998 14 208 34
+d9ac c 190 35
+d9b8 a 190 35
+d9c2 c 259 35
+d9ce 21 259 35
+d9ef 1 259 35
+d9f0 c 283 35
+d9fc 7 286 35
+da03 1 286 35
+da04 d 103 36
+da11 5c 104 36
+da6d 1 104 36
+da6e c 2139 37
+da7a 1c 2140 37
+da96 d 2081 37
+daa3 12 2083 37
+dab5 1a 2084 37
+dacf 24 2085 37
+daf3 1 2085 37
+daf4 d 2044 37
+db01 12 2046 37
+db13 1a 2047 37
+db2d 24 2048 37
+db51 1 2048 37
+db52 c 84 37
+db5e 17 85 37
+db75 1 85 37
+db76 c 144 37
+db82 21 145 37
+dba3 1 145 37
+dba4 c 84 37
+dbb0 23 85 37
+dbd3 1 85 37
+dbd4 1c 144 37
+dbf0 20 145 37
+dc10 d 89 37
+dc1d 64 90 37
+dc81 1 90 37
+dc82 c 89 37
+dc8e 2a 90 37
+dcb8 c 84 37
+dcc4 1d 85 37
+dce1 1 85 37
+dce2 1c 144 37
+dcfe 20 145 37
+dd1e c 189 37
+dd2a a 190 37
+dd34 c 193 37
+dd40 d 194 37
+dd4d 1 194 37
+dd4e c 603 38
+dd5a c 603 38
+dd66 c 342 39
+dd72 1f 343 39
+dd91 1 343 39
+dd92 c 360 39
+dd9e 20 361 39
+ddbe c 665 39
+ddca 5 666 39
+ddcf 1 666 39
+ddd0 d 758 39
+dddd 2b 759 39
+de08 c 402 39
+de14 30 403 39
+de44 c 342 39
+de50 1f 343 39
+de6f 1 343 39
+de70 c 360 39
+de7c 20 361 39
+de9c d 758 39
+dea9 31 759 39
+deda c 402 39
+dee6 30 403 39
+df16 c 603 39
+df22 c 603 39
+df2e c 351 39
+df3a 1a 352 39
+df54 c 613 39
+df60 7 614 39
+df67 1 614 39
+df68 c 407 39
+df74 7 408 39
+df7b 1 408 39
+df7c c 665 39
+df88 5 666 39
+df8d 1 666 39
+df8e c 621 39
+df9a d 623 39
+dfa7 5 624 39
+dfac c 333 39
+dfb8 17 334 39
+dfcf 1 334 39
+dfd0 c 35 39
+dfdc 26 35 39
+e002 d 103 39
+e00f 5c 104 39
+e06b 1 104 39
+e06c c 613 39
+e078 7 614 39
+e07f 1 614 39
+FUNC e080 35 0 operator=
+e080 c 0 39
+e08c 29 35 39
+e0b5 1 35 39
+e0b6 c 407 39
+e0c2 7 408 39
+e0c9 1 408 39
+e0ca c 621 39
+e0d6 d 623 39
+e0e3 5 624 39
+e0e8 13 515 39
+e0fb 15 517 39
+e110 14 518 39
+e124 13 515 39
+e137 15 517 39
+e14c 14 518 39
+e160 c 653 39
+e16c 2a 654 39
+e196 c 494 39
+e1a2 36 495 39
+e1d8 c 534 39
+e1e4 12 536 39
+e1f6 14 537 39
+e20a c 653 39
+e216 32 654 39
+e248 c 494 39
+e254 36 495 39
+e28a c 534 39
+e296 12 536 39
+e2a8 14 537 39
+e2bc c 472 40
+e2c8 8 473 40
+e2d0 c 550 41
+e2dc 5 551 41
+e2e1 1 551 41
+e2e2 c 226 41
+e2ee 47 227 41
+e335 1 227 41
+e336 c 209 41
+e342 14 210 41
+e356 c 84 41
+e362 18 85 41
+e37a c 472 41
+e386 8 473 41
+e38e c 550 41
+e39a 5 551 41
+e39f 1 551 41
+e3a0 c 209 41
+e3ac 14 210 41
+e3c0 c 84 41
+e3cc 18 85 41
+e3e4 c 180 41
+e3f0 13 181 41
+e403 1 181 41
+e404 c 408 41
+e410 22 409 41
+e432 c 206 42
+e43e d 207 42
+e44b 1 207 42
+e44c d 699 42
+e459 28 700 42
+e481 1 700 42
+e482 c 171 43
+e48e 2 173 43
+e490 1a 174 43
+e4aa 21 173 43
+e4cb 2 174 43
+e4cd 1 174 43
+e4ce d 699 43
+e4db 28 700 43
+e503 1 700 43
+e504 c 171 43
+e510 2 173 43
+e512 1a 174 43
+e52c 21 173 43
+e54d 2 174 43
+e54f 1 174 43
+e550 c 480 43
+e55c 8 481 43
+e564 c 484 43
+e570 1c 485 43
+e58c c 194 43
+e598 14 196 43
+e5ac 5 197 43
+e5b1 1 197 43
+e5b2 c 194 43
+e5be 14 196 43
+e5d2 5 197 43
+e5d7 1 197 43
+e5d8 c 504 43
+e5e4 8 505 43
+e5ec c 508 43
+e5f8 1c 509 43
+e614 c 480 43
+e620 8 481 43
+e628 c 484 43
+e634 1c 485 43
+e650 c 504 43
+e65c 8 505 43
+e664 c 508 43
+e670 1c 509 43
+e68c c 613 43
+e698 7 614 43
+e69f 1 614 43
+e6a0 c 97 43
+e6ac 7 98 43
+e6b3 1 98 43
+e6b4 c 83 43
+e6c0 1d 85 43
+e6dd 5 86 43
+e6e2 10 88 43
+e6f2 c 116 43
+e6fe 1e 117 43
+e71c c 97 43
+e728 7 98 43
+e72f 1 98 43
+e730 c 83 43
+e73c 1d 85 43
+e759 5 86 43
+e75e 16 88 43
+e774 c 116 43
+e780 1e 117 43
+e79e c 103 43
+e7aa 3a 104 43
+e7e4 c 653 43
+e7f0 2a 654 43
+e81a c 509 43
+e826 36 510 43
+FUNC e85c 4e 0 copy_b<std::string*, std::string*>
+e85c c 408 44
+e868 14 411 44
+e87c 1e 412 44
+e89a b 411 44
+e8a5 5 413 44
+e8aa c 432 44
+e8b6 4 440 44
+e8ba 1b 443 44
+e8d5 1 443 44
+FUNC e8d6 64 0 copy_b_n<__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, __gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > > >
+e8d6 e 480 44
+e8e4 56 482 44
+e93a c 504 44
+e946 4 514 44
+e94a 4 515 44
+e94e 1b 517 44
+e969 1 517 44
+e96a d 77 44
+e977 5c 81 44
+e9d3 1 81 44
+FUNC e9d4 54 0 copy_b<dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*>
+e9d4 c 408 44
+e9e0 1a 411 44
+e9fa 1e 412 44
+ea18 b 411 44
+ea23 5 413 44
+ea28 c 432 44
+ea34 4 440 44
+ea38 1b 443 44
+ea53 1 443 44
+FUNC ea54 64 0 copy_b_n<__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, __gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > > >
+ea54 e 480 44
+ea62 56 482 44
+eab8 c 504 44
+eac4 4 514 44
+eac8 4 515 44
+eacc 1b 517 44
+eae7 1 517 44
+eae8 d 77 44
+eaf5 5c 81 44
+eb51 1 81 44
+eb52 c 69 44
+eb5e 20 69 44
+eb7e c 69 44
+eb8a 2a 69 44
+ebb4 d 103 44
+ebc1 5c 104 44
+ec1d 1 104 44
+ec1e c 521 44
+ec2a 15 523 44
+ec3f 79 525 44
+ecb8 21 529 44
+ecd9 1 529 44
+ecda c 228 44
+ece6 14 229 44
+ecfa c 97 44
+ed06 7 98 44
+ed0d 1 98 44
+ed0e c 83 44
+ed1a 1d 85 44
+ed37 5 86 44
+ed3c 10 88 44
+ed4c c 355 44
+ed58 1d 356 44
+ed75 1 356 44
+ed76 d 363 44
+ed83 e 365 44
+ed91 3c 367 44
+edcd b 373 44
+edd8 11 367 44
+ede9 b 368 44
+edf4 12 370 44
+ee06 b 371 44
+ee11 13 368 44
+ee24 8 373 44
+ee2c d 787 44
+ee39 15 789 44
+ee4e 5d 792 44
+eeab 24 796 44
+eecf f 798 44
+eede 1b 799 44
+eef9 1 799 44
+eefa d 869 44
+ef07 e 871 44
+ef15 e 872 44
+ef23 4 873 44
+ef27 2 874 44
+ef29 6 876 44
+ef2f 35 877 44
+ef64 2a 878 44
+ef8e 6 874 44
+ef94 12 880 44
+efa6 a 881 44
+efb0 24 882 44
+efd4 51 883 44
+f025 b 885 44
+f030 36 886 44
+f066 4e 887 44
+f0b4 35 888 44
+f0e9 1 888 44
+f0ea c 359 45
+f0f6 14 360 45
+f10a c 97 45
+f116 7 98 45
+f11d 1 98 45
+f11e c 83 45
+f12a 1d 85 45
+f147 5 86 45
+f14c 1d 88 45
+f169 1 88 45
+f16a c 355 45
+f176 1d 356 45
+f193 1 356 45
+f194 d 363 45
+f1a1 e 365 45
+f1af 3c 367 45
+f1eb 8 373 45
+f1f3 1 373 45
+f1f4 d 787 45
+f201 15 789 45
+f216 5d 792 45
+f273 24 796 45
+f297 f 798 45
+f2a6 1b 799 45
+f2c1 1 799 45
+f2c2 d 869 45
+f2cf e 871 45
+f2dd e 872 45
+f2eb 4 873 45
+f2ef 2 874 45
+f2f1 6 876 45
+f2f7 35 877 45
+f32c 2a 878 45
+f356 6 874 45
+f35c 12 880 45
+f36e a 881 45
+f378 24 882 45
+f39c 51 883 45
+f3ed b 885 45
+f3f8 36 886 45
+f42e 4e 887 45
+f47c 35 888 45
+f4b1 1 888 45
+f4b2 c 359 45
+f4be 14 360 45
+f4d2 c 106 45
+f4de d 107 45
+f4eb 1 107 45
+f4ec c 119 45
+f4f8 2 121 45
+f4fa 13 122 45
+f50d 21 121 45
+f52e 2 122 45
+f530 c 148 45
+f53c 1c 155 45
+f558 d 80 46
+f565 6 82 46
+f56b 2 85 46
+f56d 24 86 46
+f591 2c 85 46
+f5bd b 87 46
+f5c8 b 89 46
+f5d3 12 91 46
+f5e5 b 92 46
+f5f0 13 89 46
+f603 9 92 46
+f60c c 108 46
+f618 23 113 46
+f63b 1 113 46
+f63c c 252 46
+f648 1b 254 46
+f663 1 254 46
+f664 14 249 47
+f678 14 251 47
+f68c 22 253 47
+f6ae f 255 47
+f6bd 12 256 47
+f6cf 55 257 47
+f724 4b 260 47
+f76f e 264 47
+f77d 15 265 47
+f792 e 266 47
+f7a0 1d 271 47
+f7bd 8 272 47
+f7c5 e 273 47
+f7d3 27 275 47
+f7fa 6 276 47
+f800 55 279 47
+f855 25 284 47
+f87a b 285 47
+f885 4f 286 47
+f8d4 3 284 47
+f8d7 13 279 47
+f8ea e 286 47
+f8f8 4d 298 47
+f945 30 299 47
+f975 12 302 47
+f987 13 303 47
+f99a 23 304 47
+f9bd 3 298 47
+f9c0 13 286 47
+f9d3 b 292 47
+f9de 39 294 47
+fa17 23 295 47
+fa3a 8 296 47
+fa42 16 294 47
+fa58 3 296 47
+fa5b 19 292 47
+fa74 19 298 47
+fa8d 7 304 47
+fa94 c 602 47
+faa0 10 604 47
+fab0 1e 606 47
+face 11 607 47
+fadf 25 610 47
+fb04 c 106 47
+fb10 d 107 47
+fb1d 1 107 47
+fb1e c 119 47
+fb2a 2 121 47
+fb2c 13 122 47
+fb3f 21 121 47
+fb60 2 122 47
+fb62 c 148 47
+fb6e 1c 155 47
+fb8a d 80 47
+fb97 6 82 47
+fb9d 2 85 47
+fb9f 24 86 47
+fbc3 2c 85 47
+fbef b 87 47
+fbfa b 89 47
+fc05 12 91 47
+fc17 b 92 47
+fc22 13 89 47
+fc35 9 92 47
+fc3e c 108 47
+fc4a 23 113 47
+fc6d 1 113 47
+fc6e c 252 47
+fc7a 1b 254 47
+fc95 1 254 47
+fc96 14 249 47
+fcaa 14 251 47
+fcbe 22 253 47
+fce0 f 255 47
+fcef 12 256 47
+fd01 55 257 47
+fd56 4b 260 47
+fda1 e 264 47
+fdaf 15 265 47
+fdc4 e 266 47
+fdd2 1d 271 47
+fdef 8 272 47
+fdf7 e 273 47
+fe05 27 275 47
+fe2c 6 276 47
+fe32 55 279 47
+fe87 25 284 47
+feac b 285 47
+feb7 4f 286 47
+ff06 3 284 47
+ff09 13 279 47
+ff1c e 286 47
+ff2a 4d 298 47
+ff77 36 299 47
+ffad 12 302 47
+ffbf 13 303 47
+ffd2 2a 304 47
+fffc 3 298 47
+ffff 13 286 47
+10012 b 292 47
+1001d 39 294 47
+10056 23 295 47
+10079 8 296 47
+10081 16 294 47
+10097 3 296 47
+1009a 19 292 47
+100b3 19 298 47
+100cc 7 304 47
+100d3 1 304 47
+100d4 c 602 47
+100e0 10 604 47
+100f0 1e 606 47
+1010e 11 607 47
+1011f 25 610 47
+FUNC 10144 16c 0 Start
+10144 17 610 48
+1015b 40 49 48
+1019b 6 51 48
+101a1 3f 53 48
+101e0 7 54 48
+101e7 5 55 48
+101ec 2a 58 48
+10216 61 61 48
+10277 7 62 48
+1027e 2 63 48
+10280 29 66 48
+102a9 7 67 48
+FUNC 102b0 108 0 Usage
+102b0 19 70 48
+102c9 30 71 48
+102f9 29 73 48
+10322 30 74 48
+10352 30 75 48
+10382 30 76 48
+103b2 6 77 48
+FUNC 103b8 3af 0 SetupOptions
+103b8 21 80 48
+103d9 8 82 48
+103e1 6 85 48
+103e7 10 86 48
+103f7 2e 88 48
+10425 2f 94 48
+10454 2a 91 48
+1047e 23 95 48
+104a1 3e 97 48
+104df 11 98 48
+104f0 7c 99 48
+1056c c 100 48
+10578 5 99 48
+1057d 3e 101 48
+105bb 11 102 48
+105cc 3e 103 48
+1060a 11 104 48
+1061b 37 106 48
+10652 b 107 48
+1065d c 108 48
+10669 b 113 48
+10674 c 114 48
+10680 14 119 48
+10694 30 120 48
+106c4 b 121 48
+106cf c 122 48
+106db 81 127 48
+1075c b 128 48
+10767 1 128 48
+FUNC 10768 a7 0 main
+10768 13 131 48
+1077b 37 132 48
+107b2 1e 135 48
+107d0 e 136 48
+107de 8 137 48
+107e6 17 139 48
+107fd c 141 48
+10809 6 142 48
+1080f 1 142 48
+10810 c 47 49
+1081c 1a 48 49
+10836 2 49 49
+10838 c 47 49
+10844 1a 48 49
+1085e 2 49 49
+10860 f 51 49
+1086f 16 52 49
+10885 6 53 49
+1088b f 54 49
+1089a b 57 49
+108a5 7 62 49
+108ac 2 63 49
+108ae 1c 64 49
+108ca 32 63 49
+108fc b 67 49
+10907 12 68 49
+10919 10 70 49
+10929 2 71 49
+1092b 1 71 49
+1092c 10 73 49
+1093c 15 74 49
+10951 20 76 49
+10971 f 77 49
+10980 20 79 49
+109a0 c 80 49
+109ac 69 82 49
+10a15 9 83 49
+10a1e c 87 49
+10a2a 7 88 49
+10a31 c 89 49
+10a3d 15 90 49
+10a52 12 91 49
+10a64 18 93 49
+10a7c e 94 49
+10a8a 2b 96 49
+10ab5 2b 97 49
+10ae0 17 89 49
+10af7 20 101 49
+10b17 2 102 49
+10b19 1 102 49
+FUNC 10b1a 13 0 NXHostByteOrder
+10b1a c 144 50
+10b26 5 147 50
+10b2b 2 153 50
+10b2d 1 153 50
+10b2e c 56 51
+10b3a 1a 57 51
+10b54 1e 58 51
+10b72 2 59 51
+10b74 c 56 51
+10b80 1a 57 51
+10b9a 1e 58 51
+10bb8 2 59 51
+10bba c 61 51
+10bc6 e 62 51
+10bd4 11 63 51
+10be5 2 64 51
+10be7 1 64 51
+10be8 c 61 51
+10bf4 e 62 51
+10c02 11 63 51
+10c13 2 64 51
+10c15 1 64 51
+10c16 c 74 51
+10c22 11 82 51
+10c33 14 83 51
+10c47 5 86 51
+10c4c 9 87 51
+10c55 7 88 51
+10c5c 18b 90 51
+10de7 6 91 51
+10ded 14 89 51
+10e01 23 93 51
+10e24 23 94 51
+10e47 d 86 51
+10e54 f 98 51
+10e63 6 100 51
+10e69 18b 101 51
+10ff4 6 102 51
+10ffa c 99 51
+11006 13 105 51
+11019 8 106 51
+11021 10 104 51
+11031 23 108 51
+11054 23 109 51
+11077 14 110 51
+1108b 2 112 51
+1108d 1 112 51
+1108e c 114 51
+1109a 1e 115 51
+110b8 2 116 51
+110ba c 118 51
+110c6 1e 119 51
+110e4 2 120 51
+110e6 f 122 51
+110f5 1b 123 51
+11110 e 129 51
+1111e 5 130 51
+11123 9 131 51
+1112c 7 132 51
+11133 a 133 51
+1113d 6 135 51
+11143 7 136 51
+1114a 35 139 51
+1117f 6c 142 51
+111eb 10 143 51
+111fb a 130 51
+11205 2 145 51
+11207 1 145 51
+11208 14 147 51
+1121c 25 149 51
+11241 7 151 51
+11248 19 152 51
+11261 9 153 51
+1126a 8 157 51
+11272 1f 158 51
+11291 9 159 51
+1129a 36 162 51
+112d0 7 163 51
+112d7 1 163 51
+112d8 15 165 51
+112ed 25 167 51
+11312 7 169 51
+11319 19 170 51
+11332 c 171 51
+1133e c 175 51
+1134a 6 180 51
+11350 7 181 51
+11357 9 182 51
+11360 9 183 51
+11369 28 185 51
+11391 33 186 51
+113c4 1e 185 51
+113e2 10 189 51
+113f2 10 190 51
+11402 10 191 51
+11412 d 192 51
+1141f 10 193 51
+1142f 10 194 51
+1143f 10 195 51
+1144f d 196 51
+1145c 17 197 51
+11473 17 198 51
+1148a 17 199 51
+114a1 14 200 51
+114b5 9 202 51
+114be 36 205 51
+114f4 8 206 51
+114fc 14 208 51
+11510 25 209 51
+11535 27 210 51
+1155c d 211 51
+11569 19 213 51
+11582 9 214 51
+1158b 3b 216 51
+115c6 7 217 51
+115cd 1 217 51
+115ce 14 219 51
+115e2 25 220 51
+11607 27 221 51
+1162e 19 223 51
+11647 19 224 51
+11660 9 225 51
+11669 17 227 51
+11680 9 228 51
+11689 36 231 51
+116bf 7 232 51
+116c6 14 234 51
+116da 25 235 51
+116ff 27 236 51
+11726 19 238 51
+1173f 19 239 51
+11758 9 240 51
+11761 17 242 51
+11778 9 243 51
+11781 36 246 51
+117b7 7 247 51
+117be 2b 251 51
+117e9 6 252 51
+117ef e 254 51
+117fd 38 257 51
+11835 f 258 51
+11844 9 260 51
+1184d 17 261 51
+11864 20 266 51
+11884 f 267 51
+11893 d 271 51
+118a0 c 273 51
+118ac 38 274 51
+118e4 f 275 51
+118f3 9 277 51
+118fc 1f 278 51
+1191b 14 282 51
+1192f 2b 283 51
+1195a d 285 51
+11967 19 273 51
+11980 e 287 51
+1198e 38 290 51
+119c6 f 291 51
+119d5 9 293 51
+119de 17 294 51
+119f5 20 299 51
+11a15 f 300 51
+11a24 d 304 51
+11a31 c 306 51
+11a3d 38 307 51
+11a75 f 308 51
+11a84 9 310 51
+11a8d 1f 311 51
+11aac 1a 315 51
+11ac6 39 316 51
+11aff d 318 51
+11b0c 11 306 51
+11b1d 10 323 51
+11b2d 9 324 51
+11b36 1e 328 51
+11b54 a 329 51
+11b5e 6 331 51
+11b64 2f 333 51
+11b93 9 335 51
+11b9c 6 337 51
+11ba2 14 338 51
+11bb6 9 340 51
+11bbf a 344 51
+11bc9 2 345 51
+11bcb 1 345 51
+11bcc 1e 349 51
+11bea a 350 51
+11bf4 6 351 51
+11bfa 2f 353 51
+11c29 9 354 51
+11c32 6 356 51
+11c38 14 357 51
+11c4c 9 359 51
+11c55 a 363 51
+11c5f 2 364 51
+11c61 1 364 51
+FUNC 11c62 1c 0 _OSSwapInt32
+11c62 f 53 52
+11c71 8 55 52
+11c79 3 56 52
+11c7c 2 57 52
+FUNC 11c7e 19 0 NXSwapInt
+11c7e f 52 53
+11c8d 8 54 53
+11c95 2 55 53
+11c97 1 55 53
+FUNC 11c98 13 0 NXHostByteOrder
+11c98 c 144 53
+11ca4 5 147 53
+11ca9 2 153 53
+11cab 1 153 53
+11cac c 52 54
+11cb8 12 54 54
+11cca 1a 55 54
+11ce4 2 56 54
+11ce6 c 52 54
+11cf2 12 54 54
+11d04 1a 55 54
+11d1e 2 56 54
+11d20 c 58 54
+11d2c a 59 54
+11d36 d 60 54
+11d43 2 61 54
+11d45 1 61 54
+11d46 c 58 54
+11d52 a 59 54
+11d5c d 60 54
+11d69 2 61 54
+11d6b 1 61 54
+11d6c c 63 54
+11d78 6 66 54
+11d7e 8 67 54
+11d86 6 68 54
+11d8c b 69 54
+11d97 7 74 54
+11d9e 3 80 54
+11da1 2 81 54
+11da3 1 81 54
+11da4 18 96 54
+11dbc 36 97 54
+11df2 2 98 54
+11df4 c 100 54
+11e00 a 101 54
+11e0a 37 102 54
+11e41 11 103 54
+11e52 9 104 54
+11e5b a 107 54
+11e65 2 108 54
+11e67 1 108 54
+11e68 c 110 54
+11e74 15 111 54
+11e89 31 114 54
+11eba c 115 54
+11ec6 10 117 54
+11ed6 4 120 54
+11eda 14 121 54
+11eee 4 122 54
+11ef2 11 129 54
+11f03 28 124 54
+11f2b c 126 54
+11f37 31 133 54
+11f68 c 134 54
+11f74 14 136 54
+11f88 b 137 54
+11f93 8 139 54
+11f9b c 140 54
+11fa7 10 142 54
+11fb7 c 143 54
+11fc3 10 146 54
+11fd3 31 148 54
+12004 c 149 54
+12010 f 151 54
+1201f 14 152 54
+12033 16 154 54
+12049 c 158 54
+12055 31 159 54
+12086 9 160 54
+1208f f 162 54
+1209e 1c 163 54
+120ba 8 165 54
+120c2 10 166 54
+120d2 9 167 54
+120db 16 170 54
+120f1 11 158 54
+12102 a 174 54
+1210c 2 175 54
+1210e 1e 224 54
+1212c c 225 54
+12138 2f 227 54
+12167 c 228 54
+12173 6 230 54
+12179 14 231 54
+1218d 5b 234 54
+121e8 12 237 54
+121fa 11 225 54
+1220b a 240 54
+12215 2 241 54
+12217 1 241 54
+12218 18 203 54
+12230 2f 205 54
+1225f c 206 54
+1226b e 208 54
+12279 6 209 54
+1227f 14 210 54
+12293 9 212 54
+1229c a 213 54
+122a6 f 214 54
+122b5 15 215 54
+122ca 2b 216 54
+122f5 a 217 54
+122ff a 218 54
+12309 11 219 54
+1231a a 220 54
+12324 2 221 54
+12326 18 177 54
+1233e 2f 179 54
+1236d c 180 54
+12379 e 182 54
+12387 6 183 54
+1238d 14 184 54
+123a1 2e 189 54
+123cf 7 190 54
+123d6 9 192 54
+123df a 193 54
+123e9 f 194 54
+123f8 15 195 54
+1240d 2b 196 54
+12438 a 197 54
+12442 a 198 54
+1244c 11 199 54
+1245d a 200 54
+12467 2 201 54
+12469 1 201 54
+1246a c 83 54
+12476 15 84 54
+1248b 1d 86 54
+124a8 d 87 54
+124b5 21 88 54
+124d6 21 90 54
+124f7 a 93 54
+12501 2 94 54
+12503 1 94 54
+FUNC 12504 1c 0 _OSSwapInt32
+12504 f 53 55
+12513 8 55 55
+1251b 3 56 55
+1251e 2 57 55
+FUNC 12520 2b 0 _OSSwapInt64
+12520 12 64 55
+12532 11 69 55
+12543 6 70 55
+12549 2 71 55
+1254b 1 71 55
+FUNC 1254c 19 0 NXSwapLong
+1254c f 61 56
+1255b 8 63 56
+12563 2 64 56
+12565 1 64 56
+FUNC 12566 1f 0 NXSwapLongLong
+12566 12 70 56
+12578 b 72 56
+12583 2 73 56
+12585 1 73 56
+FUNC 12586 32 0 breakpad_swap_uuid_command
+12586 c 37 57
+12592 11 39 57
+125a3 13 40 57
+125b6 2 41 57
+FUNC 125b8 da 0 breakpad_swap_segment_command_64
+125b8 c 44 57
+125c4 11 46 57
+125d5 13 47 57
+125e8 17 49 57
+125ff 17 50 57
+12616 17 51 57
+1262d 17 52 57
+12644 13 54 57
+12657 13 55 57
+1266a 13 56 57
+1267d 13 57 57
+12690 2 58 57
+FUNC 12692 a4 0 breakpad_swap_mach_header_64
+12692 c 61 57
+1269e 11 63 57
+126af 13 64 57
+126c2 13 65 57
+126d5 13 66 57
+126e8 13 67 57
+126fb 13 68 57
+1270e 13 69 57
+12721 13 70 57
+12734 2 71 57
+FUNC 12736 1d1 0 breakpad_swap_section_64
+12736 d 75 57
+12743 c 77 57
+1274f 33 78 57
+12782 33 79 57
+127b5 2d 81 57
+127e2 2d 82 57
+1280f 2d 83 57
+1283c 2d 84 57
+12869 2d 85 57
+12896 2d 86 57
+128c3 2d 87 57
+128f0 11 77 57
+12901 6 89 57
+12907 1 89 57
+12908 12 9 58
+1291a 4f 11 58
+12969 2 12 58
+1296b 1 12 58
+1296c 12 9 58
+1297e 4f 11 58
+129cd 2 12 58
+129cf 1 12 58
+129d0 13 14 58
+129e3 2a 14 58
+12a0d 1 14 58
+12a0e 13 14 58
+12a21 2a 14 58
+12a4b 1 14 58
+12a4c 13 14 58
+12a5f 2a 14 58
+12a89 1 14 58
+12a8a 19 16 58
+12aa3 a 17 58
+12aad 48 18 58
+12af5 6 19 58
+12afb 23 20 58
+12b1e 21 22 58
+12b3f 6 24 58
+12b45 1 24 58
+12b46 19 26 58
+12b5f a 27 58
+12b69 48 28 58
+12bb1 6 29 58
+12bb7 23 30 58
+12bda 21 32 58
+12bfb 6 34 58
+12c01 1 34 58
+12c02 c 24 59
+12c0e c 25 59
+12c1a d 26 59
+12c27 f 27 59
+12c36 f 28 59
+12c45 b 29 59
+12c50 27 30 59
+12c77 2b 32 59
+12ca2 2 34 59
+12ca4 11 36 59
+12cb5 1a 37 59
+12ccf 1b 38 59
+12cea 1d 39 59
+12d07 1d 40 59
+12d24 1d 41 59
+12d41 1d 42 59
+12d5e 1d 43 59
+12d7b 1d 44 59
+12d98 f 45 59
+12da7 18f 47 59
+12f36 172 50 59
+130a8 a 52 59
+130b2 2 52 59
+130b4 15 29 60
+130c9 18 30 60
+130e1 6 31 60
+130e7 d 35 60
+130f4 13 36 60
+13107 9 37 60
+13110 1a 38 60
+1312a 13 40 60
+1313d 9 41 60
+13146 12 43 60
+13158 2 44 60
+1315a 1f 47 60
+13179 65 50 60
+131de 1f 47 60
+131fd 65 50 60
+13262 14 133 60
+13276 82 136 60
+132f8 1f 139 60
+13317 a 140 60
+13321 21 141 60
+13342 c 147 60
+1334e e 151 60
+1335c e 155 60
+1336a e 159 60
+13378 27 162 60
+1339f 1c 166 60
+133bb 10 167 60
+133cb 1c 171 60
+133e7 10 172 60
+133f7 1e 175 60
+13415 56 180 60
+1346b d 181 60
+13478 1e 182 60
+13496 11 183 60
+134a7 1e 184 60
+134c5 24 189 60
+134e9 26 192 60
+1350f 23 195 60
+13532 22 198 60
+13554 15 199 60
+13569 1b 203 60
+13584 30 206 60
+135b4 30 208 60
+135e4 a 209 60
+135ee 7 210 60
+135f5 1 210 60
+135f6 14 217 60
+1360a 9 218 60
+13613 4e 221 60
+13661 17 223 60
+13678 a 224 60
+13682 f 225 60
+13691 4e 227 60
+136df 1e 228 60
+136fd 6 229 60
+13703 5e 231 60
+13761 1e 232 60
+1377f 18 233 60
+13797 4c 235 60
+137e3 1d 236 60
+13800 1c 237 60
+1381c 5 238 60
+13821 9 240 60
+1382a 60 245 60
+1388a 7 247 60
+13891 1 247 60
+13892 24 299 60
+138b6 8a 302 60
+13940 1f 307 60
+1395f a 308 60
+13969 36 309 60
+1399f 5b 316 60
+139fa c 317 60
+13a06 5b 322 60
+13a61 e 323 60
+13a6f 55 328 60
+13ac4 e 329 60
+13ad2 55 334 60
+13b27 e 335 60
+13b35 6 338 60
+13b3b 9a 340 60
+13bd5 33 341 60
+13c08 25 340 60
+13c2d 5c 348 60
+13c89 10 349 60
+13c99 5c 354 60
+13cf5 10 355 60
+13d05 55 359 60
+13d5a 1e 360 60
+13d78 56 365 60
+13dce d 366 60
+13ddb 55 368 60
+13e30 1e 369 60
+13e4e 11 370 60
+13e5f 55 372 60
+13eb4 1e 373 60
+13ed2 29 378 60
+13efb 4a 380 60
+13f45 f 381 60
+13f54 29 385 60
+13f7d 4c 387 60
+13fc9 11 388 60
+13fda 1b 392 60
+13ff5 4c 394 60
+14041 11 395 60
+14052 22 399 60
+14074 4e 401 60
+140c2 15 402 60
+140d7 3c 406 60
+14113 1b 408 60
+1412e 54 409 60
+14182 f 411 60
+14191 9a 413 60
+1422b 24 414 60
+1424f 25 413 60
+14274 30 418 60
+142a4 30 420 60
+142d4 a 421 60
+142de b 422 60
+142e9 1 422 60
+142ea 1f 489 60
+14309 3a 491 60
+14343 a 492 60
+1434d 6 493 60
+14353 1 493 60
+14354 1f 489 60
+14373 3a 491 60
+143ad a 492 60
+143b7 6 493 60
+143bd 1 493 60
+143be 19 426 60
+143d7 13 427 60
+143ea 46 430 60
+14430 3a 427 60
+1446a 3 432 60
+1446d 6 433 60
+14473 1 433 60
+14474 c 122 60
+14480 13 123 60
+14493 27 126 60
+144ba 3a 123 60
+144f4 3 128 60
+144f7 2 129 60
+144f9 1 129 60
+144fa 18 593 60
+14512 a 594 60
+1451c 18 596 60
+14534 8 597 60
+1453c 5 598 60
+14541 19 602 60
+1455a f 603 60
+14569 50 605 60
+145b9 46 607 60
+145ff e0 610 60
+146df 6 612 60
+146e5 22 615 60
+14707 22 616 60
+14729 7 617 60
+14730 b 618 60
+1473b f 619 60
+1474a 5a 623 60
+147a4 7 625 60
+147ab b 626 60
+147b6 f 627 60
+147c5 28 631 60
+147ed e 632 60
+147fb 144 635 60
+1493f 6 637 60
+14945 9e 640 60
+149e3 5 642 60
+149e8 22 644 60
+14a0a e 645 60
+14a18 1c 646 60
+14a34 2b 652 60
+14a5f b 653 60
+14a6a 22 658 60
+14a8c e 659 60
+14a9a 8 660 60
+14aa2 5 662 60
+14aa7 22 664 60
+14ac9 e 665 60
+14ad7 9 666 60
+14ae0 5 668 60
+14ae5 12 670 60
+14af7 5 672 60
+14afc 7 674 60
+14b03 5 676 60
+14b08 16 678 60
+14b1e 9 679 60
+14b27 d9 682 60
+14c00 6 684 60
+14c06 1f 687 60
+14c25 5 689 60
+14c2a 40 693 60
+14c6a d6 696 60
+14d40 6 698 60
+14d46 1c 701 60
+14d62 5 703 60
+14d67 1f 706 60
+14d86 d 707 60
+14d93 13 708 60
+14da6 26 710 60
+14dcc 5 711 60
+14dd1 50 713 60
+14e21 7 715 60
+14e28 b 716 60
+14e33 f 717 60
+14e42 18 725 60
+14e5a f 726 60
+14e69 5 728 60
+14e6e 6 730 60
+14e74 28 732 60
+14e9c d 733 60
+14ea9 22 735 60
+14ecb e 736 60
+14ed9 22 739 60
+14efb e 740 60
+14f09 22 743 60
+14f2b e 744 60
+14f39 a 746 60
+14f43 fd 748 60
+15040 a 758 60
+1504a 9 759 60
+15053 1c 761 60
+1506f d 762 60
+1507c e 763 60
+1508a 2e 759 60
+150b8 b 769 60
+150c3 10 770 60
+150d3 b 771 60
+150de e 773 60
+150ec 9 778 60
+150f5 17 782 60
+1510c 8 783 60
+15114 6 785 60
+1511a 9 787 60
+15123 5 788 60
+15128 19 789 60
+15141 5 790 60
+15146 4a 793 60
+15190 6 794 60
+15196 4a 796 60
+151e0 a 797 60
+151ea f 790 60
+151f9 15 788 60
+1520e 14 801 60
+15222 7 802 60
+15229 1 802 60
+1522a 18 60 60
+15242 e 61 60
+15250 58 65 60
+152a8 38 66 60
+152e0 44 65 60
+15324 2a 66 60
+1534e 45 68 60
+15393 16 69 60
+153a9 1d 75 60
+153c6 6 76 60
+153cc 40 77 60
+1540c b 80 60
+15417 1f 82 60
+15436 e 84 60
+15444 6 77 60
+1544a 1f 68 60
+15469 a 84 60
+15473 1d 79 60
+15490 6 86 60
+15496 a 87 60
+154a0 3d 89 60
+154dd 1f 90 60
+154fc a 91 60
+15506 6 92 60
+1550c 3d 94 60
+15549 1d 95 60
+15566 5 96 60
+1556b 3d 98 60
+155a8 1f 101 60
+155c7 a 102 60
+155d1 3d 104 60
+1560e 1f 105 60
+1562d a 106 60
+15637 c 107 60
+15643 6 111 60
+15649 6 112 60
+1564f 32 113 60
+15681 47 115 60
+156c8 30 116 60
+156f8 24 79 60
+1571c b 118 60
+15727 1 118 60
+15728 18 503 60
+15740 9 504 60
+15749 17 508 60
+15760 a 510 60
+1576a f 511 60
+15779 60 512 60
+157d9 44 516 60
+1581d 1e 518 60
+1583b 6 519 60
+15841 1e 521 60
+1585f 18 522 60
+15877 1d 524 60
+15894 5 525 60
+15899 20 527 60
+158b9 5 528 60
+158be c 530 60
+158ca 5 531 60
+158cf 1d 533 60
+158ec 5 534 60
+158f1 1d 536 60
+1590e 5 537 60
+15913 45 539 60
+15958 1f 540 60
+15977 19 541 60
+15990 15 542 60
+159a5 1f 539 60
+159c4 30 543 60
+159f4 5 544 60
+159f9 14 542 60
+15a0d e 548 60
+15a1b 7 549 60
+15a22 5 550 60
+15a27 6 551 60
+15a2d 8b 552 60
+15ab8 28 553 60
+15ae0 5 554 60
+15ae5 16 550 60
+15afb 25 552 60
+15b20 5 557 60
+15b25 e 560 60
+15b33 7 561 60
+15b3a 5 563 60
+15b3f 6 564 60
+15b45 28 565 60
+15b6d 22 567 60
+15b8f a 568 60
+15b99 22 570 60
+15bbb a 571 60
+15bc5 22 573 60
+15be7 a 574 60
+15bf1 ba 576 60
+15cab 5 577 60
+15cb0 16 563 60
+15cc6 25 576 60
+15ceb 5 580 60
+15cf0 9 582 60
+15cf9 b 583 60
+15d04 c 495 60
+15d10 b 496 60
+15d1b b 497 60
+15d26 19 498 60
+15d3f 2 499 60
+15d41 1 499 60
+15d42 11 435 60
+15d53 9 436 60
+15d5c 9 441 60
+15d65 17 445 60
+15d7c 8 446 60
+15d84 6 448 60
+15d8a 6c 453 60
+15df6 8 455 60
+15dfe 16 453 60
+15e14 3 455 60
+15e17 2f 453 60
+15e46 29 458 60
+15e6f 22 460 60
+15e91 a 462 60
+15e9b a 465 60
+15ea5 1e 466 60
+15ec3 13 467 60
+15ed6 2b 468 60
+15f01 18 472 60
+15f19 9 473 60
+15f22 42 474 60
+15f64 1e 475 60
+15f82 2a 477 60
+15fac b 480 60
+15fb7 1e 481 60
+15fd5 26 483 60
+15ffb 1d 455 60
+16018 24 485 60
+1603c a 486 60
+16046 18 249 60
+1605e 58 251 60
+160b6 35 252 60
+160eb 32 251 60
+1611d 2a 252 60
+16147 20 255 60
+16167 37 256 60
+1619e b 259 60
+161a9 f 264 60
+161b8 17 265 60
+161cf c 266 60
+161db a 268 60
+161e5 95 271 60
+1627a 11 276 60
+1628b b 279 60
+16296 58 282 60
+162ee 2f 283 60
+1631d 32 282 60
+1634f 14 284 60
+16363 1a 285 60
+1637d b 289 60
+16388 12 291 60
+1639a b 292 60
+163a5 1 292 60
+163a6 c 573 61
+163b2 9 576 61
+163bb 23 577 61
+163de 2 578 61
+163e0 c 83 62
+163ec 27 84 62
+16413 1 84 62
+16414 c 38 63
+16420 c 38 63
+1642c c 41 63
+16438 c 41 63
+16444 c 10 64
+16450 9 11 64
+16459 2 12 64
+1645b 1 12 64
+1645c c 14 64
+16468 d 15 64
+16475 e 16 64
+16483 b 17 64
+1648e 17 18 64
+164a5 18 20 64
+164bd 2 22 64
+164bf 1 22 64
+164c0 e 59 64
+164ce e 60 64
+164dc 7 61 64
+164e3 7 62 64
+164ea e 66 64
+164f8 5 67 64
+164fd 38 69 64
+16535 6 71 64
+1653b 8 65 64
+16543 8 75 64
+1654b 6 77 64
+16551 7 78 64
+16558 e 84 64
+16566 e 85 64
+16574 7 86 64
+1657b 7 87 64
+16582 e 91 64
+16590 5 92 64
+16595 44 93 64
+165d9 6 94 64
+165df 8 90 64
+165e7 14 97 64
+165fb 36 98 64
+16631 8 99 64
+16639 6 100 64
+1663f 7 101 64
+16646 13 103 64
+16659 3f 104 64
+16698 4a 105 64
+166e2 6 106 64
+166e8 13 108 64
+166fb 3f 109 64
+1673a 4a 110 64
+16784 6 111 64
+1678a 12 12 65
+1679c 9 13 65
+167a5 11 14 65
+167b6 11 15 65
+167c7 a 16 65
+167d1 a 17 65
+167db 7 18 65
+167e2 7 19 65
+167e9 2 20 65
+167eb 1 20 65
+167ec c 253 66
+167f8 14 254 66
+1680c c 226 66
+16818 8 228 66
+16820 c 229 66
+1682c 5 230 66
+16831 1 230 66
+16832 c 215 66
+1683e a 216 66
+16848 c 190 67
+16854 a 190 67
+1685e c 283 67
+1686a 7 286 67
+16871 1 286 67
+16872 c 65 68
+1687e 2 65 68
+16880 c 97 69
+1688c d 97 69
+16899 1 97 69
+1689a c 99 69
+168a6 14 100 69
+168ba c 97 69
+168c6 d 97 69
+168d3 1 97 69
+168d4 c 84 70
+168e0 17 85 70
+168f7 1 85 70
+168f8 c 144 70
+16904 21 145 70
+16925 1 145 70
+16926 c 202 70
+16932 a 203 70
+1693c c 588 70
+16948 19 589 70
+16961 1 589 70
+16962 c 605 70
+1696e 17 606 70
+16985 1 606 70
+16986 c 65 70
+16992 2 65 70
+16994 c 72 70
+169a0 2 72 70
+169a2 c 97 70
+169ae d 97 70
+169bb 1 97 70
+169bc c 105 70
+169c8 d 105 70
+169d5 1 105 70
+169d6 c 105 70
+169e2 d 105 70
+169ef 1 105 70
+169f0 c 67 70
+169fc 2 67 70
+169fe c 99 70
+16a0a 14 100 70
+16a1e c 99 70
+16a2a 14 100 70
+16a3e c 129 70
+16a4a 30 131 70
+16a7a c 65 70
+16a86 2 65 70
+16a88 c 72 70
+16a94 2 72 70
+16a96 c 97 70
+16aa2 d 97 70
+16aaf 1 97 70
+16ab0 c 105 70
+16abc d 105 70
+16ac9 1 105 70
+16aca c 105 70
+16ad6 d 105 70
+16ae3 1 105 70
+16ae4 c 67 70
+16af0 2 67 70
+16af2 c 99 70
+16afe 14 100 70
+16b12 c 99 70
+16b1e 14 100 70
+16b32 10 93 71
+16b42 1b 94 71
+16b5d 1 94 71
+16b5e c 613 72
+16b6a 7 614 72
+16b71 1 614 72
+16b72 c 80 72
+16b7e d 80 72
+16b8b 1 80 72
+16b8c c 107 72
+16b98 2 107 72
+16b9a c 171 73
+16ba6 2 173 73
+16ba8 12 174 73
+16bba b 173 73
+16bc5 2 174 73
+16bc7 1 174 73
+16bc8 c 84 73
+16bd4 2f 85 73
+16c03 2 86 73
+16c05 1 86 73
+16c06 c 96 73
+16c12 12 97 73
+16c24 2 98 73
+16c26 c 338 73
+16c32 8 340 73
+16c3a b 341 73
+16c45 1 341 73
+16c46 c 105 73
+16c52 d 105 73
+16c5f 1 105 73
+16c60 c 125 73
+16c6c a 126 73
+16c76 c 579 73
+16c82 19 580 73
+16c9b 1 580 73
+16c9c c 597 73
+16ca8 17 597 73
+16cbf 1 597 73
+16cc0 c 603 73
+16ccc c 603 73
+16cd8 c 342 73
+16ce4 1f 343 73
+16d03 1 343 73
+16d04 c 360 73
+16d10 20 361 73
+16d30 c 665 73
+16d3c 5 666 73
+16d41 1 666 73
+16d42 d 758 73
+16d4f 31 759 73
+16d80 c 402 73
+16d8c 30 403 73
+16dbc c 603 73
+16dc8 c 603 73
+16dd4 c 333 73
+16de0 17 334 73
+16df7 1 334 73
+16df8 c 653 73
+16e04 33 654 73
+16e37 1 654 73
+16e38 c 351 73
+16e44 1a 352 73
+16e5e c 613 73
+16e6a 7 614 73
+16e71 1 614 73
+16e72 c 494 73
+16e7e 36 495 73
+16eb4 c 407 73
+16ec0 7 408 73
+16ec7 1 408 73
+16ec8 c 665 73
+16ed4 5 666 73
+16ed9 1 666 73
+16eda c 621 73
+16ee6 d 623 73
+16ef3 5 624 73
+16ef8 c 382 73
+16f04 d 382 73
+16f11 1 382 73
+16f12 10 360 73
+16f22 1b 361 73
+16f3d 1 361 73
+16f3e 10 764 73
+16f4e 1d 765 73
+16f6b 1 765 73
+16f6c c 134 73
+16f78 7 135 73
+16f7f 1 135 73
+16f80 c 107 73
+16f8c 2 107 73
+16f8e c 129 73
+16f9a 30 131 73
+16fca 10 799 73
+16fda 1c 800 73
+16ff6 10 781 73
+17006 1c 782 73
+17022 10 790 73
+17032 1e 791 73
+17050 13 515 73
+17063 15 517 73
+17078 14 518 73
+1708c c 534 73
+17098 12 536 73
+170aa 14 537 73
+170be c 103 73
+170ca 2e 104 73
+170f8 c 84 73
+17104 2f 85 73
+17133 2 86 73
+17135 1 86 73
+17136 c 96 73
+17142 12 97 73
+17154 2 98 73
+17156 c 603 73
+17162 c 603 73
+1716e c 333 73
+1717a 17 334 73
+17191 1 334 73
+17192 c 653 73
+1719e 27 654 73
+171c5 1 654 73
+171c6 c 494 73
+171d2 36 495 73
+17208 c 351 73
+17214 1a 352 73
+1722e c 93 73
+1723a d 94 73
+17247 1 94 73
+17248 c 120 73
+17254 6 122 73
+1725a 1d 123 73
+17277 1 123 73
+17278 c 108 73
+17284 3a 109 73
+172be c 188 73
+172ca 12 189 73
+172dc 2 190 73
+172de c 272 73
+172ea 4b 273 73
+17335 1 273 73
+17336 13 62 74
+17349 10 62 74
+17359 a 63 74
+17363 25 64 74
+17388 1a 66 74
+173a2 13 62 74
+173b5 10 62 74
+173c5 a 63 74
+173cf 25 64 74
+173f4 1a 66 74
+1740e c 188 74
+1741a 12 189 74
+1742c 2 190 74
+1742e d 758 74
+1743b 31 759 74
+1746c c 65 74
+17478 2 65 74
+1747a c 103 74
+17486 d 103 74
+17493 1 103 74
+17494 10 570 74
+174a4 1d 571 74
+174c1 1 571 74
+174c2 c 103 74
+174ce 2e 104 74
+174fc c 172 74
+17508 14 173 74
+1751c c 219 74
+17528 c 221 74
+17534 5 222 74
+17539 1 222 74
+1753a c 138 74
+17546 c 140 74
+17552 5 141 74
+17557 1 141 74
+17558 c 211 74
+17564 a 212 74
+1756e c 130 74
+1757a a 131 74
+17584 c 249 74
+17590 14 250 74
+175a4 d 699 74
+175b1 28 700 74
+175d9 1 700 74
+175da c 171 74
+175e6 2 173 74
+175e8 1a 174 74
+17602 21 173 74
+17623 2 174 74
+17625 1 174 74
+17626 c 127 74
+17632 29 127 74
+1765b 1 127 74
+1765c c 388 74
+17668 41 389 74
+176a9 2 390 74
+176ab 1 390 74
+176ac c 93 74
+176b8 d 94 74
+176c5 1 94 74
+176c6 c 243 74
+176d2 14 244 74
+176e6 c 256 74
+176f2 1a 257 74
+1770c c 106 74
+17718 e 107 74
+17726 d 229 74
+17733 9 231 74
+1773c b 232 74
+17747 1d 233 74
+17764 c 142 74
+17770 d 144 74
+1777d f 145 74
+1778c 18 147 74
+177a4 b 148 74
+177af 5 150 74
+177b4 c 171 74
+177c0 2 173 74
+177c2 1a 174 74
+177dc 21 173 74
+177fd 2 174 74
+177ff 1 174 74
+17800 c 162 74
+1780c f 164 74
+1781b 18 166 74
+17833 b 167 74
+1783e d 169 74
+1784b 5 170 74
+17850 c 988 74
+1785c 15 990 74
+17871 b 991 74
+1787c d 992 74
+17889 1 992 74
+1788a c 163 75
+17896 d 166 75
+178a3 1 166 75
+178a4 d 328 75
+178b1 59 333 75
+1790a c 840 75
+17916 1a 841 75
+17930 c 661 75
+1793c 36 662 75
+17972 c 649 75
+1797e 23 650 75
+179a1 1 650 75
+179a2 c 67 75
+179ae 2 67 75
+179b0 c 99 75
+179bc 14 100 75
+179d0 c 303 75
+179dc 12 304 75
+179ee 2 305 75
+179f0 c 326 75
+179fc 2f 327 75
+17a2b d 328 75
+17a38 c 457 75
+17a44 14 458 75
+17a58 c 211 75
+17a64 2d 211 75
+17a91 1 211 75
+17a92 c 97 75
+17a9e 7 98 75
+17aa5 1 98 75
+17aa6 c 83 75
+17ab2 1d 85 75
+17acf 5 86 75
+17ad4 17 88 75
+17aeb 1 88 75
+17aec c 116 75
+17af8 1e 117 75
+17b16 c 93 75
+17b22 d 94 75
+17b2f 1 94 75
+17b30 c 402 75
+17b3c 28 403 75
+17b64 c 504 75
+17b70 8 506 75
+17b78 14 507 75
+17b8c e 506 75
+17b9a 2 507 75
+17b9c c 391 76
+17ba8 15 393 76
+17bbd 1b 394 76
+17bd8 f 395 76
+17be7 17 396 76
+17bfe c 1081 76
+17c0a 10 1083 76
+17c1a f 1086 76
+17c29 17 1087 76
+17c40 d 1090 76
+17c4d 1 1090 76
+17c4e c 205 76
+17c5a d 208 76
+17c67 1 208 76
+17c68 c 72 76
+17c74 2 72 76
+17c76 c 105 76
+17c82 d 105 76
+17c8f 1 105 76
+17c90 c 603 76
+17c9c c 603 76
+17ca8 c 342 76
+17cb4 1f 343 76
+17cd3 1 343 76
+17cd4 c 360 76
+17ce0 20 361 76
+17d00 c 665 76
+17d0c 5 666 76
+17d11 1 666 76
+17d12 d 758 76
+17d1f 28 759 76
+17d47 1 759 76
+17d48 c 402 76
+17d54 30 403 76
+17d84 c 621 76
+17d90 d 623 76
+17d9d 5 624 76
+17da2 c 665 76
+17dae 5 666 76
+17db3 1 666 76
+17db4 d 699 76
+17dc1 28 700 76
+17de9 1 700 76
+17dea c 171 76
+17df6 2 173 76
+17df8 1a 174 76
+17e12 21 173 76
+17e33 2 174 76
+17e35 1 174 76
+17e36 d 758 76
+17e43 28 759 76
+17e6b 1 759 76
+17e6c c 661 76
+17e78 2a 662 76
+17ea2 c 407 76
+17eae 7 408 76
+17eb5 1 408 76
+17eb6 c 649 76
+17ec2 16 650 76
+17ed8 c 97 76
+17ee4 7 98 76
+17eeb 1 98 76
+17eec c 83 76
+17ef8 1d 85 76
+17f15 5 86 76
+17f1a 10 88 76
+17f2a c 311 76
+17f36 1d 312 76
+17f53 1 312 76
+17f54 d 435 76
+17f61 e 437 76
+17f6f 3c 440 76
+17fab 8 447 76
+17fb3 1 447 76
+17fb4 c 1149 76
+17fc0 15 1151 76
+17fd5 14 1152 76
+17fe9 1 1152 76
+FUNC 17fea 52 0 _M_insert_dispatch<std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >
+17fea c 1126 76
+17ff6 2 1128 76
+17ff8 21 1129 76
+18019 21 1128 76
+1803a 2 1129 76
+FUNC 1803c 36 0 insert<std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >
+1803c c 838 76
+18048 2a 842 76
+18072 e 491 76
+18080 32 492 76
+180b2 64 493 76
+18116 c 211 76
+18122 3d 211 76
+1815f 1 211 76
+18160 d 103 76
+1816d 5c 104 76
+181c9 1 104 76
+181ca c 772 76
+181d6 25 773 76
+181fb 1 773 76
+181fc d 77 76
+18209 5c 81 76
+18265 1 81 76
+18266 c 97 76
+18272 7 98 76
+18279 1 98 76
+1827a c 83 76
+18286 1d 85 76
+182a3 5 86 76
+182a8 10 88 76
+182b8 c 65 76
+182c4 2 65 76
+182c6 c 103 76
+182d2 d 103 76
+182df 1 103 76
+182e0 11 394 76
+182f1 3c 395 76
+1832d 1 395 76
+1832e d 406 76
+1833b 68 407 76
+183a3 1 407 76
+183a4 c 410 76
+183b0 3b 411 76
+183eb 1 411 76
+183ec c 424 76
+183f8 9 426 76
+18401 22 428 76
+18423 2b 430 76
+1844e c 714 76
+1845a 70 715 76
+184ca c 111 76
+184d6 d 111 76
+184e3 1 111 76
+184e4 c 259 76
+184f0 26 259 76
+18516 c 97 76
+18522 7 98 76
+18529 1 98 76
+1852a c 83 76
+18536 1d 85 76
+18553 5 86 76
+18558 10 88 76
+18568 c 398 76
+18574 27 399 76
+1859b 1 399 76
+1859c d 486 76
+185a9 8 491 76
+185b1 12 492 76
+185c3 13 491 76
+185d6 b 494 76
+185e1 19 496 76
+185fa b 497 76
+18605 13 494 76
+18618 6 497 76
+1861e d 447 76
+1862b 1e 450 76
+18649 2a 452 76
+18673 1c 454 76
+1868f 19 462 76
+186a8 c 463 76
+186b4 1e 466 76
+186d2 b 467 76
+186dd 1e 469 76
+186fb 9 470 76
+18704 a 471 76
+1870e b 472 76
+18719 13 467 76
+1872c 15 475 76
+18741 18 476 76
+18759 c 477 76
+18765 34 478 76
+18799 1 478 76
+1879a d 366 76
+187a7 12 367 76
+187b9 39 368 76
+187f2 c 645 76
+187fe 1c 646 76
+FUNC 1881a 4d 0 fill<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char>
+1881a c 539 76
+18826 9 541 76
+1882f 2 542 76
+18831 13 543 76
+18844 21 542 76
+18865 2 543 76
+18867 1 543 76
+18868 c 560 76
+18874 4 567 76
+18878 1b 568 76
+18893 1 568 76
+18894 d 1157 76
+188a1 b 1159 76
+188ac 6 1160 76
+188b2 35 1161 76
+188e7 17 1162 76
+188fe c 95 77
+1890a 14 97 77
+1891e 12 98 77
+18930 5 99 77
+18935 1 99 77
+18936 c 883 77
+18942 2 885 77
+18944 15 886 77
+18959 16 885 77
+1896f 5 887 77
+18974 e 120 77
+18982 c 122 77
+1898e e 124 77
+1899c e 125 77
+189aa e 126 77
+189b8 e 127 77
+189c6 2 128 77
+189c8 20 130 77
+189e8 5a 128 77
+18a42 16 131 77
+18a58 1b 132 77
+18a73 20 134 77
+18a93 a 136 77
+18a9d 1 136 77
+FUNC 18a9e 4c 0 operator=
+18a9e c 0 77
+18aaa 40 211 77
+FUNC 18aea 52 0 copy<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>
+18aea c 280 77
+18af6 1a 283 77
+18b10 12 285 77
+18b22 4 286 77
+18b26 6 287 77
+18b2c b 283 77
+18b37 5 289 77
+18b3c c 307 77
+18b48 4 315 77
+18b4c 1b 317 77
+18b67 1 317 77
+FUNC 18b68 64 0 copy_n<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > > >
+18b68 e 352 77
+18b76 56 354 77
+18bcc c 376 77
+18bd8 4 384 77
+18bdc 4 385 77
+18be0 1b 387 77
+18bfb 1 387 77
+18bfc d 122 78
+18c09 26 124 78
+18c2f 43 125 78
+18c72 2e 126 78
+18ca0 8 127 78
+FUNC 18ca8 54 0 copy_b<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>
+18ca8 c 408 78
+18cb4 1a 411 78
+18cce 1e 412 78
+18cec b 411 78
+18cf7 5 413 78
+18cfc c 432 78
+18d08 4 440 78
+18d0c 1b 443 78
+18d27 1 443 78
+FUNC 18d28 64 0 copy_b_n<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > > >
+18d28 e 480 78
+18d36 56 482 78
+18d8c c 504 78
+18d98 4 514 78
+18d9c 4 515 78
+18da0 1b 517 78
+18dbb 1 517 78
+FUNC 18dbc 4d 0 fill<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev>
+18dbc c 526 78
+18dc8 2 528 78
+18dca 1c 529 78
+18de6 21 528 78
+18e07 2 529 78
+18e09 1 529 78
+18e0a c 560 78
+18e16 4 567 78
+18e1a 1b 568 78
+18e35 1 568 78
+FUNC 18e36 3f 0 copy<unsigned char>
+18e36 c 298 78
+18e42 22 300 78
+18e64 11 301 78
+18e75 1 301 78
+18e76 c 307 78
+18e82 4 315 78
+18e86 1b 317 78
+18ea1 1 317 78
+FUNC 18ea2 64 0 copy_n<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > > >
+18ea2 e 352 78
+18eb0 56 354 78
+18f06 c 376 78
+18f12 4 384 78
+18f16 4 385 78
+18f1a 1b 387 78
+18f35 1 387 78
+18f36 d 122 78
+18f43 26 124 78
+18f69 43 125 78
+18fac 22 126 78
+18fce 8 127 78
+18fd6 c 97 78
+18fe2 7 98 78
+18fe9 1 98 78
+18fea c 83 78
+18ff6 1d 85 78
+19013 5 86 78
+19018 d 88 78
+19025 1 88 78
+19026 c 116 78
+19032 1e 117 78
+19050 c 73 79
+1905c 1b 74 79
+19077 1 74 79
+19078 c 108 79
+19084 23 113 79
+190a7 1 113 79
+190a8 c 252 79
+190b4 1b 254 79
+190cf 1 254 79
+190d0 c 106 79
+190dc d 107 79
+190e9 1 107 79
+190ea c 119 79
+190f6 2 121 79
+190f8 13 122 79
+1910b 21 121 79
+1912c 2 122 79
+1912e c 148 79
+1913a 1c 155 79
+19156 d 188 79
+19163 6 190 79
+19169 2 193 79
+1916b 1c 194 79
+19187 1b 193 79
+191a2 b 196 79
+191ad 12 198 79
+191bf b 199 79
+191ca 13 196 79
+191dd 6 199 79
+191e3 1 199 79
+191e4 c 214 79
+191f0 23 218 79
+19213 1 218 79
+19214 c 308 79
+19220 1b 310 79
+1923b 1 310 79
+1923c d 80 79
+19249 6 82 79
+1924f 2 85 79
+19251 24 86 79
+19275 2c 85 79
+192a1 b 87 79
+192ac b 89 79
+192b7 12 91 79
+192c9 b 92 79
+192d4 13 89 79
+192e7 9 92 79
+192f0 c 108 79
+192fc 23 113 79
+1931f 1 113 79
+19320 c 252 79
+1932c 1b 254 79
+19347 1 254 79
+19348 14 249 79
+1935c 14 251 79
+19370 22 253 79
+19392 f 255 79
+193a1 12 256 79
+193b3 55 257 79
+19408 4b 260 79
+19453 e 264 79
+19461 15 265 79
+19476 e 266 79
+19484 1d 271 79
+194a1 8 272 79
+194a9 e 273 79
+194b7 27 275 79
+194de 6 276 79
+194e4 55 279 79
+19539 25 284 79
+1955e b 285 79
+19569 4f 286 79
+195b8 3 284 79
+195bb 13 279 79
+195ce e 286 79
+195dc 4d 298 79
+19629 36 299 79
+1965f 12 302 79
+19671 13 303 79
+19684 2e 304 79
+196b2 13 286 79
+196c5 b 292 79
+196d0 39 294 79
+19709 23 295 79
+1972c b 296 79
+19737 13 292 79
+1974a 7 304 79
+19751 1 304 79
+19752 c 602 79
+1975e 10 604 79
+1976e 1e 606 79
+1978c 11 607 79
+1979d 25 610 79
+FUNC 197c2 50 0 copy_b<unsigned char>
+197c2 d 422 79
+197cf f 424 79
+197de 24 425 79
+19802 10 426 79
+19812 c 432 79
+1981e 4 440 79
+19822 1b 443 79
+1983d 1 443 79
+FUNC 1983e 64 0 copy_b_n<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > > >
+1983e e 480 79
+1984c 56 482 79
+198a2 c 504 79
+198ae 4 514 79
+198b2 4 515 79
+198b6 1b 517 79
+198d1 1 517 79
+198d2 c 647 79
+198de 1e 649 79
+198fc 8 650 79
+19904 c 182 79
+19910 1b 183 79
+1992b 1 183 79
+1992c c 214 79
+19938 23 218 79
+1995b 1 218 79
+1995c c 308 79
+19968 1b 310 79
+19983 1 310 79
+19984 c 119 79
+19990 2 121 79
+19992 b 122 79
+1999d c 121 79
+199a9 2 122 79
+199ab 1 122 79
+199ac c 148 79
+199b8 1c 155 79
+199d4 d 80 79
+199e1 6 82 79
+199e7 2 85 79
+199e9 12 86 79
+199fb 12 85 79
+19a0d b 87 79
+19a18 b 89 79
+19a23 12 91 79
+19a35 b 92 79
+19a40 13 89 79
+19a53 9 92 79
+19a5c c 108 79
+19a68 23 113 79
+19a8b 1 113 79
+19a8c c 252 79
+19a98 1b 254 79
+19ab3 1 254 79
+19ab4 d 188 79
+19ac1 6 190 79
+19ac7 2 193 79
+19ac9 12 194 79
+19adb 16 193 79
+19af1 b 196 79
+19afc 12 198 79
+19b0e b 199 79
+19b19 13 196 79
+19b2c 6 199 79
+19b32 c 214 79
+19b3e 23 218 79
+19b61 1 218 79
+19b62 c 308 79
+19b6e 1b 310 79
+19b89 1 310 79
+19b8a d 80 79
+19b97 6 82 79
+19b9d 2 85 79
+19b9f 1a 86 79
+19bb9 27 85 79
+19be0 b 87 79
+19beb b 89 79
+19bf6 12 91 79
+19c08 b 92 79
+19c13 13 89 79
+19c26 9 92 79
+19c2f 1 92 79
+19c30 c 108 79
+19c3c 23 113 79
+19c5f 1 113 79
+19c60 c 252 79
+19c6c 1b 254 79
+19c87 1 254 79
+19c88 15 311 79
+19c9d b 313 79
+19ca8 2a 315 79
+19cd2 12 318 79
+19ce4 23 319 79
+19d07 15 320 79
+19d1c c 321 79
+19d28 5a 323 79
+19d82 1c 327 79
+19d9e 35 328 79
+19dd3 16 323 79
+19de9 30 330 79
+19e19 10 343 79
+19e29 48 334 79
+19e71 21 338 79
+19e92 3d 339 79
+19ecf 13 334 79
+19ee2 b 339 79
+19eed 1c 342 79
+19f09 1e 343 79
+19f27 13 339 79
+19f3a 24 343 79
+19f5e e 348 79
+19f6c 1e 349 79
+19f8a e 350 79
+19f98 1d 353 79
+19fb5 8 354 79
+19fbd e 355 79
+19fcb 27 357 79
+19ff2 6 358 79
+19ff8 4d 361 79
+1a045 40 365 79
+1a085 18 367 79
+1a09d 44 368 79
+1a0e1 3 365 79
+1a0e4 19 361 79
+1a0fd 13 365 79
+1a110 e 368 79
+1a11e 3e 379 79
+1a15c 36 381 79
+1a192 12 384 79
+1a1a4 13 385 79
+1a1b7 2e 386 79
+1a1e5 e 368 79
+1a1f3 b 372 79
+1a1fe 39 374 79
+1a237 23 376 79
+1a25a b 377 79
+1a265 13 372 79
+1a278 8 386 79
+1a280 c 657 79
+1a28c 22 658 79
+1a2ae d 422 79
+1a2bb 15 424 79
+1a2d0 48 425 79
+1a318 41 427 79
+1a359 1 427 79
+1a35a d 441 79
+1a367 56 442 79
+1a3bd 1 442 79
+1a3be c 134 79
+1a3ca 7 135 79
+1a3d1 1 135 79
+FUNC 1a3d2 3f 0 copy<uint64*>
+1a3d2 c 298 79
+1a3de 22 300 79
+1a400 11 301 79
+1a411 1 301 79
+1a412 c 307 79
+1a41e 4 315 79
+1a422 1b 317 79
+1a43d 1 317 79
+FUNC 1a43e 27 0 copy_n<uint64**, uint64**>
+1a43e c 325 79
+1a44a 1b 326 79
+1a465 1 326 79
+1a466 c 376 79
+1a472 4 384 79
+1a476 4 385 79
+1a47a 1b 387 79
+1a495 1 387 79
+FUNC 1a496 60 0 copy_b<uint64*>
+1a496 d 422 79
+1a4a3 12 424 79
+1a4b5 2e 425 79
+1a4e3 13 426 79
+1a4f6 c 432 79
+1a502 4 440 79
+1a506 1b 443 79
+1a521 1 443 79
+FUNC 1a522 27 0 copy_b_n<uint64**, uint64**>
+1a522 c 451 79
+1a52e 1b 452 79
+1a549 1 452 79
+1a54a c 504 79
+1a556 4 514 79
+1a55a 4 515 79
+1a55e 1b 517 79
+1a579 1 517 79
+1a57a 13 723 79
+1a58d 1b 726 79
+1a5a8 9 727 79
+1a5b1 13 730 79
+1a5c4 39 732 79
+1a5fd b 735 79
+1a608 27 736 79
+1a62f 2f 740 79
+1a65e 26 748 79
+1a684 15 750 79
+1a699 36 751 79
+1a6cf 22 753 79
+1a6f1 1e 756 79
+1a70f 8 758 79
+1a717 9 759 79
+1a720 15 762 79
+1a735 24 763 79
+1a759 1 763 79
+1a75a e 1443 79
+1a768 2a 1445 79
+1a792 21 1447 79
+1a7b3 1 1447 79
+1a7b4 c 345 79
+1a7c0 e 347 79
+1a7ce 13 348 79
+1a7e1 18 349 79
+1a7f9 1e 352 79
+1a817 1b 353 79
+1a832 c 355 79
+1a83e 2 360 79
+1a840 c 1039 79
+1a84c 13 1041 79
+1a85f 1e 1044 79
+1a87d 11 1045 79
+1a88e 14 1048 79
+1a8a2 c 190 79
+1a8ae 14 191 79
+FUNC 1a8c2 27 0 copy_n<unsigned char*, unsigned char*>
+1a8c2 c 325 79
+1a8ce 1b 326 79
+1a8e9 1 326 79
+1a8ea c 376 79
+1a8f6 4 384 79
+1a8fa 4 385 79
+1a8fe 1b 387 79
+1a919 1 387 79
+1a91a c 73 79
+1a926 1b 74 79
+1a941 1 74 79
+1a942 c 108 79
+1a94e 23 113 79
+1a971 1 113 79
+1a972 c 252 79
+1a97e 1b 254 79
+1a999 1 254 79
+FUNC 1a99a 40 0 copy_n<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*>
+1a99a d 334 79
+1a9a7 33 335 79
+1a9da c 376 79
+1a9e6 4 384 79
+1a9ea 4 385 79
+1a9ee 1b 387 79
+1aa09 1 387 79
+1aa0a c 73 79
+1aa16 1b 74 79
+1aa31 1 74 79
+1aa32 c 108 79
+1aa3e 23 113 79
+1aa61 1 113 79
+1aa62 c 252 79
+1aa6e 1b 254 79
+1aa89 1 254 79
+FUNC 1aa8a 45 0 fill_n<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, long unsigned int, unsigned char>
+1aa8a c 614 79
+1aa96 9 616 79
+1aa9f 2 617 79
+1aaa1 13 618 79
+1aab4 16 617 79
+1aaca 5 619 79
+1aacf 1 619 79
+1aad0 c 636 79
+1aadc 4 641 79
+1aae0 1b 642 79
+1aafb 1 642 79
+1aafc c 182 79
+1ab08 1b 183 79
+1ab23 1 183 79
+1ab24 c 214 79
+1ab30 23 218 79
+1ab53 1 218 79
+1ab54 c 308 79
+1ab60 1b 310 79
+1ab7b 1 310 79
+1ab7c 14 311 79
+1ab90 b 313 79
+1ab9b 21 315 79
+1abbc 9 318 79
+1abc5 23 319 79
+1abe8 15 320 79
+1abfd c 321 79
+1ac09 4e 323 79
+1ac57 11 327 79
+1ac68 30 328 79
+1ac98 35 330 79
+1accd 48 334 79
+1ad15 14 338 79
+1ad29 43 339 79
+1ad6c 11 342 79
+1ad7d 1e 343 79
+1ad9b e 348 79
+1ada9 1e 349 79
+1adc7 e 350 79
+1add5 1d 353 79
+1adf2 8 354 79
+1adfa e 355 79
+1ae08 27 357 79
+1ae2f 6 358 79
+1ae35 4d 361 79
+1ae82 40 365 79
+1aec2 18 367 79
+1aeda 4d 368 79
+1af27 3e 379 79
+1af65 2d 381 79
+1af92 12 384 79
+1afa4 13 385 79
+1afb7 1f 386 79
+1afd6 c 657 79
+1afe2 22 658 79
+1b004 d 422 79
+1b011 15 424 79
+1b026 48 425 79
+1b06e 41 427 79
+1b0af 1 427 79
+1b0b0 c 441 79
+1b0bc 1f 442 79
+1b0db 1 442 79
+1b0dc c 106 79
+1b0e8 e 107 79
+1b0f6 d 328 79
+1b103 59 333 79
+1b15c d 229 79
+1b169 9 231 79
+1b172 b 232 79
+1b17d 1d 233 79
+1b19a c 142 79
+1b1a6 d 144 79
+1b1b3 f 145 79
+1b1c2 18 147 79
+1b1da b 148 79
+1b1e5 5 150 79
+FUNC 1b1ea 84 0 copy<std::_Deque_iterator<uint64, const uint64&, const uint64*>, std::_Deque_iterator<uint64, uint64&, uint64*> >
+1b1ea e 280 79
+1b1f8 17 283 79
+1b20f 20 285 79
+1b22f b 286 79
+1b23a b 287 79
+1b245 b 283 79
+1b250 1e 289 79
+1b26e 11 307 79
+1b27f 4 315 79
+1b283 69 317 79
+FUNC 1b2ec 7a 0 copy_n<std::_Deque_iterator<uint64, const uint64&, const uint64*>, std::_Deque_iterator<uint64, uint64&, uint64*> >
+1b2ec 11 325 79
+1b2fd 69 326 79
+1b366 11 376 79
+1b377 4 384 79
+1b37b 4 385 79
+1b37f 69 387 79
+1b3e8 11 73 79
+1b3f9 69 74 79
+1b462 11 108 79
+1b473 71 113 79
+1b4e4 11 252 79
+1b4f5 69 254 79
+1b55e 10 679 79
+1b56e 64 680 79
+1b5d2 e8 681 79
+1b6ba c 143 79
+1b6c6 14 144 79
+1b6da 6 144 79
+FUNC 1b6e0 4d 0 __eprintf
+1b6e0 6 1826 80
+1b6e6 3 1832 80
+1b6e9 c 1826 80
+1b6f5 29 1832 80
+1b71e a 1837 80
+1b728 5 1838 80
+1b72d e8d3 1838 80
diff --git a/src/common/mac/dump_syms.h b/src/common/mac/dump_syms.h
index 1b2bedc7..e234a6a6 100644
--- a/src/common/mac/dump_syms.h
+++ b/src/common/mac/dump_syms.h
@@ -30,9 +30,14 @@
// dump_syms.h: Interface for DumpSymbols. This class will take a mach-o file
// and extract the symbol information and write it to a file using the
// breakpad symbol file format.
-// NOTE: Only Stabs format is currently supported -- not DWARF.
#import <Foundation/Foundation.h>
+#include <mach-o/loader.h>
+#include "common/mac/dwarf/dwarf2reader.h"
+
+// This will map from an architecture string to a SectionMap, which
+// will contain the offsets for all the sections in the dictionary
+typedef hash_map<string, dwarf2reader::SectionMap *> ArchSectionMap;
@interface DumpSymbols : NSObject {
@protected
@@ -43,8 +48,9 @@
NSMutableDictionary *sources_; // Address and Source file paths (STRONG)
NSMutableArray *cppAddresses_; // Addresses of C++ symbols (STRONG)
NSMutableDictionary *headers_; // Mach-o header information (STRONG)
- NSMutableDictionary *sectionNumbers_; // Keyed by seg/sect name (STRONG)
+ NSMutableDictionary *sectionData_; // Keyed by seg/sect name (STRONG)
uint32_t lastStartAddress_;
+ ArchSectionMap *sectionsForArch_;
}
- (id)initWithContentsOfFile:(NSString *)machoFile;
@@ -61,3 +67,14 @@
- (BOOL)writeSymbolFile:(NSString *)symbolFilePath;
@end
+
+@interface MachSection : NSObject {
+ @protected
+ struct section *sect_;
+ uint32_t sectionNumber_;
+}
+- (id)initWithMachSection:(struct section *)sect andNumber:(uint32_t)sectionNumber;
+- (struct section*)sectionPointer;
+- (uint32_t)sectionNumber;
+
+@end
diff --git a/src/common/mac/dump_syms.mm b/src/common/mac/dump_syms.mm
index 133c6ab2..d5ae55f8 100644
--- a/src/common/mac/dump_syms.mm
+++ b/src/common/mac/dump_syms.mm
@@ -47,6 +47,9 @@
#import "dump_syms.h"
#import "common/mac/file_id.h"
#import "common/mac/macho_utilities.h"
+#import "common/mac/dwarf/dwarf2reader.h"
+#import "common/mac/dwarf/functioninfo.h"
+#import "common/mac/dwarf/bytereader.h"
using google_breakpad::FileID;
@@ -65,6 +68,40 @@ static NSString *kUnknownSymbol = @"???";
// for pruning out extraneous non-function symbols.
static const int kTextSection = 1;
+namespace __gnu_cxx {
+template<>
+ struct hash<std::string> {
+ size_t operator()(const std::string& k) const {
+ return hash< const char* >()( k.c_str() );
+ }
+};
+}
+
+// Dump FunctionMap to stdout. Print address, function name, file
+// name, line number, lowpc, and highpc if available.
+void DumpFunctionMap(const dwarf2reader::FunctionMap function_map) {
+ for (dwarf2reader::FunctionMap::const_iterator iter = function_map.begin();
+ iter != function_map.end(); ++iter) {
+ if (iter->second->name.empty()) {
+ continue;
+ }
+ printf("%08llx: %s", iter->first,
+ iter->second->name.data());
+ if (!iter->second->file.empty()) {
+ printf(" - %s", iter->second->file.data());
+ if (iter->second->line != 0) {
+ printf(":%u", iter->second->line);
+ }
+ }
+ if (iter->second->lowpc != 0 && iter->second->highpc != 0) {
+ printf(" (%08llx - %08llx)\n",
+ iter->second->lowpc,
+ iter->second->highpc);
+ }
+ }
+}
+
+
@interface DumpSymbols(PrivateMethods)
- (NSArray *)convertCPlusPlusSymbols:(NSArray *)symbols;
- (void)convertSymbols;
@@ -73,10 +110,17 @@ static const int kTextSection = 1;
- (BOOL)loadSymbolInfo:(void *)base offset:(uint32_t)offset;
- (BOOL)loadSymbolInfo64:(void *)base offset:(uint32_t)offset;
- (BOOL)loadSymbolInfoForArchitecture;
+- (BOOL)loadDWARFSymbolInfo:(void *)base offset:(uint32_t)offset;
+- (BOOL)loadSTABSSymbolInfo:(void *)base offset:(uint32_t)offset;
- (void)generateSectionDictionary:(struct mach_header*)header;
- (BOOL)loadHeader:(void *)base offset:(uint32_t)offset;
- (BOOL)loadHeader64:(void *)base offset:(uint32_t)offset;
- (BOOL)loadModuleInfo;
+- (void)processDWARFLineNumberInfo:(dwarf2reader::LineMap*)line_map;
+- (void)processDWARFFunctionInfo:(dwarf2reader::FunctionMap*)address_to_funcinfo;
+- (void)processDWARFSourceFileInfo:(vector<dwarf2reader::SourceFileInfo>*) files;
+- (BOOL)loadSymbolInfo:(void *)base offset:(uint32_t)offset;
+- (dwarf2reader::SectionMap*)getSectionMapForArchitecture:(NSString*)architecture;
@end
@implementation DumpSymbols
@@ -241,6 +285,7 @@ static const int kTextSection = 1;
if (line && ![dict objectForKey:kAddressSourceLineKey])
[dict setObject:[NSNumber numberWithUnsignedInt:line]
forKey:kAddressSourceLineKey];
+
}
//=============================================================================
@@ -277,7 +322,9 @@ static const int kTextSection = 1;
int line = list->n_desc;
// __TEXT __text section
- uint32_t mainSection = [[sectionNumbers_ objectForKey:@"__TEXT__text" ] unsignedLongValue];
+ NSMutableDictionary *archSections = [sectionData_ objectForKey:architecture_];
+
+ uint32_t mainSection = [[archSections objectForKey:@"__TEXT__text" ] sectionNumber];
// Extract debugging information:
// Doc: http://developer.apple.com/documentation/DeveloperTools/gdb/stabs/stabs_toc.html
@@ -303,7 +350,7 @@ static const int kTextSection = 1;
sources_ = [[NSMutableDictionary alloc] init];
// Save the source associated with an address
[sources_ setObject:src forKey:address];
-
+ NSLog(@"Setting source %@ for %@", src, address);
result = YES;
}
} else if (list->n_type == N_FUN) {
@@ -321,7 +368,7 @@ static const int kTextSection = 1;
[self addFunction:fn line:line address:list->n_value section:list->n_sect ];
result = YES;
- } else if (list->n_type == N_SLINE && list->n_sect == mainSection ) {
+ } else if (list->n_type == N_SLINE && list->n_sect == mainSection) {
[self addFunction:nil line:line address:list->n_value section:list->n_sect ];
result = YES;
} else if (((list->n_type & N_TYPE) == N_SECT) && !(list->n_type & N_STAB)) {
@@ -339,8 +386,155 @@ static const int kTextSection = 1;
#define SwapLongIfNeeded(a) (swap ? NXSwapLong(a) : (a))
#define SwapIntIfNeeded(a) (swap ? NXSwapInt(a) : (a))
#define SwapShortIfNeeded(a) (swap ? NXSwapShort(a) : (a))
+
//=============================================================================
- (BOOL)loadSymbolInfo:(void *)base offset:(uint32_t)offset {
+ NSMutableDictionary *archSections = [sectionData_ objectForKey:architecture_];
+ if ([archSections objectForKey:@"__DWARF__debug_info"]) {
+ // Treat this this as debug information
+ return [self loadDWARFSymbolInfo:base offset:offset];
+ }
+
+ return [self loadSTABSSymbolInfo:base offset:offset];
+}
+
+//=============================================================================
+- (BOOL)loadDWARFSymbolInfo:(void *)base offset:(uint32_t)offset {
+
+ struct mach_header *header = (struct mach_header *)
+ ((uint32_t)base + offset);
+ BOOL swap = (header->magic == MH_CIGAM);
+
+ NSMutableDictionary *archSections = [sectionData_ objectForKey:architecture_];
+ assert (archSections != nil);
+ section *dbgInfoSection = [[archSections objectForKey:@"__DWARF__debug_info"] sectionPointer];
+ uint32_t debugInfoSize = SwapLongIfNeeded(dbgInfoSection->size);
+
+ // i think this will break if run on a big-endian machine
+ dwarf2reader::ByteReader byte_reader(swap ?
+ dwarf2reader::ENDIANNESS_BIG :
+ dwarf2reader::ENDIANNESS_LITTLE);
+
+ uint64_t dbgOffset = 0;
+
+ dwarf2reader::SectionMap* oneArchitectureSectionMap = [self getSectionMapForArchitecture:architecture_];
+
+ while (dbgOffset < debugInfoSize) {
+ // Prepare necessary objects.
+ dwarf2reader::FunctionMap off_to_funcinfo;
+ dwarf2reader::FunctionMap address_to_funcinfo;
+ dwarf2reader::LineMap line_map;
+ vector<dwarf2reader::SourceFileInfo> files;
+ vector<string> dirs;
+
+ dwarf2reader::CULineInfoHandler line_info_handler(&files, &dirs,
+ &line_map);
+
+ dwarf2reader::CUFunctionInfoHandler function_info_handler(&files, &dirs,
+ &line_map,
+ &off_to_funcinfo,
+ &address_to_funcinfo,
+ &line_info_handler,
+ *oneArchitectureSectionMap,
+ &byte_reader);
+
+ dwarf2reader::CompilationUnit compilation_unit(*oneArchitectureSectionMap,
+ dbgOffset,
+ &byte_reader,
+ &function_info_handler);
+
+ dbgOffset += compilation_unit.Start();
+
+ // The next 3 functions take the info that the dwarf reader
+ // gives and massages them into the data structures that
+ // dump_syms uses
+ [self processDWARFSourceFileInfo:&files];
+ [self processDWARFFunctionInfo:&address_to_funcinfo];
+ [self processDWARFLineNumberInfo:&line_map];
+ }
+
+ return YES;
+}
+
+- (void)processDWARFSourceFileInfo:(vector<dwarf2reader::SourceFileInfo>*) files {
+ if (!sources_)
+ sources_ = [[NSMutableDictionary alloc] init];
+ // Save the source associated with an address
+ vector<dwarf2reader::SourceFileInfo>::const_iterator iter = files->begin();
+ for (; iter != files->end(); iter++) {
+ NSString *sourceFile = [NSString stringWithUTF8String:(*iter).name.c_str()];
+ if ((*iter).lowpc != ULLONG_MAX) {
+ NSNumber *address = [NSNumber numberWithUnsignedLongLong:(*iter).lowpc];
+ [sources_ setObject:sourceFile forKey:address];
+ }
+ }
+}
+
+- (void)processDWARFFunctionInfo:(dwarf2reader::FunctionMap*)address_to_funcinfo {
+ for (dwarf2reader::FunctionMap::const_iterator iter = address_to_funcinfo->begin();
+ iter != address_to_funcinfo->end(); ++iter) {
+ if (iter->second->name.empty()) {
+ continue;
+ }
+
+ if (!addresses_)
+ addresses_ = [[NSMutableDictionary alloc] init];
+
+ NSNumber *addressNum = [NSNumber numberWithUnsignedLongLong:(*iter).second->lowpc];
+
+ [functionAddresses_ addObject:addressNum];
+
+ NSMutableDictionary *dict = [addresses_ objectForKey:addressNum];
+
+ if (!dict) {
+ dict = [[NSMutableDictionary alloc] init];
+ [addresses_ setObject:dict forKey:addressNum];
+ [dict release];
+ }
+
+ // set name of function if it isn't already set
+ if (![dict objectForKey:kAddressSymbolKey]) {
+ NSString *symbolName = [NSString stringWithUTF8String:iter->second->name.c_str()];
+ [dict setObject:symbolName forKey:kAddressSymbolKey];
+ }
+
+ // set line number for beginning of function
+ if (![dict objectForKey:kAddressSourceLineKey])
+ [dict setObject:[NSNumber numberWithUnsignedInt:iter->second->line]
+ forKey:kAddressSourceLineKey];
+
+ // set function size by subtracting low PC from high PC
+ if (![dict objectForKey:kFunctionSizeKey]) {
+ [dict setObject:[NSNumber numberWithUnsignedLongLong:iter->second->highpc - iter->second->lowpc]
+ forKey:kFunctionSizeKey];
+ }
+
+ }
+}
+
+- (void)processDWARFLineNumberInfo:(dwarf2reader::LineMap*)line_map {
+ for (dwarf2reader::LineMap::const_iterator iter = line_map->begin();
+ iter != line_map->end();
+ ++iter) {
+
+ NSNumber *addressNum = [NSNumber numberWithUnsignedLongLong:iter->first];
+ NSMutableDictionary *dict = [addresses_ objectForKey:addressNum];
+
+ if (!dict) {
+ dict = [[NSMutableDictionary alloc] init];
+ [addresses_ setObject:dict forKey:addressNum];
+ [dict release];
+ }
+
+ if (![dict objectForKey:kAddressSourceLineKey]) {
+ [dict setObject:[NSNumber numberWithUnsignedInt:iter->second.second]
+ forKey:kAddressSourceLineKey];
+ }
+ }
+}
+
+//=============================================================================
+- (BOOL)loadSTABSSymbolInfo:(void *)base offset:(uint32_t)offset {
struct mach_header *header = (struct mach_header *)((uint32_t)base + offset);
BOOL swap = (header->magic == MH_CIGAM);
uint32_t count = SwapLongIfNeeded(header->ncmds);
@@ -434,6 +628,7 @@ static const int kTextSection = 1;
- (BOOL)loadSymbolInfoForArchitecture {
NSMutableData *data = [[NSMutableData alloc]
initWithContentsOfMappedFile:sourcePath_];
+
NSDictionary *headerInfo = [headers_ objectForKey:architecture_];
void *base = [data mutableBytes];
uint32_t offset =
@@ -446,10 +641,28 @@ static const int kTextSection = 1;
return result;
}
+- (dwarf2reader::SectionMap*)getSectionMapForArchitecture:(NSString*)architecture {
+
+ string currentArch([architecture UTF8String]);
+ dwarf2reader::SectionMap *oneArchitectureSectionMap;
+
+ ArchSectionMap::const_iterator iter = sectionsForArch_->find(currentArch);
+
+ if (iter == sectionsForArch_->end()) {
+ oneArchitectureSectionMap = new dwarf2reader::SectionMap();
+ sectionsForArch_->insert(make_pair(currentArch, oneArchitectureSectionMap));
+ } else {
+ oneArchitectureSectionMap = iter->second;
+ }
+
+ return oneArchitectureSectionMap;
+}
+
//=============================================================================
// build a dictionary of section numbers keyed off a string
// which is the concatenation of the segment name and the section name
- (void)generateSectionDictionary:(struct mach_header*)header {
+
BOOL swap = (header->magic == MH_CIGAM);
uint32_t count = SwapLongIfNeeded(header->ncmds);
struct load_command *cmd =
@@ -457,8 +670,29 @@ static const int kTextSection = 1;
uint32_t segmentCommand = SwapLongIfNeeded(LC_SEGMENT);
uint32_t sectionNumber = 1; // section numbers are counted from 1
- if (!sectionNumbers_)
- sectionNumbers_ = [[NSMutableDictionary alloc] init];
+ cpu_type_t cpu = SwapIntIfNeeded(header->cputype);
+
+ NSString *arch;
+
+ if (cpu & CPU_ARCH_ABI64)
+ arch = ((cpu & ~CPU_ARCH_ABI64) == CPU_TYPE_X86) ?
+ @"x86_64" : @"ppc64";
+ else
+ arch = (cpu == CPU_TYPE_X86) ? @"x86" : @"ppc";
+
+ NSMutableDictionary *archSections;
+
+ if (!sectionData_) {
+ sectionData_ = [[NSMutableDictionary alloc] init];
+ }
+
+ if (![sectionData_ objectForKey:architecture_]) {
+ [sectionData_ setObject:[[NSMutableDictionary alloc] init] forKey:arch];
+ }
+
+ archSections = [sectionData_ objectForKey:arch];
+
+ dwarf2reader::SectionMap* oneArchitectureSectionMap = [self getSectionMapForArchitecture:arch];
// loop through every segment command, then through every section
// contained inside each of them
@@ -469,13 +703,18 @@ static const int kTextSection = 1;
uint32_t nsects = SwapLongIfNeeded(seg->nsects);
for (uint32_t j = 0; j < nsects; ++j) {
- //printf("%d: %s %s\n", sectionNumber, seg->segname, sect->sectname );
NSString *segSectName = [NSString stringWithFormat:@"%s%s",
- seg->segname, sect->sectname ];
-
- [sectionNumbers_ setValue:[NSNumber numberWithUnsignedLong:sectionNumber]
- forKey:segSectName ];
+ seg->segname, sect->sectname];
+ [archSections setObject:[[MachSection alloc] initWithMachSection:sect andNumber:sectionNumber]
+ forKey:segSectName];
+
+ // filter out sections with size 0, offset 0
+ if (sect->offset != 0 && sect->size != 0) {
+ // fill sectionmap for dwarf reader
+ oneArchitectureSectionMap->insert(make_pair(sect->sectname,make_pair(((const char*)header) + SwapLongIfNeeded(sect->offset), (size_t)SwapLongIfNeeded(sect->size))));
+ }
+
++sect;
++sectionNumber;
}
@@ -825,6 +1064,49 @@ static BOOL WriteFormat(int fd, const char *fmt, ...) {
sourcePath_ = [path copy];
+ // Test for .DSYM bundle
+ NSBundle *dsymBundle = [NSBundle bundleWithPath:sourcePath_];
+
+ if (dsymBundle) {
+
+ // we need to take the DSYM bundle path and remove it's
+ // extension to get the name of the file inside the resources
+ // directory of the bundle that actually has the DWARF
+ // information
+ // But, Xcode supports something called "Wrapper extension"(see
+ // build settings), which would make the bundle name
+ // /tmp/foo/test.kext.dSYM, but the dwarf binary name would
+ // still be "test". so, now we loop through until deleting the
+ // extension doesn't change the string
+
+ // e.g. suppose sourcepath_ is /tmp/foo/test.dSYM
+
+ NSString *dwarfBinName = [[sourcePath_ lastPathComponent] stringByDeletingPathExtension];
+
+ // now, dwarfBinName is "test"
+
+ while (![[dwarfBinName stringByDeletingPathExtension] isEqualToString:dwarfBinName]) {
+ dwarfBinName = [dwarfBinName stringByDeletingPathExtension];
+ }
+
+ NSString *dwarfBinPath;
+ dwarfBinPath = [dsymBundle pathForResource:dwarfBinName ofType:nil inDirectory:@"DWARF"];
+
+ if (dwarfBinPath == nil) {
+ NSLog(@"The bundle passed on the command line does not appear to be a DWARF dSYM bundle");
+ [self autorelease];
+ return nil;
+ }
+
+ // otherwise we're good to go
+ [sourcePath_ release];
+
+ sourcePath_ = [dwarfBinPath copy];
+ NSLog(@"Loading DWARF dSYM file from %@", sourcePath_);
+ }
+
+ sectionsForArch_ = new ArchSectionMap();
+
if (![self loadModuleInfo]) {
[self autorelease];
return nil;
@@ -868,7 +1150,8 @@ static BOOL WriteFormat(int fd, const char *fmt, ...) {
[functionAddresses_ release];
[sources_ release];
[headers_ release];
-
+ delete sectionsForArch_;
+
[super dealloc];
}
@@ -899,7 +1182,7 @@ static BOOL WriteFormat(int fd, const char *fmt, ...) {
return NO;
[architecture_ autorelease];
- architecture_ = [architecture copy];
+ architecture_ = [normalized copy];
}
return isValid;
@@ -931,3 +1214,23 @@ static BOOL WriteFormat(int fd, const char *fmt, ...) {
}
@end
+
+@implementation MachSection
+
+- (id)initWithMachSection:(section *)sect andNumber:(uint32_t)sectionNumber {
+ if ((self = [super init])) {
+ sect_ = sect;
+ sectionNumber_ = sectionNumber;
+ }
+
+ return self;
+}
+
+- (section*)sectionPointer {
+ return sect_;
+}
+
+- (uint32_t)sectionNumber {
+ return sectionNumber_;
+}
+@end
diff --git a/src/common/mac/dwarf/bytereader-inl.h b/src/common/mac/dwarf/bytereader-inl.h
new file mode 100644
index 00000000..7ccd0fe6
--- /dev/null
+++ b/src/common/mac/dwarf/bytereader-inl.h
@@ -0,0 +1,141 @@
+// Copyright 2006 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.
+
+#ifndef UTIL_DEBUGINFO_BYTEREADER_INL_H__
+#define UTIL_DEBUGINFO_BYTEREADER_INL_H__
+
+#include "common/mac/dwarf/bytereader.h"
+
+namespace dwarf2reader {
+
+inline uint8 ByteReader::ReadOneByte(const char* buffer) const {
+ return buffer[0];
+}
+
+inline uint16 ByteReader::ReadTwoBytes(const char* buffer) const {
+ const uint16 buffer0 = static_cast<uint16>(buffer[0]);
+ const uint16 buffer1 = static_cast<uint16>(buffer[1]);
+ if (endian_ == ENDIANNESS_LITTLE) {
+ return buffer0 | buffer1 << 8;
+ } else {
+ return buffer1 | buffer0 << 8;
+ }
+}
+
+inline uint64 ByteReader::ReadFourBytes(const char* buffer) const {
+ const uint32 buffer0 = static_cast<uint32>(buffer[0]);
+ const uint32 buffer1 = static_cast<uint32>(buffer[1]);
+ const uint32 buffer2 = static_cast<uint32>(buffer[2]);
+ const uint32 buffer3 = static_cast<uint32>(buffer[3]);
+ if (endian_ == ENDIANNESS_LITTLE) {
+ return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24;
+ } else {
+ return buffer3 | buffer2 << 8 | buffer1 << 16 | buffer0 << 24;
+ }
+}
+
+inline uint64 ByteReader::ReadEightBytes(const char* buffer) const {
+ const uint64 buffer0 = static_cast<uint64>(buffer[0]);
+ const uint64 buffer1 = static_cast<uint64>(buffer[1]);
+ const uint64 buffer2 = static_cast<uint64>(buffer[2]);
+ const uint64 buffer3 = static_cast<uint64>(buffer[3]);
+ const uint64 buffer4 = static_cast<uint64>(buffer[4]);
+ const uint64 buffer5 = static_cast<uint64>(buffer[5]);
+ const uint64 buffer6 = static_cast<uint64>(buffer[6]);
+ const uint64 buffer7 = static_cast<uint64>(buffer[7]);
+ if (endian_ == ENDIANNESS_LITTLE) {
+ return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24 |
+ buffer4 << 32 | buffer5 << 40 | buffer6 << 48 | buffer7 << 56;
+ } else {
+ return buffer7 | buffer6 << 8 | buffer5 << 16 | buffer4 << 24 |
+ buffer3 << 32 | buffer2 << 40 | buffer1 << 48 | buffer0 << 56;
+ }
+}
+
+// Read an unsigned LEB128 number. Each byte contains 7 bits of
+// information, plus one bit saying whether the number continues or
+// not.
+
+inline uint64 ByteReader::ReadUnsignedLEB128(const char* buffer,
+ size_t* len) const {
+ uint64 result = 0;
+ size_t num_read = 0;
+ unsigned int shift = 0;
+ unsigned char byte;
+
+ do {
+ byte = *buffer++;
+ num_read++;
+
+ result |= (static_cast<uint64>(byte & 0x7f)) << shift;
+
+ shift += 7;
+
+ } while (byte & 0x80);
+
+ *len = num_read;
+
+ return result;
+}
+
+// Read a signed LEB128 number. These are like regular LEB128
+// numbers, except the last byte may have a sign bit set.
+
+inline int64 ByteReader::ReadSignedLEB128(const char* buffer,
+ size_t* len) const {
+ int64 result = 0;
+ unsigned int shift = 0;
+ size_t num_read = 0;
+ unsigned char byte;
+
+ do {
+ byte = *buffer++;
+ num_read++;
+ result |= (static_cast<uint64>(byte & 0x7f) << shift);
+ shift += 7;
+ } while (byte & 0x80);
+
+ if ((shift < 8 * sizeof (result)) && (byte & 0x40))
+ result |= -((static_cast<int64>(1)) << shift);
+ *len = num_read;
+ return result;
+}
+
+inline uint64 ByteReader::ReadOffset(const char* buffer) const {
+ assert(this->offset_reader_);
+ return (this->*offset_reader_)(buffer);
+}
+
+inline uint64 ByteReader::ReadAddress(const char* buffer) const {
+ assert(this->address_reader_);
+ return (this->*address_reader_)(buffer);
+}
+
+} // namespace dwarf2reader
+
+#endif // UTIL_DEBUGINFO_BYTEREADER_INL_H__
diff --git a/src/common/mac/dwarf/bytereader.cc b/src/common/mac/dwarf/bytereader.cc
new file mode 100644
index 00000000..823cf2b6
--- /dev/null
+++ b/src/common/mac/dwarf/bytereader.cc
@@ -0,0 +1,62 @@
+// Copyright 2006 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.
+
+#include "common/mac/dwarf/bytereader-inl.h"
+
+#include "common/mac/dwarf/bytereader.h"
+
+namespace dwarf2reader {
+
+ByteReader::ByteReader(enum Endianness endian)
+ :offset_reader_(NULL), address_reader_(NULL), endian_(endian),
+ address_size_(0), offset_size_(0)
+{ }
+
+ByteReader::~ByteReader() { }
+
+void ByteReader::SetOffsetSize(uint8 size) {
+ offset_size_ = size;
+ assert(size == 4 || size == 8);
+ if (size == 4) {
+ this->offset_reader_ = &ByteReader::ReadFourBytes;
+ } else {
+ this->offset_reader_ = &ByteReader::ReadEightBytes;
+ }
+}
+
+void ByteReader::SetAddressSize(uint8 size) {
+ address_size_ = size;
+ assert(size == 4 || size == 8);
+ if (size == 4) {
+ this->address_reader_ = &ByteReader::ReadFourBytes;
+ } else {
+ this->address_reader_ = &ByteReader::ReadEightBytes;
+ }
+}
+
+} // namespace dwarf2reader
diff --git a/src/common/mac/dwarf/bytereader.h b/src/common/mac/dwarf/bytereader.h
new file mode 100644
index 00000000..299dd9ac
--- /dev/null
+++ b/src/common/mac/dwarf/bytereader.h
@@ -0,0 +1,132 @@
+// Copyright 2006 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.
+
+#ifndef COMMON_MAC_DWARF_BYTEREADER_H__
+#define COMMON_MAC_DWARF_BYTEREADER_H__
+
+#include <string>
+#include "common/mac/dwarf/types.h"
+
+namespace dwarf2reader {
+
+// We can't use the obvious name of LITTLE_ENDIAN and BIG_ENDIAN
+// because it conflicts with a macro
+enum Endianness {
+ ENDIANNESS_BIG,
+ ENDIANNESS_LITTLE
+};
+
+// Class that knows how to read both big endian and little endian
+// numbers, for use in DWARF2/3 reader.
+// Takes an endianness argument.
+// To read addresses and offsets, SetAddressSize and SetOffsetSize
+// must be called first.
+class ByteReader {
+ public:
+ explicit ByteReader(enum Endianness endian);
+ virtual ~ByteReader();
+
+ // Set the address size to SIZE, which sets up the ReadAddress member
+ // so that it works.
+ void SetAddressSize(uint8 size);
+
+ // Set the offset size to SIZE, which sets up the ReadOffset member
+ // so that it works.
+ void SetOffsetSize(uint8 size);
+
+ // Return the current offset size
+ uint8 OffsetSize() const { return offset_size_; }
+
+ // Return the current address size
+ uint8 AddressSize() const { return address_size_; }
+
+ // Read a single byte from BUFFER and return it as an unsigned 8 bit
+ // number.
+ uint8 ReadOneByte(const char* buffer) const;
+
+ // Read two bytes from BUFFER and return it as an unsigned 16 bit
+ // number.
+ uint16 ReadTwoBytes(const char* buffer) const;
+
+ // Read four bytes from BUFFER and return it as an unsigned 32 bit
+ // number. This function returns a uint64 so that it is compatible
+ // with ReadAddress and ReadOffset. The number it returns will
+ // never be outside the range of an unsigned 32 bit integer.
+ uint64 ReadFourBytes(const char* buffer) const;
+
+ // Read eight bytes from BUFFER and return it as an unsigned 64 bit
+ // number
+ uint64 ReadEightBytes(const char* buffer) const;
+
+ // Read an unsigned LEB128 (Little Endian Base 128) number from
+ // BUFFER and return it as an unsigned 64 bit integer. LEN is set
+ // to the length read. Everybody seems to reinvent LEB128 as a
+ // variable size integer encoding, DWARF has had it for a long time.
+ uint64 ReadUnsignedLEB128(const char* buffer, size_t* len) const;
+
+ // Read a signed LEB128 number from BUFFER and return it as an
+ // signed 64 bit integer. LEN is set to the length read.
+ int64 ReadSignedLEB128(const char* buffer, size_t* len) const;
+
+ // Read an offset from BUFFER and return it as an unsigned 64 bit
+ // integer. DWARF2/3 define offsets as either 4 or 8 bytes,
+ // generally depending on the amount of DWARF2/3 info present.
+ uint64 ReadOffset(const char* buffer) const;
+
+ // Read an address from BUFFER and return it as an unsigned 64 bit
+ // integer. DWARF2/3 allow addresses to be any size from 0-255
+ // bytes currently. Internally we support 4 and 8 byte addresses,
+ // and will CHECK on anything else.
+ uint64 ReadAddress(const char* buffer) const;
+
+ private:
+
+ // Function pointer type for our address and offset readers.
+ typedef uint64 (ByteReader::*AddressReader)(const char*) const;
+
+ // Read an offset from BUFFER and return it as an unsigned 64 bit
+ // integer. DWARF2/3 define offsets as either 4 or 8 bytes,
+ // generally depending on the amount of DWARF2/3 info present.
+ // This function pointer gets set by SetOffsetSize.
+ AddressReader offset_reader_;
+
+ // Read an address from BUFFER and return it as an unsigned 64 bit
+ // integer. DWARF2/3 allow addresses to be any size from 0-255
+ // bytes currently. Internally we support 4 and 8 byte addresses,
+ // and will CHECK on anything else.
+ // This function pointer gets set by SetAddressSize.
+ AddressReader address_reader_;
+
+ Endianness endian_;
+ uint8 address_size_;
+ uint8 offset_size_;
+};
+
+} // namespace dwarf2reader
+
+#endif // COMMON_MAC_DWARF_BYTEREADER_H__
diff --git a/src/common/mac/dwarf/dwarf2enums.h b/src/common/mac/dwarf/dwarf2enums.h
new file mode 100644
index 00000000..c52e2b47
--- /dev/null
+++ b/src/common/mac/dwarf/dwarf2enums.h
@@ -0,0 +1,490 @@
+// Copyright 2006 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.
+
+#ifndef COMMON_MAC_DWARF_DWARF2ENUMS_H__
+#define COMMON_MAC_DWARF_DWARF2ENUMS_H__
+
+namespace dwarf2reader {
+
+// These enums do not follow the google3 style only because they are
+// known universally (specs, other implementations) by the names in
+// exactly this capitalization.
+// Tag names and codes.
+enum DwarfTag {
+ DW_TAG_padding = 0x00,
+ DW_TAG_array_type = 0x01,
+ DW_TAG_class_type = 0x02,
+ DW_TAG_entry_point = 0x03,
+ DW_TAG_enumeration_type = 0x04,
+ DW_TAG_formal_parameter = 0x05,
+ DW_TAG_imported_declaration = 0x08,
+ DW_TAG_label = 0x0a,
+ DW_TAG_lexical_block = 0x0b,
+ DW_TAG_member = 0x0d,
+ DW_TAG_pointer_type = 0x0f,
+ DW_TAG_reference_type = 0x10,
+ DW_TAG_compile_unit = 0x11,
+ DW_TAG_string_type = 0x12,
+ DW_TAG_structure_type = 0x13,
+ DW_TAG_subroutine_type = 0x15,
+ DW_TAG_typedef = 0x16,
+ DW_TAG_union_type = 0x17,
+ DW_TAG_unspecified_parameters = 0x18,
+ DW_TAG_variant = 0x19,
+ DW_TAG_common_block = 0x1a,
+ DW_TAG_common_inclusion = 0x1b,
+ DW_TAG_inheritance = 0x1c,
+ DW_TAG_inlined_subroutine = 0x1d,
+ DW_TAG_module = 0x1e,
+ DW_TAG_ptr_to_member_type = 0x1f,
+ DW_TAG_set_type = 0x20,
+ DW_TAG_subrange_type = 0x21,
+ DW_TAG_with_stmt = 0x22,
+ DW_TAG_access_declaration = 0x23,
+ DW_TAG_base_type = 0x24,
+ DW_TAG_catch_block = 0x25,
+ DW_TAG_const_type = 0x26,
+ DW_TAG_constant = 0x27,
+ DW_TAG_enumerator = 0x28,
+ DW_TAG_file_type = 0x29,
+ DW_TAG_friend = 0x2a,
+ DW_TAG_namelist = 0x2b,
+ DW_TAG_namelist_item = 0x2c,
+ DW_TAG_packed_type = 0x2d,
+ DW_TAG_subprogram = 0x2e,
+ DW_TAG_template_type_param = 0x2f,
+ DW_TAG_template_value_param = 0x30,
+ DW_TAG_thrown_type = 0x31,
+ DW_TAG_try_block = 0x32,
+ DW_TAG_variant_part = 0x33,
+ DW_TAG_variable = 0x34,
+ DW_TAG_volatile_type = 0x35,
+ // DWARF 3.
+ DW_TAG_dwarf_procedure = 0x36,
+ DW_TAG_restrict_type = 0x37,
+ DW_TAG_interface_type = 0x38,
+ DW_TAG_namespace = 0x39,
+ DW_TAG_imported_module = 0x3a,
+ DW_TAG_unspecified_type = 0x3b,
+ DW_TAG_partial_unit = 0x3c,
+ DW_TAG_imported_unit = 0x3d,
+ // SGI/MIPS Extensions.
+ DW_TAG_MIPS_loop = 0x4081,
+ // HP extensions. See:
+ // ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz
+ DW_TAG_HP_array_descriptor = 0x4090,
+ // GNU extensions.
+ DW_TAG_format_label = 0x4101, // For FORTRAN 77 and Fortran 90.
+ DW_TAG_function_template = 0x4102, // For C++.
+ DW_TAG_class_template = 0x4103, // For C++.
+ DW_TAG_GNU_BINCL = 0x4104,
+ DW_TAG_GNU_EINCL = 0x4105,
+ // Extensions for UPC. See: http://upc.gwu.edu/~upc.
+ DW_TAG_upc_shared_type = 0x8765,
+ DW_TAG_upc_strict_type = 0x8766,
+ DW_TAG_upc_relaxed_type = 0x8767,
+ // PGI (STMicroelectronics) extensions. No documentation available.
+ DW_TAG_PGI_kanji_type = 0xA000,
+ DW_TAG_PGI_interface_block = 0xA020
+};
+
+
+enum DwarfHasChild {
+ DW_children_no = 0,
+ DW_children_yes = 1
+};
+
+// Form names and codes.
+enum DwarfForm {
+ DW_FORM_addr = 0x01,
+ DW_FORM_block2 = 0x03,
+ DW_FORM_block4 = 0x04,
+ DW_FORM_data2 = 0x05,
+ DW_FORM_data4 = 0x06,
+ DW_FORM_data8 = 0x07,
+ DW_FORM_string = 0x08,
+ DW_FORM_block = 0x09,
+ DW_FORM_block1 = 0x0a,
+ DW_FORM_data1 = 0x0b,
+ DW_FORM_flag = 0x0c,
+ DW_FORM_sdata = 0x0d,
+ DW_FORM_strp = 0x0e,
+ DW_FORM_udata = 0x0f,
+ DW_FORM_ref_addr = 0x10,
+ DW_FORM_ref1 = 0x11,
+ DW_FORM_ref2 = 0x12,
+ DW_FORM_ref4 = 0x13,
+ DW_FORM_ref8 = 0x14,
+ DW_FORM_ref_udata = 0x15,
+ DW_FORM_indirect = 0x16
+};
+
+// Attribute names and codes
+enum DwarfAttribute {
+ DW_AT_sibling = 0x01,
+ DW_AT_location = 0x02,
+ DW_AT_name = 0x03,
+ DW_AT_ordering = 0x09,
+ DW_AT_subscr_data = 0x0a,
+ DW_AT_byte_size = 0x0b,
+ DW_AT_bit_offset = 0x0c,
+ DW_AT_bit_size = 0x0d,
+ DW_AT_element_list = 0x0f,
+ DW_AT_stmt_list = 0x10,
+ DW_AT_low_pc = 0x11,
+ DW_AT_high_pc = 0x12,
+ DW_AT_language = 0x13,
+ DW_AT_member = 0x14,
+ DW_AT_discr = 0x15,
+ DW_AT_discr_value = 0x16,
+ DW_AT_visibility = 0x17,
+ DW_AT_import = 0x18,
+ DW_AT_string_length = 0x19,
+ DW_AT_common_reference = 0x1a,
+ DW_AT_comp_dir = 0x1b,
+ DW_AT_const_value = 0x1c,
+ DW_AT_containing_type = 0x1d,
+ DW_AT_default_value = 0x1e,
+ DW_AT_inline = 0x20,
+ DW_AT_is_optional = 0x21,
+ DW_AT_lower_bound = 0x22,
+ DW_AT_producer = 0x25,
+ DW_AT_prototyped = 0x27,
+ DW_AT_return_addr = 0x2a,
+ DW_AT_start_scope = 0x2c,
+ DW_AT_stride_size = 0x2e,
+ DW_AT_upper_bound = 0x2f,
+ DW_AT_abstract_origin = 0x31,
+ DW_AT_accessibility = 0x32,
+ DW_AT_address_class = 0x33,
+ DW_AT_artificial = 0x34,
+ DW_AT_base_types = 0x35,
+ DW_AT_calling_convention = 0x36,
+ DW_AT_count = 0x37,
+ DW_AT_data_member_location = 0x38,
+ DW_AT_decl_column = 0x39,
+ DW_AT_decl_file = 0x3a,
+ DW_AT_decl_line = 0x3b,
+ DW_AT_declaration = 0x3c,
+ DW_AT_discr_list = 0x3d,
+ DW_AT_encoding = 0x3e,
+ DW_AT_external = 0x3f,
+ DW_AT_frame_base = 0x40,
+ DW_AT_friend = 0x41,
+ DW_AT_identifier_case = 0x42,
+ DW_AT_macro_info = 0x43,
+ DW_AT_namelist_items = 0x44,
+ DW_AT_priority = 0x45,
+ DW_AT_segment = 0x46,
+ DW_AT_specification = 0x47,
+ DW_AT_static_link = 0x48,
+ DW_AT_type = 0x49,
+ DW_AT_use_location = 0x4a,
+ DW_AT_variable_parameter = 0x4b,
+ DW_AT_virtuality = 0x4c,
+ DW_AT_vtable_elem_location = 0x4d,
+ // DWARF 3 values.
+ DW_AT_allocated = 0x4e,
+ DW_AT_associated = 0x4f,
+ DW_AT_data_location = 0x50,
+ DW_AT_stride = 0x51,
+ DW_AT_entry_pc = 0x52,
+ DW_AT_use_UTF8 = 0x53,
+ DW_AT_extension = 0x54,
+ DW_AT_ranges = 0x55,
+ DW_AT_trampoline = 0x56,
+ DW_AT_call_column = 0x57,
+ DW_AT_call_file = 0x58,
+ DW_AT_call_line = 0x59,
+ // SGI/MIPS extensions.
+ DW_AT_MIPS_fde = 0x2001,
+ DW_AT_MIPS_loop_begin = 0x2002,
+ DW_AT_MIPS_tail_loop_begin = 0x2003,
+ DW_AT_MIPS_epilog_begin = 0x2004,
+ DW_AT_MIPS_loop_unroll_factor = 0x2005,
+ DW_AT_MIPS_software_pipeline_depth = 0x2006,
+ DW_AT_MIPS_linkage_name = 0x2007,
+ DW_AT_MIPS_stride = 0x2008,
+ DW_AT_MIPS_abstract_name = 0x2009,
+ DW_AT_MIPS_clone_origin = 0x200a,
+ DW_AT_MIPS_has_inlines = 0x200b,
+ // HP extensions.
+ DW_AT_HP_block_index = 0x2000,
+ DW_AT_HP_unmodifiable = 0x2001, // Same as DW_AT_MIPS_fde.
+ DW_AT_HP_actuals_stmt_list = 0x2010,
+ DW_AT_HP_proc_per_section = 0x2011,
+ DW_AT_HP_raw_data_ptr = 0x2012,
+ DW_AT_HP_pass_by_reference = 0x2013,
+ DW_AT_HP_opt_level = 0x2014,
+ DW_AT_HP_prof_version_id = 0x2015,
+ DW_AT_HP_opt_flags = 0x2016,
+ DW_AT_HP_cold_region_low_pc = 0x2017,
+ DW_AT_HP_cold_region_high_pc = 0x2018,
+ DW_AT_HP_all_variables_modifiable = 0x2019,
+ DW_AT_HP_linkage_name = 0x201a,
+ DW_AT_HP_prof_flags = 0x201b, // In comp unit of procs_info for -g.
+ // GNU extensions.
+ DW_AT_sf_names = 0x2101,
+ DW_AT_src_info = 0x2102,
+ DW_AT_mac_info = 0x2103,
+ DW_AT_src_coords = 0x2104,
+ DW_AT_body_begin = 0x2105,
+ DW_AT_body_end = 0x2106,
+ DW_AT_GNU_vector = 0x2107,
+ // VMS extensions.
+ DW_AT_VMS_rtnbeg_pd_address = 0x2201,
+ // UPC extension.
+ DW_AT_upc_threads_scaled = 0x3210,
+ // PGI (STMicroelectronics) extensions.
+ DW_AT_PGI_lbase = 0x3a00,
+ DW_AT_PGI_soffset = 0x3a01,
+ DW_AT_PGI_lstride = 0x3a02
+};
+
+
+// Line number opcodes.
+enum DwarfLineNumberOps {
+ DW_LNS_extended_op = 0,
+ DW_LNS_copy = 1,
+ DW_LNS_advance_pc = 2,
+ DW_LNS_advance_line = 3,
+ DW_LNS_set_file = 4,
+ DW_LNS_set_column = 5,
+ DW_LNS_negate_stmt = 6,
+ DW_LNS_set_basic_block = 7,
+ DW_LNS_const_add_pc = 8,
+ DW_LNS_fixed_advance_pc = 9,
+ // DWARF 3.
+ DW_LNS_set_prologue_end = 10,
+ DW_LNS_set_epilogue_begin = 11,
+ DW_LNS_set_isa = 12
+};
+
+// Line number extended opcodes.
+enum DwarfLineNumberExtendedOps {
+ DW_LNE_end_sequence = 1,
+ DW_LNE_set_address = 2,
+ DW_LNE_define_file = 3,
+ // HP extensions.
+ DW_LNE_HP_negate_is_UV_update = 0x11,
+ DW_LNE_HP_push_context = 0x12,
+ DW_LNE_HP_pop_context = 0x13,
+ DW_LNE_HP_set_file_line_column = 0x14,
+ DW_LNE_HP_set_routine_name = 0x15,
+ DW_LNE_HP_set_sequence = 0x16,
+ DW_LNE_HP_negate_post_semantics = 0x17,
+ DW_LNE_HP_negate_function_exit = 0x18,
+ DW_LNE_HP_negate_front_end_logical = 0x19,
+ DW_LNE_HP_define_proc = 0x20
+};
+
+// Type encoding names and codes
+enum DwarfEncoding {
+ DW_ATE_address =0x1,
+ DW_ATE_boolean =0x2,
+ DW_ATE_complex_float =0x3,
+ DW_ATE_float =0x4,
+ DW_ATE_signed =0x5,
+ DW_ATE_signed_char =0x6,
+ DW_ATE_unsigned =0x7,
+ DW_ATE_unsigned_char =0x8,
+ // DWARF3/DWARF3f
+ DW_ATE_imaginary_float =0x9,
+ DW_ATE_packed_decimal =0xa,
+ DW_ATE_numeric_string =0xb,
+ DW_ATE_edited =0xc,
+ DW_ATE_signed_fixed =0xd,
+ DW_ATE_unsigned_fixed =0xe,
+ DW_ATE_decimal_float =0xf,
+ DW_ATE_lo_user =0x80,
+ DW_ATE_hi_user =0xff
+};
+
+// Location virtual machine opcodes
+enum DwarfOpcode {
+ DW_OP_addr =0x03,
+ DW_OP_deref =0x06,
+ DW_OP_const1u =0x08,
+ DW_OP_const1s =0x09,
+ DW_OP_const2u =0x0a,
+ DW_OP_const2s =0x0b,
+ DW_OP_const4u =0x0c,
+ DW_OP_const4s =0x0d,
+ DW_OP_const8u =0x0e,
+ DW_OP_const8s =0x0f,
+ DW_OP_constu =0x10,
+ DW_OP_consts =0x11,
+ DW_OP_dup =0x12,
+ DW_OP_drop =0x13,
+ DW_OP_over =0x14,
+ DW_OP_pick =0x15,
+ DW_OP_swap =0x16,
+ DW_OP_rot =0x17,
+ DW_OP_xderef =0x18,
+ DW_OP_abs =0x19,
+ DW_OP_and =0x1a,
+ DW_OP_div =0x1b,
+ DW_OP_minus =0x1c,
+ DW_OP_mod =0x1d,
+ DW_OP_mul =0x1e,
+ DW_OP_neg =0x1f,
+ DW_OP_not =0x20,
+ DW_OP_or =0x21,
+ DW_OP_plus =0x22,
+ DW_OP_plus_uconst =0x23,
+ DW_OP_shl =0x24,
+ DW_OP_shr =0x25,
+ DW_OP_shra =0x26,
+ DW_OP_xor =0x27,
+ DW_OP_bra =0x28,
+ DW_OP_eq =0x29,
+ DW_OP_ge =0x2a,
+ DW_OP_gt =0x2b,
+ DW_OP_le =0x2c,
+ DW_OP_lt =0x2d,
+ DW_OP_ne =0x2e,
+ DW_OP_skip =0x2f,
+ DW_OP_lit0 =0x30,
+ DW_OP_lit1 =0x31,
+ DW_OP_lit2 =0x32,
+ DW_OP_lit3 =0x33,
+ DW_OP_lit4 =0x34,
+ DW_OP_lit5 =0x35,
+ DW_OP_lit6 =0x36,
+ DW_OP_lit7 =0x37,
+ DW_OP_lit8 =0x38,
+ DW_OP_lit9 =0x39,
+ DW_OP_lit10 =0x3a,
+ DW_OP_lit11 =0x3b,
+ DW_OP_lit12 =0x3c,
+ DW_OP_lit13 =0x3d,
+ DW_OP_lit14 =0x3e,
+ DW_OP_lit15 =0x3f,
+ DW_OP_lit16 =0x40,
+ DW_OP_lit17 =0x41,
+ DW_OP_lit18 =0x42,
+ DW_OP_lit19 =0x43,
+ DW_OP_lit20 =0x44,
+ DW_OP_lit21 =0x45,
+ DW_OP_lit22 =0x46,
+ DW_OP_lit23 =0x47,
+ DW_OP_lit24 =0x48,
+ DW_OP_lit25 =0x49,
+ DW_OP_lit26 =0x4a,
+ DW_OP_lit27 =0x4b,
+ DW_OP_lit28 =0x4c,
+ DW_OP_lit29 =0x4d,
+ DW_OP_lit30 =0x4e,
+ DW_OP_lit31 =0x4f,
+ DW_OP_reg0 =0x50,
+ DW_OP_reg1 =0x51,
+ DW_OP_reg2 =0x52,
+ DW_OP_reg3 =0x53,
+ DW_OP_reg4 =0x54,
+ DW_OP_reg5 =0x55,
+ DW_OP_reg6 =0x56,
+ DW_OP_reg7 =0x57,
+ DW_OP_reg8 =0x58,
+ DW_OP_reg9 =0x59,
+ DW_OP_reg10 =0x5a,
+ DW_OP_reg11 =0x5b,
+ DW_OP_reg12 =0x5c,
+ DW_OP_reg13 =0x5d,
+ DW_OP_reg14 =0x5e,
+ DW_OP_reg15 =0x5f,
+ DW_OP_reg16 =0x60,
+ DW_OP_reg17 =0x61,
+ DW_OP_reg18 =0x62,
+ DW_OP_reg19 =0x63,
+ DW_OP_reg20 =0x64,
+ DW_OP_reg21 =0x65,
+ DW_OP_reg22 =0x66,
+ DW_OP_reg23 =0x67,
+ DW_OP_reg24 =0x68,
+ DW_OP_reg25 =0x69,
+ DW_OP_reg26 =0x6a,
+ DW_OP_reg27 =0x6b,
+ DW_OP_reg28 =0x6c,
+ DW_OP_reg29 =0x6d,
+ DW_OP_reg30 =0x6e,
+ DW_OP_reg31 =0x6f,
+ DW_OP_breg0 =0x70,
+ DW_OP_breg1 =0x71,
+ DW_OP_breg2 =0x72,
+ DW_OP_breg3 =0x73,
+ DW_OP_breg4 =0x74,
+ DW_OP_breg5 =0x75,
+ DW_OP_breg6 =0x76,
+ DW_OP_breg7 =0x77,
+ DW_OP_breg8 =0x78,
+ DW_OP_breg9 =0x79,
+ DW_OP_breg10 =0x7a,
+ DW_OP_breg11 =0x7b,
+ DW_OP_breg12 =0x7c,
+ DW_OP_breg13 =0x7d,
+ DW_OP_breg14 =0x7e,
+ DW_OP_breg15 =0x7f,
+ DW_OP_breg16 =0x80,
+ DW_OP_breg17 =0x81,
+ DW_OP_breg18 =0x82,
+ DW_OP_breg19 =0x83,
+ DW_OP_breg20 =0x84,
+ DW_OP_breg21 =0x85,
+ DW_OP_breg22 =0x86,
+ DW_OP_breg23 =0x87,
+ DW_OP_breg24 =0x88,
+ DW_OP_breg25 =0x89,
+ DW_OP_breg26 =0x8a,
+ DW_OP_breg27 =0x8b,
+ DW_OP_breg28 =0x8c,
+ DW_OP_breg29 =0x8d,
+ DW_OP_breg30 =0x8e,
+ DW_OP_breg31 =0x8f,
+ DW_OP_regX =0x90,
+ DW_OP_fbreg =0x91,
+ DW_OP_bregX =0x92,
+ DW_OP_piece =0x93,
+ DW_OP_deref_size =0x94,
+ DW_OP_xderef_size =0x95,
+ DW_OP_nop =0x96,
+ // DWARF3/DWARF3f
+ DW_OP_push_object_address =0x97,
+ DW_OP_call2 =0x98,
+ DW_OP_call4 =0x99,
+ DW_OP_call_ref =0x9a,
+ DW_OP_form_tls_address =0x9b,
+ DW_OP_call_frame_cfa =0x9c,
+ DW_OP_bit_piece =0x9d,
+ DW_OP_lo_user =0xe0,
+ DW_OP_hi_user =0xff,
+ // GNU extensions
+ DW_OP_GNU_push_tls_address =0xe0
+};
+
+} // namespace dwarf2reader
+#endif // COMMON_MAC_DWARF_DWARF2ENUMS_H__
diff --git a/src/common/mac/dwarf/dwarf2reader.cc b/src/common/mac/dwarf/dwarf2reader.cc
new file mode 100644
index 00000000..6e7a2f1d
--- /dev/null
+++ b/src/common/mac/dwarf/dwarf2reader.cc
@@ -0,0 +1,830 @@
+// Copyright 2006 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.
+
+#include <ext/hash_map>
+#include <stack>
+#include <utility>
+
+#include "common/mac/dwarf/bytereader-inl.h"
+#include "common/mac/dwarf/dwarf2reader.h"
+#include "common/mac/dwarf/bytereader.h"
+#include "common/mac/dwarf/line_state_machine.h"
+
+namespace __gnu_cxx
+{
+ template<> struct hash< std::string >
+ {
+ size_t operator()( const std::string& x ) const
+ {
+ return hash< const char* >()( x.c_str() );
+ }
+ };
+}
+
+namespace dwarf2reader {
+
+// Read a DWARF2/3 initial length field from START, using READER, and
+// report the length in LEN. Return the actual initial length.
+
+static uint64 ReadInitialLength(const char* start,
+ ByteReader* reader, size_t* len) {
+ const uint64 initial_length = reader->ReadFourBytes(start);
+ start += 4;
+
+ // In DWARF2/3, if the initial length is all 1 bits, then the offset
+ // size is 8 and we need to read the next 8 bytes for the real length.
+ if (initial_length == 0xffffffff) {
+ reader->SetOffsetSize(8);
+ *len = 12;
+ return reader->ReadOffset(start);
+ } else {
+ reader->SetOffsetSize(4);
+ *len = 4;
+ }
+ return initial_length;
+}
+
+CompilationUnit::CompilationUnit(const SectionMap& sections, uint64 offset,
+ ByteReader* reader, Dwarf2Handler* handler)
+ : offset_from_section_start_(offset), reader_(reader),
+ sections_(sections), handler_(handler), abbrevs_(NULL),
+ string_buffer_(NULL), string_buffer_length_(0) {}
+
+// Read a DWARF2/3 abbreviation section.
+// Each abbrev consists of a abbreviation number, a tag, a byte
+// specifying whether the tag has children, and a list of
+// attribute/form pairs.
+// The list of forms is terminated by a 0 for the attribute, and a
+// zero for the form. The entire abbreviation section is terminated
+// by a zero for the code.
+
+void CompilationUnit::ReadAbbrevs() {
+ if (abbrevs_)
+ return;
+
+ // First get the debug_abbrev section
+ SectionMap::const_iterator iter = sections_.find("__debug_abbrev");
+ assert(iter != sections_.end());
+
+ abbrevs_ = new vector<Abbrev>;
+ abbrevs_->resize(1);
+
+ // The only way to check whether we are reading over the end of the
+ // buffer would be to first compute the size of the leb128 data by
+ // reading it, then go back and read it again.
+ const char* abbrev_start = iter->second.first +
+ header_.abbrev_offset;
+ const char* abbrevptr = abbrev_start;
+ const uint64 abbrev_length = iter->second.second - header_.abbrev_offset;
+
+ while (1) {
+ CompilationUnit::Abbrev abbrev;
+ size_t len;
+ const uint32 number = reader_->ReadUnsignedLEB128(abbrevptr, &len);
+
+ if (number == 0)
+ break;
+ abbrev.number = number;
+ abbrevptr += len;
+
+ assert(abbrevptr < abbrev_start + abbrev_length);
+ const uint32 tag = reader_->ReadUnsignedLEB128(abbrevptr, &len);
+ abbrevptr += len;
+ abbrev.tag = static_cast<enum DwarfTag>(tag);
+
+ assert(abbrevptr < abbrev_start + abbrev_length);
+ abbrev.has_children = reader_->ReadOneByte(abbrevptr);
+ abbrevptr += 1;
+
+ assert(abbrevptr < abbrev_start + abbrev_length);
+
+ while (1) {
+ const uint32 nametemp = reader_->ReadUnsignedLEB128(abbrevptr, &len);
+ abbrevptr += len;
+
+ assert(abbrevptr < abbrev_start + abbrev_length);
+ const uint32 formtemp = reader_->ReadUnsignedLEB128(abbrevptr, &len);
+ abbrevptr += len;
+ if (nametemp == 0 && formtemp == 0)
+ break;
+
+ const enum DwarfAttribute name =
+ static_cast<enum DwarfAttribute>(nametemp);
+ const enum DwarfForm form = static_cast<enum DwarfForm>(formtemp);
+ abbrev.attributes.push_back(make_pair(name, form));
+ }
+ assert(abbrev.number == abbrevs_->size());
+ abbrevs_->push_back(abbrev);
+ }
+}
+
+// Skips a single DIE's attributes.
+const char* CompilationUnit::SkipDIE(const char* start,
+ const Abbrev& abbrev) {
+ for (AttributeList::const_iterator i = abbrev.attributes.begin();
+ i != abbrev.attributes.end();
+ i++) {
+ start = SkipAttribute(start, i->second);
+ }
+ return start;
+}
+
+// Skips a single attribute form's data.
+const char* CompilationUnit::SkipAttribute(const char* start,
+ enum DwarfForm form) {
+ size_t len;
+
+ switch (form) {
+ case DW_FORM_indirect:
+ form = static_cast<enum DwarfForm>(reader_->ReadUnsignedLEB128(start,
+ &len));
+ start += len;
+ return SkipAttribute(start, form);
+ break;
+
+ case DW_FORM_data1:
+ case DW_FORM_flag:
+ case DW_FORM_ref1:
+ return start + 1;
+ break;
+ case DW_FORM_ref2:
+ case DW_FORM_data2:
+ return start + 2;
+ break;
+ case DW_FORM_ref4:
+ case DW_FORM_data4:
+ return start + 4;
+ break;
+ case DW_FORM_ref8:
+ case DW_FORM_data8:
+ return start + 8;
+ break;
+ case DW_FORM_string:
+ return start + strlen(start) + 1;
+ break;
+ case DW_FORM_udata:
+ case DW_FORM_ref_udata:
+ reader_->ReadUnsignedLEB128(start, &len);
+ return start + len;
+ break;
+
+ case DW_FORM_sdata:
+ reader_->ReadSignedLEB128(start, &len);
+ return start + len;
+ break;
+ case DW_FORM_addr:
+ return start + reader_->AddressSize();
+ break;
+ case DW_FORM_ref_addr:
+ // DWARF2 and 3 differ on whether ref_addr is address size or
+ // offset size.
+ assert(header_.version == 2 || header_.version == 3);
+ if (header_.version == 2) {
+ return start + reader_->AddressSize();
+ } else if (header_.version == 3) {
+ return start + reader_->OffsetSize();
+ }
+ break;
+
+ case DW_FORM_block1:
+ return start + 1 + reader_->ReadOneByte(start);
+ break;
+ case DW_FORM_block2:
+ return start + 2 + reader_->ReadTwoBytes(start);
+ break;
+ case DW_FORM_block4:
+ return start + 4 + reader_->ReadFourBytes(start);
+ break;
+ case DW_FORM_block: {
+ uint64 size = reader_->ReadUnsignedLEB128(start, &len);
+ return start + size + len;
+ }
+ break;
+ case DW_FORM_strp:
+ return start + reader_->OffsetSize();
+ break;
+ default:
+ fprintf(stderr,"Unhandled form type");
+ }
+ fprintf(stderr,"Unhandled form type");
+ return NULL;
+}
+
+// Read a DWARF2/3 header.
+// The header is variable length in DWARF3 (and DWARF2 as extended by
+// most compilers), and consists of an length field, a version number,
+// the offset in the .debug_abbrev section for our abbrevs, and an
+// address size.
+void CompilationUnit::ReadHeader() {
+ const char* headerptr = buffer_;
+ size_t initial_length_size;
+
+ assert(headerptr + 4 < buffer_ + buffer_length_);
+ const uint64 initial_length = ReadInitialLength(headerptr, reader_,
+ &initial_length_size);
+ headerptr += initial_length_size;
+ header_.length = initial_length;
+
+ assert(headerptr + 2 < buffer_ + buffer_length_);
+ header_.version = reader_->ReadTwoBytes(headerptr);
+ headerptr += 2;
+
+ assert(headerptr + reader_->OffsetSize() < buffer_ + buffer_length_);
+ header_.abbrev_offset = reader_->ReadOffset(headerptr);
+ headerptr += reader_->OffsetSize();
+
+ assert(headerptr + 1 < buffer_ + buffer_length_);
+ header_.address_size = reader_->ReadOneByte(headerptr);
+ reader_->SetAddressSize(header_.address_size);
+ headerptr += 1;
+
+ after_header_ = headerptr;
+
+ // This check ensures that we don't have to do checking during the
+ // reading of DIEs. header_.length does not include the size of the
+ // initial length.
+ assert(buffer_ + initial_length_size + header_.length <=
+ buffer_ + buffer_length_);
+}
+
+uint64 CompilationUnit::Start() {
+ // First get the debug_info section
+ SectionMap::const_iterator iter = sections_.find("__debug_info");
+ assert(iter != sections_.end());
+
+ // Set up our buffer
+ buffer_ = iter->second.first + offset_from_section_start_;
+ buffer_length_ = iter->second.second - offset_from_section_start_;
+
+ // Read the header
+ ReadHeader();
+
+ // Figure out the real length from the end of the initial length to
+ // the end of the compilation unit, since that is the value we
+ // return.
+ uint64 ourlength = header_.length;
+ if (reader_->OffsetSize() == 8)
+ ourlength += 12;
+ else
+ ourlength += 4;
+
+ // See if the user wants this compilation unit, and if not, just return.
+ if (!handler_->StartCompilationUnit(offset_from_section_start_,
+ reader_->AddressSize(),
+ reader_->OffsetSize(),
+ header_.length,
+ header_.version))
+ return ourlength;
+
+ // Otherwise, continue by reading our abbreviation entries.
+ ReadAbbrevs();
+
+ // Set the string section if we have one.
+ iter = sections_.find("__debug_str");
+ if (iter != sections_.end()) {
+ string_buffer_ = iter->second.first;
+ string_buffer_length_ = iter->second.second;
+ }
+
+ // Now that we have our abbreviations, start processing DIE's.
+ ProcessDIEs();
+
+ return ourlength;
+}
+
+// If one really wanted, you could merge SkipAttribute and
+// ProcessAttribute
+// This is all boring data manipulation and calling of the handler.
+const char* CompilationUnit::ProcessAttribute(
+ uint64 dieoffset, const char* start, enum DwarfAttribute attr,
+ enum DwarfForm form) {
+ size_t len;
+
+ switch (form) {
+ // DW_FORM_indirect is never used because it is such a space
+ // waster.
+ case DW_FORM_indirect:
+ form = static_cast<enum DwarfForm>(reader_->ReadUnsignedLEB128(start,
+ &len));
+ start += len;
+ return ProcessAttribute(dieoffset, start, attr, form);
+ break;
+
+ case DW_FORM_data1:
+ case DW_FORM_flag:
+ case DW_FORM_ref1:
+ handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadOneByte(start));
+ return start + 1;
+ break;
+ case DW_FORM_ref2:
+ case DW_FORM_data2:
+ handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadTwoBytes(start));
+ return start + 2;
+ break;
+ case DW_FORM_ref4:
+ case DW_FORM_data4:
+ handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadFourBytes(start));
+ return start + 4;
+ break;
+ case DW_FORM_ref8:
+ case DW_FORM_data8:
+ handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadEightBytes(start));
+ return start + 8;
+ break;
+ case DW_FORM_string: {
+ const char* str = start;
+ handler_->ProcessAttributeString(dieoffset, attr, form,
+ str);
+ return start + strlen(str) + 1;
+ }
+ break;
+ case DW_FORM_udata:
+ case DW_FORM_ref_udata:
+ handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadUnsignedLEB128(start,
+ &len));
+ return start + len;
+ break;
+
+ case DW_FORM_sdata:
+ handler_->ProcessAttributeSigned(dieoffset, attr, form,
+ reader_->ReadSignedLEB128(start, &len));
+ return start + len;
+ break;
+ case DW_FORM_addr:
+ handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadAddress(start));
+ return start + reader_->AddressSize();
+ break;
+ case DW_FORM_ref_addr:
+ // DWARF2 and 3 differ on whether ref_addr is address size or
+ // offset size.
+ assert(header_.version == 2 || header_.version == 3);
+ if (header_.version == 2) {
+ handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadAddress(start));
+ return start + reader_->AddressSize();
+ } else if (header_.version == 3) {
+ handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadOffset(start));
+ return start + reader_->OffsetSize();
+ }
+ break;
+
+ case DW_FORM_block1: {
+ uint64 datalen = reader_->ReadOneByte(start);
+ handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 1,
+ datalen);
+ return start + 1 + datalen;
+ }
+ break;
+ case DW_FORM_block2: {
+ uint64 datalen = reader_->ReadTwoBytes(start);
+ handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 2,
+ datalen);
+ return start + 2 + datalen;
+ }
+ break;
+ case DW_FORM_block4: {
+ uint64 datalen = reader_->ReadFourBytes(start);
+ handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 4,
+ datalen);
+ return start + 4 + datalen;
+ }
+ break;
+ case DW_FORM_block: {
+ uint64 datalen = reader_->ReadUnsignedLEB128(start, &len);
+ handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + len,
+ datalen);
+ return start + datalen + len;
+ }
+ break;
+ case DW_FORM_strp: {
+ assert(string_buffer_ != NULL);
+
+ const uint64 offset = reader_->ReadOffset(start);
+ assert(string_buffer_ + offset < string_buffer_ + string_buffer_length_);
+
+ const char* str = string_buffer_ + offset;
+ handler_->ProcessAttributeString(dieoffset, attr, form,
+ str);
+ return start + reader_->OffsetSize();
+ }
+ break;
+ default:
+ fprintf(stderr, "Unhandled form type");
+ }
+ fprintf(stderr, "Unhandled form type");
+ return NULL;
+}
+
+const char* CompilationUnit::ProcessDIE(uint64 dieoffset,
+ const char* start,
+ const Abbrev& abbrev) {
+ for (AttributeList::const_iterator i = abbrev.attributes.begin();
+ i != abbrev.attributes.end();
+ i++) {
+ start = ProcessAttribute(dieoffset, start, i->first, i->second);
+ }
+ return start;
+}
+
+void CompilationUnit::ProcessDIEs() {
+ const char* dieptr = after_header_;
+ size_t len;
+
+ // lengthstart is the place the length field is based on.
+ // It is the point in the header after the initial length field
+ const char* lengthstart = buffer_;
+
+ // In 64 bit dwarf, the initial length is 12 bytes, because of the
+ // 0xffffffff at the start.
+ if (reader_->OffsetSize() == 8)
+ lengthstart += 12;
+ else
+ lengthstart += 4;
+
+ // we need semantics of boost scoped_ptr here - no intention of trasnferring
+ // ownership of the stack. use const, but then we limit ourselves to not
+ // ever being able to call .reset() on the smart pointer.
+ auto_ptr<stack<uint64> > const die_stack(new stack<uint64>);
+
+ while (dieptr < (lengthstart + header_.length)) {
+ // We give the user the absolute offset from the beginning of
+ // debug_info, since they need it to deal with ref_addr forms.
+ uint64 absolute_offset = (dieptr - buffer_) + offset_from_section_start_;
+
+ uint64 abbrev_num = reader_->ReadUnsignedLEB128(dieptr, &len);
+
+ dieptr += len;
+
+ // Abbrev == 0 represents the end of a list of children.
+ if (abbrev_num == 0) {
+ const uint64 offset = die_stack->top();
+ die_stack->pop();
+ handler_->EndDIE(offset);
+ continue;
+ }
+
+ const Abbrev& abbrev = abbrevs_->at(abbrev_num);
+ const enum DwarfTag tag = abbrev.tag;
+ if (!handler_->StartDIE(absolute_offset, tag, abbrev.attributes)) {
+ dieptr = SkipDIE(dieptr, abbrev);
+ } else {
+ dieptr = ProcessDIE(absolute_offset, dieptr, abbrev);
+ }
+
+ if (abbrev.has_children) {
+ die_stack->push(absolute_offset);
+ } else {
+ handler_->EndDIE(absolute_offset);
+ }
+ }
+}
+
+LineInfo::LineInfo(const char* buffer, uint64 buffer_length,
+ ByteReader* reader, LineInfoHandler* handler):
+ handler_(handler), reader_(reader), buffer_(buffer),
+ buffer_length_(buffer_length) {
+ header_.std_opcode_lengths = NULL;
+}
+
+uint64 LineInfo::Start() {
+ ReadHeader();
+ ReadLines();
+ return after_header_ - buffer_;
+}
+
+// The header for a debug_line section is mildly complicated, because
+// the line info is very tightly encoded.
+void LineInfo::ReadHeader() {
+ const char* lineptr = buffer_;
+ size_t initial_length_size;
+
+ const uint64 initial_length = ReadInitialLength(lineptr, reader_,
+ &initial_length_size);
+
+ lineptr += initial_length_size;
+ header_.total_length = initial_length;
+ assert(buffer_ + initial_length_size + header_.total_length <=
+ buffer_ + buffer_length_);
+
+ // Address size *must* be set by CU ahead of time.
+ assert(reader_->AddressSize() != 0);
+
+ header_.version = reader_->ReadTwoBytes(lineptr);
+ lineptr += 2;
+
+ header_.prologue_length = reader_->ReadOffset(lineptr);
+ lineptr += reader_->OffsetSize();
+
+ header_.min_insn_length = reader_->ReadOneByte(lineptr);
+ lineptr += 1;
+
+ header_.default_is_stmt = reader_->ReadOneByte(lineptr);
+ lineptr += 1;
+
+ header_.line_base = *reinterpret_cast<const int8*>(lineptr);
+ lineptr += 1;
+
+ header_.line_range = reader_->ReadOneByte(lineptr);
+ lineptr += 1;
+
+ header_.opcode_base = reader_->ReadOneByte(lineptr);
+ lineptr += 1;
+
+ header_.std_opcode_lengths = new vector<unsigned char>;
+ header_.std_opcode_lengths->resize(header_.opcode_base + 1);
+ (*header_.std_opcode_lengths)[0] = 0;
+ for (int i = 1; i < header_.opcode_base; i++) {
+ (*header_.std_opcode_lengths)[i] = reader_->ReadOneByte(lineptr);
+ lineptr += 1;
+ }
+
+ // It is legal for the directory entry table to be empty.
+ if (*lineptr) {
+ uint32 dirindex = 1;
+ while (*lineptr) {
+ const char* dirname = lineptr;
+ handler_->DefineDir(dirname, dirindex);
+ lineptr += strlen(dirname) + 1;
+ dirindex++;
+ }
+ }
+ lineptr++;
+
+ // It is also legal for the file entry table to be empty.
+ if (*lineptr) {
+ uint32 fileindex = 1;
+ size_t len;
+ while (*lineptr) {
+ const char* filename = lineptr;
+ lineptr += strlen(filename) + 1;
+
+ uint64 dirindex = reader_->ReadUnsignedLEB128(lineptr, &len);
+ lineptr += len;
+
+ uint64 mod_time = reader_->ReadUnsignedLEB128(lineptr, &len);
+ lineptr += len;
+
+ uint64 filelength = reader_->ReadUnsignedLEB128(lineptr, &len);
+ lineptr += len;
+ handler_->DefineFile(filename, fileindex, dirindex, mod_time,
+ filelength);
+ fileindex++;
+ }
+ }
+ lineptr++;
+
+ after_header_ = lineptr;
+}
+
+/* static */
+bool LineInfo::ProcessOneOpcode(ByteReader* reader,
+ LineInfoHandler* handler,
+ const struct LineInfoHeader &header,
+ const char* start,
+ struct LineStateMachine* lsm,
+ size_t* len,
+ uintptr_t pc,
+ bool *lsm_passes_pc) {
+ size_t oplen = 0;
+ size_t templen;
+ uint8 opcode = reader->ReadOneByte(start);
+ oplen++;
+ start++;
+
+ // If the opcode is great than the opcode_base, it is a special
+ // opcode. Most line programs consist mainly of special opcodes.
+ if (opcode >= header.opcode_base) {
+ opcode -= header.opcode_base;
+ const int64 advance_address = (opcode / header.line_range)
+ * header.min_insn_length;
+ const int64 advance_line = (opcode % header.line_range)
+ + header.line_base;
+
+ // Check if the lsm passes "pc". If so, mark it as passed.
+ if (lsm_passes_pc &&
+ lsm->address <= pc && pc < lsm->address + advance_address) {
+ *lsm_passes_pc = true;
+ }
+
+ lsm->address += advance_address;
+ lsm->line_num += advance_line;
+ lsm->basic_block = true;
+ *len = oplen;
+ return true;
+ }
+
+ // Otherwise, we have the regular opcodes
+ switch (opcode) {
+ case DW_LNS_copy: {
+ lsm->basic_block = false;
+ *len = oplen;
+ return true;
+ }
+
+ case DW_LNS_advance_pc: {
+ uint64 advance_address = reader->ReadUnsignedLEB128(start, &templen);
+ oplen += templen;
+
+ // Check if the lsm passes "pc". If so, mark it as passed.
+ if (lsm_passes_pc && lsm->address <= pc &&
+ pc < lsm->address + header.min_insn_length * advance_address) {
+ *lsm_passes_pc = true;
+ }
+
+ lsm->address += header.min_insn_length * advance_address;
+ }
+ break;
+ case DW_LNS_advance_line: {
+ const int64 advance_line = reader->ReadSignedLEB128(start, &templen);
+ oplen += templen;
+ lsm->line_num += advance_line;
+
+ // With gcc 4.2.1, we can get the line_no here for the first time
+ // since DW_LNS_advance_line is called after DW_LNE_set_address is
+ // called. So we check if the lsm passes "pc" here, not in
+ // DW_LNE_set_address.
+ if (lsm_passes_pc && lsm->address == pc) {
+ *lsm_passes_pc = true;
+ }
+ }
+ break;
+ case DW_LNS_set_file: {
+ const uint64 fileno = reader->ReadUnsignedLEB128(start, &templen);
+ oplen += templen;
+ lsm->file_num = fileno;
+ }
+ break;
+ case DW_LNS_set_column: {
+ const uint64 colno = reader->ReadUnsignedLEB128(start, &templen);
+ oplen += templen;
+ lsm->column_num = colno;
+ }
+ break;
+ case DW_LNS_negate_stmt: {
+ lsm->is_stmt = !lsm->is_stmt;
+ }
+ break;
+ case DW_LNS_set_basic_block: {
+ lsm->basic_block = true;
+ }
+ break;
+ case DW_LNS_fixed_advance_pc: {
+ const uint16 advance_address = reader->ReadTwoBytes(start);
+ oplen += 2;
+
+ // Check if the lsm passes "pc". If so, mark it as passed.
+ if (lsm_passes_pc &&
+ lsm->address <= pc && pc < lsm->address + advance_address) {
+ *lsm_passes_pc = true;
+ }
+
+ lsm->address += advance_address;
+ }
+ break;
+ case DW_LNS_const_add_pc: {
+ const int64 advance_address = header.min_insn_length
+ * ((255 - header.opcode_base)
+ / header.line_range);
+
+ // Check if the lsm passes "pc". If so, mark it as passed.
+ if (lsm_passes_pc &&
+ lsm->address <= pc && pc < lsm->address + advance_address) {
+ *lsm_passes_pc = true;
+ }
+
+ lsm->address += advance_address;
+ }
+ break;
+ case DW_LNS_extended_op: {
+ const size_t extended_op_len = reader->ReadUnsignedLEB128(start,
+ &templen);
+ start += templen;
+ oplen += templen + extended_op_len;
+
+ const uint64 extended_op = reader->ReadOneByte(start);
+ start++;
+
+ switch (extended_op) {
+ case DW_LNE_end_sequence: {
+ lsm->end_sequence = true;
+ *len = oplen;
+ return true;
+ }
+ break;
+ case DW_LNE_set_address: {
+ // With gcc 4.2.1, we cannot tell the line_no here since
+ // DW_LNE_set_address is called before DW_LNS_advance_line is
+ // called. So we do not check if the lsm passes "pc" here. See
+ // also the comment in DW_LNS_advance_line.
+ uint64 address = reader->ReadAddress(start);
+ lsm->address = address;
+ }
+ break;
+ case DW_LNE_define_file: {
+ const char* filename = start;
+
+ templen = strlen(filename) + 1;
+ start += templen;
+
+ uint64 dirindex = reader->ReadUnsignedLEB128(start, &templen);
+ oplen += templen;
+
+ const uint64 mod_time = reader->ReadUnsignedLEB128(start,
+ &templen);
+ oplen += templen;
+
+ const uint64 filelength = reader->ReadUnsignedLEB128(start,
+ &templen);
+ oplen += templen;
+
+ if (handler) {
+ handler->DefineFile(filename, -1, dirindex, mod_time,
+ filelength);
+ }
+ }
+ break;
+ }
+ }
+ break;
+
+ default: {
+ // Ignore unknown opcode silently
+ if (header.std_opcode_lengths) {
+ for (int i = 0; i < (*header.std_opcode_lengths)[opcode]; i++) {
+ size_t templen;
+ reader->ReadUnsignedLEB128(start, &templen);
+ start += templen;
+ oplen += templen;
+ }
+ }
+ }
+ break;
+ }
+ *len = oplen;
+ return false;
+}
+
+void LineInfo::ReadLines() {
+ struct LineStateMachine lsm;
+
+ // lengthstart is the place the length field is based on.
+ // It is the point in the header after the initial length field
+ const char* lengthstart = buffer_;
+
+ // In 64 bit dwarf, the initial length is 12 bytes, because of the
+ // 0xffffffff at the start.
+ if (reader_->OffsetSize() == 8)
+ lengthstart += 12;
+ else
+ lengthstart += 4;
+
+ const char* lineptr = after_header_;
+ while (lineptr < lengthstart + header_.total_length) {
+ lsm.Reset(header_.default_is_stmt);
+ while (!lsm.end_sequence) {
+ size_t oplength;
+ bool add_line = ProcessOneOpcode(reader_, handler_, header_,
+ lineptr, &lsm, &oplength, (uintptr_t)-1, NULL);
+ if (add_line)
+ handler_->AddLine(lsm.address, lsm.file_num, lsm.line_num,
+ lsm.column_num);
+ lineptr += oplength;
+ }
+ }
+
+ after_header_ = lengthstart + header_.total_length;
+}
+
+} // namespace dwarf2reader
diff --git a/src/common/mac/dwarf/dwarf2reader.h b/src/common/mac/dwarf/dwarf2reader.h
new file mode 100644
index 00000000..f27cdac7
--- /dev/null
+++ b/src/common/mac/dwarf/dwarf2reader.h
@@ -0,0 +1,393 @@
+// Copyright 2006 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.
+
+// This file contains definitions related to the DWARF2/3 reader and
+// it's handler interfaces.
+// The DWARF2/3 specification can be found at
+// http://dwarf.freestandards.org and should be considered required
+// reading if you wish to modify the implementation.
+// Only a cursory attempt is made to explain terminology that is
+// used here, as it is much better explained in the standard documents
+#ifndef COMMON_MAC_DWARF_DWARF2READER_H__
+#define COMMON_MAC_DWARF_DWARF2READER_H__
+
+#include <ext/hash_map>
+#include <list>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "common/mac/dwarf/dwarf2enums.h"
+#include "common/mac/dwarf/types.h"
+
+using namespace std;
+using namespace __gnu_cxx;
+
+namespace dwarf2reader {
+struct LineStateMachine;
+class ByteReader;
+class Dwarf2Handler;
+class LineInfoHandler;
+
+// This maps from a string naming a section to a pair containing a
+// the data for the section, and the size of the section.
+typedef hash_map<string, pair<const char*, uint64> > SectionMap;
+typedef list<pair<enum DwarfAttribute, enum DwarfForm> > AttributeList;
+typedef AttributeList::iterator AttributeIterator;
+typedef AttributeList::const_iterator ConstAttributeIterator;
+
+struct LineInfoHeader {
+ uint64 total_length;
+ uint16 version;
+ uint64 prologue_length;
+ uint8 min_insn_length; // insn stands for instructin
+ bool default_is_stmt; // stmt stands for statement
+ int8 line_base;
+ uint8 line_range;
+ uint8 opcode_base;
+ // Use a pointer so that signalsafe_addr2line is able to use this structure
+ // without heap allocation problem.
+ vector<unsigned char> *std_opcode_lengths;
+};
+
+class LineInfo {
+ public:
+
+ // Initializes a .debug_line reader. Buffer and buffer length point
+ // to the beginning and length of the line information to read.
+ // Reader is a ByteReader class that has the endianness set
+ // properly.
+ LineInfo(const char* buffer_, uint64 buffer_length,
+ ByteReader* reader, LineInfoHandler* handler);
+
+ virtual ~LineInfo() {
+ if (header_.std_opcode_lengths) {
+ delete header_.std_opcode_lengths;
+ }
+ }
+
+ // Start processing line info, and calling callbacks in the handler.
+ // Consumes the line number information for a single compilation unit.
+ // Returns the number of bytes processed.
+ uint64 Start();
+
+ // Process a single line info opcode at START using the state
+ // machine at LSM. Return true if we should define a line using the
+ // current state of the line state machine. Place the length of the
+ // opcode in LEN.
+ // If LSM_PASSES_PC is non-NULL, this function also checks if the lsm
+ // passes the address of PC. In other words, LSM_PASSES_PC will be
+ // set to true, if the following condition is met.
+ //
+ // lsm's old address < PC <= lsm's new address
+ static bool ProcessOneOpcode(ByteReader* reader,
+ LineInfoHandler* handler,
+ const struct LineInfoHeader &header,
+ const char* start,
+ struct LineStateMachine* lsm,
+ size_t* len,
+ uintptr_t pc,
+ bool *lsm_passes_pc);
+
+ private:
+ // Reads the DWARF2/3 header for this line info.
+ void ReadHeader();
+
+ // Reads the DWARF2/3 line information
+ void ReadLines();
+
+ // The associated handler to call processing functions in
+ LineInfoHandler* handler_;
+
+ // The associated ByteReader that handles endianness issues for us
+ ByteReader* reader_;
+
+ // A DWARF2/3 line info header. This is not the same size as
+ // in the actual file, as the one in the file may have a 32 bit or
+ // 64 bit lengths
+
+ struct LineInfoHeader header_;
+
+ // buffer is the buffer for our line info, starting at exactly where
+ // the line info to read is. after_header is the place right after
+ // the end of the line information header.
+ const char* buffer_;
+ uint64 buffer_length_;
+ const char* after_header_;
+};
+
+// This class is the main interface between the line info reader and
+// the client. The virtual functions inside this get called for
+// interesting events that happen during line info reading. The
+// default implementation does nothing
+
+class LineInfoHandler {
+ public:
+ LineInfoHandler() { }
+
+ virtual ~LineInfoHandler() { }
+
+ // Called when we define a directory. NAME is the directory name,
+ // DIR_NUM is the directory number
+ virtual void DefineDir(const string& name, uint32 dir_num) { }
+
+ // Called when we define a filename. NAME is the filename, FILE_NUM
+ // is the file number which is -1 if the file index is the next
+ // index after the last numbered index (this happens when files are
+ // dynamically defined by the line program), DIR_NUM is the
+ // directory index for the directory name of this file, MOD_TIME is
+ // the modification time of the file, and LENGTH is the length of
+ // the file
+ virtual void DefineFile(const string& name, int32 file_num,
+ uint32 dir_num, uint64 mod_time,
+ uint64 length) { }
+
+ // Called when the line info reader has a new line, address pair
+ // ready for us. ADDRESS is the address of the code, FILE_NUM is
+ // the file number containing the code, LINE_NUM is the line number in
+ // that file for the code, and COLUMN_NUM is the column number the code
+ // starts at, if we know it (0 otherwise).
+ virtual void AddLine(uint64 address, uint32 file_num, uint32 line_num,
+ uint32 column_num) { }
+};
+
+// The base of DWARF2/3 debug info is a DIE (Debugging Information
+// Entry.
+// DWARF groups DIE's into a tree and calls the root of this tree a
+// "compilation unit". Most of the time, their is one compilation
+// unit in the .debug_info section for each file that had debug info
+// generated.
+// Each DIE consists of
+
+// 1. a tag specifying a thing that is being described (ie
+// DW_TAG_subprogram for functions, DW_TAG_variable for variables, etc
+// 2. attributes (such as DW_AT_location for location in memory,
+// DW_AT_name for name), and data for each attribute.
+// 3. A flag saying whether the DIE has children or not
+
+// In order to gain some amount of compression, the format of
+// each DIE (tag name, attributes and data forms for the attributes)
+// are stored in a separate table called the "abbreviation table".
+// This is done because a large number of DIEs have the exact same tag
+// and list of attributes, but different data for those attributes.
+// As a result, the .debug_info section is just a stream of data, and
+// requires reading of the .debug_abbrev section to say what the data
+// means.
+
+// As a warning to the user, it should be noted that the reason for
+// using absolute offsets from the beginning of .debug_info is that
+// DWARF2/3 support referencing DIE's from other DIE's by their offset
+// from either the current compilation unit start, *or* the beginning
+// of the .debug_info section. This means it is possible to reference
+// a DIE in one compilation unit from a DIE in another compilation
+// unit. This style of reference is usually used to eliminate
+// duplicated information that occurs across compilation
+// units, such as base types, etc. GCC 3.4+ support this with
+// -feliminate-dwarf2-dups. Other toolchains will sometimes do
+// duplicate elimination in the linker.
+
+class CompilationUnit {
+ public:
+
+ // Initialize a compilation unit. This requires a map of sections,
+ // the offset of this compilation unit in the debug_info section, a
+ // ByteReader, and a Dwarf2Handler class to call callbacks in.
+ CompilationUnit(const SectionMap& sections, uint64 offset,
+ ByteReader* reader, Dwarf2Handler* handler);
+ virtual ~CompilationUnit() {
+ if (abbrevs_) delete abbrevs_;
+ }
+
+ // Begin reading a Dwarf2 compilation unit, and calling the
+ // callbacks in the Dwarf2Handler
+ // Return the offset of the end of the compilation unit - the passed
+ // in offset.
+ uint64 Start();
+
+ private:
+
+ // This struct represents a single DWARF2/3 abbreviation
+ // The abbreviation tells how to read a DWARF2/3 DIE, and consist of a
+ // tag and a list of attributes, as well as the data form of each attribute.
+ struct Abbrev {
+ uint32 number;
+ enum DwarfTag tag;
+ bool has_children;
+ AttributeList attributes;
+ };
+
+ // A DWARF2/3 compilation unit header. This is not the same size as
+ // in the actual file, as the one in the file may have a 32 bit or
+ // 64 bit length.
+ struct CompilationUnitHeader {
+ uint64 length;
+ uint16 version;
+ uint64 abbrev_offset;
+ uint8 address_size;
+ } header_;
+
+ // Reads the DWARF2/3 header for this compilation unit.
+ void ReadHeader();
+
+ // Reads the DWARF2/3 abbreviations for this compilation unit
+ void ReadAbbrevs();
+
+ // Processes a single DIE for this compilation unit and return a new
+ // pointer just past the end of it
+ const char* ProcessDIE(uint64 dieoffset,
+ const char* start,
+ const Abbrev& abbrev);
+
+ // Processes a single attribute and return a new pointer just past the
+ // end of it
+ const char* ProcessAttribute(uint64 dieoffset,
+ const char* start,
+ enum DwarfAttribute attr,
+ enum DwarfForm form);
+
+ // Processes all DIEs for this compilation unit
+ void ProcessDIEs();
+
+ // Skips the die with attributes specified in ABBREV starting at
+ // START, and return the new place to position the stream to.
+ const char* SkipDIE(const char* start,
+ const Abbrev& abbrev);
+
+ // Skips the attribute starting at START, with FORM, and return the
+ // new place to position the stream to.
+ const char* SkipAttribute(const char* start,
+ enum DwarfForm form);
+
+ // Offset from section start is the offset of this compilation unit
+ // from the beginning of the .debug_info section.
+ uint64 offset_from_section_start_;
+
+ // buffer is the buffer for our CU, starting at .debug_info + offset
+ // passed in from constructor.
+ // after_header points to right after the compilation unit header.
+ const char* buffer_;
+ uint64 buffer_length_;
+ const char* after_header_;
+
+ // The associated ByteReader that handles endianness issues for us
+ ByteReader* reader_;
+
+ // The map of sections in our file to buffers containing their data
+ const SectionMap& sections_;
+
+ // The associated handler to call processing functions in
+ Dwarf2Handler* handler_;
+
+ // Set of DWARF2/3 abbreviations for this compilation unit. Indexed
+ // by abbreviation number, which means that abbrevs_[0] is not
+ // valid.
+ vector<Abbrev>* abbrevs_;
+
+ // String section buffer and length, if we have a string section.
+ // This is here to avoid doing a section lookup for strings in
+ // ProcessAttribute, which is in the hot path for DWARF2 reading.
+ const char* string_buffer_;
+ uint64 string_buffer_length_;
+};
+
+// This class is the main interface between the reader and the
+// client. The virtual functions inside this get called for
+// interesting events that happen during DWARF2 reading.
+// The default implementation skips everything.
+
+class Dwarf2Handler {
+ public:
+ Dwarf2Handler() { }
+
+ virtual ~Dwarf2Handler() { }
+
+ // Start to process a compilation unit at OFFSET from the beginning of the
+ // debug_info section. Return false if you would like
+ // to skip this compilation unit.
+ virtual bool StartCompilationUnit(uint64 offset, uint8 address_size,
+ uint8 offset_size, uint64 cu_length,
+ uint8 dwarf_version) { return false; }
+
+ // Start to process a DIE at OFFSET from the beginning of the
+ // debug_info section. Return false if you would like to skip this
+ // DIE.
+ virtual bool StartDIE(uint64 offset, enum DwarfTag tag,
+ const AttributeList& attrs) { return false; }
+
+ // Called when we have an attribute with unsigned data to give to
+ // our handler. The attribute is for the DIE at OFFSET from the
+ // beginning of compilation unit, has a name of ATTR, a form of
+ // FORM, and the actual data of the attribute is in DATA.
+ virtual void ProcessAttributeUnsigned(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ uint64 data) { }
+
+ // Called when we have an attribute with signed data to give to
+ // our handler. The attribute is for the DIE at OFFSET from the
+ // beginning of compilation unit, has a name of ATTR, a form of
+ // FORM, and the actual data of the attribute is in DATA.
+ virtual void ProcessAttributeSigned(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ int64 data) { }
+
+ // Called when we have an attribute with a buffer of data to give to
+ // our handler. The attribute is for the DIE at OFFSET from the
+ // beginning of compilation unit, has a name of ATTR, a form of
+ // FORM, and the actual data of the attribute is in DATA, and the
+ // length of the buffer is LENGTH. The buffer is owned by the
+ // caller, not the callee, and may not persist for very long. If
+ // you want the data to be available later, it needs to be copied.
+ virtual void ProcessAttributeBuffer(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ const char* data,
+ uint64 len) { }
+
+ // Called when we have an attribute with string data to give to
+ // our handler. The attribute is for the DIE at OFFSET from the
+ // beginning of compilation unit, has a name of ATTR, a form of
+ // FORM, and the actual data of the attribute is in DATA.
+ virtual void ProcessAttributeString(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ const string& data) { }
+
+ // Called when finished processing the DIE at OFFSET.
+ // Because DWARF2/3 specifies a tree of DIEs, you may get starts
+ // before ends of the previous DIE, as we process children before
+ // ending the parent.
+ virtual void EndDIE(uint64 offset) { }
+
+};
+
+
+} // namespace dwarf2reader
+
+#endif // UTIL_DEBUGINFO_DWARF2READER_H__
diff --git a/src/common/mac/dwarf/functioninfo.cc b/src/common/mac/dwarf/functioninfo.cc
new file mode 100644
index 00000000..e9d33b83
--- /dev/null
+++ b/src/common/mac/dwarf/functioninfo.cc
@@ -0,0 +1,198 @@
+// Copyright 2006 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.
+
+// This is a client for the dwarf2reader to extract function and line
+// information from the debug info.
+
+#include <map>
+#include <queue>
+#include <vector>
+
+
+#include "common/mac/dwarf/functioninfo.h"
+
+#include "common/mac/dwarf/bytereader.h"
+
+
+namespace __gnu_cxx
+{
+ template<>
+ struct hash<std::string>
+ {
+ size_t operator()(const std::string& k) const;
+ };
+}
+
+
+namespace dwarf2reader {
+
+CULineInfoHandler::CULineInfoHandler(vector<SourceFileInfo>* files,
+ vector<string>* dirs,
+ LineMap* linemap):linemap_(linemap),
+ files_(files),
+ dirs_(dirs) {
+ // The dirs and files are 1 indexed, so just make sure we put
+ // nothing in the 0 vector.
+ assert(dirs->size() == 0);
+ assert(files->size() == 0);
+ dirs->push_back("");
+ SourceFileInfo s;
+ s.name = "";
+ s.lowpc = ULLONG_MAX;
+ files->push_back(s);
+}
+
+void CULineInfoHandler::DefineDir(const string& name, uint32 dir_num) {
+ // These should never come out of order, actually
+ assert(dir_num == dirs_->size());
+ dirs_->push_back(name);
+}
+
+void CULineInfoHandler::DefineFile(const string& name,
+ int32 file_num, uint32 dir_num,
+ uint64 mod_time, uint64 length) {
+ assert(dir_num >= 0);
+ assert(dir_num < dirs_->size());
+
+ // These should never come out of order, actually.
+ if (file_num == (int32)files_->size() || file_num == -1) {
+ string dir = dirs_->at(dir_num);
+
+ SourceFileInfo s;
+ s.lowpc = ULLONG_MAX;
+
+ if (dir == "") {
+ s.name = name;
+ } else {
+ s.name = dir + "/" + name;
+ }
+
+ files_->push_back(s);
+ } else {
+ fprintf(stderr, "error in DefineFile");
+ }
+}
+
+void CULineInfoHandler::AddLine(uint64 address, uint32 file_num,
+ uint32 line_num, uint32 column_num) {
+ if (file_num < files_->size()) {
+ linemap_->insert(make_pair(address, make_pair(files_->at(file_num).name.c_str(),
+ line_num)));
+
+ if(address < files_->at(file_num).lowpc) {
+ files_->at(file_num).lowpc = address;
+ }
+ } else {
+ fprintf(stderr,"error in AddLine");
+ }
+}
+
+bool CUFunctionInfoHandler::StartCompilationUnit(uint64 offset,
+ uint8 address_size,
+ uint8 offset_size,
+ uint64 cu_length,
+ uint8 dwarf_version) {
+ return true;
+}
+
+
+// For function info, we only care about subprograms and inlined
+// subroutines. For line info, the DW_AT_stmt_list lives in the
+// compile unit tag.
+
+bool CUFunctionInfoHandler::StartDIE(uint64 offset, enum DwarfTag tag,
+ const AttributeList& attrs) {
+ switch (tag) {
+ case DW_TAG_subprogram:
+ case DW_TAG_inlined_subroutine: {
+ current_function_info_ = new FunctionInfo;
+ current_function_info_->lowpc = current_function_info_->highpc = 0;
+ current_function_info_->name = "";
+ current_function_info_->line = 0;
+ current_function_info_->file = "";
+ offset_to_funcinfo_->insert(make_pair(offset, current_function_info_));
+ };
+ // FALLTHROUGH
+ case DW_TAG_compile_unit:
+ return true;
+ default:
+ return false;
+ }
+ return false;
+}
+
+// Only care about the name attribute for functions
+
+void CUFunctionInfoHandler::ProcessAttributeString(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ const string &data) {
+ if (attr == DW_AT_name && current_function_info_)
+ current_function_info_->name = data;
+}
+
+void CUFunctionInfoHandler::ProcessAttributeUnsigned(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ uint64 data) {
+ if (attr == DW_AT_stmt_list) {
+ SectionMap::const_iterator iter = sections_.find("__debug_line");
+ assert(iter != sections_.end());
+
+ // this should be a scoped_ptr but we dont' use boost :-(
+ auto_ptr<LineInfo> lireader(new LineInfo(iter->second.first + data,
+ iter->second.second - data,
+ reader_, linehandler_));
+ lireader->Start();
+ } else if (current_function_info_) {
+ switch (attr) {
+ case DW_AT_low_pc:
+ current_function_info_->lowpc = data;
+ break;
+ case DW_AT_high_pc:
+ current_function_info_->highpc = data;
+ break;
+ case DW_AT_decl_line:
+ current_function_info_->line = data;
+ break;
+ case DW_AT_decl_file:
+ current_function_info_->file = files_->at(data).name;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+void CUFunctionInfoHandler::EndDIE(uint64 offset) {
+ if (current_function_info_ && current_function_info_->lowpc)
+ address_to_funcinfo_->insert(make_pair(current_function_info_->lowpc,
+ current_function_info_));
+}
+
+} // namespace dwarf2reader
diff --git a/src/common/mac/dwarf/functioninfo.h b/src/common/mac/dwarf/functioninfo.h
new file mode 100644
index 00000000..f529f092
--- /dev/null
+++ b/src/common/mac/dwarf/functioninfo.h
@@ -0,0 +1,175 @@
+// Copyright 2006 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.
+
+
+// This file contains the definitions for a DWARF2/3 information
+// collector that uses the DWARF2/3 reader interface to build a mapping
+// of addresses to files, lines, and functions.
+
+#ifndef COMMON_MAC_DWARF_FUNCTIONINFO_H__
+#define COMMON_MAC_DWARF_FUNCTIONINFO_H__
+
+#include <map>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "common/mac/dwarf/dwarf2reader.h"
+
+
+namespace dwarf2reader {
+
+struct FunctionInfo {
+ // Name of the function
+ string name;
+ // File containing this function
+ string file;
+ // Line number for start of function.
+ uint32 line;
+ // Beginning address for this function
+ uint64 lowpc;
+ // End address for this function.
+ uint64 highpc;
+};
+
+struct SourceFileInfo {
+ // Name of the source file name
+ string name;
+ // Low address of source file name
+ uint64 lowpc;
+};
+
+typedef map<uint64, FunctionInfo*> FunctionMap;
+typedef map<uint64, pair<string, uint32> > LineMap;
+
+// This class is a basic line info handler that fills in the dirs,
+// file, and linemap passed into it with the data produced from the
+// LineInfoHandler.
+class CULineInfoHandler: public LineInfoHandler {
+ public:
+
+ //
+ CULineInfoHandler(vector<SourceFileInfo>* files,
+ vector<string>* dirs,
+ LineMap* linemap);
+ virtual ~CULineInfoHandler() { }
+
+ // Called when we define a directory. We just place NAME into dirs_
+ // at position DIR_NUM.
+ virtual void DefineDir(const string& name, uint32 dir_num);
+
+ // Called when we define a filename. We just place
+ // concat(dirs_[DIR_NUM], NAME) into files_ at position FILE_NUM.
+ virtual void DefineFile(const string& name, int32 file_num,
+ uint32 dir_num, uint64 mod_time, uint64 length);
+
+
+ // Called when the line info reader has a new line, address pair
+ // ready for us. ADDRESS is the address of the code, FILE_NUM is
+ // the file number containing the code, LINE_NUM is the line number
+ // in that file for the code, and COLUMN_NUM is the column number
+ // the code starts at, if we know it (0 otherwise).
+ virtual void AddLine(uint64 address, uint32 file_num, uint32 line_num,
+ uint32 column_num);
+
+
+ private:
+ LineMap* linemap_;
+ vector<SourceFileInfo>* files_;
+ vector<string>* dirs_;
+};
+
+class CUFunctionInfoHandler: public Dwarf2Handler {
+ public:
+ CUFunctionInfoHandler(vector<SourceFileInfo>* files,
+ vector<string>* dirs,
+ LineMap* linemap,
+ FunctionMap* offset_to_funcinfo,
+ FunctionMap* address_to_funcinfo,
+ CULineInfoHandler* linehandler,
+ const SectionMap& sections,
+ ByteReader* reader)
+ : files_(files), dirs_(dirs), linemap_(linemap),
+ offset_to_funcinfo_(offset_to_funcinfo),
+ address_to_funcinfo_(address_to_funcinfo),
+ linehandler_(linehandler), sections_(sections),
+ reader_(reader), current_function_info_(NULL) { }
+
+ virtual ~CUFunctionInfoHandler() { }
+
+ // Start to process a compilation unit at OFFSET from the beginning of the
+ // debug_info section. We want to see all compilation units, so we
+ // always return true.
+
+ virtual bool StartCompilationUnit(uint64 offset, uint8 address_size,
+ uint8 offset_size, uint64 cu_length,
+ uint8 dwarf_version);
+
+ // Start to process a DIE at OFFSET from the beginning of the
+ // debug_info section. We only care about function related DIE's.
+ virtual bool StartDIE(uint64 offset, enum DwarfTag tag,
+ const AttributeList& attrs);
+
+ // Called when we have an attribute with unsigned data to give to
+ // our handler. The attribute is for the DIE at OFFSET from the
+ // beginning of compilation unit, has a name of ATTR, a form of
+ // FORM, and the actual data of the attribute is in DATA.
+ virtual void ProcessAttributeUnsigned(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ uint64 data);
+
+ // Called when we have an attribute with string data to give to
+ // our handler. The attribute is for the DIE at OFFSET from the
+ // beginning of compilation unit, has a name of ATTR, a form of
+ // FORM, and the actual data of the attribute is in DATA.
+ virtual void ProcessAttributeString(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ const string& data);
+
+ // Called when finished processing the DIE at OFFSET.
+ // Because DWARF2/3 specifies a tree of DIEs, you may get starts
+ // before ends of the previous DIE, as we process children before
+ // ending the parent.
+ virtual void EndDIE(uint64 offset);
+
+ private:
+ vector<SourceFileInfo>* files_;
+ vector<string>* dirs_;
+ LineMap* linemap_;
+ FunctionMap* offset_to_funcinfo_;
+ FunctionMap* address_to_funcinfo_;
+ CULineInfoHandler* linehandler_;
+ const SectionMap& sections_;
+ ByteReader* reader_;
+ FunctionInfo* current_function_info_;
+};
+
+} // namespace dwarf2reader
+#endif // COMMON_MAC_DWARF_FUNCTIONINFO_H__
diff --git a/src/common/mac/dwarf/line_state_machine.h b/src/common/mac/dwarf/line_state_machine.h
new file mode 100644
index 00000000..4ba98f74
--- /dev/null
+++ b/src/common/mac/dwarf/line_state_machine.h
@@ -0,0 +1,61 @@
+// Copyright 2008 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.
+
+
+#ifndef COMMON_MAC_DWARF_LINE_STATE_MACHINE_H__
+#define COMMON_MAC_DWARF_LINE_STATE_MACHINE_H__
+
+namespace dwarf2reader {
+
+// This is the format of a DWARF2/3 line state machine that we process
+// opcodes using. There is no need for anything outside the lineinfo
+// processor to know how this works.
+struct LineStateMachine {
+ void Reset(bool default_is_stmt) {
+ file_num = 1;
+ address = 0;
+ line_num = 1;
+ column_num = 0;
+ is_stmt = default_is_stmt;
+ basic_block = false;
+ end_sequence = false;
+ }
+
+ uint32 file_num;
+ uint64 address;
+ uint64 line_num;
+ uint32 column_num;
+ bool is_stmt; // stmt means statement.
+ bool basic_block;
+ bool end_sequence;
+};
+
+} // namespace dwarf2reader
+
+
+#endif // COMMON_MAC_DWARF_LINE_STATE_MACHINE_H__
diff --git a/src/common/mac/dwarf/types.h b/src/common/mac/dwarf/types.h
new file mode 100644
index 00000000..76541597
--- /dev/null
+++ b/src/common/mac/dwarf/types.h
@@ -0,0 +1,46 @@
+// Copyright 2008 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.
+
+
+// This file contains some typedefs for basic types
+
+
+#ifndef _COMMON_MAC_DWARF_TYPES_H__
+#define _COMMON_MAC_DWARF_TYPES_H__
+
+typedef signed char int8;
+typedef short int16;
+typedef int int32;
+typedef long long int64;
+
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+typedef unsigned int uint32;
+typedef unsigned long long uint64;
+
+#endif // _COMMON_MAC_DWARF_TYPES_H__
diff --git a/src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj b/src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj
index f3e04d61..4b31f5ff 100644
--- a/src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj
+++ b/src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj
@@ -43,6 +43,9 @@
9BE650B50B52FE3000611104 /* macho_id.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BE650AF0B52FE3000611104 /* macho_id.h */; };
9BE650B60B52FE3000611104 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BE650B00B52FE3000611104 /* macho_walker.cc */; };
9BE650B70B52FE3000611104 /* macho_walker.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BE650B10B52FE3000611104 /* macho_walker.h */; };
+ F9C7ECE50E8ABCA600E953AD /* bytereader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9C7ECE20E8ABCA600E953AD /* bytereader.cc */; };
+ F9C7ECE60E8ABCA600E953AD /* dwarf2reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9C7ECE30E8ABCA600E953AD /* dwarf2reader.cc */; };
+ F9C7ECE70E8ABCA600E953AD /* functioninfo.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9C7ECE40E8ABCA600E953AD /* functioninfo.cc */; };
FD6625CD0CF4D45C004AC844 /* stackwalker_amd64.cc in Sources */ = {isa = PBXBuildFile; fileRef = FD6625C40CF4D438004AC844 /* stackwalker_amd64.cc */; };
FD8EDEAE0CADDAD400A5EDF1 /* stackwalker_sparc.cc in Sources */ = {isa = PBXBuildFile; fileRef = FD8EDEAC0CADDAD400A5EDF1 /* stackwalker_sparc.cc */; };
FD8EDEAF0CADDAD400A5EDF1 /* stackwalker_sparc.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = FD8EDEAD0CADDAD400A5EDF1 /* stackwalker_sparc.h */; };
@@ -127,6 +130,9 @@
9BE650AF0B52FE3000611104 /* macho_id.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_id.h; path = ../../../common/mac/macho_id.h; sourceTree = SOURCE_ROOT; };
9BE650B00B52FE3000611104 /* macho_walker.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_walker.cc; path = ../../../common/mac/macho_walker.cc; sourceTree = SOURCE_ROOT; };
9BE650B10B52FE3000611104 /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_walker.h; path = ../../../common/mac/macho_walker.h; sourceTree = SOURCE_ROOT; };
+ F9C7ECE20E8ABCA600E953AD /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/mac/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; };
+ F9C7ECE30E8ABCA600E953AD /* dwarf2reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader.cc; path = ../../../common/mac/dwarf/dwarf2reader.cc; sourceTree = SOURCE_ROOT; };
+ F9C7ECE40E8ABCA600E953AD /* functioninfo.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = functioninfo.cc; path = ../../../common/mac/dwarf/functioninfo.cc; sourceTree = SOURCE_ROOT; };
FD6625C40CF4D438004AC844 /* stackwalker_amd64.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = stackwalker_amd64.cc; path = ../../../processor/stackwalker_amd64.cc; sourceTree = SOURCE_ROOT; };
FD6625C50CF4D438004AC844 /* stackwalker_amd64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stackwalker_amd64.h; path = ../../../processor/stackwalker_amd64.h; sourceTree = SOURCE_ROOT; };
FD8EDEAC0CADDAD400A5EDF1 /* stackwalker_sparc.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = stackwalker_sparc.cc; path = ../../../processor/stackwalker_sparc.cc; sourceTree = SOURCE_ROOT; };
@@ -148,6 +154,7 @@
08FB7794FE84155DC02AAC07 /* crash_report */ = {
isa = PBXGroup;
children = (
+ F9C7ECE10E8ABC7F00E953AD /* DWARF */,
5578003E0BE1F28500EC23E0 /* macho_utilities.cc */,
5578003F0BE1F28500EC23E0 /* macho_utilities.h */,
9BDF192D0B1BC15D00F8391B /* dump_syms.h */,
@@ -269,6 +276,16 @@
name = common;
sourceTree = "<group>";
};
+ F9C7ECE10E8ABC7F00E953AD /* DWARF */ = {
+ isa = PBXGroup;
+ children = (
+ F9C7ECE20E8ABCA600E953AD /* bytereader.cc */,
+ F9C7ECE30E8ABCA600E953AD /* dwarf2reader.cc */,
+ F9C7ECE40E8ABCA600E953AD /* functioninfo.cc */,
+ );
+ name = DWARF;
+ sourceTree = "<group>";
+ };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -332,6 +349,9 @@
8B40BDC00C0638E4009535AF /* logging.cc in Sources */,
FD8EDEAE0CADDAD400A5EDF1 /* stackwalker_sparc.cc in Sources */,
FD6625CD0CF4D45C004AC844 /* stackwalker_amd64.cc in Sources */,
+ F9C7ECE50E8ABCA600E953AD /* bytereader.cc in Sources */,
+ F9C7ECE60E8ABCA600E953AD /* dwarf2reader.cc in Sources */,
+ F9C7ECE70E8ABCA600E953AD /* functioninfo.cc in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj b/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj
index 3a19cb96..6f22c0d0 100644
--- a/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj
+++ b/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj
@@ -8,17 +8,15 @@
/* Begin PBXBuildFile section */
5578008B0BE1F3AB00EC23E0 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 557800890BE1F3AB00EC23E0 /* macho_utilities.cc */; };
- 5578008C0BE1F3AB00EC23E0 /* macho_utilities.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5578008A0BE1F3AB00EC23E0 /* macho_utilities.h */; };
8DD76F9A0486AA7600D96B5E /* dump_syms.mm in Sources */ = {isa = PBXBuildFile; fileRef = 08FB7796FE84155DC02AAC07 /* dump_syms.mm */; settings = {ATTRIBUTES = (); }; };
8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08FB779EFE84155DC02AAC07 /* Foundation.framework */; };
- 9BDF186F0B1BB43700F8391B /* dump_syms.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BDF186D0B1BB43700F8391B /* dump_syms.h */; };
- 9BDF18700B1BB43700F8391B /* dump_syms_tool.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BDF186E0B1BB43700F8391B /* dump_syms_tool.m */; };
+ 9BDF18700B1BB43700F8391B /* dump_syms_tool.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9BDF186E0B1BB43700F8391B /* dump_syms_tool.mm */; };
9BE650470B52F6D800611104 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BE650410B52F6D800611104 /* file_id.cc */; };
- 9BE650480B52F6D800611104 /* file_id.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BE650420B52F6D800611104 /* file_id.h */; };
9BE650490B52F6D800611104 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BE650430B52F6D800611104 /* macho_id.cc */; };
- 9BE6504A0B52F6D800611104 /* macho_id.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BE650440B52F6D800611104 /* macho_id.h */; };
9BE6504B0B52F6D800611104 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BE650450B52F6D800611104 /* macho_walker.cc */; };
- 9BE6504C0B52F6D800611104 /* macho_walker.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BE650460B52F6D800611104 /* macho_walker.h */; };
+ F95B42320E0E22D100DBDE83 /* bytereader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F95B422C0E0E22D100DBDE83 /* bytereader.cc */; };
+ F95B42330E0E22D100DBDE83 /* dwarf2reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F95B422F0E0E22D100DBDE83 /* dwarf2reader.cc */; };
+ F9C7ED430E8AD93000E953AD /* functioninfo.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9C7ED420E8AD93000E953AD /* functioninfo.cc */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -28,11 +26,6 @@
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
- 9BDF186F0B1BB43700F8391B /* dump_syms.h in CopyFiles */,
- 9BE650480B52F6D800611104 /* file_id.h in CopyFiles */,
- 9BE6504A0B52F6D800611104 /* macho_id.h in CopyFiles */,
- 9BE6504C0B52F6D800611104 /* macho_walker.h in CopyFiles */,
- 5578008C0BE1F3AB00EC23E0 /* macho_utilities.h in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 1;
};
@@ -45,13 +38,22 @@
5578008A0BE1F3AB00EC23E0 /* macho_utilities.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_utilities.h; path = ../../../common/mac/macho_utilities.h; sourceTree = SOURCE_ROOT; };
8DD76FA10486AA7600D96B5E /* dump_syms */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dump_syms; sourceTree = BUILT_PRODUCTS_DIR; };
9BDF186D0B1BB43700F8391B /* dump_syms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dump_syms.h; path = ../../../common/mac/dump_syms.h; sourceTree = "<group>"; };
- 9BDF186E0B1BB43700F8391B /* dump_syms_tool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = dump_syms_tool.m; sourceTree = "<group>"; };
+ 9BDF186E0B1BB43700F8391B /* dump_syms_tool.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = dump_syms_tool.mm; sourceTree = "<group>"; };
9BE650410B52F6D800611104 /* file_id.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = file_id.cc; path = ../../../common/mac/file_id.cc; sourceTree = SOURCE_ROOT; };
9BE650420B52F6D800611104 /* file_id.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = file_id.h; path = ../../../common/mac/file_id.h; sourceTree = SOURCE_ROOT; };
9BE650430B52F6D800611104 /* macho_id.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_id.cc; path = ../../../common/mac/macho_id.cc; sourceTree = SOURCE_ROOT; };
9BE650440B52F6D800611104 /* macho_id.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_id.h; path = ../../../common/mac/macho_id.h; sourceTree = SOURCE_ROOT; };
9BE650450B52F6D800611104 /* macho_walker.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_walker.cc; path = ../../../common/mac/macho_walker.cc; sourceTree = SOURCE_ROOT; };
9BE650460B52F6D800611104 /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_walker.h; path = ../../../common/mac/macho_walker.h; sourceTree = SOURCE_ROOT; };
+ F95B422B0E0E22D100DBDE83 /* bytereader-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "bytereader-inl.h"; path = "../../../common/mac/dwarf/bytereader-inl.h"; sourceTree = SOURCE_ROOT; };
+ F95B422C0E0E22D100DBDE83 /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/mac/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; };
+ F95B422D0E0E22D100DBDE83 /* bytereader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bytereader.h; path = ../../../common/mac/dwarf/bytereader.h; sourceTree = SOURCE_ROOT; };
+ F95B422E0E0E22D100DBDE83 /* dwarf2enums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf2enums.h; path = ../../../common/mac/dwarf/dwarf2enums.h; sourceTree = SOURCE_ROOT; };
+ F95B422F0E0E22D100DBDE83 /* dwarf2reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader.cc; path = ../../../common/mac/dwarf/dwarf2reader.cc; sourceTree = SOURCE_ROOT; };
+ F95B42300E0E22D100DBDE83 /* dwarf2reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf2reader.h; path = ../../../common/mac/dwarf/dwarf2reader.h; sourceTree = SOURCE_ROOT; };
+ F95B42310E0E22D100DBDE83 /* line_state_machine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = line_state_machine.h; path = ../../../common/mac/dwarf/line_state_machine.h; sourceTree = SOURCE_ROOT; };
+ F9C7ED420E8AD93000E953AD /* functioninfo.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = functioninfo.cc; path = ../../../common/mac/dwarf/functioninfo.cc; sourceTree = SOURCE_ROOT; };
+ F9F5344D0E7C902C0012363F /* functioninfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = functioninfo.h; path = ../../../common/mac/dwarf/functioninfo.h; sourceTree = SOURCE_ROOT; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -69,6 +71,7 @@
08FB7794FE84155DC02AAC07 /* dump_syms */ = {
isa = PBXGroup;
children = (
+ F9F5344B0E7C8FFC0012363F /* DWARF */,
557800890BE1F3AB00EC23E0 /* macho_utilities.cc */,
5578008A0BE1F3AB00EC23E0 /* macho_utilities.h */,
9BE650410B52F6D800611104 /* file_id.cc */,
@@ -79,7 +82,7 @@
9BE650460B52F6D800611104 /* macho_walker.h */,
9BDF186D0B1BB43700F8391B /* dump_syms.h */,
08FB7796FE84155DC02AAC07 /* dump_syms.mm */,
- 9BDF186E0B1BB43700F8391B /* dump_syms_tool.m */,
+ 9BDF186E0B1BB43700F8391B /* dump_syms_tool.mm */,
08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */,
1AB674ADFE9D54B511CA2CBB /* Products */,
);
@@ -102,6 +105,22 @@
name = Products;
sourceTree = "<group>";
};
+ F9F5344B0E7C8FFC0012363F /* DWARF */ = {
+ isa = PBXGroup;
+ children = (
+ F9C7ED420E8AD93000E953AD /* functioninfo.cc */,
+ F9F5344D0E7C902C0012363F /* functioninfo.h */,
+ F95B422E0E0E22D100DBDE83 /* dwarf2enums.h */,
+ F95B422F0E0E22D100DBDE83 /* dwarf2reader.cc */,
+ F95B42300E0E22D100DBDE83 /* dwarf2reader.h */,
+ F95B422D0E0E22D100DBDE83 /* bytereader.h */,
+ F95B422B0E0E22D100DBDE83 /* bytereader-inl.h */,
+ F95B422C0E0E22D100DBDE83 /* bytereader.cc */,
+ F95B42310E0E22D100DBDE83 /* line_state_machine.h */,
+ );
+ name = DWARF;
+ sourceTree = "<group>";
+ };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -129,9 +148,11 @@
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "dump_syms" */;
+ compatibilityVersion = "Xcode 2.4";
hasScannedForEncodings = 1;
mainGroup = 08FB7794FE84155DC02AAC07 /* dump_syms */;
projectDirPath = "";
+ projectRoot = "";
targets = (
8DD76F960486AA7600D96B5E /* dump_syms */,
);
@@ -144,11 +165,14 @@
buildActionMask = 2147483647;
files = (
8DD76F9A0486AA7600D96B5E /* dump_syms.mm in Sources */,
- 9BDF18700B1BB43700F8391B /* dump_syms_tool.m in Sources */,
+ F9C7ED430E8AD93000E953AD /* functioninfo.cc in Sources */,
+ 9BDF18700B1BB43700F8391B /* dump_syms_tool.mm in Sources */,
9BE650470B52F6D800611104 /* file_id.cc in Sources */,
9BE650490B52F6D800611104 /* macho_id.cc in Sources */,
9BE6504B0B52F6D800611104 /* macho_walker.cc in Sources */,
5578008B0BE1F3AB00EC23E0 /* macho_utilities.cc in Sources */,
+ F95B42320E0E22D100DBDE83 /* bytereader.cc in Sources */,
+ F95B42330E0E22D100DBDE83 /* dwarf2reader.cc in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -158,7 +182,9 @@
1DEB927508733DD40010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
- COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ DEPLOYMENT_POSTPROCESSING = YES;
+ GCC_CHAR_IS_UNSIGNED_CHAR = YES;
GCC_C_LANGUAGE_STANDARD = "compiler-default";
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
@@ -186,10 +212,12 @@
ppc,
i386,
);
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_CHAR_IS_UNSIGNED_CHAR = YES;
GCC_C_LANGUAGE_STANDARD = "compiler-default";
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
- GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "";
HEADER_SEARCH_PATHS = (
@@ -199,6 +227,7 @@
INSTALL_PATH = "$(HOME)/bin";
OTHER_LDFLAGS = "-lcrypto";
PRODUCT_NAME = dump_syms;
+ STRIP_STYLE = "non-global";
WARNING_CFLAGS = "-Wall";
ZERO_LINK = NO;
};
diff --git a/src/tools/mac/dump_syms/dump_syms_tool.mm b/src/tools/mac/dump_syms/dump_syms_tool.mm
new file mode 100644
index 00000000..827cea41
--- /dev/null
+++ b/src/tools/mac/dump_syms/dump_syms_tool.mm
@@ -0,0 +1,142 @@
+// Copyright (c) 2006, 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.
+
+// dump_syms_tool.m: Command line tool that uses the DumpSymbols class.
+// TODO(waylonis): accept stdin
+
+#include <unistd.h>
+#include <mach-o/arch.h>
+
+#include "dump_syms.h"
+#include "common/mac/macho_utilities.h"
+
+typedef struct {
+ NSString *srcPath;
+ NSString *arch;
+ NSString *uuidStr;
+ BOOL result;
+} Options;
+
+//=============================================================================
+static void Start(Options *options) {
+ DumpSymbols *dump = [[DumpSymbols alloc]
+ initWithContentsOfFile:options->srcPath];
+
+ if (!dump) {
+ fprintf(stderr, "%s is not a valid Mach-o file\n",
+ [options->srcPath fileSystemRepresentation]);
+ options->result = NO;
+ return;
+ }
+
+ if (![dump setArchitecture:options->arch]) {
+ fprintf(stderr, "Architecture: %s not available in %s\n",
+ [options->arch UTF8String],
+ [options->srcPath fileSystemRepresentation]);
+ options->result = NO;
+ return;
+ }
+
+ options->result = [dump writeSymbolFile:@"-"];
+}
+
+//=============================================================================
+static void Usage(int argc, const char *argv[]) {
+ fprintf(stderr, "Output a Breakpad symbol file from a Mach-o file.\n");
+ fprintf(stderr, "Usage: %s [-a ppc|i386|x86] <Mach-o file>\n",
+ argv[0]);
+ fprintf(stderr, "\t-a: Architecture type [default: native]\n");
+ fprintf(stderr, "\t-h: Usage\n");
+ fprintf(stderr, "\t-?: Usage\n");
+}
+
+//=============================================================================
+static void SetupOptions(int argc, const char *argv[], Options *options) {
+ extern int optind;
+ const NXArchInfo *localArchInfo = NXGetLocalArchInfo();
+ signed char ch;
+
+ if (localArchInfo) {
+ if (localArchInfo->cputype & CPU_ARCH_ABI64)
+ options->arch = (localArchInfo->cputype == CPU_TYPE_POWERPC64) ? @"ppc64":
+ @"x86_64";
+ else
+ options->arch = (localArchInfo->cputype == CPU_TYPE_POWERPC) ? @"ppc" :
+ @"x86";
+ }
+
+ while ((ch = getopt(argc, (char * const *)argv, "a:h?")) != -1) {
+ switch (ch) {
+ case 'a':
+ if (strcmp("ppc", optarg) == 0)
+ options->arch = @"ppc";
+ else if (strcmp("x86", optarg) == 0 || strcmp("i386", optarg) == 0)
+ options->arch = @"x86";
+ else if (strcmp("ppc64", optarg) == 0)
+ options->arch = @"ppc64";
+ else if (strcmp("x86_64", optarg) == 0)
+ options->arch = @"x86_64";
+ else {
+ fprintf(stderr, "%s: Invalid architecture: %s\n", argv[0], optarg);
+ Usage(argc, argv);
+ exit(1);
+ }
+ break;
+ case '?':
+ case 'h':
+ Usage(argc, argv);
+ exit(0);
+ break;
+ }
+ }
+
+ if ((argc - optind) != 1) {
+ fprintf(stderr, "Must specify Mach-o file\n");
+ Usage(argc, argv);
+ exit(1);
+ }
+
+ options->srcPath = [[NSFileManager defaultManager]
+ stringWithFileSystemRepresentation:argv[optind]
+ length:strlen(argv[optind])];
+}
+
+//=============================================================================
+int main (int argc, const char * argv[]) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ Options options;
+
+ bzero(&options, sizeof(Options));
+ SetupOptions(argc, argv, &options);
+ Start(&options);
+
+ [pool release];
+
+ return !options.result;
+}