mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-11-25 05:00:01 +00:00
2003-08-23 Jason Eckhardt <jle@rice.edu>
[bfd/ChangeLog] * coff-i860.c (coff_i860_reloc_nyi): New function. (howto_table): Add entries for relocations PAIR, HIGHADJ, HIGH, LOWn, SPLITn, and BRADDR. (RTYPE2HOWTO): Check that the r_type is within the howto_table before trying to access the entry. (coff_i860_rtype_to_howto): Likewise. (coff_i860_reloc_type_lookup): New function. (i860_reloc_processing): New function. (coff_bfd_reloc_type_lookup): Define macro. (RELOC_PROCESSING): Define macro. Minor formatting adjustments. [include/coff/ChangeLog] * coff/i860.h (COFF860_R_PAIR, COFF860_R_LOW0, COFF860_R_LOW1, COFF860_R_LOW2, COFF860_R_LOW3, COFF860_R_LOW4, COFF860_R_SPLIT0, COFF860_R_SPLIT1, COFF860_R_SPLIT2, COFF860_R_HIGHADJ, COFF860_R_BRADDR): Define new relocation constants and document. Minor formatting adjustments.
This commit is contained in:
parent
0485f6ad30
commit
c28b1c2869
@ -1,3 +1,17 @@
|
||||
2003-08-23 Jason Eckhardt <jle@rice.edu>
|
||||
|
||||
* coff-i860.c (coff_i860_reloc_nyi): New function.
|
||||
(howto_table): Add entries for relocations PAIR, HIGHADJ, HIGH,
|
||||
LOWn, SPLITn, and BRADDR.
|
||||
(RTYPE2HOWTO): Check that the r_type is within the howto_table
|
||||
before trying to access the entry.
|
||||
(coff_i860_rtype_to_howto): Likewise.
|
||||
(coff_i860_reloc_type_lookup): New function.
|
||||
(i860_reloc_processing): New function.
|
||||
(coff_bfd_reloc_type_lookup): Define macro.
|
||||
(RELOC_PROCESSING): Define macro.
|
||||
Minor formatting adjustments.
|
||||
|
||||
2003-08-23 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* elflink.h (elf_link_add_object_symbols): Don't crash on NULL owner.
|
||||
|
305
bfd/coff-i860.c
305
bfd/coff-i860.c
@ -1,4 +1,4 @@
|
||||
/* BFD back-end for Intel 860 COFF files.
|
||||
/* BFD back-end for Intel i860 COFF files.
|
||||
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1999, 2000, 2001, 2002, 2003
|
||||
Free Software Foundation, Inc.
|
||||
Created mostly by substituting "860" for "386" in coff-i386.c
|
||||
@ -126,6 +126,22 @@ coff_i860_reloc (bfd *abfd,
|
||||
return bfd_reloc_continue;
|
||||
}
|
||||
|
||||
/* This is just a temporary measure until we teach bfd to generate
|
||||
these relocations. */
|
||||
|
||||
static bfd_reloc_status_type
|
||||
coff_i860_reloc_nyi (bfd *abfd ATTRIBUTE_UNUSED,
|
||||
arelent *reloc_entry,
|
||||
asymbol *symbol ATTRIBUTE_UNUSED,
|
||||
void *data ATTRIBUTE_UNUSED,
|
||||
asection *input_section ATTRIBUTE_UNUSED,
|
||||
bfd *output_bfd ATTRIBUTE_UNUSED,
|
||||
char **error_message ATTRIBUTE_UNUSED)
|
||||
{
|
||||
reloc_howto_type *howto = reloc_entry->howto;
|
||||
fprintf (stderr, _("Relocation `%s' not yet implemented\n"), howto->name);
|
||||
}
|
||||
|
||||
#ifndef PCRELOFFSET
|
||||
#define PCRELOFFSET FALSE
|
||||
#endif
|
||||
@ -249,17 +265,184 @@ static reloc_howto_type howto_table[] =
|
||||
TRUE, /* partial_inplace */
|
||||
0xffffffff, /* src_mask */
|
||||
0xffffffff, /* dst_mask */
|
||||
PCRELOFFSET) /* pcrel_offset */
|
||||
PCRELOFFSET), /* pcrel_offset */
|
||||
EMPTY_HOWTO (0x15),
|
||||
EMPTY_HOWTO (0x16),
|
||||
EMPTY_HOWTO (0x17),
|
||||
EMPTY_HOWTO (0x18),
|
||||
EMPTY_HOWTO (0x19),
|
||||
EMPTY_HOWTO (0x1a),
|
||||
EMPTY_HOWTO (0x1b),
|
||||
HOWTO (COFF860_R_PAIR, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
coff_i860_reloc_nyi, /* special_function */
|
||||
"PAIR", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0xffff, /* src_mask */
|
||||
0xffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
EMPTY_HOWTO (0x1d),
|
||||
HOWTO (COFF860_R_HIGH, /* type */
|
||||
16, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
coff_i860_reloc, /* special_function */
|
||||
"HIGH", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0xffff, /* src_mask */
|
||||
0xffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
HOWTO (COFF860_R_LOW0, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
coff_i860_reloc, /* special_function */
|
||||
"LOW0", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0xffff, /* src_mask */
|
||||
0xffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
HOWTO (COFF860_R_LOW1, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
coff_i860_reloc, /* special_function */
|
||||
"LOW1", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0xfffe, /* src_mask */
|
||||
0xfffe, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
HOWTO (COFF860_R_LOW2, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
coff_i860_reloc, /* special_function */
|
||||
"LOW2", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0xfffc, /* src_mask */
|
||||
0xfffc, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
HOWTO (COFF860_R_LOW3, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
coff_i860_reloc, /* special_function */
|
||||
"LOW3", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0xfff8, /* src_mask */
|
||||
0xfff8, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
HOWTO (COFF860_R_LOW4, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
coff_i860_reloc, /* special_function */
|
||||
"LOW4", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0xfff0, /* src_mask */
|
||||
0xfff0, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
HOWTO (COFF860_R_SPLIT0, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
coff_i860_reloc_nyi, /* special_function */
|
||||
"SPLIT0", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x1f07ff, /* src_mask */
|
||||
0x1f07ff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
HOWTO (COFF860_R_SPLIT1, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
coff_i860_reloc_nyi, /* special_function */
|
||||
"SPLIT1", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x1f07fe, /* src_mask */
|
||||
0x1f07fe, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
HOWTO (COFF860_R_SPLIT2, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
coff_i860_reloc_nyi, /* special_function */
|
||||
"SPLIT2", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x1f07fc, /* src_mask */
|
||||
0x1f07fc, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
HOWTO (COFF860_R_HIGHADJ, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
coff_i860_reloc_nyi, /* special_function */
|
||||
"HIGHADJ", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0xffff, /* src_mask */
|
||||
0xffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
HOWTO (COFF860_R_BRADDR, /* type */
|
||||
2, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
26, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_bitfield, /* complain_on_overflow */
|
||||
coff_i860_reloc_nyi, /* special_function */
|
||||
"BRADDR", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x3ffffff, /* src_mask */
|
||||
0x3ffffff, /* dst_mask */
|
||||
TRUE) /* pcrel_offset */
|
||||
};
|
||||
|
||||
/* Turn a howto into a reloc nunmber */
|
||||
/* Turn a howto into a reloc number. */
|
||||
|
||||
#define SELECT_RELOC(x,howto) { x.r_type = howto->type; }
|
||||
#define BADMAG(x) I860BADMAG(x)
|
||||
#define I860 1 /* Customize coffcode.h */
|
||||
|
||||
#define RTYPE2HOWTO(cache_ptr, dst) \
|
||||
(cache_ptr)->howto = howto_table + (dst)->r_type;
|
||||
#define RTYPE2HOWTO(cache_ptr, dst) \
|
||||
((cache_ptr)->howto = \
|
||||
((dst)->r_type < sizeof (howto_table) / sizeof (howto_table[0]) \
|
||||
? howto_table + (dst)->r_type \
|
||||
: NULL))
|
||||
|
||||
/* For 860 COFF a STYP_NOLOAD | STYP_BSS section is part of a shared
|
||||
library. On some other COFF targets STYP_BSS is normally
|
||||
@ -313,6 +496,12 @@ coff_i860_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
|
||||
|
||||
reloc_howto_type *howto;
|
||||
|
||||
if (rel->r_type > sizeof (howto_table) / sizeof (howto_table[0]))
|
||||
{
|
||||
bfd_set_error (bfd_error_bad_value);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
howto = howto_table + rel->r_type;
|
||||
|
||||
if (howto->pc_relative)
|
||||
@ -346,7 +535,111 @@ coff_i860_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
|
||||
return howto;
|
||||
}
|
||||
|
||||
#define coff_rtype_to_howto coff_i860_rtype_to_howto
|
||||
static reloc_howto_type *
|
||||
coff_i860_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
||||
bfd_reloc_code_real_type code)
|
||||
{
|
||||
switch (code)
|
||||
{
|
||||
case BFD_RELOC_32:
|
||||
return howto_table + R_DIR32;
|
||||
case BFD_RELOC_860_PC26:
|
||||
return howto_table + COFF860_R_BRADDR;
|
||||
case BFD_RELOC_860_PC16:
|
||||
/* ??? How to handle PC16 for COFF? SPLIT0 is close for now. */
|
||||
return howto_table + COFF860_R_SPLIT0;
|
||||
case BFD_RELOC_860_LOW0:
|
||||
return howto_table + COFF860_R_LOW0;
|
||||
case BFD_RELOC_860_SPLIT0:
|
||||
return howto_table + COFF860_R_SPLIT0;
|
||||
case BFD_RELOC_860_LOW1:
|
||||
return howto_table + COFF860_R_LOW1;
|
||||
case BFD_RELOC_860_SPLIT1:
|
||||
return howto_table + COFF860_R_SPLIT1;
|
||||
case BFD_RELOC_860_LOW2:
|
||||
return howto_table + COFF860_R_LOW2;
|
||||
case BFD_RELOC_860_SPLIT2:
|
||||
return howto_table + COFF860_R_SPLIT2;
|
||||
case BFD_RELOC_860_LOW3:
|
||||
return howto_table + COFF860_R_LOW3;
|
||||
case BFD_RELOC_860_HIGHADJ:
|
||||
return howto_table + COFF860_R_HIGHADJ;
|
||||
case BFD_RELOC_860_HIGH:
|
||||
return howto_table + COFF860_R_HIGH;
|
||||
default:
|
||||
BFD_FAIL ();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* This is called from coff_slurp_reloc_table for each relocation
|
||||
entry. This special handling is due to the `PAIR' relocation
|
||||
which has a different meaning for the `r_symndx' field. */
|
||||
|
||||
static void
|
||||
i860_reloc_processing (arelent *cache_ptr, struct internal_reloc *dst,
|
||||
asymbol **symbols, bfd *abfd, asection *asect)
|
||||
{
|
||||
if (dst->r_type == COFF860_R_PAIR)
|
||||
{
|
||||
/* Handle the PAIR relocation specially. */
|
||||
cache_ptr->howto = howto_table + dst->r_type;
|
||||
cache_ptr->address = dst->r_vaddr;
|
||||
cache_ptr->addend = dst->r_symndx;
|
||||
cache_ptr->sym_ptr_ptr= bfd_abs_section_ptr->symbol_ptr_ptr;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* For every other relocation, do exactly what coff_slurp_reloc_table
|
||||
would do (which this code is taken directly from). */
|
||||
asymbol *ptr = NULL;
|
||||
cache_ptr->address = dst->r_vaddr;
|
||||
|
||||
if (dst->r_symndx != -1)
|
||||
{
|
||||
if (dst->r_symndx < 0 || dst->r_symndx >= obj_conv_table_size (abfd))
|
||||
{
|
||||
(*_bfd_error_handler)
|
||||
(_("%s: warning: illegal symbol index %ld in relocs"),
|
||||
bfd_archive_filename (abfd), dst->r_symndx);
|
||||
cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
|
||||
ptr = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
cache_ptr->sym_ptr_ptr = (symbols
|
||||
+ obj_convert (abfd)[dst->r_symndx]);
|
||||
ptr = *(cache_ptr->sym_ptr_ptr);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
|
||||
ptr = NULL;
|
||||
}
|
||||
|
||||
/* The symbols definitions that we have read in have been
|
||||
relocated as if their sections started at 0. But the offsets
|
||||
refering to the symbols in the raw data have not been
|
||||
modified, so we have to have a negative addend to compensate.
|
||||
|
||||
Note that symbols which used to be common must be left alone. */
|
||||
|
||||
/* Calculate any reloc addend by looking at the symbol. */
|
||||
CALC_ADDEND (abfd, ptr, (*dst), cache_ptr);
|
||||
|
||||
cache_ptr->address -= asect->vma;
|
||||
|
||||
/* Fill in the cache_ptr->howto field from dst->r_type. */
|
||||
RTYPE2HOWTO (cache_ptr, dst);
|
||||
}
|
||||
}
|
||||
|
||||
#define coff_rtype_to_howto coff_i860_rtype_to_howto
|
||||
#define coff_bfd_reloc_type_lookup coff_i860_reloc_type_lookup
|
||||
|
||||
#define RELOC_PROCESSING(relent, reloc, symbols, abfd, section) \
|
||||
i860_reloc_processing (relent, reloc, symbols, abfd, section)
|
||||
|
||||
#include "coffcode.h"
|
||||
|
||||
|
@ -1,3 +1,11 @@
|
||||
2003-08-23 Jason Eckhardt <jle@rice.edu>
|
||||
|
||||
* coff/i860.h (COFF860_R_PAIR, COFF860_R_LOW0, COFF860_R_LOW1,
|
||||
COFF860_R_LOW2, COFF860_R_LOW3, COFF860_R_LOW4, COFF860_R_SPLIT0,
|
||||
COFF860_R_SPLIT1, COFF860_R_SPLIT2, COFF860_R_HIGHADJ,
|
||||
COFF860_R_BRADDR): Define new relocation constants and document.
|
||||
Minor formatting adjustments.
|
||||
|
||||
2003-08-07 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* ti.h (GET_SCNHDR_NRELOC): Rename PTR param to LOC.
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* coff information for Intel 860.
|
||||
/* COFF information for the Intel i860.
|
||||
|
||||
Copyright 2001 Free Software Foundation, Inc.
|
||||
Copyright 2001, 2003 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
@ -55,3 +55,32 @@ struct external_reloc
|
||||
|
||||
#define RELOC struct external_reloc
|
||||
#define RELSZ 10
|
||||
|
||||
/* The relocation directory entry types.
|
||||
PAIR : The low half that follows relates to the preceeding HIGH[ADJ].
|
||||
HIGH : The high half of a 32-bit constant.
|
||||
LOWn : The low half, insn bits 15..(n-1), 2^n-byte aligned.
|
||||
SPLITn : The low half, insn bits 20..16 and 10..(n-1), 2^n-byte aligned.
|
||||
HIGHADJ: Similar to HIGH, but with adjustment.
|
||||
BRADDR : 26-bit branch displacement.
|
||||
|
||||
Note: The Intel assembler manual lists LOW4 as one of the
|
||||
relocation types, but it appears to be useless for the i860.
|
||||
We will recognize it anyway, just in case it actually appears in
|
||||
any object files. */
|
||||
|
||||
enum {
|
||||
COFF860_R_PAIR = 0x1c,
|
||||
COFF860_R_HIGH = 0x1e,
|
||||
COFF860_R_LOW0 = 0x1f,
|
||||
COFF860_R_LOW1 = 0x20,
|
||||
COFF860_R_LOW2 = 0x21,
|
||||
COFF860_R_LOW3 = 0x22,
|
||||
COFF860_R_LOW4 = 0x23,
|
||||
COFF860_R_SPLIT0 = 0x24,
|
||||
COFF860_R_SPLIT1 = 0x25,
|
||||
COFF860_R_SPLIT2 = 0x26,
|
||||
COFF860_R_HIGHADJ = 0x27,
|
||||
COFF860_R_BRADDR = 0x28
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user