This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH/RFC] Enable java on sh64-linux
- From: Kaz Kojima <kkojima at rr dot iij4u dot or dot jp>
- To: gcc-patches at gcc dot gnu dot org
- Cc: java-patches at gcc dot gnu dot org, joern dot rennecke at superh dot com, aoliva at redhat dot com
- Date: Mon, 27 Sep 2004 22:29:49 +0900 (JST)
- Subject: [PATCH/RFC] Enable java on sh64-linux
Hi,
The appended patch is to enable java on sh64-*-linux-gnu target.
It only affects sh*-linux* targets anyway, and essentially affects
sh64-linux only. With this patch plus the Joern's
http://gcc.gnu.org/ml/gcc-patches/2004-08/msg00132.html
http://gcc.gnu.org/ml/gcc-patches/2004-08/msg00156.html
and mine
http://gcc.gnu.org/ml/gcc-patches/2004-09/msg00467.html
I've got the following results on libjava testsuite for mainline:
FAIL: ArrayStore execution - gij test
FAIL: ArrayStore execution - gij test
FAIL: Array_3 execution - source compiled test
FAIL: Array_3 execution - gij test
FAIL: Array_3 execution - bytecode->native test
FAIL: Array_3 -O3 execution - source compiled test
FAIL: Array_3 execution - gij test
FAIL: Array_3 -O3 execution - bytecode->native test
FAIL: Divide_1 execution - gij test
FAIL: Divide_1 execution - gij test
FAIL: FileHandleGcTest execution - gij test
FAIL: FileHandleGcTest execution - gij test
FAIL: LargeFile execution - source compiled test
FAIL: LargeFile execution - gij test
FAIL: LargeFile execution - bytecode->native test
FAIL: LargeFile -O3 execution - source compiled test
FAIL: LargeFile execution - gij test
FAIL: LargeFile -O3 execution - bytecode->native test
FAIL: PR3096 -O3 execution - source compiled test
FAIL: Process_2 output - source compiled test
FAIL: Process_2 output - gij test
FAIL: Process_2 output - bytecode->native test
FAIL: Process_2 -O3 output - source compiled test
FAIL: Process_2 output - gij test
FAIL: Process_2 -O3 output - bytecode->native test
FAIL: Serialization execution - gij test
FAIL: Serialization execution - gij test
FAIL: String_overflow output - gij test
FAIL: String_overflow output - gij test
FAIL: Thread_Interrupt execution - gij test
FAIL: Thread_Interrupt execution - gij test
FAIL: Thread_Join execution - gij test
FAIL: Thread_Join execution - gij test
FAIL: Thread_Wait_2 -O3 execution - source compiled test
FAIL: Thread_Wait_2 -O3 execution - bytecode->native test
FAIL: Thread_Wait_Interrupt execution - gij test
FAIL: Thread_Wait_Interrupt -O3 execution - source compiled test
FAIL: Thread_Wait_Interrupt execution - gij test
FAIL: Thread_Wait_Interrupt -O3 execution - bytecode->native test
FAIL: negzero execution - gij test
FAIL: negzero execution - gij test
FAIL: pr6388 output - gij test
FAIL: pr6388 output - gij test
FAIL: pr83 -O3 output - source compiled test
FAIL: pr83 -O3 output - bytecode->native test
=== libjava Summary ===
# of expected passes 3368
# of unexpected failures 45
# of expected failures 14
# of untested testcases 49
which looks not so good, though some of the above failures are due to
non-gcc problems. It seems LargeFile fails because the test was done
on NFS. My pthread library for sh64 has a few problems at the moment
and it might cause the failures on tests using threads.
I'm unsure that such patch is ok at Stage3 from the viewpoint stated
in http://gcc.gnu.org/ml/gcc/2004-08/msg01418.html. Could RM and Java
maintainers please comment on it?
Regards,
kaz
--
2004-09-27 Kaz Kojima <kkojima@gcc.gnu.org>
[toplevel]
* configure.in: Remove ${libgcj} from noconfigdirs for sh*-*-linux*.
* configure: Regenerate.
[gcc]
* config/sh/linux-unwind.h (SH_DWARF_FRAME_XD0): Remove for SH5.
(SH_DWARF_FRAME_PR, SH_DWARF_FRAME_GBR, SH_DWARF_FRAME_MACL)
(SH_DWARF_FRAME_MACH, SH_DWARF_FRAME_PC, SH_DWARF_FRAME_FPUL):
Likewise.
(SH_DWARF_FRAME_FP0, SH_DWARF_FRAME_FPSCR): Define to the correct
dwarf register number for SHmedia.
(shmedia_fallback_frame_state): New.
(MD_FALLBACK_FRAME_STATE_FOR): Define to it for SH5.
[libjava]
* configure.ac (SIGNAL_HANDLER): Set to include/dwarf2-signal.h
for all sh*-*-linux* targets.
* configure: Regenerate.
* configure.host: Add sh64-* and sh5*-*. Set can_unwind_signal
for all sh*-linux* targets.
* sysdep/sh64/locks.h: New file.
[libffi]
* src/sh64/ffi.c (simple_type): Remove.
(return_type): Handle small structures correctly.
(ffi_prep_args): Likewise.
(ffi_closure_helper_SYSV): Likewise.
* src/sh64/sysv.S (ffi_call_SYSV): Handle 1, 2 and 4-byte return.
Emit position independent code if PIC and remove wrong datalabel
prefixes from EH data.
diff -u3prN ORIG/gcc/configure.in LOCAL/gcc/configure.in
--- ORIG/gcc/configure.in Tue Sep 21 07:30:59 2004
+++ LOCAL/gcc/configure.in Tue Sep 21 12:56:08 2004
@@ -439,8 +439,8 @@ case "${target}" in
am33_2.0-*-linux*)
noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
;;
- sh-*-linux*)
- noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+ sh*-*-linux*)
+ noconfigdirs="$noconfigdirs target-newlib target-libgloss"
;;
sh*-*-pe|mips*-*-pe|*arm-wince-pe)
noconfigdirs="$noconfigdirs ${libgcj}"
diff -u3prN ORIG/gcc/gcc/config/sh/linux-unwind.h LOCAL/gcc/gcc/config/sh/linux-unwind.h
--- ORIG/gcc/gcc/config/sh/linux-unwind.h Wed Sep 8 09:17:18 2004
+++ LOCAL/gcc/gcc/config/sh/linux-unwind.h Sat Sep 25 09:24:41 2004
@@ -27,18 +27,11 @@ Boston, MA 02111-1307, USA. */
# if defined (__SH5__)
#define SH_DWARF_FRAME_GP0 0
-#define SH_DWARF_FRAME_FP0 (__SH5__ == 32 ? 245 : 77)
-#define SH_DWARF_FRAME_XD0 289
+#define SH_DWARF_FRAME_FP0 77
#define SH_DWARF_FRAME_BT0 68
-#define SH_DWARF_FRAME_PR 241
#define SH_DWARF_FRAME_PR_MEDIA 18
-#define SH_DWARF_FRAME_GBR 238
-#define SH_DWARF_FRAME_MACH 239
-#define SH_DWARF_FRAME_MACL 240
-#define SH_DWARF_FRAME_PC 64
#define SH_DWARF_FRAME_SR 65
-#define SH_DWARF_FRAME_FPUL 244
-#define SH_DWARF_FRAME_FPSCR 243
+#define SH_DWARF_FRAME_FPSCR 76
#else
#define SH_DWARF_FRAME_GP0 0
#define SH_DWARF_FRAME_FP0 25
@@ -54,7 +47,92 @@ Boston, MA 02111-1307, USA. */
#endif /* defined (__SH5__) */
#if defined (__SH5__)
-/* MD_FALLBACK_FRAME_STATE_FOR is not yet defined for SHMEDIA. */
+
+#define MD_FALLBACK_FRAME_STATE_FOR shmedia_fallback_frame_state
+
+static _Unwind_Reason_Code
+shmedia_fallback_frame_state (struct _Unwind_Context *context,
+ _Unwind_FrameState *fs)
+{
+ unsigned char *pc = context->ra;
+ struct sigcontext *sc;
+ long new_cfa;
+ int i, r;
+
+ /* movi 0x10,r9; shori 0x77,r9; trapa r9; nop (sigreturn) */
+ /* movi 0x10,r9; shori 0xad,r9; trapa r9; nop (rt_sigreturn) */
+ if ((*(unsigned long *) (pc-1) == 0xcc004090)
+ && (*(unsigned long *) (pc+3) == 0xc801dc90)
+ && (*(unsigned long *) (pc+7) == 0x6c91fff0)
+ && (*(unsigned long *) (pc+11) == 0x6ff0fff0))
+ sc = context->cfa;
+ else if ((*(unsigned long *) (pc-1) == 0xcc004090)
+ && (*(unsigned long *) (pc+3) == 0xc802b490)
+ && (*(unsigned long *) (pc+7) == 0x6c91fff0)
+ && (*(unsigned long *) (pc+11) == 0x6ff0fff0))
+ {
+ struct rt_sigframe {
+ struct siginfo *pinfo;
+ void *puc;
+ struct siginfo info;
+ struct ucontext uc;
+ } *rt_ = context->cfa;
+ sc = (struct sigcontext *) &rt_->uc.uc_mcontext;
+ }
+ else
+ return _URC_END_OF_STACK;
+
+ new_cfa = sc->sc_regs[15];
+ fs->cfa_how = CFA_REG_OFFSET;
+ fs->cfa_reg = 15;
+ fs->cfa_offset = new_cfa - (long) context->cfa;
+
+ for (i = 0; i < 63; i++)
+ {
+ if (i == 15)
+ continue;
+
+ fs->regs.reg[i].how = REG_SAVED_OFFSET;
+ fs->regs.reg[i].loc.offset
+ = (long)&(sc->sc_regs[i]) - new_cfa;
+ }
+
+ fs->regs.reg[SH_DWARF_FRAME_SR].how = REG_SAVED_OFFSET;
+ fs->regs.reg[SH_DWARF_FRAME_SR].loc.offset
+ = (long)&(sc->sc_sr) - new_cfa;
+
+ r = SH_DWARF_FRAME_BT0;
+ for (i = 0; i < 8; i++)
+ {
+ fs->regs.reg[r+i].how = REG_SAVED_OFFSET;
+ fs->regs.reg[r+i].loc.offset
+ = (long)&(sc->sc_tregs[i]) - new_cfa;
+ }
+
+ r = SH_DWARF_FRAME_FP0;
+ for (i = 0; i < 32; i++)
+ {
+ fs->regs.reg[r+i].how = REG_SAVED_OFFSET;
+ fs->regs.reg[r+i].loc.offset
+ = (long)&(sc->sc_fpregs[i]) - new_cfa;
+ }
+
+ fs->regs.reg[SH_DWARF_FRAME_FPSCR].how = REG_SAVED_OFFSET;
+ fs->regs.reg[SH_DWARF_FRAME_FPSCR].loc.offset
+ = (long)&(sc->sc_fpscr) - new_cfa;
+
+ /* The unwinder expects the PC to point to the following insn,
+ whereas the kernel returns the address of the actual
+ faulting insn. */
+ sc->sc_pc += 4;
+ /* We use the slot for the zero register to save the return address. */
+ fs->regs.reg[63].how = REG_SAVED_OFFSET;
+ fs->regs.reg[63].loc.offset
+ = (long)&(sc->sc_pc) - new_cfa;
+ fs->retaddr_column = 63;
+ return _URC_NO_REASON;
+}
+
#else /* defined (__SH5__) */
#define MD_FALLBACK_FRAME_STATE_FOR sh_fallback_frame_state
diff -u3prN ORIG/gcc/libjava/configure.ac LOCAL/gcc/libjava/configure.ac
--- ORIG/gcc/libjava/configure.ac Thu Sep 9 09:16:31 2004
+++ LOCAL/gcc/libjava/configure.ac Fri Sep 24 14:15:27 2004
@@ -1308,7 +1308,7 @@ case "${host}" in
sparc*-*-linux*)
SIGNAL_HANDLER=include/dwarf2-signal.h
;;
- sh-*-linux* | sh[[34]]*-*-linux*)
+ sh*-*-linux*)
SIGNAL_HANDLER=include/dwarf2-signal.h
;;
*mingw*)
diff -u3prN ORIG/gcc/libjava/configure.host LOCAL/gcc/libjava/configure.host
--- ORIG/gcc/libjava/configure.host Thu Sep 9 09:16:31 2004
+++ LOCAL/gcc/libjava/configure.host Sun Sep 26 17:04:38 2004
@@ -156,6 +156,12 @@ case "${host}" in
libgcj_interpreter=yes
enable_hash_synchronization_default=yes
;;
+ sh64-* | sh5*-*)
+ sysdeps_dir=sh64
+ libgcj_flags="${libgcj_flags} -mieee"
+ libgcj_interpreter=yes
+ enable_hash_synchronization_default=yes
+ ;;
esac
# This case statement supports generic port properties and may refine
@@ -171,7 +177,7 @@ case "${host}" in
ia64-* | \
x86_64*-linux* | \
hppa*-linux* | \
- sh-linux* | sh[34]*-linux*)
+ sh*-linux*)
can_unwind_signal=yes
if test x$slow_pthread_self = xyes \
&& test x$cross_compiling != xyes; then
diff -u3prN ORIG/gcc/libjava/sysdep/sh64/locks.h LOCAL/gcc/libjava/sysdep/sh64/locks.h
--- ORIG/gcc/libjava/sysdep/sh64/locks.h Thu Jan 1 09:00:00 1970
+++ LOCAL/gcc/libjava/sysdep/sh64/locks.h Sat Sep 25 11:27:39 2004
@@ -0,0 +1,72 @@
+// locks.h - Thread synchronization primitives. SuperH SHmedia implementation.
+
+/* Copyright (C) 2004 Free Software Foundation
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#ifndef __SYSDEP_LOCKS_H__
+#define __SYSDEP_LOCKS_H__
+
+typedef size_t obj_addr_t; /* Integer type big enough for object */
+ /* address. */
+
+static long long __cas_lock = 0;
+
+inline static void
+__cas_start_atomic (void)
+{
+ long long val;
+
+ do
+ __asm__ __volatile__ ("swap.q %1,r63,%0"
+ : "=&r" (val)
+ : "r" (&__cas_lock), "0" (1LL)
+ : "memory");
+ while (val == 1);
+}
+
+inline static void
+__cas_end_atomic (void)
+{
+ __asm__ __volatile__ (" " : : : "memory");
+ __cas_lock = 0;
+}
+
+inline static bool
+compare_and_swap (volatile obj_addr_t *addr, obj_addr_t old,
+ obj_addr_t new_val)
+{
+ bool ret;
+
+ __cas_start_atomic ();
+ if (*addr != old)
+ ret = false;
+ else
+ {
+ *addr = new_val;
+ ret = true;
+ }
+ __cas_end_atomic ();
+
+ return ret;
+}
+
+inline static void
+release_set (volatile obj_addr_t *addr, obj_addr_t new_val)
+{
+ __asm__ __volatile__ (" " : : : "memory");
+ *(addr) = new_val;
+}
+
+inline static bool
+compare_and_swap_release (volatile obj_addr_t *addr, obj_addr_t old,
+ obj_addr_t new_val)
+{
+ return compare_and_swap (addr, old, new_val);
+}
+
+#endif /* ! __SYSDEP_LOCKS_H__ */
diff -u3prN ORIG/gcc/libffi/src/sh64/ffi.c LOCAL/gcc/libffi/src/sh64/ffi.c
--- ORIG/gcc/libffi/src/sh64/ffi.c Fri Jun 13 10:55:26 2003
+++ LOCAL/gcc/libffi/src/sh64/ffi.c Tue Sep 21 15:46:03 2004
@@ -1,5 +1,5 @@
/* -----------------------------------------------------------------------
- ffi.c - Copyright (c) 2003 Kaz Kojima
+ ffi.c - Copyright (c) 2003, 2004 Kaz Kojima
SuperH SHmedia Foreign Function Interface
@@ -31,48 +31,21 @@
#define NGREGARG 8
#define NFREGARG 12
-/* If the structure has essentialy an unique element, return its type. */
-static int
-simple_type (ffi_type *arg)
-{
- if (arg->type != FFI_TYPE_STRUCT)
- return arg->type;
- else if (arg->elements[1])
- return FFI_TYPE_STRUCT;
-
- return simple_type (arg->elements[0]);
-}
-
static int
return_type (ffi_type *arg)
{
- unsigned short type;
if (arg->type != FFI_TYPE_STRUCT)
return arg->type;
- type = simple_type (arg->elements[0]);
- if (! arg->elements[1])
- {
- switch (type)
- {
- case FFI_TYPE_SINT8:
- case FFI_TYPE_UINT8:
- case FFI_TYPE_SINT16:
- case FFI_TYPE_UINT16:
- case FFI_TYPE_SINT32:
- case FFI_TYPE_UINT32:
- case FFI_TYPE_SINT64:
- case FFI_TYPE_UINT64:
- return FFI_TYPE_UINT64;
-
- default:
- return type;
- }
- }
-
/* gcc uses r2 if the result can be packed in on register. */
- if (arg->size <= sizeof (UINT64))
+ if (arg->size <= sizeof (UINT8))
+ return FFI_TYPE_UINT8;
+ else if (arg->size <= sizeof (UINT16))
+ return FFI_TYPE_UINT16;
+ else if (arg->size <= sizeof (UINT32))
+ return FFI_TYPE_UINT32;
+ else if (arg->size <= sizeof (UINT64))
return FFI_TYPE_UINT64;
return FFI_TYPE_STRUCT;
@@ -105,8 +78,10 @@ void ffi_prep_args(char *stack, extended
for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
{
size_t z;
+ int align;
z = (*p_arg)->size;
+ align = (*p_arg)->alignment;
if (z < sizeof (UINT32))
{
switch ((*p_arg)->type)
@@ -128,7 +103,7 @@ void ffi_prep_args(char *stack, extended
break;
case FFI_TYPE_STRUCT:
- *(UINT64 *) argp = (UINT64) *(UINT32 *)(*p_argv);
+ memcpy (argp, *p_argv, z);
break;
default:
@@ -136,12 +111,12 @@ void ffi_prep_args(char *stack, extended
}
argp += sizeof (UINT64);
}
- else if (z == sizeof (UINT32))
+ else if (z == sizeof (UINT32) && align == sizeof (UINT32))
{
*(UINT64 *) argp = (UINT64) *(UINT32 *) (*p_argv);
argp += sizeof (UINT64);
}
- else if (z == sizeof (UINT64))
+ else if (z == sizeof (UINT64) && align == sizeof (UINT64))
{
*(UINT64 *) argp = *(UINT64 *) (*p_argv);
argp += sizeof (UINT64);
@@ -254,6 +229,7 @@ void ffi_call(/*@dependent@*/ ffi_cif *c
/*@dependent@*/ void **avalue)
{
extended_cif ecif;
+ UINT64 trvalue;
ecif.cif = cif;
ecif.avalue = avalue;
@@ -261,7 +237,10 @@ void ffi_call(/*@dependent@*/ ffi_cif *c
/* If the return value is a struct and we don't have a return */
/* value address then we need to make one */
- if ((rvalue == NULL) &&
+ if (cif->rtype->type == FFI_TYPE_STRUCT
+ && return_type (cif->rtype) != FFI_TYPE_STRUCT)
+ ecif.rvalue = &trvalue;
+ else if ((rvalue == NULL) &&
(cif->rtype->type == FFI_TYPE_STRUCT))
{
/*@-sysunrecog@*/
@@ -283,6 +262,11 @@ void ffi_call(/*@dependent@*/ ffi_cif *c
FFI_ASSERT(0);
break;
}
+
+ if (rvalue
+ && cif->rtype->type == FFI_TYPE_STRUCT
+ && return_type (cif->rtype) != FFI_TYPE_STRUCT)
+ memcpy (rvalue, &trvalue, cif->rtype->size);
}
extern void ffi_closure_SYSV (void);
@@ -353,7 +337,8 @@ ffi_closure_helper_SYSV (ffi_closure *cl
/* Copy the caller's structure return value address so that the closure
returns the data directly to the caller. */
- if (cif->rtype->type == FFI_TYPE_STRUCT)
+ if (cif->rtype->type == FFI_TYPE_STRUCT
+ && cif->rtype->size > sizeof (UINT64))
{
rvalue = *pgr;
greg = 1;
@@ -443,6 +428,6 @@ ffi_closure_helper_SYSV (ffi_closure *cl
(closure->fun) (cif, rvalue, avalue, closure->user_data);
/* Tell ffi_closure_SYSV how to perform return type promotions. */
- return cif->rtype->type;
+ return return_type (cif->rtype);
}
diff -u3prN ORIG/gcc/libffi/src/sh64/sysv.S LOCAL/gcc/libffi/src/sh64/sysv.S
--- ORIG/gcc/libffi/src/sh64/sysv.S Sun Nov 9 14:09:10 2003
+++ LOCAL/gcc/libffi/src/sh64/sysv.S Thu Sep 23 16:43:04 2004
@@ -1,5 +1,5 @@
/* -----------------------------------------------------------------------
- sysv.S - Copyright (c) 2003 Kaz Kojima
+ sysv.S - Copyright (c) 2003, 2004 Kaz Kojima
SuperH SHmedia Foreign Function Interface
@@ -64,8 +64,9 @@ ENTRY(ffi_call_SYSV)
st.q r15, 8, r28
st.l r15, 4, r18
st.l r15, 0, r14
- add.l r15, r63, r14
.LCFI1:
+ add.l r15, r63, r14
+.LCFI2:
# add r4, r63, r28
add r5, r63, r29
add r6, r63, r30
@@ -252,10 +253,17 @@ ENTRY(ffi_call_SYSV)
pt/l .L_epilogue, tr4
beqi/l r29, FFI_TYPE_INT, tr0
+ beqi/l r29, FFI_TYPE_UINT32, tr0
beqi/l r29, FFI_TYPE_SINT64, tr1
beqi/l r29, FFI_TYPE_UINT64, tr1
beqi/l r29, FFI_TYPE_DOUBLE, tr2
beqi/l r29, FFI_TYPE_FLOAT, tr3
+
+ pt/l .L_ret_q, tr0
+ pt/l .L_ret_h, tr1
+
+ beqi/l r29, FFI_TYPE_UINT8, tr0
+ beqi/l r29, FFI_TYPE_UINT16, tr1
blink tr4, r63
.L_ret_d:
@@ -270,6 +278,14 @@ ENTRY(ffi_call_SYSV)
fst.s r31, OFS_FLT, fr0
blink tr4, r63
+.L_ret_q:
+ st.b r31, 0, r2
+ blink tr4, r63
+
+.L_ret_h:
+ st.w r31, 0, r2
+ blink tr4, r63
+
.L_ret_i:
st.l r31, 0, r2
# Fall
@@ -297,12 +313,13 @@ ENTRY(ffi_call_SYSV)
ENTRY(ffi_closure_SYSV)
.LFB2:
addi.l r15, -136, r15
-.LCFI2:
+.LCFI3:
st.l r15, 12, r18
st.l r15, 8, r14
st.l r15, 4, r12
+.LCFI4:
add r15, r63, r14
-.LCFI3:
+.LCFI5:
/* Stack layout:
...
64 bytes (register parameters)
@@ -418,12 +435,18 @@ __FRAME_BEGIN__:
.LSCIE1:
.4byte 0x0 /* CIE Identifier Tag */
.byte 0x1 /* CIE Version */
+#ifdef PIC
.ascii "zR\0" /* CIE Augmentation */
+#else
+ .byte 0x0 /* CIE Augmentation */
+#endif
.uleb128 0x1 /* CIE Code Alignment Factor */
.sleb128 -4 /* CIE Data Alignment Factor */
.byte 0x12 /* CIE RA Column */
+#ifdef PIC
.uleb128 0x1 /* Augmentation size */
- .byte 0x1b /* FDE Encoding (pcrel sdata4) */
+ .byte 0x10 /* FDE Encoding (pcrel) */
+#endif
.byte 0xc /* DW_CFA_def_cfa */
.uleb128 0xf
.uleb128 0x0
@@ -433,8 +456,15 @@ __FRAME_BEGIN__:
.4byte datalabel .LEFDE1-datalabel .LASFDE1 /* FDE Length */
.LASFDE1:
.4byte datalabel .LASFDE1-datalabel __FRAME_BEGIN__
- .4byte datalabel .LFB1-. /* FDE initial location */
+#ifdef PIC
+ .4byte .LFB1-. /* FDE initial location */
+#else
+ .4byte .LFB1 /* FDE initial location */
+#endif
.4byte datalabel .LFE1-datalabel .LFB1 /* FDE address range */
+#ifdef PIC
+ .uleb128 0x0 /* Augmentation size */
+#endif
.byte 0x4 /* DW_CFA_advance_loc4 */
.4byte datalabel .LCFI0-datalabel .LFB1
.byte 0xe /* DW_CFA_def_cfa_offset */
@@ -455,6 +485,8 @@ __FRAME_BEGIN__:
.uleb128 0x4
.byte 0xa0 /* DW_CFA_offset, column 0x20 */
.uleb128 0x2
+ .byte 0x4 /* DW_CFA_advance_loc4 */
+ .4byte datalabel .LCFI2-datalabel .LCFI1
.byte 0xd /* DW_CFA_def_cfa_register */
.uleb128 0xe
.align 2
@@ -464,20 +496,29 @@ __FRAME_BEGIN__:
.4byte datalabel .LEFDE3-datalabel .LASFDE3 /* FDE Length */
.LASFDE3:
.4byte datalabel .LASFDE3-datalabel __FRAME_BEGIN__
- .4byte datalabel .LFB2-. /* FDE initial location */
+#ifdef PIC
+ .4byte .LFB2-. /* FDE initial location */
+#else
+ .4byte .LFB2 /* FDE initial location */
+#endif
.4byte datalabel .LFE2-datalabel .LFB2 /* FDE address range */
+#ifdef PIC
+ .uleb128 0x0 /* Augmentation size */
+#endif
.byte 0x4 /* DW_CFA_advance_loc4 */
- .4byte datalabel .LCFI2-datalabel .LFB2
+ .4byte datalabel .LCFI3-datalabel .LFB2
.byte 0xe /* DW_CFA_def_cfa_offset */
.uleb128 0x88
.byte 0x4 /* DW_CFA_advance_loc4 */
- .4byte datalabel .LCFI3-datalabel .LCFI2
+ .4byte datalabel .LCFI4-datalabel .LCFI3
.byte 0x8c /* DW_CFA_offset, column 0xc */
.uleb128 0x21
.byte 0x8e /* DW_CFA_offset, column 0xe */
.uleb128 0x20
.byte 0x92 /* DW_CFA_offset, column 0x12 */
.uleb128 0x1f
+ .byte 0x4 /* DW_CFA_advance_loc4 */
+ .4byte datalabel .LCFI5-datalabel .LCFI4
.byte 0xd /* DW_CFA_def_cfa_register */
.uleb128 0xe
.align 2