elf32 support for IA64

Steve Ellcey sje@cup.hp.com
Mon Oct 30 10:09:00 GMT 2000


This is my final set of changes for elf32 support for IA64.  It has
changes to the gas part of binutils and includes one new file,
gas/config/te-hpux.h.  I have included that as a diff from an empty
file.

Steve Ellcey
sje@cup.hp.com


*** src.orig/gas/ChangeLog	Mon Oct 30 09:47:22 2000
--- src/gas/ChangeLog	Mon Oct 30 09:46:41 2000
***************
*** 1,3 ****
--- 1,21 ----
+ Mon Oct 30 08:19:10 PST 2000  Steve Ellcey <sje@cup.hp.com>
+ 
+         * tc-ia64.c: (md_shortopts, md_parse_option, md_show_usage)
+         Change M to m for -milp32 or -mlp64 to match gcc.
+         (dot_endp) Modify various calls to change args based on
+         elf32 vs. elf64.
+         (emit_one_bundle) use number_to_chars_littleendian instead of
+         md_number_to_chars because instructions are always little endian
+         but data is either/or as determined by md_number_to_chars.
+         (ia64_hpux_init) New routine to get called before md_parse_option.
+         (ia64_target_format) New routine to get called by TARGET_FORMAT macro.
+         (md_begin) Set little-endian/big-endian as appropriate.
+         (fix_insn) Same as emit_one_bundle.
+         * tc-ia64.h: (TARGET_BYTES_BIG_ENDIAN, TARGET_FORMAT,
+         md_number_to_chars)  Macros that get set based on TE_HPUX macro.
+         * te-hpux.h: New file with macros that get set when building for HP-UX.
+         * configure.in: Add "ia64-*-hpux*" target to configure.
+ 
  2000-10-25  Nick Clifton  <nickc@redhat.com>
  
  	* dwarf2out.c (dwarf2_generate_asm_lineno): New function: Generate
*** src.orig/gas/configure.in	Fri Oct 27 10:02:26 2000
--- src/gas/configure.in	Fri Oct 27 15:22:45 2000
***************
*** 284,289 ****
--- 284,290 ----
  
        ia64-*-elf*)	    fmt=elf ;;
        ia64-*-linux-gnu*)    fmt=elf em=linux ;;
+       ia64-*-hpux*)	    fmt=elf em=hpux ;;
  
        m32r-*-*)		    fmt=elf bfd_gas=yes ;;
  
*** src.orig/gas/config/tc-ia64.c	Fri Oct 27 10:02:48 2000
--- src/gas/config/tc-ia64.c	Mon Oct 30 08:16:49 2000
***************
*** 156,162 ****
  
  /* ia64-specific option processing:  */
  
! const char *md_shortopts = "M:N:x::";
  
  struct option md_longopts[] =
    {
--- 156,162 ----
  
  /* ia64-specific option processing:  */
  
! const char *md_shortopts = "m:N:x::";
  
  struct option md_longopts[] =
    {
***************
*** 3578,3583 ****
--- 3578,3584 ----
  {
    expressionS e;
    unsigned char *ptr;
+   int bytes_per_address;
    long where;
    segT saved_seg;
    subsegT saved_subseg;
***************
*** 3602,3607 ****
--- 3603,3609 ----
    set_section ((char *) special_section_name[SPECIAL_SECTION_UNWIND]);
    ptr = frag_more (24);
    where = frag_now_fix () - 24;
+   bytes_per_address = bfd_arch_bits_per_address (stdoutput) / 8;
  
    /* Issue the values of  a) Proc Begin,  b) Proc End,  c) Unwind Record.  */
    e.X_op = O_pseudo_fixup;
***************
*** 3608,3620 ****
    e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
    e.X_add_number = 0;
    e.X_add_symbol = unwind.proc_start;
!   ia64_cons_fix_new (frag_now, where, 8, &e);
  
    e.X_op = O_pseudo_fixup;
    e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
    e.X_add_number = 0;
    e.X_add_symbol = unwind.proc_end;
!   ia64_cons_fix_new (frag_now, where + 8, 8, &e);
  
    if (unwind.info != 0)
      {
--- 3610,3622 ----
    e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
    e.X_add_number = 0;
    e.X_add_symbol = unwind.proc_start;
!   ia64_cons_fix_new (frag_now, where, bytes_per_address, &e);
  
    e.X_op = O_pseudo_fixup;
    e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
    e.X_add_number = 0;
    e.X_add_symbol = unwind.proc_end;
!   ia64_cons_fix_new (frag_now, where + bytes_per_address, bytes_per_address, &e);
  
    if (unwind.info != 0)
      {
***************
*** 3622,3631 ****
        e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
        e.X_add_number = 0;
        e.X_add_symbol = unwind.info;
!       ia64_cons_fix_new (frag_now, where + 16, 8, &e);
      }
    else
!     md_number_to_chars (ptr + 16, 0, 8);
  
    subseg_set (saved_seg, saved_subseg);
    unwind.proc_start = unwind.proc_end = unwind.info = 0;
--- 3624,3633 ----
        e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
        e.X_add_number = 0;
        e.X_add_symbol = unwind.info;
!       ia64_cons_fix_new (frag_now, where + (bytes_per_address * 2), bytes_per_address, &e);
      }
    else
!     md_number_to_chars (ptr + (bytes_per_address * 2), 0, bytes_per_address);
  
    subseg_set (saved_seg, saved_subseg);
    unwind.proc_start = unwind.proc_end = unwind.info = 0;
***************
*** 5546,5553 ****
    t0 = end_of_insn_group | (template << 1) | (insn[0] << 5) | (insn[1] << 46);
    t1 = ((insn[1] >> 18) & 0x7fffff) | (insn[2] << 23);
  
!   md_number_to_chars (f + 0, t0, 8);
!   md_number_to_chars (f + 8, t1, 8);
  }
  
  int
--- 5548,5555 ----
    t0 = end_of_insn_group | (template << 1) | (insn[0] << 5) | (insn[1] << 46);
    t1 = ((insn[1] >> 18) & 0x7fffff) | (insn[2] << 23);
  
!   number_to_chars_littleendian (f + 0, t0, 8);
!   number_to_chars_littleendian (f + 8, t1, 8);
  }
  
  int
***************
*** 5558,5564 ****
    switch (c)
      {
      /* Switches from the Intel assembler.  */
!     case 'M':
        if (strcmp (arg, "ilp64") == 0
  	  || strcmp (arg, "lp64") == 0
  	  || strcmp (arg, "p64") == 0)
--- 5560,5566 ----
    switch (c)
      {
      /* Switches from the Intel assembler.  */
!     case 'm':
        if (strcmp (arg, "ilp64") == 0
  	  || strcmp (arg, "lp64") == 0
  	  || strcmp (arg, "p64") == 0)
***************
*** 5672,5679 ****
  {
    fputs (_("\
  IA-64 options:\n\
!   -Milp32|-Milp64|-Mlp64|-Mp64	select data model (default -Mlp64)\n\
!   -Mle | -Mbe		  select little- or big-endian byte order (default -Mle)\n\
    -x | -xexplicit	  turn on dependency violation checking (default)\n\
    -xauto		  automagically remove dependency violations\n\
    -xdebug		  debug dependency violation checker\n"),
--- 5674,5681 ----
  {
    fputs (_("\
  IA-64 options:\n\
!   -milp32|-milp64|-mlp64|-mp64	select data model (default -Mlp64)\n\
!   -mle | -mbe		  select little- or big-endian byte order (default -Mle)\n\
    -x | -xexplicit	  turn on dependency violation checking (default)\n\
    -xauto		  automagically remove dependency violations\n\
    -xdebug		  debug dependency violation checker\n"),
***************
*** 5724,5730 ****
  void
  md_begin ()
  {
!   int i, j, k, t, total, ar_base, cr_base, goodness, best, regnum;
    const char *err;
    char name[8];
  
--- 5726,5732 ----
  void
  md_begin ()
  {
!   int i, j, k, t, total, ar_base, cr_base, goodness, best, regnum, ok;
    const char *err;
    char name[8];
  
***************
*** 5733,5739 ****
  
    bfd_set_section_alignment (stdoutput, text_section, 4);
  
!   target_big_endian = 0;
    pseudo_func[FUNC_FPTR_RELATIVE].u.sym =
      symbol_new (".<fptr>", undefined_section, FUNC_FPTR_RELATIVE,
  		&zero_address_frag);
--- 5735,5741 ----
  
    bfd_set_section_alignment (stdoutput, text_section, 4);
  
!   target_big_endian = TARGET_BYTES_BIG_ENDIAN;
    pseudo_func[FUNC_FPTR_RELATIVE].u.sym =
      symbol_new (".<fptr>", undefined_section, FUNC_FPTR_RELATIVE,
  		&zero_address_frag);
***************
*** 5932,5940 ****
--- 5934,5953 ----
  		  name, err);
      }
  
+ #ifdef TE_HPUX
+   if (md.flags & EF_IA_64_ABI64) {
+      ok = bfd_set_arch_mach (stdoutput, bfd_arch_ia64, bfd_mach_ia64_elf64);
+   }
+   else {
+      ok = bfd_set_arch_mach (stdoutput, bfd_arch_ia64, bfd_mach_ia64_elf32);
+   }
+   if (! ok)
+      as_warn (_("Could not set architecture and machine"));
+ #else
    /* Default to 64-bit mode.  */
    /* ??? This overrides the -M options, but they aren't working anyways.  */
    md.flags |= EF_IA_64_ABI64;
+ #endif /* TE_HPUX */
  
    md.mem_offset.hint = 0;
    md.path = 0;
***************
*** 5942,5947 ****
--- 5955,5989 ----
    md.entry_labels = NULL;
  }
  
+ #ifdef TE_HPUX
+ 
+ /* Set the elf type to 64 bit ABI by default on HP-UX.  Cannot
+    do this in md_begin because that is called after md_parse_option
+    which is where we do the dynamic changing of md.flags based
+    on -mlp64 or -milp32.  */
+ 
+ ia64_hpux_init(argc, argv)
+         int argc;
+         char **argv;
+ {
+         md.flags = EF_IA_64_ABI64;
+         md.flags |= EF_IA_64_BE;
+ }
+ 
+ const char *
+ ia64_target_format ()
+ {
+         if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
+                 if (md.flags & EF_IA_64_ABI64)
+                         return "elf64-ia64-big";
+                 else
+                         return "elf32-ia64-big";
+         else
+                 return "unknown-format";
+ }
+ #endif /* TE_HPUX */
+ 
+ 
  void
  ia64_end_of_source ()
  {
***************
*** 9270,9277 ****
  
    t0 = control_bits | (insn[0] << 5) | (insn[1] << 46);
    t1 = ((insn[1] >> 18) & 0x7fffff) | (insn[2] << 23);
!   md_number_to_chars (fixpos + 0, t0, 8);
!   md_number_to_chars (fixpos + 8, t1, 8);
  }
  
  /* Attempt to simplify or even eliminate a fixup.  The return value is
--- 9312,9319 ----
  
    t0 = control_bits | (insn[0] << 5) | (insn[1] << 46);
    t1 = ((insn[1] >> 18) & 0x7fffff) | (insn[2] << 23);
!   number_to_chars_littleendian (fixpos + 0, t0, 8);
!   number_to_chars_littleendian (fixpos + 8, t1, 8);
  }
  
  /* Attempt to simplify or even eliminate a fixup.  The return value is
*** src.orig/gas/config/tc-ia64.h	Fri Oct 27 10:02:48 2000
--- src/gas/config/tc-ia64.h	Fri Oct 27 15:31:40 2000
***************
*** 24,37 ****
  
  #define TC_IA64
  
  #define TARGET_FORMAT (OUTPUT_FLAVOR == bfd_target_elf_flavour		\
  		       ? "elf64-ia64-little"				\
  		       : "unknown-format")
  
  #define TARGET_ARCH			bfd_arch_ia64
- #define TARGET_BYTES_BIG_ENDIAN		0
  #define DOUBLESLASH_LINE_COMMENTS	/* allow //-style comments */
- #define md_number_to_chars		number_to_chars_littleendian
  #define TC_HANDLES_FX_DONE
  
  #define NEED_LITERAL_POOL		/* need gp literal pool */
--- 24,56 ----
  
  #define TC_IA64
  
+ #ifdef TE_HPUX
+ #define TARGET_FORMAT ia64_target_format()
+ extern const char * ia64_target_format PARAMS ((void));
+ #define md_number_to_chars              number_to_chars_bigendian
+ #define TARGET_BYTES_BIG_ENDIAN         1
+ 
+ /* We need to set the default object file format in ia64_hpux_init and
+    not in md_begin because parse_args is called before md_begin and we
+    do not want md_begin to wipe out the flag settings set by options
+    parsed in md_parse_args but we do want some defaults set somewhere.
+ */
+ 
+ #define HOST_SPECIAL_INIT ia64_hpux_init
+ 
+ #else
+ 
  #define TARGET_FORMAT (OUTPUT_FLAVOR == bfd_target_elf_flavour		\
  		       ? "elf64-ia64-little"				\
  		       : "unknown-format")
+ #define md_number_to_chars		number_to_chars_littleendian
+ #define TARGET_BYTES_BIG_ENDIAN		0
  
+ #endif /* TE_HPUX */
+ 
+ 
  #define TARGET_ARCH			bfd_arch_ia64
  #define DOUBLESLASH_LINE_COMMENTS	/* allow //-style comments */
  #define TC_HANDLES_FX_DONE
  
  #define NEED_LITERAL_POOL		/* need gp literal pool */
*** src.orig/gas/config/te-hpux.h	Mon Oct 30 09:47:31 2000
--- src/gas/config/te-hpux.h	Fri Oct 27 15:32:12 2000
***************
*** 0 ****
--- 1,4 ----
+ #define TE_HPUX
+ #define LOCAL_LABELS_FB 1
+ 
+ #include "obj-format.h"


More information about the Binutils mailing list