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]

elf32 support for IA64



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"

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