Pass argc and argv to ldemul_choose_target.
authorTom Rix <trix@redhat.com>
Mon, 3 Dec 2001 23:15:28 +0000 (23:15 +0000)
committerTom Rix <trix@redhat.com>
Mon, 3 Dec 2001 23:15:28 +0000 (23:15 +0000)
Support -b64 in AIX

ld/ChangeLog
ld/Makefile.in
ld/configure.tgt
ld/emultempl/aix.em
ld/emultempl/gld960.em
ld/emultempl/gld960c.em
ld/ldemul.c
ld/ldemul.h
ld/ldmain.c
ld/scripttempl/aix.sc

index a07f056794556e315cbf8df235df5dec85fb5a74..c123de2090d0853e37b4ae91ab3e2809ee9b862e 100644 (file)
@@ -1,3 +1,18 @@
+2001-12-02  Tom Rix  <trix@redhat.com>
+       * 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 <hjl@gnu.org>
 
        * emulparams/elf_i386.sh (NO_SMALL_DATA): Set to yes.
index 95d2c4cd35f7c63fff4c3389a50dd71cb18bd638..1231eb75c0a311aff3761f9b20eae31d56bd8a59 100644 (file)
@@ -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)"
index 63d2fb7fe54574fb9db40583936b37a694d78b1a..a66f77a15b8a88ec60416b3d9aac86f1ad96c671 100644 (file)
@@ -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 ;;
index eb01b66ad579228849727728eefedf94631c768c..989e5b28435884dc7e3a3cdd6da4529acb6a1d9c 100644 (file)
@@ -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}",
index c61a0619c8b63f29d2099fee34c93f36d9f2f957..88cfbcc77e888b67f4064fa0407ea38305f8ddca 100644 (file)
@@ -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
 
index 2fdabe900c2bea57e149a9f4047ef428760de934..0772bcad6034304a733f05addc6d2d6d6f3f7692 100644 (file)
@@ -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
 
index 44c8c3e7bddbf48a378f7ce98414c7671138ad75..6b96204183e372b1ef714bae13c072d6c95b5189 100644 (file)
@@ -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)
index 423a9d9552763b6bed2cdd614ed82d3fcbe93169..c49961c15cfd071e38d6fe97dddff5743df75617 100644 (file)
@@ -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));
index 462e16af7deab132b2247ba69bf0d5927cffa8a2..eacc7391534cc4991bc15c40df6715de31400ce9 100644 (file)
@@ -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;
index 207decdd47f96d7f0d6f282934dd82bfb14d2216..ce67f6510549388090bfc3c530cbe46ba469b618 100644 (file)
@@ -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 <<EOF
-OUTPUT_FORMAT("${OUTPUT_FORMAT}")
 OUTPUT_ARCH(${ARCH})
 ${RELOCATING+${LIB_SEARCH_DIRS}}
 ENTRY(__start)