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