Fix bugs and remove compile time warnings for N"32K port.

This commit is contained in:
Nick Clifton 2002-07-31 16:23:29 +00:00
parent cd67d26656
commit 4eb6b71c65
7 changed files with 485 additions and 431 deletions

View File

@ -3,6 +3,22 @@
* elf32-i386.c (elf_i386_copy_indirect_symbol): Swap tls_type
if _bfd_elf_link_hash_copy_indirect will swap got.refcount.
2002-07-31 Ian Dall <ian@sibyl.beware.dropbear.id.au>
* cpu-ns32k.c (_bfd_ns32k_put_immdeiate, _bfd_ns32k_get_immediate):
There is no 8 byte relocation type for this architecture.
(do_ns32k_reloc): Use bfd_vma instead of native types.
(bfd_ns32k_put_immediate, _bfd_ns32k_relocate_contents) put_data
returns void.
(_bfd_ns32k_put_displacement): Don't check for overflow. We can
rely on generic code to do that.
* aout-ns32k.c (howto_table): Add appropriate overflow detection
to all table entries.
(_bfd_ns32k_relocate_contents): put_data returns void.
* ns32k.h: (_bfd_ns32k_put_displacement, _bfd_ns32k_put_immediate)
(_bfd_do_ns32k_reloc_contents): Fix prototypes. put data functions
return void.
2002-07-31 Ian Dall <ian@sibyl.beware.dropbear.id.au>
* aoutx.h (aout_link_check_ar_symbols): Whether to include an

View File

@ -1,23 +1,23 @@
/* BFD back-end for ns32k a.out-ish binaries.
Copyright 1990, 1991, 1992, 1994, 1995, 1996, 1998, 2000, 2001
Copyright 1990, 1991, 1992, 1994, 1995, 1996, 1998, 2000, 2001, 2002
Free Software Foundation, Inc.
Contributed by Ian Dall (idall@eleceng.adelaide.edu.au).
This file is part of BFD, the Binary File Descriptor library.
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#define BYTES_IN_WORD 4
@ -49,16 +49,16 @@ void bfd_ns32k_arch PARAMS ((void));
#define MY(OP) MYNS(OP)
#define MY_swap_std_reloc_in MY(swap_std_reloc_in)
#define MY_swap_std_reloc_in MY(swap_std_reloc_in)
#define MY_swap_std_reloc_out MY(swap_std_reloc_out)
static void
MY_swap_std_reloc_in PARAMS ((bfd *abfd, struct reloc_std_external *bytes,
arelent *cache_ptr, asymbol **symbols,
bfd_size_type symcount));
MY_swap_std_reloc_in PARAMS ((bfd *, struct reloc_std_external *,
arelent *, asymbol **,
bfd_size_type));
static void
MY_swap_std_reloc_out PARAMS ((bfd *abfd, arelent *g,
struct reloc_std_external *natptr));
MY_swap_std_reloc_out PARAMS ((bfd *, arelent *,
struct reloc_std_external *));
reloc_howto_type *
MY(reloc_howto) PARAMS ((bfd *, struct reloc_std_external *,
int *, int *, int *));
@ -94,47 +94,48 @@ MY(put_reloc) PARAMS ((bfd *, int, int, bfd_vma, reloc_howto_type *,
In addition, for historical reasons the encoding of the relocation types
in the a.out format relocation entries is such that even the relocation
methods which are standard are not encoded the standard way. */
methods which are standard are not encoded the standard way. */
reloc_howto_type MY(howto_table)[] =
{
/* type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask pcdone */
/* ns32k immediate operands. */
HOWTO (BFD_RELOC_NS32K_IMM_8, 0, 0, 8, false, 0, true,
HOWTO (BFD_RELOC_NS32K_IMM_8, 0, 0, 8, false, 0, complain_overflow_signed,
_bfd_ns32k_reloc_imm, "NS32K_IMM_8",
true, 0x000000ff,0x000000ff, false),
HOWTO (BFD_RELOC_NS32K_IMM_16, 0, 1, 16, false, 0, true,
HOWTO (BFD_RELOC_NS32K_IMM_16, 0, 1, 16, false, 0, complain_overflow_signed,
_bfd_ns32k_reloc_imm, "NS32K_IMM_16",
true, 0x0000ffff,0x0000ffff, false),
HOWTO (BFD_RELOC_NS32K_IMM_32, 0, 2, 32, false, 0, true,
HOWTO (BFD_RELOC_NS32K_IMM_32, 0, 2, 32, false, 0, complain_overflow_signed,
_bfd_ns32k_reloc_imm, "NS32K_IMM_32",
true, 0xffffffff,0xffffffff, false),
HOWTO (BFD_RELOC_NS32K_IMM_8_PCREL, 0, 0, 8, true, 0, false,
HOWTO (BFD_RELOC_NS32K_IMM_8_PCREL, 0, 0, 8, true, 0, complain_overflow_signed,
_bfd_ns32k_reloc_imm, "PCREL_NS32K_IMM_8",
true, 0x000000ff, 0x000000ff, false),
HOWTO (BFD_RELOC_NS32K_IMM_16_PCREL, 0, 1, 16, true, 0, false,
HOWTO (BFD_RELOC_NS32K_IMM_16_PCREL, 0, 1, 16, true, 0, complain_overflow_signed,
_bfd_ns32k_reloc_imm, "PCREL_NS32K_IMM_16",
true, 0x0000ffff,0x0000ffff, false),
HOWTO (BFD_RELOC_NS32K_IMM_32_PCREL, 0, 2, 32, true, 0, false,
HOWTO (BFD_RELOC_NS32K_IMM_32_PCREL, 0, 2, 32, true, 0, complain_overflow_signed,
_bfd_ns32k_reloc_imm, "PCREL_NS32K_IMM_32",
true, 0xffffffff,0xffffffff, false),
/* ns32k displacements. */
HOWTO (BFD_RELOC_NS32K_DISP_8, 0, 0, 8, false, 0, true,
HOWTO (BFD_RELOC_NS32K_DISP_8, 0, 0, 7, false, 0, complain_overflow_signed,
_bfd_ns32k_reloc_disp, "NS32K_DISP_8",
true, 0x000000ff,0x000000ff, false),
HOWTO (BFD_RELOC_NS32K_DISP_16, 0, 1, 16, false, 0, true,
HOWTO (BFD_RELOC_NS32K_DISP_16, 0, 1, 14, false, 0, complain_overflow_signed,
_bfd_ns32k_reloc_disp, "NS32K_DISP_16",
true, 0x0000ffff, 0x0000ffff, false),
HOWTO (BFD_RELOC_NS32K_DISP_32, 0, 2, 32, false, 0, true,
HOWTO (BFD_RELOC_NS32K_DISP_32, 0, 2, 30, false, 0, complain_overflow_signed,
_bfd_ns32k_reloc_disp, "NS32K_DISP_32",
true, 0xffffffff, 0xffffffff, false),
HOWTO (BFD_RELOC_NS32K_DISP_8_PCREL, 0, 0, 8, true, 0, false,
HOWTO (BFD_RELOC_NS32K_DISP_8_PCREL, 0, 0, 7, true, 0, complain_overflow_signed,
_bfd_ns32k_reloc_disp, "PCREL_NS32K_DISP_8",
true, 0x000000ff,0x000000ff, false),
HOWTO (BFD_RELOC_NS32K_DISP_16_PCREL, 0, 1, 16, true, 0, false,
HOWTO (BFD_RELOC_NS32K_DISP_16_PCREL, 0, 1, 14, true, 0, complain_overflow_signed,
_bfd_ns32k_reloc_disp, "PCREL_NS32K_DISP_16",
true, 0x0000ffff,0x0000ffff, false),
HOWTO (BFD_RELOC_NS32K_DISP_32_PCREL, 0, 2, 32, true, 0, false,
HOWTO (BFD_RELOC_NS32K_DISP_32_PCREL, 0, 2, 30, true, 0, complain_overflow_signed,
_bfd_ns32k_reloc_disp, "PCREL_NS32K_DISP_32",
true, 0xffffffff,0xffffffff, false),
@ -355,7 +356,7 @@ _bfd_ns32k_relocate_contents (howto, input_bfd, relocation, location)
{
int r_ns32k_type = (howto - MY(howto_table)) / 6;
bfd_vma (*get_data) PARAMS ((bfd_byte *, int));
int (*put_data) PARAMS ((bfd_vma, bfd_byte *, int));
void (*put_data) PARAMS ((bfd_vma, bfd_byte *, int));
switch (r_ns32k_type)
{

View File

@ -4,21 +4,21 @@
Almost totally rewritten by Ian Dall from initial work
by Andrew Cagney.
This file is part of BFD, the Binary File Descriptor library.
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "bfd.h"
#include "sysdep.h"
@ -30,7 +30,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
static const bfd_arch_info_type arch_info_struct[] =
{
N(32532,"ns32k:32532",true, 0), /* the word ns32k will match this too */
N(32532,"ns32k:32532",true, 0), /* The word ns32k will match this too. */
};
const bfd_arch_info_type bfd_ns32k_arch =
@ -40,7 +40,7 @@ static bfd_reloc_status_type do_ns32k_reloc
PARAMS ((bfd *, arelent *, struct symbol_cache_entry *, PTR, asection *,
bfd *, char **,
bfd_vma (*) (bfd_byte *, int),
int (*) (bfd_vma, bfd_byte *, int)));
void (*) (bfd_vma, bfd_byte *, int)));
bfd_vma
_bfd_ns32k_get_displacement (buffer, size)
@ -48,6 +48,7 @@ _bfd_ns32k_get_displacement (buffer, size)
int size;
{
bfd_signed_vma value;
switch (size)
{
case 1:
@ -70,10 +71,11 @@ _bfd_ns32k_get_displacement (buffer, size)
abort ();
return 0;
}
return value;
}
int
void
_bfd_ns32k_put_displacement (value, buffer, size)
bfd_vma value;
bfd_byte *buffer;
@ -82,15 +84,11 @@ _bfd_ns32k_put_displacement (value, buffer, size)
switch (size)
{
case 1:
if (value + 0x40 > 0x7f)
return -1;
value &= 0x7f;
*buffer++ = value;
break;
case 2:
if (value + 0x2000 > 0x3fff)
return -1;
value &= 0x3fff;
value |= 0x8000;
*buffer++ = (value >> 8);
@ -98,19 +96,14 @@ _bfd_ns32k_put_displacement (value, buffer, size)
break;
case 4:
/* FIXME: is this correct? -0x1f000000 <= value < 0x2000000 */
if (value + 0x1f000000 > 0x3effffff)
return -1;
value |= (bfd_vma) 0xc0000000;
*buffer++ = (value >> 24);
*buffer++ = (value >> 16);
*buffer++ = (value >> 8);
*buffer++ = value;
break;
default:
return -1;
}
return 0;
return;
}
bfd_vma
@ -119,13 +112,9 @@ _bfd_ns32k_get_immediate (buffer, size)
int size;
{
bfd_vma value = 0;
switch (size)
{
case 8:
value = (value << 8) | (*buffer++ & 0xff);
value = (value << 8) | (*buffer++ & 0xff);
value = (value << 8) | (*buffer++ & 0xff);
value = (value << 8) | (*buffer++ & 0xff);
case 4:
value = (value << 8) | (*buffer++ & 0xff);
value = (value << 8) | (*buffer++ & 0xff);
@ -133,11 +122,14 @@ _bfd_ns32k_get_immediate (buffer, size)
value = (value << 8) | (*buffer++ & 0xff);
case 1:
value = (value << 8) | (*buffer++ & 0xff);
break;
default:
abort ();
}
return value;
}
int
void
_bfd_ns32k_put_immediate (value, buffer, size)
bfd_vma value;
bfd_byte *buffer;
@ -146,11 +138,6 @@ _bfd_ns32k_put_immediate (value, buffer, size)
buffer += size - 1;
switch (size)
{
case 8:
*buffer-- = (value & 0xff); value >>= 8;
*buffer-- = (value & 0xff); value >>= 8;
*buffer-- = (value & 0xff); value >>= 8;
*buffer-- = (value & 0xff); value >>= 8;
case 4:
*buffer-- = (value & 0xff); value >>= 8;
*buffer-- = (value & 0xff); value >>= 8;
@ -159,14 +146,13 @@ _bfd_ns32k_put_immediate (value, buffer, size)
case 1:
*buffer-- = (value & 0xff); value >>= 8;
}
return 0;
}
/* This is just like the standard perform_relocation except we
* use get_data and put_data which know about the ns32k
* storage methods.
* This is probably a lot more complicated than it needs to be!
*/
use get_data and put_data which know about the ns32k storage
methods. This is probably a lot more complicated than it
needs to be! */
static bfd_reloc_status_type
do_ns32k_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
error_message, get_data, put_data)
@ -178,7 +164,7 @@ do_ns32k_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
bfd *output_bfd;
char **error_message ATTRIBUTE_UNUSED;
bfd_vma (*get_data) PARAMS ((bfd_byte *, int));
int (*put_data) PARAMS ((bfd_vma, bfd_byte *, int));
void (*put_data) PARAMS ((bfd_vma, bfd_byte *, int));
{
int overflow = 0;
bfd_vma relocation;
@ -262,7 +248,6 @@ do_ns32k_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
producing relocateable output it is not what the code
actually does. I don't want to change it, because it seems
far too likely that something will break. */
relocation -=
input_section->output_section->vma + input_section->output_offset;
@ -299,71 +284,76 @@ do_ns32k_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
relocation with -r. Removing the line below this comment
fixes that problem; see PR 2953.
However, Ian wrote the following, regarding removing the line below,
which explains why it is still enabled: --djm
However, Ian wrote the following, regarding removing the line
below, which explains why it is still enabled: --djm
If you put a patch like that into BFD you need to check all the COFF
linkers. I am fairly certain that patch will break coff-i386 (e.g.,
SCO); see coff_i386_reloc in coff-i386.c where I worked around the
problem in a different way. There may very well be a reason that the
code works as it does.
If you put a patch like that into BFD you need to check all
the COFF linkers. I am fairly certain that patch will break
coff-i386 (e.g., SCO); see coff_i386_reloc in coff-i386.c
where I worked around the problem in a different way. There
may very well be a reason that the code works as it does.
Hmmm. The first obvious point is that bfd_perform_relocation should
not have any tests that depend upon the flavour. It's seem like
entirely the wrong place for such a thing. The second obvious point
is that the current code ignores the reloc addend when producing
relocateable output for COFF. That's peculiar. In fact, I really
have no idea what the point of the line you want to remove is.
Hmmm. The first obvious point is that bfd_perform_relocation
should not have any tests that depend upon the flavour. It's
seem like entirely the wrong place for such a thing. The
second obvious point is that the current code ignores the
reloc addend when producing relocateable output for COFF.
That's peculiar. In fact, I really have no idea what the
point of the line you want to remove is.
A typical COFF reloc subtracts the old value of the symbol and adds in
the new value to the location in the object file (if it's a pc
relative reloc it adds the difference between the symbol value and the
location). When relocating we need to preserve that property.
A typical COFF reloc subtracts the old value of the symbol
and adds in the new value to the location in the object file
(if it's a pc relative reloc it adds the difference between
the symbol value and the location). When relocating we need
to preserve that property.
BFD handles this by setting the addend to the negative of the old
value of the symbol. Unfortunately it handles common symbols in a
non-standard way (it doesn't subtract the old value) but that's a
different story (we can't change it without losing backward
compatibility with old object files) (coff-i386 does subtract the old
value, to be compatible with existing coff-i386 targets, like SCO).
BFD handles this by setting the addend to the negative of the
old value of the symbol. Unfortunately it handles common
symbols in a non-standard way (it doesn't subtract the old
value) but that's a different story (we can't change it
without losing backward compatibility with old object files)
(coff-i386 does subtract the old value, to be compatible with
existing coff-i386 targets, like SCO).
So everything works fine when not producing relocateable output. When
we are producing relocateable output, logically we should do exactly
what we do when not producing relocateable output. Therefore, your
patch is correct. In fact, it should probably always just set
reloc_entry->addend to 0 for all cases, since it is, in fact, going to
add the value into the object file. This won't hurt the COFF code,
which doesn't use the addend; I'm not sure what it will do to other
formats (the thing to check for would be whether any formats both use
the addend and set partial_inplace).
So everything works fine when not producing relocateable
output. When we are producing relocateable output, logically
we should do exactly what we do when not producing
relocateable output. Therefore, your patch is correct. In
fact, it should probably always just set reloc_entry->addend
to 0 for all cases, since it is, in fact, going to add the
value into the object file. This won't hurt the COFF code,
which doesn't use the addend; I'm not sure what it will do
to other formats (the thing to check for would be whether
any formats both use the addend and set partial_inplace).
When I wanted to make coff-i386 produce relocateable output, I ran
into the problem that you are running into: I wanted to remove that
line. Rather than risk it, I made the coff-i386 relocs use a special
function; it's coff_i386_reloc in coff-i386.c. The function
specifically adds the addend field into the object file, knowing that
bfd_perform_relocation is not going to. If you remove that line, then
coff-i386.c will wind up adding the addend field in twice. It's
trivial to fix; it just needs to be done.
When I wanted to make coff-i386 produce relocateable output,
I ran into the problem that you are running into: I wanted
to remove that line. Rather than risk it, I made the
coff-i386 relocs use a special function; it's coff_i386_reloc
in coff-i386.c. The function specifically adds the addend
field into the object file, knowing that bfd_perform_relocation
is not going to. If you remove that line, then coff-i386.c
will wind up adding the addend field in twice. It's trivial
to fix; it just needs to be done.
The problem with removing the line is just that it may break some
working code. With BFD it's hard to be sure of anything. The right
way to deal with this is simply to build and test at least all the
supported COFF targets. It should be straightforward if time and disk
space consuming. For each target:
1) build the linker
2) generate some executable, and link it using -r (I would
probably use paranoia.o and link against newlib/libc.a, which
for all the supported targets would be available in
/usr/cygnus/progressive/H-host/target/lib/libc.a).
3) make the change to reloc.c
4) rebuild the linker
5) repeat step 2
6) if the resulting object files are the same, you have at least
made it no worse
7) if they are different you have to figure out which version is
right
*/
The problem with removing the line is just that it may break
some working code. With BFD it's hard to be sure of anything.
The right way to deal with this is simply to build and test at
least all the supported COFF targets. It should be
straightforward if time and disk space consuming. For each
target:
1) build the linker
2) generate some executable, and link it using -r (I would
probably use paranoia.o and link against newlib/libc.a,
which for all the supported targets would be available in
/usr/cygnus/progressive/H-host/target/lib/libc.a).
3) make the change to reloc.c
4) rebuild the linker
5) repeat step 2
6) if the resulting object files are the same, you have at
least made it no worse
7) if they are different you have to figure out which
version is right. */
relocation -= reloc_entry->addend;
#endif
reloc_entry->addend = 0;
@ -462,11 +452,9 @@ space consuming. For each target:
}
}
/*
Either we are relocating all the way, or we don't want to apply
the relocation to the reloc entry (probably because there isn't
any room in the output format to describe addends to relocs)
*/
/* Either we are relocating all the way, or we don't want to apply
the relocation to the reloc entry (probably because there isn't
any room in the output format to describe addends to relocs). */
/* The cast to bfd_vma avoids a bug in the Alpha OSF/1 C compiler
(OSF version 1.3, compiler version 3.11). It miscompiles the
@ -493,11 +481,10 @@ space consuming. For each target:
relocation >>= (bfd_vma) howto->rightshift;
/* Shift everything up to where it's going to be used */
/* Shift everything up to where it's going to be used. */
relocation <<= (bfd_vma) howto->bitpos;
/* Wait for the day when all have the mask in them */
/* Wait for the day when all have the mask in them. */
/* What we do:
i instruction to be left alone
@ -527,8 +514,7 @@ space consuming. For each target:
B B B B B
or A A A A A
-----------------------
R R R R R R R R R R put into bfd_put<size>
*/
R R R R R R R R R R put into bfd_put<size>. */
#define DOIT(x) \
x = ( (x & ~howto->dst_mask) | (((x & howto->src_mask) + relocation) & howto->dst_mask))
@ -538,39 +524,39 @@ space consuming. For each target:
{
case 0:
{
char x = get_data (location, 1);
bfd_vma x = get_data (location, 1);
DOIT (x);
overflow = put_data ((bfd_vma) x, location, 1);
put_data ((bfd_vma) x, location, 1);
}
break;
case 1:
if (relocation)
{
short x = get_data (location, 2);
bfd_vma x = get_data (location, 2);
DOIT (x);
overflow = put_data ((bfd_vma) x, location, 2);
put_data ((bfd_vma) x, location, 2);
}
break;
case 2:
if (relocation)
{
long x = get_data (location, 4);
bfd_vma x = get_data (location, 4);
DOIT (x);
overflow = put_data ((bfd_vma) x, location, 4);
put_data ((bfd_vma) x, location, 4);
}
break;
case -2:
{
long x = get_data (location, 4);
bfd_vma x = get_data (location, 4);
relocation = -relocation;
DOIT(x);
overflow = put_data ((bfd_vma) x, location, 4);
put_data ((bfd_vma) x, location, 4);
}
break;
case 3:
/* Do nothing */
/* Do nothing. */
break;
case 4:
@ -579,7 +565,7 @@ space consuming. For each target:
{
bfd_vma x = get_data (location, 8);
DOIT (x);
overflow = put_data (x, location, 8);
put_data (x, location, 8);
}
#else
abort ();
@ -604,7 +590,7 @@ _bfd_do_ns32k_reloc_contents (howto, input_bfd, relocation, location,
bfd_vma relocation;
bfd_byte *location;
bfd_vma (*get_data) PARAMS ((bfd_byte *, int));
int (*put_data) PARAMS ((bfd_vma, bfd_byte *, int));
void (*put_data) PARAMS ((bfd_vma, bfd_byte *, int));
{
int size;
bfd_vma x;

View File

@ -1,22 +1,22 @@
/* Header file for ns32k routines.
Copyright 1996, 2001 Free Software Foundation, Inc.
Copyright 1996, 2001, 2002 Free Software Foundation, Inc.
Written by Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
extern bfd_reloc_status_type _bfd_ns32k_relocate_contents
PARAMS ((reloc_howto_type *, bfd *, bfd_vma, bfd_byte *));
@ -24,7 +24,7 @@ extern bfd_reloc_status_type _bfd_ns32k_relocate_contents
extern bfd_reloc_status_type _bfd_do_ns32k_reloc_contents
PARAMS ((reloc_howto_type *, bfd *, bfd_vma, bfd_byte *,
bfd_vma (*) (bfd_byte *, int),
int (*) (bfd_vma, bfd_byte *, int)));
void (*) (bfd_vma, bfd_byte *, int)));
extern bfd_reloc_status_type _bfd_ns32k_final_link_relocate
PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *, bfd_vma,
@ -32,8 +32,8 @@ extern bfd_reloc_status_type _bfd_ns32k_final_link_relocate
extern bfd_vma _bfd_ns32k_get_displacement PARAMS ((bfd_byte *, int));
extern bfd_vma _bfd_ns32k_get_immediate PARAMS ((bfd_byte *, int));
extern int _bfd_ns32k_put_displacement PARAMS ((bfd_vma, bfd_byte *, int));
extern int _bfd_ns32k_put_immediate PARAMS ((bfd_vma, bfd_byte *, int));
extern void _bfd_ns32k_put_displacement PARAMS ((bfd_vma, bfd_byte *, int));
extern void _bfd_ns32k_put_immediate PARAMS ((bfd_vma, bfd_byte *, int));
extern bfd_reloc_status_type _bfd_ns32k_reloc_disp
PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));

View File

@ -1,3 +1,31 @@
2002-07-31 Ian Dall <ian@sibyl.beware.dropbear.id.au>
* config/tc-ns32k.h (md_pcrel_adjust): Supply prototype.
* config/tc-ns32k.c (convert_iif, md_parse_option, md_show_usage):
Allow default displacement size to be an option "--disp-size-default".
(md_number_to_disp): Make error messages include value. Use %d to
print integers, not %s.
(fix_new_ns32k): Conditionally set fx_no_overflow so we don't
get duplicate messages sometimes.
(convert_iif): Grow frag to max possible instruction size. Avoid
creating unnecessary fixes.
(md_number_to_field) Add prototype.
(encode_operand, parse, convert_iif, md_fix_pcrel_adjust): Add
prototypes and make static.
(struct addr_mode): Make mode and scaled_mode explicitly signed.
(evaluate_expr): Use resultP argument instead of exprP global.
(get_addr_mode): Quiten compiler warnings.
(encode_operand): eliminate unused variables. Quiten compiler
warnings. Eliminate nul character in format strings.
(parse): argc is unsigned.
(reloc): Type cast index to quieten compiler.
(md_pcrel_adjust, md_apply_fix3): Remove unused variable.
(md_convert_frag): Note unused parameters. Remove unused
variables.
(md_create_long_jump, md_create_short_jump,
md_undefined_symbol_name, md_section_align, tc_gen_reloc): Note
unused parameters.
2002-07-31 Nick Clifton <nickc@redhat.com>
* NEWS: Retroactively add entry for Lars Brinkhoff's contribution

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/* tc-ns32k.h -- Opcode table for National Semi 32k processor
Copyright 1987, 1992, 1993, 1994, 1995, 1997, 2000
Copyright 1987, 1992, 1993, 1994, 1995, 1997, 2000, 2002
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@ -24,6 +24,7 @@
#define TARGET_BYTES_BIG_ENDIAN 0
#define TC_PCREL_ADJUST(F) md_pcrel_adjust(F)
extern int md_pcrel_adjust PARAMS((fragS *fragP));
#ifdef BFD_ASSEMBLER
#define NO_RELOC BFD_RELOC_NONE
@ -62,35 +63,17 @@
#define ARG_LEN 50
#define TC_CONS_FIX_NEW cons_fix_new_ns32k
extern void fix_new_ns32k_exp PARAMS((fragS *frag,
int where,
int size,
expressionS *exp,
int pcrel,
int im_disp,
bit_fixS *bit_fixP, /* really bit_fixS */
int bsr,
fragS *opcode_frag,
unsigned int opcode_offset));
extern void fix_new_ns32k_exp PARAMS ((fragS *, int, int, expressionS *,
int, int, bit_fixS *, int, fragS *,
unsigned int));
extern void fix_new_ns32k PARAMS ((fragS *frag,
int where,
int size,
symbolS *add_symbol,
long offset,
int pcrel,
int im_disp,
bit_fixS *bit_fixP, /* really bit_fixS */
int bsr,
fragS *opcode_frag,
unsigned int opcode_offset));
extern void fix_new_ns32k PARAMS ((fragS *, int, int, symbolS *, long,
int, int, bit_fixS *, int, fragS *,
unsigned int));
extern void cons_fix_new_ns32k PARAMS ((fragS *frag,
int where,
int size,
expressionS *exp));
extern void cons_fix_new_ns32k PARAMS ((fragS *, int, int, expressionS *));
/* the NS32x32 has a non 0 nop instruction which should be used in aligns */
/* The NS32x32 has a non 0 nop instruction which should be used in aligns. */
#define NOP_OPCODE 0xa2
#define md_operand(x)
@ -99,33 +82,34 @@ extern const struct relax_type md_relax_table[];
#define TC_GENERIC_RELAX_TABLE md_relax_table
#define TC_FRAG_TYPE \
struct { \
fragS *fr_opcode_fragP; \
unsigned int fr_opcode_offset; \
char fr_bsr; \
}
struct \
{ \
fragS * fr_opcode_fragP; \
unsigned int fr_opcode_offset; \
char fr_bsr; \
}
#define TC_FRAG_INIT(X) \
do \
{ \
frag_opcode_frag (X) = NULL; \
frag_opcode_offset (X) = 0; \
frag_bsr (X) = 0; \
frag_bsr (X) = 0; \
} \
while (0)
/* Accessor macros for things which may move around */
/* Accessor macros for things which may move around. */
#define frag_opcode_frag(X) (X)->tc_frag_data.fr_opcode_fragP
#define frag_opcode_offset(X) (X)->tc_frag_data.fr_opcode_offset
#define frag_bsr(X) (X)->tc_frag_data.fr_bsr
#define TC_FIX_TYPE \
struct \
{ \
fragS *opcode_fragP; \
unsigned int opcode_offset; \
unsigned int bsr : 1; \
}
struct \
{ \
fragS * opcode_fragP; \
unsigned int opcode_offset; \
unsigned int bsr : 1; \
}
/* Accessor macros for things which may move around.
See comments in write.h. */