aboutsummaryrefslogtreecommitdiff
path: root/src/tools
diff options
context:
space:
mode:
authorNelson Billing <nbilling@google.com>2019-06-12 14:19:57 -0700
committerNelson Billing <nbilling@google.com>2019-06-12 21:20:27 +0000
commit87bc4022100020b2d01e5e8a97e3766db6a4ce5b (patch)
treeedec3ba67f0c431c88e33a0e899c17feb2d04b91 /src/tools
parentPort new symbol upload API to Windows symupload tool. (diff)
downloadbreakpad-87bc4022100020b2d01e5e8a97e3766db6a4ce5b.tar.xz
Enable PE-only metadata dumping for 64bit (aka. PE32+ format) PEs files.
- Implement in common_windows_lib-- added class "PESourceLineWriter". - Add command-line switch to tell dump_syms to use PESourceLineWriter. Symbol data created this way will contain information to correlate the module with ones found in minidumps, along with frame info that allows much higher quality stack-walking in those minidumps. - Significant refactor of PDBSourceLineWriter-- all code concerned with extracting metadata from PE files has been moved into utility functions. This is to allow sharing of this functionality with newly- added PESourceLineWriter. - Added a unit test to dump_syms for the PE-only scenario. Change-Id: If0855f05d424d32d23f484995be5f34232179a37 Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/1525325 Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/windows/dump_syms/dump_syms.cc35
-rw-r--r--src/tools/windows/dump_syms/dump_syms_unittest.cc67
-rw-r--r--src/tools/windows/dump_syms/testdata/pe_only_symbol_test.dllbin0 -> 51200 bytes
-rw-r--r--src/tools/windows/dump_syms/testdata/pe_only_symbol_test.sym214
4 files changed, 290 insertions, 26 deletions
diff --git a/src/tools/windows/dump_syms/dump_syms.cc b/src/tools/windows/dump_syms/dump_syms.cc
index 8ea777a5..a61434be 100644
--- a/src/tools/windows/dump_syms/dump_syms.cc
+++ b/src/tools/windows/dump_syms/dump_syms.cc
@@ -36,27 +36,38 @@
#include <string>
#include "common/windows/pdb_source_line_writer.h"
+#include "common/windows/pe_source_line_writer.h"
-using std::wstring;
+using std::wstring;;
using google_breakpad::PDBSourceLineWriter;
+using google_breakpad::PESourceLineWriter;
+using std::unique_ptr;
int wmain(int argc, wchar_t **argv) {
- if (argc < 2) {
- fprintf(stderr, "Usage: %ws <file.[pdb|exe|dll]>\n", argv[0]);
+ bool success;
+ if (argc == 2) {
+ PDBSourceLineWriter pdb_writer;
+ if (!pdb_writer.Open(wstring(argv[1]), PDBSourceLineWriter::ANY_FILE)) {
+ fprintf(stderr, "Open failed.\n");
+ return 1;
+ }
+ success = pdb_writer.WriteSymbols(stdout);
+ } else if (argc == 3 && wcscmp(argv[1], L"--pe") == 0) {
+ PESourceLineWriter pe_writer(argv[2]);
+ success = pe_writer.WriteSymbols(stdout);
+ } else {
+ fprintf(stderr, "Usage: %ws [--pe] <file.[pdb|exe|dll]>\n", argv[0]);
+ fprintf(stderr, "Options:\n");
+ fprintf(stderr, "--pe:\tRead debugging information from PE file and do "
+ "not attempt to locate matching PDB file.\n"
+ "\tThis is only supported for PE32+ (64 bit) PE files.\n");
return 1;
}
- PDBSourceLineWriter writer;
- if (!writer.Open(wstring(argv[1]), PDBSourceLineWriter::ANY_FILE)) {
- fprintf(stderr, "Open failed\n");
+ if (!success) {
+ fprintf(stderr, "WriteSymbols failed.\n");
return 1;
}
- if (!writer.WriteMap(stdout)) {
- fprintf(stderr, "WriteMap failed\n");
- return 1;
- }
-
- writer.Close();
return 0;
}
diff --git a/src/tools/windows/dump_syms/dump_syms_unittest.cc b/src/tools/windows/dump_syms/dump_syms_unittest.cc
index 5ed512e6..766e5c09 100644
--- a/src/tools/windows/dump_syms/dump_syms_unittest.cc
+++ b/src/tools/windows/dump_syms/dump_syms_unittest.cc
@@ -55,11 +55,15 @@ const wchar_t* kRootNames[] = {
// without source data.
L"omap_stretched",
// A PDB file with OMAP data for an image that has been basic block reordered.
- L"omap_reorder_bbs",
+ L"omap_reorder_bbs",
// A 64bit PDB file with no OMAP data.
L"dump_syms_regtest64",
};
+const wchar_t* kPEOnlyRootNames[] = {
+ L"pe_only_symbol_test",
+};
+
void TrimLastComponent(const std::wstring& path,
std::wstring* trimmed,
std::wstring* component) {
@@ -177,29 +181,64 @@ class DumpSymsRegressionTest : public testing::TestWithParam<const wchar_t *> {
std::wstring testdata_dir;
};
+class DumpSymsPEOnlyRegressionTest : public testing::TestWithParam<const wchar_t *> {
+public:
+ virtual void SetUp() {
+ std::wstring self_dir;
+ ASSERT_TRUE(GetSelfDirectory(&self_dir));
+ dump_syms_exe = self_dir + L"\\dump_syms.exe";
+
+ TrimLastComponent(self_dir, &testdata_dir, NULL);
+ testdata_dir += L"\\testdata";
+ }
+
+ std::wstring dump_syms_exe;
+ std::wstring testdata_dir;
+};
+
} //namespace
TEST_P(DumpSymsRegressionTest, EnsureDumpedSymbolsMatch) {
- const wchar_t* root_name = GetParam();
- std::wstring root_path = testdata_dir + L"\\" + root_name;
+ const wchar_t* root_name = GetParam();
+ std::wstring root_path = testdata_dir + L"\\" + root_name;
- std::wstring sym_path = root_path + L".sym";
- std::string expected_symbols;
- ASSERT_NO_FATAL_FAILURE(GetFileContents(sym_path, &expected_symbols));
+ std::wstring sym_path = root_path + L".sym";
+ std::string expected_symbols;
+ ASSERT_NO_FATAL_FAILURE(GetFileContents(sym_path, &expected_symbols));
- std::wstring pdb_path = root_path + L".pdb";
- std::wstring command_line = L"\"" + dump_syms_exe + L"\" \"" +
- pdb_path + L"\"";
- std::string symbols;
- ASSERT_NO_FATAL_FAILURE(RunCommand(command_line, &symbols));
+ std::wstring pdb_path = root_path + L".pdb";
+ std::wstring command_line = L"\"" + dump_syms_exe + L"\" \"" +
+ pdb_path + L"\"";
+ std::string symbols;
+ ASSERT_NO_FATAL_FAILURE(RunCommand(command_line, &symbols));
- EXPECT_EQ(expected_symbols, symbols);
+ EXPECT_EQ(expected_symbols, symbols);
}
INSTANTIATE_TEST_CASE_P(DumpSyms, DumpSymsRegressionTest,
- testing::ValuesIn(kRootNames));
+ testing::ValuesIn(kRootNames));
+
+TEST_P(DumpSymsPEOnlyRegressionTest, EnsurePEOnlyDumpedSymbolsMatch) {
+ const wchar_t* root_name = GetParam();
+ std::wstring root_path = testdata_dir + L"\\" + root_name;
+
+ std::wstring sym_path = root_path + L".sym";
+ std::string expected_symbols;
+ ASSERT_NO_FATAL_FAILURE(GetFileContents(sym_path, &expected_symbols));
+
+ std::wstring dll_path = root_path + L".dll";
+ std::wstring command_line = L"\"" + dump_syms_exe + L"\" --pe \"" +
+ dll_path + L"\"";
+ std::string symbols;
+ ASSERT_NO_FATAL_FAILURE(RunCommand(command_line, &symbols));
+
+ EXPECT_EQ(expected_symbols, symbols);
+}
+
+INSTANTIATE_TEST_CASE_P(PEOnlyDumpSyms, DumpSymsPEOnlyRegressionTest,
+ testing::ValuesIn(kPEOnlyRootNames));
} // namespace dump_syms
} // namespace windows
-} // namespace tools
+} // namespace tools
diff --git a/src/tools/windows/dump_syms/testdata/pe_only_symbol_test.dll b/src/tools/windows/dump_syms/testdata/pe_only_symbol_test.dll
new file mode 100644
index 00000000..879af40b
--- /dev/null
+++ b/src/tools/windows/dump_syms/testdata/pe_only_symbol_test.dll
Binary files differ
diff --git a/src/tools/windows/dump_syms/testdata/pe_only_symbol_test.sym b/src/tools/windows/dump_syms/testdata/pe_only_symbol_test.sym
new file mode 100644
index 00000000..24a3ddf4
--- /dev/null
+++ b/src/tools/windows/dump_syms/testdata/pe_only_symbol_test.sym
@@ -0,0 +1,214 @@
+MODULE windows x86_64 2A5EAB481FAB4A17A9761CDC14FE531A1 pe_only_symbol_test.dll
+INFO CODE_ID 5C8AD05F12000 pe_only_symbol_test.dll
+STACK CFI INIT 1440 39 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1440 .cfa: $rsp 32 +
+STACK CFI INIT 1490 7f .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1490 .cfa: $rsp 128 +
+STACK CFI INIT 1520 41 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1520 .cfa: $rsp 48 +
+STACK CFI INIT 1570 35 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1570 .cfa: $rsp 48 +
+STACK CFI INIT 15b0 3a .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 15b0 .cfa: $rsp 48 +
+STACK CFI INIT 1640 8 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1640 .cfa: $rsp 16 +
+STACK CFI INIT 1650 d .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1650 .cfa: $rsp 16 +
+STACK CFI INIT 1660 b .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1660 .cfa: $rsp 16 +
+STACK CFI INIT 1670 5a .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1670 .cfa: $rsp 64 +
+STACK CFI INIT 16e0 97 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 16e0 .cfa: $rsp 112 +
+STACK CFI INIT 17c0 3f .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 17c0 .cfa: $rsp 64 +
+STACK CFI INIT 1810 23 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1810 .cfa: $rsp 64 +
+STACK CFI INIT 1840 16 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1840 .cfa: $rsp 16 +
+STACK CFI INIT 1856 20 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1856 .cfa: $rsp 16 +
+STACK CFI INIT 1876 5 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1876 .cfa: $rsp 16 +
+STACK CFI INIT 1890 1b .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1890 .cfa: $rsp 48 +
+STACK CFI INIT 18ab 56 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 18ab .cfa: $rsp 48 +
+STACK CFI INIT 1901 10 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1901 .cfa: $rsp 48 +
+STACK CFI INIT 1940 7 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1940 .cfa: $rsp 64 +
+STACK CFI INIT 1947 1a .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1947 .cfa: $rsp 64 +
+STACK CFI INIT 1961 b .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1961 .cfa: $rsp 64 +
+STACK CFI INIT 196c 4c .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 196c .cfa: $rsp 64 +
+STACK CFI INIT 19b8 5 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 19b8 .cfa: $rsp 64 +
+STACK CFI INIT 19bd 13 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 19bd .cfa: $rsp 64 +
+STACK CFI INIT 19d0 73 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 19d0 .cfa: $rsp 64 +
+STACK CFI INIT 1a90 3a .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1a90 .cfa: $rsp 48 +
+STACK CFI INIT 1ae0 f8 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1ae0 .cfa: $rsp 96 +
+STACK CFI INIT 1c30 21 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1c30 .cfa: $rsp 8 +
+STACK CFI INIT 1c60 87 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1c60 .cfa: $rsp 64 +
+STACK CFI INIT 1d10 13a .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1d10 .cfa: $rsp 80 +
+STACK CFI INIT 1ea0 88 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1ea0 .cfa: $rsp 64 +
+STACK CFI INIT 1f50 135 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 1f50 .cfa: $rsp 80 +
+STACK CFI INIT 20e0 4d .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 20e0 .cfa: $rsp 64 +
+STACK CFI INIT 2140 2a .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2140 .cfa: $rsp 48 +
+STACK CFI INIT 2180 36 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2180 .cfa: $rsp 48 +
+STACK CFI INIT 2290 36 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2290 .cfa: $rsp 96 +
+STACK CFI INIT 22e0 44 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 22e0 .cfa: $rsp 96 +
+STACK CFI INIT 2340 5f .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2340 .cfa: $rsp 544 +
+STACK CFI INIT 239f d9 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 239f .cfa: $rsp 544 +
+STACK CFI INIT 2478 1d .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2478 .cfa: $rsp 544 +
+STACK CFI INIT 2560 cf .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2560 .cfa: $rsp 1088 +
+STACK CFI INIT 2670 2d .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2670 .cfa: $rsp 80 +
+STACK CFI INIT 269d 6b .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 269d .cfa: $rsp 80 +
+STACK CFI INIT 2708 1a .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2708 .cfa: $rsp 80 +
+STACK CFI INIT 2770 260 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2770 .cfa: $rsp 3824 +
+STACK CFI INIT 2a70 1f .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2a70 .cfa: $rsp 48 +
+STACK CFI INIT 2aa0 c5 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2aa0 .cfa: $rsp 1088 +
+STACK CFI INIT 2ba0 64 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2ba0 .cfa: $rsp 64 +
+STACK CFI INIT 2c20 25 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2c20 .cfa: $rsp 64 +
+STACK CFI INIT 2c50 35 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2c50 .cfa: $rsp 48 +
+STACK CFI INIT 2ca0 d1 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2ca0 .cfa: $rsp 64 +
+STACK CFI INIT 2db0 13 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2db0 .cfa: $rsp 48 +
+STACK CFI INIT 2dd0 9b .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2dd0 .cfa: $rsp 48 +
+STACK CFI INIT 2ea0 10e .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 2ea0 .cfa: $rsp 64 +
+STACK CFI INIT 3000 91 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3000 .cfa: $rsp 128 +
+STACK CFI INIT 30c0 b2 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 30c0 .cfa: $rsp 128 +
+STACK CFI INIT 31a0 be .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 31a0 .cfa: $rsp 80 +
+STACK CFI INIT 3290 74 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3290 .cfa: $rsp 64 +
+STACK CFI INIT 3330 16 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3330 .cfa: $rsp 48 +
+STACK CFI INIT 3350 15 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3350 .cfa: $rsp 48 +
+STACK CFI INIT 3380 45 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3380 .cfa: $rsp 64 +
+STACK CFI INIT 33e0 3b .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 33e0 .cfa: $rsp 48 +
+STACK CFI INIT 3430 40 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3430 .cfa: $rsp 48 +
+STACK CFI INIT 34a0 15 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 34a0 .cfa: $rsp 48 +
+STACK CFI INIT 34c0 c6 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 34c0 .cfa: $rsp 64 +
+STACK CFI INIT 35c0 e .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 35c0 .cfa: $rsp 48 +
+STACK CFI INIT 35e0 8a .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 35e0 .cfa: $rsp 48 +
+STACK CFI INIT 36a0 62 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 36a0 .cfa: $rsp 80 +
+STACK CFI INIT 3720 2d .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3720 .cfa: $rsp 48 +
+STACK CFI INIT 3760 1d .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3760 .cfa: $rsp 48 +
+STACK CFI INIT 3790 30 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3790 .cfa: $rsp 48 +
+STACK CFI INIT 37d0 15 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 37d0 .cfa: $rsp 48 +
+STACK CFI INIT 37f0 5b .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 37f0 .cfa: $rsp 64 +
+STACK CFI INIT 3870 2e .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3870 .cfa: $rsp 48 +
+STACK CFI INIT 38b0 15 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 38b0 .cfa: $rsp 48 +
+STACK CFI INIT 38d0 49 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 38d0 .cfa: $rsp 48 +
+STACK CFI INIT 3930 10c .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3930 .cfa: $rsp 128 +
+STACK CFI INIT 3a80 8b .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3a80 .cfa: $rsp 96 +
+STACK CFI INIT 3b30 2f .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3b30 .cfa: $rsp 48 +
+STACK CFI INIT 3b70 3f .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3b70 .cfa: $rsp 48 +
+STACK CFI INIT 3bc0 82 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3bc0 .cfa: $rsp 80 +
+STACK CFI INIT 3c70 50 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3c70 .cfa: $rsp 64 +
+STACK CFI INIT 3ce0 33 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3ce0 .cfa: $rsp 64 +
+STACK CFI INIT 3d50 191 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3d50 .cfa: $rsp 1536 +
+STACK CFI INIT 3f50 51 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3f50 .cfa: $rsp 176 +
+STACK CFI INIT 3fc0 e .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3fc0 .cfa: $rsp 48 +
+STACK CFI INIT 3ff0 a6 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 3ff0 .cfa: $rsp 64 +
+STACK CFI INIT 40c0 16 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 40c0 .cfa: $rsp 48 +
+STACK CFI INIT 40f0 72 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 40f0 .cfa: $rsp 64 +
+STACK CFI INIT 4180 42 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 4180 .cfa: $rsp 48 +
+STACK CFI INIT 41e0 42 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 41e0 .cfa: $rsp 48 +
+STACK CFI INIT 4250 1e .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 4250 .cfa: $rsp 32 +
+STACK CFI INIT 4280 18 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 4280 .cfa: $rsp 48 +
+STACK CFI INIT 42a0 37 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 42a0 .cfa: $rsp 64 +
+STACK CFI INIT 4300 145 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 4300 .cfa: $rsp 1120 +
+STACK CFI INIT 44a0 2ae .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 44a0 .cfa: $rsp 640 +
+STACK CFI INIT 4800 103 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 4800 .cfa: $rsp 1664 +
+STACK CFI INIT 4950 3c5 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 4950 .cfa: $rsp 240 +
+STACK CFI INIT 4e10 36d .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 4e10 .cfa: $rsp 96 +
+STACK CFI INIT 5270 25 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 5270 .cfa: $rsp 32 +
+STACK CFI INIT 66c0 2 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 66c0 .cfa: $rsp 8 +
+STACK CFI INIT 76d0 1a .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 76d0 .cfa: $rsp 48 +
+STACK CFI INIT 76f0 20 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 76f0 .cfa: $rsp 48 +
+STACK CFI INIT 7720 48 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 7720 .cfa: $rsp 64 +
+STACK CFI INIT 7780 20 .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 7780 .cfa: $rsp 48 +
+STACK CFI INIT 77b0 3d .cfa: $rsp .ra: .cfa 8 - ^
+STACK CFI 77b0 .cfa: $rsp 48 +