From 04011e8429033ae0623ea629527d2d13de3f8109 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 3 Apr 2013 03:13:19 +0000 Subject: [PATCH] Fix the fde encoding used by mips to match gas. This finally fixes the encoding. The patch also * Removes eh-frame.ll. It was an unnecessary .ll to .o test that was checking the wrong value. * Merge fde-reloc.s and eh-frame.s into a single test, since the only difference was the run lines. * Don't blindly test the content of the entire .eh_frame section. It makes it hard to anyone actually fixing a bug and hitting a difference in a binary blob. Instead, use a CHECK for each field and document what is being checked. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178615 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCObjectFileInfo.cpp | 11 +- test/MC/Mips/eh-frame.ll | 52 ---------- test/MC/Mips/eh-frame.s | 193 +++++++++++++++++++++++++++++------- test/MC/Mips/fde-reloc.s | 21 ---- 4 files changed, 164 insertions(+), 113 deletions(-) delete mode 100644 test/MC/Mips/eh-frame.ll delete mode 100644 test/MC/Mips/fde-reloc.s diff --git a/lib/MC/MCObjectFileInfo.cpp b/lib/MC/MCObjectFileInfo.cpp index 0d32ad40e80..d19e79ac64f 100644 --- a/lib/MC/MCObjectFileInfo.cpp +++ b/lib/MC/MCObjectFileInfo.cpp @@ -223,10 +223,13 @@ void MCObjectFileInfo::InitMachOMCObjectFileInfo(Triple T) { } void MCObjectFileInfo::InitELFMCObjectFileInfo(Triple T) { - if (T.getArch() != Triple::mips && - T.getArch() != Triple::mipsel && - T.getArch() != Triple::mips64 && - T.getArch() != Triple::mips64el ) + if (T.getArch() == Triple::mips || + T.getArch() == Triple::mipsel) + FDECFIEncoding = dwarf::DW_EH_PE_sdata4; + else if (T.getArch() == Triple::mips64 || + T.getArch() == Triple::mips64el) + FDECFIEncoding = dwarf::DW_EH_PE_sdata8; + else FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; if (T.getArch() == Triple::x86) { diff --git a/test/MC/Mips/eh-frame.ll b/test/MC/Mips/eh-frame.ll deleted file mode 100644 index 91c8b43d02c..00000000000 --- a/test/MC/Mips/eh-frame.ll +++ /dev/null @@ -1,52 +0,0 @@ -; This tests .eh_frame CIE descriptor for the. -; Data alignment factor - -; RUN: llc -filetype=obj -mcpu=mips64r2 -mattr=n64 -march=mips64el %s -o - \ -; RUN: | llvm-objdump -s - | FileCheck %s - -; N64 -; CHECK: Contents of section .eh_frame: -; CHECK-NEXT: 0000 1c000000 00000000 017a504c 52000178 .........zPLR..x -; CHECK-NEXT: 0010 1f0b0000 00000000 00000000 000c1d00 ................ -; CHECK-NEXT: 0020 2c000000 24000000 00000000 00000000 ,...$........... -; CHECK-NEXT: 0030 7c000000 00000000 08000000 00000000 |............... -; CHECK-NEXT: 0040 00440e10 489f019c 02000000 00000000 .D..H........... - -; ModuleID = 'simple_throw.cpp' - -@_ZTIi = external constant i8* -@str = private unnamed_addr constant [7 x i8] c"All ok\00" - -define i32 @main() { -entry: - %exception.i = tail call i8* @__cxa_allocate_exception(i64 4) nounwind - %0 = bitcast i8* %exception.i to i32* - store i32 5, i32* %0, align 4 - invoke void @__cxa_throw(i8* %exception.i, i8* bitcast (i8** @_ZTIi to i8*), i8* null) noreturn - to label %.noexc unwind label %return - -.noexc: ; preds = %entry - unreachable - -return: ; preds = %entry - %1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) - catch i8* null - %2 = extractvalue { i8*, i32 } %1, 0 - %3 = tail call i8* @__cxa_begin_catch(i8* %2) nounwind - %puts = tail call i32 @puts(i8* getelementptr inbounds ([7 x i8]* @str, i64 0, i64 0)) - tail call void @__cxa_end_catch() - ret i32 0 -} - -declare i32 @__gxx_personality_v0(...) - -declare i8* @__cxa_begin_catch(i8*) - -declare void @__cxa_end_catch() - -declare i8* @__cxa_allocate_exception(i64) - -declare void @__cxa_throw(i8*, i8*, i8*) - -declare i32 @puts(i8* nocapture) nounwind - diff --git a/test/MC/Mips/eh-frame.s b/test/MC/Mips/eh-frame.s index 56278b8b99b..67df21365d3 100644 --- a/test/MC/Mips/eh-frame.s +++ b/test/MC/Mips/eh-frame.s @@ -1,46 +1,167 @@ -// Assembler generated object test. -// This tests .eh_frame descriptors minimally. +// Test the bits of .eh_frame on mips that are already implemented correctly. -// What we really need is a prettyprinter output check not unlike what -// gnu's readobj generates instead of checking the bits for .eh_frame. +// FIXME: This test would be a lot cleaner if llvm-objdump had the +// --dwarf=frames option. -// RUN: llvm-mc -filetype=obj -mcpu=mips32r2 -triple mipsel-unknown-linux -arch=mipsel %s -o - \ -// RUN: | llvm-objdump -s - | FileCheck -check-prefix=CHECK-LEO32 %s +// RUN: llvm-mc -filetype=obj %s -o %t.o -arch=mips +// RUN: llvm-objdump -r -s %t.o | FileCheck --check-prefix=MIPS32 %s -// RUN: llvm-mc -filetype=obj -mcpu=mips32r2 -triple mips-unknown-linux -arch=mips %s -o - \ -// RUN: | llvm-objdump -s - | FileCheck -check-prefix=CHECK-BEO32 %s +// RUN: llvm-mc -filetype=obj %s -o %t.o -arch=mipsel +// RUN: llvm-objdump -r -s %t.o | FileCheck --check-prefix=MIPS32EL %s -// RUN: llvm-mc -filetype=obj -mcpu=mips64r2 -mattr=n64 -arch=mips64el %s -o - \ -// RUN: | llvm-objdump -s - | FileCheck -check-prefix=CHECK-LE64 %s +// RUN: llvm-mc -filetype=obj %s -o %t.o -arch=mips64 +// RUN: llvm-objdump -r -s %t.o | FileCheck --check-prefix=MIPS64 %s -// RUN: llvm-mc -filetype=obj -mcpu=mips64r2 -mattr=n64 -arch=mips64 %s -o - \ -// RUN: | llvm-objdump -s - | FileCheck -check-prefix=CHECK-BE64 %s - -// O32 little endian -// CHECK-LEO32: Contents of section .eh_frame: -// CHECK-LEO32-NEXT: 0000 10000000 00000000 017a5200 017c1f01 .........zR..|.. -// CHECK-LEO32-NEXT: 0010 000c1d00 10000000 18000000 00000000 ................ -// CHECK-LEO32-NEXT: 0020 00000000 00000000 ........ - -// O32 big endian -// CHECK-BEO32: Contents of section .eh_frame: -// CHECK-BEO32-NEXT 0000 00000010 00000000 017a5200 017c1f01 .........zR..|.. -// CHECK-BEO32-NEXT 0010 000c1d00 00000010 00000018 00000000 ................ -// CHECK-BEO32-NEXT 0020 00000000 00000000 ........ - -// N64 little endian -// CHECK-LE64: Contents of section .eh_frame: -// CHECK-LE64-NEXT: 0000 10000000 00000000 017a5200 01781f01 .........zR..x.. -// CHECK-LE64-NEXT: 0010 000c1d00 18000000 18000000 00000000 ................ -// CHECK-LE64-NEXT: 0020 00000000 00000000 00000000 00000000 ................ - -// N64 big endian -// CHECK-BE64: Contents of section .eh_frame: -// CHECK-BE64-NEXT: 0000 00000010 00000000 017a5200 01781f01 .........zR..x.. -// CHECK-BE64-NEXT: 0010 000c1d00 00000018 00000018 00000000 ................ -// CHECK-BE64-NEXT: 0020 00000000 00000000 00000000 00000000 ................ +// RUN: llvm-mc -filetype=obj %s -o %t.o -arch=mips64el +// RUN: llvm-objdump -r -s %t.o | FileCheck --check-prefix=MIPS64EL %s func: .cfi_startproc .cfi_endproc +// MIPS32: RELOCATION RECORDS FOR [.eh_frame]: +// MIPS32-NEXT: R_MIPS_32 +// MIPS32: Contents of section .eh_frame: +// MIPS32-NEXT: 0000 + +// Length +// MIPS32: 00000010 + +// CIE ID +// MIPS32: 00000000 + +// Version +// MIPS32: 01 + +// Augmentation String +// MIPS32: 7a5200 + +// Code Alignment Factor +// MIPS32: 01 + +// Data Alignment Factor (-4) +// MIPS32: 7c + +// Return Address Register +// MIPS32: 1f + +// Augmentation Size +// MIPS32: 01 + +// MIPS32: .........zR..|.. +// MIPS32-NEXT: 0010 + +// Augmentation (fde pointer encoding: DW_EH_PE_sdata4) +// MIPS32: 0b +// FIXME: The instructions are different from the ones produces by gas. + +// MIPS32EL: RELOCATION RECORDS FOR [.eh_frame]: +// MIPS32EL-NEXT: R_MIPS_32 +// MIPS32EL: Contents of section .eh_frame: +// MIPS32EL-NEXT: 0000 + +// Length +// MIPS32EL: 10000000 + +// CIE ID +// MIPS32EL: 00000000 + +// Version +// MIPS32EL: 01 + +// Augmentation String +// MIPS32EL: 7a5200 + +// Code Alignment Factor +// MIPS32EL: 01 + +// Data Alignment Factor (-4) +// MIPS32EL: 7c + +// Return Address Register +// MIPS32EL: 1f + +// Augmentation Size +// MIPS32EL: 01 + +// MIPS32EL: .........zR..|.. +// MIPS32EL-NEXT: 0010 + +// Augmentation (fde pointer encoding: DW_EH_PE_sdata4) +// MIPS32EL: 0b +// FIXME: The instructions are different from the ones produces by gas. + +// MIPS64: RELOCATION RECORDS FOR [.eh_frame]: +// MIPS64-NEXT: R_MIPS_64 +// MIPS64: Contents of section .eh_frame: +// MIPS64-NEXT: 0000 + +// Length +// MIPS64: 00000010 + +// CIE ID +// MIPS64: 00000000 + +// Version +// MIPS64: 01 + +// Augmentation String +// MIPS64: 7a5200 + +// Code Alignment Factor +// MIPS64: 01 + +// Data Alignment Factor (-8). GAS uses -4. Should be ok as long as all +// offsets we need are a multiple of 8. +// MIPS64: 78 + +// Return Address Register +// MIPS64: 1f + +// Augmentation Size +// MIPS64: 01 + +// MIPS64: .........zR..x.. +// MIPS64-NEXT: 0010 + +// Augmentation (fde pointer encoding: DW_EH_PE_sdata8) +// MIPS64: 0c +// FIXME: The instructions are different from the ones produces by gas. + + +// MIPS64EL: RELOCATION RECORDS FOR [.eh_frame]: +// FIXME: llvm-objdump currently misprints the relocations for mips64el +// MIPS64EL: Contents of section .eh_frame: +// MIPS64EL-NEXT: 0000 + +// Length +// MIPS64EL: 10000000 + +// CIE ID +// MIPS64EL: 00000000 + +// Version +// MIPS64EL: 01 + +// Augmentation String +// MIPS64EL: 7a5200 + +// Code Alignment Factor +// MIPS64EL: 01 + +// Data Alignment Factor (-8). GAS uses -4. Should be ok as long as all +// offsets we need are a multiple of 8. +// MIPS64EL: 78 + +// Return Address Register +// MIPS64EL: 1f + +// Augmentation Size +// MIPS64EL: 01 + +// MIPS64EL: .........zR..x.. +// MIPS64EL-NEXT: 0010 + +// Augmentation (fde pointer encoding: DW_EH_PE_sdata8) +// MIPS64EL: 0c +// FIXME: The instructions are different from the ones produces by gas. diff --git a/test/MC/Mips/fde-reloc.s b/test/MC/Mips/fde-reloc.s deleted file mode 100644 index 2db5d0b638f..00000000000 --- a/test/MC/Mips/fde-reloc.s +++ /dev/null @@ -1,21 +0,0 @@ -// This just tests that a relocation of the specified type shows up as the first -// relocation in the relocation section for .eh_frame when produced by the -// assembler. - -// RUN: llvm-mc -filetype=obj %s -o - -triple mips-unknown-unknown | \ -// RUN: llvm-objdump -r - | FileCheck --check-prefix=MIPS32 %s - -// RUN: llvm-mc -filetype=obj %s -o - -triple mips64-unknown-unknown | \ -// RUN: llvm-objdump -r - | FileCheck --check-prefix=MIPS64 %s - -// PR15448 - -func: - .cfi_startproc - .cfi_endproc - -// MIPS32: RELOCATION RECORDS FOR [.eh_frame]: -// MIPS32-NEXT: R_MIPS_32 - -// MIPS64: RELOCATION RECORDS FOR [.eh_frame]: -// MIPS64-NEXT: R_MIPS_64