From ad5fa8c5b26a325dc2a9521b87188755046c17f3 Mon Sep 17 00:00:00 2001 From: David Srbecky Date: Wed, 6 May 2015 18:27:35 +0100 Subject: Support generation of CFI in .debug_frame format. .debug_frame section is almost identical to .eh_frame section. There are only minor differences in the CIE and FDE headers. The main difference is that .eh_frame is intended to be used at runtime for exception handling and is therefore allocated within the running program whereas .debug_frame is not. This makes .debug_frame easier to remove using standard tools. "objcopy --strip-debug" removes .debug_frame, but not .eh_frame. (although objcopy can be still be forced to remove .eh_frame) Similarly, we might want to separate the CFI to separate debug file or include it as compressed .gnu_debugdata section. It is more appropriate to use .debug_frame for this purpose. Bug:20556771 Change-Id: I9d91a333b9fb37523fd6fafccfad89b21d2477af --- compiler/dwarf/dwarf_test.cc | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) (limited to 'compiler/dwarf/dwarf_test.cc') diff --git a/compiler/dwarf/dwarf_test.cc b/compiler/dwarf/dwarf_test.cc index edba00aeaa..4971f0ef10 100644 --- a/compiler/dwarf/dwarf_test.cc +++ b/compiler/dwarf/dwarf_test.cc @@ -26,6 +26,8 @@ namespace art { namespace dwarf { +constexpr CFIFormat kCFIFormat = DW_DEBUG_FRAME_FORMAT; + // Run the tests only on host since we need objdump. #ifndef HAVE_ANDROID_OS @@ -120,30 +122,30 @@ TEST_F(DwarfTest, DebugFrame) { DW_CHECK_NEXT("DW_CFA_restore: r5 (ebp)"); DebugFrameOpCodeWriter<> initial_opcodes; - WriteEhFrameCIE(is64bit, DW_EH_PE_absptr, Reg(is64bit ? 16 : 8), - initial_opcodes, &eh_frame_data_); - std::vector eh_frame_patches; + WriteDebugFrameCIE(is64bit, DW_EH_PE_absptr, Reg(is64bit ? 16 : 8), + initial_opcodes, kCFIFormat, &debug_frame_data_); + std::vector debug_frame_patches; std::vector expected_patches { 28 }; // NOLINT - WriteEhFrameFDE(is64bit, 0, 0x01000000, 0x01000000, opcodes.data(), - &eh_frame_data_, &eh_frame_patches); + WriteDebugFrameFDE(is64bit, 0, 0x01000000, 0x01000000, opcodes.data(), + kCFIFormat, &debug_frame_data_, &debug_frame_patches); - EXPECT_EQ(expected_patches, eh_frame_patches); + EXPECT_EQ(expected_patches, debug_frame_patches); CheckObjdumpOutput(is64bit, "-W"); } TEST_F(DwarfTest, DebugFrame64) { constexpr bool is64bit = true; DebugFrameOpCodeWriter<> initial_opcodes; - WriteEhFrameCIE(is64bit, DW_EH_PE_absptr, Reg(16), - initial_opcodes, &eh_frame_data_); + WriteDebugFrameCIE(is64bit, DW_EH_PE_absptr, Reg(16), + initial_opcodes, kCFIFormat, &debug_frame_data_); DebugFrameOpCodeWriter<> opcodes; - std::vector eh_frame_patches; + std::vector debug_frame_patches; std::vector expected_patches { 32 }; // NOLINT - WriteEhFrameFDE(is64bit, 0, 0x0100000000000000, 0x0200000000000000, - opcodes.data(), &eh_frame_data_, &eh_frame_patches); + WriteDebugFrameFDE(is64bit, 0, 0x0100000000000000, 0x0200000000000000, + opcodes.data(), kCFIFormat, &debug_frame_data_, &debug_frame_patches); DW_CHECK("FDE cie=00000000 pc=100000000000000..300000000000000"); - EXPECT_EQ(expected_patches, eh_frame_patches); + EXPECT_EQ(expected_patches, debug_frame_patches); CheckObjdumpOutput(is64bit, "-W"); } @@ -173,11 +175,11 @@ TEST_F(DwarfTest, x86_64_RegisterMapping) { DW_CHECK_NEXT("DW_CFA_offset: r14 (r14)"); DW_CHECK_NEXT("DW_CFA_offset: r15 (r15)"); DebugFrameOpCodeWriter<> initial_opcodes; - WriteEhFrameCIE(is64bit, DW_EH_PE_absptr, Reg(16), - initial_opcodes, &eh_frame_data_); - std::vector eh_frame_patches; - WriteEhFrameFDE(is64bit, 0, 0x0100000000000000, 0x0200000000000000, - opcodes.data(), &eh_frame_data_, &eh_frame_patches); + WriteDebugFrameCIE(is64bit, DW_EH_PE_absptr, Reg(16), + initial_opcodes, kCFIFormat, &debug_frame_data_); + std::vector debug_frame_patches; + WriteDebugFrameFDE(is64bit, 0, 0x0100000000000000, 0x0200000000000000, + opcodes.data(), kCFIFormat, &debug_frame_data_, &debug_frame_patches); CheckObjdumpOutput(is64bit, "-W"); } -- cgit v1.2.3-59-g8ed1b