Drop support for Darwin on PowerPC

The last Mac OS X release for PowerPC Macs is 10.5, and nothing else runs this code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Hiroshi SHIBATAandClaude Opus 5.5 committed 2026-10-08 07:04:09 +09:00
1 parent 6203c21e58
commit 957caeef23
14 files changed
+9 -385
Notes: git 2026-10-07 22:04:43 +00:00

No files matched your search

+1 -25
View File
@@ -2079,22 +2079,7 @@ AS_IF([test $rb_cv_stack_end_address != no], [
dnl Checks for library functions.
AC_TYPE_GETGROUPS
AS_CASE(["${target_cpu}-${target_os}:${target_archs}"],
[powerpc*-darwin*], [
AC_LIBSOURCES(alloca.c)
AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}])
AC_DEFINE(C_ALLOCA)
AC_DEFINE_UNQUOTED(alloca, alloca)
],
[universal-darwin*:*ppc*], [
AC_LIBSOURCES(alloca.c)
AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}])
RUBY_DEFINE_IF([defined __POWERPC__], C_ALLOCA, 1) # Darwin defines __POWERPC__ for ppc and ppc64 both
RUBY_DEFINE_IF([defined __POWERPC__], alloca, alloca)
],
[
AC_FUNC_ALLOCA
])
AC_FUNC_ALLOCA
AS_IF([test "x$ALLOCA" = "x"], [
AC_CACHE_CHECK([for dynamic size alloca], rb_cv_dynamic_alloca, [
for chk in ok __chkstk; do
@@ -2748,15 +2733,6 @@ AS_CASE([$coroutine_type], [yes|''], [
[arm64-darwin*], [
coroutine_type=arm64
],
# Correct target name is powerpc*-, but Ruby seems to prefer ppc*-.
# Notice that Darwin PPC ABI differs from AIX and ELF.
# Adding PPC targets for AIX, *BSD and *Linux will require separate implementations.
[powerpc-darwin*|ppc-darwin*], [
coroutine_type=ppc
],
[powerpc64-darwin*|ppc64-darwin*], [
coroutine_type=ppc64
],
[x*64-linux*], [
AS_CASE(["$ac_cv_sizeof_voidp"],
[8], [ coroutine_type=amd64 ],
-96
View File
@@ -1,96 +0,0 @@
; Based on the code by Samuel Williams. Created by Sergey Fedorov on 04/06/2022.
; Credits to Samuel Williams, Rei Odaira and Iain Sandoe. Errors, if any, are mine.
; Some relevant examples: https://github.com/gcc-mirror/gcc/blob/master/libphobos/libdruntime/config/powerpc/switchcontext.S
; https://github.com/gcc-mirror/gcc/blob/master/libgcc/config/rs6000/darwin-gpsave.S
; https://www.ibm.com/docs/en/aix/7.2?topic=epilogs-saving-gprs-only
; ppc32 version may be re-written compactly with stmw/lwm, but the code won't be faster, see: https://github.com/ruby/ruby/pull/5927#issuecomment-1139730541
; Notice that this code is only for Darwin (macOS). Darwin ABI differs from AIX and ELF.
; To add support for AIX, *BSD or *Linux, please make separate implementations.
#define TOKEN_PASTE(x,y) x##y
.machine ppc7400 ; = G4, Rosetta
.text
.globl PREFIXED_SYMBOL(coroutine_transfer)
.align 2
PREFIXED_SYMBOL(coroutine_transfer):
; Make space on the stack for caller registers
; (Should we rather use red zone? See libphobos example.)
subi r1,r1,80
; Get LR
mflr r0
; Save caller registers
stw r31,0(r1)
stw r30,4(r1)
stw r29,8(r1)
stw r28,12(r1)
stw r27,16(r1)
stw r26,20(r1)
stw r25,24(r1)
stw r24,28(r1)
stw r23,32(r1)
stw r22,36(r1)
stw r21,40(r1)
stw r20,44(r1)
stw r19,48(r1)
stw r18,52(r1)
stw r17,56(r1)
stw r16,60(r1)
stw r15,64(r1)
stw r14,68(r1)
stw r13,72(r1)
; Save return address
stw r0,76(r1)
; Save nonvolatile CR fields in the caller linkage area
mfcr r0
stw r0,84(r1)
; Save stack pointer to first argument
stw r1,0(r3)
; Load stack pointer from second argument
lwz r1,0(r4)
; Load return address
lwz r0,76(r1)
; Restore caller registers
lwz r13,72(r1)
lwz r14,68(r1)
lwz r15,64(r1)
lwz r16,60(r1)
lwz r17,56(r1)
lwz r18,52(r1)
lwz r19,48(r1)
lwz r20,44(r1)
lwz r21,40(r1)
lwz r22,36(r1)
lwz r23,32(r1)
lwz r24,28(r1)
lwz r25,24(r1)
lwz r26,20(r1)
lwz r27,16(r1)
lwz r28,12(r1)
lwz r29,8(r1)
lwz r30,4(r1)
lwz r31,0(r1)
; Set LR
mtlr r0
; Restore nonvolatile CR2-CR4
lwz r0,84(r1)
mtcrf 56,r0
; Pop stack frame
addi r1,r1,80
; Jump to return address
blr
-58
View File
@@ -1,58 +0,0 @@
#ifndef COROUTINE_PPC_CONTEXT_H
#define COROUTINE_PPC_CONTEXT_H 1
#pragma once
#include <assert.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#define COROUTINE __attribute__((noreturn)) void
#define COROUTINE_LIMITED_ADDRESS_SPACE
enum {
COROUTINE_REGISTERS =
20 /* 19 general purpose registers (r13-r31) and 1 return address */
+ 4 /* caller linkage area, including the condition register save slot */
};
struct coroutine_context
{
void **stack_pointer;
void *argument;
};
typedef COROUTINE(* coroutine_start)(struct coroutine_context *from, struct coroutine_context *self);
static inline void coroutine_initialize_main(struct coroutine_context * context) {
context->stack_pointer = NULL;
}
static inline void coroutine_initialize(
struct coroutine_context *context,
coroutine_start start,
void *stack,
size_t size
) {
assert(start && stack && size >= 1024);
// Stack grows down. Force 16-byte alignment.
char * top = (char*)stack + size;
context->stack_pointer = (void**)((uintptr_t)top & ~0xF);
context->stack_pointer -= COROUTINE_REGISTERS;
memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS);
/* Skip a global prologue that sets the TOC register */
context->stack_pointer[19] = ((char*)start) + 8;
}
struct coroutine_context * coroutine_transfer(struct coroutine_context * current, struct coroutine_context * target);
static inline void coroutine_destroy(struct coroutine_context * context)
{
context->stack_pointer = NULL;
}
#endif /* COROUTINE_PPC_CONTEXT_H */
-95
View File
@@ -1,95 +0,0 @@
; Based on the code by Samuel Williams. Created by Sergey Fedorov on 04/06/2022.
; Credits to Samuel Williams, Rei Odaira and Iain Sandoe. Errors, if any, are mine.
; Some relevant examples: https://github.com/gcc-mirror/gcc/blob/master/libphobos/libdruntime/config/powerpc/switchcontext.S
; https://github.com/gcc-mirror/gcc/blob/master/libgcc/config/rs6000/darwin-gpsave.S
; https://www.ibm.com/docs/en/aix/7.2?topic=epilogs-saving-gprs-only
; Notice that this code is only for Darwin (macOS). Darwin ABI differs from AIX and ELF.
; To add support for AIX, *BSD or *Linux, please make separate implementations.
#define TOKEN_PASTE(x,y) x##y
.machine ppc64 ; = G5
.text
.globl PREFIXED_SYMBOL(coroutine_transfer)
.align 2
PREFIXED_SYMBOL(coroutine_transfer):
; Make space on the stack for caller registers
; (Should we rather use red zone? See libphobos example.)
subi r1,r1,160
; Get LR
mflr r0
; Save caller registers
std r31,0(r1)
std r30,8(r1)
std r29,16(r1)
std r28,24(r1)
std r27,32(r1)
std r26,40(r1)
std r25,48(r1)
std r24,56(r1)
std r23,64(r1)
std r22,72(r1)
std r21,80(r1)
std r20,88(r1)
std r19,96(r1)
std r18,104(r1)
std r17,112(r1)
std r16,120(r1)
std r15,128(r1)
std r14,136(r1)
std r13,144(r1)
; Save return address
std r0,152(r1)
; Save nonvolatile CR fields in the caller linkage area
mfcr r0
std r0,168(r1)
; Save stack pointer to first argument
std r1,0(r3)
; Load stack pointer from second argument
ld r1,0(r4)
; Load return address
ld r0,152(r1)
; Restore caller registers
ld r13,144(r1)
ld r14,136(r1)
ld r15,128(r1)
ld r16,120(r1)
ld r17,112(r1)
ld r18,104(r1)
ld r19,96(r1)
ld r20,88(r1)
ld r21,80(r1)
ld r22,72(r1)
ld r23,64(r1)
ld r24,56(r1)
ld r25,48(r1)
ld r26,40(r1)
ld r27,32(r1)
ld r28,24(r1)
ld r29,16(r1)
ld r30,8(r1)
ld r31,0(r1)
; Set LR
mtlr r0
; Restore nonvolatile CR2-CR4
ld r0,168(r1)
mtcrf 56,r0
; Pop stack frame
addi r1,r1,160
; Jump to return address
blr
-57
View File
@@ -1,57 +0,0 @@
#ifndef COROUTINE_PPC64_CONTEXT_H
#define COROUTINE_PPC64_CONTEXT_H 1
#pragma once
#include <assert.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#define COROUTINE __attribute__((noreturn)) void
enum {
COROUTINE_REGISTERS =
20 /* 19 general purpose registers (r13-r31) and 1 return address */
+ 4 /* caller linkage area, including the condition register save slot */
};
struct coroutine_context
{
void **stack_pointer;
void *argument;
};
typedef COROUTINE(* coroutine_start)(struct coroutine_context *from, struct coroutine_context *self);
static inline void coroutine_initialize_main(struct coroutine_context * context) {
context->stack_pointer = NULL;
}
static inline void coroutine_initialize(
struct coroutine_context *context,
coroutine_start start,
void *stack,
size_t size
) {
assert(start && stack && size >= 1024);
// Stack grows down. Force 16-byte alignment.
char * top = (char*)stack + size;
context->stack_pointer = (void**)((uintptr_t)top & ~0xF);
context->stack_pointer -= COROUTINE_REGISTERS;
memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS);
/* Skip a global prologue that sets the TOC register */
context->stack_pointer[19] = ((char*)start) + 8;
}
struct coroutine_context * coroutine_transfer(struct coroutine_context * current, struct coroutine_context * target);
static inline void coroutine_destroy(struct coroutine_context * context)
{
context->stack_pointer = NULL;
}
#endif /* COROUTINE_PPC64_CONTEXT_H */
-6
View File
@@ -3,12 +3,6 @@
# include "coroutine/amd64/Context.S"
#elif defined __i386__
# include "coroutine/x86/Context.S"
#elif defined __ppc__
# include "coroutine/ppc/Context.S"
#elif defined __ppc64__ && defined(WORDS_BIGENDIAN)
# include "coroutine/ppc64/Context.S"
#elif defined __ppc64__ && !defined(WORDS_BIGENDIAN)
# include "coroutine/ppc64le/Context.S"
#elif defined __arm64__
# include "coroutine/arm64/Context.S"
#else
-6
View File
@@ -6,12 +6,6 @@
# include "coroutine/amd64/Context.h"
#elif defined __i386__
# include "coroutine/x86/Context.h"
#elif defined __ppc__
# include "coroutine/ppc/Context.h"
#elif defined __ppc64__ && defined(WORDS_BIGENDIAN)
# include "coroutine/ppc64/Context.h"
#elif defined __ppc64__ && !defined(WORDS_BIGENDIAN)
# include "coroutine/ppc64le/Context.h"
#elif defined __arm64__
# include "coroutine/arm64/Context.h"
#else
+1 -1
View File
@@ -966,7 +966,7 @@ bug_important_message(FILE *out, const char *const msg, size_t len)
#undef CRASH_REPORTER_MAY_BE_CREATED
#if defined(__APPLE__) && \
(!defined(MAC_OS_X_VERSION_10_6) || MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6 || defined(__POWERPC__)) /* 10.6 PPC case */
(!defined(MAC_OS_X_VERSION_10_6) || MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6)
# define CRASH_REPORTER_MAY_BE_CREATED
#endif
static void
-21
View File
@@ -1690,27 +1690,6 @@ tick(void)
return val;
}
#elif defined(__POWERPC__) && defined(__APPLE__)
/* Implementation for macOS PPC by @nobu
* See: https://github.com/ruby/ruby/pull/5975#discussion_r890045558
*/
typedef unsigned long long tick_t;
#define PRItick "llu"
static __inline__ tick_t
tick(void)
{
unsigned long int upper, lower, tmp;
# define mftbu(r) __asm__ volatile("mftbu %0" : "=r"(r))
# define mftb(r) __asm__ volatile("mftb %0" : "=r"(r))
do {
mftbu(upper);
mftb(lower);
mftbu(tmp);
} while (tmp != upper);
return ((tick_t)upper << 32) | lower;
}
#elif defined(__aarch64__) && defined(__GNUC__)
typedef unsigned long tick_t;
#define PRItick "lu"
+1 -3
View File
@@ -26,12 +26,10 @@ struct rb_gc_zjit_fastpath;
#define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("movq\t%%rsp, %0" : "=r" (*(p)))
#elif defined(__i386) && defined(__GNUC__)
#define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("movl\t%%esp, %0" : "=r" (*(p)))
#elif (defined(__powerpc__) || defined(__powerpc64__)) && defined(__GNUC__) && !defined(_AIX) && !defined(__APPLE__) // Not Apple is NEEDED to unbreak ppc64 build on Darwin. Don't ask.
#elif (defined(__powerpc__) || defined(__powerpc64__)) && defined(__GNUC__) && !defined(_AIX)
#define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("mr\t%0, %%r1" : "=r" (*(p)))
#elif (defined(__powerpc__) || defined(__powerpc64__)) && defined(__GNUC__) && defined(_AIX)
#define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("mr %0,1" : "=r" (*(p)))
#elif defined(__POWERPC__) && defined(__APPLE__) // Darwin ppc and ppc64
#define SET_MACHINE_STACK_END(p) __asm__ volatile("mr %0, r1" : "=r" (*(p)))
#elif defined(__aarch64__) && defined(__GNUC__)
#define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("mov\t%0, sp" : "=r" (*(p)))
#else
+2 -4
View File
@@ -1126,12 +1126,10 @@ native_thread_native_thread_id(rb_thread_t *target_th)
#elif defined(__APPLE__)
uint64_t tid;
/* The first condition is needed because MAC_OS_X_VERSION_10_6
is not defined on 10.5, and while __POWERPC__ takes care of ppc/ppc64,
i386 will be broken without this. Note, 10.5 is supported with GCC upstream,
is not defined on 10.5. Note, 10.5 is supported with GCC upstream,
so it has C++17 and everything needed to build modern Ruby. */
# if (!defined(MAC_OS_X_VERSION_10_6) || \
(MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6) || \
defined(__POWERPC__) /* never defined for PowerPC platforms */)
(MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6))
const bool no_pthread_threadid_np = true;
# define NO_PTHREAD_MACH_THREAD_NP 1
# elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6
-6
View File
@@ -60,12 +60,6 @@ AS_IF([test ${target_archs+set}], [
#ifdef __i386__
"processor-name=i386"
#endif
#ifdef __ppc__
"processor-name=powerpc"
#endif
#ifdef __ppc64__
"processor-name=powerpc64"
#endif
#ifdef __arm64__
"processor-name=arm64"
#endif
+1 -1
View File
@@ -886,7 +886,7 @@ extern bool ruby_vm_during_cleanup;
#define RUBY_VM_FIBER_VM_STACK_SIZE ( 16 * 1024 * sizeof(VALUE)) /* 64 KB or 128 KB */
#define RUBY_VM_FIBER_VM_STACK_SIZE_MIN ( 2 * 1024 * sizeof(VALUE)) /* 8 KB or 16 KB */
#define RUBY_VM_FIBER_MACHINE_STACK_SIZE ( 64 * 1024 * sizeof(VALUE)) /* 256 KB or 512 KB */
#if defined(__powerpc64__) || defined(__ppc64__) // macOS has __ppc64__
#if defined(__powerpc64__)
#define RUBY_VM_FIBER_MACHINE_STACK_SIZE_MIN ( 32 * 1024 * sizeof(VALUE)) /* 128 KB or 256 KB */
#else
#define RUBY_VM_FIBER_MACHINE_STACK_SIZE_MIN ( 16 * 1024 * sizeof(VALUE)) /* 64 KB or 128 KB */
+3 -6
View File
@@ -778,7 +778,7 @@ rb_vmdebug_thread_dump_state(FILE *errout, VALUE self)
# include <sys/mman.h>
# undef backtrace
# if defined(__arm64__) || defined(__POWERPC__)
# if defined(__arm64__)
static bool
is_coroutine_start(unw_word_t ip)
{
@@ -891,22 +891,19 @@ darwin_sigtramp:
}
return n;
# elif defined(__arm64__) || defined(__POWERPC__)
# elif defined(__arm64__)
/* Since Darwin arm64's _sigtramp is implemented as normal function,
* unwind can unwind frames without special code.
* https://github.com/apple/darwin-libplatform/blob/215b09856ab5765b7462a91be7076183076600df/src/setjmp/generic/sigtramp.c
*/
while (n < size && unw_step(&cursor) > 0) {
unw_get_reg(&cursor, UNW_REG_IP, &ip);
# if defined(__arm64__)
// Strip Arm64's pointer authentication.
// https://developer.apple.com/documentation/security/preparing_your_app_to_work_with_pointer_authentication
// I wish I could use "ptrauth_strip()" but I get an error:
// "this target does not support pointer authentication"
trace[n++] = (void *)(ip & 0x7fffffffffffull);
# else
trace[n++] = (void *)ip;
# endif
// Apple's libunwind can't handle our coroutine switching code
if (is_coroutine_start(ip)) break;
}