+2003-04-30 H.J. Lu <hjl@gnu.org>
+
+ * config/tc-ia64.c (ia64_number_to_chars): New function pointer.
+ (ia64_float_to_chars): Likewise.
+ (dot_byteorder): Set target_big_endian, ia64_number_to_chars
+ and ia64_float_to_chars by tc_segment_info_data.endian from
+ the current segment if byteorder == -1.
+ (md_begin): Call dot_byteorder to set target_big_endian.
+ (md_atof): Call ia64_float_to_chars to convert floating point.
+ (ia64_float_to_chars_bigendian): New function.
+ (ia64_float_to_chars_littleendian): Likewise.
+ (ia64_elf_section_change_hook): Likewise.
+
+ * config/tc-ia64.h (ia64_number_to_chars): New.
+ (md_number_to_chars): Changed to (*ia64_number_to_chars)
+ (ia64_elf_section_change_hook): New.
+ (md_elf_section_change_hook): Defined.
+ (ia64_segment_info_type): New struct.
+ (TC_SEGMENT_INFO_TYPE): Defined.
+
2003-04-30 H.J. Lu <hjl@gnu.org>
* config/tc-ia64.c (md_section_align): Deleted.
extern int target_big_endian;
+void (*ia64_number_to_chars) PARAMS ((char *, valueT, int));
+
+static void ia64_float_to_chars_bigendian
+ PARAMS ((char *, LITTLENUM_TYPE *, int));
+static void ia64_float_to_chars_littleendian
+ PARAMS ((char *, LITTLENUM_TYPE *, int));
+static void (*ia64_float_to_chars)
+ PARAMS ((char *, LITTLENUM_TYPE *, int));
+
/* Characters which always start a comment. */
const char comment_chars[] = "";
dot_byteorder (byteorder)
int byteorder;
{
- target_big_endian = byteorder;
+ segment_info_type *seginfo = seg_info (now_seg);
+
+ if (byteorder == -1)
+ {
+ if (seginfo->tc_segment_info_data.endian == 0)
+ seginfo->tc_segment_info_data.endian
+ = TARGET_BYTES_BIG_ENDIAN ? 1 : 2;
+ byteorder = seginfo->tc_segment_info_data.endian == 1;
+ }
+ else
+ seginfo->tc_segment_info_data.endian = byteorder ? 1 : 2;
+
+ if (target_big_endian != byteorder)
+ {
+ target_big_endian = byteorder;
+ if (target_big_endian)
+ {
+ ia64_number_to_chars = number_to_chars_bigendian;
+ ia64_float_to_chars = ia64_float_to_chars_bigendian;
+ }
+ else
+ {
+ ia64_number_to_chars = number_to_chars_littleendian;
+ ia64_float_to_chars = ia64_float_to_chars_littleendian;
+ }
+ }
}
static void
bfd_set_section_alignment (stdoutput, text_section, 4);
- target_big_endian = TARGET_BYTES_BIG_ENDIAN;
+ /* Make sure fucntion pointers get initialized. */
+ target_big_endian = -1;
+ dot_byteorder (TARGET_BYTES_BIG_ENDIAN);
+
pseudo_func[FUNC_DTP_MODULE].u.sym =
symbol_new (".<dtpmod>", undefined_section, FUNC_DTP_MODULE,
&zero_address_frag);
int *size;
{
LITTLENUM_TYPE words[MAX_LITTLENUMS];
- LITTLENUM_TYPE *word;
char *t;
int prec;
t = atof_ieee (input_line_pointer, type, words);
if (t)
input_line_pointer = t;
- *size = prec * sizeof (LITTLENUM_TYPE);
- for (word = words + prec - 1; prec--;)
- {
- md_number_to_chars (lit, (long) (*word--), sizeof (LITTLENUM_TYPE));
- lit += sizeof (LITTLENUM_TYPE);
- }
+ (*ia64_float_to_chars) (lit, words, prec);
+
if (type == 'X')
{
/* It is 10 byte floating point with 6 byte padding. */
- memset (lit, 0, 6);
+ memset (&lit [10], 0, 6);
*size = 8 * sizeof (LITTLENUM_TYPE);
}
+ else
+ *size = prec * sizeof (LITTLENUM_TYPE);
+
return 0;
}
memcpy (p, (target_big_endian ? be_nop : le_nop), 16);
fragp->fr_var = 16;
}
+
+static void
+ia64_float_to_chars_bigendian (char *lit, LITTLENUM_TYPE *words,
+ int prec)
+{
+ while (prec--)
+ {
+ number_to_chars_bigendian (lit, (long) (*words++),
+ sizeof (LITTLENUM_TYPE));
+ lit += sizeof (LITTLENUM_TYPE);
+ }
+}
+
+static void
+ia64_float_to_chars_littleendian (char *lit, LITTLENUM_TYPE *words,
+ int prec)
+{
+ while (prec--)
+ {
+ number_to_chars_littleendian (lit, (long) (words[prec]),
+ sizeof (LITTLENUM_TYPE));
+ lit += sizeof (LITTLENUM_TYPE);
+ }
+}
+
+void
+ia64_elf_section_change_hook (void)
+{
+ dot_byteorder (-1);
+}
/* 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
#define MD_FLAGS_DEFAULT EF_IA_64_BE
#else
-#define md_number_to_chars number_to_chars_littleendian
#define TARGET_BYTES_BIG_ENDIAN 0
#define MD_FLAGS_DEFAULT EF_IA_64_ABI64
#endif /* TE_HPUX */
+extern void (*ia64_number_to_chars) PARAMS ((char *, valueT, int));
+#define md_number_to_chars (*ia64_number_to_chars)
+
+extern void ia64_elf_section_change_hook PARAMS ((void));
+#define md_elf_section_change_hook ia64_elf_section_change_hook
+
+/* We record the endian for this section. 0 means default, 1 means
+ big endian and 2 means little endian. */
+struct ia64_segment_info_type
+{
+ unsigned int endian : 2;
+};
+
+#define TC_SEGMENT_INFO_TYPE struct ia64_segment_info_type
+
/* 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
+2003-04-30 H.J. Lu <hjl@gnu.org>
+
+ * gas/ia64/ia64.exp: Add order.
+
+ * gas/ia64/order.s: New file.
+ * gas/ia64/order.d: Likewise.
+
2003-04-29 H.J. Lu <hjl@gnu.org>
* gas/ia64/ia64.exp: Add align.
run_dump_test "real"
run_dump_test "align"
+ run_dump_test "order"
}
--- /dev/null
+#objdump: -j .foo -j .bar -rs
+#name: ia64 byte order
+
+.*: +file format .*
+
+RELOCATION RECORDS FOR \[.foo\]:
+OFFSET TYPE VALUE
+0000000000000008 DIR64MSB foo
+0000000000000018 DIR64MSB foo
+0000000000000028 DIR64LSB foo
+0000000000000038 DIR64LSB foo
+
+
+RELOCATION RECORDS FOR \[.bar\]:
+OFFSET TYPE VALUE
+0000000000000010 DIR64LSB foo
+0000000000000040 DIR64LSB foo
+0000000000000058 DIR64MSB foo
+0000000000000080 DIR64MSB foo
+
+
+Contents of section .foo:
+ 0000 12340000 12345678 00000000 00000000 ................
+ 0010 01234567 89abcdef 00000000 00000000 ................
+ 0020 34120000 78563412 00000000 00000000 ................
+ 0030 efcdab89 67452301 00000000 00000000 ................
+Contents of section .bar:
+ 0000 cdcccc3d 00000000 9a999999 9999c93f ................
+ 0010 00000000 00000000 00000000 00000000 ................
+ 0020 cdcccccc cccccccc fd3f0000 00000000 ................
+ 0030 cdcccccc cccccccc fe3f0000 00000000 ................
+ 0040 00000000 00000000 3dcccccd 00000000 ................
+ 0050 3fc99999 9999999a 00000000 00000000 ................
+ 0060 3ffdcccc cccccccc cccd0000 00000000 ................
+ 0070 3ffecccc cccccccc cccd0000 00000000 ................
+ 0080 00000000 00000000 ........
--- /dev/null
+ .global foo#
+ .section .foo,"aw","progbits"
+ .msb
+ data2 0x1234
+ data4 0x12345678
+ data8 foo#
+ .section .bar,"aw","progbits"
+ .lsb
+ real4 0.1
+ real8 0.2
+ data8 foo#
+ .section .foo,"aw","progbits"
+ data8 0x123456789abcdef
+// data16 0x123456789abcdef
+ data8 foo#
+ .section .bar,"aw","progbits"
+ real10 0.4
+ real16 0.8
+ data8 foo#
+ .section .foo,"aw","progbits"
+ .lsb
+ data2 0x1234
+ data4 0x12345678
+ data8 foo#
+ .section .bar,"aw","progbits"
+ .msb
+ real4 0.1
+ real8 0.2
+ data8 foo#
+ .section .foo,"aw","progbits"
+ data8 0x123456789abcdef
+// data16 0x123456789abcdef
+ data8 foo#
+ .section .bar,"aw","progbits"
+ real10 0.4
+ real16 0.8
+ data8 foo#