diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog
index 83e266a62329edb6e8ca980ae405e0bc406df663..df5c8e123d1c1381461718a48a0e02a5d17a6767 100644
--- a/boehm-gc/ChangeLog
+++ b/boehm-gc/ChangeLog
@@ -1,3 +1,11 @@
+2002-01-25  David Edelsohn  <edelsohn@gnu.org>
+
+	* include/gc.h (GC_INIT): Add DATASTART and DATAEND roots on AIX.
+	* include/private/gcconfig.h (RS6000): Add 64-bit AIX support.
+	Define USE_GENERIC_PUSH_REGS.  Use AIX _data and _end symbols for
+	DATASTART and DATAEND roots.
+	* rs6000_mach_dep.s: Add function descriptor and traceback table.
+
 2001-12-16  Jeff Sturm  <jsturm@one-point.com>
 
 	* dyn_load.c: Define ElfW (if needed) for all targets,
diff --git a/boehm-gc/include/gc.h b/boehm-gc/include/gc.h
index c73ecc0ae7a580f468f7888ee304a44c0a2f9150..7d5bd250b8b41e4e96eb913dc75e897390cd983e 100644
--- a/boehm-gc/include/gc.h
+++ b/boehm-gc/include/gc.h
@@ -888,7 +888,7 @@ extern void GC_thr_init();	/* Needed for Solaris/X86	*/
 #   define GC_INIT() { extern end, etext; \
 		       GC_noop(&end, &etext); }
 #else
-# if defined(__CYGWIN32__) && defined(GC_USE_DLL)
+# if (defined(__CYGWIN32__) && defined(GC_USE_DLL)) || defined (_AIX)
     /*
      * Similarly gnu-win32 DLLs need explicit initialization
      */
diff --git a/boehm-gc/include/private/gcconfig.h b/boehm-gc/include/private/gcconfig.h
index 75405dcd7af73e64826c49fe99acc4b5693a5580..1c92ee31f2fdfb276aa6c5b7100a10ca26beeb7d 100644
--- a/boehm-gc/include/private/gcconfig.h
+++ b/boehm-gc/include/private/gcconfig.h
@@ -1174,10 +1174,19 @@
 
 # ifdef RS6000
 #   define MACH_TYPE "RS6000"
-#   define ALIGNMENT 4
-#   define DATASTART ((ptr_t)0x20000000)
+#   ifdef __64BIT__
+#     define ALIGNMENT 8
+#     define CPP_WORDSZ 64
+#   else
+#     define ALIGNMENT 4
+#     define CPP_WORDSZ 32
+#   endif
+    extern int _data, _end;
+#   define DATASTART ((ptr_t)((ulong)&_data))
+#   define DATAEND ((ptr_t)((ulong)&_end))
     extern int errno;
 #   define STACKBOTTOM ((ptr_t)((ulong)&errno))
+#   define USE_GENERIC_PUSH_REGS
 #   define DYNAMIC_LOADING
 	/* For really old versions of AIX, this may have to be removed. */
 # endif
@@ -1582,7 +1591,7 @@
 
 # if defined(SVR4) || defined(LINUX) || defined(IRIX) || defined(HPUX) \
     || defined(OPENBSD) || defined(NETBSD) || defined(FREEBSD) \
-    || defined(BSD) || defined(AIX) || defined(MACOSX) || defined(OSF1)
+    || defined(BSD) || defined(_AIX) || defined(MACOSX) || defined(OSF1)
 #   define UNIX_LIKE   /* Basic Unix-like system calls work.	*/
 # endif
 
diff --git a/boehm-gc/rs6000_mach_dep.s b/boehm-gc/rs6000_mach_dep.s
index e0dbe808596b1952a0c9ff114b7d70179abe5d53..12bf9a84d51ce8bfbf83cd7153b47a2f7fe537eb 100644
--- a/boehm-gc/rs6000_mach_dep.s
+++ b/boehm-gc/rs6000_mach_dep.s
@@ -1,4 +1,3 @@
-    .csect
     .set   r0,0
     .set   r1,1
     .set   r2,2
@@ -32,10 +31,18 @@
     .set   r30,30
     .set   r31,31
 
+    .extern .GC_push_one
  # Mark from machine registers that are saved by C compiler
     .globl  .GC_push_regs
+.csect .text[PR]
+    .align 2
+    .globl  GC_push_regs
+    .globl  .GC_push_regs
+.csect GC_push_regs[DS]
+GC_push_regs:
+    .long .GC_push_regs, TOC[tc0], 0
+.csect .text[PR]
 .GC_push_regs:
-    .extern .GC_push_one
     stu	    r1,-64(r1)  # reserve stack frame
     mflr    r0		# save link register
     st      r0,0x48(r1)
@@ -103,3 +110,5 @@
     mtlr    r0
     ai      r1,r1,64
     br
+    .long 0
+    .byte 0,0,0,0,0,0,0,0