diff options
author | Nick Clifton <nickc@redhat.com> | 2006-01-11 17:39:50 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2006-01-11 17:39:50 +0000 |
commit | 8ad7c533ee497f2c6a16cde705a565fcb97dfd12 (patch) | |
tree | 4f07010b3a8fe3d453dd641837800058e2cd2c4f /gas/config | |
parent | 5cd1580898b80c549ab78626bb55e912d5eea214 (diff) | |
download | gdb-8ad7c533ee497f2c6a16cde705a565fcb97dfd12.zip gdb-8ad7c533ee497f2c6a16cde705a565fcb97dfd12.tar.gz gdb-8ad7c533ee497f2c6a16cde705a565fcb97dfd12.tar.bz2 |
Fixes for building on 64-bit hosts:
* config/tc-avr.c (mod_index): New union to allow conversion
between pointers and integers.
(md_begin, avr_ldi_expression): Use it.
* config/tc-i370.c (md_assemble): Add cast for argument to print
statement.
* config/tc-tic54x.c (subsym_substitute): Likewise.
* config/tc-mn10200.c (md_assemble): Use a union to convert the
opindex field of fr_cgen structure into a pointer so that it can
be stored in a frag.
* config/tc-mn10300.c (md_assemble): Likewise.
* config/tc-frv.c (frv_debug_tomcat): Use %p to print pointer
types.
* config/tc-v850.c: Replace uses of (int) casts with correct
types.
* gas/tic54x/address.d: Work with 64bit hosts.
* gas/tic54x/addrfar.d: Likewise.
* gas/tic54x/align.d: Likewise.
* gas/tic54x/all-opcodes.d: Likewise.
* gas/tic54x/asg.d: Likewise.
* gas/tic54x/cons.d: Likewise.
* gas/tic54x/consfar.d: Likewise.
* gas/tic54x/extaddr.d: Likewise.
* gas/tic54x/field.d: Likewise.
* gas/tic54x/labels.d: Likewise.
* gas/tic54x/loop.d: Likewise.
* gas/tic54x/lp.d: Likewise.
* gas/tic54x/macro.d: Likewise.
* gas/tic54x/math.d: Likewise.
* gas/tic54x/opcodes.d: Likewise.
* gas/tic54x/sections.d: Likewise.
* gas/tic54x/set.d: Likewise.
* gas/tic54x/struct.d: Likewise.
* gas/tic54x/subsym.d: Likewise.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-avr.c | 22 | ||||
-rw-r--r-- | gas/config/tc-frv.c | 8 | ||||
-rw-r--r-- | gas/config/tc-i370.c | 4 | ||||
-rw-r--r-- | gas/config/tc-mn10200.c | 17 | ||||
-rw-r--r-- | gas/config/tc-mn10300.c | 19 | ||||
-rw-r--r-- | gas/config/tc-tic54x.c | 6 | ||||
-rw-r--r-- | gas/config/tc-v850.c | 48 |
7 files changed, 98 insertions, 26 deletions
diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c index 74cc6c3..2ceaa1f 100644 --- a/gas/config/tc-avr.c +++ b/gas/config/tc-avr.c @@ -1,6 +1,6 @@ /* tc-avr.c -- Assembler code for the ATMEL AVR - Copyright 1999, 2000, 2001, 2002, 2004, 2005 + Copyright 1999, 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc. Contributed by Denis Chertykov <denisc@overta.ru> @@ -174,6 +174,14 @@ static struct exp_mod_s exp_mod[] = {"hhi8", -BFD_RELOC_AVR_HI8_LDI, -BFD_RELOC_AVR_HI8_LDI_NEG, 0}, }; +/* A union used to store indicies into the exp_mod[] array + in a hash table which expects void * data types. */ +typedef union +{ + void * ptr; + int index; +} mod_index; + /* Opcode hash table. */ static struct hash_control *avr_hash; @@ -426,7 +434,12 @@ md_begin (void) avr_mod_hash = hash_new (); for (i = 0; i < ARRAY_SIZE (exp_mod); ++i) - hash_insert (avr_mod_hash, EXP_MOD_NAME (i), (void *) (i + 10)); + { + mod_index m; + + m.index = i + 10; + hash_insert (avr_mod_hash, EXP_MOD_NAME (i), m.ptr); + } bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach); } @@ -509,7 +522,10 @@ avr_ldi_expression (expressionS *exp) if (op[0]) { - mod = (int) hash_find (avr_mod_hash, op); + mod_index m; + + m.ptr = hash_find (avr_mod_hash, op); + mod = m.index; if (mod) { diff --git a/gas/config/tc-frv.c b/gas/config/tc-frv.c index f177194..a2f4cce 100644 --- a/gas/config/tc-frv.c +++ b/gas/config/tc-frv.c @@ -1,5 +1,5 @@ /* tc-frv.c -- Assembler for the Fujitsu FRV. - Copyright 2002, 2003, 2004, 2005 Free Software Foundation. + Copyright 2002, 2003, 2004, 2005, 2006 Free Software Foundation. This file is part of GAS, the GNU Assembler. @@ -648,11 +648,11 @@ frv_debug_tomcat (start_chain) for (this_insn = this_chain->insn_list; this_insn; this_insn = this_insn->next) { if (this_insn->type == VLIW_LABEL_TYPE) - fprintf (stderr, "Label Value: %d\n", (int) this_insn->sym); + fprintf (stderr, "Label Value: %p\n", this_insn->sym); else if (this_insn->type == VLIW_BRANCH_TYPE) - fprintf (stderr, "%s to %d\n", this_insn->insn->base->name, (int) this_insn->sym); + fprintf (stderr, "%s to %p\n", this_insn->insn->base->name, this_insn->sym); else if (this_insn->type == VLIW_BRANCH_HAS_NOPS) - fprintf (stderr, "nop'd %s to %d\n", this_insn->insn->base->name, (int) this_insn->sym); + fprintf (stderr, "nop'd %s to %p\n", this_insn->insn->base->name, this_insn->sym); else if (this_insn->type == VLIW_NOP_TYPE) fprintf (stderr, "Nop\n"); else diff --git a/gas/config/tc-i370.c b/gas/config/tc-i370.c index de67ce3..d87d2d9 100644 --- a/gas/config/tc-i370.c +++ b/gas/config/tc-i370.c @@ -1,7 +1,7 @@ /* tc-i370.c -- Assembler for the IBM 360/370/390 instruction set. Loosely based on the ppc files by Linas Vepstas <linas@linas.org> 1998, 99 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005 Free Software Foundation, Inc. + 2004, 2005, 2006 Free Software Foundation, Inc. Written by Ian Lance Taylor, Cygnus Support. This file is part of GAS, the GNU Assembler. @@ -2102,7 +2102,7 @@ md_assemble (char *str) if (! register_name (&ex)) as_bad ("expecting a register for operand %d", - opindex_ptr - opcode->operands + 1); + (int) (opindex_ptr - opcode->operands + 1)); } /* Check for an address constant expression. */ diff --git a/gas/config/tc-mn10200.c b/gas/config/tc-mn10200.c index 44fd210..909652e 100644 --- a/gas/config/tc-mn10200.c +++ b/gas/config/tc-mn10200.c @@ -1,6 +1,6 @@ /* tc-mn10200.c -- Assembler code for the Matsushita 10200 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005 Free Software Foundation, Inc. + 2005, 2006 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -1191,6 +1191,18 @@ keep_going: /* Write out the instruction. */ if (relaxable && fc > 0) { + /* On a 64-bit host the size of an 'int' is not the same + as the size of a pointer, so we need a union to convert + the opindex field of the fr_cgen structure into a char * + so that it can be stored in the frag. We do not have + to worry about loosing accuracy as we are not going to + be even close to the 32bit limit of the int. */ + union + { + int opindex; + char * ptr; + } + opindex_converter; int type; /* bCC */ @@ -1218,10 +1230,11 @@ keep_going: else type = 3; + opindex_converter.opindex = fixups[0].opindex; f = frag_var (rs_machine_dependent, 8, 8 - size, type, fixups[0].exp.X_add_symbol, fixups[0].exp.X_add_number, - (char *)fixups[0].opindex); + opindex_converter.ptr); number_to_chars_bigendian (f, insn, size); if (8 - size > 4) { diff --git a/gas/config/tc-mn10300.c b/gas/config/tc-mn10300.c index 963b1b6..102c2ea 100644 --- a/gas/config/tc-mn10300.c +++ b/gas/config/tc-mn10300.c @@ -1,6 +1,6 @@ /* tc-mn10300.c -- Assembler code for the Matsushita 10300 - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 - Free Software Foundation, Inc. + Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, + 2006 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -2005,6 +2005,18 @@ keep_going: if (relaxable && fc > 0) { + /* On a 64-bit host the size of an 'int' is not the same + as the size of a pointer, so we need a union to convert + the opindex field of the fr_cgen structure into a char * + so that it can be stored in the frag. We do not have + to worry about loosing accuracy as we are not going to + be even close to the 32bit limit of the int. */ + union + { + int opindex; + char * ptr; + } + opindex_converter; int type; /* We want to anchor the line info to the previous frag (if @@ -2044,10 +2056,11 @@ keep_going: else type = 3; + opindex_converter.opindex = fixups[0].opindex; f = frag_var (rs_machine_dependent, 8, 8 - size, type, fixups[0].exp.X_add_symbol, fixups[0].exp.X_add_number, - (char *)fixups[0].opindex); + opindex_converter.ptr); /* This is pretty hokey. We basically just care about the opcode, so we have to write out the first word big endian. diff --git a/gas/config/tc-tic54x.c b/gas/config/tc-tic54x.c index b81041f..f84afcd 100644 --- a/gas/config/tc-tic54x.c +++ b/gas/config/tc-tic54x.c @@ -1,5 +1,5 @@ /* tc-tic54x.c -- Assembly code for the Texas Instruments TMS320C54X - Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 + Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Contributed by Timothy Wall (twall@cygnus.com) @@ -4985,7 +4985,7 @@ subsym_substitute (line, forced) if (beg < 1) { as_bad (_("Invalid subscript (use 1 to %d)"), - strlen (value)); + (int) strlen (value)); break; } if (*input_line_pointer == ',') @@ -4995,7 +4995,7 @@ subsym_substitute (line, forced) if (beg + len > strlen (value)) { as_bad (_("Invalid length (use 0 to %d"), - strlen (value) - beg); + (int) strlen (value) - beg); break; } } diff --git a/gas/config/tc-v850.c b/gas/config/tc-v850.c index 1358e95..7984956 100644 --- a/gas/config/tc-v850.c +++ b/gas/config/tc-v850.c @@ -1,6 +1,6 @@ /* tc-v850.c -- Assembler code for the NEC V850 - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 - Free Software Foundation, Inc. + Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, + 2006 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -1221,13 +1221,29 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, fragS *fragP) { + /* This code performs some nasty type punning between the + fr_opcode field of the frag structure (a char *) and the + fx_r_type field of the fix structure (a bfd_reloc_code_real_type) + On a 64bit host this causes problems because these two fields + are not the same size, but since we know that we are only + ever storing small integers in the fields, it is safe to use + a union to convert between them. */ + union u + { + bfd_reloc_code_real_type fx_r_type; + char * fr_opcode; + } + opcode_converter; subseg_change (sec, 0); + opcode_converter.fr_opcode = fragP->fr_opcode; + /* In range conditional or unconditional branch. */ if (fragP->fr_subtype == 0 || fragP->fr_subtype == 2) { fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, - fragP->fr_offset, 1, BFD_RELOC_UNUSED + (int)fragP->fr_opcode); + fragP->fr_offset, 1, + BFD_RELOC_UNUSED + opcode_converter.fx_r_type); fragP->fr_fix += 2; } /* Out of range conditional branch. Emit a branch around a jump. */ @@ -1249,8 +1265,8 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, target. */ md_number_to_chars ((char *) buffer + 2, 0x00000780, 4); fix_new (fragP, fragP->fr_fix + 2, 4, fragP->fr_symbol, - fragP->fr_offset, 1, BFD_RELOC_UNUSED + - (int) fragP->fr_opcode + 1); + fragP->fr_offset, 1, + BFD_RELOC_UNUSED + opcode_converter.fx_r_type + 1); fragP->fr_fix += 6; } /* Out of range unconditional branch. Emit a jump. */ @@ -1258,8 +1274,8 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, { md_number_to_chars (fragP->fr_fix + fragP->fr_literal, 0x00000780, 4); fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, - fragP->fr_offset, 1, BFD_RELOC_UNUSED + - (int) fragP->fr_opcode + 1); + fragP->fr_offset, 1, + BFD_RELOC_UNUSED + opcode_converter.fx_r_type + 1); fragP->fr_fix += 4; } else @@ -2036,6 +2052,20 @@ md_assemble (char *str) if (relaxable && fc > 0) { + /* On a 64-bit host the size of an 'int' is not the same + as the size of a pointer, so we need a union to convert + the opindex field of the fr_cgen structure into a char * + so that it can be stored in the frag. We do not have + to worry about loosing accuracy as we are not going to + be even close to the 32bit limit of the int. */ + union + { + int opindex; + char * ptr; + } + opindex_converter; + + opindex_converter.opindex = fixups[0].opindex; insn_size = 2; fc = 0; @@ -2044,7 +2074,7 @@ md_assemble (char *str) f = frag_var (rs_machine_dependent, 4, 2, 2, fixups[0].exp.X_add_symbol, fixups[0].exp.X_add_number, - (char *) fixups[0].opindex); + opindex_converter.ptr); md_number_to_chars (f, insn, insn_size); md_number_to_chars (f + 2, 0, 2); } @@ -2053,7 +2083,7 @@ md_assemble (char *str) f = frag_var (rs_machine_dependent, 6, 4, 0, fixups[0].exp.X_add_symbol, fixups[0].exp.X_add_number, - (char *) fixups[0].opindex); + opindex_converter.ptr); md_number_to_chars (f, insn, insn_size); md_number_to_chars (f + 2, 0, 4); } |