pkgsrc-Changes archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
CVS commit: pkgsrc/cross
Module Name: pkgsrc
Committed By: js
Date: Sun Jun 15 12:51:36 UTC 2025
Modified Files:
pkgsrc/cross: Makefile
Added Files:
pkgsrc/cross/ppc-morphos-gcc: DESCR Makefile PLIST distinfo
pkgsrc/cross/ppc-morphos-gcc/files: README fix-fenv-for-crossbuild.diff
fix-saveds.diff fpic.diff gcc-15-morphos.diff
morphos-std-fastfloat.diff morphos-std-filesystem-path.diff
objc-saveds.diff
pkgsrc/cross/ppc-morphos-gcc/patches: patch-config_override.m4
patch-gcc_config_rs6000_morphos.h patch-libcc1_configure.ac
patch-libgcc_config_rs6000_gthr-morphos.c
patch-libstdc++-v3_crossconfig.m4
patch-libstdc++-v3_libsupc++_unwind-cxx.h patch-zlib_zutil.c
Log Message:
Add cross/ppc-morphos-gcc 15.1.0
Includes patchset from unreleased MorphOS 3.20 beta SDK with permission.
No version suffix anymore since the idea is to only maintain one version in
pkgsrc.
To generate a diff of this commit:
cvs rdiff -u -r1.124 -r1.125 pkgsrc/cross/Makefile
cvs rdiff -u -r0 -r1.1 pkgsrc/cross/ppc-morphos-gcc/DESCR \
pkgsrc/cross/ppc-morphos-gcc/Makefile pkgsrc/cross/ppc-morphos-gcc/PLIST \
pkgsrc/cross/ppc-morphos-gcc/distinfo
cvs rdiff -u -r0 -r1.1 pkgsrc/cross/ppc-morphos-gcc/files/README \
pkgsrc/cross/ppc-morphos-gcc/files/fix-fenv-for-crossbuild.diff \
pkgsrc/cross/ppc-morphos-gcc/files/fix-saveds.diff \
pkgsrc/cross/ppc-morphos-gcc/files/fpic.diff \
pkgsrc/cross/ppc-morphos-gcc/files/gcc-15-morphos.diff \
pkgsrc/cross/ppc-morphos-gcc/files/morphos-std-fastfloat.diff \
pkgsrc/cross/ppc-morphos-gcc/files/morphos-std-filesystem-path.diff \
pkgsrc/cross/ppc-morphos-gcc/files/objc-saveds.diff
cvs rdiff -u -r0 -r1.1 \
pkgsrc/cross/ppc-morphos-gcc/patches/patch-config_override.m4 \
pkgsrc/cross/ppc-morphos-gcc/patches/patch-gcc_config_rs6000_morphos.h \
pkgsrc/cross/ppc-morphos-gcc/patches/patch-libcc1_configure.ac \
pkgsrc/cross/ppc-morphos-gcc/patches/patch-libgcc_config_rs6000_gthr-morphos.c \
pkgsrc/cross/ppc-morphos-gcc/patches/patch-libstdc++-v3_crossconfig.m4 \
pkgsrc/cross/ppc-morphos-gcc/patches/patch-libstdc++-v3_libsupc++_unwind-cxx.h \
pkgsrc/cross/ppc-morphos-gcc/patches/patch-zlib_zutil.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: pkgsrc/cross/Makefile
diff -u pkgsrc/cross/Makefile:1.124 pkgsrc/cross/Makefile:1.125
--- pkgsrc/cross/Makefile:1.124 Mon Jun 9 16:03:03 2025
+++ pkgsrc/cross/Makefile Sun Jun 15 12:51:35 2025
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.124 2025/06/09 16:03:03 js Exp $
+# $NetBSD: Makefile,v 1.125 2025/06/15 12:51:35 js Exp $
#
COMMENT= Cross-platform development utilities
@@ -81,6 +81,7 @@ SUBDIR+= powerpc-none-elf-binutils
SUBDIR+= powerpc-none-elf-gcc
SUBDIR+= ppc-morphos-binutils
SUBDIR+= ppc-morphos-gcc-11
+SUBDIR+= ppc-morphos-gcc
SUBDIR+= ppc-morphos-sdk
SUBDIR+= riscv64-none-elf-binutils
SUBDIR+= riscv64-none-elf-gcc
Added files:
Index: pkgsrc/cross/ppc-morphos-gcc/DESCR
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/DESCR:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/DESCR Sun Jun 15 12:51:35 2025
@@ -0,0 +1 @@
+GCC cross-compiler for MorphOS
Index: pkgsrc/cross/ppc-morphos-gcc/Makefile
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/Makefile:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/Makefile Sun Jun 15 12:51:35 2025
@@ -0,0 +1,73 @@
+# $NetBSD: Makefile,v 1.1 2025/06/15 12:51:35 js Exp $
+
+DISTNAME= gcc-15.1.0
+PKGNAME= ppc-morphos-${DISTNAME}
+CATEGORIES= cross
+MASTER_SITES= ${MASTER_SITE_GNU:=gcc/gcc-${PKGVERSION_NOREV}/}
+EXTRACT_SUFX= .tar.xz
+
+MAINTAINER= js%NetBSD.org@localhost
+HOMEPAGE= https://www.morphos-team.net/
+COMMENT= GCC for ppc-morphos
+LICENSE= gnu-gpl-v3
+
+DEPENDS+= ppc-morphos-binutils-[0-9]*:../../cross/ppc-morphos-binutils
+DEPENDS+= ppc-morphos-sdk-[0-9]*:../../cross/ppc-morphos-sdk
+
+GNU_CONFIGURE= yes
+USE_LANGUAGES= c c++
+USE_TOOLS+= xzcat gtar patch autoconf gsed gmake perl makeinfo
+
+OBJDIR= ../build
+CONFIGURE_DIRS= ${OBJDIR}
+CONFIGURE_SCRIPT= ${WRKSRC}/configure
+GNU_CONFIGURE_PREFIX= ${PREFIX}/gg
+CONFIGURE_ARGS+= --target=ppc-morphos
+CONFIGURE_ARGS+= --with-plugin-ld=no
+CONFIGURE_ARGS+= --enable-languages=c,c++,objc,obj-c++
+CONFIGURE_ARGS+= --with-sysroot=${PREFIX}/gg
+CONFIGURE_ARGS+= --libexecdir=${PREFIX}/gg/lib
+CONFIGURE_ARGS+= --oldincludedir=${PREFIX}/gg/include
+CONFIGURE_ARGS+= --program-prefix=ppc-morphos-
+CONFIGURE_ARGS+= --enable-threads=morphos
+CONFIGURE_ARGS+= --disable-bootstrap
+CONFIGURE_ARGS+= --enable-version-specific-runtime-libs
+CONFIGURE_ARGS+= --disable-nls
+# Used by a sub-configure, therefore needs to be passed via MAKE_ENV.
+MAKE_ENV+= gcc_cv_have_tls=no
+
+# Relocations result in a linker error.
+MKPIE_SUPPORTED= no
+
+CHECK_PORTABILITY_SKIP+= contrib/*
+CHECK_PORTABILITY_SKIP+= libgo/mksysinfo.sh
+
+pre-patch:
+ # Out of memory with gpatch on Darwin, so use nbpatch.
+ ${RUN} cd ${WRKSRC} && ${PATCH} -p1 <${FILESDIR}/gcc-15-morphos.diff
+ ${RUN} cd ${WRKSRC} && ${PATCH} -p0 <${FILESDIR}/fpic.diff
+ ${RUN} cd ${WRKSRC} && ${PATCH} -p1 <${FILESDIR}/fix-fenv-for-crossbuild.diff
+ ${RUN} cd ${WRKSRC} && ${PATCH} -p1 <${FILESDIR}/morphos-std-filesystem-path.diff
+ ${RUN} cd ${WRKSRC} && ${PATCH} -p1 <${FILESDIR}/morphos-std-fastfloat.diff
+ ${RUN} cd ${WRKSRC} && ${PATCH} -p0 <${FILESDIR}/fix-saveds.diff
+ ${RUN} cd ${WRKSRC} && ${PATCH} -p0 <${FILESDIR}/objc-saveds.diff
+ ${RUN} find ${WRKSRC} -name configure -print0 | xargs -0 -r perl -i.orig -p -e
"s|toolexecdir='\\\$$\(libdir\)/gcc/\\\$$\(target_alias\)'|toolexecdir='\\\$$(libdir)/gcc-lib/\\\$$(target_alias)'|g;"
+ ${RUN} find ${WRKSRC} -name Makefile.in -print0 | xargs -0 -r perl -i.orig -p -e "s|= \\\$$\(libexecdir\)/gcc/\\\$$\(real_target_noncanonical\)|=
\\\$$(libexecdir)/gcc-lib/\\\$$(real_target_noncanonical)|g;s|= \\\$$\(libdir\)/gcc/\\\$$\(target_noncanonical\)|= \\\$$(libdir)/gcc-lib/\\\$$(target_noncanonical)|g;"
+
+post-patch:
+ # Change /gg to ${PREFIX}/gg
+ ${RUN} cd ${WRKSRC} && \
+ gsed -i 's,/gg/,${PREFIX}/gg/,g' \
+ gcc/config/rs6000/morphos.h && \
+ gsed -i 's,/gg$$,${PREFIX}/gg,g' gcc/config.host
+ ${RUN} cd ${WRKSRC}/libcc1 && autoreconf
+ ${RUN} cd ${WRKSRC}/libstdc++-v3 && autoreconf
+ ${RUN} cd ${WRKSRC} && ${MKDIR} ${OBJDIR}
+
+post-install:
+ ${RUN} rm -f ${DESTDIR}${PREFIX}/gg/share/info/dir
+
+.include "../../devel/gmp/buildlink3.mk"
+.include "../../math/mpfr/buildlink3.mk"
+.include "../../math/mpcomplex/buildlink3.mk"
+.include "../../mk/bsd.pkg.mk"
Index: pkgsrc/cross/ppc-morphos-gcc/PLIST
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/PLIST:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/PLIST Sun Jun 15 12:51:35 2025
@@ -0,0 +1,1629 @@
+@comment $NetBSD: PLIST,v 1.1 2025/06/15 12:51:35 js Exp $
+gg/bin/ppc-morphos-c++
+gg/bin/ppc-morphos-cpp
+gg/bin/ppc-morphos-g++
+gg/bin/ppc-morphos-gcc
+gg/bin/${PKGNAME}
+gg/bin/ppc-morphos-gcc-ar
+gg/bin/ppc-morphos-gcc-nm
+gg/bin/ppc-morphos-gcc-ranlib
+gg/bin/ppc-morphos-gcov
+gg/bin/ppc-morphos-gcov-dump
+gg/bin/ppc-morphos-gcov-tool
+gg/bin/ppc-morphos-lto-dump
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/cc1
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/cc1obj
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/cc1objplus
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/cc1plus
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/collect2
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/crtbegin.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/crtbeginS.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/crtbeginT.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/crtend.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/crtendS.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/ecrti.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/ecrtn.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include-fixed/README
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/altivec.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/amo.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/bmi2intrin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/bmiintrin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/algorithm
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/any
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/array
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/atomic
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/backward/auto_ptr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/backward/backward_warning.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/backward/binders.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/backward/hash_fun.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/backward/hash_map
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/backward/hash_set
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/backward/hashtable.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/backward/strstream
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/barrier
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bit
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/algorithmfwd.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/align.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/alloc_traits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/allocated_ptr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/atomic_base.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/atomic_futex.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/atomic_lockfree_defines.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/atomic_timed_wait.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/atomic_wait.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/basic_ios.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/basic_ios.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/basic_string.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/basic_string.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/boost_concept_check.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/c++0x_warning.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/char_traits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/charconv.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/chrono.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/chrono_io.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/codecvt.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/concept_check.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/cow_string.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/cpp_type_traits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/cxxabi_forced.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/cxxabi_init_exception.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/deque.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/elements_of.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/enable_special_members.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/erase_if.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/exception.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/exception_defines.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/exception_ptr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/formatfwd.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/forward_list.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/forward_list.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/fs_dir.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/fs_fwd.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/fs_ops.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/fs_path.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/fstream.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/functexcept.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/functional_hash.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/gslice.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/gslice_array.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/hash_bytes.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/hashtable.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/hashtable_policy.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/indirect_array.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/invoke.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/ios_base.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/istream.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/iterator_concepts.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/list.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/locale_classes.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/locale_classes.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/locale_conv.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/locale_facets.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/locale_facets.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/locale_facets_nonio.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/locale_facets_nonio.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/localefwd.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/mask_array.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/max_size_type.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/memory_resource.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/memoryfwd.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/mofunc_impl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/monostate.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/move.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/move_only_function.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/nested_exception.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/new_allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/node_handle.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/ostream.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/ostream.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/ostream_insert.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/out_ptr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/parse_numbers.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/postypes.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/predefined_ops.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/ptr_traits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/quoted_string.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/random.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/random.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/range_access.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/ranges_algo.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/ranges_algobase.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/ranges_base.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/ranges_cmp.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/ranges_uninitialized.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/ranges_util.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/refwrap.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/regex.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/regex.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/regex_automaton.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/regex_automaton.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/regex_compiler.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/regex_compiler.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/regex_constants.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/regex_error.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/regex_executor.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/regex_executor.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/regex_scanner.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/regex_scanner.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/requires_hosted.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/sat_arith.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/semaphore_base.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/shared_ptr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/shared_ptr_atomic.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/shared_ptr_base.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/slice_array.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/specfun.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/sstream.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/std.cc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/std.compat.cc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/std_abs.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/std_function.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/std_mutex.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/std_thread.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_algo.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_algobase.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_bvector.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_construct.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_deque.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_function.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_heap.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_iterator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_iterator_base_funcs.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_iterator_base_types.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_list.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_map.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_multimap.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_multiset.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_numeric.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_pair.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_queue.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_raw_storage_iter.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_relops.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_set.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_stack.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_tempbuf.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_tree.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_uninitialized.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stl_vector.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stream_iterator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/streambuf.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/streambuf_iterator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/string_view.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/stringfwd.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/text_encoding-data.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/this_thread_sleep.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/unicode-data.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/unicode.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/uniform_int_dist.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/unique_lock.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/unique_ptr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/unordered_map.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/unordered_set.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/uses_allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/uses_allocator_args.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/utility.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/valarray_after.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/valarray_array.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/valarray_array.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/valarray_before.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/vector.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bits/version.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/bitset
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cassert
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ccomplex
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cctype
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cerrno
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cfenv
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cfloat
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/charconv
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/chrono
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cinttypes
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ciso646
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/climits
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/clocale
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cmath
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/codecvt
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/compare
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/complex
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/complex.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/concepts
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/condition_variable
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/coroutine
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/csetjmp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/csignal
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cstdalign
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cstdarg
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cstdbool
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cstddef
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cstdint
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cstdio
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cstdlib
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cstring
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ctgmath
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ctime
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cuchar
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cwchar
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cwctype
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/cxxabi.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/assertions.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/bitset
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/debug.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/deque
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/formatter.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/forward_list
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/functions.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/helper_functions.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/list
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/macros.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/map
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/map.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/multimap.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/multiset.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/safe_base.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/safe_container.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/safe_iterator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/safe_iterator.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/safe_local_iterator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/safe_local_iterator.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/safe_sequence.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/safe_sequence.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/safe_unordered_base.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/safe_unordered_container.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/safe_unordered_container.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/set
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/set.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/stl_iterator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/string
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/unordered_map
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/unordered_set
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/debug/vector
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/decimal/decimal
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/decimal/decimal.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/deque
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/exception
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/execution
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/expected
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/algorithm
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/any
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/array
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/lfts_config.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/net.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/numeric_traits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/shared_ptr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/simd.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/simd_builtin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/simd_converter.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/simd_detail.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/simd_fixed_size.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/simd_math.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/simd_neon.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/simd_ppc.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/simd_scalar.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/simd_sve.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/simd_x86.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/simd_x86_conversions.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/bits/string_view.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/buffer
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/chrono
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/contract
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/deque
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/executor
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/forward_list
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/functional
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/internet
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/io_context
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/iterator
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/list
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/map
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/memory
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/memory_resource
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/net
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/netfwd
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/numeric
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/optional
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/propagate_const
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/random
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/ratio
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/regex
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/scope
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/set
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/simd
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/socket
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/source_location
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/string
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/string_view
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/synchronized_value
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/system_error
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/timer
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/tuple
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/type_traits
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/unordered_map
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/unordered_set
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/utility
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/experimental/vector
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/algorithm
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/aligned_buffer.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/alloc_traits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/atomicity.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/bitmap_allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/cast.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/cmath
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/codecvt_specializations.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/concurrence.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/debug_allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/enc_filebuf.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/extptr_allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/functional
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/hash_map
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/hash_set
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/iterator
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/malloc_allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/memory
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/mt_allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/new_allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/numeric
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/numeric_traits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/assoc_container.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/bin_search_tree_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/constructors_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/find_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/info_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/insert_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/iterators_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/node_iterators.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/point_iterators.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/policy_access_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/r_erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/rotate_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/split_join_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/bin_search_tree_/traits.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/binary_heap_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/const_iterator.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/constructors_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/entry_cmp.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/entry_pred.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/find_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/info_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/insert_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/iterators_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/point_const_iterator.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/policy_access_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/resize_policy.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/split_join_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binary_heap_/trace_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binomial_heap_/binomial_heap_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binomial_heap_/constructors_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binomial_heap_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binomial_heap_base_/binomial_heap_base_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binomial_heap_base_/constructors_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binomial_heap_base_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binomial_heap_base_/erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binomial_heap_base_/find_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binomial_heap_base_/insert_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/binomial_heap_base_/split_join_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/branch_policy/branch_policy.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/branch_policy/null_node_metadata.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/branch_policy/traits.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/cc_ht_map_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/cmp_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/cond_key_dtor_entry_dealtor.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/constructor_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/constructor_destructor_no_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/constructor_destructor_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/debug_no_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/debug_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/entry_list_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/erase_no_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/erase_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/find_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/find_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/info_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/insert_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/insert_no_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/insert_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/iterators_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/policy_access_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/resize_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/resize_no_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/resize_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/size_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cc_hash_table_map_/trace_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/cond_dealtor.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/container_base_dispatch.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/debug_map_base.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/eq_fn/eq_by_less.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/eq_fn/hash_eq_fn.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/constructor_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/constructor_destructor_no_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/constructor_destructor_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/debug_no_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/debug_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/erase_no_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/erase_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/find_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/find_no_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/find_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/gp_ht_map_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/info_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/insert_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/insert_no_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/insert_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/iterator_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/policy_access_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/resize_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/resize_no_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/resize_store_hash_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/gp_hash_table_map_/trace_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/hash_fn/direct_mask_range_hashing_imp.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/hash_fn/direct_mod_range_hashing_imp.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/hash_fn/linear_probe_fn_imp.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/hash_fn/mask_based_range_hashing.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/hash_fn/mod_based_range_hashing.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/hash_fn/probe_fn_base.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/hash_fn/quadratic_probe_fn_imp.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/hash_fn/ranged_hash_fn.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/hash_fn/ranged_probe_fn.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/hash_fn/sample_probe_fn.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/hash_fn/sample_range_hashing.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/hash_fn/sample_ranged_hash_fn.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/hash_fn/sample_ranged_probe_fn.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/left_child_next_sibling_heap_/const_iterator.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/left_child_next_sibling_heap_/constructors_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/left_child_next_sibling_heap_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/left_child_next_sibling_heap_/erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/left_child_next_sibling_heap_/info_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/left_child_next_sibling_heap_/insert_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/left_child_next_sibling_heap_/iterators_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/left_child_next_sibling_heap_/left_child_next_sibling_heap_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/left_child_next_sibling_heap_/node.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/left_child_next_sibling_heap_/point_const_iterator.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/left_child_next_sibling_heap_/policy_access_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/left_child_next_sibling_heap_/trace_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/list_update_map_/constructor_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/list_update_map_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/list_update_map_/entry_metadata_base.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/list_update_map_/erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/list_update_map_/find_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/list_update_map_/info_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/list_update_map_/insert_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/list_update_map_/iterators_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/list_update_map_/lu_map_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/list_update_map_/trace_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/list_update_policy/lu_counter_metadata.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/list_update_policy/sample_update_policy.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/ov_tree_map_/constructors_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/ov_tree_map_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/ov_tree_map_/erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/ov_tree_map_/info_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/ov_tree_map_/insert_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/ov_tree_map_/iterators_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/ov_tree_map_/node_iterators.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/ov_tree_map_/ov_tree_map_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/ov_tree_map_/policy_access_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/ov_tree_map_/split_join_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/ov_tree_map_/traits.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pairing_heap_/constructors_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pairing_heap_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pairing_heap_/erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pairing_heap_/find_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pairing_heap_/insert_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pairing_heap_/pairing_heap_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pairing_heap_/split_join_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/constructors_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/find_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/info_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/insert_join_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/iterators_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/pat_trie_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/pat_trie_base.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/policy_access_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/r_erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/rotate_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/split_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/synth_access_traits.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/trace_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/traits.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/pat_trie_/update_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/priority_queue_base_dispatch.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rb_tree_map_/constructors_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rb_tree_map_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rb_tree_map_/erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rb_tree_map_/find_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rb_tree_map_/info_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rb_tree_map_/insert_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rb_tree_map_/node.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rb_tree_map_/rb_tree_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rb_tree_map_/split_join_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rb_tree_map_/traits.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rc_binomial_heap_/constructors_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rc_binomial_heap_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rc_binomial_heap_/erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rc_binomial_heap_/insert_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rc_binomial_heap_/rc.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rc_binomial_heap_/rc_binomial_heap_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rc_binomial_heap_/split_join_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/rc_binomial_heap_/trace_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/resize_policy/cc_hash_max_collision_check_resize_trigger_imp.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/resize_policy/hash_exponential_size_policy_imp.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/resize_policy/hash_load_check_resize_trigger_imp.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/resize_policy/hash_load_check_resize_trigger_size_base.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/resize_policy/hash_prime_size_policy_imp.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/resize_policy/hash_standard_resize_policy_imp.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/resize_policy/sample_resize_policy.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/resize_policy/sample_resize_trigger.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/resize_policy/sample_size_policy.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/splay_tree_/constructors_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/splay_tree_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/splay_tree_/erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/splay_tree_/find_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/splay_tree_/info_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/splay_tree_/insert_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/splay_tree_/node.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/splay_tree_/splay_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/splay_tree_/splay_tree_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/splay_tree_/split_join_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/splay_tree_/traits.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/standard_policies.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/thin_heap_/constructors_destructor_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/thin_heap_/debug_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/thin_heap_/erase_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/thin_heap_/find_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/thin_heap_/insert_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/thin_heap_/split_join_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/thin_heap_/thin_heap_.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/thin_heap_/trace_fn_imps.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/tree_policy/node_metadata_selector.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/tree_policy/order_statistics_imp.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/tree_policy/sample_tree_node_update.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/tree_trace_base.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/trie_policy/node_metadata_selector.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/trie_policy/order_statistics_imp.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/trie_policy/prefix_search_node_update_imp.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/trie_policy/sample_trie_access_traits.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/trie_policy/sample_trie_node_update.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/trie_policy/trie_policy_base.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/trie_policy/trie_string_access_traits_imp.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/type_utils.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/types_traits.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/unordered_iterator/const_iterator.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/unordered_iterator/iterator.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/unordered_iterator/point_const_iterator.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/detail/unordered_iterator/point_iterator.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/exception.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/hash_policy.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/list_update_policy.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/priority_queue.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/tag_and_trait.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/tree_policy.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pb_ds/trie_policy.hpp
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pod_char_traits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pointer.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/pool_allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/random
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/random.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/rb_tree
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/rc_string_base.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/rope
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/ropeimpl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/slist
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/sso_string_base.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/stdio_filebuf.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/stdio_sync_filebuf.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/string_conversions.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/throw_allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/type_traits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/typelist.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/vstring.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/vstring.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/vstring_fwd.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ext/vstring_util.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/fenv.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/filesystem
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/flat_map
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/flat_set
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/format
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/forward_list
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/fstream
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/functional
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/future
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/generator
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/initializer_list
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/iomanip
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ios
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/iosfwd
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/iostream
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/istream
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/iterator
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/latch
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/limits
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/list
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/locale
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/map
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/math.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/memory
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/memory_resource
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/mutex
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/new
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/numbers
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/numeric
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/optional
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ostream
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/algo.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/algobase.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/algorithm
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/algorithmfwd.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/balanced_quicksort.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/base.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/basic_iterator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/checkers.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/compatibility.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/compiletime_settings.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/equally_split.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/features.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/find.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/find_selectors.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/for_each.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/for_each_selectors.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/iterator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/list_partition.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/losertree.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/merge.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/multiseq_selection.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/multiway_merge.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/multiway_mergesort.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/numeric
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/numericfwd.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/omp_loop.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/omp_loop_static.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/par_loop.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/parallel.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/partial_sum.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/partition.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/queue.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/quicksort.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/random_number.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/random_shuffle.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/search.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/set_operations.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/settings.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/sort.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/tags.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/types.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/unique_copy.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/parallel/workstealing.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/atomic_word.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/basic_file.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/c++allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/c++config.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/c++io.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/c++locale.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/cpu_defines.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/ctype_base.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/ctype_inline.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/cxxabi_tweaks.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/error_constants.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/extc++.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/gthr-default.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/gthr-posix.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/gthr-single.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/gthr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/messages_members.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/opt_random.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/os_defines.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/stdc++.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/stdtr1c++.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/bits/time_members.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/ext/opt_random.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/atomic_word.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/basic_file.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/c++allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/c++config.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/c++io.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/c++locale.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/cpu_defines.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/ctype_base.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/ctype_inline.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/cxxabi_tweaks.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/error_constants.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/extc++.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/gthr-default.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/gthr-posix.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/gthr-single.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/gthr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/messages_members.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/opt_random.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/os_defines.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/stdc++.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/stdtr1c++.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/bits/time_members.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/ext/opt_random.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/atomic_word.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/basic_file.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/c++allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/c++config.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/c++io.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/c++locale.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/cpu_defines.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/ctype_base.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/ctype_inline.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/cxxabi_tweaks.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/error_constants.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/extc++.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/gthr-default.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/gthr-posix.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/gthr-single.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/gthr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/messages_members.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/opt_random.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/os_defines.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/stdc++.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/stdtr1c++.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/bits/time_members.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libb32/libnix/ext/opt_random.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/atomic_word.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/basic_file.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/c++allocator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/c++config.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/c++io.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/c++locale.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/cpu_defines.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/ctype_base.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/ctype_inline.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/cxxabi_tweaks.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/error_constants.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/extc++.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/gthr-default.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/gthr-posix.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/gthr-single.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/gthr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/messages_members.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/opt_random.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/os_defines.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/stdc++.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/stdtr1c++.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/bits/time_members.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ppc-morphos/libnix/ext/opt_random.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/print
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/algorithm_fwd.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/algorithm_impl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/execution_defs.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/execution_impl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/glue_algorithm_defs.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/glue_algorithm_impl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/glue_execution_defs.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/glue_memory_defs.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/glue_memory_impl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/glue_numeric_defs.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/glue_numeric_impl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/memory_impl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/numeric_fwd.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/numeric_impl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/parallel_backend.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/parallel_backend_serial.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/parallel_backend_tbb.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/parallel_backend_utils.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/parallel_impl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/pstl_config.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/unseq_backend_simd.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/pstl/utils.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/queue
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/random
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ranges
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/ratio
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/regex
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/scoped_allocator
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/semaphore
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/set
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/shared_mutex
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/source_location
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/span
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/spanstream
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/sstream
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/stack
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/stacktrace
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/stdatomic.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/stdbit.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/stdckdint.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/stdexcept
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/stdfloat
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/stdlib.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/stop_token
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/streambuf
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/string
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/string_view
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/syncstream
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/system_error
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/text_encoding
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tgmath.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/thread
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/array
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/bessel_function.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/beta_function.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/ccomplex
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/cctype
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/cfenv
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/cfloat
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/cinttypes
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/climits
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/cmath
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/complex
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/complex.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/cstdarg
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/cstdbool
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/cstdint
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/cstdio
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/cstdlib
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/ctgmath
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/ctime
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/ctype.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/cwchar
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/cwctype
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/ell_integral.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/exp_integral.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/fenv.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/float.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/functional
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/functional_hash.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/gamma.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/hashtable.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/hashtable_policy.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/hypergeometric.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/inttypes.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/legendre_function.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/limits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/math.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/memory
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/modified_bessel_func.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/poly_hermite.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/poly_laguerre.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/random
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/random.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/random.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/regex
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/riemann_zeta.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/shared_ptr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/special_function_util.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/stdarg.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/stdbool.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/stdint.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/stdio.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/stdlib.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/tgmath.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/tuple
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/type_traits
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/unordered_map
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/unordered_map.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/unordered_set
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/unordered_set.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/utility
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/wchar.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr1/wctype.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr2/bool_set
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr2/bool_set.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr2/dynamic_bitset
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr2/dynamic_bitset.tcc
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr2/ratio
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tr2/type_traits
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/tuple
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/type_traits
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/typeindex
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/typeinfo
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/unordered_map
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/unordered_set
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/utility
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/valarray
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/variant
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/vector
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/c++/version
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/emmintrin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/float.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/gcov.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/htmintrin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/htmxlintrin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/immintrin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/iso646.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/limits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/mm_malloc.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/mmintrin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/nmmintrin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/objc/NXConstStr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/objc/Object.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/objc/Protocol.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/objc/message.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/objc/objc-decls.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/objc/objc-exception.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/objc/objc-sync.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/objc/objc.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/objc/runtime.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/objc/thr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/pmmintrin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/ppc-asm.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/ppu_intrinsics.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/rs6000-vecdefines.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/si2vmx.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/smmintrin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/spu2vmx.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/stdalign.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/stdarg.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/stdatomic.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/stdbool.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/stdckdint.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/stddef.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/stdfix.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/stdnoreturn.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/syslimits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/tgmath.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/tmmintrin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/unwind.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/varargs.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/vec_types.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/x86gprintrin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/x86intrin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/include/xmmintrin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/install-tools/fixinc.sh
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/install-tools/fixinc_list
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/install-tools/fixincl
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/install-tools/gsyslimits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/install-tools/include/README
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/install-tools/include/limits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/install-tools/macro_list
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/install-tools/mkheaders
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/install-tools/mkheaders.conf
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/install-tools/mkinstalldirs
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libatomic.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/crtbegin.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/crtbeginS.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/crtbeginT.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/crtend.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/crtendS.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/ecrti.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/ecrtn.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libatomic.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libgcc.a
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libgcov.a
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/crtbegin.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/crtbeginS.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/crtbeginT.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/crtend.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/crtendS.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/ecrti.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/ecrtn.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/libatomic.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/libgcc.a
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/libgcov.a
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/libobjc.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/libstdc++.a-gdb.py
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/libstdc++.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/libstdc++.modules.json
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/libstdc++exp.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/libsupc++.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/ncrti.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libnix/ncrtn.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libobjc.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libstdc++.a-gdb.py
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libstdc++.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libstdc++.modules.json
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libstdc++exp.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/libsupc++.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/ncrti.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libb32/ncrtn.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libgcc.a
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libgcov.a
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/liblto_plugin.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/crtbegin.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/crtbeginS.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/crtbeginT.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/crtend.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/crtendS.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/ecrti.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/ecrtn.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/libatomic.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/libgcc.a
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/libgcov.a
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/libobjc.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/libstdc++.a-gdb.py
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/libstdc++.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/libstdc++.modules.json
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/libstdc++exp.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/libsupc++.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/ncrti.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libnix/ncrtn.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libobjc.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libstdc++.a-gdb.py
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libstdc++.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libstdc++.modules.json
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libstdc++exp.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/libsupc++.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/lto-wrapper
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/lto1
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/ncrti.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/ncrtn.o
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/gengtype
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/gtype.state
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ada/gcc-interface/ada-tree.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/addresses.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/alias.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/align.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/all-tree.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/alloc-pool.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/access-diagram.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/analysis-plan.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/analyzer-language.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/analyzer-logging.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/analyzer-selftests.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/analyzer.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/bar-chart.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/call-details.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/call-info.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/call-string.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/call-summary.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/checker-event.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/checker-path.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/complexity.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/constraint-manager.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/diagnostic-manager.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/engine.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/event-loc-info.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/exploded-graph.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/feasible-graph.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/function-set.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/inlining-iterator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/known-function-manager.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/pending-diagnostic.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/program-point.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/program-state.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/ranges.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/reachability.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/record-layout.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/region-model-manager.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/region-model-reachability.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/region-model.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/region.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/sm.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/state-purge.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/store.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/supergraph.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/svalue.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/symbol.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/analyzer/trimmed-graph.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ansidecl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/array-traits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/asan.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/attr-fnspec.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/attr-urls.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/attribs.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/auto-host.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/auto-profile.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/avoid-store-forwarding.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/b-header-vars
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/backend.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/basic-block.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/bb-reorder.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/bbitmap.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/bitmap.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/builtin-attrs.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/builtin-types.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/builtins.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/builtins.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/bversion.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/c-family/c-common.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/c-family/c-common.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/c-family/c-objc.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/c-family/c-pragma.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/c-family/c-pretty-print.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/c-tree.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/c/c-tree.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/calls.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ccmp.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cfg-flags.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cfg.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cfganal.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cfgbuild.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cfgcleanup.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cfgexpand.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cfghooks.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cfgloop.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cfgloopmanip.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cfgrtl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cgraph.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cif-code.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/collect-utils.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/collect2-aix.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/collect2.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/color-macros.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/conditions.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/config.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/config/elfos.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/config/initfini-array.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/config/rs6000/morphos-protos.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/config/rs6000/morphos-stdint.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/config/rs6000/morphos.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/config/rs6000/option-defaults.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/config/rs6000/rs6000-cpus.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/config/rs6000/rs6000-opts.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/config/rs6000/rs6000-protos.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/config/rs6000/rs6000.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/config/rs6000/sysv4.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/config/usegas.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/config/vxworks-dummy.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/configargs.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/context.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/convert.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/coretypes.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/coroutine-builtins.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/coverage.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cp/contracts.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cp/cp-trait.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cp/cp-tree.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cp/cp-tree.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cp/cxx-pretty-print.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cp/name-lookup.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cp/operators.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cp/type-utils.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cppbuiltin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cppdefault.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cpplib.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/crc-verification.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/cselib.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ctfc.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/d/d-tree.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/data-streamer.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/dbgcnt.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/dbgcnt.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/dce.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ddg.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/debug.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/defaults.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/df.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/dfp.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-buffer.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-client-data-hooks.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-color.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-core.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-diagram.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-event-id.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-format-sarif.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-format-text.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-format.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-highlight-colors.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-label-effects.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-macro-unwinding.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-metadata.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-output-file.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-path.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-spec.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic-url.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/diagnostic.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/digraph.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/dojump.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/dominance.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/domwalk.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/double-int.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/dump-context.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/dumpfile.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/dwarf2asm.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/dwarf2codeview.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/dwarf2ctf.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/dwarf2out.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/edit-context.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/emit-rtl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/errors.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/escaped_string.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/et-forest.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/except.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/explow.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/expmed.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/expr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/fibonacci_heap.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/file-find.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/file-prefix-map.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/filenames.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/fixed-value.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/flag-types.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/flags.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/fold-const-call.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/fold-const.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/function-abi.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/function.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gcc-plugin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gcc-rich-location.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gcc-symtab.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gcc-urlifier.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gcc-urlifier.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gcc.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gcov-counter.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gcov-io.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gcse-common.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gcse.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/generic-match.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gengtype.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/genrtl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gensupport.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ggc-internal.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ggc.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-array-bounds.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-builder.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-expr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-fold.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-iterator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-low.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-lower-bitint.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-match.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-predicate-analysis.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-predict.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-pretty-print.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-range-cache.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-range-edge.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-range-fold.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-range-gori.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-range-infer.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-range-op.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-range-path.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-range-phi.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-range-trace.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-range.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-ssa-warn-access.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-ssa-warn-restrict.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-ssa.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-streamer.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple-walk.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimple.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimplify-me.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gimplify.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/glimits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gomp-constants.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/graph.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/graphds.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/graphite.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/graphviz.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gsstruct.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gsyms.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gsyslimits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gtm-builtins.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/gtype-desc.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/hard-reg-set.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/hash-map-traits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/hash-map.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/hash-set.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/hash-table.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/hash-traits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/hashtab.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/highlev-plugin-common.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/hooks.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/hosthooks-def.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/hosthooks.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/hw-doloop.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/hwint.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ifcvt.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/inchash.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/incpath.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/input.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/insn-addr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/insn-attr-common.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/insn-attr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/insn-codes.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/insn-config.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/insn-constants.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/insn-flags.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/insn-modes-inline.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/insn-modes.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/insn-notes.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/insn-opinit.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/int-vector-builder.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/internal-fn.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/internal-fn.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/intl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-cp.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-fnsummary.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-icf-gimple.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-icf.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-inline.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-locality-cloning.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-modref-tree.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-modref.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-param-manipulation.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-predicate.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-prop.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-ref.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-reference.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-strub.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ipa-utils.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ira-int.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ira.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/is-a.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/iterator-utils.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/json-parsing.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/json.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/label-text.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/langhooks-def.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/langhooks.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/lazy-diagnostic-path.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/lcm.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/libfuncs.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/libgdiagnostics++.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/libgdiagnostics.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/libiberty.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/libsarifreplay.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/limitx.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/limity.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/line-map.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/lockfile.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/logical-location.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/loop-unroll.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/lower-subreg.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/lra-int.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/lra.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/lto-compress.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/lto-ltrans-cache.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/lto-section-names.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/lto-streamer.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/m2/m2-tree.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/machmode.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/machmode.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/make-unique.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/md5.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/mem-stats-traits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/mem-stats.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/memmodel.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/memory-block.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/mode-classes.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/mux-utils.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/objc/objc-tree.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/obstack-utils.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/obstack.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/omp-api.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/omp-builtins.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/omp-expand.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/omp-general.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/omp-low.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/omp-offload.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/omp-selectors.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/omp-simd-clone.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/opt-problem.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/opt-suggestions.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/optabs-libfuncs.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/optabs-query.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/optabs-tree.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/optabs.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/optabs.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/optinfo-emit-json.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/optinfo.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/options.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/opts-diagnostic.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/opts-jobserver.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/opts.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ordered-hash-map.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/output.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/pair-fusion.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/pass-instances.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/pass_manager.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/passes.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/plugin-api.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/plugin-version.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/plugin.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/plugin.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/pointer-query.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/poly-int-types.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/poly-int.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/predict.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/predict.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/prefix.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/pretty-print-format-impl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/pretty-print-markup.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/pretty-print-urlifier.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/pretty-print.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/print-rtl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/print-tree.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/profile-count.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/profile.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/range-op-mixed.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/range-op.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/range.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/read-md.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/read-rtl-function.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/real.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/realmpfr.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/recog.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/reg-notes.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/regcprop.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/regrename.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/regs.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/regset.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/reload.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/resource.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/rich-location.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/rtl-error.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/rtl-iter.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/rtl-ssa.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/rtl.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/rtl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/rtlanal.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/rtlhash.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/rtlhooks-def.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/rtx-vector-builder.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/run-rtl-passes.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/safe-ctype.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/sanitizer.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/sarif-spec-urls.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/sbitmap.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/sched-int.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/sel-sched-dump.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/sel-sched-ir.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/sel-sched.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/selftest-diagnostic-path.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/selftest-diagnostic-show-locus.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/selftest-diagnostic.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/selftest-json.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/selftest-logical-location.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/selftest-rtl.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/selftest-tree.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/selftest.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/sese.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/shortest-paths.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/shrink-wrap.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/signop.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/simple-diagnostic-path.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/sparseset.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/spellcheck-tree.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/spellcheck.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/splay-tree-utils.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/splay-tree.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/sreal.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ssa-iterators.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ssa.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/statistics.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/stmt.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/stor-layout.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/streamer-hooks.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/stringpool.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/substring-locations.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/symbol-summary.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/symtab-clones.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/symtab-thunks.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/symtab.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/sync-builtins.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/system.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/target-def.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/target-globals.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/target-hooks-macros.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/target-insns.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/target.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/target.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/targhooks.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/text-range-label.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/timevar.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/timevar.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tm-preds.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tm.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tm_p.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/toplev.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tracer.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/trans-mem.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-affine.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-cfg.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-cfgcleanup.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-check.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-chrec.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-core.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-data-ref.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-dfa.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-diagnostic.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-dump.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-eh.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-hash-traits.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-hasher.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-if-conv.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-inline.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-into-ssa.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-iterator.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-logical-location.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-nested.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-object-size.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-outof-ssa.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-parloops.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-pass.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-phinodes.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-pretty-print-markup.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-pretty-print.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-scalar-evolution.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-sra.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-address.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-alias-compare.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-alias.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-ccp.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-coalesce.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-dce.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-dom.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-dse.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-live.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-loop-ivopts.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-loop-manip.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-loop-niter.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-loop.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-math-opts.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-operands.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-propagate.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-reassoc.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-sccvn.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-scopedtables.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-strlen.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-ter.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-threadedge.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa-threadupdate.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssa.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-ssanames.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-stdarg.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-streamer.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-switch-conversion.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-vector-builder.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-vectorizer.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree-vrp.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tree.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/treestruct.def
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tristate.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tsan.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/tsystem.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/typeclass.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/typed-splay-tree.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/ubsan.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/unique-argv.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/valtrack.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/value-pointer-equiv.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/value-prof.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/value-query.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/value-range-pretty-print.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/value-range-storage.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/value-range.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/value-relation.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/varasm.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/vec-perm-indices.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/vec.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/vector-builder.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/version.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/vmsdbg.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/vr-values.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/vtable-verify.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/wide-int-bitmask.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/wide-int-print.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/wide-int.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/include/xcoff.h
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/libcc1plugin.la
+gg/lib/gcc-lib/ppc-morphos/${PKGVERSION}/plugin/libcp1plugin.la
+gg/lib/gcc/ppc-morphos/${PKGVERSION}/g++-mapper-server
+gg/lib/libcc1.la
+gg/man/man1/ppc-morphos-cpp.1
+gg/man/man1/ppc-morphos-g++.1
+gg/man/man1/ppc-morphos-gcc.1
+gg/man/man1/ppc-morphos-gcov-dump.1
+gg/man/man1/ppc-morphos-gcov-tool.1
+gg/man/man1/ppc-morphos-gcov.1
+gg/man/man1/ppc-morphos-lto-dump.1
+gg/man/man7/fsf-funding.7
+gg/man/man7/gfdl.7
+gg/man/man7/gpl.7
+gg/share/gcc-${PKGVERSION}/python/libstdcxx/__init__.py
+gg/share/gcc-${PKGVERSION}/python/libstdcxx/v6/__init__.py
+gg/share/gcc-${PKGVERSION}/python/libstdcxx/v6/printers.py
+gg/share/gcc-${PKGVERSION}/python/libstdcxx/v6/xmethods.py
+gg/share/info/cpp.info
+gg/share/info/cppinternals.info
+gg/share/info/gcc.info
+gg/share/info/gccinstall.info
+gg/share/info/gccint.info
+gg/share/info/libquadmath.info
+@pkgdir gg/man/man3
+@pkgdir gg/include
Index: pkgsrc/cross/ppc-morphos-gcc/distinfo
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/distinfo:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/distinfo Sun Jun 15 12:51:35 2025
@@ -0,0 +1,12 @@
+$NetBSD: distinfo,v 1.1 2025/06/15 12:51:35 js Exp $
+
+BLAKE2s (gcc-15.1.0.tar.xz) = 260d64654fbfc0ee06540cc4604cd7071be53d616069a9dd57e5359a0b0ecf46
+SHA512 (gcc-15.1.0.tar.xz) = ddd35ca6c653dffa88f7c7ef9ee4cd806e156e0f3b30f4d63e75a8363361285cd566ee73127734cde6a934611de815bee3e32e24bfd2e0ab9f7ff35c929821c1
+Size (gcc-15.1.0.tar.xz) = 98268344 bytes
+SHA1 (patch-config_override.m4) = 1ee0186b006a987dc57151a9d112654eabd24db9
+SHA1 (patch-gcc_config_rs6000_morphos.h) = c788e480f3f510b61292f5b1ec5b84646b33ab93
+SHA1 (patch-libcc1_configure.ac) = ca40be7af4a4ffc3a4fba1a0dbda76fcde1fa2d9
+SHA1 (patch-libgcc_config_rs6000_gthr-morphos.c) = 0fae90d02ce28f8191ef2e4eb4fdbfe2ee7c23d3
+SHA1 (patch-libstdc++-v3_crossconfig.m4) = 0d0d20f9a1444bd77520decd275ac22d2a6e4890
+SHA1 (patch-libstdc++-v3_libsupc++_unwind-cxx.h) = 0234e780171554bf60858b884ab1181cad36f8b2
+SHA1 (patch-zlib_zutil.c) = 33a75b615f4d43c628450f8f3743a00a1a050c3e
Index: pkgsrc/cross/ppc-morphos-gcc/files/README
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/files/README:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/files/README Sun Jun 15 12:51:35 2025
@@ -0,0 +1,2 @@
+These files are coming from the unreleased MorphOS 3.20 beta SDK, with the
+generated libstdc++-v3/configure removed.
Index: pkgsrc/cross/ppc-morphos-gcc/files/fix-fenv-for-crossbuild.diff
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/files/fix-fenv-for-crossbuild.diff:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/files/fix-fenv-for-crossbuild.diff Sun Jun 15 12:51:35 2025
@@ -0,0 +1,36 @@
+--- gcc-11.1.0-old/libstdc++-v3/include/c_compatibility/fenv.h 2021-04-27 13:00:16.000000000 +0300
++++ gcc-11.1.0-new/libstdc++-v3/include/c_compatibility/fenv.h 2021-06-21 22:57:48.553142842 +0300
+@@ -26,6 +26,10 @@
+ * This is a Standard C++ Library header.
+ */
+
++#if !defined __cplusplus || defined _GLIBCXX_INCLUDE_NEXT_C_HEADERS
++# include_next <fenv.h>
++#else
++
+ #ifndef _GLIBCXX_FENV_H
+ #define _GLIBCXX_FENV_H 1
+
+@@ -79,3 +83,5 @@
+ #endif // C++11
+
+ #endif // _GLIBCXX_FENV_H
++
++#endif
+--- gcc-11.1.0-old/libstdc++-v3/include/c_global/cfenv 2021-04-27 13:00:16.000000000 +0300
++++ gcc-11.1.0-new/libstdc++-v3/include/c_global/cfenv 2021-06-21 22:54:39.506005252 +0300
+@@ -37,9 +37,11 @@
+
+ #include <bits/c++config.h>
+
+-#if _GLIBCXX_HAVE_FENV_H
+-# include <fenv.h>
+-#endif
++// Need to ensure this finds the C library's <fenv.h> not a libstdc++
++// wrapper that might already be installed later in the include search path.
++#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
++#include_next <fenv.h>
++#undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS
+
+ #ifdef _GLIBCXX_USE_C99_FENV_TR1
+
Index: pkgsrc/cross/ppc-morphos-gcc/files/fix-saveds.diff
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/files/fix-saveds.diff:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/files/fix-saveds.diff Sun Jun 15 12:51:35 2025
@@ -0,0 +1,42 @@
+Don't use r12 to store CR when using saveds, as __restore_r13 will need the
+passed r12.
+
+--- gcc/config/rs6000/rs6000-logue.cc.orig 2025-06-01 00:58:21.923156281 +0000
++++ gcc/config/rs6000/rs6000-logue.cc
+@@ -3343,6 +3343,16 @@ rs6000_emit_prologue (void)
+ emit_insn (gen_hashst (mem, reg0));
+ }
+
++ /* If we need to save CR, put it into r12 or r11. Choose r12 except when
++ r12 will be needed by out-of-line gpr save. */
++ if (DEFAULT_ABI == ABI_AIX
++ && !(strategy & (SAVE_INLINE_GPRS | SAVE_NOINLINE_GPRS_SAVES_LR)))
++ cr_save_regno = 11;
++ else if (DEFAULT_ABI == ABI_ELFv2)
++ cr_save_regno = 11;
++ else
++ cr_save_regno = 12;
++
+ #ifdef TARGET_BASEREL
+ if (info->baserel_save_p && TARGET_BASEREL)
+ {
+@@ -3357,17 +3367,10 @@ rs6000_emit_prologue (void)
+ reg = gen_rtx_REG (reg_mode, 13);
+ insn = emit_move_insn (mem, reg);
+ rs6000_frame_related (insn, sp_reg_rtx, info->total_size, NULL_RTX, NULL_RTX);
++
++ cr_save_regno = 11;
+ }
+ #endif
+- /* If we need to save CR, put it into r12 or r11. Choose r12 except when
+- r12 will be needed by out-of-line gpr save. */
+- if (DEFAULT_ABI == ABI_AIX
+- && !(strategy & (SAVE_INLINE_GPRS | SAVE_NOINLINE_GPRS_SAVES_LR)))
+- cr_save_regno = 11;
+- else if (DEFAULT_ABI == ABI_ELFv2)
+- cr_save_regno = 11;
+- else
+- cr_save_regno = 12;
+ if (!WORLD_SAVE_P (info)
+ && info->cr_save_p
+ && REGNO (frame_reg_rtx) != cr_save_regno
Index: pkgsrc/cross/ppc-morphos-gcc/files/fpic.diff
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/files/fpic.diff:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/files/fpic.diff Sun Jun 15 12:51:35 2025
@@ -0,0 +1,20 @@
+--- gcc/config/rs6000/sysv4.h_orig 2019-11-16 19:26:35.231951385 +0100
++++ gcc/config/rs6000/sysv4.h 2019-11-16 19:27:56.225897027 +0100
+@@ -205,16 +205,17 @@ do { \
+ } \
+ \
+ if (TARGET_RELOCATABLE) \
+ { \
+ if (!flag_pic) \
+ flag_pic = 2; \
+ TARGET_NO_FP_IN_TOC = 1; \
+ } \
++if (flag_pic > 0) {flag_pic=0;warning (0, "-fPIC is unsupported");} \
+ } while (0)
+
+ #ifndef RS6000_BI_ARCH
+ # define SUBSUBTARGET_OVERRIDE_OPTIONS \
+ do { \
+ if ((TARGET_DEFAULT ^ rs6000_isa_flags) & OPTION_MASK_64BIT) \
+ error ("%<-m%s%> not supported in this configuration", \
+ (rs6000_isa_flags & OPTION_MASK_64BIT) ? "64" : "32"); \
Index: pkgsrc/cross/ppc-morphos-gcc/files/gcc-15-morphos.diff
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/files/gcc-15-morphos.diff:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/files/gcc-15-morphos.diff Sun Jun 15 12:51:35 2025
@@ -0,0 +1,5639 @@
+diff -ruN gcc-15.1.0.orig/config/gthr.m4 gcc-15.1.0/config/gthr.m4
+--- gcc-15.1.0.orig/config/gthr.m4 2025-04-25 11:17:59.000000000 +0300
++++ gcc-15.1.0/config/gthr.m4 2025-04-25 15:58:40.260619802 +0300
+@@ -23,6 +23,7 @@
+ vxworks) thread_header=config/gthr-vxworks.h ;;
+ win32) thread_header=config/i386/gthr-win32.h ;;
+ mcf) thread_header=config/i386/gthr-mcf.h ;;
++ morphos) thread_header=config/rs6000/gthr-morphos.h ;;
+ esac
+ AC_SUBST(thread_header)
+ ])
+diff -ruN gcc-15.1.0.orig/config.rpath gcc-15.1.0/config.rpath
+--- gcc-15.1.0.orig/config.rpath 2025-04-25 11:17:59.000000000 +0300
++++ gcc-15.1.0/config.rpath 2025-04-25 15:58:40.260619802 +0300
+@@ -159,6 +159,9 @@
+ ld_shlibs=no
+ fi
+ ;;
++ morphos*)
++ ld_shlibs=no
++ ;;
+ netbsd*)
+ ;;
+ solaris* | sysv5*)
+diff -ruN gcc-15.1.0.orig/configure gcc-15.1.0/configure
+--- gcc-15.1.0.orig/configure 2025-04-25 11:17:59.000000000 +0300
++++ gcc-15.1.0/configure 2025-04-25 15:58:40.264619834 +0300
+@@ -4102,6 +4102,9 @@
+ powerpc-*-beos*)
+ noconfigdirs="$noconfigdirs gdb"
+ ;;
++ powerpc-*-morphos)
++ noconfigdirs="$noconfigdirs gprof target-libgloss target-libssp ${libgcj}"
++ ;;
+ rs6000-*-lynxos*)
+ noconfigdirs="$noconfigdirs gprof"
+ ;;
+diff -ruN gcc-15.1.0.orig/configure.ac gcc-15.1.0/configure.ac
+--- gcc-15.1.0.orig/configure.ac 2025-04-25 11:17:59.000000000 +0300
++++ gcc-15.1.0/configure.ac 2025-04-25 15:58:40.264619834 +0300
+@@ -1319,6 +1319,9 @@
+ powerpc-*-beos*)
+ noconfigdirs="$noconfigdirs gdb"
+ ;;
++ powerpc-*-morphos)
++ noconfigdirs="$noconfigdirs gprof target-libgloss target-libssp ${libgcj}"
++ ;;
+ rs6000-*-lynxos*)
+ noconfigdirs="$noconfigdirs gprof"
+ ;;
+diff -ruN gcc-15.1.0.orig/c++tools/resolver.cc gcc-15.1.0/c++tools/resolver.cc
+--- gcc-15.1.0.orig/c++tools/resolver.cc 2025-04-25 11:17:59.000000000 +0300
++++ gcc-15.1.0/c++tools/resolver.cc 2025-04-25 15:58:40.264619834 +0300
+@@ -41,7 +41,7 @@
+ #else
+ #ifdef HAVE_SYS_MMAN_H
+ #include <sys/mman.h>
+-#define MAPPED_READING 1
++#define MAPPED_READING 0
+ #else
+ #define MAPPED_READING 0
+ #endif
+diff -ruN gcc-15.1.0.orig/c++tools/server.cc gcc-15.1.0/c++tools/server.cc
+--- gcc-15.1.0.orig/c++tools/server.cc 2025-04-25 11:17:59.000000000 +0300
++++ gcc-15.1.0/c++tools/server.cc 2025-04-25 15:58:40.264619834 +0300
+@@ -39,7 +39,7 @@
+ // Network
+ /* Include network stuff first. Excitingly OSX10.14 uses bcmp here, which
+ we poison later! */
+-#if defined (HAVE_AF_UNIX) || defined (HAVE_AF_INET6)
++#if !defined(__MORPHOS__) && (defined (HAVE_AF_UNIX) || defined (HAVE_AF_INET6))
+ /* socket, bind, listen, accept{4} */
+ # define NETWORKING 1
+ # include <sys/socket.h>
+diff -ruN gcc-15.1.0.orig/fixincludes/configure.ac gcc-15.1.0/fixincludes/configure.ac
+--- gcc-15.1.0.orig/fixincludes/configure.ac 2025-04-25 11:17:59.000000000 +0300
++++ gcc-15.1.0/fixincludes/configure.ac 2025-04-25 15:58:40.264619834 +0300
+@@ -53,6 +53,7 @@
+ i?86-*-mingw32* | \
+ x86_64-*-mingw32* | \
+ *-*-beos* | \
++ *-*-morphos* | \
+ *-*-*vms*)
+ TARGET=twoprocess
+ ;;
+diff -ruN gcc-15.1.0.orig/fixincludes/fixlib.h gcc-15.1.0/fixincludes/fixlib.h
+--- gcc-15.1.0.orig/fixincludes/fixlib.h 2025-04-25 11:17:59.000000000 +0300
++++ gcc-15.1.0/fixincludes/fixlib.h 2025-04-25 15:58:40.264619834 +0300
+@@ -32,6 +32,10 @@
+ #include "xregex.h"
+ #include "libiberty.h"
+
++#ifdef __MORPHOS__
++#define fork vfork
++#endif
++
+ #ifndef STDIN_FILENO
+ # define STDIN_FILENO 0
+ #endif
+diff -ruN gcc-15.1.0.orig/fixincludes/Makefile.in gcc-15.1.0/fixincludes/Makefile.in
+--- gcc-15.1.0.orig/fixincludes/Makefile.in 2025-04-25 11:17:59.000000000 +0300
++++ gcc-15.1.0/fixincludes/Makefile.in 2025-04-25 15:58:40.264619834 +0300
+@@ -52,9 +52,9 @@
+ gcc_version := $(shell @get_gcc_base_ver@ $(srcdir)/../gcc/BASE-VER)
+
+ # Directory in which the compiler finds libraries etc.
+-libsubdir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_version)
++libsubdir = $(libdir)/gcc-lib/$(target_noncanonical)/$(gcc_version)
+ # Directory in which the compiler finds executables
+-libexecsubdir = $(libexecdir)/gcc/$(target_noncanonical)/$(gcc_version)
++libexecsubdir = $(libexecdir)/gcc-lib/$(target_noncanonical)/$(gcc_version)
+ # Where our executable files go
+ itoolsdir = $(libexecsubdir)/install-tools
+ # Where our data files go
+diff -ruN gcc-15.1.0.orig/gcc/common/config/rs6000/rs6000-common.cc gcc-15.1.0/gcc/common/config/rs6000/rs6000-common.cc
+--- gcc-15.1.0.orig/gcc/common/config/rs6000/rs6000-common.cc 2025-04-25 11:18:00.000000000 +0300
++++ gcc-15.1.0/gcc/common/config/rs6000/rs6000-common.cc 2025-04-25 15:58:40.264619834 +0300
+@@ -27,6 +27,11 @@
+ #include "opts.h"
+ #include "flags.h"
+
++#ifdef TARGET_USES_MORPHOS_OPT
++/* mclib */
++const char *morphos_mclib_name = (char *)0;
++#endif
++
+ /* Implement TARGET_OPTION_OPTIMIZATION_TABLE. */
+ static const struct default_options rs6000_option_optimization_table[] =
+ {
+@@ -231,7 +236,13 @@
+ case OPT_mrecip:
+ opts->x_rs6000_recip_name = (value) ? "default" : "none";
+ break;
+- }
++
++ #ifdef TARGET_USES_MORPHOS_OPT
++ case OPT_mclib_:
++ morphos_mclib_name = arg;
++ break;
++ #endif
++ }
+ return true;
+ }
+
+diff -ruN gcc-15.1.0.orig/gcc/common.opt gcc-15.1.0/gcc/common.opt
+--- gcc-15.1.0.orig/gcc/common.opt 2025-04-25 11:18:00.000000000 +0300
++++ gcc-15.1.0/gcc/common.opt 2025-04-25 15:58:40.264619834 +0300
+@@ -1269,7 +1269,7 @@
+ Looks for opportunities to reduce stack adjustments and stack references.
+
+ fcommon
+-Common Var(flag_no_common,0) Init(1)
++Common Var(flag_no_common,0)
+ Put uninitialized globals in the common section.
+
+ fcompare-debug
+diff -ruN gcc-15.1.0.orig/gcc/config/rs6000/morphos.c gcc-15.1.0/gcc/config/rs6000/morphos.c
+--- gcc-15.1.0.orig/gcc/config/rs6000/morphos.c 1970-01-01 02:00:00.000000000 +0200
++++ gcc-15.1.0/gcc/config/rs6000/morphos.c 2025-04-25 15:58:40.264619834 +0300
+@@ -0,0 +1,204 @@
++#include "config.h"
++#include "system.h"
++#include "coretypes.h"
++#include "tm.h"
++#include "rtl.h"
++#include "regs.h"
++#include "hard-reg-set.h"
++#include "insn-config.h"
++#include "conditions.h"
++#include "insn-flags.h"
++#include "output.h"
++#include "insn-attr.h"
++#include "flags.h"
++#include "hash-set.h"
++#include "machmode.h"
++#include "vec.h"
++#include "double-int.h"
++#include "input.h"
++#include "alias.h"
++#include "symtab.h"
++#include "wide-int.h"
++#include "inchash.h"
++#include "tree.h"
++#include "cgraph.h"
++#include "fold-const.h"
++#include "stringpool.h"
++#include "varasm.h"
++#include "stor-layout.h"
++#include "hashtab.h"
++#include "function.h"
++#include "statistics.h"
++#include "real.h"
++#include "fixed-value.h"
++#include "expmed.h"
++#include "dojump.h"
++#include "explow.h"
++#include "calls.h"
++//#include "emit-rtl.h"
++#include "stmt.h"
++#include "expr.h"
++#include "reload.h"
++#include "ggc.h"
++#include "langhooks.h"
++#include "target.h"
++#include "tm_p.h"
++#include "diagnostic-core.h"
++#include "toplev.h"
++#include "dominance.h"
++#include "cfg.h"
++#include "cfgrtl.h"
++#include "bitmap.h"
++#include "cfganal.h"
++#include "lcm.h"
++#include "cfgbuild.h"
++#include "cfgcleanup.h"
++#include "predict.h"
++#include "basic-block.h"
++#include "df.h"
++#include "debug.h"
++#include "obstack.h"
++#include "hash-table.h"
++#include "tree-ssa-alias.h"
++#include "internal-fn.h"
++#include "tree-eh.h"
++#include "gimple-expr.h"
++#include "is-a.h"
++#include "gimple.h"
++#include "gimplify.h"
++#include "gimple-iterator.h"
++#include "gimple-fold.h"
++#include "hash-map.h"
++#include "plugin-api.h"
++#include "ipa-ref.h"
++#include "cgraph.h"
++#include "lto-streamer.h"
++#include "lto-section-names.h"
++#include "rtl-iter.h"
++//#include "c-tree.h"
++#include "attribs.h"
++
++/* mclib */
++//const char *morphos_mclib_name = (char *)0;
++
++#ifdef __MORPHOS__
++#define STACKSIZE 2097152
++#define str(s) #s
++#define sstr(s) str(s)
++asm("\n"
++" .section \".rodata\"\n"
++" .align 2\n"
++" .globl __stack\n"
++" .ascii \"StCk\"\n" /* Magic cookie */
++"__stack:\n"
++" .long " sstr(STACKSIZE) "\n"
++" .ascii \"sTcK\"\n" /* Magic cookie */
++" .section \".text\"\n"
++" .align 2\n"
++);
++#endif
++
++/* mbaserel32 */
++rtx morphos_legitimize_baserel_address(rtx addr)
++{
++ rtx dest = gen_reg_rtx (Pmode);
++
++ emit_insn (gen_elf_base_high (dest, gen_rtx_REG (Pmode, 13), addr));
++ emit_insn (gen_elf_base_low (dest, dest, addr));
++
++ return dest;
++}
++
++rtx morphos_legitimize_baserel_address_in_place(rtx addr, rtx dest)
++{
++ emit_insn (gen_elf_base_high (dest, gen_rtx_REG (Pmode, 13), addr));
++ emit_insn (gen_elf_base_low (dest, dest, addr));
++
++ return dest;
++}
++
++bool morphos_baserel_operand(rtx x)
++{
++ if (TARGET_BASEREL)
++ {
++ if (GET_CODE(x) == SYMBOL_REF)
++ return SYMBOL_REF_MORPHOS_BASEREL_P(x);
++ else if (GET_CODE(x) == CONST
++ && GET_CODE(XEXP(x, 0)) == PLUS
++ && GET_CODE(XEXP(XEXP(x, 0), 0)) == SYMBOL_REF
++ && GET_CODE(XEXP(XEXP(x, 0), 1)) == CONST_INT)
++ return morphos_baserel_operand(XEXP(XEXP(x, 0), 0));
++ else if (GET_CODE(x) == LO_SUM)
++ return morphos_baserel_operand(XEXP(x, 1));
++ }
++
++ return false;
++}
++
++
++#if 0
++static int
++morphos_baserel_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
++{
++ return SYMBOL_REF_MORPHOS_BASEREL_P (*x);
++}
++
++
++bool morphos_baserel_referenced_p (rtx x)
++{
++ if (!TARGET_BASEREL)
++ return false;
++
++ return for_each_rtx (&x, &morphos_baserel_symbol_ref_1, 0);
++}
++#else
++bool morphos_baserel_referenced_p (rtx x)
++{
++ subrtx_iterator::array_type array;
++
++ if (!TARGET_BASEREL)
++ return false;
++
++ FOR_EACH_SUBRTX (iter, array, x, NONCONST /* <= not sure about this one */)
++ {
++ if (SYMBOL_REF_MORPHOS_BASEREL_P(*iter))
++ return true;
++ }
++
++ return false;
++}
++#endif
++
++tree morphos_handle_saveds_attribute(tree *node, tree name, tree args ATTRIBUTE_UNUSED, int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
++{
++ if (TREE_CODE (*node) != FUNCTION_TYPE
++ && TREE_CODE (*node) != FIELD_DECL
++ && TREE_CODE (*node) != TYPE_DECL)
++ {
++ warning (OPT_Wattributes, "%qE attribute only applies to functions", name);
++ *no_add_attrs = true;
++ }
++
++ return NULL_TREE;
++}
++
++bool morphos_use_anchors_for_symbol_p (const_rtx symbol)
++{
++ if (TARGET_BASEREL && SYMBOL_REF_MORPHOS_BASEREL_P(symbol))
++ return false;
++ else
++ return default_use_anchors_for_symbol_p (symbol);
++}
++
++const char *morphos_check_pch_target_flags (int old_flags)
++{
++ if ((old_flags ^ target_flags) & MASK_BASEREL)
++ return "created and used with different setting -mbaserel32";
++ return NULL;
++}
++
++void morphos_rs6000_override_options (void)
++{
++ if (rs6000_default_long_calls)
++ global_options.x_TARGET_SCHED_PROLOG = 0;
++}
+diff -ruN gcc-15.1.0.orig/gcc/config/rs6000/morphos.h gcc-15.1.0/gcc/config/rs6000/morphos.h
+--- gcc-15.1.0.orig/gcc/config/rs6000/morphos.h 1970-01-01 02:00:00.000000000 +0200
++++ gcc-15.1.0/gcc/config/rs6000/morphos.h 2025-04-25 15:58:40.264619834 +0300
+@@ -0,0 +1,322 @@
++#undef MD_EXEC_PREFIX
++#undef MD_STARTFILE_PREFIX
++
++#undef PROCESSOR_DEFAULT
++#define PROCESSOR_DEFAULT PROCESSOR_PPC604e
++
++#undef DEFAULT_ABI
++#define DEFAULT_ABI ABI_V4
++
++#undef TARGET_DEFAULT
++#define TARGET_DEFAULT 0
++
++/* Put jump tables in .text to save some relocations */
++#undef JUMP_TABLES_IN_TEXT_SECTION
++#define JUMP_TABLES_IN_TEXT_SECTION 1
++
++#undef EH_FRAME_THROUGH_COLLECT2
++#define EH_FRAME_THROUGH_COLLECT2 1
++
++/* We don't care about compatibility in this case as ABI from 2.95.x is not compatible anyway */
++#undef DEFAULT_VTABLE_THUNKS
++#define DEFAULT_VTABLE_THUNKS 1
++
++/* Use same method of struct return as our 2.95.x */
++#undef DEFAULT_PCC_STRUCT_RETURN
++#define DEFAULT_PCC_STRUCT_RETURN 1
++
++#undef DWARF2_DEBUGGING_INFO
++#define DWARF2_DEBUGGING_INFO 1
++
++#undef PREFERRED_DEBUGGING_TYPE
++#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
++
++#undef DWARF2_UNWIND_INFO
++#define DWARF2_UNWIND_INFO 1
++
++#ifdef TARGET_BASEREL
++#undef USE_TM_CLONE_REGISTRY
++#define USE_TM_CLONE_REGISTRY 0
++#endif
++
++#undef WCHAR_TYPE
++#define WCHAR_TYPE "int"
++
++#undef WCHAR_TYPE_SIZE
++#define WCHAR_TYPE_SIZE 32
++
++
++#define IS_MCLIB(__MCL__) \
++ (strcmp(morphos_mclib_name, __MCL__) == 0)
++
++#undef TARGET_OS_CPP_BUILTINS
++#define TARGET_OS_CPP_BUILTINS() \
++ do \
++ { \
++ builtin_define_std ("__PPC__"); \
++ builtin_define_std ("__powerpc__"); \
++ builtin_define_std ("__MORPHOS__"); \
++ builtin_define_std ("__morphos__"); \
++ builtin_define_std ("AMIGA"); \
++ builtin_define_std ("_AMIGA"); \
++ builtin_define_std ("amigaos"); \
++ builtin_define_std ("__amigaos__"); \
++ builtin_assert ("cpu=powerpc"); \
++ builtin_assert ("machine=powerpc"); \
++ builtin_assert ("system=morphos"); \
++ if ( !morphos_mclib_name || IS_MCLIB("ixemul")) \
++ { \
++ builtin_define_std ("ixemul"); \
++ builtin_define_std ("__ixemul"); \
++ builtin_define_std ("__ixemul__"); \
++ } \
++ else if (IS_MCLIB("libnix")) \
++ { \
++ builtin_define_std ("libnix"); \
++ builtin_define_std ("__libnix"); \
++ builtin_define_std ("__libnix__"); \
++ } \
++ else if (IS_MCLIB("newlib")) \
++ { \
++ builtin_define_std ("newlib"); \
++ builtin_define_std ("__newlib"); \
++ builtin_define_std ("__newlib__"); \
++ } \
++ builtin_define ("__saveds=__attribute__((__saveds__))"); \
++ TARGET_OS_SYSV_CPP_BUILTINS (); \
++ } \
++ while (0)
++
++//void morphos_rs6000_override_options (void);
++//#undef SUBTARGET_OVERRIDE_OPTIONS
++//#define SUBTARGET_OVERRIDE_OPTIONS morphos_rs6000_override_options ()
++
++#undef CPP_SPEC
++#define CPP_SPEC "%{posix: -D_POSIX_SOURCE} %{pthread: -D_REENTRANT} %(cpp_os_default)"
++
++#undef CC1_SPEC
++#define CC1_SPEC "%{G*} %(cc1_cpu)" \
++"%{g: %{!fno-eliminate-unused-debug-symbols: -feliminate-unused-debug-symbols}} \
++%{g1: %{!fno-eliminate-unused-debug-symbols: -feliminate-unused-debug-symbols}} \
++%{msdata: -msdata=default} \
++%{mno-sdata: -msdata=none} \
++%{!mbss-plt: %{!msecure-plt: %(cc1_secure_plt_default)}} \
++%{profile: -p} \
++%{faltivec:-maltivec -include altivec.h} %{fno-altivec:-mno-altivec} \
++%<faltivec %<fno-altivec \
++%{vec:-maltivec -include altivec.h} %{fno-vec:-mno-altivec} \
++%<fvec %<fno-vec "
++
++#undef NATIVE_SYSTEM_HEADER_DIR
++//#define NATIVE_SYSTEM_HEADER_DIR "/include"
++
++#undef LOCAL_INCLUDE_DIR
++#define LOCAL_INCLUDE_DIR "/usr/include"
++
++#undef OSINCLUDE_DIR
++#define OSINCLUDE_DIR "/os-include"
++
++#define SUB3TARGET_OVERRIDE_OPTIONS \
++do \
++{ \
++ if (TARGET_ALTIVEC) \
++ { \
++ rs6000_altivec_abi = 1; \
++ TARGET_ALTIVEC_VRSAVE = 1; \
++ } \
++ if (TARGET_RESIDENT) \
++ { \
++ target_flags |= MASK_BASEREL; \
++ } \
++} while(0)
++
++/* We can't use 'bl' from .init/.fini to .text, so use a trampoline. */
++#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
++static void __attribute__((__used__)) \
++call_ ## FUNC (void) { \
++ asm(SECTION_OP "\n" \
++ "lis 11," #FUNC "@ha\n" \
++ "addi 11,11," #FUNC "@l\n" \
++ "mtctr 11\n" \
++ "bctrl\n" \
++ TEXT_SECTION_ASM_OP); }
++
++#undef ASM_OUTPUT_ALIGNED_DECL_LOCAL
++#define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN) \
++do { \
++ if ((TARGET_BASEREL) && (DECL) && TREE_READONLY (DECL)) \
++ { \
++ switch_to_section (readonly_data_section); \
++ ASM_OUTPUT_ALIGN (FILE, exact_log2 (ALIGN / BITS_PER_UNIT)); \
++ ASM_OUTPUT_LABEL (FILE, NAME); \
++ ASM_OUTPUT_SKIP (FILE, SIZE); \
++ if (!flag_inhibit_size_directive && (SIZE) > 0) \
++ ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE); \
++ } \
++ else if ((DECL) && rs6000_elf_in_small_data_p (DECL)) \
++ { \
++ switch_to_section (sbss_section); \
++ ASM_OUTPUT_ALIGN (FILE, exact_log2 (ALIGN / BITS_PER_UNIT)); \
++ ASM_OUTPUT_LABEL (FILE, NAME); \
++ ASM_OUTPUT_SKIP (FILE, SIZE); \
++ if (!flag_inhibit_size_directive && (SIZE) > 0) \
++ ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE); \
++ } \
++ else \
++ { \
++ fprintf (FILE, "%s", LCOMM_ASM_OP); \
++ assemble_name ((FILE), (NAME)); \
++ fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n", \
++ (SIZE), (ALIGN) / BITS_PER_UNIT); \
++ } \
++ ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \
++} while (0)
++
++#undef ASM_OUTPUT_ALIGNED_BSS
++#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
++do { \
++ ASM_OUTPUT_ALIGNED_DECL_LOCAL (FILE, DECL, NAME, SIZE, ALIGN); \
++} while (0)
++
++#undef ASM_OUTPUT_ALIGNED_DECL_COMMON
++#define ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN) \
++ do \
++ { \
++ if((TARGET_BASEREL) && (DECL) && TREE_READONLY (DECL)) \
++ fprintf ((FILE), "%s", READONLY_DATA_SECTION_ASM_OP ); \
++ else \
++ fprintf ((FILE), "%s", COMMON_ASM_OP); \
++ assemble_name ((FILE), (NAME)); \
++ fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n", \
++ (SIZE), (ALIGN) / BITS_PER_UNIT); \
++ } \
++ while (0)
++
++/* C library */
++#define CPP_MORPHOS_DEFAULT_SPEC "%{mclib=default|!mclib=*:%<mclib=default -mclib=ixemul} %(cpp_ixemul)"
++#define LINK_MORPHOS_DEFAULT_SPEC "%(link_ixemul)"
++#define STARTFILE_MORPHOS_DEFAULT_SPEC "%(startfile_ixemul)"
++#define ENDFILE_MORPHOS_DEFAULT_SPEC "%(endfile_ixemul)"
++
++/* ... ixemul */
++#define CPP_IXEMUL_SPEC "-idirafter /gg/include"
++#define LINK_IXEMUL_SPEC "--flavor=ixemul"
++#define STARTFILE_IXEMUL_SPEC "%{mbaserel32:%{!mresident32:lcrt0i.o%s}} %{mresident32:scrt0i.o%s} %{!mresident32:%{!mbaserel32:crt0i.o%s}} ecrti.o%s crtbegin.o%s"
++#define ENDFILE_IXEMUL_SPEC "crtend.o%s ecrtn.o%s"
++
++/* ... libnix */
++#define CPP_LIBNIX_SPEC "-idirafter /gg/includestd -idirafter /gg/include"
++#define LINK_LIBNIX_SPEC "--flavor=libnix"
++#define STARTFILE_LIBNIX_SPEC "%{mbaserel32:%{!mresident32:libnix/lcrt0i.o%s}} %{mresident32:libnix/scrt0i.o%s} %{!mresident32:%{!mbaserel32:libnix/crt0i.o%s}} ecrti.o%s crtbegin.o%s"
++#define ENDFILE_LIBNIX_SPEC "crtend.o%s ecrtn.o%s"
++
++/* ... newlib */
++#define CPP_NEWLIB_SPEC "-isystem /gg/include-newlib -isystem /gg/includenl -isystem /gg/usr/include-newlib"
++#define LINK_NEWLIB_SPEC "--flavor=newlib"
++#define STARTFILE_NEWLIB_SPEC "%{mbaserel32:%{!mresident32:newlib/lcrt0i.o%s}} %{mresident32:newlib/scrt0i.o%s} %{!mresident32:%{!mbaserel32:newlib/crt0i.o%s}} ecrti.o%s crtbegin.o%s"
++#define ENDFILE_NEWLIB_SPEC "crtend.o%s ecrtn.o%s"
++
++/* ... general */
++#undef CPP_OS_DEFAULT_SPEC
++#define CPP_OS_DEFAULT_SPEC " \
++%{mbaserel32: %{msdata|msdata=default|msdata=sysv: %e-mbaserel32 and -msdata are not compatible}} \
++%{mclib=ixemul: %(cpp_ixemul); \
++mclib=libnix: %(cpp_libnix); \
++mclib=newlib: %(cpp_newlib); \
++mclib=default|!mclib=*: %{mclib=default|!nostdinc: %(cpp_morphos_default)}; \
++: %eInvalid mclib}"
++
++
++#undef LINK_SPEC
++#define LINK_SPEC "\
++--defsym __abox__=1 -Bstatic \
++%{h*} %{v:-V} %{G*} \
++%{Wl,*:%*} %{YP,*} %{R*} \
++%{Qy:} %{!Qn:-Qy} \
++%{mbaserel32: %{msdata|msdata=default|msdata=sysv: %e-mbaserel32 and -msdata are not compatible}} \
++%{mbaserel32: %{!mresident32:-m morphos_baserel --flavor=libb32}} %{mresident32:-m morphos_baserel --datadata-reloc --flavor=libb32} \
++%{mclib=ixemul: %(link_ixemul); \
++mclib=libnix: %(link_libnix); \
++mclib=newlib: %(link_newlib); \
++mclib=default|!mclib=*: %(link_morphos_default); \
++: %eInvalid mclib}"
++
++#undef STARTFILE_SPEC
++#define STARTFILE_SPEC "\
++%{mclib=ixemul: %(startfile_ixemul); \
++mclib=libnix: %(startfile_libnix); \
++mclib=newlib: %(startfile_newlib); \
++mclib=default|!mclib=*: %(startfile_morphos_default); \
++: %eInvalid mclib}"
++
++#undef ENDFILE_SPEC
++#define ENDFILE_SPEC "\
++%{mclib=ixemul: %(endfile_ixemul); \
++mclib=libnix: %(endfile_libnix); \
++mclib=newlib: %(endfile_newlib); \
++mclib=default|!mclib=*: %(endfile_morphos_default); \
++: %eInvalid mclib}"
++
++
++#undef LIB_SPEC
++#define LIB_SPEC "%{!nostdlib: -L/gg/lib -L/gg/usr/lib} --start-group -lc -labox -laboxstubs -lsavl -latomic %{mclib=libnix: -lauto} %{pthread:-lpthread} --end-group"
++
++#undef SUBTARGET_EXTRA_SPECS
++#define SUBTARGET_EXTRA_SPECS \
++ {"cpp_os_default", CPP_OS_DEFAULT_SPEC}, \
++ /* default C runtime */ \
++ {"cpp_morphos_default", CPP_MORPHOS_DEFAULT_SPEC}, \
++ {"link_morphos_default", LINK_MORPHOS_DEFAULT_SPEC}, \
++ {"startfile_morphos_default", STARTFILE_MORPHOS_DEFAULT_SPEC}, \
++ {"endfile_morphos_default", ENDFILE_MORPHOS_DEFAULT_SPEC}, \
++ /* ixemul */ \
++ {"cpp_ixemul", CPP_IXEMUL_SPEC}, \
++ {"link_ixemul", LINK_IXEMUL_SPEC}, \
++ {"startfile_ixemul", STARTFILE_IXEMUL_SPEC}, \
++ {"endfile_ixemul", ENDFILE_IXEMUL_SPEC}, \
++ /* libnix */ \
++ {"cpp_libnix", CPP_LIBNIX_SPEC}, \
++ {"link_libnix", LINK_LIBNIX_SPEC}, \
++ {"startfile_libnix", STARTFILE_LIBNIX_SPEC}, \
++ {"endfile_libnix", ENDFILE_LIBNIX_SPEC}, \
++ /* newlib */ \
++ {"cpp_newlib", CPP_NEWLIB_SPEC}, \
++ {"link_newlib", LINK_NEWLIB_SPEC}, \
++ {"startfile_newlib", STARTFILE_NEWLIB_SPEC}, \
++ {"endfile_newlib", ENDFILE_NEWLIB_SPEC},
++
++/* MorphOS specific attributes */
++#if 1
++#define SUBTARGET_ATTRIBUTE_TABLE \
++ { "saveds", 0, 0, false, true, true, false, morphos_handle_saveds_attribute, NULL }
++
++
++/* Data-Data reloc name */
++#define DATA_DATA_RELOC "drel"
++
++/* MorphOS symbol-ref flags */
++#define SYMBOL_FLAG_MORPHOS_BASEREL (SYMBOL_FLAG_MACH_DEP << 0)
++#define SYMBOL_REF_MORPHOS_BASEREL_P(RTX) \
++ (GET_CODE (RTX) == SYMBOL_REF && ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_MORPHOS_BASEREL) != 0))
++
++
++/* Do not try to mix normal/baserel32 pch files */
++#undef TARGET_CHECK_PCH_TARGET_FLAGS
++#define TARGET_CHECK_PCH_TARGET_FLAGS morphos_check_pch_target_flags
++
++/* Do not use anchors for brel ref objects */
++#undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
++#define TARGET_USE_ANCHORS_FOR_SYMBOL_P morphos_use_anchors_for_symbol_p
++#endif
++
++/* We always use gas */
++#undef TARGET_GAS
++#define TARGET_GAS 1
++
++/* Override TLS support to false */
++#undef HAVE_AS_TLS
++#define HAVE_AS_TLS 0
++
++/* Use morphos.opt */
++extern const char *morphos_mclib_name;
++#define TARGET_USES_MORPHOS_OPT 1
+diff -ruN gcc-15.1.0.orig/gcc/config/rs6000/morphos.opt gcc-15.1.0/gcc/config/rs6000/morphos.opt
+--- gcc-15.1.0.orig/gcc/config/rs6000/morphos.opt 1970-01-01 02:00:00.000000000 +0200
++++ gcc-15.1.0/gcc/config/rs6000/morphos.opt 2025-04-25 15:58:40.264619834 +0300
+@@ -0,0 +1,28 @@
++;
++
++mclib=
++Target RejectNegative Joined
++Select C library to use
++
++mbaserel32
++Target RejectNegative Mask(BASEREL)
++Generate 32-bits relative data access
++
++mresident32
++Target Var(TARGET_RESIDENT)
++Generate reentrant executable
++
++noixemul
++Target RejectNegative Alias(mclib=, libnix)
++
++faltivec
++Driver
++
++fvec
++Driver
++
++Waltivec-long-deprecated
++Driver Alias(mwarn-altivec-long)
++
++pthread
++Driver
+diff -ruN gcc-15.1.0.orig/gcc/config/rs6000/morphos.opt.urls gcc-15.1.0/gcc/config/rs6000/morphos.opt.urls
+--- gcc-15.1.0.orig/gcc/config/rs6000/morphos.opt.urls 1970-01-01 02:00:00.000000000 +0200
++++ gcc-15.1.0/gcc/config/rs6000/morphos.opt.urls 2025-04-25 15:58:40.264619834 +0300
+@@ -0,0 +1,4 @@
++; Autogenerated by regenerate-opt-urls.py from gcc/config/rs6000/morphos.opt and generated HTML
++
++; skipping UrlSuffix for 'mcmodel=' due to finding no URLs
++
+diff -ruN gcc-15.1.0.orig/gcc/config/rs6000/morphos-protos.h gcc-15.1.0/gcc/config/rs6000/morphos-protos.h
+--- gcc-15.1.0.orig/gcc/config/rs6000/morphos-protos.h 1970-01-01 02:00:00.000000000 +0200
++++ gcc-15.1.0/gcc/config/rs6000/morphos-protos.h 2025-04-25 15:58:40.264619834 +0300
+@@ -0,0 +1,21 @@
++#ifndef GCC_MORPHOS_PROTOS_H
++#define GCC_MORPHOS_PROTOS_H
++
++extern const char *morphos_check_pch_target_flags (int old_flags);
++
++#ifdef RTX_CODE
++
++extern rtx morphos_legitimize_baserel_address(rtx);
++extern rtx morphos_legitimize_baserel_address_in_place(rtx, rtx);
++extern bool morphos_baserel_operand(rtx);
++extern bool morphos_baserel_referenced_p (rtx);
++extern bool morphos_use_anchors_for_symbol_p (const_rtx);
++
++#ifdef TREE_CODE
++extern int morphos_not_baserel_tree_p(tree);
++extern tree morphos_handle_saveds_attribute (tree *, tree, tree, int, bool*);
++#endif /* TREE_CODE */
++
++#endif /* RTX_CODE */
++
++#endif /* GCC_MORPHOS_PROTOS_H */
+diff -ruN gcc-15.1.0.orig/gcc/config/rs6000/morphos-stdint.h gcc-15.1.0/gcc/config/rs6000/morphos-stdint.h
+--- gcc-15.1.0.orig/gcc/config/rs6000/morphos-stdint.h 1970-01-01 02:00:00.000000000 +0200
++++ gcc-15.1.0/gcc/config/rs6000/morphos-stdint.h 2025-04-25 15:58:40.264619834 +0300
+@@ -0,0 +1,51 @@
++/* Definitions for <stdint.h> types on systems using AIX.
++ Copyright (C) 2009-2018 Free Software Foundation, Inc.
++
++This file is part of GCC.
++
++GCC is free software; you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation; either version 3, or (at your option)
++any later version.
++
++GCC is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with GCC; see the file COPYING3. If not see
++<http://www.gnu.org/licenses/>. */
++
++#define SIG_ATOMIC_TYPE "int"
++
++#define INT8_TYPE "signed char"
++#define INT16_TYPE "short int"
++#define INT32_TYPE "int"
++#define INT64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int")
++#define UINT8_TYPE "unsigned char"
++#define UINT16_TYPE "short unsigned int"
++#define UINT32_TYPE "unsigned int"
++#define UINT64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int")
++
++#define INT_LEAST8_TYPE "signed char"
++#define INT_LEAST16_TYPE "short int"
++#define INT_LEAST32_TYPE "int"
++#define INT_LEAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int")
++#define UINT_LEAST8_TYPE "unsigned char"
++#define UINT_LEAST16_TYPE "short unsigned int"
++#define UINT_LEAST32_TYPE "unsigned int"
++#define UINT_LEAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int")
++
++#define INT_FAST8_TYPE "signed char"
++#define INT_FAST16_TYPE "short int"
++#define INT_FAST32_TYPE "int"
++#define INT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int")
++#define UINT_FAST8_TYPE "unsigned char"
++#define UINT_FAST16_TYPE "short unsigned int"
++#define UINT_FAST32_TYPE "unsigned int"
++#define UINT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int")
++
++#define INTPTR_TYPE "long int"
++#define UINTPTR_TYPE "long unsigned int"
++
+diff -ruN gcc-15.1.0.orig/gcc/config/rs6000/rs6000.cc gcc-15.1.0/gcc/config/rs6000/rs6000.cc
+--- gcc-15.1.0.orig/gcc/config/rs6000/rs6000.cc 2025-04-25 11:18:00.000000000 +0300
++++ gcc-15.1.0/gcc/config/rs6000/rs6000.cc 2025-06-10 09:18:42.000241751 +0300
+@@ -1366,7 +1366,11 @@
+ #define TARGET_HAVE_TLS HAVE_AS_TLS
+
+ #undef TARGET_CANNOT_FORCE_CONST_MEM
++#ifdef TARGET_BASEREL
++#define TARGET_CANNOT_FORCE_CONST_MEM rs6000_cannot_force_const_mem_baserel
++#else
+ #define TARGET_CANNOT_FORCE_CONST_MEM rs6000_cannot_force_const_mem
++#endif
+
+ #undef TARGET_DELEGITIMIZE_ADDRESS
+ #define TARGET_DELEGITIMIZE_ADDRESS rs6000_delegitimize_address
+@@ -8247,6 +8251,11 @@
+ #if TARGET_ELF
+ rtx sym_ref;
+
++#ifdef TARGET_BASEREL
++ if (TARGET_BASEREL)
++ return 0;
++#endif
++
+ if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
+ return 0;
+
+@@ -9169,6 +9178,14 @@
+ return rs6000_legitimize_tls_address (x, model);
+ }
+
++#ifdef TARGET_BASEREL
++ if (TARGET_BASEREL &&
++ morphos_baserel_operand(x))
++ {
++ return morphos_legitimize_baserel_address(x);
++ }
++#endif
++
+ extra = 0;
+ switch (mode)
+ {
+@@ -9839,6 +9856,14 @@
+ return TARGET_ELF && tls_referenced_p (x);
+ }
+
++#ifdef TARGET_BASEREL
++static bool
++rs6000_cannot_force_const_mem_baserel (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
++{
++ return rs6000_cannot_force_const_mem((machine_mode)0, x) || morphos_baserel_referenced_p(x);
++}
++#endif
++
+ /* Return true iff the given SYMBOL_REF refers to a constant pool entry
+ that we have put in the TOC, or for cmodel=medium, if the SYMBOL_REF
+ can be addressed relative to the toc pointer. */
+@@ -11032,6 +11057,25 @@
+ operands[1] = tmp;
+ }
+
++#ifdef TARGET_BASEREL
++ if (TARGET_BASEREL &&
++ morphos_baserel_operand (operands[1]))
++ {
++ if (can_create_pseudo_p())
++ {
++ operands[1] = morphos_legitimize_baserel_address (operands[1]);
++ }
++ else if (GET_CODE(operands[0]) == REG)
++ {
++ operands[1] = morphos_legitimize_baserel_address_in_place (operands[1], operands[0]);
++ }
++ else
++ {
++ gcc_assert(0);
++ }
++ }
++#endif
++
+ /* 128-bit constant floating-point values on Darwin should really be loaded
+ as two parts. However, this premature splitting is a problem when DFmode
+ values can go into Altivec registers. */
+@@ -11291,7 +11335,15 @@
+ target, operands[1]));
+ return;
+ }
+-
++#ifdef TARGET_BASEREL
++ if (TARGET_BASEREL &&
++ morphos_baserel_operand(operands[1]))
++ {
++ emit_insn (gen_elf_base_high (target, gen_rtx_REG (Pmode, 13), operands[1]));
++ emit_insn (gen_elf_base_low (operands[0], target, operands[1]));
++ return;
++ }
++#endif
+ emit_insn (gen_elf_high (target, operands[1]));
+ emit_insn (gen_elf_low (operands[0], target, operands[1]));
+ return;
+@@ -14277,6 +14329,11 @@
+ UNITS_PER_WORD),
+ 0));
+
++#ifdef TARGET_BASEREL
++ if (TARGET_BASEREL && morphos_baserel_operand(x))
++ fprintf (file, "@%s", DATA_DATA_RELOC);
++ else
++#endif
+ if (small_data_operand (x, GET_MODE (x)))
+ fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
+ reg_names[SMALL_DATA_REG]);
+@@ -14533,6 +14590,11 @@
+ XEXP (XEXP (x, 0), 0), 8));
+ else
+ output_address (mode, XEXP (adjust_address_nv (x, SImode, 8), 0));
++#ifdef TARGET_BASEREL
++ if (TARGET_BASEREL && morphos_baserel_operand(x))
++ fprintf (file, "@%s", DATA_DATA_RELOC);
++ else
++#endif
+ if (small_data_operand (x, GET_MODE (x)))
+ fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
+ reg_names[SMALL_DATA_REG]);
+@@ -14587,6 +14649,11 @@
+ XEXP (XEXP (x, 0), 0), 12));
+ else
+ output_address (mode, XEXP (adjust_address_nv (x, SImode, 12), 0));
++#ifdef TARGET_BASEREL
++ if (TARGET_BASEREL && morphos_baserel_operand(x))
++ fprintf (file, "@%s", DATA_DATA_RELOC);
++ else
++#endif
+ if (small_data_operand (x, GET_MODE (x)))
+ fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
+ reg_names[SMALL_DATA_REG]);
+@@ -14718,6 +14785,11 @@
+ || GET_CODE (x) == LABEL_REF)
+ {
+ output_addr_const (file, x);
++#ifdef TARGET_BASEREL
++ if (TARGET_BASEREL && morphos_baserel_operand(x))
++ fprintf (file, "@%s", DATA_DATA_RELOC);
++ else
++#endif
+ if (small_data_operand (x, GET_MODE (x)))
+ fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
+ reg_names[SMALL_DATA_REG]);
+@@ -14757,6 +14829,11 @@
+ && CONSTANT_P (XEXP (x, 1)))
+ {
+ output_addr_const (file, XEXP (x, 1));
++#ifdef TARGET_BASEREL
++ if (TARGET_BASEREL && morphos_baserel_operand(x))
++ fprintf (file, "@%s@l(%s)", DATA_DATA_RELOC, reg_names[ REGNO (XEXP (x, 0)) ]);
++ else
++#endif
+ fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
+ }
+ #endif
+@@ -14881,6 +14958,22 @@
+ return default_assemble_integer (x, size, aligned_p);
+ }
+
++#ifdef TARGET_USES_MORPHOS_OPT
++
++/* Implement `TARGET_ADDR_SPACE_ZERO_ADDRESS_VALID'. Fixes loading
++ SysBase from address 4. */
++
++static bool
++rs6000_addr_space_zero_address_valid (addr_space_t)
++{
++ return true;
++}
++
++#undef TARGET_ADDR_SPACE_ZERO_ADDRESS_VALID
++#define TARGET_ADDR_SPACE_ZERO_ADDRESS_VALID rs6000_addr_space_zero_address_valid
++
++#endif /* TARGET_USES_MORPHOS_OPT */
++
+ /* Return a template string for assembly to emit when making an
+ external call. FUNOP is the call mem argument operand number. */
+
+@@ -20843,6 +20936,10 @@
+ return default_elf_select_rtx_section (mode, x, align);
+ }
+
++
++static int
++rs6000_elf_reloc_rw_mask (void);
++
+ /* For a SYMBOL_REF, set generic flags and then perform some
+ target-specific processing.
+
+@@ -20869,6 +20966,36 @@
+ memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
+ XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
+ }
++
++#ifdef TARGET_BASEREL
++ if (TARGET_BASEREL)
++ {
++ rtx symbol = XEXP (rtl, 0);
++
++ if(TREE_CODE (decl) == VAR_DECL &&
++ !TREE_READONLY(decl) &&
++ GET_CODE (symbol) == SYMBOL_REF)
++ {
++ const char *name = DECL_SECTION_NAME (decl);
++ if (name == NULL || (strncmp(name, ".ctors", 6) != 0 && strncmp(name, ".dtors", 6) != 0))
++ {
++ switch (categorize_decl_for_section (decl, rs6000_elf_reloc_rw_mask()))
++ {
++ case SECCAT_DATA:
++ case SECCAT_SDATA:
++ case SECCAT_TDATA:
++ case SECCAT_BSS:
++ case SECCAT_SBSS:
++ case SECCAT_TBSS:
++ SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_MORPHOS_BASEREL;
++ break;
++ default:
++ break;
++ }
++ }
++ }
++ }
++#endif
+ }
+
+ static inline bool
+diff -ruN gcc-15.1.0.orig/gcc/config/rs6000/rs6000-internal.h gcc-15.1.0/gcc/config/rs6000/rs6000-internal.h
+--- gcc-15.1.0.orig/gcc/config/rs6000/rs6000-internal.h 2025-04-25 11:18:00.000000000 +0300
++++ gcc-15.1.0/gcc/config/rs6000/rs6000-internal.h 2025-04-25 15:58:40.268619866 +0300
+@@ -62,6 +62,11 @@
+ int altivec_padding_size; /* size of altivec alignment padding */
+ HOST_WIDE_INT total_size; /* total bytes allocated for stack */
+ int savres_strategy;
++#ifdef TARGET_BASEREL
++ int baserel_save_p; /* true if the baserel register needs to be saved */
++ int baserel_save_offset; /* offset to save baserel register */
++ int baserel_size; /* size of saved baserel register */
++#endif
+ } rs6000_stack_t;
+
+
+diff -ruN gcc-15.1.0.orig/gcc/config/rs6000/rs6000-logue.cc gcc-15.1.0/gcc/config/rs6000/rs6000-logue.cc
+--- gcc-15.1.0.orig/gcc/config/rs6000/rs6000-logue.cc 2025-04-25 11:18:00.000000000 +0300
++++ gcc-15.1.0/gcc/config/rs6000/rs6000-logue.cc 2025-04-25 15:58:40.268619866 +0300
+@@ -722,6 +722,18 @@
+ && info->calls_p)
+ info->rop_hash_size = 8;
+
++#ifdef TARGET_BASEREL
++ if (TARGET_BASEREL
++ && current_function_decl
++ && lookup_attribute ("saveds", TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
++ {
++ info->baserel_save_p = 1;
++ info->baserel_size = reg_size;
++ info->calls_p = 1;
++ df_set_regs_ever_live (13, true);
++ }
++#endif /* TARGET_BASEREL */
++
+ /* Determine if we need to save the condition code registers. */
+ if (save_reg_p (CR2_REGNO)
+ || save_reg_p (CR3_REGNO)
+@@ -829,7 +841,12 @@
+ case ABI_V4:
+ info->fp_save_offset = -info->fp_size;
+ info->gp_save_offset = info->fp_save_offset - info->gp_size;
++#ifdef TARGET_BASEREL
++ info->baserel_save_offset = info->gp_save_offset - info->baserel_size;
++ info->cr_save_offset = info->baserel_save_offset - info->cr_size;
++#else
+ info->cr_save_offset = info->gp_save_offset - info->cr_size;
++#endif
+
+ if (TARGET_ALTIVEC_ABI)
+ {
+@@ -865,6 +882,10 @@
+ + info->vrsave_size,
+ save_align);
+
++#ifdef TARGET_BASEREL
++ info->save_size += RS6000_ALIGN (info->baserel_size, save_align);
++#endif
++
+ non_fixed_size = info->vars_size + info->parm_size + info->save_size;
+
+ info->total_size = RS6000_ALIGN (non_fixed_size + info->fixed_size,
+@@ -971,6 +992,11 @@
+ if (info->cr_save_p)
+ fprintf (stderr, "\tcr_save_p = %5d\n", info->cr_save_p);
+
++#ifdef TARGET_BASEREL
++ if (info->baserel_save_p)
++ fprintf (stderr, "\tbaserel_save_p = %5d\n", info->baserel_save_p);
++#endif
++
+ if (info->vrsave_mask)
+ fprintf (stderr, "\tvrsave_mask = 0x%x\n", info->vrsave_mask);
+
+@@ -1007,6 +1033,11 @@
+ if (info->varargs_save_offset)
+ fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
+
++#ifdef TARGET_BASEREL
++ if (info->baserel_save_offset && TARGET_BASEREL)
++ fprintf (stderr, "\tbaserel_save_offset = %5d\n", info->baserel_save_offset);
++#endif
++
+ if (info->total_size)
+ fprintf (stderr, "\ttotal_size = " HOST_WIDE_INT_PRINT_DEC"\n",
+ info->total_size);
+@@ -1033,6 +1064,11 @@
+ if (info->vrsave_size)
+ fprintf (stderr, "\tvrsave_size = %5d\n", info->vrsave_size);
+
++#ifdef TARGET_BASEREL
++ if (info->baserel_size && TARGET_BASEREL)
++ fprintf (stderr, "\tbaserel_size = %5d\n", info->baserel_size);
++#endif
++
+ if (info->altivec_padding_size)
+ fprintf (stderr, "\taltivec_padding_size= %5d\n",
+ info->altivec_padding_size);
+@@ -1147,6 +1183,16 @@
+ else
+ fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (exp)));
+
++#ifdef TARGET_BASEREL
++ /* We can't do it if the calling function is baserel with saveds attribute. */
++ if (TARGET_BASEREL
++ && current_function_decl
++ && lookup_attribute ("saveds", TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
++ {
++ return false;
++ }
++#endif
++
+ /* We can't do it if the called function has more vector parameters
+ than the current function; there's nowhere to put the VRsave code. */
+ if (TARGET_ALTIVEC_ABI
+@@ -2720,6 +2766,12 @@
+ || bitmap_bit_p (kill, LR_REGNO))
+ bitmap_set_bit (components, 0);
+
++#ifdef TARGET_BASEREL
++ /* Always mark LR saving to occur before basic_block if "saveds" function */
++ if (TARGET_BASEREL && info->baserel_save_p)
++ bitmap_set_bit (components, 0);
++#endif
++
+ /* The TOC save. */
+ if (bitmap_bit_p (in, TOC_REGNUM)
+ || bitmap_bit_p (gen, TOC_REGNUM)
+@@ -3281,6 +3333,22 @@
+ emit_insn (gen_hashst (mem, reg0));
+ }
+
++#ifdef TARGET_BASEREL
++ if (info->baserel_save_p && TARGET_BASEREL)
++ {
++ /* Store r13 */
++ rtx addr, reg, mem;
++ rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 1);
++
++ addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
++ GEN_INT (info->baserel_save_offset + frame_off));
++ mem = gen_frame_mem (reg_mode, addr);
++
++ reg = gen_rtx_REG (reg_mode, 13);
++ insn = emit_move_insn (mem, reg);
++ rs6000_frame_related (insn, sp_reg_rtx, info->total_size, NULL_RTX, NULL_RTX);
++ }
++#endif
+ /* If we need to save CR, put it into r12 or r11. Choose r12 except when
+ r12 will be needed by out-of-line gpr save. */
+ if (DEFAULT_ABI == ABI_AIX
+@@ -3873,6 +3941,18 @@
+ emit_move_insn (lr, gen_rtx_REG (Pmode, 0));
+ }
+ #endif
++#ifdef TARGET_BASEREL
++ if (info->baserel_save_p && TARGET_BASEREL)
++ {
++ /* Call __restore_r13 */
++ rtx restore_r13_ref = gen_rtx_SYMBOL_REF (Pmode, "__restore_r13");
++ SYMBOL_REF_FLAGS (restore_r13_ref) |= (SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_FUNCTION);
++
++ emit_call_insn (gen_call (gen_rtx_MEM (SImode, restore_r13_ref), const0_rtx, const0_rtx));
++
++ emit_insn (gen_blockage ());
++ }
++#endif
+
+ /* If we need to, save the TOC register after doing the stack setup.
+ Do not emit eh frame info for this save. The unwinder wants info,
+@@ -3935,6 +4015,10 @@
+ fprintf (file, "\t.extern %s\n", name);
+ }
+ }
++#ifdef TARGET_BASEREL
++ if (info->baserel_save_p && TARGET_BASEREL)
++ fprintf (file, "\t.extern __restore_r13\n");
++#endif
+ }
+
+ /* Write function prologue. */
+@@ -4880,6 +4964,24 @@
+ }
+ }
+
++#ifdef TARGET_BASEREL
++ if (info->baserel_save_p && TARGET_BASEREL)
++ {
++ rtx addr, mem, reg;
++
++ /* Restore r13 */
++ addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
++ GEN_INT (info->baserel_save_offset + frame_off));
++ mem = gen_frame_mem (reg_mode, addr);
++
++ reg = gen_rtx_REG (reg_mode, 13);
++ emit_move_insn (reg, mem);
++
++ /* Mark register as used. */
++ emit_insn (gen_rtx_USE (VOIDmode, reg));
++ }
++#endif
++
+ /* Restore GPRs. This is done as a PARALLEL if we are using
+ the load-multiple instructions. */
+ if (!restoring_GPRs_inline)
+diff -ruN gcc-15.1.0.orig/gcc/config/rs6000/rs6000.md gcc-15.1.0/gcc/config/rs6000/rs6000.md
+--- gcc-15.1.0.orig/gcc/config/rs6000/rs6000.md 2025-04-25 11:18:00.000000000 +0300
++++ gcc-15.1.0/gcc/config/rs6000/rs6000.md 2025-04-25 15:58:40.268619866 +0300
+@@ -11341,6 +11341,25 @@
+ [(set (match_dup 0) (high:P (match_dup 1)))
+ (set (match_dup 0) (lo_sum:P (match_dup 0) (match_dup 1)))])
+
++;;
++;;
++;;
++(define_insn "elf_base_high"
++ [(set (match_operand:SI 0 "gpc_reg_operand" "=b")
++ (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
++ (high:SI (match_operand 2 "" ""))))]
++ "TARGET_ELF && ! TARGET_64BIT && TARGET_BASEREL"
++ "{addiu|addis} %0,%1,%2@drel@ha")
++
++(define_insn "elf_base_low"
++ [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
++ (lo_sum:SI (match_operand:SI 1 "gpc_reg_operand" "b,!*r")
++ (match_operand 2 "" "")))]
++ "TARGET_ELF && ! TARGET_64BIT && TARGET_BASEREL && morphos_baserel_operand(operands[2])"
++ "@
++ {cal|la} %0,%2@drel@l(%1)
++ {ai|addic} %0,%1,%K2")
++
+ ;; Elf specific ways of loading addresses for non-PIC code.
+ ;; The output of this could be r0, but we make a very strong
+ ;; preference for a base register because it will usually
+diff -ruN gcc-15.1.0.orig/gcc/config/rs6000/t-morphos gcc-15.1.0/gcc/config/rs6000/t-morphos
+--- gcc-15.1.0.orig/gcc/config/rs6000/t-morphos 1970-01-01 02:00:00.000000000 +0200
++++ gcc-15.1.0/gcc/config/rs6000/t-morphos 2025-04-25 15:58:40.268619866 +0300
+@@ -0,0 +1,34 @@
++MULTILIB_OPTIONS = mbaserel32 mclib=libnix
++MULTILIB_DIRNAMES = libb32 libnix
++MULTILIB_MATCHES = mbaserel32=mresident32
++MULTILIB_EXTRA_OPTS = mstrict-align
++
++EXTRA_MULTILIB_PARTS = crtbegin$(objext) crtend$(objext) ecrti$(objext) ecrtn$(objext) ncrti$(objext) ncrtn$(objext)
++
++LIBGCC = stmp-multilib
++INSTALL_LIBGCC = install-multilib
++
++TARGET_LIBGCC2_CFLAGS =
++CRTSTUFF_T_CFLAGS = -msdata=none -mstrict-align
++
++# We want fine grained libraries, so use the new code to build the
++# floating point emulation libraries.
++FPBIT = fp-bit.c
++DPBIT = dp-bit.c
++
++# Extra
++morphos.o: $(srcdir)/config/rs6000/morphos.c $(srcdir)/config/rs6000/morphos-protos.h $(CONFIG_H)
++ $(COMPILE) $<
++
++NATIVE_SYSTEM_HEADER_DIR = /include
++
++# Don't run fixinclude
++STMP_FIXINC = stmp-sdefixinc
++stmp-sdefixinc: gsyslimits.h
++ rm -rf include; mkdir include
++ chmod a+rx include
++ rm -f include/syslimits.h
++ cp $(srcdir)/gsyslimits.h include/syslimits.h
++ chmod a+r include/syslimits.h
++ $(STAMP) stmp-sdefixinc
++
+diff -ruN gcc-15.1.0.orig/gcc/config.gcc gcc-15.1.0/gcc/config.gcc
+--- gcc-15.1.0.orig/gcc/config.gcc 2025-04-25 11:18:00.000000000 +0300
++++ gcc-15.1.0/gcc/config.gcc 2025-04-25 15:58:40.268619866 +0300
+@@ -3060,6 +3060,15 @@
+ extra_options="${extra_options} rs6000/sysv4.opt rs6000/linux64.opt"
+ tmake_file="${tmake_file} rs6000/t-fprules rs6000/t-rtems rs6000/t-ppccomm"
+ ;;
++powerpc-*-morphos*)
++ tm_file="${tm_file} elfos.h usegas.h rs6000/sysv4.h rs6000/morphos.h rs6000/morphos-stdint.h"
++ tm_p_file="${tm_p_file} rs6000/morphos-protos.h"
++ extra_options="${extra_options} rs6000/sysv4.opt rs6000/morphos.opt"
++ extra_parts="crtbegin.o crtend.o"
++ tmake_file="${tmake_file} t-dfprules rs6000/t-fprules rs6000/t-fprules-fpbit rs6000/t-ppcgas rs6000/t-ppcos rs6000/t-ppccomm rs6000/t-morphos"
++ extra_objs="${extra_objs} morphos.o"
++ use_gcc_tgmath=yes
++ ;;
+ powerpc*-*-linux*)
+ tm_file="${tm_file} elfos.h gnu-user.h linux.h freebsd-spec.h rs6000/sysv4.h"
+ extra_options="${extra_options} rs6000/sysv4.opt"
+diff -ruN gcc-15.1.0.orig/gcc/config.host gcc-15.1.0/gcc/config.host
+--- gcc-15.1.0.orig/gcc/config.host 2025-04-25 11:18:00.000000000 +0300
++++ gcc-15.1.0/gcc/config.host 2025-04-25 15:58:40.272619898 +0300
+@@ -260,6 +260,10 @@
+ out_host_hook_obj="${out_host_hook_obj} host-ppc64-darwin.o"
+ host_xmake_file="${host_xmake_file} rs6000/x-darwin64"
+ ;;
++ p*pc-*-morphos*)
++ prefix=/gg
++ local_prefix=/gg
++ ;;
+ rs6000-ibm-aix* | powerpc-ibm-aix*)
+ host_xmake_file="${host_xmake_file} rs6000/x-aix"
+ ;;
+diff -ruN gcc-15.1.0.orig/gcc/configure gcc-15.1.0/gcc/configure
+--- gcc-15.1.0.orig/gcc/configure 2025-04-25 11:21:27.000000000 +0300
++++ gcc-15.1.0/gcc/configure 2025-04-25 15:58:40.272619898 +0300
+@@ -10801,7 +10801,7 @@
+ # read() to the same fd. The only system known to have a problem here
+ # is VMS, where text files have record structure.
+ case "$host_os" in
+- *vms* | ultrix*)
++ *vms* | morphos* | ultrix*)
+ gcc_cv_func_mmap_file=no ;;
+ *)
+ gcc_cv_func_mmap_file=yes;;
+@@ -10825,7 +10825,7 @@
+ # Systems known to be in this category are Windows (all variants),
+ # VMS, and Darwin.
+ case "$host_os" in
+- *vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00)
++ *vms* | cygwin* | pe | mingw* | darwin* | ultrix* | morphos* | hpux10* | hpux11.00)
+ gcc_cv_func_mmap_dev_zero=no ;;
+ *)
+ gcc_cv_func_mmap_dev_zero=yes;;
+@@ -10882,7 +10882,7 @@
+ # above for use of /dev/zero.
+ # Systems known to be in this category are Windows, VMS, and SCO Unix.
+ case "$host_os" in
+- *vms* | cygwin* | pe | mingw* | sco* | udk* )
++ *vms* | cygwin* | pe | mingw* | sco* | morphos* | udk* )
+ gcc_cv_func_mmap_anon=no ;;
+ *)
+ gcc_cv_func_mmap_anon=yes;;
+@@ -10993,7 +10993,7 @@
+ fi
+ if test "x$ac_cv_func_fork_works" = xcross; then
+ case $host in
+- *-*-amigaos* | *-*-msdosdjgpp*)
++ *-*-amigaos* | *-*-morphos* | *-*-msdosdjgpp*)
+ # Override, as these systems have only a dummy fork() stub
+ ac_cv_func_fork_works=no
+ ;;
+@@ -13165,7 +13165,7 @@
+ target_thread_file='single'
+ ;;
+ aix | dce | lynx | mipssde | posix | rtems | \
+- single | tpf | vxworks | win32 | mcf)
++ single | tpf | vxworks | win32 | mcf | morphos)
+ target_thread_file=${enable_threads}
+ ;;
+ *)
+@@ -14960,6 +14960,10 @@
+ *)
+ enable_frame_pointer=yes
+ ;;
++*-*-*morphos*)
++ # Under MorphOS, don't try to use fork.
++ ac_cv_func_fork_works=no
++ ;;
+ esac
+
+ fi
+@@ -15976,7 +15980,7 @@
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+- amigaos*)
++ amigaos* | morphos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+@@ -24988,7 +24992,7 @@
+
+ else
+
+-if test -x "$DEFAULT_ASSEMBLER"; then
++if test -n "$DEFAULT_ASSEMBLER" -a -x "$DEFAULT_ASSEMBLER"; then
+ gcc_cv_as="$DEFAULT_ASSEMBLER"
+ elif test -f $gcc_cv_as_gas_srcdir/configure.ac \
+ && test -f ../gas/Makefile \
+@@ -25100,7 +25104,7 @@
+
+ else
+
+-if test -x "$DEFAULT_LINKER"; then
++if test -n "$DEFAULT_LINKER" -a -x "$DEFAULT_LINKER"; then
+ gcc_cv_ld="$DEFAULT_LINKER"
+ elif test $install_gold_as_default = yes \
+ && test -f $gcc_cv_ld_gold_srcdir/configure.ac \
+diff -ruN gcc-15.1.0.orig/gcc/configure.ac gcc-15.1.0/gcc/configure.ac
+--- gcc-15.1.0.orig/gcc/configure.ac 2025-04-25 11:18:00.000000000 +0300
++++ gcc-15.1.0/gcc/configure.ac 2025-04-25 15:58:40.272619898 +0300
+@@ -1619,6 +1619,10 @@
+ # just force it.
+ ac_cv_func_vfork_works=yes
+ ;;
++*-*-*morphos*)
++ # Under MorphOS, don't try to use fork.
++ ac_cv_func_fork_works=no
++ ;;
+ esac
+ AC_FUNC_FORK
+
+@@ -2090,7 +2094,7 @@
+ target_thread_file='single'
+ ;;
+ aix | dce | lynx | mipssde | posix | rtems | \
+- single | tpf | vxworks | win32 | mcf)
++ single | tpf | vxworks | win32 | mcf | morphos)
+ target_thread_file=${enable_threads}
+ ;;
+ *)
+diff -ruN gcc-15.1.0.orig/gcc/coretypes.h gcc-15.1.0/gcc/coretypes.h
+--- gcc-15.1.0.orig/gcc/coretypes.h 2025-04-25 11:18:00.000000000 +0300
++++ gcc-15.1.0/gcc/coretypes.h 2025-04-25 15:58:40.276619928 +0300
+@@ -375,11 +375,13 @@
+ in target.h. */
+ typedef int reg_class_t;
+
++#ifdef __cplusplus
+ class rtl_opt_pass;
+
+ namespace gcc {
+ class context;
+ }
++#endif
+
+ typedef std::pair <tree, tree> tree_pair;
+ typedef std::pair <const char *, int> string_int_pair;
+diff -ruN gcc-15.1.0.orig/gcc/cppdefault.cc gcc-15.1.0/gcc/cppdefault.cc
+--- gcc-15.1.0.orig/gcc/cppdefault.cc 2025-04-25 11:18:00.000000000 +0300
++++ gcc-15.1.0/gcc/cppdefault.cc 2025-04-25 15:58:40.276619928 +0300
+@@ -40,6 +40,10 @@
+ = INCLUDE_DEFAULTS;
+ #else
+ = {
++#ifdef OSINCLUDE_DIR
++ { OSINCLUDE_DIR, NATIVE_SYSTEM_HEADER_COMPONENT, 0, 0, 1, 2 },
++ { OSINCLUDE_DIR, NATIVE_SYSTEM_HEADER_COMPONENT, 0, 0, 1, 0 },
++#endif
+ #ifdef GPLUSPLUS_INCLUDE_DIR
+ /* Pick up GNU C++ generic include files. */
+ { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1,
+diff -ruN gcc-15.1.0.orig/gcc/gcov-io.h gcc-15.1.0/gcc/gcov-io.h
+--- gcc-15.1.0.orig/gcc/gcov-io.h 2025-04-25 11:18:00.000000000 +0300
++++ gcc-15.1.0/gcc/gcov-io.h 2025-04-25 15:58:40.276619928 +0300
+@@ -201,7 +201,7 @@
+ #endif
+ #endif
+
+-#if defined (HOST_HAS_F_SETLKW)
++#if defined (HOST_HAS_F_SETLKW) && !defined (TARGET_USES_MORPHOS_OPT)
+ #define GCOV_LOCKED 1
+ #else
+ #define GCOV_LOCKED 0
+diff -ruN gcc-15.1.0.orig/gcc/ginclude/stddef.h gcc-15.1.0/gcc/ginclude/stddef.h
+--- gcc-15.1.0.orig/gcc/ginclude/stddef.h 2025-04-25 11:18:00.000000000 +0300
++++ gcc-15.1.0/gcc/ginclude/stddef.h 2025-04-25 15:58:40.276619928 +0300
+@@ -46,15 +46,21 @@
+ /* This avoids lossage on SunOS but only if stdtypes.h comes first.
+ There's no way to win with the other order! Sun lossage. */
+
+-#if defined(__NetBSD__)
++/* On 4.3bsd-net2, make sure ansi.h is included, so we have
++ one less case to deal with in the following. */
++#if defined (__BSD_NET2__) || defined (____386BSD____) || (defined (__FreeBSD__) && (__FreeBSD__ < 5)) || defined(__NetBSD__)
+ #include <machine/ansi.h>
+ #endif
+-
+-#if defined (__FreeBSD__)
++/* On FreeBSD 5, machine/ansi.h does not exist anymore... */
++#if defined (__FreeBSD__) && (__FreeBSD__ >= 5)
+ #include <sys/_types.h>
+ #endif
+
+-#if defined(__NetBSD__)
++/* In 4.3bsd-net2, machine/ansi.h defines these symbols, which are
++ defined if the corresponding type is *not* defined.
++ FreeBSD-2.1 defines _MACHINE_ANSI_H_ instead of _ANSI_H_.
++ NetBSD defines _I386_ANSI_H_ and _X86_64_ANSI_H_ instead of _ANSI_H_ */
++#if defined(_ANSI_H_) || defined(_MACHINE_ANSI_H_) || defined(_X86_64_ANSI_H_) || defined(_I386_ANSI_H_)
+ #if !defined(_SIZE_T_) && !defined(_BSD_SIZE_T_)
+ #define _SIZE_T
+ #endif
+@@ -81,7 +87,7 @@
+ #undef _WCHAR_T_
+ #undef _BSD_WCHAR_T_
+ #endif
+-#endif /* defined(__NetBSD__) */
++#endif /* defined(_ANSI_H_) || defined(_MACHINE_ANSI_H_) || defined(_X86_64_ANSI_H_) || defined(_I386_ANSI_H_) */
+
+ /* Sequent's header files use _PTRDIFF_T_ in some conflicting way.
+ Just ignore it. */
+@@ -214,11 +220,12 @@
+ #define ___int_size_t_h
+ #define _GCC_SIZE_T
+ #define _SIZET_
+-#if defined (__FreeBSD__) \
++#if (defined (__FreeBSD__) && (__FreeBSD__ >= 5)) \
+ || defined(__DragonFly__) \
+- || defined(__FreeBSD_kernel__) \
+- || defined(__VMS__)
+-/* __size_t is a typedef, must not trash it. */
++ || defined(__FreeBSD_kernel__)
++/* __size_t is a typedef on FreeBSD 5, must not trash it. */
++#elif defined (__VMS__)
++/* __size_t is also a typedef on VMS. */
+ #else
+ #define __size_t
+ #endif
+@@ -376,7 +383,11 @@
+ #undef __need_wint_t
+ #endif
+
+-#if defined(__NetBSD__)
++/* In 4.3bsd-net2, leave these undefined to indicate that size_t, etc.
++ are already defined. */
++/* BSD/OS 3.1 and FreeBSD [23].x require the MACHINE_ANSI_H check here. */
++/* NetBSD 5 requires the I386_ANSI_H and X86_64_ANSI_H checks here. */
++#if defined(_ANSI_H_) || defined(_MACHINE_ANSI_H_) || defined(_X86_64_ANSI_H_) || defined(_I386_ANSI_H_)
+ /* The references to _GCC_PTRDIFF_T_, _GCC_SIZE_T_, and _GCC_WCHAR_T_
+ are probably typos and should be removed before 2.8 is released. */
+ #ifdef _GCC_PTRDIFF_T_
+@@ -404,7 +415,7 @@
+ #undef _WCHAR_T_
+ #undef _BSD_WCHAR_T_
+ #endif
+-#endif /* __NetBSD__ */
++#endif /* _ANSI_H_ || _MACHINE_ANSI_H_ || _X86_64_ANSI_H_ || _I386_ANSI_H_ */
+
+ #endif /* __sys_stdtypes_h */
+
+diff -ruN gcc-15.1.0.orig/gcc/Makefile.in gcc-15.1.0/gcc/Makefile.in
+--- gcc-15.1.0.orig/gcc/Makefile.in 2025-04-25 11:18:00.000000000 +0300
++++ gcc-15.1.0/gcc/Makefile.in 2025-04-25 15:58:40.276619928 +0300
+@@ -679,9 +679,9 @@
+ # --------
+
+ # Directory in which the compiler finds libraries etc.
+-libsubdir = $(libdir)/gcc/$(real_target_noncanonical)/$(version)$(accel_dir_suffix)
++libsubdir = $(libdir)/gcc-lib/$(real_target_noncanonical)/$(version)$(accel_dir_suffix)
+ # Directory in which the compiler finds executables
+-libexecsubdir = $(libexecdir)/gcc/$(real_target_noncanonical)/$(version)$(accel_dir_suffix)
++libexecsubdir = $(libexecdir)/gcc-lib/$(real_target_noncanonical)/$(version)$(accel_dir_suffix)
+ # Directory in which all plugin resources are installed
+ plugin_resourcesdir = $(libsubdir)/plugin
+ # Directory in which plugin headers are installed
+@@ -1113,7 +1113,7 @@
+ # Likewise. Put INCLUDES at the beginning: this way, if some autoconf macro
+ # puts -I options in CPPFLAGS, our include files in the srcdir will always
+ # win against random include files in /usr/include.
+-ALL_CPPFLAGS = $(INCLUDES) $(CPPFLAGS)
++ALL_CPPFLAGS = $(INCLUDES) $(CPPFLAGS) -Wno-error
+
+ # This is the variable to use when using $(COMPILER).
+ ALL_COMPILERFLAGS = $(ALL_CXXFLAGS) $(PICFLAG)
+@@ -2598,8 +2598,8 @@
+
+ DRIVER_DEFINES = \
+ -DSTANDARD_STARTFILE_PREFIX=\"$(unlibsubdir)/\" \
+- -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc/\" \
+- -DSTANDARD_LIBEXEC_PREFIX=\"$(libexecdir)/gcc/\" \
++ -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc-lib/\" \
++ -DSTANDARD_LIBEXEC_PREFIX=\"$(libexecdir)/gcc-lib/\" \
+ -DDEFAULT_TARGET_VERSION=\"$(version)\" \
+ -DDEFAULT_REAL_TARGET_MACHINE=\"$(real_target_noncanonical)\" \
+ -DDEFAULT_TARGET_MACHINE=\"$(target_noncanonical)\" \
+@@ -3409,7 +3409,7 @@
+ -DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\" \
+ -DNATIVE_SYSTEM_HEADER_DIR=\"$(NATIVE_SYSTEM_HEADER_DIR)\" \
+ -DPREFIX=\"$(prefix)/\" \
+- -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc/\" \
++ -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc-lib/\" \
+ @TARGET_SYSTEM_ROOT_DEFINE@
+
+ CFLAGS-cppbuiltin.o += $(PREPROCESSOR_DEFINES) -DBASEVER=$(BASEVER_s)
+@@ -4032,7 +4032,7 @@
+ fi
+
+ # Create the installation directories.
+-# $(libdir)/gcc/include isn't currently searched by cpp.
++# $(libdir)/gcc-lib/include isn't currently searched by cpp.
+ installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(libsubdir)
+ $(mkinstalldirs) $(DESTDIR)$(libexecsubdir)
+@@ -4524,7 +4524,7 @@
+ # files that have already been installed there will be found. The -B option
+ # overrides it, so use of GCC_EXEC_PREFIX will not result in using GCC files
+ # from the install tree.
+- @echo "set TEST_GCC_EXEC_PREFIX \"$(libdir)/gcc/\"" >> ./site.tmp
++ @echo "set TEST_GCC_EXEC_PREFIX \"$(libdir)/gcc-lib/\"" >> ./site.tmp
+ @echo "set TESTING_IN_BUILD_TREE 1" >> ./site.tmp
+ @echo "set HAVE_LIBSTDCXX_V3 1" >> ./site.tmp
+ @if test "@enable_plugin@" = "yes" ; then \
+diff -ruN gcc-15.1.0.orig/libada/Makefile.in gcc-15.1.0/libada/Makefile.in
+--- gcc-15.1.0.orig/libada/Makefile.in 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libada/Makefile.in 2025-04-25 15:58:40.276619928 +0300
+@@ -70,7 +70,7 @@
+
+ target_noncanonical:=@target_noncanonical@
+ version := $(shell @get_gcc_base_ver@ $(srcdir)/../gcc/BASE-VER)
+-libsubdir := $(libdir)/gcc/$(target_noncanonical)/$(version)$(MULTISUBDIR)
++libsubdir := $(libdir)/gcc-lib/$(target_noncanonical)/$(version)$(MULTISUBDIR)
+ ADA_RTS_DIR=$(GCC_DIR)/ada/rts$(subst /,_,$(MULTISUBDIR))
+
+ # exeext should not be used because it's the *host* exeext. We're building
+diff -ruN gcc-15.1.0.orig/libatomic/config/morphos/host-config.h gcc-15.1.0/libatomic/config/morphos/host-config.h
+--- gcc-15.1.0.orig/libatomic/config/morphos/host-config.h 1970-01-01 02:00:00.000000000 +0200
++++ gcc-15.1.0/libatomic/config/morphos/host-config.h 2025-04-25 15:58:40.276619928 +0300
+@@ -0,0 +1,55 @@
++/* Copyright (C) 2014-2019 Free Software Foundation, Inc.
++ Contributed by Kai Tietz <ktietz%redhat.com@localhost>.
++ Copyright (C) 2020 Harry Sintonen <sintonen%iki.fi@localhost>.
++
++ This file is part of the GNU Atomic Library (libatomic).
++
++ Libatomic is free software; you can redistribute it and/or modify it
++ under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 3 of the License, or
++ (at your option) any later version.
++
++ Libatomic is distributed in the hope that it will be useful, but WITHOUT ANY
++ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
++ FOR A PARTICULAR PURPOSE. See the GNU General Public License for
++ more details.
++
++ Under Section 7 of GPL version 3, you are granted additional
++ permissions described in the GCC Runtime Library Exception, version
++ 3.1, as published by the Free Software Foundation.
++
++ You should have received a copy of the GNU General Public License and
++ a copy of the GCC Runtime Library Exception along with this program;
++ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
++ <http://www.gnu.org/licenses/>. */
++
++/* Included after all more target-specific host-config.h. */
++
++#ifndef protect_start_end
++# ifdef HAVE_ATTRIBUTE_VISIBILITY
++# pragma GCC visibility push(hidden)
++# endif
++
++void libat_lock_1(void *ptr);
++void libat_unlock_1(void *ptr);
++
++static inline UWORD
++protect_start(void *ptr)
++{
++ libat_lock_1(ptr);
++ return 0;
++}
++
++static inline void
++protect_end(void *ptr, UWORD dummy UNUSED)
++{
++ libat_unlock_1(ptr);
++}
++
++# define protect_start_end 1
++# ifdef HAVE_ATTRIBUTE_VISIBILITY
++# pragma GCC visibility pop
++# endif
++#endif /* protect_start_end */
++
++#include_next <host-config.h>
+diff -ruN gcc-15.1.0.orig/libatomic/config/morphos/lock.c gcc-15.1.0/libatomic/config/morphos/lock.c
+--- gcc-15.1.0.orig/libatomic/config/morphos/lock.c 1970-01-01 02:00:00.000000000 +0200
++++ gcc-15.1.0/libatomic/config/morphos/lock.c 2025-04-25 15:58:40.276619928 +0300
+@@ -0,0 +1,178 @@
++/* Copyright (C) 2014-2019 Free Software Foundation, Inc.
++ Contributed by Kai Tietz <ktietz%redhat.com@localhost>.
++ Copyright (C) 2020 Harry Sintonen <sintonen%iki.fi@localhost>.
++
++ This file is part of the GNU Atomic Library (libatomic).
++
++ Libatomic is free software; you can redistribute it and/or modify it
++ under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 3 of the License, or
++ (at your option) any later version.
++
++ Libatomic is distributed in the hope that it will be useful, but WITHOUT ANY
++ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
++ FOR A PARTICULAR PURPOSE. See the GNU General Public License for
++ more details.
++
++ Under Section 7 of GPL version 3, you are granted additional
++ permissions described in the GCC Runtime Library Exception, version
++ 3.1, as published by the Free Software Foundation.
++
++ You should have received a copy of the GNU General Public License and
++ a copy of the GCC Runtime Library Exception along with this program;
++ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
++ <http://www.gnu.org/licenses/>. */
++
++#define UWORD __shadow_UWORD
++#define __IXEMUL_EXEC_MIXING_ALLOWED
++#include <exec/semaphores.h>
++#include <proto/exec.h>
++#undef UWORD
++#ifdef __ixemul__
++# include <signal.h>
++#endif
++#include "libatomic_i.h"
++
++/* The target page size. Must be no larger than the runtime page size,
++ lest locking fail with virtual address aliasing (i.e. a page mmaped
++ at two locations). */
++#ifndef PAGE_SIZE
++#define PAGE_SIZE 4096
++#endif
++
++/* The target cacheline size. This is an optimization; the padding that
++ should be applied to the locks to keep them from interfering. */
++#ifndef CACHLINE_SIZE
++#define CACHLINE_SIZE 64
++#endif
++
++/* The granularity at which locks are applied. Almost certainly the
++ cachline size is the right thing to use here. */
++#ifndef WATCH_SIZE
++#define WATCH_SIZE CACHLINE_SIZE
++#endif
++
++struct lock
++{
++ struct SignalSemaphore sema;
++ char pad[sizeof (struct SignalSemaphore) < CACHLINE_SIZE
++ ? CACHLINE_SIZE - sizeof (struct SignalSemaphore)
++ : 0];
++};
++
++#define NLOCKS (PAGE_SIZE / WATCH_SIZE)
++
++static struct lock locks[NLOCKS];
++
++static inline uintptr_t
++addr_hash(void *ptr)
++{
++ return ((uintptr_t)ptr / WATCH_SIZE) % NLOCKS;
++}
++
++static inline int
++SemaphoreIsValid(const struct SignalSemaphore *sema)
++{
++ return sema->ss_Link.ln_Type == NT_SIGNALSEM;
++}
++
++void
++libat_lock_1(void *ptr)
++{
++ #ifdef __ixemul__
++ int omask = sigsetmask(~0);
++ #endif
++ Forbid();
++ if (!SemaphoreIsValid(&locks[addr_hash(ptr)].sema))
++ InitSemaphore(&locks[addr_hash(ptr)].sema);
++ Permit();
++ ObtainSemaphore(&locks[addr_hash(ptr)].sema);
++ #ifdef __ixemul__
++ sigsetmask(omask);
++ #endif
++}
++
++void
++libat_unlock_1(void *ptr)
++{
++ if (SemaphoreIsValid(&locks[addr_hash(ptr)].sema))
++ {
++ #ifdef __ixemul__
++ int omask = sigsetmask(~0);
++ #endif
++ ReleaseSemaphore(&locks[addr_hash(ptr)].sema);
++ #ifdef __ixemul__
++ sigsetmask(omask);
++ #endif
++ }
++}
++
++void
++libat_lock_n(void *ptr, size_t n)
++{
++ uintptr_t h = addr_hash(ptr);
++ size_t i = 0;
++ uintptr_t _h;
++ #ifdef __ixemul__
++ int omask = sigsetmask(~0);
++ #endif
++
++ /* Don't lock more than all the locks we have. */
++ if (n > PAGE_SIZE)
++ n = PAGE_SIZE;
++
++ /* First initialize uninitialized semaphores */
++ Forbid();
++ _h = h;
++ do
++ {
++ if (!SemaphoreIsValid(&locks[_h].sema))
++ InitSemaphore(&locks[_h].sema);
++ if (++_h == NLOCKS)
++ _h = 0;
++ i += WATCH_SIZE;
++ }
++ while (i < n);
++ Permit();
++
++ i = 0;
++ do
++ {
++ ObtainSemaphore(&locks[h].sema);
++ if (++h == NLOCKS)
++ h = 0;
++ i += WATCH_SIZE;
++ }
++ while (i < n);
++
++ #ifdef __ixemul__
++ sigsetmask(omask);
++ #endif
++}
++
++void
++libat_unlock_n(void *ptr, size_t n)
++{
++ uintptr_t h = addr_hash(ptr);
++ size_t i = 0;
++ #ifdef __ixemul__
++ int omask = sigsetmask(~0);
++ #endif
++
++ if (n > PAGE_SIZE)
++ n = PAGE_SIZE;
++
++ do
++ {
++ if (SemaphoreIsValid(&locks[h].sema))
++ ReleaseSemaphore(&locks[h].sema);
++ if (++h == NLOCKS)
++ h = 0;
++ i += WATCH_SIZE;
++ }
++ while (i < n);
++
++ #ifdef __ixemul__
++ sigsetmask(omask);
++ #endif
++}
+diff -ruN gcc-15.1.0.orig/libatomic/configure gcc-15.1.0/libatomic/configure
+--- gcc-15.1.0.orig/libatomic/configure 2025-04-25 11:21:27.000000000 +0300
++++ gcc-15.1.0/libatomic/configure 2025-04-25 15:58:40.276619928 +0300
+@@ -5643,7 +5643,7 @@
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+- amigaos*)
++ amigaos* | morphos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+diff -ruN gcc-15.1.0.orig/libatomic/configure.tgt gcc-15.1.0/libatomic/configure.tgt
+--- gcc-15.1.0.orig/libatomic/configure.tgt 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libatomic/configure.tgt 2025-04-25 15:58:40.276619928 +0300
+@@ -168,6 +168,11 @@
+ esac
+ ;;
+
++ *-*-morphos*)
++ # OS support for atomic primitives.
++ config_path="${config_path} morphos"
++ ;;
++
+ *-*-rtems*)
+ XCFLAGS="${configure_tgt_pre_target_cpu_XCFLAGS}"
+ config_path="rtems"
+diff -ruN gcc-15.1.0.orig/libcpp/files.cc gcc-15.1.0/libcpp/files.cc
+--- gcc-15.1.0.orig/libcpp/files.cc 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libcpp/files.cc 2025-04-25 15:58:40.276619928 +0300
+@@ -39,6 +39,10 @@
+ # define STAT_SIZE_RELIABLE(ST) true
+ #endif
+
++#ifndef O_CASE
++# define O_CASE 0
++#endif
++
+ #ifdef __DJGPP__
+ #include <io.h>
+ /* For DJGPP redirected input is opened in text mode. */
+@@ -240,7 +244,7 @@
+ set_stdin_to_binary_mode ();
+ }
+ else
+- file->fd = open (file->path, O_RDONLY | O_NOCTTY | O_BINARY, 0666);
++ file->fd = open (file->path, O_RDONLY | O_NOCTTY | O_BINARY | O_CASE, 0666);
+
+ if (file->fd != -1)
+ {
+diff -ruN gcc-15.1.0.orig/libffi/configure gcc-15.1.0/libffi/configure
+--- gcc-15.1.0.orig/libffi/configure 2025-04-25 11:21:27.000000000 +0300
++++ gcc-15.1.0/libffi/configure 2025-04-25 15:58:40.280619963 +0300
+@@ -5875,7 +5875,7 @@
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+- amigaos*)
++ amigaos* | morphos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+diff -ruN gcc-15.1.0.orig/libffi/include/Makefile.in gcc-15.1.0/libffi/include/Makefile.in
+--- gcc-15.1.0.orig/libffi/include/Makefile.in 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libffi/include/Makefile.in 2025-04-25 15:58:40.280619963 +0300
+@@ -327,7 +327,7 @@
+
+ # Where generated headers like ffitarget.h get installed.
+ gcc_version := $(shell @get_gcc_base_ver@ $(top_srcdir)/../gcc/BASE-VER)
+-toollibffidir := $(libdir)/gcc/$(target_alias)/$(gcc_version)/include
++toollibffidir := $(libdir)/gcc-lib/$(target_alias)/$(gcc_version)/include
+ toollibffi_HEADERS = ffi.h ffitarget.h
+ all: all-am
+
+diff -ruN gcc-15.1.0.orig/libgcc/config/rs6000/gthr-morphos.c gcc-15.1.0/libgcc/config/rs6000/gthr-morphos.c
+--- gcc-15.1.0.orig/libgcc/config/rs6000/gthr-morphos.c 1970-01-01 02:00:00.000000000 +0200
++++ gcc-15.1.0/libgcc/config/rs6000/gthr-morphos.c 2025-04-25 15:58:40.280619963 +0300
+@@ -0,0 +1,2321 @@
++/* Threads compatibility routines for libgcc2. */
++/* Compile this one with gcc. */
++/* Copyright (C) 1997, 1999, 2000, 2004, 2008, 2009
++ Free Software Foundation, Inc.
++ Copyright (C) 2016-2020 Harry Sintonen
++
++This file is part of GCC.
++
++GCC is free software; you can redistribute it and/or modify it under
++the terms of the GNU General Public License as published by the Free
++Software Foundation; either version 3, or (at your option) any later
++version.
++
++GCC is distributed in the hope that it will be useful, but WITHOUT ANY
++WARRANTY; without even the implied warranty of MERCHANTABILITY or
++FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++for more details.
++
++Under Section 7 of GPL version 3, you are granted additional
++permissions described in the GCC Runtime Library Exception, version
++3.1, as published by the Free Software Foundation.
++
++You should have received a copy of the GNU General Public License and
++a copy of the GCC Runtime Library Exception along with this program;
++see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
++<http://www.gnu.org/licenses/>. */
++
++#include "gthr-morphos.h"
++#include <string.h>
++
++#ifndef GCC_SYSTEM_H
++#if defined(__GNUC__) && GCC_VERSION > 4000
++/* GCC 4.0.x has a bug where it may ICE on this expression,
++ so does GCC 3.4.x (PR17436). */
++#define CONST_CAST2(TOTYPE,FROMTYPE,X) ((__extension__(union {FROMTYPE _q; TOTYPE _nq;})(X))._nq)
++#else
++#define CONST_CAST2(TOTYPE,FROMTYPE,X) ((TOTYPE)(FROMTYPE)(X))
++#endif
++#define CONST_CAST(TYPE,X) CONST_CAST2(TYPE, const TYPE, (X))
++#endif
++
++#ifndef __ATTR_WEAK_ALIAS
++#define __ATTR_WEAK_ALIAS(_f_) __attribute__ ((weak, alias (#_f_)))
++#endif
++
++#ifndef __ATTR_WEAK
++#define __ATTR_WEAK __attribute__ ((weak))
++#endif
++
++#ifndef HIDE_EXPORTS
++#pragma GCC visibility push(default)
++#endif
++
++/*
++ * MorphOS threading
++ */
++
++#define USE_THREAD_ONLY_SETSPECIFIC 0 /* 1 -> Do not allow __gthread_setspecific for non-thread callers */
++#define USE_THREAD_SAFETYNET 1 /* 1 -> Have an atexit function to join all pending threads */
++
++/* Custom SysBase we need for memory, semaphores, etc */
++#define USE_INLINE_STDARG
++#define __NOLIBBASE__
++#include <exec/tasks.h>
++#define EXEC_BASE_NAME ABOX_GETTASKSYSBASE
++#define __IXEMUL_EXEC_MIXING_ALLOWED
++
++#include <proto/exec.h>
++#include <proto/dos.h>
++#include <hardware/atomic.h>
++#include <exec/memory.h>
++#include <exec/semaphores.h>
++#include <exec/rawfmt.h>
++#include <devices/timer.h>
++#include <dos/dostags.h>
++#define EXEC_SILENT_BUILD 1
++#include <exec/avl.h>
++#include <clib/savl_protos.h>
++#include <stddef.h>
++#include <stdlib.h>
++#if USE_THREAD_SAFETYNET
++extern struct Library *SocketBase; /* Make unistd.h select() inline not croak */
++#include <unistd.h>
++#endif
++#include <signal.h>
++#ifdef __ixemul
++#include <workbench/startup.h>
++#include <exec/interrupts.h>
++
++#include <stdio.h>
++#include <ix.h>
++
++/*
++ * ixemul internal structures as they were during ixemul <= 50.17.
++ * This stuff is needed to ensure that the fallback code will continue
++ * to build with the same offsets regardless of the potential future
++ * changes to the ixemul internal structures. This stuff is not used
++ * if the new ixemul.library 50.18+ is available. - Piru
++ */
++#define DTYPE_SOCKET50 5
++
++struct ixnode50 {
++ struct ixnode *next, *prev;
++};
++
++struct ixlist50 {
++ struct ixnode *head, *tail;
++};
++
++struct utimenode50 {
++ struct ixnode50 node;
++ unsigned time;
++};
++
++struct glue50 {
++ struct glue50 *next;
++ int niobs;
++ void *iobs;
++};
++
++struct malloc_data50 {
++ struct ixlist50 md_list;
++ unsigned int md_malloc_sbrk_used;
++};
++
++struct stackframe;
++struct session50 {
++ int s_count;
++};
++
++#ifdef __PPC__
++#define _JBLEN50 (7+19+2*18+14+3*6)
++#else
++#define _JBLEN50 17
++#endif
++typedef int jmp_buf50[_JBLEN50];
++
++typedef long time50_t;
++
++struct timeval50 {
++ long tv_sec;
++ long tv_usec;
++};
++
++struct itimerval50 {
++ struct timeval50 it_interval;
++ struct timeval50 it_value;
++};
++
++struct rusage50 {
++ struct timeval50 ru_utime;
++ struct timeval50 ru_stime;
++ long ru_maxrss;
++ long ru_ixrss;
++ long ru_idrss;
++ long ru_isrss;
++ long ru_minflt;
++ long ru_majflt;
++ long ru_nswap;
++ long ru_inblock;
++ long ru_oublock;
++ long ru_msgsnd;
++ long ru_msgrcv;
++ long ru_nsignals;
++ long ru_nvcsw;
++ long ru_nivcsw;
++};
++
++struct rlimit50 {
++ long rlim_cur;
++ long rlim_max;
++};
++
++struct mem_file50 {
++ int mf_offset;
++ void *mf_buffer;
++};
++
++struct file50 {
++ char *f_name;
++ int f_stb_dirty,
++ f_type,
++ f_flags,
++ f_count,
++ (*f_write)(),
++ (*f_read)(),
++ (*f_ioctl)(),
++ (*f_select)(),
++ (*f_close)();
++ union {
++ struct {
++ int so;
++ int domain;
++ int type;
++ int protocol;
++ long id;
++ } inetsock;
++ } f__fh;
++};
++
++#define f_socket_domain f__fh.inetsock.domain
++#define f_socket_type f__fh.inetsock.type
++#define f_socket_protocol f__fh.inetsock.protocol
++#define f_socket_id f__fh.inetsock.id
++
++typedef char *caddr50_t;
++
++struct sigstack50 {
++ char *ss_sp;
++ int ss_onstack;
++};
++
++typedef void (*sig50_t)(int);
++typedef unsigned int sigset50_t;
++
++struct passwd50 {
++ char *pw_name;
++ char *pw_passwd;
++ int pw_uid;
++ int pw_gid;
++ time50_t pw_change;
++ char *pw_class;
++ char *pw_gecos;
++ char *pw_dir;
++ char *pw_shell;
++ time50_t pw_expire;
++};
++
++struct group50 {
++ char *gr_name;
++ char *gr_passwd;
++ int gr_gid;
++ char **gr_mem;
++};
++
++struct servent50 {
++ char *s_name;
++ char **s_aliases;
++ int s_port;
++ char *s_proto;
++};
++
++struct protoent50 {
++ char *p_name;
++ char **p_aliases;
++ int p_proto;
++};
++
++struct netent50 {
++ char *n_name;
++ char **n_aliases;
++ int n_addrtype;
++ unsigned long n_net;
++};
++
++typedef int32_t pid50_t;
++
++typedef unsigned short uid50_t;
++typedef unsigned short gid50_t;
++
++#define NOFILE50 512
++
++struct user50 {
++ /* both a magic cookie and a way to get at the library base thru u */
++ void *u_ixbase;
++ void *u_user; /* freely usable user field */
++
++ long u_a4_pointers_size; /* number of a4 pointers */
++
++/* 1.3 - signal management */
++ sig50_t u_signal[33]; /* disposition of signals */
++ int u_sigmask[33]; /* signals to be blocked */
++ sigset50_t u_sigonstack; /* signals to take on sigstack */
++ sigset50_t u_sigintr; /* signals that interrupt syscalls */
++ sigset50_t u_oldmask; /* saved mask from before sigpause */
++ struct sigstack50 u_sigstack; /* sp & on stack state variable */
++ int u_sig; /* for core dump/debugger XXX */
++ int u_code; /* for core dump/debugger XXX */
++
++ int p_flag; /* process flags, as necessary.. */
++ int p_xstat; /* exit status */
++ char p_stat;
++ char p_cursig;
++ short pad;
++ sigset50_t p_sig; /* signals pending to this process */
++ sigset50_t p_sigmask; /* current signal mask */
++ sigset50_t p_sigignore; /* signals being ignored */
++ sigset50_t p_sigcatch; /* signals being caught by user */
++
++ caddr50_t p_wchan; /* event process is awaiting */
++
++
++/* 1.4 - descriptor management (for shared library version) */
++ struct file50 *u_ofile[NOFILE50]; /* file structures for open files */
++ char u_pofile[NOFILE50]; /* per-process flags of open files */
++ int u_lastfile; /* high-water mark of u_ofile */
++ short u_cmask; /* mask for file creation */
++
++/* 1.5 - timing and statistics */
++ struct rusage50 u_ru; /* stats for this proc */
++ struct rusage50 u_cru; /* sum of stats for reaped children */
++ struct itimerval50 u_timer[3];
++ struct timeval50 u_start;
++ struct utimenode50 u_time;
++ short u_acflag;
++
++ struct uprof50 { /* profile arguments */
++ short *pr_base; /* buffer base */
++ unsigned pr_size; /* buffer size */
++ unsigned pr_off; /* pc offset */
++ unsigned pr_scale; /* pc scaling */
++ } u_prof;
++ unsigned u_prof_last_pc; /* last function that called mcount() */
++
++/* 1.6 - resource controls */
++ struct rlimit50 u_rlimit[9];
++
++/* amiga specific stuff */
++ struct malloc_data50 u_md;
++
++ struct ixnode50 u_user_node;
++ struct Task *u_task;
++ struct MsgPort *u_sync_mp; /* PA_SIGNAL message port */
++ struct timerequest *u_time_req;
++ int *u_errno;
++ BPTR u_startup_cd;
++
++ int u_ringring; /* used in sleep.c and usleep.c */
++
++ char ***u_environ;
++
++ /* used to handle AmigaOS signals. see SIGMSG */
++ u_int u_lastrcvsig;
++ char u_sleep_sig;
++ char u_pipe_sig;
++
++ /* c-startup stuff */
++ jmp_buf50 u_jmp_buf;
++ char *u_argline;
++ u_int u_arglinelen;
++ int u_expand_cmd_line;
++
++ void *u_atexit;
++
++ char u_getenv_buf[255];
++
++ UBYTE u_is_ppc; /* is this task a native ppc one ? */
++ void (*u_oexcept_code)();
++ APTR u_otrap_code;
++ APTR u_ouser;
++ struct Interrupt u_itimerint; /* 1 interrupt / task */
++
++ int p_pgrp; /* process group */
++ struct session50 *u_session; /* session pointer */
++
++ char *u_strtok_last; /* moved with 37.8 */
++
++ /* vfork() support */
++ struct ixlist50 p_zombies; /* list of death messages */
++ int p_zombie_sig; /* signal to set when a child died */
++ struct Process *p_pptr; /* parent */
++ struct Process *p_opptr; /* old parent (used in ptrace) */
++ struct Process *p_cptr; /* last recently created child */
++ struct Process *p_osptr; /* older sybling */
++ struct Process *p_ysptr; /* younger sybling */
++ void *p_vfork_msg;
++
++ void *u_segs; /* execve stores the SegList here */
++ u_long u_start_pc; /* start and end addresses */
++ u_long u_end_pc; /* of the code hunk */
++ u_long u_oexcept_sigs;
++
++ /* stdio support comes here */
++ char u_tmpnam_bu[1024]; /* quite large.. */
++ u_long u_tmpcount;
++ struct glue50 u_sglue;
++ /* the 3 `standard' FILE pointers (!) are here */
++ void *u_sF[3];
++
++ /* vfork() support #2 */
++ void *u_save_sp; /* when vfork'd, this is the `real' sp */
++ jmp_buf50 u_vfork_frame; /* for the parent in vfork () */
++#ifdef __PPC__
++ u_int u_mini_stack[4000]; /* 16K stack while in vfork () */
++ u_char u_mini_stack_pad[15]; /* align pad area */
++#else
++ u_int u_mini_stack[1000]; /* 4K stack while in vfork () */
++#endif
++ /* stack watcher. When usp < u_red_zone && ix.ix_watch_stack -> SIGSEGV */
++ void *u_red_zone;
++
++ /* base relative support. This even works for pure programs ! */
++ u_int u_a4;
++
++ /* currently there's just 1, meaning don't trace me */
++ u_int u_trace_flags;
++
++ /* this is for getmntinfo() */
++ void *u_mntbuf;
++ int u_mntsize;
++ long u_bufsize;
++
++ /* this is for getmntinfo64() */
++ void *u_mntbuf64;
++ int u_mntsize64;
++ long u_bufsize64;
++
++ /* this is for SIGWINCH support. */
++ struct IOStdReq *u_idev_req;
++ struct Window *u_window; /* the watched window */
++ struct Interrupt u_idev_int;
++
++ /* for `ps' (or dump as it's called for now.. ) */
++ char *p_wmesg;
++
++ /* new support for `real' process groups, control ttys etc.. */
++ struct user *p_pgrpnxt;
++ void *p_pgrpptr;
++ struct Process *p_exec_proc; /* to get back to struct Process */
++
++ /* to be able to switch memory lists on the fly, as required when vfork'd
++ processes are supposed to allocate memory from their parents pool until
++ they detach. */
++ struct malloc_data50 *u_mdp;
++
++ /* data needed for network support */
++ struct Library *u_ixnetbase;
++ void *u_ixnet;
++ int *u_h_errno;
++
++ /* ptrace() and kern_sig.c:stopped_process_handler() interface. */
++ void *u_regs;
++ void *u_fpregs;
++ int u_mask_state;
++
++ /* strftime() globals */
++ size_t u_gsize;
++ char *u_pt;
++
++ /* putenv() global */
++ int u_env_alloced;
++
++ /* rand() global */
++ u_long u_rand_next;
++
++ /* stuff for stackextend */
++#ifdef __MORPHOS__
++ void *u_68k_tc_splower; /* original entries of task structure */
++ void *u_68k_tc_spupper; /* to restore them at exit */
++ void *u_68k_org_lower; /* original stackborders */
++ void *u_68k_org_upper;
++ void **u_68k_stk_limit; /* pointer to limit variable */
++ unsigned long u_68k_stk_argbt; /* Maximum size of arguments */
++ void *u_68k_stk_used; /* used stackframes */
++ void *u_68k_stk_spare; /* spare stackframes */
++ unsigned long u_68k_stk_current; /* current stack size */
++ unsigned long u_68k_stk_max; /* maximum stack size so far */
++
++ void *u_ppc_tc_splower; /* original entries of task structure */
++ void *u_ppc_tc_spupper; /* to restore them at exit */
++ void *u_ppc_org_lower; /* original stackborders */
++ void *u_ppc_org_upper;
++ void **u_ppc_stk_limit; /* pointer to limit variable */
++ unsigned long u_ppc_stk_argbt; /* Maximum size of arguments */
++ void *u_ppc_stk_used; /* used stackframes */
++ void *u_ppc_stk_spare; /* spare stackframes */
++ unsigned long u_ppc_stk_current; /* current stack size */
++ unsigned long u_ppc_stk_max; /* maximum stack size so far */
++#else
++ void *u_tc_splower; /* original entries of task structure */
++ void *u_tc_spupper; /* to restore them at exit */
++ void *u_org_lower; /* original stackborders */
++ void *u_org_upper;
++ void **u_stk_limit; /* pointer to limit variable */
++ unsigned long u_stk_argbt; /* Maximum size of arguments */
++ void *u_stk_used; /* used stackframes */
++ void *u_stk_spare; /* spare stackframes */
++ unsigned long u_stk_current; /* current stack size */
++ unsigned long u_stk_max; /* maximum stack size so far */
++#endif
++ char u_root_directory[1024]; /* for chroot() */
++ short u_is_root; /* current directory is root */
++
++ /* stuff for muFS support */
++ void *u_UserInfo; /* private muUserInfo to use */
++ void *u_GroupInfo; /* private muGroupInfo to use */
++ void *u_fileUserInfo; /* private muUserInfo for database ops */
++ void *u_fileGroupInfo; /* private muGroupInfo for database ops */
++ BOOL u_groupfileopen; /* dummy for emulation */
++ BOOL u_passwdfileopen; /* dummy for emulation */
++ struct passwd50 u_passwd; /* static buffer to hold the data */
++ struct group50 u_group; /* ditto */
++
++ void *u_grp_fp; /* File pointer to the groups file */
++ int u_grp_stayopen; /* TRUE if group file should stay open */
++ char **u_members; /* array of group members */
++ char *u_grp_line; /* buffer for reading a line from the group file */
++
++ /* Support for ixnet functions */
++ void *u_serv_fp; /* File pointer to services file */
++ char *u_serv_line; /* buffer for reading a line from the services file */
++ struct servent50 u_serv;
++ char **u_serv_aliases;
++ int u_serv_stayopen;
++
++ void *u_proto_fp; /* File pointer to protocol file */
++ char *u_proto_line;
++ struct protoent50 u_proto;
++ char **u_proto_aliases;
++ int u_proto_stayopen;
++
++ void *u_net_fp; /* File pointer to network file */
++ char *u_net_line;
++ struct netent50 u_net;
++ char **u_net_aliases;
++ int u_net_stayopen;
++
++ int u_logname_valid;
++ char u_logname[12 + 1];
++ char u_logname_buf[12 + 1];
++
++ char u_ntoa_buf[18]; /* used by inet_ntoa */
++
++ /* resolv state structure */
++ void *u_res;
++ int *u_res_socket;
++
++ /* logfile handling */
++ int u_LogFile; /* fd for log */
++ int u_LogStat; /* status bits, set by openlog() */
++ char *u_LogTag; /* string to tag the entry with */
++ int u_LogFacility; /* default facility code */
++ int u_LogMask; /* mask of priorities to be logged */
++
++ int u_setuid; /* used for setuid() - have to remember
++ * to log out */
++ /* mmap handling */
++ void *u_mmap;
++
++ struct MsgPort *u_select_mp; /* PA_SIGNAL message port */
++
++ /* strtod support */
++ void *u_freelist[16];
++ void *u_p5s;
++ void *u_result;
++ int u_result_k;
++
++ /* popen support */
++ pid50_t *u_popen_pids;
++
++ /* uid / gid support */
++
++ void *u_pwd_fp; /* File pointer to the passwd file */
++ int u_pwd_stayopen; /* TRUE if passwd file should stay open */
++ char *u_pwd_line; /* buffer for reading a line from the passwd file */
++
++ char u_getpass_buf[128 + 1];
++
++ char u_crypt_buf[21];
++
++ uid50_t u_nextuid;
++ uid50_t u_nextgid;
++
++ uid50_t u_ruid;
++ uid50_t u_euid;
++ gid50_t u_rgid;
++ gid50_t u_egid;
++ int u_ngroups;
++ int u_grouplist[1];
++};
++#define STRC50 0x010
++#define SFREEA450 0x100
++
++#define SIG_DEF int __omask;
++#define SIG_LOCK() __omask = sigsetmask(~0)
++#define SIG_UNLOCK() sigsetmask(__omask)
++#else
++#define SIG_DEF
++#define SIG_LOCK() do {} while(0)
++#define SIG_UNLOCK() do {} while(0)
++#endif
++
++#define _MOS_DEBUG 0
++#if _MOS_DEBUG
++#define _D(__f, ...) NewRawDoFmt(__f, (APTR (*)(APTR, UBYTE)) RAWFMTFUNC_SERIAL, NULL, __VA_ARGS__)
++#else
++#define _D(__f, ...) do { } while(0)
++#endif
++
++/*
++ * Internal
++ */
++
++typedef struct {
++ struct MinNode key_node;
++ void (*key_dtor) (void *);
++ struct SignalSemaphore key_sem;
++ struct AVLNode *key_tree;
++} __internal_key_t;
++
++typedef struct {
++ struct AVLNode node;
++ ULONG owner; /* pid_t */
++ void *val;
++} __internal_key_node_t;
++
++/* Nice hack to avoid a constructor */
++static struct SignalSemaphore keysema = {
++ {NULL, NULL, NT_SIGNALSEM, 0, NULL}, 0, {(struct MinNode *) &keysema.ss_WaitQueue.mlh_Tail, NULL, (struct MinNode *) &keysema.ss_WaitQueue.mlh_Head}, {{NULL, NULL}, NULL}, NULL, -1
++};
++static struct MinList keylist = {
++ (struct MinNode *) &keylist.mlh_Tail, NULL, (struct MinNode *) &keylist.mlh_Head
++};
++#if USE_THREAD_SAFETYNET
++static struct MinList threadlist = {
++ (struct MinNode *) &threadlist.mlh_Tail, NULL, (struct MinNode *) &threadlist.mlh_Head
++};
++#endif
++
++typedef struct {
++ union {
++ struct SignalSemaphore __sem;
++ char _priv[60]; /* __gthread_mutex_t */
++ } u;
++ int incond;
++} __internal_mutex_t;
++
++typedef struct {
++ union {
++ struct SignalSemaphore __sem;
++ char _priv[60];
++ } u1;
++ union {
++ struct MinList __waiters;
++ void *_priv[3];
++ } u2;
++} __internal_cond_t;
++
++struct taskmsg {
++ struct Message m;
++ struct MsgPort deathport;
++ struct MemList *ml;
++ struct MinNode node;
++#if USE_THREAD_SAFETYNET
++ struct Task *task;
++#endif
++#ifdef __ixemul
++ struct user50 *parent;
++ int sigmask;
++ struct Message syncmsg;
++#endif
++ void *(*func)(void *);
++ void *args;
++ char name[1];
++};
++
++/*
++ * if task is non-NULL must be called within Forbid()
++ */
++static struct taskmsg *GetThreadInternal(struct Task *task)
++{
++ struct taskmsg *msg = NULL;
++ NewGetTaskAttrs(task, &msg, sizeof(msg), TASKINFOTYPE_STARTUPMSG, TAG_DONE);
++ if(msg == NULL || msg->m.mn_Length != sizeof(*msg) ||
++ msg->m.mn_Node.ln_Name != msg->name) {
++ msg = NULL;
++ }
++ return msg;
++}
++
++static inline void newlist(struct MinList *l)
++{
++ l->mlh_TailPred = (struct MinNode *) l;
++ l->mlh_Tail = (struct MinNode *) NULL;
++ l->mlh_Head = (struct MinNode *) &l->mlh_Tail;
++}
++static inline void addtail(struct MinList *l, struct MinNode *n)
++{
++ struct MinNode *opn;
++ opn = l->mlh_TailPred;
++ n->mln_Succ = (struct MinNode *) &l->mlh_Tail;
++ n->mln_Pred = opn;
++ opn->mln_Succ = n;
++ l->mlh_TailPred = n;
++}
++static inline void noderemove(struct MinNode *n)
++{
++ struct MinNode *pn, *sn;
++ pn = n->mln_Pred;
++ sn = n->mln_Succ;
++ pn->mln_Succ = sn;
++ sn->mln_Pred = pn;
++}
++
++static inline int SemaphoreIsInvalid(struct SignalSemaphore *sem)
++{
++ return sem->ss_Link.ln_Type != NT_SIGNALSEM || sem->ss_WaitQueue.mlh_Tail != NULL;
++}
++
++/* __gthr_morphos_enable */
++__ATTR_WEAK long __gthr_morphos_enable = 1;
++
++int __gthr_morphos_active_p (void)
++{
++ return __gthr_morphos_enable;
++}
++
++/* __gthr_morphos_once */
++int __gthr_morphos_once (__gthread_once_t *__once, void (*__func) (void))
++{
++ SIG_DEF
++ _D("<%s/%s():%lu> __gthread_once_t == 0x%p, __func == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, __once, __func);
++
++ if(__once == NULL || __func == NULL) {
++ _D("<%s/%s():%lu> == EINVAL\n", __FILE__, __FUNCTION__, __LINE__);
++ return EINVAL;
++ }
++
++ _D("<%s/%s():%lu> __once->done = %d, __once->busy = %d\n", __FILE__, __FUNCTION__, __LINE__, __once->done, __once->busy);
++
++ if(__once->done)
++ return 0;
++
++ while(ATOMIC_STORE((LONG *) &__once->busy, 1)) {
++#ifdef __ixemul
++ SIG_LOCK();
++ usleep(20000); /* 50 times per second */
++ SIG_UNLOCK();
++#else
++ void (*oldhandler)(int) = signal(SIGINT, (void (*)(int)) SIG_IGN);
++ usleep(20000); /* 50 times per second */
++ signal(SIGINT, oldhandler);
++#endif
++ }
++
++ if(!__once->done) {
++ _D("<%s/%s():%lu> -> __func()\n", __FILE__, __FUNCTION__, __LINE__);
++ (*__func) ();
++ _D("<%s/%s():%lu> __once->done -> TRUE\n", __FILE__, __FUNCTION__, __LINE__);
++ __once->done = 1;
++ }
++ (void)ATOMIC_STORE((LONG *) &__once->busy, 0);
++
++ _D("<%s/%s():%lu> == 0\n", __FILE__, __FUNCTION__, __LINE__);
++ return 0;
++}
++
++/* __gthr_morphos_once_unlock */
++void __gthr_morphos_once_unlock (__gthread_once_t *__once)
++{
++ (void)ATOMIC_STORE((LONG *) &__once->busy, 0);
++}
++
++/* __gthr_morphos_key_create */
++int __gthr_morphos_key_create (__gthread_key_t *__key, void (*__func) (void *))
++{
++ __internal_key_t *key_internal;
++ SIG_DEF
++
++ _D("<%s/%s():%lu> __gthread_key_t == 0x%p, __func == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, __key, __func);
++
++ if(__key == NULL) {
++ _D("<%s/%s():%lu> == EINVAL\n", __FILE__, __FUNCTION__, __LINE__);
++ return EINVAL;
++ }
++
++ if (LIB_MINVER((struct Library *) EXEC_BASE_NAME, 51, 46)) {
++ ULONG index;
++ SIG_LOCK();
++ index = TLSAlloc(__func ? TLSTAG_DESTRUCTOR : TAG_IGNORE, (IPTR) __func, TAG_DONE);
++ SIG_UNLOCK();
++ if (index == TLS_INVALID_INDEX)
++ return ENOMEM;
++ *__key = (__gthread_key_t) index;
++ return 0;
++ }
++
++ key_internal = (__internal_key_t *) malloc(sizeof(*key_internal));
++ if(key_internal == NULL) {
++ _D("<%s/%s():%lu> == ENOMEM\n", __FILE__, __FUNCTION__, __LINE__);
++ return ENOMEM;
++ }
++
++ /* Setup key */
++ key_internal->key_dtor = __func;
++ key_internal->key_tree = 0;
++ memset(&key_internal->key_sem, 0, sizeof(key_internal->key_sem));
++ SIG_LOCK();
++ InitSemaphore(&key_internal->key_sem);
++
++ ObtainSemaphore(&keysema);
++ addtail(&keylist, &key_internal->key_node);
++ ReleaseSemaphore(&keysema);
++
++ _D("<%s/%s():%lu> key_internal[key_dtor == 0x%p, &key_tree == 0x%p, key_sem == 0x%p]\n", __FILE__, __FUNCTION__, __LINE__, key_internal->key_dtor, &key_internal->key_tree,
&key_internal->key_sem);
++
++ *__key = (__gthread_key_t) key_internal;
++
++ _D("<%s/%s():%lu> == 0\n", __FILE__, __FUNCTION__, __LINE__);
++
++ SIG_UNLOCK();
++ return 0;
++}
++
++/* __gthr_morphos_key_delete */
++int __gthr_morphos_key_delete (__gthread_key_t __key)
++{
++ __internal_key_t *key_internal = (__internal_key_t *) __key;
++ __internal_key_node_t *key_node, *next_node;
++#if !USE_THREAD_ONLY_SETSPECIFIC
++ ULONG __pid = 0;
++ int is_thread;
++#endif
++ SIG_DEF
++
++ _D("<%s/%s():%lu> __gthread_key_t == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, __key);
++
++ if (LIB_MINVER((struct Library *) EXEC_BASE_NAME, 51, 46)) {
++ LONG rc;
++ SIG_LOCK();
++ rc = TLSFree((ULONG) __key);
++ SIG_UNLOCK();
++ return rc ? 0 : EINVAL;
++ }
++
++ if(key_internal == NULL) {
++ _D("<%s/%s():%lu> == EINVAL\n", __FILE__, __FUNCTION__, __LINE__);
++ return EINVAL;
++ }
++
++ SIG_LOCK();
++
++#if !USE_THREAD_ONLY_SETSPECIFIC
++ is_thread = GetThreadInternal(NULL) != NULL;
++ NewGetTaskAttrsA(NULL, &__pid, sizeof(__pid), TASKINFOTYPE_PID, NULL);
++#endif
++
++ ObtainSemaphore(&keysema);
++ noderemove(&key_internal->key_node);
++ ReleaseSemaphore(&keysema);
++
++ /* Free all the nodes - note that it is up to the application to make sure
++ there no are races accessing the key at this stage. */
++
++ for(key_node = (__internal_key_node_t *) AVL_FindFirstNode(key_internal->key_tree);
++ key_node;
++ key_node = next_node) {
++ next_node = (__internal_key_node_t *) AVL_FindNextNodeByAddress(&key_node->node);
++
++#if !USE_THREAD_ONLY_SETSPECIFIC
++ /* Call the destructor if the delete is called by the non-thread
++ owner of this specific node. */
++ if(!is_thread && key_internal->key_dtor && key_node->val && key_node->owner == __pid) {
++ void *oldvalue = key_node->val;
++ key_node->val = NULL;
++ key_internal->key_dtor(oldvalue);
++ }
++#endif
++ /* free resources associated with the node */
++ free(key_node);
++ }
++
++ free(key_internal);
++
++ _D("<%s/%s():%lu> == 0\n", __FILE__, __FUNCTION__, __LINE__);
++ SIG_UNLOCK();
++
++ return 0;
++}
++
++static LONG ownernodecomparfunc(struct AVLNode *avlnode1, struct AVLNode *avlnode2)
++{
++ const __internal_key_node_t *key_node1 = (const __internal_key_node_t *) avlnode1;
++ const __internal_key_node_t *key_node2 = (const __internal_key_node_t *) avlnode2;
++ return (LONG) ((IPTR) key_node1->owner - (IPTR) key_node2->owner);
++}
++static LONG ownerkeycomparfunc(struct AVLNode *avlnode1, AVLKey avlkey)
++{
++ const __internal_key_node_t *key_node1 = (const __internal_key_node_t *) avlnode1;
++ return (LONG) ((IPTR) key_node1->owner - (IPTR) avlkey);
++}
++
++static __internal_key_node_t *__gthr_morphos_find_specific_node(__internal_key_t *key_internal, ULONG pid)
++{
++ __internal_key_node_t *key_node;
++ key_node = (__internal_key_node_t *) AVL_FindNode(key_internal->key_tree, (AVLKey) pid, (AVLKEYCOMP) ownerkeycomparfunc);
++ _D("<%s/%s():%lu> == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, key_node);
++ return key_node;
++}
++
++#define GTHREAD_DESTRUCTOR_ITERATIONS 4
++
++static void thread_cleanup(void)
++{
++ ULONG __pid = 0;
++ int foundkey, i;
++ SIG_DEF
++
++ SIG_LOCK();
++
++ NewGetTaskAttrsA(NULL, &__pid, sizeof(__pid), TASKINFOTYPE_PID, NULL);
++
++ /* Destroy all non-NULL key values for this thread.
++ Since the destructors can set the keys themselves, we have to
++ do multiple iterations. */
++
++ for(foundkey = 1, i = 0; foundkey && i < GTHREAD_DESTRUCTOR_ITERATIONS; i++) {
++ __internal_key_t *key_internal;
++ foundkey = 0;
++ ObtainSemaphore(&keysema);
++ for(key_internal = (__internal_key_t *) keylist.mlh_Head;
++ key_internal->key_node.mln_Succ;
++ key_internal = (__internal_key_t *) key_internal->key_node.mln_Succ) {
++ __internal_key_node_t *key_node;
++
++ ObtainSemaphore(&key_internal->key_sem);
++ key_node = __gthr_morphos_find_specific_node(key_internal, __pid);
++ if(key_node) {
++ if(key_internal->key_dtor && key_node->val) {
++ void *oldvalue = key_node->val;
++ key_node->val = NULL;
++ key_internal->key_dtor(oldvalue);
++ foundkey = 1;
++ }
++
++ /* unlink the node from the tree */
++ AVL_RemNodeByAddress(&key_internal->key_tree, &key_node->node);
++ /* free resources associated with the node */
++ free(key_node);
++ }
++
++ /* You might think that it would make sense to try to purge
++ keys that become "empty" here. However, this would break
++ calls to __gthread_key_delete. So don't do it. */
++ ReleaseSemaphore(&key_internal->key_sem);
++ }
++ ReleaseSemaphore(&keysema);
++ }
++
++ SIG_UNLOCK();
++}
++
++/* __gthr_morphos_getspecific */
++void *__gthr_morphos_getspecific (__gthread_key_t __key)
++{
++ __internal_key_t *key_internal = (__internal_key_t *) __key;
++ __internal_key_node_t *key_node;
++ ULONG __pid = 0;
++ SIG_DEF
++
++ _D("<%s/%s():%lu> __gthread_key_t == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, __key);
++
++ if (LIB_MINVER((struct Library *) EXEC_BASE_NAME, 51, 46)) {
++ /* NOTE: TLSGetValue doesn't require signal locking */
++ return (void *) TLSGetValue((ULONG) __key);
++ }
++
++ if(key_internal == NULL) {
++ _D("<%s/%s():%lu> == NULL\n", __FILE__, __FUNCTION__, __LINE__);
++ return NULL;
++ }
++
++ SIG_LOCK();
++
++ NewGetTaskAttrsA(NULL, &__pid, sizeof(__pid), TASKINFOTYPE_PID, NULL);
++
++ ObtainSemaphoreShared(&key_internal->key_sem);
++ key_node = __gthr_morphos_find_specific_node(key_internal, __pid);
++ ReleaseSemaphore(&key_internal->key_sem);
++
++ _D("<%s/%s():%lu> == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, key_node ? key_node->val : NULL);
++
++ SIG_UNLOCK();
++
++ return key_node ? CONST_CAST(void *, key_node->val) : NULL;
++}
++
++/* __gthr_morphos_setspecific */
++int __gthr_morphos_setspecific (__gthread_key_t __key, const void *__v)
++{
++ __internal_key_t *key_internal = (__internal_key_t *) __key;
++ __internal_key_node_t *key_node;
++ ULONG __pid = 0;
++ SIG_DEF
++
++ _D("<%s/%s():%lu> __gthread_key_t == 0x%p, __v == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, __key, __v);
++
++ if (LIB_MINVER((struct Library *) EXEC_BASE_NAME, 51, 46)) {
++ int rc;
++ SIG_LOCK();
++ rc = TLSSetValue((ULONG) __key, (APTR) __v) ? 0 : ENOMEM;
++ SIG_UNLOCK();
++ return rc;
++ }
++
++ /* Illegal for keys already destroyed by __gthread_key_delete */
++ if(key_internal == NULL) {
++ _D("<%s/%s():%lu> == EINVAL\n", __FILE__, __FUNCTION__, __LINE__);
++ return EINVAL;
++ }
++
++ SIG_LOCK();
++
++#if USE_THREAD_ONLY_SETSPECIFIC
++ if(GetThreadInternal(NULL) == NULL) {
++ /* Tried to setspecific for not a thread. */
++ _D("<%s/%s():%lu> == EINVAL\n", __FILE__, __FUNCTION__, __LINE__);
++ SIG_UNLOCK();
++ return EINVAL;
++ }
++#endif
++
++ NewGetTaskAttrsA(NULL, &__pid, sizeof(__pid), TASKINFOTYPE_PID, NULL);
++
++ ObtainSemaphore(&key_internal->key_sem);
++
++ key_node = __gthr_morphos_find_specific_node(key_internal, __pid);
++
++ if(key_node != NULL) {
++ /* Update existing node */
++ _D("<%s/%s():%lu> key_node->val 0x%p -> 0x%p\n", __FILE__, __FUNCTION__, __LINE__, key_node->val, __v);
++ key_node->val = (void *) __v;
++
++ ReleaseSemaphore(&key_internal->key_sem);
++
++ _D("<%s/%s():%lu> == 0\n", __FILE__, __FUNCTION__, __LINE__);
++
++ SIG_UNLOCK();
++ return 0;
++ }
++
++ /* Create a new node */
++ key_node = (__internal_key_node_t *) malloc(sizeof(*key_node));
++
++ if(key_node == NULL) {
++ ReleaseSemaphore(&key_internal->key_sem);
++
++ _D("<%s/%s():%lu> == ENOMEM\n", __FILE__, __FUNCTION__, __LINE__);
++
++ SIG_UNLOCK();
++ return ENOMEM;
++ }
++
++ key_node->owner = __pid;
++ key_node->val = (void *) __v;
++
++ _D("<%s/%s():%lu> key_node->val == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, key_node->val);
++ AVL_AddNode(&key_internal->key_tree, &key_node->node, (AVLNODECOMP) ownernodecomparfunc);
++
++ ReleaseSemaphore(&key_internal->key_sem);
++
++ _D("<%s/%s():%lu> == 0\n", __FILE__, __FUNCTION__, __LINE__);
++
++ SIG_UNLOCK();
++ return 0;
++}
++
++/* __gthr_morphos_mutex_init_function */
++void __gthr_morphos_mutex_init_function (__gthread_mutex_t *_gthr_mutex)
++{
++ __internal_mutex_t *__mutex = (__internal_mutex_t *) _gthr_mutex;
++ SIG_DEF
++
++ _D("<%s/%s():%lu> __gthread_mutex_t == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, __mutex);
++
++ if(__mutex == NULL) {
++ return;
++ }
++
++ SIG_LOCK();
++ InitSemaphore(&__mutex->u.__sem);
++ SIG_UNLOCK();
++
++ __mutex->incond = 0;
++}
++
++/* __gthr_morphos_mutex_destroy */
++int __gthr_morphos_mutex_destroy (__gthread_mutex_t *_gthr_mutex)
++{
++ __internal_mutex_t *__mutex = (__internal_mutex_t *) _gthr_mutex;
++ SIG_DEF
++
++ _D("<%s/%s():%lu> __gthread_mutex_t == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, __mutex);
++
++ if(__mutex == NULL) {
++ _D("<%s/%s():%lu> == EINVAL\n", __FILE__, __FUNCTION__, __LINE__);
++ return EINVAL;
++ }
++
++ if(SemaphoreIsInvalid(&__mutex->u.__sem)) {
++ /* static mutex not yet initialized, so do nothing */
++ return 0;
++ }
++
++ SIG_LOCK();
++
++ if(!AttemptSemaphore(&__mutex->u.__sem)) {
++ _D("<%s/%s():%lu> == EBUSY\n", __FILE__, __FUNCTION__, __LINE__);
++
++ SIG_UNLOCK();
++ return EBUSY;
++ }
++
++ if(__mutex->incond) {
++ _D("<%s/%s():%lu> == EBUSY\n", __FILE__, __FUNCTION__, __LINE__);
++ ReleaseSemaphore(&__mutex->u.__sem);
++
++ SIG_UNLOCK();
++ return EBUSY;
++ }
++
++ memset(&__mutex->u.__sem, 0, sizeof(__mutex->u.__sem));
++ __gthr_morphos_mutex_init_function(_gthr_mutex);
++
++ _D("<%s/%s():%lu> == 0\n", __FILE__, __FUNCTION__, __LINE__);
++
++ SIG_UNLOCK();
++ return 0;
++}
++
++static int __gthr_morphos_mutex_lock_generic (__gthread_mutex_t *_gthr_mutex, int recursive)
++{
++ __internal_mutex_t *__mutex = (__internal_mutex_t *) _gthr_mutex;
++ SIG_DEF
++
++ _D("<%s/%s():%lu> __gthread_mutex_t == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, __mutex);
++
++ if(__mutex == NULL) {
++ _D("<%s/%s():%lu> == EINVAL\n", __FILE__, __FUNCTION__, __LINE__);
++ return EINVAL;
++
++ }
++
++ SIG_LOCK();
++
++ /* initialize static mutex */
++ Forbid();
++ if(SemaphoreIsInvalid(&__mutex->u.__sem))
++ __gthr_morphos_mutex_init_function(_gthr_mutex);
++ Permit();
++
++ ObtainSemaphore(&__mutex->u.__sem);
++
++ if(!recursive && __mutex->u.__sem.ss_NestCount > 1) {
++ ReleaseSemaphore(&__mutex->u.__sem);
++ _D("<%s/%s():%lu> == EDEADLK\n", __FILE__, __FUNCTION__, __LINE__);
++ SIG_UNLOCK();
++ return EDEADLK;
++ }
++
++ _D("<%s/%s():%lu> == 0\n", __FILE__, __FUNCTION__, __LINE__);
++
++ SIG_UNLOCK();
++ return 0;
++}
++
++/* __gthr_morphos_mutex_lock */
++int __gthr_morphos_mutex_lock (__gthread_mutex_t *_gthr_mutex)
++{
++ return __gthr_morphos_mutex_lock_generic (_gthr_mutex, 0);
++}
++
++static int __gthr_morphos_mutex_trylock_generic (__gthread_mutex_t *_gthr_mutex, int recursive)
++{
++ __internal_mutex_t *__mutex = (__internal_mutex_t *) _gthr_mutex;
++ LONG rc;
++ SIG_DEF
++
++ _D("<%s/%s():%lu> __gthread_mutex_t == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, __mutex);
++
++ if(__mutex == NULL) {
++ _D("<%s/%s():%lu> == EINVAL\n", __FILE__, __FUNCTION__, __LINE__);
++ return EINVAL;
++ }
++
++ SIG_LOCK();
++
++ /* initialize static mutex */
++ Forbid();
++ if(SemaphoreIsInvalid(&__mutex->u.__sem))
++ __gthr_morphos_mutex_init_function(_gthr_mutex);
++ Permit();
++
++ rc = AttemptSemaphore(&__mutex->u.__sem);
++
++ if(rc) {
++ if(!recursive && __mutex->u.__sem.ss_NestCount > 1) {
++ ReleaseSemaphore(&__mutex->u.__sem);
++ _D("<%s/%s():%lu> == EDEADLK\n", __FILE__, __FUNCTION__, __LINE__);
++ SIG_UNLOCK();
++ return EDEADLK;
++ }
++ } else {
++ _D("<%s/%s():%lu> == EBUSY\n", __FILE__, __FUNCTION__, __LINE__);
++ SIG_UNLOCK();
++ return EBUSY;
++ }
++
++ _D("<%s/%s():%lu> == 0\n", __FILE__, __FUNCTION__, __LINE__);
++ SIG_UNLOCK();
++ return 0;
++}
++
++/* __gthr_morphos_mutex_trylock */
++int __gthr_morphos_mutex_trylock (__gthread_mutex_t *__mutex)
++{
++ return __gthr_morphos_mutex_trylock_generic (__mutex, 0);
++}
++
++/* __gthr_morphos_mutex_unlock */
++int __gthr_morphos_mutex_unlock (__gthread_mutex_t *_gthr_mutex)
++{
++ __internal_mutex_t *__mutex = (__internal_mutex_t *) _gthr_mutex;
++ SIG_DEF
++
++ _D("<%s/%s():%lu> __gthread_mutex_t == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, __mutex);
++
++ if(__mutex == NULL) {
++ _D("<%s/%s():%lu> == EINVAL\n", __FILE__, __FUNCTION__, __LINE__);
++ return EINVAL;
++ }
++
++ SIG_LOCK();
++
++ /* initialize static mutex */
++ Forbid();
++ if(SemaphoreIsInvalid(&__mutex->u.__sem))
++ __gthr_morphos_mutex_init_function(_gthr_mutex);
++ Permit();
++
++ if(__mutex->u.__sem.ss_Owner != FindTask(NULL)) {
++ _D("<%s/%s():%lu> == EPERM\n", __FILE__, __FUNCTION__, __LINE__);
++ SIG_UNLOCK();
++ return EPERM;
++ }
++
++ ReleaseSemaphore(&__mutex->u.__sem);
++
++ _D("<%s/%s():%lu> == 0\n", __FILE__, __FUNCTION__, __LINE__);
++
++ SIG_UNLOCK();
++ return 0;
++}
++
++
++static inline void UNIXTIME_TO_AMIGATIME(const struct TimeVal *from, struct TimeVal *to)
++{
++ const ULONG unix_to_amiga = (8 * 365 + 2) * 24 * 60 * 60;
++
++ if(from->tv_secs >= unix_to_amiga) {
++ to->tv_secs = from->tv_secs - unix_to_amiga;
++ to->tv_micro = from->tv_micro;
++ } else {
++ to->tv_secs = 0;
++ to->tv_micro = 0;
++ }
++}
++
++static int __gthr_morphos_mutex_timedlock_generic (__gthread_mutex_t *_gthr_mutex,
++ const __gthread_time_t *abs_timeout,
++ int recursive)
++{
++ __internal_mutex_t *__mutex = (__internal_mutex_t *) _gthr_mutex;
++ struct MsgPort mp;
++ struct SemaphoreMessage bidmsg;
++ struct timerequest tr;
++ struct Message *msg;
++ SIG_DEF
++
++ _D("<%s/%s():%lu> __gthread_mutex_t == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, __mutex);
++
++ if(__mutex == NULL) {
++ _D("<%s/%s():%lu> == EINVAL\n", __FILE__, __FUNCTION__, __LINE__);
++ return EINVAL;
++ }
++
++ SIG_LOCK();
++
++ /* initialize static mutex */
++ Forbid();
++ if(SemaphoreIsInvalid(&__mutex->u.__sem))
++ __gthr_morphos_mutex_init_function(_gthr_mutex);
++ Permit();
++
++ if(AttemptSemaphore(&__mutex->u.__sem)) {
++ if(!recursive && __mutex->u.__sem.ss_NestCount > 1) {
++ ReleaseSemaphore(&__mutex->u.__sem);
++ SIG_UNLOCK();
++ return EDEADLK;
++ }
++ SIG_UNLOCK();
++ return 0;
++ }
++
++ if(abs_timeout->tv_sec < 0 || abs_timeout->tv_nsec < 0 || abs_timeout->tv_nsec > 999999999) {
++ _D("<%s/%s():%lu> == EINVAL\n", __FILE__, __FUNCTION__, __LINE__);
++
++ SIG_UNLOCK();
++ return EINVAL;
++ }
++
++ mp.mp_Node.ln_Type = NT_MSGPORT;
++ mp.mp_Flags = PA_SIGNAL;
++ mp.mp_SigBit = AllocSignal(-1);
++ if((BYTE)mp.mp_SigBit == -1) {
++ mp.mp_SigBit = SIGBREAKB_CTRL_F;
++ SetSignal(1UL << mp.mp_SigBit, 0);
++ }
++ mp.mp_SigTask = FindTask(NULL);
++ newlist((struct MinList *) &mp.mp_MsgList);
++
++ tr.tr_node.io_Message.mn_Node.ln_Type = NT_REPLYMSG;
++ tr.tr_node.io_Message.mn_ReplyPort = ∓
++ tr.tr_node.io_Message.mn_Length = sizeof(tr);
++
++ if(OpenDevice(TIMERNAME, UNIT_WAITUTC, (APTR) &tr, 0) != 0) {
++ if(mp.mp_SigBit != SIGBREAKB_CTRL_F)
++ FreeSignal(mp.mp_SigBit);
++
++ SIG_UNLOCK();
++ return ENOTSUP;
++ }
++
++ bidmsg.ssm_Message.mn_Node.ln_Type = NT_MESSAGE;
++ bidmsg.ssm_Message.mn_Node.ln_Name = (APTR) 0; /* exclusive lock */
++ bidmsg.ssm_Message.mn_ReplyPort = ∓
++ bidmsg.ssm_Message.mn_Length = sizeof(bidmsg);
++ Procure(&__mutex->u.__sem, &bidmsg);
++
++ tr.tr_node.io_Command = TR_ADDREQUEST;
++ tr.tr_time.tv_secs = abs_timeout->tv_sec;
++ tr.tr_time.tv_micro = abs_timeout->tv_nsec / 1000;
++ UNIXTIME_TO_AMIGATIME(&tr.tr_time, &tr.tr_time);
++ SendIO((APTR) &tr);
++
++ msg = WaitPort(&mp);
++
++ if(!CheckIO((APTR) &tr)) {
++ AbortIO((APTR) &tr);
++ WaitIO((APTR) &tr);
++ }
++
++ CloseDevice((APTR) &tr);
++
++ if(msg == &tr.tr_node.io_Message)
++ Vacate(&__mutex->u.__sem, &bidmsg);
++
++ if((BYTE)mp.mp_SigBit != SIGBREAKB_CTRL_F)
++ FreeSignal(mp.mp_SigBit);
++
++ SIG_UNLOCK();
++
++ return msg == &tr.tr_node.io_Message ? ETIMEDOUT : 0;
++}
++
++/* __gthr_morphos_mutex_timedlock */
++int __gthr_morphos_mutex_timedlock (__gthread_mutex_t *__mutex,
++ const __gthread_time_t *__abs_timeout)
++{
++ return __gthr_morphos_mutex_timedlock_generic (__mutex, __abs_timeout, 0);
++}
++
++/* __gthr_morphos_recursive_mutex_init_function */
++void __gthr_morphos_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex)
++{
++ __gthr_morphos_mutex_init_function (__mutex);
++}
++
++/* __gthr_morphos_recursive_mutex_lock */
++int __gthr_morphos_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex)
++{
++ return __gthr_morphos_mutex_lock_generic (__mutex, 1);
++}
++
++/* __gthr_morphos_recursive_mutex_trylock */
++int __gthr_morphos_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex)
++{
++ return __gthr_morphos_mutex_trylock_generic (__mutex, 1);
++}
++
++/* __gthr_morphos_recursive_mutex_unlock */
++int __gthr_morphos_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex)
++{
++ return __gthr_morphos_mutex_unlock (__mutex);
++}
++
++/* __gthr_morphos_recursive_mutex_timedlock */
++int __gthr_morphos_recursive_mutex_timedlock (__gthread_recursive_mutex_t *__mutex,
++ const __gthread_time_t *__abs_time)
++{
++ return __gthr_morphos_mutex_timedlock_generic (__mutex, __abs_time, 1);
++}
++
++/* Thread */
++
++#ifdef __ixemul
++
++static void safe_ix_user_release_sockets(struct user50 *u)
++{
++ if (LIB_MINVER((struct Library *)u->u_ixbase, 50, 18))
++ {
++ ix_user_release_sockets((struct user *) u);
++ }
++ else
++ {
++ int i;
++ for(i = 0; i < NOFILE50; i++)
++ {
++ if(u->u_ofile[i] && u->u_ofile[i]->f_type == DTYPE_SOCKET50)
++ u->u_ofile[i]->f_socket_id = ix_release_socket(i);
++ }
++ }
++}
++
++static int safe_ix_user_clone_parent(struct user50 *pu, struct user50 *mu)
++{
++ int a4_size;
++ int fd;
++ SIG_DEF
++
++ if (LIB_MINVER((struct Library *)mu->u_ixbase, 50, 18))
++ {
++ return ix_user_clone_parent((struct user *) pu, (struct user *) mu);
++ }
++
++ a4_size = pu->u_a4_pointers_size * 4;
++
++ mu->u_is_ppc = pu->u_is_ppc;
++
++ /* don't mess with process pointers for now */
++ mu->p_osptr = 0;
++ mu->p_ysptr = 0;
++ mu->p_pptr = 0;
++
++ SIG_LOCK();
++ Forbid();
++
++ /* inherit the session of our parent */
++ mu->u_session = pu->u_session;
++ if(mu->u_session)
++ mu->u_session->s_count++; /* and increase use count */
++
++ /* inherit the process group of our parent */
++ mu->p_pgrp = pu->p_pgrp;
++
++ /* inherit the uid/gid information from parent */
++ mu->u_ruid = pu->u_ruid;
++ mu->u_euid = pu->u_euid;
++ mu->u_rgid = pu->u_rgid;
++ mu->u_egid = pu->u_egid;
++
++ if((mu->u_ngroups = pu->u_ngroups))
++ bcopy((char *)pu->u_grouplist, (char *)mu->u_grouplist, pu->u_ngroups * sizeof(int));
++
++ if((mu->u_logname_valid = pu->u_logname_valid))
++ strcpy((char *)mu->u_logname, (char *)pu->u_logname);
++
++ /*shmfork(pu, mu);*/
++
++ /* borrow the variables of the parent */
++ mu->u_environ = pu->u_environ;
++ mu->u_errno = pu->u_errno;
++
++ /* tell malloc to use the parents malloc lists */
++ mu->u_mdp = pu->u_mdp;
++
++ /* and inherit several other things as well, upto not including u_md */
++ bcopy ((void *)&pu->u_a4_pointers_size, (void *)&mu->u_a4_pointers_size,
++ offsetof (struct user50, u_md) - offsetof (struct user50, u_a4_pointers_size));
++ bcopy ((char *)pu - a4_size, (char *)mu - a4_size, a4_size);
++
++ /* some things have been copied that should be reset */
++ mu->p_flag &= ~(SFREEA450 | STRC50);
++ mu->p_xstat = 0;
++ bzero ((void *)&mu->u_ru, sizeof (struct rusage50));
++ bzero ((void *)&mu->u_prof, sizeof (struct uprof50));
++ mu->u_prof_last_pc = 0;
++ bzero ((void *)&mu->u_cru, sizeof (struct rusage50));
++ bzero ((void *)&mu->u_timer[0], sizeof (struct itimerval50)); /* just the REAL timer! */
++ gettimeofday ((struct timeval *) & mu->u_start, 0);
++
++ /* and adjust the open count of each of the copied filedescriptors */
++ for(fd = 0; fd < NOFILE50; fd++)
++ {
++ if(!mu->u_ofile[fd])
++ continue;
++
++ /* obtain (and create a new fd) for INET sockets */
++ if(mu->u_ofile[fd]->f_type == DTYPE_SOCKET50)
++ {
++ int newfd, fd2;
++
++ /* Was this socket released? */
++ if(!mu->u_ofile[fd]->f_socket_id)
++ continue;
++
++ /* Yes, it was. So we now obtain a new socket from the underlying TCP/IP stack */
++ newfd = ix_obtain_socket(mu->u_ofile[fd]->f_socket_id,
++ mu->u_ofile[fd]->f_socket_domain,
++ mu->u_ofile[fd]->f_socket_type,
++ mu->u_ofile[fd]->f_socket_protocol);
++
++ mu->u_ofile[fd]->f_socket_id = 0;
++
++ if(newfd == -1)
++ continue;
++
++ /* Move the newly created fd to the old one.
++
++ Tricky bit: we have to remember that for dupped sockets all file descriptors
++ point to the same file structure: obtaining one released file descriptor will
++ obtain them all. So we have to scan for file descriptors that point to the
++ same file structure for which we just obtained the socket and copy the new
++ file structure into the dupped file descriptors.
++
++ Note that the newly created file structure has the field f_socket_id set to 0,
++ so we won't come here again because of the if-statement above that tests whether
++ the socket was released. */
++
++ /* scan the file descriptors */
++ for(fd2 = fd + 1; fd2 < NOFILE50; fd2++)
++ {
++ /* do they point to the same file structure? */
++ if(mu->u_ofile[fd] == mu->u_ofile[fd2])
++ {
++ /* in that case copy the newly obtained socket into this file descriptor
++ and increase the open count */
++ mu->u_ofile[fd2] = mu->u_ofile[newfd];
++ mu->u_ofile[newfd]->f_count++;
++ }
++ }
++ /* and finally do the same for fd */
++ mu->u_ofile[fd] = mu->u_ofile[newfd];
++ mu->u_ofile[newfd] = 0;
++ }
++ else
++ mu->u_ofile[fd]->f_count++;
++ }
++
++ /* also copy u_segs, after all, the child will run initially in the
++ same SegList as the parent. */
++ mu->u_segs = pu->u_segs;
++ mu->u_start_pc = pu->u_start_pc;
++ mu->u_end_pc = pu->u_end_pc;
++
++ mu->u_is_root = pu->u_is_root;
++ mu->u_a4 = pu->u_a4;
++
++ Permit();
++ SIG_UNLOCK();
++
++ return 0;
++}
++
++static void safe_ix_user_cleanup(struct user50 *mu)
++{
++ int i;
++
++ if (LIB_MINVER((struct Library *)mu->u_ixbase, 50, 18))
++ {
++ ix_user_cleanup((struct user *) mu);
++ return;
++ }
++
++ for(i = 0; i < NOFILE50; i++)
++ if(mu->u_ofile[i])
++ close(i);
++}
++#endif
++
++static void entryfunc(struct taskmsg *msg)
++{
++ struct Process *self = (struct Process *) FindTask(NULL);
++#ifdef __ixemul
++ struct MsgPort fakemp;
++ struct WBStartup wbmsg;
++ struct Library *ixbase;
++ struct user50 *mu;
++#endif
++ addtail((struct MinList *) &self->pr_Task.tc_MemEntry, (struct MinNode *) &msg->ml->ml_Node);
++
++#ifdef __ixemul
++ /* pr_CLI is NULL since we are a process, so ix_open will expect a wb message. Fake one. */
++ fakemp.mp_Node.ln_Type = NT_MSGPORT;
++ fakemp.mp_Flags = PA_IGNORE;
++ newlist((struct MinList *) &fakemp.mp_MsgList);
++ wbmsg.sm_Message.mn_Node.ln_Type = NT_MESSAGE;
++ wbmsg.sm_Message.mn_ReplyPort = &fakemp;
++ wbmsg.sm_Message.mn_Length = sizeof(wbmsg);
++ wbmsg.sm_Process = &self->pr_MsgPort;
++ wbmsg.sm_NumArgs = 0;
++ wbmsg.sm_ToolWindow = NULL;
++ wbmsg.sm_ArgList = 0;
++ PutMsg(&self->pr_MsgPort, &wbmsg.sm_Message);
++ ixbase = OpenLibrary("ixemul.library", 0);
++
++#if !USE_THREAD_SAFETYNET
++#warning "This code is unsafe unless if USE_THREAD_SAFETYNET is defined"
++#endif
++ mu = (struct user50 *) ix_get_long(IXID_USER, 0);
++ safe_ix_user_clone_parent(msg->parent, mu);
++ ReplyMsg(&msg->syncmsg);
++ sigsetmask(msg->sigmask);
++#endif
++
++ msg->func(msg->args);
++
++#ifdef __ixemul
++ sigsetmask(~0);
++#endif
++
++ /* free keys associated to this thread */
++ if (LIB_MINVER((struct Library *) EXEC_BASE_NAME, 51, 46))
++ TLSCallDestructors(NULL); /* NOTE: Signals are locked for ixemul above */
++ else
++ thread_cleanup();
++
++#ifdef __ixemul
++ safe_ix_user_cleanup(mu);
++
++ CloseLibrary(ixbase);
++#endif
++
++#if USE_THREAD_SAFETYNET
++ Forbid();
++ noderemove(&msg->node);
++#endif
++}
++
++/* Must be called with signals locked and Forbid() */
++static int __gthr_morphos_join_generic (struct Task *task)
++{
++ struct taskmsg *msg;
++ struct MsgPort mp;
++
++ msg = GetThreadInternal(task);
++ if(msg == NULL) {
++ /* No thread with the ID thread could be found. */
++ return ESRCH;
++ }
++
++ /* Is it a detached thread? */
++ if(msg->deathport.mp_SigBit == 0xff) {
++ /* Thread is not a joinable thread. */
++ return EINVAL;
++ }
++
++ if(msg->m.mn_ReplyPort != &msg->deathport) {
++ /* Another thread is already waiting to join with this thread. */
++ return EINVAL;
++ }
++
++ mp.mp_Node.ln_Type = NT_MSGPORT;
++ mp.mp_Flags = PA_SIGNAL;
++ mp.mp_SigBit = AllocSignal(-1);
++ if((BYTE) mp.mp_SigBit == -1) {
++ mp.mp_SigBit = SIGB_SINGLE;
++ }
++ mp.mp_SigTask = FindTask(NULL);
++ newlist((struct MinList *) &mp.mp_MsgList);
++
++ msg->m.mn_ReplyPort = ∓
++
++ /* WaitPort() will break Forbid() as needed */
++ WaitPort(&mp);
++
++ if(mp.mp_SigBit != SIGB_SINGLE)
++ FreeSignal(mp.mp_SigBit);
++
++ return 0;
++}
++
++#if USE_THREAD_SAFETYNET
++
++static void __gthr_morphos_internal_create_cleanup(void)
++{
++ SIG_DEF
++
++ /* Join all pending threads */
++ SIG_LOCK();
++ Forbid();
++ for(;;) {
++ struct MinNode *node;
++ struct Task *task;
++
++ node = (struct MinNode *) threadlist.mlh_Head;
++ if(node->mln_Succ == NULL) {
++ /* The list is empty, we're done */
++ break;
++ }
++ task = ((struct taskmsg *) (((char *) node) - offsetof(struct taskmsg, node)))->task;
++
++ /* Note: breaks Forbid() when needed */
++ if(__gthr_morphos_join_generic(task) != 0)
++ usleep(1000000 / 100); /* On error sleep 1/100th a second */
++ }
++ Permit();
++ SIG_UNLOCK();
++}
++
++static void __gthr_morphos_internal_create_setup(void)
++{
++ if(atexit(__gthr_morphos_internal_create_cleanup) != 0)
++ exit(EXIT_FAILURE);
++}
++
++#endif
++
++int __gthr_morphos_create (__gthread_t *threadid, void *(*func) (void*),
++ void *args)
++{
++ struct Library *DOSBase;
++ struct taskmsg *msg;
++ const struct MemList aml = {{NULL, NULL, 0, 0, NULL}, 1, {{{MEMF_CLEAR}, sizeof(*msg)}}};
++ struct MemList *ml;
++ ULONG parentppcsize, parent68ksize;
++ struct Process *proc;
++ SIG_DEF
++#ifdef __ixemul
++ struct Process *self;
++#endif
++
++#if USE_THREAD_SAFETYNET
++ {
++ static __gthread_once_t create = __GTHREAD_ONCE_INIT;
++ __gthr_morphos_once(&create, __gthr_morphos_internal_create_setup);
++ }
++#endif
++
++ SIG_LOCK();
++
++ ml = AllocEntry((struct MemList *) &aml);
++ if((IPTR) ml & (1UL << 31)) {
++ SIG_UNLOCK();
++ return EAGAIN;
++ }
++ msg = ml->ml_ME[0].me_Addr;
++ msg->ml = ml;
++ msg->m.mn_Node.ln_Type = NT_MESSAGE;
++ msg->m.mn_Node.ln_Name = msg->name; /* tested by GetThreadInternal for safety */
++ msg->m.mn_ReplyPort = &msg->deathport; /* used unless if __ghread_join is used */
++ msg->m.mn_Length = sizeof(*msg);
++ msg->deathport.mp_Node.ln_Type = NT_MSGPORT;
++ msg->deathport.mp_Flags = PA_IGNORE;
++ newlist((struct MinList *) &msg->deathport.mp_MsgList);
++ msg->func = func;
++ msg->args = args;
++#ifdef __ixemul
++ msg->parent = (struct user50 *) ix_get_long(IXID_USER, 0);
++ msg->sigmask = __omask;
++ self = (struct Process *) FindTask(NULL);
++ msg->syncmsg.mn_Node.ln_Type = NT_MESSAGE;
++ msg->syncmsg.mn_ReplyPort = &self->pr_MsgPort;
++ msg->syncmsg.mn_Length = sizeof(msg->syncmsg);
++#endif
++
++ DOSBase = OpenLibrary("dos.library", 50);
++ if(DOSBase == NULL) {
++ FreeEntry(ml);
++ SIG_UNLOCK();
++ return EAGAIN;
++ }
++
++ parentppcsize = 32768;
++ NewGetTaskAttrs(NULL, &parentppcsize, sizeof(parentppcsize), TASKINFOTYPE_STACKSIZE, TAG_DONE);
++ parent68ksize = 8192;
++ NewGetTaskAttrs(NULL, &parent68ksize, sizeof(parent68ksize), TASKINFOTYPE_STACKSIZE_M68K, TAG_DONE);
++
++#ifdef __ixemul
++ /* if some fd's are sockets, release them so the child can obtain them */
++ safe_ix_user_release_sockets(msg->parent);
++#endif
++
++#if USE_THREAD_SAFETYNET
++ Forbid();
++#endif
++
++ proc = CreateNewProcTags(NP_CodeType, CODETYPE_PPC,
++ NP_Name, (IPTR) "gthread",
++ NP_Entry, (IPTR) entryfunc,
++ NP_PPC_Arg1, (IPTR) msg,
++ NP_StartupMsg, (IPTR) msg,
++ NP_PPCStackSize, parentppcsize,
++ NP_StackSize, parent68ksize,
++ TAG_DONE);
++
++ CloseLibrary(DOSBase);
++
++ if(proc == NULL) {
++#if USE_THREAD_SAFETYNET
++ Permit();
++#endif
++ FreeEntry(ml);
++ SIG_UNLOCK();
++ return EAGAIN;
++ }
++
++#if USE_THREAD_SAFETYNET
++ msg->task = &proc->pr_Task;
++ addtail(&threadlist, &msg->node);
++ Permit();
++#endif
++
++ NewGetTaskAttrs(&proc->pr_Task, threadid, sizeof(*threadid), TASKINFOTYPE_PID, TAG_DONE);
++
++#ifdef __ixemul
++ WaitPort(&self->pr_MsgPort);
++ (void) GetMsg(&self->pr_MsgPort);
++#endif
++
++ SIG_UNLOCK();
++ return 0;
++}
++
++int __gthr_morphos_join (__gthread_t threadid, void **value_ptr)
++{
++ struct Task *task;
++ int rc;
++ SIG_DEF
++
++ if(value_ptr != NULL)
++ return ENOTSUP;
++
++ SIG_LOCK();
++ Forbid();
++
++ task = FindTaskByPID(threadid);
++ if(task == NULL) {
++ Permit();
++ SIG_UNLOCK();
++ return 0;
++ }
++
++ if(task == FindTask(NULL)) {
++ Permit();
++ /* Joining self would deadlock anyway. */
++ SIG_UNLOCK();
++ return EDEADLK;
++ }
++
++ rc = __gthr_morphos_join_generic(task);
++
++ Permit();
++ SIG_UNLOCK();
++ return rc;
++}
++
++int __gthr_morphos_detach (__gthread_t threadid)
++{
++ struct Task *task;
++ struct taskmsg *msg;
++ SIG_DEF
++
++ SIG_LOCK();
++ Forbid();
++
++ task = FindTaskByPID(threadid);
++ if(task == NULL) {
++ Permit();
++ SIG_UNLOCK();
++ return ESRCH;
++ }
++
++ msg = GetThreadInternal(task);
++ if(msg == NULL || msg->deathport.mp_SigBit == 0xff || msg->m.mn_ReplyPort != &msg->deathport) {
++ Permit();
++ /* Thread is not a joinable thread. */
++ SIG_UNLOCK();
++ return EINVAL;
++ }
++
++ msg->deathport.mp_SigBit = 0xff;
++
++ Permit();
++ SIG_UNLOCK();
++ return 0;
++}
++
++int __gthr_morphos_equal (__gthread_t t1, __gthread_t t2)
++{
++ return t1 == t2;
++}
++
++__gthread_t __gthr_morphos_self (void)
++{
++ __gthread_t threadid;
++ SIG_DEF
++
++ SIG_LOCK();
++ NewGetTaskAttrs(NULL, &threadid, sizeof(threadid), TASKINFOTYPE_PID, TAG_DONE);
++ SIG_UNLOCK();
++ return threadid;
++}
++
++int __gthr_morphos_yield (void)
++{
++ SIG_DEF
++
++ SIG_LOCK();
++ Forbid();
++ Permit(); /* Permit() causes a reschedule */
++ SIG_UNLOCK();
++ return 0;
++}
++
++/* Cond */
++
++void __gthr_morphos_cond_init_function (__gthread_cond_t *_gthr_cond)
++{
++ __internal_cond_t *__cond = (__internal_cond_t *) _gthr_cond;
++ SIG_DEF
++
++ _D("<%s/%s():%lu> __gthread_cond_t == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, __cond);
++
++ if(__cond == NULL) {
++ return;
++ }
++
++ SIG_LOCK();
++ InitSemaphore(&__cond->u1.__sem);
++ SIG_UNLOCK();
++ newlist(&__cond->u2.__waiters);
++}
++
++int __gthr_morphos_cond_destroy (__gthread_cond_t *_gthr_cond)
++{
++ __internal_cond_t *__cond = (__internal_cond_t *) _gthr_cond;
++ SIG_DEF
++
++ _D("<%s/%s():%lu> __gthread_cond_t == 0x%p\n", __FILE__, __FUNCTION__, __LINE__, __cond);
++
++ if(__cond == NULL) {
++ _D("<%s/%s():%lu> == EINVAL\n", __FILE__, __FUNCTION__, __LINE__);
++ return EINVAL;
++ }
++
++ if(SemaphoreIsInvalid(&__cond->u1.__sem)) {
++ /* static cond not yet initialized, so do nothing */
++ return 0;
++ }
++
++ SIG_LOCK();
++
++ if(!AttemptSemaphore(&__cond->u1.__sem)) {
++ SIG_UNLOCK();
++ return EBUSY;
++ }
++
++ if(!IsListEmpty((struct List *)&__cond->u2.__waiters)) {
++ ReleaseSemaphore(&__cond->u1.__sem);
++ SIG_UNLOCK();
++ return EBUSY;
++ }
++
++ memset(&__cond->u1.__sem, 0, sizeof(__cond->u1.__sem));
++ __gthr_morphos_cond_init_function(_gthr_cond);
++
++ _D("<%s/%s():%lu> == 0\n", __FILE__, __FUNCTION__, __LINE__);
++
++ SIG_UNLOCK();
++ return 0;
++}
++
++struct CondWaiter {
++ struct MinNode node;
++ struct Task *task;
++ ULONG sigmask;
++};
++
++static int __gthr_morphos_cond_broadcast_generic (__gthread_cond_t *_gthr_cond, int onlyfirst)
++{
++ __internal_cond_t *__cond = (__internal_cond_t *) _gthr_cond;
++ struct CondWaiter *waiter;
++ SIG_DEF
++
++ if(__cond == NULL) {
++ return EINVAL;
++ }
++
++ SIG_LOCK();
++
++ /* initialize static cond */
++ Forbid();
++ if(SemaphoreIsInvalid(&__cond->u1.__sem))
++ __gthr_morphos_cond_init_function(_gthr_cond);
++ Permit();
++
++ /* signal the waiting threads */
++ ObtainSemaphoreShared(&__cond->u1.__sem);
++
++ for(waiter = (struct CondWaiter *) __cond->u2.__waiters.mlh_Head;
++ waiter->node.mln_Succ;
++ waiter = (struct CondWaiter *) waiter->node.mln_Succ) {
++ Signal(waiter->task, waiter->sigmask);
++ if(onlyfirst)
++ break;
++ }
++
++ ReleaseSemaphore(&__cond->u1.__sem);
++
++ SIG_UNLOCK();
++ return 0;
++}
++
++int __gthr_morphos_cond_broadcast (__gthread_cond_t *_gthr_cond)
++{
++ return __gthr_morphos_cond_broadcast_generic (_gthr_cond, 0);
++}
++
++int __gthr_morphos_cond_timedwait (__gthread_cond_t *_gthr_cond,
++ __gthread_mutex_t *_gthr_mutex,
++ const __gthread_time_t *abs_timeout)
++{
++ __internal_cond_t *__cond = (__internal_cond_t *) _gthr_cond;
++ __internal_mutex_t *__mutex = (__internal_mutex_t *) _gthr_mutex;
++ struct CondWaiter waiter;
++ BYTE signal;
++ struct Task *self;
++ struct MsgPort mp;
++ struct timerequest tr;
++ int rc = 0;
++ SIG_DEF
++
++ if(__cond == NULL || __mutex == NULL) {
++ return EINVAL;
++ }
++
++ if(abs_timeout && (abs_timeout->tv_sec < 0 || abs_timeout->tv_nsec < 0 ||
++ abs_timeout->tv_nsec > 999999999)) {
++ return EINVAL;
++ }
++
++ SIG_LOCK();
++
++ Forbid();
++ /* initialize static cond & mutex */
++ if(SemaphoreIsInvalid(&__cond->u1.__sem))
++ __gthr_morphos_cond_init_function(_gthr_cond);
++ if(SemaphoreIsInvalid(&__mutex->u.__sem))
++ __gthr_morphos_mutex_init_function(_gthr_mutex);
++ Permit();
++
++ signal = AllocSignal(-1);
++ if(signal == -1) {
++ signal = SIGBREAKB_CTRL_F;
++ SetSignal(1UL << signal, 0);
++ }
++
++ self = FindTask(NULL);
++
++ if(abs_timeout) {
++ mp.mp_Node.ln_Type = NT_MSGPORT;
++ mp.mp_Flags = PA_SIGNAL;
++ mp.mp_SigBit = signal;
++ mp.mp_SigTask = self;
++ newlist((struct MinList *) &mp.mp_MsgList);
++
++ tr.tr_node.io_Message.mn_Node.ln_Type = NT_REPLYMSG;
++ tr.tr_node.io_Message.mn_ReplyPort = ∓
++ tr.tr_node.io_Message.mn_Length = sizeof(tr);
++
++ if(OpenDevice(TIMERNAME, UNIT_WAITUTC, (APTR) &tr, 0) != 0) {
++ if(signal != SIGBREAKB_CTRL_F)
++ FreeSignal(signal);
++ SIG_UNLOCK();
++ return ENOTSUP;
++ }
++
++ tr.tr_node.io_Command = TR_ADDREQUEST;
++ tr.tr_time.tv_secs = abs_timeout->tv_sec;
++ tr.tr_time.tv_micro = abs_timeout->tv_nsec / 1000;
++ UNIXTIME_TO_AMIGATIME(&tr.tr_time, &tr.tr_time);
++ SendIO((APTR) &tr);
++ }
++
++ /* prepare a waiter node */
++ waiter.task = self;
++ waiter.sigmask = 1UL << signal;
++
++ /* add it to the end of the list */
++ ObtainSemaphore(&__cond->u1.__sem);
++ addtail(&__cond->u2.__waiters, &waiter.node);
++ ReleaseSemaphore(&__cond->u1.__sem);
++
++ /* wait for the condition to be signalled or the timeout */
++ __mutex->incond++;
++ __gthr_morphos_mutex_unlock(_gthr_mutex);
++
++ Wait(1UL << signal);
++
++ __gthr_morphos_mutex_lock(_gthr_mutex);
++ __mutex->incond--;
++
++ /* remove the node from the list */
++ ObtainSemaphore(&__cond->u1.__sem);
++ noderemove(&waiter.node);
++ ReleaseSemaphore(&__cond->u1.__sem);
++
++ if(abs_timeout) {
++ if(CheckIO((APTR) &tr))
++ rc = ETIMEDOUT;
++ else {
++ AbortIO((APTR) &tr);
++ WaitIO((APTR) &tr);
++ }
++
++ CloseDevice((APTR) &tr);
++ }
++
++ if(signal != SIGBREAKB_CTRL_F)
++ FreeSignal(signal);
++
++ SIG_UNLOCK();
++ return rc;
++}
++
++int __gthr_morphos_cond_wait (__gthread_cond_t *_gthr_cond, __gthread_mutex_t *_gthr_mutex)
++{
++ return __gthr_morphos_cond_timedwait (_gthr_cond, _gthr_mutex, NULL);
++}
++
++int __gthr_morphos_cond_wait_recursive (__gthread_cond_t *_gthr_cond,
++ __gthread_recursive_mutex_t *_gthr_mutex)
++{
++ return __gthr_morphos_cond_timedwait (_gthr_cond, (__gthread_mutex_t *) _gthr_mutex, NULL);
++}
++
++int __gthr_morphos_cond_signal (__gthread_cond_t *_gthr_cond)
++{
++ return __gthr_morphos_cond_broadcast_generic (_gthr_cond, 1);
++}
++
++#ifndef HIDE_EXPORTS
++#pragma GCC visibility pop
++#endif
++
++#if TESTME
++
++#if !USE_THREAD_SAFETYNET
++struct Library *SocketBase;
++#include <unistd.h>
++#endif
++
++void dprintf(const char *, ...);
++
++__gthread_once_t once = __GTHREAD_ONCE_INIT;
++__gthread_mutex_t mutex = __GTHREAD_MUTEX_INIT;
++__gthread_recursive_mutex_t rmutex = __GTHREAD_RECURSIVE_MUTEX_INIT;
++__gthread_cond_t cond = __GTHREAD_COND_INIT;
++__gthread_key_t key;
++
++void *func(void *parm)
++{
++ void *value;
++ int rc;
++
++ dprintf("thread parm %p\n", parm);
++
++ value = __gthread_getspecific(key);
++ if (value != NULL)
++ dprintf("unexpected key %p value %p (%s)\n", key, value, value);
++
++ if (__gthread_setspecific(key, "lollero") != 0)
++ dprintf("__gthread_setspecific failed when it shouldn't have\n");
++
++ value = __gthread_getspecific(key);
++ dprintf("key %p value %p (%s)\n", key, value, value);
++
++ __gthread_mutex_lock(&mutex);
++ sleep(2);
++ __gthread_mutex_unlock(&mutex);
++ if (__gthread_mutex_trylock(&mutex) == 0)
++ dprintf("__gthread_mutex_trylock succeeded when it shouldn't have\n");
++
++ dprintf("obtain the mutex %p...\n", &mutex);
++ __gthread_mutex_lock(&mutex);
++ dprintf("thread waiting for cond %p for up to 5 seconds...\n", &cond);
++ const __gthread_time_t timeout = {time(NULL) + 5, 0};
++ rc = __gthread_cond_timedwait(&cond, &mutex, &timeout);
++ if (rc == 0)
++ dprintf("thread got cond %p...\n", &cond);
++ else if (rc == ETIMEDOUT)
++ dprintf("unexpected timeout cond %p\n", &cond);
++ else
++ dprintf("unexpected cond %p error %d\n", &cond, rc);
++ __gthread_mutex_unlock(&mutex);
++
++ dprintf("thread done\n");
++ return NULL;
++}
++
++void destructor(void *value)
++{
++ dprintf("destructor called with %p <%s>\n", value, value);
++}
++
++void *func2(void *ptr)
++{
++ int f = (int) ptr;
++ dprintf("thread2 started\n");
++ write(f, "2\n", 2);
++ sleep(1);
++ dprintf("thread2 done\n");
++ write(f, "3\n", 2);
++ return NULL;
++}
++
++void oncefunc(void)
++{
++ static int counter;
++ dprintf("oncefunc called\n");
++ if (counter == 1)
++ dprintf("oncefunc unexpectedly called more than once\n");
++ counter++;
++}
++
++int main(void)
++{
++ int rc;
++ __gthread_t id;
++
++ /* test __gthread_once */
++ __gthread_once(&once, oncefunc);
++ __gthread_once(&once, oncefunc);
++
++ /* test recursion on recursive mutex */
++ rc = __gthread_recursive_mutex_lock(&rmutex);
++ if (rc != 0) {
++ dprintf("failed to __gthread_recursive_mutex_lock\n");
++ return 0;
++ }
++ rc = __gthread_recursive_mutex_lock(&rmutex);
++ if (rc != 0) {
++ dprintf("__gthread_recursive_mutex_lock failed when it should have succeeded\n");
++ return 0;
++ }
++ __gthread_recursive_mutex_unlock(&rmutex);
++ __gthread_recursive_mutex_unlock(&rmutex);
++
++ /* test recursion on non-recursive mutex */
++ rc = __gthread_mutex_lock(&mutex);
++ if (rc != 0) {
++ dprintf("failed to __gthread_mutex_lock\n");
++ return 0;
++ }
++ rc = __gthread_mutex_lock(&mutex);
++ if (rc == 0) {
++ dprintf("__gthread_mutex_lock succeeded when it should have failed\n");
++ return 0;
++ }
++ __gthread_mutex_unlock(&mutex);
++
++ /* test key (see thread) */
++ if (__gthread_key_create(&key, destructor) != 0) {
++ dprintf("failed to __gthread_key_create\n");
++ return 0;
++ }
++
++#if !USE_THREAD_ONLY_SETSPECIFIC
++ if (__gthread_setspecific(key, "mainapp") != 0)
++ dprintf("__gthread_setspecific in main app failed when it shouldn't have\n");
++ dprintf("__gthread_getspecific <%s>\n", __gthread_getspecific(key));
++#endif
++
++ dprintf("main process - func %p\n", func);
++ if (__gthread_create(&id, func, func) == 0) {
++ const time_t t = time(NULL);
++ const __gthread_time_t t1 = {t+1,0};
++ usleep(100000);
++ rc = __gthread_mutex_timedlock(&mutex, &t1);
++ dprintf("__gthread_mutex_timedlock 1 %d\n", rc);
++ if (rc != 0) {
++ const __gthread_time_t t2 = {t+2,0};
++ rc = __gthread_mutex_timedlock(&mutex, &t2);
++ dprintf("__gthread_mutex_timedlock 2 %d\n", rc);
++ if (rc != 0) {
++ const __gthread_time_t t3 = {t+3,0};
++ rc = __gthread_mutex_timedlock(&mutex, &t3);
++ dprintf("__gthread_mutex_timedlock 3 %d\n", rc);
++ if (rc == 0) {
++ sleep(1);
++ __gthread_mutex_unlock(&mutex);
++ usleep(100000);
++ dprintf("signaling cond %p\n", &cond);
++ __gthread_cond_signal(&cond);
++ }
++ else
++ dprintf("__gthread_mutex_timedlock failed when it shouldn't have\n");
++ }
++ else
++ dprintf("__gthread_mutex_timedlock 2 unexpectedly succeeded\n");
++ }
++ else
++ dprintf("__gthread_mutex_timedlock 1 unexpectedly succeeded\n");
++
++ dprintf("before join threadid %d\n", id);
++ rc = __gthread_join(id, NULL);
++ dprintf("after join rc %d\n", rc);
++ }
++ else
++ dprintf("__gthread_create failed unexpectedly\n");
++
++ dprintf("launch a second thread\n");
++ int f = 1; //open("/t/out", O_WRONLY|O_CREAT, 0);
++ write(f, "1\n", 2);
++ if (__gthread_create(&id, func2, (void *) f) == 0)
++ {
++ dprintf("before join threadid %d\n", id);
++ write(f, "4\n", 2);
++ rc = __gthread_join(id, NULL);
++ dprintf("after join rc %d\n", rc);
++ write(f, "5\n", 2);
++ }
++ else
++ dprintf("__gthread_create failed unexpectedly\n");
++
++ //close(f);
++
++ __gthread_key_delete(key);
++}
++#endif
+diff -ruN gcc-15.1.0.orig/libgcc/config/rs6000/gthr-morphos.h gcc-15.1.0/libgcc/config/rs6000/gthr-morphos.h
+--- gcc-15.1.0.orig/libgcc/config/rs6000/gthr-morphos.h 1970-01-01 02:00:00.000000000 +0200
++++ gcc-15.1.0/libgcc/config/rs6000/gthr-morphos.h 2025-04-25 15:58:40.280619963 +0300
+@@ -0,0 +1,433 @@
++/* Threads compatibility routines for libgcc2. */
++/* Compile this one with gcc. */
++/* Copyright (C) 1997, 1999, 2000, 2004, 2008, 2009
++ Free Software Foundation, Inc.
++ Copyright (C) 2016-2020 Harry Sintonen
++
++This file is part of GCC.
++
++GCC is free software; you can redistribute it and/or modify it under
++the terms of the GNU General Public License as published by the Free
++Software Foundation; either version 3, or (at your option) any later
++version.
++
++GCC is distributed in the hope that it will be useful, but WITHOUT ANY
++WARRANTY; without even the implied warranty of MERCHANTABILITY or
++FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++for more details.
++
++Under Section 7 of GPL version 3, you are granted additional
++permissions described in the GCC Runtime Library Exception, version
++3.1, as published by the Free Software Foundation.
++
++You should have received a copy of the GNU General Public License and
++a copy of the GCC Runtime Library Exception along with this program;
++see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
++<http://www.gnu.org/licenses/>. */
++
++#ifndef GCC_GTHR_MORPHOS_H
++#define GCC_GTHR_MORPHOS_H
++
++#define __GTHREADS 1
++#define __GTHREADS_CXX0X 1
++#define __GTHREAD_HAS_COND 1
++
++#include <sys/time.h>
++#include <errno.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*
++ * __gthr_morphos_active_p
++ */
++
++extern int __gthr_morphos_active_p (void);
++static int __is_gthr_morphos_active = -1;
++
++static inline int
++__gthread_active_p (void)
++{
++ if(__is_gthr_morphos_active < 0)
++ __is_gthr_morphos_active = __gthr_morphos_active_p();
++
++ return __is_gthr_morphos_active > 0 ? 1 : 0;
++}
++
++/*
++ * MorphOS - Generic
++ */
++
++typedef struct timespec __gthread_time_t;
++#define __GTHREAD_TIME_INIT { 0, 0 }
++
++/*
++ * MorphOS - Once
++ */
++
++#define __GTHREAD_ONCE_INIT { 0, 0 }
++
++typedef struct {
++ volatile long busy;
++ volatile long done;
++} __gthread_once_t;
++
++extern int __gthr_morphos_once (__gthread_once_t *__once, void (*__func) (void));
++extern void __gthr_morphos_once_unlock (__gthread_once_t *__once);
++
++/*
++ * MorphOS - Key
++ */
++
++typedef unsigned long __gthread_key_t;
++
++extern int __gthr_morphos_key_create (__gthread_key_t *__key, void (*__func) (void *));
++extern int __gthr_morphos_key_delete (__gthread_key_t __key);
++extern void *__gthr_morphos_getspecific (__gthread_key_t __key);
++extern int __gthr_morphos_setspecific (__gthread_key_t __key, const void *__v);
++
++/*
++ * MorphOS - Mutex
++ */
++
++#define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function
++#define __GTHREAD_MUTEX_INIT { {{ 0 }}, 0 }
++#ifdef _GTHREAD_USE_MUTEX_INIT_FUNC
++# undef __GTHREAD_MUTEX_INIT
++#endif
++#define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function
++#define __GTHREAD_RECURSIVE_MUTEX_INIT { {{ 0 }}, 0 }
++#ifdef _GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC
++# undef __GTHREAD_RECURSIVE_MUTEX_INIT
++#endif
++
++typedef struct {
++ union {
++ char _priv[60];
++ } u;
++ int incond;
++} __gthread_mutex_t;
++
++typedef __gthread_mutex_t __gthread_recursive_mutex_t;
++
++extern void __gthr_morphos_mutex_init_function (__gthread_mutex_t *__mutex);
++extern int __gthr_morphos_mutex_destroy (__gthread_mutex_t *__mutex);
++
++extern int __gthr_morphos_mutex_lock (__gthread_mutex_t *__mutex);
++extern int __gthr_morphos_mutex_trylock (__gthread_mutex_t *__mutex);
++extern int __gthr_morphos_mutex_unlock (__gthread_mutex_t *__mutex);
++extern int __gthr_morphos_mutex_timedlock (__gthread_mutex_t *__mutex,
++ const __gthread_time_t *__abs_timeout);
++
++extern void __gthr_morphos_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex);
++extern int __gthr_morphos_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex);
++extern int __gthr_morphos_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex);
++extern int __gthr_morphos_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex);
++extern int __gthr_morphos_recursive_mutex_destroy (__gthread_mutex_t *__mutex);
++extern int __gthr_morphos_recursive_mutex_timedlock (__gthread_mutex_t *__mutex,
++ const __gthread_time_t *__abs_timeout);
++
++/*
++ * MorphOS - Cond
++ */
++
++#define __GTHREAD_COND_INIT { {{ 0 }}, {{ 0 }} }
++#ifdef _GTHREAD_USE_COND_INIT_FUNC
++# undef __GTHREAD_COND_INIT
++# define __GTHREAD_COND_INIT_FUNCTION __gthread_cond_init_function
++#endif
++
++typedef struct {
++ union {
++ char _priv[60];
++ } u1;
++ union {
++ void *_priv[3];
++ } u2;
++} __gthread_cond_t;
++
++extern void __gthr_morphos_cond_init_function (__gthread_cond_t *__cond);
++extern int __gthr_morphos_cond_destroy (__gthread_cond_t *__cond);
++extern int __gthr_morphos_cond_broadcast (__gthread_cond_t *__cond);
++extern int __gthr_morphos_cond_signal (__gthread_cond_t *__cond);
++extern int __gthr_morphos_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex);
++extern int __gthr_morphos_cond_wait_recursive (__gthread_cond_t *__cond,
++ __gthread_recursive_mutex_t *__mutex);
++extern int __gthr_morphos_cond_timedwait (__gthread_cond_t *__cond,
++ __gthread_mutex_t *__mutex,
++ const __gthread_time_t *__abs_timeout);
++
++/*
++ * MorphOS - Thread
++ */
++
++typedef unsigned int __gthread_t;
++
++extern int __gthr_morphos_create (__gthread_t *__threadid, void *(*__func) (void *),
++ void *__args);
++extern int __gthr_morphos_join (__gthread_t __threadid, void **__value_ptr);
++extern int __gthr_morphos_detach (__gthread_t __threadid);
++extern int __gthr_morphos_equal (__gthread_t __t1, __gthread_t __t2);
++extern __gthread_t __gthr_morphos_self (void);
++extern int __gthr_morphos_yield (void);
++
++
++/*
++ * MorphOS - Once
++ */
++
++static inline int
++__gthread_once (__gthread_once_t *__once, void (*__func) (void))
++{
++ if (__gthread_active_p ())
++ return __gthr_morphos_once (__once, __func);
++ else
++ return -1;
++}
++
++static inline void
++__gthread_once_unlock (__gthread_once_t *__once)
++{
++ __gthr_morphos_once_unlock (__once);
++}
++
++/*
++ * MorphOS - Key
++ */
++
++static inline int
++__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *))
++{
++ return __gthr_morphos_key_create (__key, __dtor);
++}
++
++static inline int
++__gthread_key_delete (__gthread_key_t __key)
++{
++ return __gthr_morphos_key_delete (__key);
++}
++
++static inline void *
++__gthread_getspecific (__gthread_key_t __key)
++{
++ return __gthr_morphos_getspecific (__key);
++}
++
++static inline int
++__gthread_setspecific (__gthread_key_t __key, const void *__ptr)
++{
++ return __gthr_morphos_setspecific (__key, __ptr);
++}
++
++/*
++ * MorphOS - Mutex
++ */
++
++static inline void
++__gthread_mutex_init_function (__gthread_mutex_t *__mutex)
++{
++ if (__gthread_active_p ())
++ __gthr_morphos_mutex_init_function (__mutex);
++}
++
++static inline int
++__gthread_mutex_destroy (__gthread_mutex_t *__mutex)
++{
++ if (__gthread_active_p ())
++ return __gthr_morphos_mutex_destroy (__mutex);
++ else
++ return 0;
++}
++
++static inline int
++__gthread_mutex_lock (__gthread_mutex_t *__mutex)
++{
++ if (__gthread_active_p ())
++ return __gthr_morphos_mutex_lock (__mutex);
++ else
++ return 0;
++}
++
++static inline int
++__gthread_mutex_trylock (__gthread_mutex_t *__mutex)
++{
++ if (__gthread_active_p ())
++ return __gthr_morphos_mutex_trylock (__mutex);
++ else
++ return 0;
++}
++
++static inline int
++__gthread_mutex_timedlock (__gthread_mutex_t *__mutex,
++ const __gthread_time_t *__abs_timeout)
++{
++ if (__gthread_active_p ())
++ return __gthr_morphos_mutex_timedlock (__mutex, __abs_timeout);
++ else
++ return 0;
++}
++
++static inline int
++__gthread_mutex_unlock (__gthread_mutex_t *__mutex)
++{
++ if (__gthread_active_p ())
++ return __gthr_morphos_mutex_unlock (__mutex);
++ else
++ return 0;
++}
++
++static inline void
++__gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex)
++{
++ if (__gthread_active_p ())
++ __gthr_morphos_recursive_mutex_init_function (__mutex);
++}
++
++static inline int
++__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex)
++{
++ if (__gthread_active_p ())
++ return __gthr_morphos_recursive_mutex_lock (__mutex);
++ else
++ return 0;
++}
++
++static inline int
++__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex)
++{
++ if (__gthread_active_p ())
++ return __gthr_morphos_recursive_mutex_trylock (__mutex);
++ else
++ return 0;
++}
++
++static inline int
++__gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *__mutex,
++ const __gthread_time_t *__abs_timeout)
++{
++ if (__gthread_active_p ())
++ return __gthr_morphos_recursive_mutex_timedlock (__mutex, __abs_timeout);
++ else
++ return 0;
++}
++
++static inline int
++__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex)
++{
++ if (__gthread_active_p ())
++ return __gthr_morphos_recursive_mutex_unlock (__mutex);
++ else
++ return 0;
++}
++
++static inline int
++__gthread_recursive_mutex_destroy (__gthread_mutex_t *__mutex)
++{
++ if (__gthread_active_p ())
++ return __gthr_morphos_mutex_destroy (__mutex);
++ else
++ return 0;
++}
++
++/*
++ * MorphOS - Cond
++ */
++
++static inline void
++__gtrhread_cond_init_function (__gthread_cond_t *__cond)
++{
++ if (__gthread_active_p ())
++ __gthr_morphos_cond_init_function (__cond);
++}
++
++static inline int
++__gthread_cond_destroy (__gthread_cond_t *__cond)
++{
++ if (__gthread_active_p ())
++ return __gthr_morphos_cond_destroy (__cond);
++ else
++ return 0;
++}
++
++static inline int
++__gthread_cond_broadcast (__gthread_cond_t *__cond)
++{
++ return __gthr_morphos_cond_broadcast (__cond);
++}
++
++static inline int
++__gthread_cond_signal (__gthread_cond_t *__cond)
++{
++ return __gthr_morphos_cond_signal (__cond);
++}
++
++static inline int
++__gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex)
++{
++ return __gthr_morphos_cond_wait (__cond, __mutex);
++}
++
++static inline int
++__gthread_cond_wait_recursive (__gthread_cond_t *__cond,
++ __gthread_recursive_mutex_t *__mutex)
++{
++ return __gthr_morphos_cond_wait_recursive (__cond, __mutex);
++}
++
++static inline int
++__gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex,
++ const __gthread_time_t *__abs_timeout)
++{
++ return __gthr_morphos_cond_timedwait (__cond, __mutex, __abs_timeout);
++}
++
++/*
++ * MorphOS - Thread
++ */
++
++static inline int
++__gthread_create (__gthread_t *__threadid, void *(*__func) (void *),
++ void *__args)
++{
++ if (__gthread_active_p ())
++ return __gthr_morphos_create (__threadid, __func, __args);
++ else
++ return 0;
++}
++
++static inline int
++__gthread_join (__gthread_t __threadid, void **__value_ptr)
++{
++ return __gthr_morphos_join (__threadid, __value_ptr);
++}
++
++static inline int
++__gthread_detach (__gthread_t __threadid)
++{
++ return __gthr_morphos_detach (__threadid);
++}
++
++static inline int
++__gthread_equal (__gthread_t __t1, __gthread_t __t2)
++{
++ return __gthr_morphos_equal (__t1, __t2);
++}
++
++static inline __gthread_t
++__gthread_self (void)
++{
++ return __gthr_morphos_self ();
++}
++
++static inline int
++__gthread_yield (void)
++{
++ return __gthr_morphos_yield ();
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* ! GCC_GTHR_MORPHOS_H */
+diff -ruN gcc-15.1.0.orig/libgcc/config/rs6000/t-gthr-morphos gcc-15.1.0/libgcc/config/rs6000/t-gthr-morphos
+--- gcc-15.1.0.orig/libgcc/config/rs6000/t-gthr-morphos 1970-01-01 02:00:00.000000000 +0200
++++ gcc-15.1.0/libgcc/config/rs6000/t-gthr-morphos 2025-04-25 15:58:40.280619963 +0300
+@@ -0,0 +1 @@
++LIB2ADD = $(srcdir)/config/rs6000/gthr-morphos.c
+\ No newline at end of file
+diff -ruN gcc-15.1.0.orig/libgcc/config.host gcc-15.1.0/libgcc/config.host
+--- gcc-15.1.0.orig/libgcc/config.host 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libgcc/config.host 2025-04-25 15:58:40.280619963 +0300
+@@ -1239,6 +1239,10 @@
+ ;;
+ esac
+ ;;
++powerpc-*-morphos*)
++ tmake_file="${tmake_file} rs6000/t-ppccomm rs6000/t-savresfgpr rs6000/t-crtstuff t-crtstuff-pic t-fdpbit rs6000/t-gthr-morphos"
++ extra_parts="$extra_parts crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o ecrti.o ecrtn.o ncrti.o ncrtn.o"
++ ;;
+ powerpc-*-netbsd*)
+ tmake_file="$tmake_file rs6000/t-netbsd rs6000/t-crtstuff"
+ ;;
+diff -ruN gcc-15.1.0.orig/libgcc/configure gcc-15.1.0/libgcc/configure
+--- gcc-15.1.0.orig/libgcc/configure 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libgcc/configure 2025-04-25 15:58:40.280619963 +0300
+@@ -5734,6 +5734,7 @@
+ vxworks) thread_header=config/gthr-vxworks.h ;;
+ win32) thread_header=config/i386/gthr-win32.h ;;
+ mcf) thread_header=config/i386/gthr-mcf.h ;;
++ morphos) thread_header=config/rs6000/gthr-morphos.h ;;
+ esac
+
+
+diff -ruN gcc-15.1.0.orig/libgcc/crtstuff.c gcc-15.1.0/libgcc/crtstuff.c
+--- gcc-15.1.0.orig/libgcc/crtstuff.c 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libgcc/crtstuff.c 2025-04-25 15:58:40.280619963 +0300
+@@ -157,6 +157,10 @@
+ # define USE_TM_CLONE_REGISTRY 0
+ #endif
+
++#ifdef __MORPHOS__
++extern const char __EH_FRAME_BEGIN__[];
++#endif
++
+ /* We do not want to add the weak attribute to the declarations of these
+ routines in unwind-dw2-fde.h because that will cause the definition of
+ these symbols to be weak as well.
+@@ -397,7 +401,7 @@
+ {
+ /* Safer version that makes sure only .dtors function pointers are
+ called even if the static variable is maliciously changed. */
+- extern func_ptr __DTOR_END__[] __attribute__((visibility ("hidden")));
++ extern const func_ptr __DTOR_END__[] __attribute__((visibility ("hidden")));
+ static size_t dtor_idx;
+ const size_t max_idx = __DTOR_END__ - __DTOR_LIST__ - 1;
+ func_ptr *dtor_list;
+@@ -435,6 +439,11 @@
+ #endif
+ #endif
+
++#ifdef __MORPHOS__
++ if (__deregister_frame_info)
++ __deregister_frame_info (__EH_FRAME_BEGIN__);
++#endif
++
+ completed = 1;
+ }
+
+@@ -692,9 +701,24 @@
+ static void __attribute__((used))
+ __do_global_ctors_aux (void)
+ {
++#ifdef __MORPHOS__
++ if (__register_frame_info)
++ {
++ static struct object object;
++ __register_frame_info (__EH_FRAME_BEGIN__, &object);
++ }
++ func_ptr *p = __CTOR_END__ - 1;
++ func_ptr f;
++ while((f = *p) != (func_ptr) -1)
++ {
++ f ();
++ p--;
++ }
++#else
+ func_ptr *p;
+ for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
+ (*p) ();
++#endif
+ }
+
+ /* Stick a call to __do_global_ctors_aux into the .init section. */
+diff -ruN gcc-15.1.0.orig/libgcc/emutls.c gcc-15.1.0/libgcc/emutls.c
+--- gcc-15.1.0.orig/libgcc/emutls.c 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libgcc/emutls.c 2025-04-25 15:58:40.280619963 +0300
+@@ -95,6 +95,28 @@
+ free (ptr);
+ }
+
++#ifdef __libnix
++#include <constructor.h>
++DESTRUCTOR_P(emutls_cleanup, 10000)
++#else
++__attribute__((destructor))
++static void
++emutls_cleanup (void)
++#endif
++{
++ if (emutls_key)
++ {
++ struct __emutls_array *arr = __gthread_getspecific (emutls_key);
++ if (arr)
++ {
++ __gthread_setspecific (emutls_key, NULL);
++ emutls_destroy (arr);
++ }
++ __gthread_key_delete (emutls_key);
++ emutls_key = 0;
++ }
++}
++
+ static void
+ emutls_init (void)
+ {
+diff -ruN gcc-15.1.0.orig/libgcc/libgcov.h gcc-15.1.0/libgcc/libgcov.h
+--- gcc-15.1.0.orig/libgcc/libgcov.h 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libgcc/libgcov.h 2025-04-25 15:58:40.280619963 +0300
+@@ -49,6 +49,10 @@
+ #include <sys/mman.h>
+ #endif
+
++#ifndef _STDINT_H_
++#include <stdint.h>
++#endif
++
+ #if __CHAR_BIT__ == 8
+ typedef unsigned gcov_unsigned_t __attribute__ ((mode (SI)));
+ typedef unsigned gcov_position_t __attribute__ ((mode (SI)));
+diff -ruN gcc-15.1.0.orig/libgcc/Makefile.in gcc-15.1.0/libgcc/Makefile.in
+--- gcc-15.1.0.orig/libgcc/Makefile.in 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libgcc/Makefile.in 2025-04-25 15:58:40.280619963 +0300
+@@ -201,7 +201,7 @@
+ STRIP_FOR_TARGET = $(STRIP)
+
+ # Directory in which the compiler finds libraries etc.
+-libsubdir = $(libdir)/gcc/$(real_host_noncanonical)/$(version)@accel_dir_suffix@
++libsubdir = $(libdir)/gcc-lib/$(real_host_noncanonical)/$(version)@accel_dir_suffix@
+ # Used to install the shared libgcc.
+ slibdir = @slibdir@
+ # Maybe used for DLLs on Windows targets.
+diff -ruN gcc-15.1.0.orig/libgfortran/configure gcc-15.1.0/libgfortran/configure
+--- gcc-15.1.0.orig/libgfortran/configure 2025-04-25 11:21:27.000000000 +0300
++++ gcc-15.1.0/libgfortran/configure 2025-04-25 15:58:40.284619995 +0300
+@@ -7271,7 +7271,7 @@
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+- amigaos*)
++ amigaos* | morphos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+diff -ruN gcc-15.1.0.orig/libgfortran/Makefile.in gcc-15.1.0/libgfortran/Makefile.in
+--- gcc-15.1.0.orig/libgfortran/Makefile.in 2025-04-25 11:21:27.000000000 +0300
++++ gcc-15.1.0/libgfortran/Makefile.in 2025-04-25 15:58:40.284619995 +0300
+@@ -995,7 +995,7 @@
+
+ libgfortran_la_DEPENDENCIES = $(version_dep) libgfortran.spec $(LIBQUADLIB_DEP)
+ cafexeclib_LTLIBRARIES = libcaf_single.la
+-cafexeclibdir = $(libdir)/gcc/$(target_alias)/$(gcc_version)$(MULTISUBDIR)
++cafexeclibdir = $(libdir)/gcc-lib/$(target_alias)/$(gcc_version)$(MULTISUBDIR)
+ libcaf_single_la_SOURCES = caf/single.c
+ libcaf_single_la_LDFLAGS = -static
+ libcaf_single_la_DEPENDENCIES = caf/libcaf.h
+diff -ruN gcc-15.1.0.orig/libgomp/configure gcc-15.1.0/libgomp/configure
+--- gcc-15.1.0.orig/libgomp/configure 2025-04-25 11:21:27.000000000 +0300
++++ gcc-15.1.0/libgomp/configure 2025-04-25 15:58:40.284619995 +0300
+@@ -5656,7 +5656,7 @@
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+- amigaos*)
++ amigaos* | morphos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+diff -ruN gcc-15.1.0.orig/libgomp/Makefile.in gcc-15.1.0/libgomp/Makefile.in
+--- gcc-15.1.0.orig/libgomp/Makefile.in 2025-04-25 11:21:27.000000000 +0300
++++ gcc-15.1.0/libgomp/Makefile.in 2025-04-25 15:58:40.284619995 +0300
+@@ -517,8 +517,8 @@
+ search_path = $(addprefix $(top_srcdir)/config/, $(config_path)) $(top_srcdir) \
+ $(top_srcdir)/../include
+
+-fincludedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)$(MULTISUBDIR)/finclude
+-libsubincludedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/include
++fincludedir = $(libdir)/gcc-lib/$(target_alias)/$(gcc_version)$(MULTISUBDIR)/finclude
++libsubincludedir = $(libdir)/gcc-lib/$(target_alias)/$(gcc_version)/include
+ AM_CPPFLAGS = $(addprefix -I, $(search_path))
+ AM_CFLAGS = $(XCFLAGS)
+ AM_LDFLAGS = $(XLDFLAGS) $(SECTION_LDFLAGS) $(OPT_LDFLAGS)
+diff -ruN gcc-15.1.0.orig/libiberty/configure gcc-15.1.0/libiberty/configure
+--- gcc-15.1.0.orig/libiberty/configure 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libiberty/configure 2025-04-25 15:58:40.284619995 +0300
+@@ -7119,7 +7119,7 @@
+ fi
+ if test "x$ac_cv_func_fork_works" = xcross; then
+ case $host in
+- *-*-amigaos* | *-*-msdosdjgpp*)
++ *-*-amigaos* | *-*-morphos* | *-*-msdosdjgpp*)
+ # Override, as these systems have only a dummy fork() stub
+ ac_cv_func_fork_works=no
+ ;;
+diff -ruN gcc-15.1.0.orig/libiberty/stack-limit.c gcc-15.1.0/libiberty/stack-limit.c
+--- gcc-15.1.0.orig/libiberty/stack-limit.c 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libiberty/stack-limit.c 2025-04-25 15:58:40.284619995 +0300
+@@ -39,7 +39,7 @@
+ #ifdef HAVE_STDINT_H
+ #include <stdint.h>
+ #endif
+-#ifdef HAVE_SYS_RESOURCE_H
++#if defined(HAVE_SYS_RESOURCE_H) && !defined(__MORPHOS__)
+ #include <sys/resource.h>
+ #endif
+
+diff -ruN gcc-15.1.0.orig/libobjc/configure gcc-15.1.0/libobjc/configure
+--- gcc-15.1.0.orig/libobjc/configure 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libobjc/configure 2025-04-25 15:58:40.284619995 +0300
+@@ -2536,7 +2536,7 @@
+ # Need the gcc compiler version to know where to install libraries
+ # and header files if --enable-version-specific-runtime-libs option
+ # is selected.
+- toolexecdir='$(libdir)/gcc/$(target_noncanonical)'
++ toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)'
+ toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)'
+ ;;
+ no)
+@@ -4994,7 +4994,7 @@
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+- amigaos*)
++ amigaos* | morphos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+diff -ruN gcc-15.1.0.orig/libobjc/Makefile.in gcc-15.1.0/libobjc/Makefile.in
+--- gcc-15.1.0.orig/libobjc/Makefile.in 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libobjc/Makefile.in 2025-04-25 15:58:40.284619995 +0300
+@@ -48,7 +48,7 @@
+ top_builddir = .
+
+ libdir = $(exec_prefix)/lib
+-libsubdir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_version)
++libsubdir = $(libdir)/gcc-lib/$(target_noncanonical)/$(gcc_version)
+
+ # Multilib support variables.
+ MULTISRCTOP =
+diff -ruN gcc-15.1.0.orig/libobjc/objc/objc.h gcc-15.1.0/libobjc/objc/objc.h
+--- gcc-15.1.0.orig/libobjc/objc/objc.h 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libobjc/objc/objc.h 2025-04-25 15:58:40.284619995 +0300
+@@ -51,8 +51,13 @@
+
+ Important: this could change and we could switch to 'typedef bool
+ BOOL' in the future. Do not depend on the type of BOOL. */
++
++#ifdef __MORPHOS__
++#include <exec/types.h>
++#else
+ #undef BOOL
+ typedef unsigned char BOOL;
++#endif
+
+ #define YES (BOOL)1
+ #define NO (BOOL)0
+diff -ruN gcc-15.1.0.orig/libobjc/objc-sync.c gcc-15.1.0/libobjc/objc-sync.c
+--- gcc-15.1.0.orig/libobjc/objc-sync.c 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libobjc/objc-sync.c 2025-04-25 15:58:40.284619995 +0300
+@@ -174,6 +174,7 @@
+ void
+ __objc_sync_init (void)
+ {
++#ifndef __MORPHOS__
+ int i;
+
+ for (i = 0; i < SYNC_NUMBER_OF_POOLS; i++)
+@@ -193,8 +194,10 @@
+
+ sync_pool_array[i] = new_node;
+ }
++#endif
+ }
+
++#ifndef __MORPHOS__
+ int
+ objc_sync_enter (id object)
+ {
+@@ -457,3 +460,5 @@
+ /* A lock for 'object' to unlock could not be found (!!). */
+ return OBJC_SYNC_NOT_OWNING_THREAD_ERROR;
+ }
++
++#endif /* MorphOS */
+diff -ruN gcc-15.1.0.orig/libobjc/objects.c gcc-15.1.0/libobjc/objects.c
+--- gcc-15.1.0.orig/libobjc/objects.c 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libobjc/objects.c 2025-04-25 15:58:40.284619995 +0300
+@@ -36,6 +36,7 @@
+ #endif
+
+ /* FIXME: The semantics of extraBytes are not really clear. */
++#ifndef __MORPHOS__
+ inline
+ id
+ class_createInstance (Class class, size_t extraBytes)
+@@ -93,6 +94,7 @@
+ }
+ return nil;
+ }
++#endif
+
+ const char *
+ object_getClassName (id object)
+diff -ruN gcc-15.1.0.orig/libobjc/thr.c gcc-15.1.0/libobjc/thr.c
+--- gcc-15.1.0.orig/libobjc/thr.c 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libobjc/thr.c 2025-04-25 15:58:40.288620027 +0300
+@@ -35,7 +35,16 @@
+ #include "objc/runtime.h"
+ #include "objc-private/module-abi-8.h"
+ #include "objc-private/runtime.h"
++
++#ifdef __MORPHOS__
++// MorphOS specific includes
++#define __IXEMUL_EXEC_MIXING_ALLOWED /* FIXME: this code is really broken for ixemul */
++#include <proto/dos.h>
++#include <proto/exec.h>
++#include <dos/dostags.h>
++#else
+ #include <gthr.h>
++#endif
+
+ #include <stdlib.h>
+
+@@ -75,7 +84,11 @@
+ int
+ __objc_init_thread_system(void)
+ {
++#ifdef __MORPHOS__
++ return 0;
++#else
+ return __gthread_objc_init_thread_system ();
++#endif
+ }
+
+ /* First function called in a thread, starts everything else.
+@@ -165,6 +178,28 @@
+ /* Lock access. */
+ objc_mutex_lock (__objc_runtime_mutex);
+
++#ifdef __MORPHOS__
++ ULONG pid = 0;
++
++ struct Task *t = (struct Task *)CreateNewProcTags(
++ NP_PPC_Arg1, (IPTR)istate,
++ NP_Entry, (IPTR)__objc_thread_detach_function,
++ NP_CodeType, CODETYPE_PPC,
++ NP_Name, (IPTR)"ObjC Runtime",
++ TAG_DONE);
++
++ if (NULL != t)
++ {
++ NewGetTaskAttrsA(t, &pid, sizeof (pid), TASKINFOTYPE_PID, NULL);
++ thread_id = (objc_thread_t)pid;
++ }
++ else
++ {
++ objc_mutex_unlock (__objc_runtime_mutex);
++ objc_free (istate);
++ return NULL;
++ }
++#else
+ /* Call the backend to spawn the thread. */
+ if ((thread_id = __gthread_objc_thread_detach ((void *)__objc_thread_detach_function,
+ istate)) == NULL)
+@@ -174,6 +209,7 @@
+ objc_free (istate);
+ return NULL;
+ }
++#endif
+
+ /* Increment our thread counter. */
+ __objc_runtime_threads_alive++;
+@@ -186,14 +222,42 @@
+ int
+ objc_thread_set_priority (int priority)
+ {
+- return __gthread_objc_thread_set_priority (priority);
++ int sys_priority = 0;
++
++ switch (priority)
++ {
++ case OBJC_THREAD_INTERACTIVE_PRIORITY:
++ sys_priority = 0;
++ break;
++ default:
++ case OBJC_THREAD_BACKGROUND_PRIORITY:
++ sys_priority = -1;
++ break;
++ case OBJC_THREAD_LOW_PRIORITY:
++ sys_priority = -127;
++ break;
++ }
++
++ SetTaskPri(FindTask(0), sys_priority);
++
++ return 0;
+ }
+
+ /* Return the current thread's priority. */
+ int
+ objc_thread_get_priority (void)
+ {
+- return __gthread_objc_thread_get_priority ();
++ LONG priority = 0;
++
++ NewGetTaskAttrsA(FindTask(0), &priority, sizeof (priority), TASKINFOTYPE_PRI, NULL);
++
++ if (priority < -10)
++ return OBJC_THREAD_LOW_PRIORITY;
++
++ if (priority < 0)
++ return OBJC_THREAD_BACKGROUND_PRIORITY;
++
++ return OBJC_THREAD_INTERACTIVE_PRIORITY;
+ }
+
+ /* Yield our process time to another thread. Any BUSY waiting that is
+@@ -202,7 +266,7 @@
+ void
+ objc_thread_yield (void)
+ {
+- __gthread_objc_thread_yield ();
++// __gthread_objc_thread_yield ();
+ }
+
+ /* Terminate the current thread. Doesn't return. Actually, if it
+@@ -216,7 +280,9 @@
+ objc_mutex_unlock (__objc_runtime_mutex);
+
+ /* Call the backend to terminate the thread. */
+- return __gthread_objc_thread_exit ();
++// return __gthread_objc_thread_exit ();
++ Wait(0);
++ __builtin_trap();
+ }
+
+ /* Returns an integer value which uniquely describes a thread. Must
+@@ -224,7 +290,10 @@
+ objc_thread_t
+ objc_thread_id (void)
+ {
+- return __gthread_objc_thread_id ();
++ ULONG pid = 0;
++ NewGetTaskAttrsA(FindTask(0), &pid, sizeof (pid), TASKINFOTYPE_PID, NULL);
++ return (objc_thread_t)(size_t) pid;
++// return __gthread_objc_thread_id ();
+ }
+
+ /* Sets the thread's local storage pointer. Returns 0 if successful
+@@ -232,7 +301,9 @@
+ int
+ objc_thread_set_data (void *value)
+ {
+- return __gthread_objc_thread_set_data (value);
++ NewSetTaskAttrsA(FindTask(0), (APTR)value, sizeof (ULONG), TASKINFOTYPE_USERDATA, 0);
++ return 0;
++// return __gthread_objc_thread_set_data (value);
+ }
+
+ /* Returns the thread's local storage pointer. Returns NULL on
+@@ -240,7 +311,10 @@
+ void *
+ objc_thread_get_data (void)
+ {
+- return __gthread_objc_thread_get_data ();
++ ULONG rc = 0;
++ NewGetTaskAttrsA(FindTask(0), &rc, sizeof (ULONG), TASKINFOTYPE_USERDATA, 0);
++ return (void *)rc;
++// return __gthread_objc_thread_get_data ();
+ }
+
+ /* Public mutex functions */
+@@ -256,6 +330,19 @@
+ if (! (mutex = (objc_mutex_t)objc_malloc (sizeof (struct objc_mutex))))
+ return NULL;
+
++#ifdef __MORPHOS__
++ mutex->backend = AllocMem(sizeof (struct SignalSemaphore), MEMF_ANY | MEMF_CLEAR);
++
++ if (NULL != mutex->backend)
++ {
++ InitSemaphore((struct SignalSemaphore *)mutex->backend);
++ }
++ else
++ {
++ objc_free (mutex);
++ return NULL;
++ }
++#else
+ /* Call backend to create the mutex. */
+ if (__gthread_objc_mutex_allocate (mutex))
+ {
+@@ -263,6 +350,7 @@
+ objc_free (mutex);
+ return NULL;
+ }
++#endif
+
+ /* Initialize mutex. */
+ mutex->owner = NULL;
+@@ -287,9 +375,13 @@
+ /* Acquire lock on mutex. */
+ depth = objc_mutex_lock (mutex);
+
++#ifdef __MORPHOS__
++ FreeMem(mutex->backend, sizeof (struct SignalSemaphore));
++#else
+ /* Call backend to destroy mutex. */
+ if (__gthread_objc_mutex_deallocate (mutex))
+ return -1;
++#endif
+
+ /* Free the mutex structure. */
+ objc_free (mutex);
+@@ -313,12 +405,21 @@
+ return -1;
+
+ /* If we already own the lock then increment depth. */
++#ifdef __MORPHOS__
++ thread_id = objc_thread_id ();
++#else
+ thread_id = __gthread_objc_thread_id ();
++#endif
+ if (mutex->owner == thread_id)
+ return ++mutex->depth;
+
+ /* Call the backend to lock the mutex. */
++#ifdef __MORPHOS__
++ ObtainSemaphore(mutex->backend);
++ status = 0;
++#else
+ status = __gthread_objc_mutex_lock (mutex);
++#endif
+
+ /* Failed? */
+ if (status)
+@@ -343,12 +444,21 @@
+ return -1;
+
+ /* If we already own the lock then increment depth. */
++#ifdef __MORPHOS__
++ thread_id = objc_thread_id ();
++#else
+ thread_id = __gthread_objc_thread_id ();
++#endif
+ if (mutex->owner == thread_id)
+ return ++mutex->depth;
+
+ /* Call the backend to try to lock the mutex. */
++#ifdef __MORPHOS__
++ if (AttemptSemaphore((struct SignalSemaphore *)mutex->backend))
++ status = 0;
++#else
+ status = __gthread_objc_mutex_trylock (mutex);
++#endif
+
+ /* Failed? */
+ if (status)
+@@ -375,7 +485,11 @@
+ return -1;
+
+ /* If another thread owns the lock then abort. */
++#ifdef __MORPHOS__
++ thread_id = objc_thread_id ();
++#else
+ thread_id = __gthread_objc_thread_id ();
++#endif
+ if (mutex->owner != thread_id)
+ return -1;
+
+@@ -388,7 +502,12 @@
+ mutex->owner = NULL;
+
+ /* Have the backend unlock the mutex. */
++#ifdef __MORPHOS__
++ status = 0;
++ ReleaseSemaphore(mutex->backend);
++#else
+ status = __gthread_objc_mutex_unlock (mutex);
++#endif
+
+ /* Failed? */
+ if (status)
+@@ -404,6 +523,9 @@
+ objc_condition_t
+ objc_condition_allocate (void)
+ {
++#ifdef __MORPHOS__
++ return 0;
++#else
+ objc_condition_t condition;
+
+ /* Allocate the condition mutex structure. */
+@@ -421,6 +543,7 @@
+
+ /* Success! */
+ return condition;
++#endif
+ }
+
+ /* Deallocate a condition. Note that this includes an implicit
+@@ -431,6 +554,10 @@
+ int
+ objc_condition_deallocate (objc_condition_t condition)
+ {
++#ifdef __MORPHOS__
++ condition = condition;
++ return 0;
++#else
+ /* Broadcast the condition. */
+ if (objc_condition_broadcast (condition))
+ return -1;
+@@ -443,6 +570,7 @@
+ objc_free (condition);
+
+ return 0;
++#endif
+ }
+
+ /* Wait on the condition unlocking the mutex until
+@@ -455,6 +583,11 @@
+ int
+ objc_condition_wait (objc_condition_t condition, objc_mutex_t mutex)
+ {
++#ifdef __MORPHOS__
++ condition = condition;
++ mutex = mutex;
++ return -1;
++#else
+ objc_thread_t thread_id;
+
+ /* Valid arguments? */
+@@ -482,6 +615,7 @@
+ mutex->depth = 1;
+
+ return 0;
++#endif
+ }
+
+ /* Wake up all threads waiting on this condition. It is recommended
+@@ -491,11 +625,16 @@
+ int
+ objc_condition_broadcast (objc_condition_t condition)
+ {
++#ifdef __MORPHOS__
++ condition = condition;
++ return -1;
++#else
+ /* Valid condition mutex? */
+ if (! condition)
+ return -1;
+
+ return __gthread_objc_condition_broadcast (condition);
++#endif
+ }
+
+ /* Wake up one thread waiting on this condition. It is recommended
+@@ -505,11 +644,16 @@
+ int
+ objc_condition_signal (objc_condition_t condition)
+ {
++#ifdef __MORPHOS__
++ condition = condition;
++ return -1;
++#else
+ /* Valid condition mutex? */
+ if (! condition)
+ return -1;
+
+ return __gthread_objc_condition_signal (condition);
++#endif
+ }
+
+ /* Make the objc thread system aware that a thread which is managed
+diff -ruN gcc-15.1.0.orig/libssp/configure gcc-15.1.0/libssp/configure
+--- gcc-15.1.0.orig/libssp/configure 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libssp/configure 2025-04-25 15:58:40.288620027 +0300
+@@ -5586,7 +5586,7 @@
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+- amigaos*)
++ amigaos* | morphos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+diff -ruN gcc-15.1.0.orig/libssp/Makefile.in gcc-15.1.0/libssp/Makefile.in
+--- gcc-15.1.0.orig/libssp/Makefile.in 2025-04-25 11:18:04.000000000 +0300
++++ gcc-15.1.0/libssp/Makefile.in 2025-04-25 15:58:40.288620027 +0300
+@@ -366,7 +366,7 @@
+ @LIBSSP_USE_SYMVER_SUN_TRUE@@LIBSSP_USE_SYMVER_TRUE@version_dep = ssp.map-sun
+ AM_CFLAGS = -Wall $(XCFLAGS)
+ toolexeclib_LTLIBRARIES = libssp.la libssp_nonshared.la
+-libsubincludedir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_version)/include
++libsubincludedir = $(libdir)/gcc-lib/$(target_noncanonical)/$(gcc_version)/include
+ nobase_libsubinclude_HEADERS = ssp/ssp.h ssp/string.h ssp/stdio.h ssp/unistd.h
+ libssp_la_SOURCES = \
+ ssp.c gets-chk.c memcpy-chk.c memmove-chk.c mempcpy-chk.c \
+diff -ruN gcc-15.1.0.orig/libstdc++-v3/acinclude.m4 gcc-15.1.0/libstdc++-v3/acinclude.m4
+--- gcc-15.1.0.orig/libstdc++-v3/acinclude.m4 2025-04-25 11:18:05.000000000 +0300
++++ gcc-15.1.0/libstdc++-v3/acinclude.m4 2025-04-25 15:58:40.288620027 +0300
+@@ -775,9 +775,9 @@
+ # is selected. FIXME: these variables are misnamed, there are
+ # no executables installed in _toolexecdir or _toolexeclibdir.
+ if test x"$gxx_include_dir" = x"no"; then
+- gxx_include_dir='${libdir}/gcc/${host_alias}/${gcc_version}/include/c++'
++ gxx_include_dir='${libdir}/gcc-lib/${host_alias}/${gcc_version}/include/c++'
+ fi
+- glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
++ glibcxx_toolexecdir='${libdir}/gcc-lib/${host_alias}'
+ glibcxx_toolexeclibdir='${toolexecdir}/${gcc_version}$(MULTISUBDIR)'
+ fi
+
+@@ -796,7 +796,7 @@
+ ;;
+ esac
+ else
+- glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
++ glibcxx_toolexecdir='${libdir}/gcc-lib/${host_alias}'
+ glibcxx_toolexeclibdir='${libdir}'
+ fi
+ multi_os_directory=`$CXX -print-multi-os-directory`
+@@ -2791,6 +2791,8 @@
+ fi
+ enable_clocale_flag=$enable_clocale
+
++
++
+ # Probe for locale model to use if none specified.
+ # Default to "generic".
+ if test $enable_clocale_flag = auto; then
+@@ -5069,13 +5071,7 @@
+ #include <unistd.h>
+ ],
+ [
+- #if _XOPEN_VERSION < 500
+- #error
+- #elif _XOPEN_VERSION >= 700 || defined(PATH_MAX)
+ char *tmp = realpath((const char*)NULL, (char*)NULL);
+- #else
+- #error
+- #endif
+ ],
+ [glibcxx_cv_realpath=yes],
+ [glibcxx_cv_realpath=no])
+diff -ruN gcc-15.1.0.orig/libstdc++-v3/config/io/basic_file_stdio.cc gcc-15.1.0/libstdc++-v3/config/io/basic_file_stdio.cc
+--- gcc-15.1.0.orig/libstdc++-v3/config/io/basic_file_stdio.cc 2025-04-25 11:18:05.000000000 +0300
++++ gcc-15.1.0/libstdc++-v3/config/io/basic_file_stdio.cc 2025-04-25 15:58:40.288620027 +0300
+@@ -440,6 +440,7 @@
+ __basic_file<char>::showmanyc()
+ {
+ #if !defined(_GLIBCXX_NO_IOCTL) && !defined(_GLIBCXX_USE_STDIO_PURE)
++#ifndef __libnix__
+ #ifdef FIONREAD
+ // Pipes and sockets.
+ int __num = 0;
+@@ -448,6 +449,7 @@
+ return __num;
+ #endif
+ #endif
++#endif
+
+ #if defined(_GLIBCXX_HAVE_POLL) && !defined(_GLIBCXX_USE_STDIO_PURE)
+ // Cheap test.
+diff -ruN gcc-15.1.0.orig/libstdc++-v3/config/os/generic/os_defines.h gcc-15.1.0/libstdc++-v3/config/os/generic/os_defines.h
+--- gcc-15.1.0.orig/libstdc++-v3/config/os/generic/os_defines.h 2025-04-25 11:18:05.000000000 +0300
++++ gcc-15.1.0/libstdc++-v3/config/os/generic/os_defines.h 2025-04-25 15:58:40.288620027 +0300
+@@ -38,4 +38,10 @@
+ // workaround in gthr-posix.h and at link-time for static linking.
+ #define _GLIBCXX_GTHREAD_USE_WEAK 0
+
++#ifdef __MORPHOS__
++// Disable the libstdc++ weak reference logic completely for MorphOS because
++// it is broken.
++#define _GLIBCXX_USE_WEAK_REF 0
++#endif
++
+ #endif
+diff -ruN gcc-15.1.0.orig/libstdc++-v3/crossconfig.m4 gcc-15.1.0/libstdc++-v3/crossconfig.m4
+--- gcc-15.1.0.orig/libstdc++-v3/crossconfig.m4 2025-04-25 11:18:05.000000000 +0300
++++ gcc-15.1.0/libstdc++-v3/crossconfig.m4 2025-04-25 15:58:40.296620091 +0300
+@@ -198,6 +198,12 @@
+ AC_CHECK_FUNCS(_wfopen)
+ GCC_CHECK_TLS
+ ;;
++ *-morphos*)
++ GLIBCXX_CHECK_COMPILER_FEATURES
++ GLIBCXX_CHECK_LINKER_FEATURES
++ GLIBCXX_CHECK_MATH_SUPPORT
++ GLIBCXX_CHECK_STDLIB_SUPPORT
++ ;;
+ *-netbsd* | *-openbsd*)
+ SECTION_FLAGS='-ffunction-sections -fdata-sections'
+ AC_SUBST(SECTION_FLAGS)
+diff -ruN gcc-15.1.0.orig/libstdc++-v3/include/bits/locale_classes.h gcc-15.1.0/libstdc++-v3/include/bits/locale_classes.h
+--- gcc-15.1.0.orig/libstdc++-v3/include/bits/locale_classes.h 2025-04-25 11:18:05.000000000 +0300
++++ gcc-15.1.0/libstdc++-v3/include/bits/locale_classes.h 2025-04-25 15:58:40.296620091 +0300
+@@ -379,8 +379,12 @@
+ _M_coalesce(const locale& __base, const locale& __add, category __cat);
+
+ #if _GLIBCXX_USE_CXX11_ABI
++#ifdef __MORPHOS__
++static const id* _S_twinned_facets[];
++#else
+ static const id* const _S_twinned_facets[];
+ #endif
++#endif
+ };
+
+ #if __cpp_lib_type_trait_variable_templates // C++ >= 17
+diff -ruN gcc-15.1.0.orig/libstdc++-v3/include/std/mutex gcc-15.1.0/libstdc++-v3/include/std/mutex
+--- gcc-15.1.0.orig/libstdc++-v3/include/std/mutex 2025-04-25 11:18:05.000000000 +0300
++++ gcc-15.1.0/libstdc++-v3/include/std/mutex 2025-04-25 15:58:40.296620091 +0300
+@@ -915,7 +915,21 @@
+ once_flag::_Prepare_execution __exec(__callable);
+
+ // XXX pthread_once does not reset the flag if an exception is thrown.
+- if (int __e = __gthread_once(&__once._M_once, &__once_proxy))
++ int __e = 0;
++#if defined(__MORPHOS__) && defined(__EXCEPTIONS)
++ try
++ {
++#endif
++ __e = __gthread_once(&__once._M_once, &__once_proxy);
++#if defined(__MORPHOS__) && defined(__EXCEPTIONS)
++ }
++ catch (...)
++ {
++ __gthread_once_unlock(&__once._M_once);
++ throw;
++ }
++#endif
++ if (__e)
+ __throw_system_error(__e);
+ }
+
+diff -ruN gcc-15.1.0.orig/libstdc++-v3/libsupc++/new_opa.cc gcc-15.1.0/libstdc++-v3/libsupc++/new_opa.cc
+--- gcc-15.1.0.orig/libstdc++-v3/libsupc++/new_opa.cc 2025-04-25 11:18:05.000000000 +0300
++++ gcc-15.1.0/libstdc++-v3/libsupc++/new_opa.cc 2025-04-25 15:58:40.296620091 +0300
+@@ -97,7 +97,10 @@
+ #else // !HAVE__ALIGNED_MALLOC && !HAVE_POSIX_MEMALIGN && !HAVE_MEMALIGN
+ // The C library doesn't provide any aligned allocation functions, define one.
+ // This is a modified version of code from gcc/config/i386/gmm_malloc.h
+-static inline void*
++#ifndef __MORPHOS__
++static
++#endif
++inline void*
+ aligned_alloc (std::size_t al, std::size_t sz)
+ {
+ // We need extra bytes to store the original value returned by malloc.
+diff -ruN gcc-15.1.0.orig/libstdc++-v3/src/c++11/locale_init.cc gcc-15.1.0/libstdc++-v3/src/c++11/locale_init.cc
+--- gcc-15.1.0.orig/libstdc++-v3/src/c++11/locale_init.cc 2025-04-25 11:18:05.000000000 +0300
++++ gcc-15.1.0/libstdc++-v3/src/c++11/locale_init.cc 2025-04-25 15:58:40.296620091 +0300
+@@ -447,7 +447,11 @@
+ #if _GLIBCXX_USE_DUAL_ABI
+ // Facets that are instantiated for both the COW and SSO std::string ABIs.
+ // The COW ABI version must come first, followed by its SSO twin.
++ #ifdef __MORPHOS__
++ const locale::id* locale::_S_twinned_facets[] = {
++ #else
+ const locale::id* const locale::_S_twinned_facets[] = {
++ #endif
+ &::_ZNSt8numpunctIcE2idE,
+ &numpunct<char>::id,
+ &::_ZNSt7collateIcE2idE,
+diff -ruN gcc-15.1.0.orig/libstdc++-v3/src/c++17/ryu/f2s_intrinsics.h gcc-15.1.0/libstdc++-v3/src/c++17/ryu/f2s_intrinsics.h
+--- gcc-15.1.0.orig/libstdc++-v3/src/c++17/ryu/f2s_intrinsics.h 2025-04-25 11:18:05.000000000 +0300
++++ gcc-15.1.0/libstdc++-v3/src/c++17/ryu/f2s_intrinsics.h 2025-04-25 15:58:40.296620091 +0300
+@@ -17,6 +17,11 @@
+ #ifndef RYU_F2S_INTRINSICS_H
+ #define RYU_F2S_INTRINSICS_H
+
++#ifndef UINT32_MAX
++/* This is fugly, but stdint.h has already been included without __STDC_LIMIT_MACROS - Piru */
++#define UINT32_MAX 4294967295U
++#endif
++
+ // Defines RYU_32_BIT_PLATFORM if applicable.
+
+ #if defined(RYU_FLOAT_FULL_TABLE)
+diff -ruN gcc-15.1.0.orig/libstdc++-v3/src/filesystem/ops.cc gcc-15.1.0/libstdc++-v3/src/filesystem/ops.cc
+--- gcc-15.1.0.orig/libstdc++-v3/src/filesystem/ops.cc 2025-04-25 11:18:05.000000000 +0300
++++ gcc-15.1.0/libstdc++-v3/src/filesystem/ops.cc 2025-04-25 15:58:40.296620091 +0300
+@@ -127,11 +127,6 @@
+
+ #ifdef _GLIBCXX_USE_REALPATH
+ char_ptr buf{ nullptr };
+-# if _XOPEN_VERSION < 700
+- // Not safe to call realpath(path, NULL)
+- using char_type = fs::path::value_type;
+- buf.reset( (char_type*)::malloc(PATH_MAX * sizeof(char_type)) );
+-# endif
+ if (char* rp = ::realpath(pa.c_str(), buf.get()))
+ {
+ if (buf == nullptr)
Index: pkgsrc/cross/ppc-morphos-gcc/files/morphos-std-fastfloat.diff
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/files/morphos-std-fastfloat.diff:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/files/morphos-std-fastfloat.diff Sun Jun 15 12:51:36 2025
@@ -0,0 +1,17 @@
+--- gcc-12.1.0/libstdc++-v3/src/c++17/fast_float/fast_float.h.orig 2022-05-08 15:36:29.485581656 +0300
++++ gcc-12.1.0/libstdc++-v3/src/c++17/fast_float/fast_float.h 2022-05-08 15:35:34.325734211 +0300
+@@ -42,6 +42,14 @@
+ #ifndef FASTFLOAT_FAST_FLOAT_H
+ #define FASTFLOAT_FAST_FLOAT_H
+
++/* This is fugly, but stdint.h has already been included without __STDC_LIMIT_MACROS - Piru */
++#ifndef SIZE_MAX
++#define SIZE_MAX 0xffffffff
++#endif
++#ifndef UINT64_MAX
++#define UINT64_MAX 18446744073709551615ULL
++#endif
++
+ namespace fast_float {
+
+ using std::chars_format;
Index: pkgsrc/cross/ppc-morphos-gcc/files/morphos-std-filesystem-path.diff
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/files/morphos-std-filesystem-path.diff:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/files/morphos-std-filesystem-path.diff Sun Jun 15 12:51:36 2025
@@ -0,0 +1,240 @@
+diff -ruN gcc-10.3.0.orig/libstdc++-v3/src/c++17/fs_ops.cc gcc-10.3.0/libstdc++-v3/src/c++17/fs_ops.cc
+--- gcc-10.3.0.orig/libstdc++-v3/src/c++17/fs_ops.cc 2021-04-08 14:56:30.405768885 +0300
++++ gcc-10.3.0/libstdc++-v3/src/c++17/fs_ops.cc 2021-04-09 00:18:12.582768492 +0300
+@@ -137,6 +137,8 @@
+ {
+ #ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+ inline bool is_dot(wchar_t c) { return c == L'.'; }
++#elif defined(__MORPHOS__) && defined(__libnix__)
++ inline bool is_dot(char c) { return c == '\0'; }
+ #else
+ inline bool is_dot(char c) { return c == '.'; }
+ #endif
+@@ -144,13 +146,21 @@
+ inline bool is_dot(const fs::path& path)
+ {
+ const auto& filename = path.native();
++#if defined(__MORPHOS__) && defined(__libnix__)
++ return filename.size() == 0;
++#else
+ return filename.size() == 1 && is_dot(filename[0]);
++#endif
+ }
+
+ inline bool is_dotdot(const fs::path& path)
+ {
+ const auto& filename = path.native();
++#if defined(__MORPHOS__) && defined(__libnix__)
++ return filename.size() == 1 && filename[0] == '/';
++#else
+ return filename.size() == 2 && is_dot(filename[0]) && is_dot(filename[1]);
++#endif
+ }
+
+ struct free_as_in_malloc
+diff -ruN gcc-10.3.0.orig/libstdc++-v3/src/c++17/fs_path.cc gcc-10.3.0/libstdc++-v3/src/c++17/fs_path.cc
+--- gcc-10.3.0.orig/libstdc++-v3/src/c++17/fs_path.cc 2021-04-08 14:56:30.405768885 +0300
++++ gcc-10.3.0/libstdc++-v3/src/c++17/fs_path.cc 2021-04-09 00:18:12.582768492 +0300
+@@ -80,6 +80,31 @@
+
+ const size_t len = input.size();
+
++#if defined(__MORPHOS__) && defined(__libnix__)
++ // look for root name (:)
++ if (input[0] == ':')
++ {
++ // got root directory
++ root.first.str = input.substr(0, 1);
++ root.first.type = _Type::_Root_dir;
++ ++pos;
++ }
++ // look for volume/device designator
++ else if (len > 1)
++ {
++ const auto despos = input.find_first_of(':', 1);
++ if (despos != input.npos)
++ {
++ // got volume/device designator
++ root.first.str = input.substr(0, despos);
++ root.first.type = _Type::_Root_name;
++
++ root.second.str = input.substr(despos, 1);
++ root.second.type = _Type::_Root_dir;
++ pos = despos + 1;
++ }
++ }
++#else
+ // look for root name or root directory
+ if (len && is_dir_sep(input[0]))
+ {
+@@ -137,6 +162,7 @@
+ pos = input.find_first_not_of(L"/\\", 2);
+ }
+ #endif
++#endif
+
+ if (root.second.valid())
+ last_type = root.second.type;
+@@ -159,6 +185,45 @@
+ cmpt f;
+ if (pos != input.npos)
+ {
++#if defined(__MORPHOS__) && defined(__libnix__)
++ // foo/bar////bleh
++ // =>
++ // 1. "foo" 2, "bar///" 3. "bleh"
++ pos = input.find_first_of(sep, pos);
++ if (pos != input.npos)
++ {
++ const auto end = input.find_first_not_of(sep, pos);
++ if (end == input.npos)
++ {
++ if (pos == last_pos)
++ // "work:/[/...]" met, include these chars as is
++ f.str = input.substr(last_pos, input.length() - last_pos);
++ else
++ // Remove last / as the path ends to one
++ f.str = input.substr(last_pos, input.length() - 1 - last_pos);
++ }
++ else
++ {
++ if (pos == last_pos)
++ // "work:/[/...]something" met, include these chars as is
++ f.str = input.substr(last_pos, end - last_pos);
++ else
++ f.str = input.substr(last_pos, end - 1 - last_pos);
++ }
++ f.type = _Type::_Filename;
++ pos = end;
++ }
++ else if (last_type == _Type::_Filename
++ || last_type == _Type::_Root_dir
++ || (last_pos == 0 && !input.empty()))
++ {
++ if (last_pos < input.length())
++ {
++ f.str = input.substr(last_pos);
++ f.type = _Type::_Filename;
++ }
++ }
++#else
+ pos = input.find_first_not_of(sep, pos);
+ if (pos != input.npos)
+ {
+@@ -176,6 +241,7 @@
+ f.str = input.substr(input.length(), 0);
+ f.type = _Type::_Filename;
+ }
++#endif
+ }
+ last_type = f.type;
+ return f;
+@@ -935,9 +1001,11 @@
+ ++it;
+ }
+ }
++#if !defined(__MORPHOS__) || !defined(__libnix__)
+ else if (is_dir_sep(_M_pathname.back()) && _M_type() == _Type::_Multi
+ && _M_cmpts.back()._M_type() == _Type::_Filename)
+ orig_filenamelen = 0; // current path has empty filename at end
++#endif
+
+ int capacity = 0;
+ if (_M_type() == _Type::_Multi)
+@@ -1653,6 +1721,21 @@
+
+ namespace
+ {
++#if defined(__MORPHOS__) && defined(__libnix__)
++ inline bool is_dot(fs::path::value_type c) { return c == '\0'; }
++
++ inline bool is_dot(const fs::path& path)
++ {
++ const auto& filename = path.native();
++ return filename.size() == 0;
++ }
++
++ inline bool is_dotdot(const fs::path& path)
++ {
++ const auto& filename = path.native();
++ return filename.size() == 1 && filename[0] == '/';
++ }
++#else
+ inline bool is_dot(fs::path::value_type c) { return c == dot; }
+
+ inline bool is_dot(const fs::path& path)
+@@ -1666,6 +1749,7 @@
+ const auto& filename = path.native();
+ return filename.size() == 2 && is_dot(filename[0]) && is_dot(filename[1]);
+ }
++#endif
+ } // namespace
+
+ path
+@@ -1759,6 +1843,7 @@
+ ret /= p;
+ }
+
++#if !defined(__MORPHOS__) || !defined(__libnix__)
+ if (ret._M_cmpts.size() >= 2)
+ {
+ auto back = std::prev(ret.end());
+@@ -1770,6 +1855,7 @@
+ // If the path is empty, add a dot.
+ else if (ret.empty())
+ ret = ".";
++#endif
+
+ return ret;
+ }
+@@ -1799,7 +1885,11 @@
+ return ret;
+ #endif
+ if (a == end() && b == base.end())
++#if defined(__MORPHOS__) && defined(__libnix__)
++ ret = "";
++#else
+ ret = ".";
++#endif
+ else
+ {
+ int n = 0;
+@@ -1812,10 +1902,18 @@
+ ++n;
+ }
+ if (n == 0 && (a == end() || a->empty()))
++#if defined(__MORPHOS__) && defined(__libnix__)
++ ret = "";
++#else
+ ret = ".";
++#endif
+ else if (n >= 0)
+ {
++#if defined(__MORPHOS__) && defined(__libnix__)
++ const path dotdot("/");
++#else
+ const path dotdot("..");
++#endif
+ while (n--)
+ ret /= dotdot;
+ for (; a != end(); ++a)
+--- gcc-12.1.0/libstdc++-v3/src/filesystem/ops-common.h.orig 2022-05-06 10:31:00.000000000 +0300
++++ gcc-12.1.0/libstdc++-v3/src/filesystem/ops-common.h 2022-05-08 14:58:03.798844976 +0300
+@@ -635,6 +635,9 @@
+ get_temp_directory_from_env(error_code& ec) noexcept
+ {
+ ec.clear();
++#if defined(__MORPHOS__) && defined(__libnix__)
++ return "T:";
++#else
+ for (auto env : { "TMPDIR", "TMP", "TEMP", "TEMPDIR" })
+ {
+ #if _GLIBCXX_HAVE_SECURE_GETENV
+@@ -646,6 +649,7 @@
+ return tmpdir;
+ }
+ return "/tmp";
++#endif
+ }
+ #endif
+
Index: pkgsrc/cross/ppc-morphos-gcc/files/objc-saveds.diff
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/files/objc-saveds.diff:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/files/objc-saveds.diff Sun Jun 15 12:51:36 2025
@@ -0,0 +1,18 @@
+Make all ObjC methods saveds.
+
+--- gcc/objc/objc-act.cc.orig 2025-05-31 23:13:39.128573359 +0200
++++ gcc/objc/objc-act.cc 2025-05-31 23:13:44.450437107 +0200
+@@ -5215,6 +5215,13 @@
+ else
+ ftype = build_function_type_vec (return_type, argtypes);
+
++#ifdef TARGET_BASEREL
++ if (TARGET_BASEREL)
++ TYPE_ATTRIBUTES (ftype) = tree_cons (get_identifier ("saveds"),
++ NULL_TREE,
++ TYPE_ATTRIBUTES (ftype));
++#endif
++
+ release_tree_vector (argtypes);
+ return ftype;
+ }
Index: pkgsrc/cross/ppc-morphos-gcc/patches/patch-config_override.m4
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/patches/patch-config_override.m4:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/patches/patch-config_override.m4 Sun Jun 15 12:51:36 2025
@@ -0,0 +1,19 @@
+$NetBSD: patch-config_override.m4,v 1.1 2025/06/15 12:51:36 js Exp $
+
+Allow using newer autoconf versions. 2.71 works just fine.
+
+--- config/override.m4.orig 2020-07-23 06:35:16.916379838 +0000
++++ config/override.m4
+@@ -38,11 +38,7 @@ dnl m4_define([_GCC_AUTOCONF_VERSION],
+ dnl in configure.ac before AC_INIT,
+ dnl without rewriting this file.
+ dnl Or for updating the whole tree at once with the definition above.
+-AC_DEFUN([_GCC_AUTOCONF_VERSION_CHECK],
+-[m4_if(m4_defn([_GCC_AUTOCONF_VERSION]),
+- m4_defn([m4_PACKAGE_VERSION]), [],
+- [m4_fatal([Please use exactly Autoconf ]_GCC_AUTOCONF_VERSION[ instead of ]m4_defn([m4_PACKAGE_VERSION])[.])])
+-])
++AC_DEFUN([_GCC_AUTOCONF_VERSION_CHECK], [])
+ m4_define([AC_INIT], m4_defn([AC_INIT])[
+ _GCC_AUTOCONF_VERSION_CHECK
+ ])
Index: pkgsrc/cross/ppc-morphos-gcc/patches/patch-gcc_config_rs6000_morphos.h
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/patches/patch-gcc_config_rs6000_morphos.h:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/patches/patch-gcc_config_rs6000_morphos.h Sun Jun 15 12:51:36 2025
@@ -0,0 +1,17 @@
+$NetBSD: patch-gcc_config_rs6000_morphos.h,v 1.1 2025/06/15 12:51:36 js Exp $
+
+Don't try to unconditionally pull in -latomic - it will make the bootstrap
+compiler require -latomic, which of course means we can never have a compiler
+to build libatomic.
+
+--- gcc/config/rs6000/morphos.h.orig 2022-10-17 11:41:30.695278835 +0000
++++ gcc/config/rs6000/morphos.h
+@@ -258,7 +258,7 @@ mclib=default|!mclib=*: %(endfile_morpho
+
+
+ #undef LIB_SPEC
+-#define LIB_SPEC "%{!nostdlib: -L/gg/lib -L/gg/usr/lib} --start-group -lc -labox -laboxstubs -lsavl -latomic %{mclib=libnix: -lauto} %{pthread:-lpthread} --end-group"
++#define LIB_SPEC "%{!nostdlib: -L/gg/lib -L/gg/usr/lib} --start-group -lc -labox -laboxstubs -lsavl %{mclib=libnix: -lauto} %{pthread:-lpthread} --end-group"
+
+ #undef SUBTARGET_EXTRA_SPECS
+ #define SUBTARGET_EXTRA_SPECS \
Index: pkgsrc/cross/ppc-morphos-gcc/patches/patch-libcc1_configure.ac
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/patches/patch-libcc1_configure.ac:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/patches/patch-libcc1_configure.ac Sun Jun 15 12:51:36 2025
@@ -0,0 +1,18 @@
+$NetBSD: patch-libcc1_configure.ac,v 1.1 2025/06/15 12:51:36 js Exp $
+
+Avoid using ${PREFIX}/gg/lib64 on Fedora.
+
+--- libcc1/configure.ac.orig 2021-07-25 12:36:55.585617763 +0000
++++ libcc1/configure.ac
+@@ -65,10 +65,7 @@ ACX_PROG_CC_WARNINGS_ARE_ERRORS([manual]
+
+ AC_ARG_VAR(GMPINC,[How to find GMP include files])
+
+-libsuffix=
+-if test "$GXX" = yes; then
+- libsuffix=`$CXX -print-multi-os-directory`
+-fi
++libsuffix=../lib
+ AC_SUBST(libsuffix)
+
+ dnl Test for -lsocket and -lnsl. Copied from libgo/configure.ac.
Index: pkgsrc/cross/ppc-morphos-gcc/patches/patch-libgcc_config_rs6000_gthr-morphos.c
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/patches/patch-libgcc_config_rs6000_gthr-morphos.c:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/patches/patch-libgcc_config_rs6000_gthr-morphos.c Sun Jun 15 12:51:36 2025
@@ -0,0 +1,13 @@
+$NetBSD: patch-libgcc_config_rs6000_gthr-morphos.c,v 1.1 2025/06/15 12:51:36 js Exp $
+
+--- libgcc/config/rs6000/gthr-morphos.c.orig 2025-06-15 12:32:32.655339102 +0000
++++ libgcc/config/rs6000/gthr-morphos.c
+@@ -1243,7 +1243,7 @@ int __gthr_morphos_mutex_unlock (__gthre
+ }
+
+
+-static inline void UNIXTIME_TO_AMIGATIME(const struct TimeVal *from, struct TimeVal *to)
++static inline void UNIXTIME_TO_AMIGATIME(const struct timeval *from, struct timeval *to)
+ {
+ const ULONG unix_to_amiga = (8 * 365 + 2) * 24 * 60 * 60;
+
Index: pkgsrc/cross/ppc-morphos-gcc/patches/patch-libstdc++-v3_crossconfig.m4
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/patches/patch-libstdc++-v3_crossconfig.m4:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/patches/patch-libstdc++-v3_crossconfig.m4 Sun Jun 15 12:51:36 2025
@@ -0,0 +1,17 @@
+$NetBSD: patch-libstdc++-v3_crossconfig.m4,v 1.1 2025/06/15 12:51:36 js Exp $
+
+Don't use anything that needs a link test, as link tests are forbidden after
+GCC_NO_EXECUTABLES and will error out.
+
+--- libstdc++-v3/crossconfig.m4.orig 2021-07-25 14:28:05.622501010 +0000
++++ libstdc++-v3/crossconfig.m4
+@@ -201,9 +201,6 @@ case "${host}" in
+ ;;
+ *-morphos*)
+ GLIBCXX_CHECK_COMPILER_FEATURES
+- GLIBCXX_CHECK_LINKER_FEATURES
+- GLIBCXX_CHECK_MATH_SUPPORT
+- GLIBCXX_CHECK_STDLIB_SUPPORT
+ ;;
+ *-netbsd* | *-openbsd*)
+ SECTION_FLAGS='-ffunction-sections -fdata-sections'
Index: pkgsrc/cross/ppc-morphos-gcc/patches/patch-libstdc++-v3_libsupc++_unwind-cxx.h
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/patches/patch-libstdc++-v3_libsupc++_unwind-cxx.h:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/patches/patch-libstdc++-v3_libsupc++_unwind-cxx.h Sun Jun 15 12:51:36 2025
@@ -0,0 +1,13 @@
+$NetBSD: patch-libstdc++-v3_libsupc++_unwind-cxx.h,v 1.1 2025/06/15 12:51:36 js Exp $
+
+--- libstdc++-v3/libsupc++/unwind-cxx.h.orig 2020-01-25 15:10:52.346666839 +0000
++++ libstdc++-v3/libsupc++/unwind-cxx.h
+@@ -37,7 +37,7 @@
+ #include <bits/atomic_word.h>
+ #include <cxxabi.h>
+
+-#ifdef _GLIBCXX_HAVE_SYS_SDT_H
++#if 0 // _GLIBCXX_HAVE_SYS_SDT_H wrongly detected
+ #include <sys/sdt.h>
+ /* We only want to use stap probes starting with v3. Earlier versions
+ added too much startup cost. */
Index: pkgsrc/cross/ppc-morphos-gcc/patches/patch-zlib_zutil.c
diff -u /dev/null pkgsrc/cross/ppc-morphos-gcc/patches/patch-zlib_zutil.c:1.1
--- /dev/null Sun Jun 15 12:51:36 2025
+++ pkgsrc/cross/ppc-morphos-gcc/patches/patch-zlib_zutil.c Sun Jun 15 12:51:36 2025
@@ -0,0 +1,11 @@
+$NetBSD: patch-zlib_zutil.c,v 1.1 2025/06/15 12:51:36 js Exp $
+
+Fix building on macOS 15.
+
+--- zlib/zutil.c.orig 2025-04-20 20:10:32.611766921 +0000
++++ zlib/zutil.c
+@@ -7,2 +7,4 @@
+
++#include <stdio.h>
++
+ #include "zutil.h"
Home |
Main Index |
Thread Index |
Old Index