dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dotgnu-pnet-commits] libjit ChangeLog configure.in jit/jit-walk.c to...


From: Aleksey Demakov
Subject: [dotgnu-pnet-commits] libjit ChangeLog configure.in jit/jit-walk.c to...
Date: Sun, 24 Sep 2006 20:36:52 +0000

CVSROOT:        /sources/dotgnu-pnet
Module name:    libjit
Changes by:     Aleksey Demakov <avd>   06/09/24 20:36:52

Modified files:
        .              : ChangeLog configure.in 
        jit            : jit-walk.c 
        tools          : gen-apply.c 
        include/jit    : Makefile.am jit-walk.h 

Log message:
        resolve stack-walking problem with gcc 4.1 and introduce jit-arch-*.h
        headers that may contain architecture dependent code.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/libjit/ChangeLog?cvsroot=dotgnu-pnet&r1=1.270&r2=1.271
http://cvs.savannah.gnu.org/viewcvs/libjit/configure.in?cvsroot=dotgnu-pnet&r1=1.24&r2=1.25
http://cvs.savannah.gnu.org/viewcvs/libjit/jit/jit-walk.c?cvsroot=dotgnu-pnet&r1=1.1.1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/libjit/tools/gen-apply.c?cvsroot=dotgnu-pnet&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/libjit/include/jit/Makefile.am?cvsroot=dotgnu-pnet&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/libjit/include/jit/jit-walk.h?cvsroot=dotgnu-pnet&r1=1.1.1.1&r2=1.2

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/ChangeLog,v
retrieving revision 1.270
retrieving revision 1.271
diff -u -b -r1.270 -r1.271
--- ChangeLog   15 Sep 2006 16:17:20 -0000      1.270
+++ ChangeLog   24 Sep 2006 20:36:51 -0000      1.271
@@ -1,3 +1,21 @@
+2006-09-25  Aleksey Demakov  <address@hidden>
+
+       * include/jit/jit-arch-x86.h, include/jit/jit-arch-generic.h: add
+       headers for architecture-specific definitions.
+       (_JIT_ARCH_GET_CURRENT_FRAME): add macro to find the stack frame
+       pointer.
+
+       * include/jit/Makefile.am: create jit-arch.h as a symlink to one of
+       the jit-arch-*.h files depending on the JIT_ARCH value.
+       * configure.in: set JIT_ARCH according to the system architecture.
+
+       * include/jit/jit-walk.h (jit_get_current_frame):
+       * jit/jit-walk.c (jit_get_starting_frame):
+       * tools/gen-apply.c (find_return_offset, detect_frame_offsets): use
+       _JIT_ARCH_GET_CURRENT_FRAME macro if available. This resolves the
+       problem with gcc 4.1.* where __builtin_frame_address() function is
+       broken (thanks Klaus for identifing the problem).
+
 2006-09-15  Radek Polak <address@hidden>
 
         * include/jit/jit-insn.h, jit/jit-insn.c, jit/jit-debugger.c: new

Index: configure.in
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/configure.in,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- configure.in        14 Sep 2006 15:13:57 -0000      1.24
+++ configure.in        24 Sep 2006 20:36:51 -0000      1.25
@@ -12,6 +12,19 @@
 AC_SUBST(LIBJIT_VERSION)
 LIBJIT_VERSION=0:0:0
 
+dnl Determine the architecture.
+AC_MSG_CHECKING([architecture])
+AC_SUBST(JIT_ARCH)
+case "$host" in
+       i[[3456789]]86-*-*)
+               JIT_ARCH=x86
+               ;;
+       *)
+               JIT_ARCH=generic
+               ;;
+esac
+AC_MSG_RESULT($JIT_ARCH)
+
 dnl Turn off the cygwin library if building for Win32.
 dnl Note: We have to include <stdlib.h> if we will be using "__int64"
 dnl because otherwise the mingw32 compiler won't define it correctly.

Index: jit/jit-walk.c
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/jit/jit-walk.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -b -r1.1.1.1 -r1.2
--- jit/jit-walk.c      30 Apr 2004 23:30:34 -0000      1.1.1.1
+++ jit/jit-walk.c      24 Sep 2006 20:36:51 -0000      1.2
@@ -72,8 +72,21 @@
  * Fetch the starting frame address if the caller did not supply it
  * (probably because the caller wasn't compiled with gcc).  The address
  * that we want is actually one frame out from where we are at the moment.
+ *
+ * Note: some gcc vestions have broken __builtin_frame_address() so use
+ * _JIT_ARCH_GET_CURRENT_FRAME() if available. 
  */
 #if defined(__GNUC__)
+#if defined(_JIT_ARCH_GET_CURRENT_FRAME)
+#define        jit_get_starting_frame()        \
+       do { \
+               _JIT_ARCH_GET_CURRENT_FRAME(start); \
+               if(start) \
+               { \
+                       start = jit_next_frame_pointer(start); \
+               } \
+       } while (0)
+#else
 #define        jit_get_starting_frame()        \
        do { \
                start = __builtin_frame_address(0); \
@@ -82,6 +95,7 @@
                        start = jit_next_frame_pointer(start); \
                } \
        } while (0)
+#endif
 #elif defined(_MSC_VER) && defined(_M_IX86)
 #define        jit_get_starting_frame()        \
        __asm \

Index: tools/gen-apply.c
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/tools/gen-apply.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- tools/gen-apply.c   13 Dec 2005 16:43:52 -0000      1.14
+++ tools/gen-apply.c   24 Sep 2006 20:36:52 -0000      1.15
@@ -18,6 +18,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#include <jit/jit-arch.h>
 #include <jit/jit-defs.h>
 #define        JIT_MEMCPY              "mem_copy"
 #include "jit-apply-func.h"
@@ -1329,7 +1330,13 @@
 }
 void find_frame_offset_outer(void *looking_for)
 {
-       find_frame_offset_inner(looking_for, (void 
**)__builtin_frame_address(0));
+       void *frame_address;
+#if defined(_JIT_ARCH_GET_CURRENT_FRAME)
+       _JIT_ARCH_GET_CURRENT_FRAME(frame_address);
+#else
+       frame_address = __builtin_frame_address(0);
+#endif
+       find_frame_offset_inner(looking_for, (void **)frame_address);
 }
 void find_return_offset(void *looking_for, void **frame)
 {
@@ -1357,8 +1364,13 @@
 }
 void detect_frame_offsets(void)
 {
-       void *frame_address = __builtin_frame_address(0);
-       void *return_address = __builtin_return_address(0);
+       void *frame_address, *return_address;
+#if defined(_JIT_ARCH_GET_CURRENT_FRAME)
+       _JIT_ARCH_GET_CURRENT_FRAME(frame_address);
+#else
+       frame_address = __builtin_frame_address(0);
+#endif
+       return_address = __builtin_return_address(0);
        find_frame_offset_outer(frame_address);
        find_return_offset(return_address, frame_address);
        if(parent_frame_offset == 0 && return_address_offset == 0)

Index: include/jit/Makefile.am
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/include/jit/Makefile.am,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- include/jit/Makefile.am     6 Oct 2004 05:43:15 -0000       1.4
+++ include/jit/Makefile.am     24 Sep 2006 20:36:52 -0000      1.5
@@ -1,6 +1,8 @@
+ARCH_HEADER = address@hidden@.h
 
 libjitincludedir = $(includedir)/jit
 libjitinclude_HEADERS = jit.h \
+                                               jit-arch.h \
                                                jit-apply.h \
                                                jit-block.h \
                                                jit-common.h \
@@ -25,4 +27,10 @@
                                                jit-value.h \
                                                jit-walk.h
 
-DISTCLEANFILES = jit-defs.h
+noinst_HEADERS = jit-arch-generic.h jit-arch-x86.h
+
+DISTCLEANFILES = jit-arch.h jit-defs.h
+
+jit-arch.h: $(ARCH_HEADER)
+       rm -f $@
+       $(LN_S) $(srcdir)/$(ARCH_HEADER) $@

Index: include/jit/jit-walk.h
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/include/jit/jit-walk.h,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -b -r1.1.1.1 -r1.2
--- include/jit/jit-walk.h      30 Apr 2004 23:29:54 -0000      1.1.1.1
+++ include/jit/jit-walk.h      24 Sep 2006 20:36:52 -0000      1.2
@@ -21,6 +21,8 @@
 #ifndef        _JIT_WALK_H
 #define        _JIT_WALK_H
 
+#include <jit/jit-arch.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -32,7 +34,7 @@
 void *_jit_get_frame_address(void *start, unsigned int n);
 #if defined(__GNUC__)
 #define        jit_get_frame_address(n)        \
-               (_jit_get_frame_address(__builtin_frame_address(0), (n)))
+       (_jit_get_frame_address(jit_get_current_frame(), (n)))
 #else
 #define        jit_get_frame_address(n)        (_jit_get_frame_address(0, (n)))
 #endif
@@ -40,9 +42,21 @@
 /*
  * Get the frame address for the current frame.  May be more efficient
  * than using "jit_get_frame_address(0)".
+ *
+ * Note: some gcc vestions have broken __builtin_frame_address() so use
+ * _JIT_ARCH_GET_CURRENT_FRAME() if available. 
  */
 #if defined(__GNUC__)
+#if defined(_JIT_ARCH_GET_CURRENT_FRAME)
+#define        jit_get_current_frame()                         \
+       ({                                              \
+               void *address;                          \
+               _JIT_ARCH_GET_CURRENT_FRAME(address);   \
+               address;                                \
+       })
+#else
 #define        jit_get_current_frame()         (__builtin_frame_address(0))
+#endif
 #else
 #define        jit_get_current_frame()         (jit_get_frame_address(0))
 #endif




reply via email to

[Prev in Thread] Current Thread [Next in Thread]