ia64-hpux patches from Steve Ellcey.

* config/tc-ia64.c (md_shortopts, md_parse_option, md_show_usage):
	Change M to m for -milp32 or -mlp64 to match gcc.
	(dot_endp): Use bytes_per_address instead of 8.
	(emit_one_bundle): Use number_to_chars_littleendian instead of
	md_number_to_chars.
	(fix_insn): Likewise.
	(ia64_init): New function.
	(ia64_target_format): New function.
	(md_begin): Set endianness, arch, and machine as appropriate.
	* config/tc-ia64.h: (TARGET_BYTES_BIG_ENDIAN, md_number_to_chars):
	Make these macros depend on TE_HPUX macro.
	(TARGET_FORMAT): Define.
	(HOST_SPECIAL_INIT): Define.
	* config/te-hpux.h: New file.
	* configure.in: Add "ia64-*-hpux*" target to configure.
	* configure: Regenerate.
This commit is contained in:
Jim Wilson 2000-11-07 01:21:10 +00:00
parent ef99799a42
commit 44f5c83ad3
6 changed files with 268 additions and 191 deletions

View File

@ -1,3 +1,22 @@
2000-11-06 Steve Ellcey <sje@cup.hp.com>
* config/tc-ia64.c (md_shortopts, md_parse_option, md_show_usage):
Change M to m for -milp32 or -mlp64 to match gcc.
(dot_endp): Use bytes_per_address instead of 8.
(emit_one_bundle): Use number_to_chars_littleendian instead of
md_number_to_chars.
(fix_insn): Likewise.
(ia64_init): New function.
(ia64_target_format): New function.
(md_begin): Set endianness, arch, and machine as appropriate.
* config/tc-ia64.h: (TARGET_BYTES_BIG_ENDIAN, md_number_to_chars):
Make these macros depend on TE_HPUX macro.
(TARGET_FORMAT): Define.
(HOST_SPECIAL_INIT): Define.
* config/te-hpux.h: New file.
* configure.in: Add "ia64-*-hpux*" target to configure.
* configure: Regenerate.
2000-11-06 Kazu Hirata <kazu@hxi.com>
* as.c: Fix formatting.

View File

@ -156,7 +156,7 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP";
/* ia64-specific option processing: */
const char *md_shortopts = "M:N:x::";
const char *md_shortopts = "m:N:x::";
struct option md_longopts[] =
{
@ -3588,6 +3588,7 @@ dot_endp (dummy)
{
expressionS e;
unsigned char *ptr;
int bytes_per_address;
long where;
segT saved_seg;
subsegT saved_subseg;
@ -3612,19 +3613,20 @@ dot_endp (dummy)
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;
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);
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 + 8, 8, &e);
ia64_cons_fix_new (frag_now, where + bytes_per_address, bytes_per_address, &e);
if (unwind.info != 0)
{
@ -3632,10 +3634,10 @@ dot_endp (dummy)
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);
ia64_cons_fix_new (frag_now, where + (bytes_per_address * 2), bytes_per_address, &e);
}
else
md_number_to_chars (ptr + 16, 0, 8);
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;
@ -5562,8 +5564,8 @@ emit_one_bundle ()
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);
number_to_chars_littleendian (f + 0, t0, 8);
number_to_chars_littleendian (f + 8, t1, 8);
}
int
@ -5574,7 +5576,7 @@ md_parse_option (c, arg)
switch (c)
{
/* Switches from the Intel assembler. */
case 'M':
case 'm':
if (strcmp (arg, "ilp64") == 0
|| strcmp (arg, "lp64") == 0
|| strcmp (arg, "p64") == 0)
@ -5688,8 +5690,8 @@ md_show_usage (stream)
{
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\
-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"),
@ -5740,7 +5742,7 @@ extra_goodness (int templ, int slot)
void
md_begin ()
{
int i, j, k, t, total, ar_base, cr_base, goodness, best, regnum;
int i, j, k, t, total, ar_base, cr_base, goodness, best, regnum, ok;
const char *err;
char name[8];
@ -5749,7 +5751,7 @@ md_begin ()
bfd_set_section_alignment (stdoutput, text_section, 4);
target_big_endian = 0;
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);
@ -5948,9 +5950,15 @@ md_begin ()
name, err);
}
/* Default to 64-bit mode. */
/* ??? This overrides the -M options, but they aren't working anyways. */
md.flags |= EF_IA_64_ABI64;
/* Set the architecture and machine depending on defaults and command line
options. */
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"));
md.mem_offset.hint = 0;
md.path = 0;
@ -5958,6 +5966,37 @@ md_begin ()
md.entry_labels = NULL;
}
/* Set the elf type to 64 bit ABI by default. 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. Also, set the
default endianness. */
void
ia64_init (argc, argv)
int argc;
char **argv;
{
md.flags = EF_IA_64_ABI64;
if (TARGET_BYTES_BIG_ENDIAN)
md.flags |= EF_IA_64_BE;
}
/* Return a string for the target object file format. */
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";
}
void
ia64_end_of_source ()
{
@ -9345,8 +9384,8 @@ fix_insn (fix, odesc, value)
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);
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

View File

@ -24,14 +24,27 @@
#define TC_IA64
#define TARGET_FORMAT (OUTPUT_FLAVOR == bfd_target_elf_flavour \
? "elf64-ia64-little" \
: "unknown-format")
/* Linux is little endian by default. HPUX is big endian by default. */
#ifdef TE_HPUX
#define md_number_to_chars number_to_chars_bigendian
#define TARGET_BYTES_BIG_ENDIAN 1
#else
#define md_number_to_chars number_to_chars_littleendian
#define TARGET_BYTES_BIG_ENDIAN 0
#endif /* TE_HPUX */
/* We need to set the default object file format in ia64_init and not in
md_begin. This is 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. */
#define HOST_SPECIAL_INIT ia64_init
#define TARGET_FORMAT ia64_target_format()
extern const char *ia64_target_format PARAMS ((void));
#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 */

4
gas/config/te-hpux.h Normal file
View File

@ -0,0 +1,4 @@
#define TE_HPUX
#define LOCAL_LABELS_FB 1
#include "obj-format.h"

339
gas/configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -285,6 +285,7 @@ changequote([,])dnl
ia64-*-elf*) fmt=elf ;;
ia64-*-linux-gnu*) fmt=elf em=linux ;;
ia64-*-hpux*) fmt=elf em=hpux ;;
m32r-*-*) fmt=elf bfd_gas=yes ;;