This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

patch, ldemul_choose_target, AIX -b64 support


This patch changes ldemul_choose_target and the AIX linker.

ldemul_choose_target has been extended to pass command line arguments.

The reason for this change is to fix the Aix linker so that it now
handles -b64 and -b32.   These flags in the native linker determine if a
64 or 32 bit xcoff is going to be produced.   The existing *_parse
routines are called too late to set the bfd target correctly.

It appears that only the i960's actually use this routine and the patch
updates them.
Did I miss one?

With handling -b64 in the eaixppc.c,  the existing 64bit emulation
aixppc64 is redundant and has been removed.

This has been tested on aix4.3.3
Build breakage has been tested on native Sparc Solaris and  X86 Linux.
Cross breakage tested on Solaris x i960-coff and Linux x i960-coff.

Tom

--
Tom Rix
GCC Engineer
trix@redhat.com


2001-12-02  Tom Rix  <trix@redhat.com>

	* ldemul.c (ldemul_choose_target): New parameters argc, argv.
	(ldemul_default_target): Same.
	* configure.tgt : Remove eaixppc64 emulations.
	* Makefile.in : Remove eaixppc64.c 
	* 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.

Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/ld/Makefile.in,v
retrieving revision 1.83
diff -c -p -r1.83 Makefile.in
*** Makefile.in	2001/11/22 18:49:12	1.83
--- Makefile.in	2001/12/03 16:41:36
*************** ALL_64_EMULATIONS = \
*** 380,386 ****
  	emmo.o \
  	eelf64ppc.o \
  	eelf64lppc.o \
- 	eaixppc64.o \
  	ehppa64linux.o
  
  
--- 380,385 ----
*************** stringify.sed: ${srcdir}/emultempl/$(STR
*** 1055,1063 ****
  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)"
--- 1054,1059 ----
Index: configure.tgt
===================================================================
RCS file: /cvs/src/src/ld/configure.tgt,v
retrieving revision 1.68
diff -c -p -r1.68 configure.tgt
*** configure.tgt	2001/11/04 19:06:38	1.68
--- configure.tgt	2001/12/03 16:41:36
*************** powerpc-*-netware*)	targ_emul=ppcnw ;;
*** 377,387 ****
  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-*-beos*)	targ_emul=aixppc ;;
  rs6000-*-aix*)		targ_emul=aixrs6 ;;
  tic30-*-*aout*)		targ_emul=tic30aout ;;
--- 377,383 ----
  powerpcle-*-pe)         targ_emul=ppcpe ;;
  powerpcle-*-winnt*)     targ_emul=ppcpe ;;
  powerpcle-*-cygwin*)    targ_emul=ppcpe ;;
! powerpc-*-aix*)		targ_emul=aixppc ;;
  powerpc-*-beos*)	targ_emul=aixppc ;;
  rs6000-*-aix*)		targ_emul=aixrs6 ;;
  tic30-*-*aout*)		targ_emul=tic30aout ;;
Index: ldemul.c
===================================================================
RCS file: /cvs/src/src/ld/ldemul.c,v
retrieving revision 1.7
diff -c -p -r1.7 ldemul.c
*** ldemul.c	2001/03/13 06:14:27	1.7
--- ldemul.c	2001/12/03 16:41:36
*************** ldemul_recognized_file (entry)
*** 169,183 ****
  }
  
  char *
! ldemul_choose_target ()
  {
!   return ld_emulation->choose_target ();
  }
  
  /* The default choose_target function.  */
  
  char *
! ldemul_default_target ()
  {
    char *from_outside = getenv (TARGET_ENVIRON);
    if (from_outside != (char *) NULL)
--- 169,188 ----
  }
  
  char *
! ldemul_choose_target(argc, argv)
!       int argc;
!       char **argv;
  {
!   return ld_emulation->choose_target(argc, argv);
  }
  
+ 
  /* The default choose_target function.  */
  
  char *
! 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: ldemul.h
===================================================================
RCS file: /cvs/src/src/ld/ldemul.h,v
retrieving revision 1.6
diff -c -p -r1.6 ldemul.h
*** ldemul.h	2001/03/13 06:14:27	1.6
--- ldemul.h	2001/12/03 16:41:36
*************** extern void ldemul_after_open PARAMS ((v
*** 25,31 ****
  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 void ldemul_choose_mode PARAMS ((char *));
  extern void ldemul_list_emulations PARAMS ((FILE *));
  extern void ldemul_list_emulation_options PARAMS ((FILE *));
--- 25,31 ----
  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 ((int, char**));
  extern void ldemul_choose_mode PARAMS ((char *));
  extern void ldemul_list_emulations PARAMS ((FILE *));
  extern void ldemul_list_emulation_options PARAMS ((FILE *));
*************** extern boolean ldemul_recognized_file
*** 43,49 ****
  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 void after_parse_default PARAMS ((void));
  extern void after_open_default PARAMS ((void));
  extern void after_allocation_default PARAMS ((void));
--- 43,49 ----
  extern boolean ldemul_open_dynamic_archive
    PARAMS ((const char *, struct search_dirs *,
  	   struct lang_input_statement_struct *));
! 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));
*************** typedef struct ld_emulation_xfer_struct 
*** 78,84 ****
    void   (*set_output_arch) PARAMS ((void));
  
    /* Decide which target name to use.  */
!   char * (*choose_target) PARAMS ((void));
  
    /* Run before allocating output sections.  */
    void   (*before_allocation) PARAMS ((void));
--- 78,84 ----
    void   (*set_output_arch) PARAMS ((void));
  
    /* Decide which target name to use.  */
!   char * (*choose_target) PARAMS ((int, char**));
  
    /* Run before allocating output sections.  */
    void   (*before_allocation) PARAMS ((void));
Index: ldmain.c
===================================================================
RCS file: /cvs/src/src/ld/ldmain.c,v
retrieving revision 1.37
diff -c -p -r1.37 ldmain.c
*** ldmain.c	2001/10/20 13:49:00	1.37
--- ldmain.c	2001/12/03 16:41:36
*************** main (argc, argv)
*** 267,273 ****
  
    emulation = get_emulation (argc, argv);
    ldemul_choose_mode (emulation);
!   default_target = ldemul_choose_target ();
    lang_init ();
    ldemul_before_parse ();
    lang_has_input_file = false;
--- 267,273 ----
  
    emulation = get_emulation (argc, argv);
    ldemul_choose_mode (emulation);
!   default_target = ldemul_choose_target (argc, argv);
    lang_init ();
    ldemul_before_parse ();
    lang_has_input_file = false;
Index: emultempl/aix.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/aix.em,v
retrieving revision 1.15
diff -c -p -r1.15 aix.em
*** aix.em	2001/09/19 05:33:35	1.15
--- aix.em	2001/12/03 16:41:36
*************** Foundation, Inc., 59 Temple Place - Suit
*** 57,62 ****
--- 57,63 ----
  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));
*************** static struct export_symbol_list *export
*** 114,119 ****
--- 115,129 ----
  /* 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
*************** gld${EMULATION_NAME}_parse_args (argc, a
*** 174,188 ****
      OPTION_PD,
      OPTION_PT,
      OPTION_STRCMPCT,
!     OPTION_UNIX
    };
  
    /*
-     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+
--- 184,195 ----
      OPTION_PD,
      OPTION_PT,
      OPTION_STRCMPCT,
!     OPTION_UNIX,
!     OPTION_32,
!     OPTION_64,
    };
  
    /*
      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+
*************** gld${EMULATION_NAME}_parse_args (argc, a
*** 268,274 ****
      {"bso", no_argument, NULL, OPTION_AUTOIMP},
      {"bstrcmpct", no_argument, NULL, OPTION_STRCMPCT},
      {"btextro", no_argument, &textro, 1},
!     {"b64", no_argument, NULL, 0},
      {"static", no_argument, NULL, OPTION_NOAUTOIMP},
      {"unix", no_argument, NULL, OPTION_UNIX},
      {NULL, no_argument, NULL, 0}
--- 275,282 ----
      {"bso", no_argument, NULL, OPTION_AUTOIMP},
      {"bstrcmpct", no_argument, NULL, OPTION_STRCMPCT},
      {"btextro", no_argument, &textro, 1},
!     {"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}
*************** gld${EMULATION_NAME}_parse_args (argc, a
*** 530,535 ****
--- 538,556 ----
      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;
*************** gld${EMULATION_NAME}_before_allocation (
*** 807,812 ****
--- 828,875 ----
      }
  }
  
+ 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",
+ #ifdef _AIX43
+       "-b32", "aixcoff-rs6000",
+       "-b64", "aixcoff64-rs6000",
+ #endif
+     };
+ 
+   jmax = 1;
+ #ifdef _AIX43
+   jmax = 3;
+ #endif
+   
+ 
+   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)
  {
    /*
*************** static int is_syscall(char *input, unsig
*** 875,881 ****
      }
  
      if (0 == strcmp(input, string)) {
!       if (1 << bit & ${SYSCALL_MASK}) {
  	*flag = s[bit].flag;
  	return 1;
        } else {
--- 938,944 ----
      }
  
      if (0 == strcmp(input, string)) {
!       if (1 << bit & syscall_mask) {
  	*flag = s[bit].flag;
  	return 1;
        } else {
*************** gld${EMULATION_NAME}_read_file (filename
*** 1035,1041 ****
  	  continue;
  	}
  
!       if (symbol_mode & ${SYMBOL_MODE_MASK})
  	{
  	  /* This is a symbol to be imported or exported.  */
  	  symname = s;
--- 1098,1104 ----
  	  continue;
  	}
  
!       if (symbol_mode & symbol_mode_mask)
  	{
  	  /* This is a symbol to be imported or exported.  */
  	  symname = s;
*************** struct ld_emulation_xfer_struct ld_${EMU
*** 1278,1284 ****
    gld${EMULATION_NAME}_after_open,
    after_allocation_default,
    set_output_arch_default,
!   ldemul_default_target,
    gld${EMULATION_NAME}_before_allocation,
    gld${EMULATION_NAME}_get_script,
    "${EMULATION_NAME}",
--- 1341,1347 ----
    gld${EMULATION_NAME}_after_open,
    after_allocation_default,
    set_output_arch_default,
!   choose_target,
    gld${EMULATION_NAME}_before_allocation,
    gld${EMULATION_NAME}_get_script,
    "${EMULATION_NAME}",
Index: emultempl/gld960.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/gld960.em,v
retrieving revision 1.7
diff -c -p -r1.7 gld960.em
*** gld960.em	2001/09/03 06:43:36	1.7
--- gld960.em	2001/12/03 16:41:36
*************** the Free Software Foundation, 59 Temple 
*** 40,46 ****
  #include "ldemul.h"
  
  static void gld960_before_parse PARAMS ((void));
! static char *gld960_choose_target PARAMS ((void));
  static void gld960_set_output_arch PARAMS ((void));
  static char *gld960_get_script PARAMS ((int *));
  
--- 40,46 ----
  #include "ldemul.h"
  
  static void gld960_before_parse 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 *));
  
*************** gld960_set_output_arch()
*** 90,96 ****
  }
  
  static char *
! gld960_choose_target()
  {
  #ifdef GNU960
  
--- 90,98 ----
  }
  
  static char *
! gld960_choose_target(argc, argv)
!      int argc ATTRIBUTE_UNUSED;
!      char **argv ATTRIBUTE_UNUSED;
  {
  #ifdef GNU960
  
Index: emultempl/gld960c.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/gld960c.em,v
retrieving revision 1.8
diff -c -p -r1.8 gld960c.em
*** gld960c.em	2001/09/19 05:33:35	1.8
--- gld960c.em	2001/12/03 16:41:36
*************** Software Foundation, 59 Temple Place - S
*** 43,49 ****
  
  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_get_script PARAMS ((int *));
  
  #ifdef GNU960
--- 43,49 ----
  
  static void gld960_before_parse PARAMS ((void));
  static void gld960_set_output_arch PARAMS ((void));
! static char *gld960_choose_target PARAMS ((int, char **));
  static char *gld960_get_script PARAMS ((int *));
  
  #ifdef GNU960
*************** gld960_set_output_arch()
*** 105,111 ****
  }
  
  static char *
! gld960_choose_target()
  {
  #ifdef GNU960
  
--- 105,113 ----
  }
  
  static char *
! gld960_choose_target(argc, argv)
!      int argc ATTRIBUTE_UNUSED;
!      char **argv ATTRIBUTE_UNUSED;
  {
  #ifdef GNU960
  
Index: scripttempl/aix.sc
===================================================================
RCS file: /cvs/src/src/ld/scripttempl/aix.sc,v
retrieving revision 1.2
diff -c -p -r1.2 aix.sc
*** aix.sc	2001/05/24 20:59:23	1.2
--- aix.sc	2001/12/03 16:41:36
***************
*** 2,9 ****
  # 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)
--- 2,9 ----
  # 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_ARCH(${ARCH})
  ${RELOCATING+${LIB_SEARCH_DIRS}}
  ENTRY(__start)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]