diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-05-16 22:09:22 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-05-16 22:09:22 +0000 |
commit | 1da888ec71546d0aa101f154847eac8baadfa6f9 (patch) | |
tree | 0263f96916c31cb329b80472caf4f2a3a0ffa797 /libffi | |
parent | 9e46e77e7dafd4a35f9f6139693f80e26515258c (diff) | |
download | gcc-1da888ec71546d0aa101f154847eac8baadfa6f9.tar.gz |
* configure.in (HAVE_RO_EH_FRAME): Check whether .eh_frame section
should be read-only.
* configure: Rebuilt.
* fficonfig.h.in: Rebuilt.
* include/ffi.h.in (EH_FRAME_FLAGS): Define.
* src/alpha/osf.S: Use EH_FRAME_FLAGS.
* src/powerpc/linux64.S: Likewise.
* src/powerpc/linux64_closure.S: Likewise. Include ffi.h.
* src/powerpc/sysv.S: Use EH_FRAME_FLAGS. Use pcrel encoding
if -fpic/-fPIC/-mrelocatable.
* src/powerpc/powerpc_closure.S: Likewise.
* src/sparc/v8.S: If HAVE_RO_EH_FRAME is defined, don't include
#write in .eh_frame flags.
* src/sparc/v9.S: Likewise.
* src/x86/unix64.S: Use EH_FRAME_FLAGS.
* src/x86/sysv.S: Likewise. Use pcrel encoding if -fpic/-fPIC.
* src/s390/sysv.S: Use EH_FRAME_FLAGS. Include ffi.h.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@66887 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libffi')
-rw-r--r-- | libffi/ChangeLog | 20 | ||||
-rwxr-xr-x | libffi/configure | 28 | ||||
-rw-r--r-- | libffi/configure.in | 19 | ||||
-rw-r--r-- | libffi/fficonfig.h.in | 2 | ||||
-rw-r--r-- | libffi/include/ffi.h.in | 10 | ||||
-rw-r--r-- | libffi/src/alpha/osf.S | 2 | ||||
-rw-r--r-- | libffi/src/powerpc/linux64.S | 2 | ||||
-rw-r--r-- | libffi/src/powerpc/linux64_closure.S | 5 | ||||
-rw-r--r-- | libffi/src/powerpc/ppc_closure.S | 35 | ||||
-rw-r--r-- | libffi/src/powerpc/sysv.S | 47 | ||||
-rw-r--r-- | libffi/src/s390/sysv.S | 7 | ||||
-rw-r--r-- | libffi/src/sparc/v8.S | 4 | ||||
-rw-r--r-- | libffi/src/sparc/v9.S | 4 | ||||
-rw-r--r-- | libffi/src/x86/sysv.S | 74 | ||||
-rw-r--r-- | libffi/src/x86/unix64.S | 2 |
15 files changed, 198 insertions, 63 deletions
diff --git a/libffi/ChangeLog b/libffi/ChangeLog index b609f1d6212..5da773a5667 100644 --- a/libffi/ChangeLog +++ b/libffi/ChangeLog @@ -1,3 +1,23 @@ +2003-05-16 Jakub Jelinek <jakub@redhat.com> + + * configure.in (HAVE_RO_EH_FRAME): Check whether .eh_frame section + should be read-only. + * configure: Rebuilt. + * fficonfig.h.in: Rebuilt. + * include/ffi.h.in (EH_FRAME_FLAGS): Define. + * src/alpha/osf.S: Use EH_FRAME_FLAGS. + * src/powerpc/linux64.S: Likewise. + * src/powerpc/linux64_closure.S: Likewise. Include ffi.h. + * src/powerpc/sysv.S: Use EH_FRAME_FLAGS. Use pcrel encoding + if -fpic/-fPIC/-mrelocatable. + * src/powerpc/powerpc_closure.S: Likewise. + * src/sparc/v8.S: If HAVE_RO_EH_FRAME is defined, don't include + #write in .eh_frame flags. + * src/sparc/v9.S: Likewise. + * src/x86/unix64.S: Use EH_FRAME_FLAGS. + * src/x86/sysv.S: Likewise. Use pcrel encoding if -fpic/-fPIC. + * src/s390/sysv.S: Use EH_FRAME_FLAGS. Include ffi.h. + 2003-05-07 Jeff Sturm <jsturm@one-point.com> Fixes PR bootstrap/10656 diff --git a/libffi/configure b/libffi/configure index 5cbef7ab2fa..9c2550d0ada 100755 --- a/libffi/configure +++ b/libffi/configure @@ -3638,6 +3638,34 @@ EOF fi fi +echo $ac_n "checking whether .eh_frame section should be read-only""... $ac_c" 1>&6 +echo "configure:3495: checking whether .eh_frame section should be read-only" >&5 +if eval "test \"`echo '$''{'libffi_cv_ro_eh_frame'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + libffi_cv_ro_eh_frame=no + echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c + if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then + if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then + libffi_cv_ro_eh_frame=yes + elif grep '.section.*eh_frame.*#alloc' conftest.c \ + | grep -v '#write' > /dev/null; then + libffi_cv_ro_eh_frame=yes + fi + fi + rm -f conftest.* + +fi + +echo "$ac_t""$libffi_cv_ro_eh_frame" 1>&6 +if test "x$libffi_cv_ro_eh_frame" = xyes; then + cat >> confdefs.h <<\EOF +#define HAVE_RO_EH_FRAME 1 +EOF + +fi + diff --git a/libffi/configure.in b/libffi/configure.in index e71f67344ea..0048439acff 100644 --- a/libffi/configure.in +++ b/libffi/configure.in @@ -149,6 +149,25 @@ if test x$TARGET = xSPARC; then fi fi +AC_CACHE_CHECK([whether .eh_frame section should be read-only], + libffi_cv_ro_eh_frame, [ + libffi_cv_ro_eh_frame=no + echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c + if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then + if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then + libffi_cv_ro_eh_frame=yes + elif grep '.section.*eh_frame.*#alloc' conftest.c \ + | grep -v '#write' > /dev/null; then + libffi_cv_ro_eh_frame=yes + fi + fi + rm -f conftest.* + ]) +if test "x$libffi_cv_ro_eh_frame" = xyes; then + AC_DEFINE(HAVE_RO_EH_FRAME, 1, + [Define if .eh_frame sections should be read-only.]) +fi + AC_SUBST(TARGET) AC_SUBST(TARGETDIR) diff --git a/libffi/fficonfig.h.in b/libffi/fficonfig.h.in index 2b6f5817dd3..636110cd40a 100644 --- a/libffi/fficonfig.h.in +++ b/libffi/fficonfig.h.in @@ -77,3 +77,5 @@ /* Define if your assembler supports .register. */ #undef HAVE_AS_REGISTER_PSEUDO_OP +/* Define if .eh_frame sections should be read-only. */ +#undef HAVE_RO_EH_FRAME diff --git a/libffi/include/ffi.h.in b/libffi/include/ffi.h.in index c51a809ea3f..b37307c8f92 100644 --- a/libffi/include/ffi.h.in +++ b/libffi/include/ffi.h.in @@ -183,7 +183,15 @@ extern "C" { #endif #endif -#ifndef LIBFFI_ASM +#ifdef LIBFFI_ASM + +#ifdef HAVE_RO_EH_FRAME +#define EH_FRAME_FLAGS "a" +#else +#define EH_FRAME_FLAGS "aw" +#endif + +#else /* ---- Generic type definitions ----------------------------------------- */ diff --git a/libffi/src/alpha/osf.S b/libffi/src/alpha/osf.S index 75beab8996c..1f6b4059c64 100644 --- a/libffi/src/alpha/osf.S +++ b/libffi/src/alpha/osf.S @@ -292,7 +292,7 @@ $load_table: #endif #ifdef __ELF__ - .section .eh_frame,"aw",@progbits + .section .eh_frame,EH_FRAME_FLAGS,@progbits __FRAME_BEGIN__: .4byte $LECIE1-$LSCIE1 # Length of Common Information Entry $LSCIE1: diff --git a/libffi/src/powerpc/linux64.S b/libffi/src/powerpc/linux64.S index 9619c539223..28727cd01f8 100644 --- a/libffi/src/powerpc/linux64.S +++ b/libffi/src/powerpc/linux64.S @@ -141,7 +141,7 @@ ffi_call_LINUX64: .byte 0,12,0,1,128,4,0,0 .size .ffi_call_LINUX64,.-.ffi_call_LINUX64 - .section .eh_frame,"aw",@progbits + .section .eh_frame,EH_FRAME_FLAGS,@progbits .Lframe1: .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry .LSCIE1: diff --git a/libffi/src/powerpc/linux64_closure.S b/libffi/src/powerpc/linux64_closure.S index d435e584fd5..1159c1e77a8 100644 --- a/libffi/src/powerpc/linux64_closure.S +++ b/libffi/src/powerpc/linux64_closure.S @@ -1,3 +1,6 @@ +#define LIBFFI_ASM +#include <ffi.h> + .file "linux64_closure.S" #ifdef __powerpc64__ @@ -174,7 +177,7 @@ ffi_closure_LINUX64: .byte 0,12,0,1,128,0,0,0 .size .ffi_closure_LINUX64,.-.ffi_closure_LINUX64 - .section .eh_frame,"aw",@progbits + .section .eh_frame,EH_FRAME_FLAGS,@progbits .Lframe1: .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry .LSCIE1: diff --git a/libffi/src/powerpc/ppc_closure.S b/libffi/src/powerpc/ppc_closure.S index 4cfc8fda5ad..391f318d199 100644 --- a/libffi/src/powerpc/ppc_closure.S +++ b/libffi/src/powerpc/ppc_closure.S @@ -197,36 +197,51 @@ ENTRY(ffi_closure_SYSV) blr END(ffi_closure_SYSV) - .section ".eh_frame","aw" -__FRAME_BEGIN__: + .section ".eh_frame",EH_FRAME_FLAGS,@progbits +.Lframe1: .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry .LSCIE1: .4byte 0x0 # CIE Identifier Tag .byte 0x1 # CIE Version +#if defined _RELOCATABLE || defined __PIC__ + .ascii "zR\0" # CIE Augmentation +#else .ascii "\0" # CIE Augmentation - .byte 0x1 # uleb128 0x1; CIE Code Alignment Factor - .byte 0x7c # sleb128 -4; CIE Data Alignment Factor +#endif + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -4 # CIE Data Alignment Factor .byte 0x41 # CIE RA Column +#if defined _RELOCATABLE || defined __PIC__ + .uleb128 0x1 # Augmentation size + .byte 0x1b # FDE Encoding (pcrel sdata4) +#endif .byte 0xc # DW_CFA_def_cfa - .byte 0x1 # uleb128 0x1 - .byte 0x0 # uleb128 0x0 + .uleb128 0x1 + .uleb128 0x0 .align 2 .LECIE1: .LSFDE1: .4byte .LEFDE1-.LASFDE1 # FDE Length .LASFDE1: - .4byte .LASFDE1-__FRAME_BEGIN__ # FDE CIE offset + .4byte .LASFDE1-.Lframe1 # FDE CIE offset +#if defined _RELOCATABLE || defined __PIC__ + .4byte .LFB1-. # FDE initial location +#else .4byte .LFB1 # FDE initial location +#endif .4byte .LFE1-.LFB1 # FDE address range +#if defined _RELOCATABLE || defined __PIC__ + .uleb128 0x0 # Augmentation size +#endif .byte 0x4 # DW_CFA_advance_loc4 .4byte .LCFI0-.LFB1 .byte 0xe # DW_CFA_def_cfa_offset - .byte 144,1 # uleb128 144 + .uleb128 144 .byte 0x4 # DW_CFA_advance_loc4 .4byte .LCFI1-.LCFI0 .byte 0x2f # DW_CFA_GNU_negative_offset_extended - .byte 0x41 # uleb128 0x41 - .byte 0x1 # uleb128 0x1 + .uleb128 0x41 + .uleb128 0x1 .align 2 .LEFDE1: diff --git a/libffi/src/powerpc/sysv.S b/libffi/src/powerpc/sysv.S index c1e0d18461c..c045c779dfc 100644 --- a/libffi/src/powerpc/sysv.S +++ b/libffi/src/powerpc/sysv.S @@ -128,48 +128,63 @@ L(float_return_value): .LFE1: END(ffi_call_SYSV) - .section ".eh_frame","aw" -__FRAME_BEGIN__: + .section ".eh_frame",EH_FRAME_FLAGS,@progbits +.Lframe1: .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ .LSCIE1: .4byte 0x0 /* CIE Identifier Tag */ .byte 0x1 /* CIE Version */ - .ascii "\0" /* CIE Augmentation */ - .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ - .byte 0x7c /* sleb128 -4; CIE Data Alignment Factor */ +#if defined _RELOCATABLE || defined __PIC__ + .ascii "zR\0" /* CIE Augmentation */ +#else + .ascii "\0" /* CIE Augmentation */ +#endif + .uleb128 0x1 /* CIE Code Alignment Factor */ + .sleb128 -4 /* CIE Data Alignment Factor */ .byte 0x41 /* CIE RA Column */ +#if defined _RELOCATABLE || defined __PIC__ + .uleb128 0x1 /* Augmentation size */ + .byte 0x1b /* FDE Encoding (pcrel sdata4) */ +#endif .byte 0xc /* DW_CFA_def_cfa */ - .byte 0x1 /* uleb128 0x1 */ - .byte 0x0 /* uleb128 0x0 */ + .uleb128 0x1 + .uleb128 0x0 .align 2 .LECIE1: .LSFDE1: .4byte .LEFDE1-.LASFDE1 /* FDE Length */ .LASFDE1: - .4byte .LASFDE1-__FRAME_BEGIN__ /* FDE CIE offset */ + .4byte .LASFDE1-.Lframe1 /* FDE CIE offset */ +#if defined _RELOCATABLE || defined __PIC__ + .4byte .LFB1-. /* FDE initial location */ +#else .4byte .LFB1 /* FDE initial location */ +#endif .4byte .LFE1-.LFB1 /* FDE address range */ +#if defined _RELOCATABLE || defined __PIC__ + .uleb128 0x0 /* Augmentation size */ +#endif .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI0-.LFB1 .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0x08 /* uleb128 0x08 */ + .uleb128 0x08 .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI5-.LCFI0 .byte 0x2f /* DW_CFA_GNU_negative_offset_extended */ - .byte 0x41 /* uleb128 0x41 */ - .byte 0x1 /* uleb128 0x1 */ + .uleb128 0x41 + .uleb128 0x1 .byte 0x9f /* DW_CFA_offset, column 0x1f */ - .byte 0x1 /* uleb128 0x1 */ + .uleb128 0x1 .byte 0x9e /* DW_CFA_offset, column 0x1e */ - .byte 0x2 /* uleb128 0x2 */ + .uleb128 0x2 .byte 0x9d /* DW_CFA_offset, column 0x1d */ - .byte 0x3 /* uleb128 0x3 */ + .uleb128 0x3 .byte 0x9c /* DW_CFA_offset, column 0x1c */ - .byte 0x4 /* uleb128 0x4 */ + .uleb128 0x4 .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI6-.LCFI5 .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0x1c /* uleb128 0x1c */ + .uleb128 0x1c .align 2 .LEFDE1: #endif diff --git a/libffi/src/s390/sysv.S b/libffi/src/s390/sysv.S index fc1482a8d72..ac14fa751af 100644 --- a/libffi/src/s390/sysv.S +++ b/libffi/src/s390/sysv.S @@ -23,6 +23,9 @@ OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ +#define LIBFFI_ASM +#include <ffi.h> + #ifndef __s390x__ .text @@ -146,7 +149,7 @@ ffi_closure_SYSV: .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV - .section .eh_frame,"a",@progbits + .section .eh_frame,EH_FRAME_FLAGS,@progbits .Lframe1: .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry .LSCIE1: @@ -345,7 +348,7 @@ ffi_closure_SYSV: - .section .eh_frame,"a",@progbits + .section .eh_frame,EH_FRAME_FLAGS,@progbits .Lframe1: .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry .LSCIE1: diff --git a/libffi/src/sparc/v8.S b/libffi/src/sparc/v8.S index 53374de3855..e9db51b0456 100644 --- a/libffi/src/sparc/v8.S +++ b/libffi/src/sparc/v8.S @@ -172,7 +172,11 @@ done1: #define uanword uaword #endif +#ifdef HAVE_RO_EH_FRAME + .section ".eh_frame",#alloc +#else .section ".eh_frame",#alloc,#write +#endif .LLframe1: .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry .LLSCIE1: diff --git a/libffi/src/sparc/v9.S b/libffi/src/sparc/v9.S index 8dc9c90f661..e2eeb439eed 100644 --- a/libffi/src/sparc/v9.S +++ b/libffi/src/sparc/v9.S @@ -207,7 +207,11 @@ longdouble1: .ffi_closure_v9_end: .size ffi_closure_v9,.ffi_closure_v9_end-ffi_closure_v9 +#ifdef HAVE_RO_EH_FRAME + .section ".eh_frame",#alloc +#else .section ".eh_frame",#alloc,#write +#endif .LLframe1: .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry .LLSCIE1: diff --git a/libffi/src/x86/sysv.S b/libffi/src/x86/sysv.S index ad898ad1a97..b4bcbba180d 100644 --- a/libffi/src/x86/sysv.S +++ b/libffi/src/x86/sysv.S @@ -129,41 +129,55 @@ epilogue: .ffi_call_SYSV_end: .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV -.section .eh_frame,"aw",@progbits -__FRAME_BEGIN__: - .4byte .LLCIE1 + .section .eh_frame,EH_FRAME_FLAGS,@progbits +.Lframe1: + .long .LECIE1-.LSCIE1 # Length of Common Information Entry .LSCIE1: - .4byte 0x0 - .byte 0x1 - .byte 0x0 - .byte 0x1 - .byte 0x7c - .byte 0x8 - .byte 0xc - .byte 0x4 - .byte 0x4 - .byte 0x88 - .byte 0x1 + .long 0x0 # CIE Identifier Tag + .byte 0x1 # CIE Version +#ifdef __PIC__ + .ascii "zR\0" # CIE Augmentation +#else + .ascii "\0" # CIE Augmentation +#endif + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -4 # CIE Data Alignment Factor + .byte 0x8 # CIE RA Column +#ifdef __PIC__ + .uleb128 0x1 # Augmentation size + .byte 0x1b # FDE Encoding (pcrel sdata4) +#endif + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x4 + .uleb128 0x4 + .byte 0x88 # DW_CFA_offset, column 0x8 + .uleb128 0x1 .align 4 .LECIE1: - .set .LLCIE1,.LECIE1-.LSCIE1 - .4byte .LLFDE1 .LSFDE1: - .4byte .LSFDE1-__FRAME_BEGIN__ - .4byte .LFB1 - .4byte .LFE1-.LFB1 - .byte 0x4 - .4byte .LCFI0-.LFB1 - .byte 0xe - .byte 0x8 - .byte 0x85 - .byte 0x2 - .byte 0x4 - .4byte .LCFI1-.LCFI0 - .byte 0xd - .byte 0x5 + .long .LEFDE1-.LASFDE1 # FDE Length +.LASFDE1: + .long .LASFDE1-.Lframe1 # FDE CIE offset +#ifdef __PIC__ + .long .LFB1-. # FDE initial location +#else + .long .LFB1 # FDE initial location +#endif + .long .LFE1-.LFB1 # FDE address range +#ifdef __PIC__ + .uleb128 0x0 # Augmentation size +#endif + .byte 0x4 # DW_CFA_advance_loc4 + .long .LCFI0-.LFB1 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0x8 + .byte 0x85 # DW_CFA_offset, column 0x5 + .uleb128 0x2 + .byte 0x4 # DW_CFA_advance_loc4 + .long .LCFI1-.LCFI0 + .byte 0xd # DW_CFA_def_cfa_register + .uleb128 0x5 .align 4 .LEFDE1: - .set .LLFDE1,.LEFDE1-.LSFDE1 #endif /* ifndef __x86_64__ */ diff --git a/libffi/src/x86/unix64.S b/libffi/src/x86/unix64.S index f0cd3c9c0c9..e39d60415b6 100644 --- a/libffi/src/x86/unix64.S +++ b/libffi/src/x86/unix64.S @@ -237,7 +237,7 @@ ffi_closure_UNIX64: ret .LFE2: - .section .eh_frame,"a",@progbits + .section .eh_frame,EH_FRAME_FLAGS,@progbits .Lframe0: .long .LECIE1-.LSCIE1 .LSCIE1: |