From 742aeb63e9f0088cb5f2764d04304a7a04aa344d Mon Sep 17 00:00:00 2001 From: Tom Rix Date: Mon, 3 Dec 2001 23:15:28 +0000 Subject: [PATCH] Pass argc and argv to ldemul_choose_target. Support -b64 in AIX --- ld/ChangeLog | 15 ++++++++ ld/Makefile.in | 4 --- ld/configure.tgt | 6 +--- ld/emultempl/aix.em | 77 +++++++++++++++++++++++++++++++++++------ ld/emultempl/gld960.em | 6 ++-- ld/emultempl/gld960c.em | 6 ++-- ld/ldemul.c | 11 ++++-- ld/ldemul.h | 6 ++-- ld/ldmain.c | 2 +- ld/scripttempl/aix.sc | 2 +- 10 files changed, 104 insertions(+), 31 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index a07f0567945..c123de2090d 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,18 @@ +2001-12-02 Tom Rix + + * configure.tgt : Remove eaixppc64 emulations. + * Makefile.in : Remove eaixppc64.c + * ldemul.c (ldemul_choose_target): New parameters argc, argv. + (ldemul_default_target): Same. + * emultempl/gld960.em (gld960_choose_target): Same. + * emultempl/gld960c.em (gld960_choose_target): Same. + * scripttempl/aix.sc: Remove OUTPUT_FORMAT. + * emultempl/aix.em (is_syscall): syscall_mask now a variable. + * emultempl/aix.em (gld*_read_file): symbol_mode_mask now a variable. + * emultempl/aix.em (gld*_parse_args): Handle -b32 -b64 emulation. + * emultempl/aix.em (choose_target): New function. Handle emulation of + -b32 and -b64. + 2001-11-27 H.J. Lu * emulparams/elf_i386.sh (NO_SMALL_DATA): Set to yes. diff --git a/ld/Makefile.in b/ld/Makefile.in index 95d2c4cd35f..1231eb75c0a 100644 --- a/ld/Makefile.in +++ b/ld/Makefile.in @@ -380,7 +380,6 @@ ALL_64_EMULATIONS = \ emmo.o \ eelf64ppc.o \ eelf64lppc.o \ - eaixppc64.o \ ehppa64linux.o @@ -1055,9 +1054,6 @@ stringify.sed: ${srcdir}/emultempl/$(STRINGIFY) ea29k.c: $(srcdir)/emulparams/a29k.sh \ $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/a29k.sc ${GEN_DEPENDS} ${GENSCRIPTS} a29k "$(tdir_a29k)" -eaixppc64.c: $(srcdir)/emulparams/aixppc64.sh \ - $(srcdir)/emultempl/aix.em $(srcdir)/scripttempl/aix.sc ${GEN_DEPENDS} - ${GENSCRIPTS} aixppc64 "$(tdir_aixppc64)" eaixppc.c: $(srcdir)/emulparams/aixppc.sh \ $(srcdir)/emultempl/aix.em $(srcdir)/scripttempl/aix.sc ${GEN_DEPENDS} ${GENSCRIPTS} aixppc "$(tdir_aixppc)" diff --git a/ld/configure.tgt b/ld/configure.tgt index 63d2fb7fe54..a66f77a15b8 100644 --- a/ld/configure.tgt +++ b/ld/configure.tgt @@ -377,11 +377,7 @@ powerpc-*-netware*) targ_emul=ppcnw ;; powerpcle-*-pe) targ_emul=ppcpe ;; powerpcle-*-winnt*) targ_emul=ppcpe ;; powerpcle-*-cygwin*) targ_emul=ppcpe ;; - -powerpc-*-aix*) targ_emul=aixppc - targ_extra_emuls="aixppc64" - tdir_aixppc64=${targ_alias} - ;; +powerpc-*-aix*) targ_emul=aixppc ;; powerpc-*-beos*) targ_emul=aixppc ;; rs6000-*-aix*) targ_emul=aixrs6 ;; tic30-*-*aout*) targ_emul=tic30aout ;; diff --git a/ld/emultempl/aix.em b/ld/emultempl/aix.em index eb01b66ad57..989e5b28435 100644 --- a/ld/emultempl/aix.em +++ b/ld/emultempl/aix.em @@ -57,6 +57,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ static void gld${EMULATION_NAME}_before_parse PARAMS ((void)); static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **)); static void gld${EMULATION_NAME}_after_open PARAMS ((void)); +static char * choose_target PARAMS ((int, char **)); static void gld${EMULATION_NAME}_before_allocation PARAMS ((void)); static void gld${EMULATION_NAME}_read_file PARAMS ((const char *, boolean)); static void gld${EMULATION_NAME}_free PARAMS ((PTR)); @@ -114,6 +115,15 @@ static struct export_symbol_list *export_symbols; /* Maintains the 32 or 64 bit mode state of import file */ static unsigned int symbol_mode = 0x04; +/* Which symbol modes are valid */ +static unsigned int symbol_mode_mask = 0x0d; + +/* Whether this is a 64 bit link */ +static int is_64bit = 0; + +/* Which syscalls from import file are valid */ +static unsigned int syscall_mask = 0x77; + /* This routine is called before anything else is done. */ static void @@ -174,15 +184,12 @@ gld${EMULATION_NAME}_parse_args (argc, argv) OPTION_PD, OPTION_PT, OPTION_STRCMPCT, - OPTION_UNIX + OPTION_UNIX, + OPTION_32, + OPTION_64, }; /* - b64 is an empty option. The native linker uses -b64 for xcoff64 support - Our linker uses -m aixppc64 for xcoff64 support. The choice for the - correct emulation is done in collect2.c via the environmental varible - LDEMULATION. - binitfini has special handling in the linker backend. The native linker uses the arguemnts to generate a table of init and fini functions for the executable. The important use for this option is to support aix 4.2+ @@ -268,7 +275,8 @@ gld${EMULATION_NAME}_parse_args (argc, argv) {"bso", no_argument, NULL, OPTION_AUTOIMP}, {"bstrcmpct", no_argument, NULL, OPTION_STRCMPCT}, {"btextro", no_argument, &textro, 1}, - {"b64", no_argument, NULL, 0}, + {"b32", no_argument, NULL, OPTION_32}, + {"b64", no_argument, NULL, OPTION_64}, {"static", no_argument, NULL, OPTION_NOAUTOIMP}, {"unix", no_argument, NULL, OPTION_UNIX}, {NULL, no_argument, NULL, 0} @@ -530,6 +538,19 @@ gld${EMULATION_NAME}_parse_args (argc, argv) case OPTION_UNIX: unix_ld = true; break; + + case OPTION_32: + is_64bit = 0; + syscall_mask = 0x77; + symbol_mode_mask = 0x0d; + break; + + case OPTION_64: + is_64bit = 1; + syscall_mask = 0xcc; + symbol_mode_mask = 0x0e; + break; + } return 1; @@ -807,6 +828,42 @@ gld${EMULATION_NAME}_before_allocation () } } +static char * +choose_target (argc, argv) + int argc; + char **argv; +{ + int i, j, jmax; + static char *from_outside; + static char *from_inside; + static char *argv_to_target[][2] = + { + NULL, "aixcoff-rs6000", + "-b32", "aixcoff-rs6000", + "-b64", "aixcoff64-rs6000", + }; + + jmax = 3; + + from_outside = getenv (TARGET_ENVIRON); + if (from_outside != (char *)NULL) + return from_outside; + + /* Set to default. */ + from_inside = argv_to_target[0][1]; + for (i = 1; i < argc; i++) + { + for (j = 1; j < jmax; j++) + { + if (0 == strcmp (argv[i], argv_to_target[j][0])) + from_inside = argv_to_target[j][1]; + } + } + + return from_inside; +} + + static int change_symbol_mode (char *input) { /* @@ -875,7 +932,7 @@ static int is_syscall(char *input, unsigned int *flag) } if (0 == strcmp(input, string)) { - if (1 << bit & ${SYSCALL_MASK}) { + if (1 << bit & syscall_mask) { *flag = s[bit].flag; return 1; } else { @@ -1035,7 +1092,7 @@ gld${EMULATION_NAME}_read_file (filename, import) continue; } - if (symbol_mode & ${SYMBOL_MODE_MASK}) + if (symbol_mode & symbol_mode_mask) { /* This is a symbol to be imported or exported. */ symname = s; @@ -1278,7 +1335,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = gld${EMULATION_NAME}_after_open, after_allocation_default, set_output_arch_default, - ldemul_default_target, + choose_target, gld${EMULATION_NAME}_before_allocation, gld${EMULATION_NAME}_get_script, "${EMULATION_NAME}", diff --git a/ld/emultempl/gld960.em b/ld/emultempl/gld960.em index c61a0619c8b..88cfbcc77e8 100644 --- a/ld/emultempl/gld960.em +++ b/ld/emultempl/gld960.em @@ -40,7 +40,7 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307 #include "ldemul.h" static void gld960_before_parse PARAMS ((void)); -static char *gld960_choose_target PARAMS ((void)); +static char *gld960_choose_target PARAMS ((int, char **)); static void gld960_set_output_arch PARAMS ((void)); static char *gld960_get_script PARAMS ((int *)); @@ -90,7 +90,9 @@ gld960_set_output_arch() } static char * -gld960_choose_target() +gld960_choose_target (argc, argv) + int argc ATTRIBUTE_UNUSED; + char **argv ATTRIBUTE_UNUSED; { #ifdef GNU960 diff --git a/ld/emultempl/gld960c.em b/ld/emultempl/gld960c.em index 2fdabe900c2..0772bcad603 100644 --- a/ld/emultempl/gld960c.em +++ b/ld/emultempl/gld960c.em @@ -43,7 +43,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA static void gld960_before_parse PARAMS ((void)); static void gld960_set_output_arch PARAMS ((void)); -static char *gld960_choose_target PARAMS ((void)); +static char *gld960_choose_target PARAMS ((int, char **)); static char *gld960_get_script PARAMS ((int *)); #ifdef GNU960 @@ -105,7 +105,9 @@ gld960_set_output_arch() } static char * -gld960_choose_target() +gld960_choose_target (argc, argv) + int argc ATTRIBUTE_UNUSED; + char **argv ATTRIBUTE_UNUSED; { #ifdef GNU960 diff --git a/ld/ldemul.c b/ld/ldemul.c index 44c8c3e7bdd..6b96204183e 100644 --- a/ld/ldemul.c +++ b/ld/ldemul.c @@ -169,15 +169,20 @@ ldemul_recognized_file (entry) } char * -ldemul_choose_target () +ldemul_choose_target (argc, argv) + int argc; + char **argv; { - return ld_emulation->choose_target (); + return ld_emulation->choose_target (argc, argv); } + /* The default choose_target function. */ char * -ldemul_default_target () +ldemul_default_target (argc, argv) + int argc ATTRIBUTE_UNUSED; + char **argv ATTRIBUTE_UNUSED; { char *from_outside = getenv (TARGET_ENVIRON); if (from_outside != (char *) NULL) diff --git a/ld/ldemul.h b/ld/ldemul.h index 423a9d95527..c49961c15cf 100644 --- a/ld/ldemul.h +++ b/ld/ldemul.h @@ -25,7 +25,7 @@ extern void ldemul_after_open PARAMS ((void)); extern void ldemul_after_allocation PARAMS ((void)); extern void ldemul_before_allocation PARAMS ((void)); extern void ldemul_set_output_arch PARAMS ((void)); -extern char *ldemul_choose_target PARAMS ((void)); +extern char *ldemul_choose_target PARAMS ((int, char**)); extern void ldemul_choose_mode PARAMS ((char *)); extern void ldemul_list_emulations PARAMS ((FILE *)); extern void ldemul_list_emulation_options PARAMS ((FILE *)); @@ -43,7 +43,7 @@ extern boolean ldemul_recognized_file extern boolean ldemul_open_dynamic_archive PARAMS ((const char *, struct search_dirs *, struct lang_input_statement_struct *)); -extern char *ldemul_default_target PARAMS ((void)); +extern char *ldemul_default_target PARAMS ((int, char**)); extern void after_parse_default PARAMS ((void)); extern void after_open_default PARAMS ((void)); extern void after_allocation_default PARAMS ((void)); @@ -78,7 +78,7 @@ typedef struct ld_emulation_xfer_struct { void (*set_output_arch) PARAMS ((void)); /* Decide which target name to use. */ - char * (*choose_target) PARAMS ((void)); + char * (*choose_target) PARAMS ((int, char**)); /* Run before allocating output sections. */ void (*before_allocation) PARAMS ((void)); diff --git a/ld/ldmain.c b/ld/ldmain.c index 462e16af7de..eacc7391534 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -267,7 +267,7 @@ main (argc, argv) emulation = get_emulation (argc, argv); ldemul_choose_mode (emulation); - default_target = ldemul_choose_target (); + default_target = ldemul_choose_target (argc, argv); lang_init (); ldemul_before_parse (); lang_has_input_file = false; diff --git a/ld/scripttempl/aix.sc b/ld/scripttempl/aix.sc index 207decdd47f..ce67f651054 100644 --- a/ld/scripttempl/aix.sc +++ b/ld/scripttempl/aix.sc @@ -2,8 +2,8 @@ # AIX always uses shared libraries. The section VMA appears to be # unimportant. The native linker aligns the sections on boundaries # specified by the -H option. + cat <