aboutsummaryrefslogtreecommitdiff
path: root/gas/config
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2006-01-11 17:39:50 +0000
committerNick Clifton <nickc@redhat.com>2006-01-11 17:39:50 +0000
commit8ad7c533ee497f2c6a16cde705a565fcb97dfd12 (patch)
tree4f07010b3a8fe3d453dd641837800058e2cd2c4f /gas/config
parent5cd1580898b80c549ab78626bb55e912d5eea214 (diff)
downloadgdb-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.c22
-rw-r--r--gas/config/tc-frv.c8
-rw-r--r--gas/config/tc-i370.c4
-rw-r--r--gas/config/tc-mn10200.c17
-rw-r--r--gas/config/tc-mn10300.c19
-rw-r--r--gas/config/tc-tic54x.c6
-rw-r--r--gas/config/tc-v850.c48
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);
}