This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]