aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Kubaj <pkubaj@FreeBSD.org>2026-06-08 11:30:59 +0000
committerPiotr Kubaj <pkubaj@FreeBSD.org>2026-06-11 07:47:57 +0000
commit0ba22c657d00fa5006765f2eaf5062d6961299e1 (patch)
tree63393dcaa7bc1c15781ee1683d70160c3bd57018
parent993d8246ab460321b13e721df908b6ae67afd90f (diff)
lang/libobjc2: update to 2.3, add msdSend for powerpc64*
-rw-r--r--lang/libobjc2/Makefile19
-rw-r--r--lang/libobjc2/distinfo6
-rw-r--r--lang/libobjc2/files/patch-CMakeLists.txt21
-rw-r--r--lang/libobjc2/files/patch-objc__msgSend.S11
-rw-r--r--lang/libobjc2/files/patch-objc__msgSend.powerpc64.S301
-rw-r--r--lang/libobjc2/files/patch-objc_message.h12
-rw-r--r--lang/libobjc2/pkg-plist5
7 files changed, 345 insertions, 30 deletions
diff --git a/lang/libobjc2/Makefile b/lang/libobjc2/Makefile
index 957eff74d84d..90c436fb0970 100644
--- a/lang/libobjc2/Makefile
+++ b/lang/libobjc2/Makefile
@@ -1,6 +1,6 @@
PORTNAME= libobjc2
DISTVERSIONPREFIX=v
-DISTVERSION= 2.2.1
+DISTVERSION= 2.3
CATEGORIES= lang devel gnustep
MAINTAINER= pkubaj@FreeBSD.org
@@ -10,7 +10,7 @@ LICENSE= MIT
BUILD_DEPENDS= ${LOCALBASE}/include/tsl/robin_map.h:devel/robin-map
-USES= cmake compiler objc:compiler
+USES= cmake:testing compiler objc:compiler
USE_GITHUB= yes
GH_ACCOUNT= gnustep
@@ -19,10 +19,9 @@ USE_LDCONFIG= yes
LDFLAGS+= -lm
-TEST_TARGET= test
-
CMAKE_ARGS+= -DLIB_INSTALL_PATH=lib \
-DLOCALBASE=${LOCALBASE}
+CMAKE_TESTING_ON= TESTS
LDFLAGS_armv7= -Wl,-znotext
SSP_UNSAFE= yes
@@ -32,17 +31,7 @@ PLIST_SUB+= SHLIB_MAJOR=${SHLIB_MAJOR} SHLIB_MINOR=${SHLIB_MINOR}
SHLIB_MAJOR= 4
SHLIB_MINOR= 6
-.include <bsd.port.pre.mk>
-
-.if ${ARCH:Mpowerpc*} || ${ARCH:Mriscv64*}
-CMAKE_ARGS+= -DTESTS:BOOL=OFF
-.endif
-
-.if ${CHOSEN_COMPILER_TYPE} == gcc
-CXXFLAGS+= -stdlib=libstdc++
-.endif
-
post-install:
${LN} -sf libobjc.so.${SHLIB_MAJOR}.${SHLIB_MINOR} ${STAGEDIR}${PREFIX}/lib/libobjc.so.${SHLIB_MAJOR}
-.include <bsd.port.post.mk>
+.include <bsd.port.mk>
diff --git a/lang/libobjc2/distinfo b/lang/libobjc2/distinfo
index 9b8b43d151de..78eafc9ed5b7 100644
--- a/lang/libobjc2/distinfo
+++ b/lang/libobjc2/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1717156055
-SHA256 (gnustep-libobjc2-v2.2.1_GH0.tar.gz) = 768ea8c5bd0999a29b5d15781125494f986456c1dc5c51d370fb31852cd31ea1
-SIZE (gnustep-libobjc2-v2.2.1_GH0.tar.gz) = 205087
+TIMESTAMP = 1780915583
+SHA256 (gnustep-libobjc2-v2.3_GH0.tar.gz) = 5ead2276b42a534ac40437ce53b2231320b985539dc325453d93874be8d92869
+SIZE (gnustep-libobjc2-v2.3_GH0.tar.gz) = 213139
diff --git a/lang/libobjc2/files/patch-CMakeLists.txt b/lang/libobjc2/files/patch-CMakeLists.txt
index ad0d5232999b..99cfac956e02 100644
--- a/lang/libobjc2/files/patch-CMakeLists.txt
+++ b/lang/libobjc2/files/patch-CMakeLists.txt
@@ -1,18 +1,15 @@
---- CMakeLists.txt.orig 2024-03-21 16:06:36 UTC
+--- CMakeLists.txt.orig 2026-06-08 10:48:43 UTC
+++ CMakeLists.txt
-@@ -29,9 +29,10 @@ INCLUDE (FetchContent)
- INCLUDE (CheckCXXSourceCompiles)
+@@ -30,6 +30,8 @@ INCLUDE (CheckSymbolExists)
INCLUDE (FetchContent)
+ INCLUDE (CheckSymbolExists)
+include_directories(${LOCALBASE}/include)
+
set(libobjc_VERSION 4.6)
--
- if (MSVC)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /EHas")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHas")
-@@ -128,17 +129,6 @@ endif ()
+
+@@ -112,17 +114,6 @@ endif ()
list(APPEND libobjc_C_SRCS eh_personality.c)
endif ()
@@ -22,7 +19,7 @@
- FetchContent_Declare(
- robinmap
- GIT_REPOSITORY https://github.com/Tessil/robin-map/
-- GIT_TAG v1.2.1)
+- GIT_TAG v1.4.0)
-
- FetchContent_MakeAvailable(robinmap)
-endif()
@@ -30,12 +27,12 @@
if (WIN32)
set(OLD_ABI_COMPAT_DEFAULT false)
else()
-@@ -255,8 +245,6 @@ endif()
+@@ -269,8 +260,6 @@ endif()
if (WIN32 AND NOT MINGW)
- target_link_libraries(objc ntdll.dll)
+ target_link_libraries(objc PUBLIC ntdll.dll)
endif()
-
--target_link_libraries(objc tsl::robin_map)
+-target_link_libraries(objc PRIVATE tsl::robin_map)
set_target_properties(objc PROPERTIES
LINKER_LANGUAGE C
diff --git a/lang/libobjc2/files/patch-objc__msgSend.S b/lang/libobjc2/files/patch-objc__msgSend.S
new file mode 100644
index 000000000000..443ea4d608bb
--- /dev/null
+++ b/lang/libobjc2/files/patch-objc__msgSend.S
@@ -0,0 +1,11 @@
+--- objc_msgSend.S.orig 2025-09-16 15:03:00 UTC
++++ objc_msgSend.S
+@@ -12,6 +12,8 @@
+ #include "objc_msgSend.riscv64.S"
+ #elif defined(__mips_n64) || defined(__mips_n32)
+ #include "objc_msgSend.mips.S"
++#elif defined(__powerpc64__) && _CALL_ELF == 2
++#include "objc_msgSend.powerpc64.S"
+ #else
+ #warning objc_msgSend() not implemented for your architecture
+ #endif
diff --git a/lang/libobjc2/files/patch-objc__msgSend.powerpc64.S b/lang/libobjc2/files/patch-objc__msgSend.powerpc64.S
new file mode 100644
index 000000000000..9e03cade637a
--- /dev/null
+++ b/lang/libobjc2/files/patch-objc__msgSend.powerpc64.S
@@ -0,0 +1,301 @@
+--- objc_msgSend.powerpc64.S.orig 2026-06-08 11:30:27 UTC
++++ objc_msgSend.powerpc64.S
+@@ -0,0 +1,298 @@
++/* objc_msgSend.powerpc64.S - PowerPC64 ELFv2 fast-path dispatch for GNUstep libobjc2.
++ *
++ * Included from objc_msgSend.S after common.S and asmconstants.h.
++ * Works for both ppc64le (LE) and ppc64 BE with the ELFv2 ABI.
++ *
++ * Dispatch overview:
++ * Fast path (no frame): nil-check → small-obj-check → isa → dtable lookup → IMP → bctr
++ * Slow path (frame + spill): for nil slots (cache miss), calls slowMsgLookup
++ *
++ * ELFv2 frame layout used on the slow path (FRAME_SIZE = 208):
++ * +0 back chain +8 CR save +24 TOC (r2)
++ * +32 r3 +40 r4 +48 r5 +56 r6 +64 r7 +72 r8 +80 r9 +88 r10
++ * +96 f1 ... +192 f13
++ * LR saved at (FRAME_SIZE+16)(r1) = old_sp+16 per ELFv2 convention.
++ */
++
++#define FRAME_SIZE 208
++
++.globl CDECL(objc_msgSend)
++TYPE_DIRECTIVE(CDECL(objc_msgSend), %function)
++.globl CDECL(objc_msgSend_fpret)
++TYPE_DIRECTIVE(CDECL(objc_msgSend_fpret), %function)
++
++CDECL(objc_msgSend_fpret):
++CDECL(objc_msgSend):
++.Lgep_objc_msgSend:
++ .cfi_startproc
++ addis 2, 12, .TOC.-.Lgep_objc_msgSend@ha
++ addi 2, 2, .TOC.-.Lgep_objc_msgSend@l
++.localentry CDECL(objc_msgSend), .-.Lgep_objc_msgSend
++
++ /* Nil receiver */
++ cmpdi cr0, 3, 0
++ beq- cr0, .Lnil_msgSend
++
++ /* Small-object check: r3 & SMALLOBJ_MASK → r11, sets CR0 */
++ andi. 11, 3, SMALLOBJ_MASK
++ bne- cr0, .Lsmall_msgSend
++
++ /* Load isa from normal receiver */
++ ld 11, 0(3)
++
++.LclassLoaded:
++ /* dtable → r11; sel->index (uint32_t) → r12; dtable->shift → r0 */
++ ld 11, DTABLE_OFFSET(11)
++ lwz 12, 0(4)
++ lwz 0, SHIFT_OFFSET(11)
++
++ /* Three-level sparse-array lookup.
++ * Each rlwinm extracts one byte of the selector index and scales by 8.
++ * shift=0: single level (8-bit); shift=8: two levels (16-bit);
++ * anything else: three levels (24-bit, the common case). */
++ cmpwi cr0, 0, 8
++ beq- cr0, .Ldtable16
++ cmpwi cr0, 0, 0
++ beq- cr0, .Ldtable8
++
++ /* Level 1: bits [23:16] of index, scaled by 8 */
++ rlwinm 0, 12, 19, 21, 28 /* r0 = (index >> 16 & 0xFF) << 3 */
++ add 11, 11, 0 /* r11 = dtable + offset (r0 can't be mem base) */
++ ld 11, DATA_OFFSET(11)
++
++.Ldtable16:
++ /* Level 2: bits [15:8] */
++ rlwinm 0, 12, 27, 21, 28 /* r0 = (index >> 8 & 0xFF) << 3 */
++ add 11, 11, 0
++ ld 11, DATA_OFFSET(11)
++
++.Ldtable8:
++ /* Level 3: bits [7:0] → slot pointer */
++ rlwinm 0, 12, 3, 21, 28 /* r0 = (index & 0xFF) << 3 */
++ add 11, 11, 0
++ ld 11, DATA_OFFSET(11)
++
++ cmpdi cr0, 11, 0
++ beq- cr0, .Lslow_msgSend
++
++ /* Load IMP from slot, tail-call (r12 = entry for ELFv2 global-entry TOC setup) */
++ ld 12, SLOT_OFFSET(11)
++ mtctr 12
++ bctr
++
++.Lnil_msgSend:
++ /* Nil receiver: zero integer (r3:r4) and FP (f1:f2) return registers.
++ * objc_msgSend_fpret shares this entry, so a nil send returning
++ * float/double must yield 0.0 — clear f1:f2 via the ELFv2 red zone. */
++ li 3, 0
++ li 4, 0
++ std 3, -8(1)
++ lfd 1, -8(1)
++ lfd 2, -8(1)
++ blr
++
++.Lslow_msgSend:
++ /* Slow path: spill all argument registers around the lookup call.
++ * CFI lets exceptions from +initialize (run inside slowMsgLookup)
++ * unwind through this frame. */
++ .cfi_remember_state
++ mflr 0
++ stdu 1, -FRAME_SIZE(1)
++ .cfi_def_cfa_offset FRAME_SIZE
++ std 0, (FRAME_SIZE + 16)(1)
++ .cfi_offset 65, 16
++ std 2, 24(1)
++ std 3, 32(1) /* self at +32; &self = r1+32 for slowMsgLookup */
++ std 4, 40(1)
++ std 5, 48(1)
++ std 6, 56(1)
++ std 7, 64(1)
++ std 8, 72(1)
++ std 9, 80(1)
++ std 10, 88(1)
++ stfd 1, 96(1)
++ stfd 2, 104(1)
++ stfd 3, 112(1)
++ stfd 4, 120(1)
++ stfd 5, 128(1)
++ stfd 6, 136(1)
++ stfd 7, 144(1)
++ stfd 8, 152(1)
++ stfd 9, 160(1)
++ stfd 10, 168(1)
++ stfd 11, 176(1)
++ stfd 12, 184(1)
++ stfd 13, 192(1)
++
++ /* slowMsgLookup(id *receiver, SEL cmd) — may modify *receiver for forwarding */
++ addi 3, 1, 32
++ /* r4 = sel (already set) */
++ bl CDECL(slowMsgLookup)
++ nop /* linker patches to: ld 2, 24(1) */
++
++ mr 12, 3
++ ld 3, 32(1) /* reload (possibly-modified) self */
++ ld 4, 40(1)
++ ld 5, 48(1)
++ ld 6, 56(1)
++ ld 7, 64(1)
++ ld 8, 72(1)
++ ld 9, 80(1)
++ ld 10, 88(1)
++ lfd 1, 96(1)
++ lfd 2, 104(1)
++ lfd 3, 112(1)
++ lfd 4, 120(1)
++ lfd 5, 128(1)
++ lfd 6, 136(1)
++ lfd 7, 144(1)
++ lfd 8, 152(1)
++ lfd 9, 160(1)
++ lfd 10, 168(1)
++ lfd 11, 176(1)
++ lfd 12, 184(1)
++ lfd 13, 192(1)
++ addi 1, 1, FRAME_SIZE
++ ld 0, 16(1)
++ mtlr 0
++ mtctr 12
++ bctr
++ .cfi_restore_state
++
++.Lsmall_msgSend:
++ /* r11 = receiver & SMALLOBJ_MASK = tag (1-7); look up class in global array */
++ addis 12, 2, CDECL(SmallObjectClasses)@toc@ha
++ addi 12, 12, CDECL(SmallObjectClasses)@toc@l
++ sldi 11, 11, 3 /* tag * 8 (pointer size) */
++ ldx 11, 12, 11 /* r11 = SmallObjectClasses[tag] */
++ b .LclassLoaded
++
++ .cfi_endproc
++
++
++.globl CDECL(objc_msgSend_stret)
++TYPE_DIRECTIVE(CDECL(objc_msgSend_stret), %function)
++
++/* stret: r3 = hidden struct ptr, r4 = self, r5 = sel */
++CDECL(objc_msgSend_stret):
++.Lgep_objc_msgSend_stret:
++ .cfi_startproc
++ addis 2, 12, .TOC.-.Lgep_objc_msgSend_stret@ha
++ addi 2, 2, .TOC.-.Lgep_objc_msgSend_stret@l
++.localentry CDECL(objc_msgSend_stret), .-.Lgep_objc_msgSend_stret
++
++ cmpdi cr0, 4, 0
++ beq- cr0, .Lnil_stret
++
++ andi. 11, 4, SMALLOBJ_MASK
++ bne- cr0, .Lsmall_stret
++
++ ld 11, 0(4)
++
++.LclassLoaded_stret:
++ ld 11, DTABLE_OFFSET(11)
++ lwz 12, 0(5) /* sel index from r5 */
++ lwz 0, SHIFT_OFFSET(11)
++
++ cmpwi cr0, 0, 8
++ beq- cr0, .Ldtable16_stret
++ cmpwi cr0, 0, 0
++ beq- cr0, .Ldtable8_stret
++
++ rlwinm 0, 12, 19, 21, 28
++ add 11, 11, 0
++ ld 11, DATA_OFFSET(11)
++
++.Ldtable16_stret:
++ rlwinm 0, 12, 27, 21, 28
++ add 11, 11, 0
++ ld 11, DATA_OFFSET(11)
++
++.Ldtable8_stret:
++ rlwinm 0, 12, 3, 21, 28
++ add 11, 11, 0
++ ld 11, DATA_OFFSET(11)
++
++ cmpdi cr0, 11, 0
++ beq- cr0, .Lslow_stret
++
++ ld 12, SLOT_OFFSET(11)
++ mtctr 12
++ bctr
++
++.Lnil_stret:
++ blr
++
++.Lslow_stret:
++ /* See .Lslow_msgSend for why this frame carries CFI. */
++ .cfi_remember_state
++ mflr 0
++ stdu 1, -FRAME_SIZE(1)
++ .cfi_def_cfa_offset FRAME_SIZE
++ std 0, (FRAME_SIZE + 16)(1)
++ .cfi_offset 65, 16
++ std 2, 24(1)
++ std 3, 32(1) /* struct ptr */
++ std 4, 40(1) /* self at +40; &self = r1+40 */
++ std 5, 48(1) /* sel */
++ std 6, 56(1)
++ std 7, 64(1)
++ std 8, 72(1)
++ std 9, 80(1)
++ std 10, 88(1)
++ stfd 1, 96(1)
++ stfd 2, 104(1)
++ stfd 3, 112(1)
++ stfd 4, 120(1)
++ stfd 5, 128(1)
++ stfd 6, 136(1)
++ stfd 7, 144(1)
++ stfd 8, 152(1)
++ stfd 9, 160(1)
++ stfd 10, 168(1)
++ stfd 11, 176(1)
++ stfd 12, 184(1)
++ stfd 13, 192(1)
++
++ addi 3, 1, 40 /* r3 = &self */
++ mr 4, 5 /* r4 = sel */
++ bl CDECL(slowMsgLookup)
++ nop
++
++ mr 12, 3
++ ld 3, 32(1)
++ ld 4, 40(1) /* reload (possibly-modified) self */
++ ld 5, 48(1)
++ ld 6, 56(1)
++ ld 7, 64(1)
++ ld 8, 72(1)
++ ld 9, 80(1)
++ ld 10, 88(1)
++ lfd 1, 96(1)
++ lfd 2, 104(1)
++ lfd 3, 112(1)
++ lfd 4, 120(1)
++ lfd 5, 128(1)
++ lfd 6, 136(1)
++ lfd 7, 144(1)
++ lfd 8, 152(1)
++ lfd 9, 160(1)
++ lfd 10, 168(1)
++ lfd 11, 176(1)
++ lfd 12, 184(1)
++ lfd 13, 192(1)
++ addi 1, 1, FRAME_SIZE
++ ld 0, 16(1)
++ mtlr 0
++ mtctr 12
++ bctr
++ .cfi_restore_state
++
++.Lsmall_stret:
++ addis 12, 2, CDECL(SmallObjectClasses)@toc@ha
++ addi 12, 12, CDECL(SmallObjectClasses)@toc@l
++ sldi 11, 11, 3
++ ldx 11, 12, 11
++ b .LclassLoaded_stret
++
++ .cfi_endproc
diff --git a/lang/libobjc2/files/patch-objc_message.h b/lang/libobjc2/files/patch-objc_message.h
new file mode 100644
index 000000000000..a28a84ee1f88
--- /dev/null
+++ b/lang/libobjc2/files/patch-objc_message.h
@@ -0,0 +1,12 @@
+--- objc/message.h.orig 2025-09-16 15:03:00 UTC
++++ objc/message.h
+@@ -10,7 +10,8 @@
+ defined(__mips_n64) || defined(__mips_n32) || \
+ defined(__ARM_ARCH_ISA_A64) || \
+ (defined(__riscv) && __riscv_xlen == 64 && \
+- defined(__riscv_float_abi_double))
++ defined(__riscv_float_abi_double)) || \
++ (defined(__powerpc64__) && _CALL_ELF == 2)
+
+ // Define __GNUSTEP_MSGSEND__ if available
+ #ifndef __GNUSTEP_MSGSEND__
diff --git a/lang/libobjc2/pkg-plist b/lang/libobjc2/pkg-plist
index 01d049d3c663..8d814850eeec 100644
--- a/lang/libobjc2/pkg-plist
+++ b/lang/libobjc2/pkg-plist
@@ -14,6 +14,7 @@ include/objc/objc-api.h
include/objc/objc-arc.h
include/objc/objc-auto.h
include/objc/objc-class.h
+include/objc/objc-config.h
include/objc/objc-exception.h
include/objc/objc-runtime.h
include/objc/objc-visibility.h
@@ -21,6 +22,10 @@ include/objc/objc.h
include/objc/runtime-deprecated.h
include/objc/runtime.h
include/objc/slot.h
+lib/cmake/libobjc/libobjcConfig.cmake
+lib/cmake/libobjc/libobjcConfigVersion.cmake
+lib/cmake/libobjc/libobjcTargets-%%CMAKE_BUILD_TYPE%%.cmake
+lib/cmake/libobjc/libobjcTargets.cmake
lib/libobjc.so
lib/libobjc.so.%%SHLIB_MAJOR%%
lib/libobjc.so.%%SHLIB_MAJOR%%.%%SHLIB_MINOR%%