This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] AIX V5 new support
- To: Geoff Keating <geoffk at redhat dot com>
- Subject: [PATCH] AIX V5 new support
- From: David Edelsohn <dje at watson dot ibm dot com>
- Date: Wed, 24 Jan 2001 19:42:44 -0500
- cc: gcc-patches at gcc dot gnu dot org, Mark Mitchell <mark at codesourcery dot com>
The following patch adds AIX V5 target support to GCC and one
minor fix to fix a long-standing bug report of collect2 not respecting
.obj file extension.
Any objection to adding this functionality at this time?
David
2001-01-24 David Edelsohn <edelsohn@gnu.org>
* ltcf-c.sh: Add aix5 case.
* ltcf-cxx.sh: Same.
* ltconfig: Same.
* config.gcc (rs6000-ibm-aix[5-9]*): Change to aix51.h.
* collect2.c (main): Delete importf. Add ".obj" file extension.
(GCC_CHECK_HDR): Handle AIX V5 new magic number.
(aix_std_libs): Add additional AIX libraries to skip.
* config/rs6000/aix.h (MY_ISCOFF): Add AIX V5 new magic number.
* config/rs6000/aix51.h: New file.
Index: ltcf-c.sh
===================================================================
RCS file: /cvs/gcc/egcs/ltcf-c.sh,v
retrieving revision 1.6
diff -c -p -r1.6 ltcf-c.sh
*** ltcf-c.sh 2001/01/02 15:55:07 1.6
--- ltcf-c.sh 2001/01/25 00:25:26
*************** if test "$with_gnu_ld" = yes; then
*** 57,63 ****
# See if GNU ld supports shared libraries.
case "$host_os" in
! aix3* | aix4*)
# On AIX, the GNU linker is very broken
ld_shlibs=no
cat <<EOF 1>&2
--- 57,63 ----
# See if GNU ld supports shared libraries.
case "$host_os" in
! aix3* | aix4* | aix5*)
# On AIX, the GNU linker is very broken
ld_shlibs=no
cat <<EOF 1>&2
*************** else
*** 251,257 ****
fi
;;
! aix4*)
hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib'
hardcode_libdir_separator=':'
if test "$with_gcc" = yes; then
--- 251,257 ----
fi
;;
! aix4* | aix5*)
hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib'
hardcode_libdir_separator=':'
if test "$with_gcc" = yes; then
*************** else
*** 575,581 ****
else
# PORTME Check for PIC flags for the system compiler.
case "$host_os" in
! aix3* | aix4*)
# All AIX code is PIC.
ac_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp'
;;
--- 575,581 ----
else
# PORTME Check for PIC flags for the system compiler.
case "$host_os" in
! aix3* | aix4* | aix5*)
# All AIX code is PIC.
ac_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp'
;;
Index: ltcf-cxx.sh
===================================================================
RCS file: /cvs/gcc/egcs/ltcf-cxx.sh,v
retrieving revision 1.7
diff -c -p -r1.7 ltcf-cxx.sh
*** ltcf-cxx.sh 2001/01/02 15:55:07 1.7
--- ltcf-cxx.sh 2001/01/25 00:25:26
*************** fi
*** 116,122 ****
# In general, the C++ compiler should always link C++ objects.
case $target in
! *aix3* | *aix4*)
# AIX just has to be different, doesn't it? :-\
LD=makeC++SharedLib_r
LDFLAGS="$LDFLAGS -p 0"
--- 116,122 ----
# In general, the C++ compiler should always link C++ objects.
case $target in
! *aix3* | *aix4* | *aix5*)
# AIX just has to be different, doesn't it? :-\
LD=makeC++SharedLib_r
LDFLAGS="$LDFLAGS -p 0"
*************** case "$host_os" in
*** 134,140 ****
# FIXME: insert proper C++ library support
ld_shlibs=no
;;
! aix4*)
archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
# -bexpall does not export symbols beginning with underscore (_)
always_export_symbols=yes
--- 134,140 ----
# FIXME: insert proper C++ library support
ld_shlibs=no
;;
! aix4* | aix5*)
archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
# -bexpall does not export symbols beginning with underscore (_)
always_export_symbols=yes
*************** if test "$with_gcc" = yes; then
*** 621,627 ****
esac
else
case "$host_os" in
! aix4*)
# All AIX code is PIC.
;;
chorus*)
--- 621,627 ----
esac
else
case "$host_os" in
! aix4* | aix5*)
# All AIX code is PIC.
;;
chorus*)
Index: ltconfig
===================================================================
RCS file: /cvs/gcc/egcs/ltconfig,v
retrieving revision 1.13
diff -c -p -r1.13 ltconfig
*** ltconfig 2001/01/02 15:55:07 1.13
--- ltconfig 2001/01/25 00:25:26
*************** aix3*)
*** 942,948 ****
soname_spec='${libname}${release}.so$major'
;;
! aix4*)
version_type=linux
# AIX has no versioning support, so currently we can not hardcode correct
# soname into executable. Probably we can add versioning support to
--- 942,948 ----
soname_spec='${libname}${release}.so$major'
;;
! aix4* | aix5*)
version_type=linux
# AIX has no versioning support, so currently we can not hardcode correct
# soname into executable. Probably we can add versioning support to
*************** aix3*)
*** 1432,1438 ****
fi
;;
! aix4*)
test "$enable_shared" = yes && enable_static=no
;;
esac
--- 1432,1438 ----
fi
;;
! aix4* | aix5*)
test "$enable_shared" = yes && enable_static=no
;;
esac
Index: gcc/config.gcc
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config.gcc,v
retrieving revision 1.23
diff -c -p -r1.23 config.gcc
*** config.gcc 2001/01/18 13:26:47 1.23
--- config.gcc 2001/01/25 00:25:27
*************** rs6000-ibm-aix4.[3456789]* | powerpc-ibm
*** 2889,2895 ****
thread_file='aix'
;;
rs6000-ibm-aix[56789].* | powerpc-ibm-aix[56789].*)
! tm_file="${tm_file} rs6000/aix.h rs6000/aix43.h"
tmake_file=rs6000/t-aix43
xmake_file=rs6000/x-aix41
float_format=none
--- 2889,2895 ----
thread_file='aix'
;;
rs6000-ibm-aix[56789].* | powerpc-ibm-aix[56789].*)
! tm_file="${tm_file} rs6000/aix.h rs6000/aix51.h"
tmake_file=rs6000/t-aix43
xmake_file=rs6000/x-aix41
float_format=none
Index: gcc/collect2.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/collect2.c,v
retrieving revision 1.106
diff -c -p -r1.106 collect2.c
*** collect2.c 2001/01/07 10:46:09 1.106
--- collect2.c 2001/01/25 00:25:27
*************** main (argc, argv)
*** 850,856 ****
FILE *outf;
#ifdef COLLECT_EXPORT_LIST
FILE *exportf;
- FILE *importf;
#endif
const char *ld_file_name;
const char *p;
--- 850,855 ----
*************** main (argc, argv)
*** 1219,1225 ****
}
else if ((p = strrchr (arg, '.')) != (char *) 0
&& (strcmp (p, ".o") == 0 || strcmp (p, ".a") == 0
! || strcmp (p, ".so") == 0 || strcmp (p, ".lo") == 0))
{
if (first_file)
{
--- 1218,1225 ----
}
else if ((p = strrchr (arg, '.')) != (char *) 0
&& (strcmp (p, ".o") == 0 || strcmp (p, ".a") == 0
! || strcmp (p, ".so") == 0 || strcmp (p, ".lo") == 0
! || strcmp (p, ".obj") == 0))
{
if (first_file)
{
*************** scan_libraries (prog_name)
*** 2664,2676 ****
--- 2664,2679 ----
#ifdef OBJECT_FORMAT_COFF
#if defined(EXTENDED_COFF)
+
# define GCC_SYMBOLS(X) (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax)
# define GCC_SYMENT SYMR
# define GCC_OK_SYMBOL(X) ((X).st == stProc || (X).st == stGlobal)
# define GCC_SYMINC(X) (1)
# define GCC_SYMZERO(X) (SYMHEADER(X).isymMax)
# define GCC_CHECK_HDR(X) (PSYMTAB(X) != 0)
+
#else
+
# define GCC_SYMBOLS(X) (HEADER(ldptr).f_nsyms)
# define GCC_SYMENT SYMENT
# define GCC_OK_SYMBOL(X) \
*************** scan_libraries (prog_name)
*** 2683,2693 ****
--- 2686,2705 ----
(((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
# define GCC_SYMINC(X) ((X).n_numaux+1)
# define GCC_SYMZERO(X) 0
+
+ /* 0757 = U803XTOCMAGIC (AIX 4.3) and 0767 = U64_TOCMAGIC (AIX V5) */
+ #ifdef _AIX51
# define GCC_CHECK_HDR(X) \
((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
+ || (HEADER (X).f_magic == 0767 && aix64_flag))
+ #else
+ # define GCC_CHECK_HDR(X) \
+ ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
|| (HEADER (X).f_magic == 0757 && aix64_flag))
#endif
+ #endif
+
extern char *ldgetname ();
/* COFF version to scan the name list of the loaded program for
*************** if (debug) fprintf (stderr, "found: %s\n
*** 2913,2924 ****
--- 2925,2942 ----
static const char *aix_std_libs[] = {
"/unix",
"/lib/libc.a",
+ "/lib/libm.a",
"/lib/libc_r.a",
+ "/lib/libm_r.a",
"/usr/lib/libc.a",
+ "/usr/lib/libm.a",
"/usr/lib/libc_r.a",
+ "/usr/lib/libm_r.a",
"/usr/lib/threads/libc.a",
"/usr/ccs/lib/libc.a",
+ "/usr/ccs/lib/libm.a",
"/usr/ccs/lib/libc_r.a",
+ "/usr/ccs/lib/libm_r.a",
NULL
};
Index: gcc/config/rs6000/aix.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/rs6000/aix.h,v
retrieving revision 1.12
diff -c -p -r1.12 aix.h
*** aix.h 2001/01/07 09:17:24 1.12
--- aix.h 2001/01/25 00:25:27
*************** Boston, MA 02111-1307, USA. */
*** 32,46 ****
/* Define the magic numbers that we recognize as COFF.
! AIX 4.3 adds U803XTOCMAGIC (0757) for 64-bit objects, but collect2.c
! does not include files in the correct order to conditionally define
! the symbolic name in this macro.
The AIX linker accepts import/export files as object files,
so accept "#!" (0x2321) magic number. */
#define MY_ISCOFF(magic) \
((magic) == U802WRMAGIC || (magic) == U802ROMAGIC \
! || (magic) == U802TOCMAGIC || (magic) == 0757 || (magic) == 0x2321)
/* This is the only version of nm that collect2 can work with. */
#define REAL_NM_FILE_NAME "/usr/ucb/nm"
--- 32,47 ----
/* Define the magic numbers that we recognize as COFF.
! AIX 4.3 adds U803XTOCMAGIC (0757) for 64-bit objects and AIX V5 adds
! U64_TOCMAGIC (0767), but collect2.c does not include files in the
! correct order to conditionally define the symbolic name in this macro.
The AIX linker accepts import/export files as object files,
so accept "#!" (0x2321) magic number. */
#define MY_ISCOFF(magic) \
((magic) == U802WRMAGIC || (magic) == U802ROMAGIC \
! || (magic) == U802TOCMAGIC || (magic) == 0757 || (magic) == 0767 \
! || (magic) == 0x2321)
/* This is the only version of nm that collect2 can work with. */
#define REAL_NM_FILE_NAME "/usr/ucb/nm"
Index: gcc/config/rs6000/aix51.h
===================================================================
/* Definitions of target machine for GNU compiler,
for IBM RS/6000 POWER running AIX V5.
Copyright (C) 2001 Free Software Foundation, Inc.
Contributed by David Edelsohn (edelsohn@gnu.org).
This file is part of GNU CC.
GNU CC 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 2, or (at your option)
any later version.
GNU CC 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 GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "rs6000/rs6000.h"
#include "rs6000/aix.h"
/* AIX V5 and above support 64-bit executables. */
#undef SUBSUBTARGET_SWITCHES
#define SUBSUBTARGET_SWITCHES \
{"aix64", MASK_64BIT | MASK_POWERPC64 | MASK_POWERPC, \
N_("Compile for 64-bit pointers") }, \
{"aix32", - (MASK_64BIT | MASK_POWERPC64), \
N_("Compile for 32-bit pointers") }, \
{"pe", 0, \
N_("Support message passing with the Parallel Environment") },
/* Sometimes certain combinations of command options do not make sense
on a particular target machine. You can define a macro
`OVERRIDE_OPTIONS' to take account of this. This macro, if
defined, is executed once just after all the command options have
been parsed.
The macro SUBTARGET_OVERRIDE_OPTIONS is provided for subtargets, to
get control. */
#define NON_POWERPC_MASKS (MASK_POWER | MASK_POWER2 | MASK_STRING)
#define SUBTARGET_OVERRIDE_OPTIONS \
do { \
if (TARGET_64BIT && (target_flags & NON_POWERPC_MASKS)) \
{ \
target_flags &= ~NON_POWERPC_MASKS; \
warning ("-maix64 and POWER architecture are incompatible."); \
} \
if (TARGET_64BIT && ! TARGET_POWERPC64) \
{ \
target_flags |= MASK_POWERPC64; \
warning ("-maix64 requires PowerPC64 architecture remain enabled."); \
} \
if (TARGET_POWERPC64 && ! TARGET_64BIT) \
{ \
error ("-maix64 required: 64-bit computation with 32-bit addressing not yet supported."); \
} \
} while (0);
#undef ASM_SPEC
#define ASM_SPEC "-u %{maix64:-a64 -mppc64} %(asm_cpu)"
/* Common ASM definitions used by ASM_SPEC amonst the various targets
for handling -mcpu=xxx switches. */
#undef ASM_CPU_SPEC
#define ASM_CPU_SPEC \
"%{!mcpu*: %{!maix64: \
%{mpower: %{!mpower2: -mpwr}} \
%{mpower2: -mpwr2} \
%{mpowerpc*: %{!mpowerpc64: -mppc}} \
%{mpowerpc64: -mppc64} \
%{!mpower*: %{!mpowerpc*: %(asm_default)}}}} \
%{mcpu=common: -mcom} \
%{mcpu=power: -mpwr} \
%{mcpu=power2: -mpwr2} \
%{mcpu=powerpc: -mppc} \
%{mcpu=rios: -mpwr} \
%{mcpu=rios1: -mpwr} \
%{mcpu=rios2: -mpwr2} \
%{mcpu=rsc: -mpwr} \
%{mcpu=rsc1: -mpwr} \
%{mcpu=rs64a: -mppc} \
%{mcpu=403: -mppc} \
%{mcpu=505: -mppc} \
%{mcpu=601: -m601} \
%{mcpu=602: -mppc} \
%{mcpu=603: -m603} \
%{mcpu=603e: -m603} \
%{mcpu=604: -m604} \
%{mcpu=604e: -m604} \
%{mcpu=620: -mppc} \
%{mcpu=630: -mppc} \
%{mcpu=821: -mppc} \
%{mcpu=860: -mppc}"
#undef ASM_DEFAULT_SPEC
#define ASM_DEFAULT_SPEC "-mcom"
#undef CPP_PREDEFINES
#define CPP_PREDEFINES "-D_IBMR2 -D_POWER -D_LONG_LONG \
-D_AIX -D_AIX32 -D_AIX41 -D_AIX43 -D_AIX51 -Asystem=unix -Asystem=aix"
#undef CPP_SPEC
#define CPP_SPEC "%{posix: -D_POSIX_SOURCE} \
%{ansi: -D_ANSI_C_SOURCE} \
%{!maix64: -D__WCHAR_TYPE="short unsigned int"} \
%{maix64: -D__64BIT__ -D_ARCH_PPC -D__WCHAR_TYPE="unsigned int" \
-D__LONG_MAX__=9223372036854775807L} \
%{mpe: -I/usr/lpp/ppe.poe/include} \
%{pthread: -D_THREAD_SAFE} \
%(cpp_cpu)"
/* Common CPP definitions used by CPP_SPEC among the various targets
for handling -mcpu=xxx switches. */
#undef CPP_CPU_SPEC
#define CPP_CPU_SPEC \
"%{!mcpu*: %{!maix64: \
%{mpower: %{!mpower2: -D_ARCH_PWR}} \
%{mpower2: -D_ARCH_PWR2} \
%{mpowerpc*: -D_ARCH_PPC} \
%{!mpower*: %{!mpowerpc*: %(cpp_default)}}}} \
%{mcpu=common: -D_ARCH_COM} \
%{mcpu=power: -D_ARCH_PWR} \
%{mcpu=power2: -D_ARCH_PWR2} \
%{mcpu=powerpc: -D_ARCH_PPC} \
%{mcpu=rios: -D_ARCH_PWR} \
%{mcpu=rios1: -D_ARCH_PWR} \
%{mcpu=rios2: -D_ARCH_PWR2} \
%{mcpu=rsc: -D_ARCH_PWR} \
%{mcpu=rsc1: -D_ARCH_PWR} \
%{mcpu=rs64a: -D_ARCH_PPC} \
%{mcpu=403: -D_ARCH_PPC} \
%{mcpu=505: -D_ARCH_PPC} \
%{mcpu=601: -D_ARCH_PPC -D_ARCH_PWR} \
%{mcpu=602: -D_ARCH_PPC} \
%{mcpu=603: -D_ARCH_PPC} \
%{mcpu=603e: -D_ARCH_PPC} \
%{mcpu=604: -D_ARCH_PPC} \
%{mcpu=620: -D_ARCH_PPC} \
%{mcpu=630: -D_ARCH_PPC} \
%{mcpu=821: -D_ARCH_PPC} \
%{mcpu=860: -D_ARCH_PPC}"
#undef CPP_DEFAULT_SPEC
#define CPP_DEFAULT_SPEC "-D_ARCH_COM"
#undef TARGET_DEFAULT
#define TARGET_DEFAULT MASK_NEW_MNEMONICS
#undef PROCESSOR_DEFAULT
#define PROCESSOR_DEFAULT PROCESSOR_PPC604
/* Define this macro as a C expression for the initializer of an
array of string to tell the driver program which options are
defaults for this target and thus do not need to be handled
specially when using `MULTILIB_OPTIONS'.
Do not define this macro if `MULTILIB_OPTIONS' is not defined in
the target makefile fragment or if none of the options listed in
`MULTILIB_OPTIONS' are set by default. *Note Target Fragment::. */
#undef MULTILIB_DEFAULTS
#define MULTILIB_DEFAULTS { "mcpu=common" }
#undef LIB_SPEC
#define LIB_SPEC "%{pg:-L/lib/profiled -L/usr/lib/profiled}\
%{p:-L/lib/profiled -L/usr/lib/profiled}\
%{!maix64:%{!shared:%{g*:-lg}}}\
%{mpe:-L/usr/lpp/ppe.poe/lib -lmpi -lvtd}\
%{pthread:-lpthreads} -lc"
#undef LINK_SPEC
#define LINK_SPEC "-bpT:0x10000000 -bpD:0x20000000 %{!r:-btextro} -bnodelcsect\
%{static:-bnso %(link_syscalls) } %{shared:-bM:SRE %{!e:-bnoentry}}\
%{!maix64:%{!shared:%{g*: %(link_libg) }}} %{maix64:-b64}"
#undef STARTFILE_SPEC
#define STARTFILE_SPEC "%{!shared:\
%{mpe:%{pg:/usr/lpp/ppe.poe/lib/gcrt0.o}\
%{!pg:%{p:/usr/lpp/ppe.poe/lib/mcrt0.o}\
%{!p:/usr/lpp/ppe.poe/lib/crt0.o}}}\
%{!mpe:\
%{maix64:%{pg:gcrt0_64%O%s}%{!pg:%{p:mcrt0_64%O%s}%{!p:crt0_64%O%s}}}\
%{!maix64:\
%{pthread:%{pg:gcrt0_r%O%s}%{!pg:%{p:mcrt0_r%O%s}%{!p:crt0_r%O%s}}}\
%{!pthread:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}}}}"
/* AIX V5 typedefs ptrdiff_t as "long" while earlier releases used "int". */
#undef PTRDIFF_TYPE
#define PTRDIFF_TYPE "long int"
/* __WCHAR_TYPE__ is dynamic, so do not define it statically. */
#define NO_BUILTIN_WCHAR_TYPE
#undef WCHAR_TYPE
/* Width of wchar_t in bits. */
#define WCHAR_TYPE_SIZE (!TARGET_64BIT ? 16 : 32)
#define MAX_WCHAR_TYPE_SIZE 32
/* AIX V5 uses PowerPC nop (ori 0,0,0) instruction as call glue for PowerPC
and "cror 31,31,31" for POWER architecture. */
#undef RS6000_CALL_GLUE
#define RS6000_CALL_GLUE "{cror 31,31,31|nop}"
/* AIX 4.2 and above provides initialization and finalization function
support from linker command line. */
#undef HAS_INIT_SECTION
#define HAS_INIT_SECTION
#undef LD_INIT_SWITCH
#define LD_INIT_SWITCH "-binitfini"