Switched over to using new reloc types.
This commit is contained in:
parent
552c6220e0
commit
def31039ac
6 changed files with 712 additions and 246 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
Tue Sep 2 15:45:45 1997 Nick Clifton <nickc@cygnus.com>
|
||||||
|
|
||||||
|
* cpu-v850.c: Use a macro to construct bfd_arch_info_type
|
||||||
|
entries.
|
||||||
|
|
||||||
|
* reloc.c, libbfd.h, bfd-in2.h, elf32-v850.c: Replace
|
||||||
|
BFD_RELOC_V850_{SDA/TDA/ZDA}_OFFSET relocs with new bit pattern
|
||||||
|
specific versions: BFD_RELOC_V850_{area}_{bits}_OFFSET.
|
||||||
|
|
||||||
Thu Aug 28 17:01:09 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
Thu Aug 28 17:01:09 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
* cpu-v850.c: Remove "plain" from v850 printable name.
|
* cpu-v850.c: Remove "plain" from v850 printable name.
|
||||||
|
|
|
@ -1948,14 +1948,19 @@ add3, load, and store instructions. */
|
||||||
/* This is a 22-bit reloc */
|
/* This is a 22-bit reloc */
|
||||||
BFD_RELOC_V850_22_PCREL,
|
BFD_RELOC_V850_22_PCREL,
|
||||||
|
|
||||||
/* This is an offset from the short data area pointer.. */
|
BFD_RELOC_V850_SDA_16_16_OFFSET, /* A 16 bit reloc in the small data area. */
|
||||||
BFD_RELOC_V850_SDA_OFFSET,
|
BFD_RELOC_V850_SDA_15_16_OFFSET, /* A 16 bit reloc (of which only 15 bits are used) in the small data area. */
|
||||||
|
BFD_RELOC_V850_ZDA_16_16_OFFSET, /* A 16 bit reloc in the zero data area. */
|
||||||
/* This is an offset from the zero data area pointer.. */
|
BFD_RELOC_V850_ZDA_15_16_OFFSET, /* A 16 bit reloc (of which only 15 bits are used) in the zero data area. */
|
||||||
BFD_RELOC_V850_ZDA_OFFSET,
|
BFD_RELOC_V850_TDA_6_8_OFFSET, /* An 8 bit reloc (of which only 6 bits are used) in the tiny data area. */
|
||||||
|
BFD_RELOC_V850_TDA_7_8_OFFSET, /* An 8 bit reloc (of which only 7 bits are used) in the tiny data area. */
|
||||||
/* This is an offset from the tiny data area pointer.. */
|
BFD_RELOC_V850_TDA_7_7_OFFSET, /* A 7 bit reloc in the tiny data area. */
|
||||||
BFD_RELOC_V850_TDA_OFFSET,
|
/* start-sanitize-v850e */
|
||||||
|
BFD_RELOC_V850_TDA_4_5_OFFSET, /* A 5 bit reloc (of which only 4 bits are used) in the tiny data area. */
|
||||||
|
BFD_RELOC_V850_TDA_4_4_OFFSET, /* A 4 bit reloc in the tiny data area. */
|
||||||
|
BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET, /* A 16 bit reloc (but the bits are not contiguous) in the small data area. */
|
||||||
|
BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET, /* A 16 bit reloc (but the bits are not contiguous) in the zero data area. */
|
||||||
|
/* end-santize-v850e */
|
||||||
/* end-sanitize-v850 */
|
/* end-sanitize-v850 */
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -83,55 +83,18 @@ scan (info, string)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define N(number, print, default, next) \
|
||||||
|
{ 32, 32, 8, bfd_arch_v850, number, "v850", print, 2, default, bfd_default_compatible, scan, next }
|
||||||
|
|
||||||
static const bfd_arch_info_type arch_info_struct[2] =
|
static const bfd_arch_info_type arch_info_struct[2] =
|
||||||
{
|
{
|
||||||
/* start-sanitize-v850e */
|
/* start-sanitize-v850e */
|
||||||
{
|
N( bfd_mach_v850e, "v850e", false, & arch_info_struct[1] ),
|
||||||
32, /* 32 bits in a word */
|
|
||||||
32, /* 32 bits in an address */
|
|
||||||
8, /* 8 bits in a byte */
|
|
||||||
bfd_arch_v850,
|
|
||||||
bfd_mach_v850e,
|
|
||||||
"v850",
|
|
||||||
"v850e",
|
|
||||||
2,
|
|
||||||
false,
|
|
||||||
bfd_default_compatible,
|
|
||||||
scan,
|
|
||||||
& arch_info_struct[ 1 ],
|
|
||||||
},
|
|
||||||
/* end-sanitize-v850e */
|
/* end-sanitize-v850e */
|
||||||
/* start-sanitize-v850eq */
|
/* start-sanitize-v850eq */
|
||||||
{
|
N( bfd_mach_v850eq, "v850eq", false, NULL ),
|
||||||
32, /* 32 bits in a word */
|
|
||||||
32, /* 32 bits in an address */
|
|
||||||
8, /* 8 bits in a byte */
|
|
||||||
bfd_arch_v850,
|
|
||||||
bfd_mach_v850eq,
|
|
||||||
"v850",
|
|
||||||
"v850eq",
|
|
||||||
2,
|
|
||||||
false,
|
|
||||||
bfd_default_compatible,
|
|
||||||
scan,
|
|
||||||
0,
|
|
||||||
}
|
|
||||||
/* end-sanitize-v850eq */
|
/* end-sanitize-v850eq */
|
||||||
};
|
};
|
||||||
|
|
||||||
const bfd_arch_info_type bfd_v850_arch =
|
const bfd_arch_info_type bfd_v850_arch =
|
||||||
{
|
N( bfd_mach_v850, "v850", true, & arch_info_struct[0] );
|
||||||
32, /* 32 bits in a word */
|
|
||||||
32, /* 32 bits in an address */
|
|
||||||
8, /* 8 bits in a byte */
|
|
||||||
bfd_arch_v850,
|
|
||||||
bfd_mach_v850,
|
|
||||||
"v850",
|
|
||||||
"v850",
|
|
||||||
2,
|
|
||||||
true, /* the default */
|
|
||||||
bfd_default_compatible,
|
|
||||||
scan ,
|
|
||||||
& arch_info_struct[ 0 ],
|
|
||||||
};
|
|
||||||
|
|
699
bfd/elf32-v850.c
699
bfd/elf32-v850.c
|
@ -45,11 +45,12 @@ static boolean v850_elf_relocate_section PARAMS((bfd *,
|
||||||
Elf_Internal_Rela *,
|
Elf_Internal_Rela *,
|
||||||
Elf_Internal_Sym *,
|
Elf_Internal_Sym *,
|
||||||
asection **));
|
asection **));
|
||||||
|
|
||||||
/* Try to minimize the amount of space occupied by relocation tables
|
/* Try to minimize the amount of space occupied by relocation tables
|
||||||
on the ROM (not that the ROM won't be swamped by other ELF overhead). */
|
on the ROM (not that the ROM won't be swamped by other ELF overhead). */
|
||||||
#define USE_REL
|
#define USE_REL
|
||||||
|
|
||||||
|
/* Note: It is REQUIRED that the 'type' value of each entry in this array
|
||||||
|
match the index of the entry in the array. */
|
||||||
static reloc_howto_type v850_elf_howto_table[] =
|
static reloc_howto_type v850_elf_howto_table[] =
|
||||||
{
|
{
|
||||||
/* This reloc does nothing. */
|
/* This reloc does nothing. */
|
||||||
|
@ -202,8 +203,8 @@ static reloc_howto_type v850_elf_howto_table[] =
|
||||||
0xff, /* dst_mask */
|
0xff, /* dst_mask */
|
||||||
false), /* pcrel_offset */
|
false), /* pcrel_offset */
|
||||||
|
|
||||||
/* Offset from the short data area pointer. */
|
/* 16 bit offset from the short data area pointer. */
|
||||||
HOWTO (R_V850_SDA_OFFSET, /* type */
|
HOWTO (R_V850_SDA_16_16_OFFSET, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
1, /* size (0 = byte, 1 = short, 2 = long) */
|
1, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
16, /* bitsize */
|
16, /* bitsize */
|
||||||
|
@ -211,14 +212,29 @@ static reloc_howto_type v850_elf_howto_table[] =
|
||||||
0, /* bitpos */
|
0, /* bitpos */
|
||||||
complain_overflow_dont, /* complain_on_overflow */
|
complain_overflow_dont, /* complain_on_overflow */
|
||||||
v850_elf_reloc, /* special_function */
|
v850_elf_reloc, /* special_function */
|
||||||
"R_V850_SDA_OFFSET", /* name */
|
"R_V850_SDA_16_16_OFFSET", /* name */
|
||||||
true, /* partial_inplace */
|
false, /* partial_inplace */
|
||||||
0xffff, /* src_mask */
|
0xffff, /* src_mask */
|
||||||
0xffff, /* dst_mask */
|
0xffff, /* dst_mask */
|
||||||
false), /* pcrel_offset */
|
false), /* pcrel_offset */
|
||||||
|
|
||||||
/* Offset from the zero data area pointer. */
|
/* 15 bit offset from the short data area pointer. */
|
||||||
HOWTO (R_V850_ZDA_OFFSET, /* type */
|
HOWTO (R_V850_SDA_15_16_OFFSET, /* type */
|
||||||
|
1, /* rightshift */
|
||||||
|
1, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
16, /* bitsize */
|
||||||
|
false, /* pc_relative */
|
||||||
|
1, /* bitpos */
|
||||||
|
complain_overflow_dont, /* complain_on_overflow */
|
||||||
|
v850_elf_reloc, /* special_function */
|
||||||
|
"R_V850_SDA_15_16_OFFSET", /* name */
|
||||||
|
false, /* partial_inplace */
|
||||||
|
0xfffe, /* src_mask */
|
||||||
|
0xfffe, /* dst_mask */
|
||||||
|
false), /* pcrel_offset */
|
||||||
|
|
||||||
|
/* 16 bit offset from the zero data area pointer. */
|
||||||
|
HOWTO (R_V850_ZDA_16_16_OFFSET, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
1, /* size (0 = byte, 1 = short, 2 = long) */
|
1, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
16, /* bitsize */
|
16, /* bitsize */
|
||||||
|
@ -226,27 +242,135 @@ static reloc_howto_type v850_elf_howto_table[] =
|
||||||
0, /* bitpos */
|
0, /* bitpos */
|
||||||
complain_overflow_dont, /* complain_on_overflow */
|
complain_overflow_dont, /* complain_on_overflow */
|
||||||
v850_elf_reloc, /* special_function */
|
v850_elf_reloc, /* special_function */
|
||||||
"R_V850_ZDA_OFFSET", /* name */
|
"R_V850_ZDA_16_16_OFFSET", /* name */
|
||||||
true, /* partial_inplace */
|
false, /* partial_inplace */
|
||||||
0xffff, /* src_mask */
|
0xffff, /* src_mask */
|
||||||
0xffff, /* dst_mask */
|
0xffff, /* dst_mask */
|
||||||
false), /* pcrel_offset */
|
false), /* pcrel_offset */
|
||||||
|
|
||||||
/* Offset from the tiny data area pointer. */
|
/* 15 bit offset from the zero data area pointer. */
|
||||||
HOWTO (R_V850_TDA_OFFSET, /* type */
|
HOWTO (R_V850_ZDA_15_16_OFFSET, /* type */
|
||||||
0, /* rightshift */
|
1, /* rightshift */
|
||||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
1, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
16, /* bitsize */
|
||||||
|
false, /* pc_relative */
|
||||||
|
1, /* bitpos */
|
||||||
|
complain_overflow_dont, /* complain_on_overflow */
|
||||||
|
v850_elf_reloc, /* special_function */
|
||||||
|
"R_V850_ZDA_15_16_OFFSET", /* name */
|
||||||
|
false, /* partial_inplace */
|
||||||
|
0xfffe, /* src_mask */
|
||||||
|
0xfffe, /* dst_mask */
|
||||||
|
false), /* pcrel_offset */
|
||||||
|
|
||||||
|
/* 6 bit offset from the tiny data area pointer. */
|
||||||
|
HOWTO (R_V850_TDA_6_8_OFFSET, /* type */
|
||||||
|
2, /* rightshift */
|
||||||
|
1, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
8, /* bitsize */
|
||||||
|
false, /* pc_relative */
|
||||||
|
1, /* bitpos */
|
||||||
|
complain_overflow_dont, /* complain_on_overflow */
|
||||||
|
v850_elf_reloc, /* special_function */
|
||||||
|
"R_V850_TDA_6_8_OFFSET", /* name */
|
||||||
|
false, /* partial_inplace */
|
||||||
|
0x7e, /* src_mask */
|
||||||
|
0x7e, /* dst_mask */
|
||||||
|
false), /* pcrel_offset */
|
||||||
|
|
||||||
|
/* 8 bit offset from the tiny data area pointer. */
|
||||||
|
HOWTO (R_V850_TDA_7_8_OFFSET, /* type */
|
||||||
|
1, /* rightshift */
|
||||||
|
1, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
8, /* bitsize */
|
8, /* bitsize */
|
||||||
false, /* pc_relative */
|
false, /* pc_relative */
|
||||||
0, /* bitpos */
|
0, /* bitpos */
|
||||||
complain_overflow_dont, /* complain_on_overflow */
|
complain_overflow_dont, /* complain_on_overflow */
|
||||||
v850_elf_reloc, /* special_function */
|
v850_elf_reloc, /* special_function */
|
||||||
"R_V850_TDA_OFFSET", /* name */
|
"R_V850_TDA_7_8_OFFSET", /* name */
|
||||||
true, /* partial_inplace */
|
false, /* partial_inplace */
|
||||||
0xff, /* src_mask */
|
0x7f, /* src_mask */
|
||||||
0xff, /* dst_mask */
|
0x7f, /* dst_mask */
|
||||||
false), /* pcrel_offset */
|
false), /* pcrel_offset */
|
||||||
|
|
||||||
|
/* 7 bit offset from the tiny data area pointer. */
|
||||||
|
HOWTO (R_V850_TDA_7_7_OFFSET, /* type */
|
||||||
|
0, /* rightshift */
|
||||||
|
1, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
7, /* bitsize */
|
||||||
|
false, /* pc_relative */
|
||||||
|
0, /* bitpos */
|
||||||
|
complain_overflow_dont, /* complain_on_overflow */
|
||||||
|
v850_elf_reloc, /* special_function */
|
||||||
|
"R_V850_TDA_7_7_OFFSET", /* name */
|
||||||
|
false, /* partial_inplace */
|
||||||
|
0x7f, /* src_mask */
|
||||||
|
0x7f, /* dst_mask */
|
||||||
|
false), /* pcrel_offset */
|
||||||
|
|
||||||
|
/* start-sanitize-v850e */
|
||||||
|
|
||||||
|
/* 5 bit offset from the tiny data area pointer. */
|
||||||
|
HOWTO (R_V850_TDA_4_5_OFFSET, /* type */
|
||||||
|
1, /* rightshift */
|
||||||
|
1, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
5, /* bitsize */
|
||||||
|
false, /* pc_relative */
|
||||||
|
0, /* bitpos */
|
||||||
|
complain_overflow_dont, /* complain_on_overflow */
|
||||||
|
v850_elf_reloc, /* special_function */
|
||||||
|
"R_V850_TDA_4_5_OFFSET", /* name */
|
||||||
|
false, /* partial_inplace */
|
||||||
|
0x0f, /* src_mask */
|
||||||
|
0x0f, /* dst_mask */
|
||||||
|
false), /* pcrel_offset */
|
||||||
|
|
||||||
|
/* 4 bit offset from the tiny data area pointer. */
|
||||||
|
HOWTO (R_V850_TDA_4_4_OFFSET, /* type */
|
||||||
|
0, /* rightshift */
|
||||||
|
1, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
4, /* bitsize */
|
||||||
|
false, /* pc_relative */
|
||||||
|
0, /* bitpos */
|
||||||
|
complain_overflow_dont, /* complain_on_overflow */
|
||||||
|
v850_elf_reloc, /* special_function */
|
||||||
|
"R_V850_TDA_4_4_OFFSET", /* name */
|
||||||
|
false, /* partial_inplace */
|
||||||
|
0x0f, /* src_mask */
|
||||||
|
0x0f, /* dst_mask */
|
||||||
|
false), /* pcrel_offset */
|
||||||
|
|
||||||
|
/* 16 bit offset from the short data area pointer. */
|
||||||
|
HOWTO (R_V850_SDA_16_16_SPLIT_OFFSET, /* type */
|
||||||
|
0, /* rightshift */
|
||||||
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
16, /* bitsize */
|
||||||
|
false, /* pc_relative */
|
||||||
|
0, /* bitpos */
|
||||||
|
complain_overflow_dont, /* complain_on_overflow */
|
||||||
|
v850_elf_reloc, /* special_function */
|
||||||
|
"R_V850_SDA_16_16_SPLIT_OFFSET",/* name */
|
||||||
|
false, /* partial_inplace */
|
||||||
|
0xfffe0020, /* src_mask */
|
||||||
|
0xfffe0020, /* dst_mask */
|
||||||
|
false), /* pcrel_offset */
|
||||||
|
|
||||||
|
/* 16 bit offset from the zero data area pointer. */
|
||||||
|
HOWTO (R_V850_ZDA_16_16_SPLIT_OFFSET, /* type */
|
||||||
|
0, /* rightshift */
|
||||||
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
16, /* bitsize */
|
||||||
|
false, /* pc_relative */
|
||||||
|
0, /* bitpos */
|
||||||
|
complain_overflow_dont, /* complain_on_overflow */
|
||||||
|
v850_elf_reloc, /* special_function */
|
||||||
|
"R_V850_ZDA_16_16_SPLIT_OFFSET",/* name */
|
||||||
|
false, /* partial_inplace */
|
||||||
|
0xfffe0020, /* src_mask */
|
||||||
|
0xfffe0020, /* dst_mask */
|
||||||
|
false), /* pcrel_offset */
|
||||||
|
|
||||||
|
/* end-sanitize-v850e */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Map BFD reloc types to V850 ELF reloc types. */
|
/* Map BFD reloc types to V850 ELF reloc types. */
|
||||||
|
@ -259,19 +383,29 @@ struct v850_elf_reloc_map
|
||||||
|
|
||||||
static const struct v850_elf_reloc_map v850_elf_reloc_map[] =
|
static const struct v850_elf_reloc_map v850_elf_reloc_map[] =
|
||||||
{
|
{
|
||||||
{ BFD_RELOC_NONE, R_V850_NONE, },
|
{ BFD_RELOC_NONE, R_V850_NONE },
|
||||||
{ BFD_RELOC_V850_9_PCREL, R_V850_9_PCREL, },
|
{ BFD_RELOC_V850_9_PCREL, R_V850_9_PCREL },
|
||||||
{ BFD_RELOC_V850_16_PCREL, R_V850_16_PCREL, },
|
{ BFD_RELOC_V850_16_PCREL, R_V850_16_PCREL },
|
||||||
{ BFD_RELOC_V850_22_PCREL, R_V850_22_PCREL, },
|
{ BFD_RELOC_V850_22_PCREL, R_V850_22_PCREL },
|
||||||
{ BFD_RELOC_HI16_S, R_V850_HI16_S, },
|
{ BFD_RELOC_HI16_S, R_V850_HI16_S },
|
||||||
{ BFD_RELOC_HI16, R_V850_HI16, },
|
{ BFD_RELOC_HI16, R_V850_HI16 },
|
||||||
{ BFD_RELOC_LO16, R_V850_LO16, },
|
{ BFD_RELOC_LO16, R_V850_LO16 },
|
||||||
{ BFD_RELOC_32, R_V850_32, },
|
{ BFD_RELOC_32, R_V850_32 },
|
||||||
{ BFD_RELOC_16, R_V850_16, },
|
{ BFD_RELOC_16, R_V850_16 },
|
||||||
{ BFD_RELOC_8, R_V850_8, },
|
{ BFD_RELOC_8, R_V850_8 },
|
||||||
{ BFD_RELOC_V850_TDA_OFFSET, R_V850_TDA_OFFSET, },
|
{ BFD_RELOC_V850_SDA_16_16_OFFSET, R_V850_SDA_16_16_OFFSET },
|
||||||
{ BFD_RELOC_V850_SDA_OFFSET, R_V850_SDA_OFFSET, },
|
{ BFD_RELOC_V850_SDA_15_16_OFFSET, R_V850_SDA_15_16_OFFSET },
|
||||||
{ BFD_RELOC_V850_ZDA_OFFSET, R_V850_ZDA_OFFSET, },
|
{ BFD_RELOC_V850_ZDA_16_16_OFFSET, R_V850_ZDA_16_16_OFFSET },
|
||||||
|
{ BFD_RELOC_V850_ZDA_15_16_OFFSET, R_V850_ZDA_15_16_OFFSET },
|
||||||
|
{ BFD_RELOC_V850_TDA_6_8_OFFSET, R_V850_TDA_6_8_OFFSET },
|
||||||
|
{ BFD_RELOC_V850_TDA_7_8_OFFSET, R_V850_TDA_7_8_OFFSET },
|
||||||
|
{ BFD_RELOC_V850_TDA_7_7_OFFSET, R_V850_TDA_7_7_OFFSET },
|
||||||
|
/* start-sanitize-v850e */
|
||||||
|
{ BFD_RELOC_V850_TDA_4_5_OFFSET, R_V850_TDA_4_5_OFFSET },
|
||||||
|
{ BFD_RELOC_V850_TDA_4_4_OFFSET, R_V850_TDA_4_4_OFFSET },
|
||||||
|
{ BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET, R_V850_SDA_16_16_SPLIT_OFFSET },
|
||||||
|
{ BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET, R_V850_ZDA_16_16_SPLIT_OFFSET },
|
||||||
|
/* end-sanitize-v850e */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -288,7 +422,11 @@ v850_elf_reloc_type_lookup (abfd, code)
|
||||||
i++)
|
i++)
|
||||||
{
|
{
|
||||||
if (v850_elf_reloc_map[i].bfd_reloc_val == code)
|
if (v850_elf_reloc_map[i].bfd_reloc_val == code)
|
||||||
return &v850_elf_howto_table[v850_elf_reloc_map[i].elf_reloc_val];
|
{
|
||||||
|
BFD_ASSERT (v850_elf_howto_table[v850_elf_reloc_map[i].elf_reloc_val].type == v850_elf_reloc_map[i].elf_reloc_val);
|
||||||
|
|
||||||
|
return & v850_elf_howto_table[v850_elf_reloc_map[i].elf_reloc_val];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -374,17 +512,31 @@ v850_elf_check_relocs (abfd, info, sec, relocs)
|
||||||
case R_V850_8:
|
case R_V850_8:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_V850_SDA_OFFSET:
|
/* start-sanitize-v850e */
|
||||||
|
case R_V850_SDA_16_16_SPLIT_OFFSET:
|
||||||
|
/* end-sanitize-v850e */
|
||||||
|
case R_V850_SDA_16_16_OFFSET:
|
||||||
|
case R_V850_SDA_15_16_OFFSET:
|
||||||
other = V850_OTHER_SDA;
|
other = V850_OTHER_SDA;
|
||||||
common = ".scommon";
|
common = ".scommon";
|
||||||
goto small_data_common;
|
goto small_data_common;
|
||||||
|
|
||||||
case R_V850_ZDA_OFFSET:
|
/* start-sanitize-v850e */
|
||||||
|
case R_V850_ZDA_16_16_SPLIT_OFFSET:
|
||||||
|
/* end-sanitize-v850e */
|
||||||
|
case R_V850_ZDA_16_16_OFFSET:
|
||||||
|
case R_V850_ZDA_15_16_OFFSET:
|
||||||
other = V850_OTHER_ZDA;
|
other = V850_OTHER_ZDA;
|
||||||
common = ".zcommon";
|
common = ".zcommon";
|
||||||
goto small_data_common;
|
goto small_data_common;
|
||||||
|
|
||||||
case R_V850_TDA_OFFSET:
|
/* start-sanitize-v850e */
|
||||||
|
case R_V850_TDA_4_5_OFFSET:
|
||||||
|
case R_V850_TDA_4_4_OFFSET:
|
||||||
|
/* end-sanitize-v850 */
|
||||||
|
case R_V850_TDA_6_8_OFFSET:
|
||||||
|
case R_V850_TDA_7_8_OFFSET:
|
||||||
|
case R_V850_TDA_7_7_OFFSET:
|
||||||
other = V850_OTHER_TDA;
|
other = V850_OTHER_TDA;
|
||||||
common = ".tcommon";
|
common = ".tcommon";
|
||||||
/* fall through */
|
/* fall through */
|
||||||
|
@ -450,16 +602,22 @@ v850_elf_check_relocs (abfd, info, sec, relocs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Insert the addend into the instruction. */
|
||||||
static bfd_reloc_status_type
|
static bfd_reloc_status_type
|
||||||
v850_elf_reloc (abfd, reloc, symbol, data, isection, obfd, err)
|
v850_elf_reloc (abfd, reloc, symbol, data, isection, obfd, err)
|
||||||
bfd *abfd;
|
bfd * abfd;
|
||||||
arelent *reloc;
|
arelent * reloc;
|
||||||
asymbol *symbol;
|
asymbol * symbol;
|
||||||
PTR data;
|
PTR data;
|
||||||
asection *isection;
|
asection * isection;
|
||||||
bfd *obfd;
|
bfd * obfd;
|
||||||
char **err;
|
char ** err;
|
||||||
{
|
{
|
||||||
|
/* If there is an output BFD,
|
||||||
|
and the symbol is not a section name (which is only defined at final link time),
|
||||||
|
and either we are not putting the addend into the instruction
|
||||||
|
or the addend is zero, so there is nothing to add into the instruction
|
||||||
|
then just fixup the address and return. */
|
||||||
if (obfd != (bfd *) NULL
|
if (obfd != (bfd *) NULL
|
||||||
&& (symbol->flags & BSF_SECTION_SYM) == 0
|
&& (symbol->flags & BSF_SECTION_SYM) == 0
|
||||||
&& (! reloc->howto->partial_inplace
|
&& (! reloc->howto->partial_inplace
|
||||||
|
@ -468,10 +626,12 @@ v850_elf_reloc (abfd, reloc, symbol, data, isection, obfd, err)
|
||||||
reloc->address += isection->output_offset;
|
reloc->address += isection->output_offset;
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
else if (obfd != NULL)
|
else if (obfd != NULL)
|
||||||
{
|
{
|
||||||
return bfd_reloc_continue;
|
return bfd_reloc_continue;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Catch relocs involving undefined symbols. */
|
/* Catch relocs involving undefined symbols. */
|
||||||
if (bfd_is_und_section (symbol->section)
|
if (bfd_is_und_section (symbol->section)
|
||||||
|
@ -517,6 +677,7 @@ v850_elf_reloc (abfd, reloc, symbol, data, isection, obfd, err)
|
||||||
switch (reloc->howto->type)
|
switch (reloc->howto->type)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
|
/* fprintf (stderr, "reloc type %d not SUPPORTED\n", reloc->howto->type ); */
|
||||||
return bfd_reloc_notsupported;
|
return bfd_reloc_notsupported;
|
||||||
|
|
||||||
case R_V850_22_PCREL:
|
case R_V850_22_PCREL:
|
||||||
|
@ -572,41 +733,113 @@ v850_elf_reloc (abfd, reloc, symbol, data, isection, obfd, err)
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
case R_V850_16:
|
case R_V850_16:
|
||||||
case R_V850_ZDA_OFFSET:
|
case R_V850_LO16:
|
||||||
relocation += (short)bfd_get_16 (abfd, (bfd_byte *) data + reloc->address);
|
relocation += (short)bfd_get_16 (abfd, (bfd_byte *) data + reloc->address);
|
||||||
|
|
||||||
|
case R_V850_SDA_16_16_OFFSET:
|
||||||
|
case R_V850_ZDA_16_16_OFFSET:
|
||||||
if ((long)relocation > 0x7fff || (long)relocation < -0x8000)
|
if ((long)relocation > 0x7fff || (long)relocation < -0x8000)
|
||||||
return bfd_reloc_overflow;
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
bfd_put_16 (abfd, relocation, (bfd_byte *)data + reloc->address);
|
bfd_put_16 (abfd, relocation, (bfd_byte *)data + reloc->address);
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
#if 0
|
case R_V850_SDA_15_16_OFFSET:
|
||||||
case R_V850_SDA_OFFSET:
|
case R_V850_ZDA_15_16_OFFSET:
|
||||||
{
|
if ((long)relocation > 0x7ffe || (long)relocation < -0x8000)
|
||||||
unsigned long gp;
|
|
||||||
struct bfd_link_hash_entry *h;
|
|
||||||
|
|
||||||
relocation += (short)bfd_get_16 (abfd, (bfd_byte *) data + reloc->address);
|
|
||||||
|
|
||||||
/* Get the value of __gp. */
|
|
||||||
h = bfd_link_hash_lookup (info->hash, "__gp", false, false, true);
|
|
||||||
if (h == (struct bfd_link_hash_entry *) NULL
|
|
||||||
|| h->type != bfd_link_hash_defined)
|
|
||||||
return bfd_reloc_undefined;
|
|
||||||
|
|
||||||
gp = (h->u.def.value
|
|
||||||
+ h->u.def.section->output_section->vma
|
|
||||||
+ h->u.def.section->output_offset);
|
|
||||||
relocation -= gp;
|
|
||||||
|
|
||||||
if ((long)relocation > 0x7fff || (long)relocation < -0x8000)
|
|
||||||
return bfd_reloc_overflow;
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
bfd_put_16 (abfd, relocation, (bfd_byte *)data + reloc->address);
|
if (relocation & 1)
|
||||||
|
return bfd_reloc_dangerous;
|
||||||
|
|
||||||
|
insn = bfd_get_16 (abfd, (bfd_byte *) data + reloc->address);
|
||||||
|
insn &= 1;
|
||||||
|
insn |= (relocation >> 1) & ~1;
|
||||||
|
|
||||||
|
bfd_put_16 (abfd, insn, (bfd_byte *)data + reloc->address);
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
}
|
|
||||||
#endif
|
case R_V850_TDA_6_8_OFFSET:
|
||||||
|
if ((long) relocation > 0xfc || (long) relocation < 0)
|
||||||
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
|
if (relocation & 3)
|
||||||
|
return bfd_reloc_dangerous;
|
||||||
|
|
||||||
|
insn = bfd_get_16 (abfd, (bfd_byte *) data + reloc->address);
|
||||||
|
insn &= 0xff81;
|
||||||
|
insn |= (relocation >> 1);
|
||||||
|
|
||||||
|
bfd_put_16 (abfd, insn, (bfd_byte *)data + reloc->address);
|
||||||
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
|
case R_V850_TDA_7_8_OFFSET:
|
||||||
|
if ((long) relocation > 0xfe || (long) relocation < 0)
|
||||||
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
|
if (relocation & 1)
|
||||||
|
return bfd_reloc_dangerous;
|
||||||
|
|
||||||
|
insn = bfd_get_16 (abfd, (bfd_byte *) data + reloc->address);
|
||||||
|
insn &= 0xff80;
|
||||||
|
insn |= (relocation >> 1);
|
||||||
|
|
||||||
|
bfd_put_16 (abfd, insn, (bfd_byte *)data + reloc->address);
|
||||||
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
|
case R_V850_TDA_7_7_OFFSET:
|
||||||
|
if ((long) relocation > 0x7f || (long) relocation < 0)
|
||||||
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
|
insn = bfd_get_16 (abfd, (bfd_byte *) data + reloc->address);
|
||||||
|
insn &= 0xff80;
|
||||||
|
insn |= relocation;
|
||||||
|
|
||||||
|
bfd_put_16 (abfd, insn, (bfd_byte *)data + reloc->address);
|
||||||
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
|
/* start-sanitize-v850e */
|
||||||
|
case R_V850_TDA_4_5_OFFSET:
|
||||||
|
if ((long) relocation > 0x1e || (long) relocation < 0)
|
||||||
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
|
if (relocation & 1)
|
||||||
|
return bfd_reloc_dangerous;
|
||||||
|
|
||||||
|
insn = bfd_get_16 (abfd, (bfd_byte *) data + reloc->address);
|
||||||
|
insn &= 0xfff0;
|
||||||
|
insn |= (relocation >> 1);
|
||||||
|
|
||||||
|
bfd_put_16 (abfd, insn, (bfd_byte *)data + reloc->address);
|
||||||
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
|
case R_V850_TDA_4_4_OFFSET:
|
||||||
|
if ((long) relocation > 0xf || (long) relocation < 0)
|
||||||
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
|
insn = bfd_get_16 (abfd, (bfd_byte *) data + reloc->address);
|
||||||
|
insn &= 0xfff0;
|
||||||
|
insn |= relocation;
|
||||||
|
|
||||||
|
bfd_put_16 (abfd, insn, (bfd_byte *)data + reloc->address);
|
||||||
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
|
case R_V850_ZDA_16_16_SPLIT_OFFSET:
|
||||||
|
case R_V850_SDA_16_16_SPLIT_OFFSET:
|
||||||
|
if ((long) relocation > 0xffff || (long) relocation < 0)
|
||||||
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
|
insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc->address);
|
||||||
|
|
||||||
|
if (reloc->howto->type == R_V850_SDA_16_16_SPLIT_OFFSET)
|
||||||
|
fprintf (stderr, "relocation %x, insn = %x\n", relocation, insn );
|
||||||
|
|
||||||
|
insn &= 0x0001ffdf;
|
||||||
|
insn |= (relocation & 1) << 5;
|
||||||
|
insn |= (relocation & ~1) << 16;
|
||||||
|
|
||||||
|
bfd_put_32 (abfd, insn, (bfd_byte *)data + reloc->address);
|
||||||
|
return bfd_reloc_ok;
|
||||||
|
/* end-sanitize-v850e */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -631,21 +864,21 @@ static bfd_reloc_status_type
|
||||||
v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
|
v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
input_section, contents, offset, value,
|
input_section, contents, offset, value,
|
||||||
addend, info, sym_sec, is_local)
|
addend, info, sym_sec, is_local)
|
||||||
reloc_howto_type *howto;
|
reloc_howto_type * howto;
|
||||||
bfd *input_bfd;
|
bfd * input_bfd;
|
||||||
bfd *output_bfd;
|
bfd * output_bfd;
|
||||||
asection *input_section;
|
asection * input_section;
|
||||||
bfd_byte *contents;
|
bfd_byte * contents;
|
||||||
bfd_vma offset;
|
bfd_vma offset;
|
||||||
bfd_vma value;
|
bfd_vma value;
|
||||||
bfd_vma addend;
|
bfd_vma addend;
|
||||||
struct bfd_link_info *info;
|
struct bfd_link_info * info;
|
||||||
asection *sym_sec;
|
asection * sym_sec;
|
||||||
int is_local;
|
int is_local;
|
||||||
{
|
{
|
||||||
unsigned long insn;
|
unsigned long insn;
|
||||||
unsigned long r_type = howto->type;
|
unsigned long r_type = howto->type;
|
||||||
bfd_byte *hit_data = contents + offset;
|
bfd_byte * hit_data = contents + offset;
|
||||||
|
|
||||||
switch (r_type)
|
switch (r_type)
|
||||||
{
|
{
|
||||||
|
@ -727,15 +960,39 @@ v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
case R_V850_16:
|
case R_V850_16:
|
||||||
case R_V850_ZDA_OFFSET:
|
value += (short) bfd_get_16 (input_bfd, hit_data);
|
||||||
value += (short)bfd_get_16 (input_bfd, hit_data);
|
|
||||||
|
|
||||||
if ((long)value > 0x7fff || (long)value < -0x8000)
|
if ((long) value > 0x7fff || (long) value < -0x8000)
|
||||||
return bfd_reloc_overflow;
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
bfd_put_16 (input_bfd, value, hit_data);
|
bfd_put_16 (input_bfd, value, hit_data);
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
|
case R_V850_ZDA_16_16_OFFSET:
|
||||||
|
value -= sym_sec->output_section->vma;
|
||||||
|
value += (short) bfd_get_16 (input_bfd, hit_data);
|
||||||
|
|
||||||
|
if ((long) value > 0x7fff || (long) value < -0x8000)
|
||||||
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
|
bfd_put_16 (input_bfd, value, hit_data);
|
||||||
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
|
case R_V850_ZDA_15_16_OFFSET:
|
||||||
|
insn = bfd_get_16 (input_bfd, hit_data);
|
||||||
|
|
||||||
|
value -= sym_sec->output_section->vma;
|
||||||
|
value += ((insn & 0xfffe) << 1);
|
||||||
|
|
||||||
|
if ((long) value > 0x7ffe || (long) value < -0x8000)
|
||||||
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
|
value &= ~1;
|
||||||
|
value |= (insn & 1);
|
||||||
|
|
||||||
|
bfd_put_16 (input_bfd, value, hit_data);
|
||||||
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
case R_V850_32:
|
case R_V850_32:
|
||||||
value += bfd_get_32 (input_bfd, hit_data);
|
value += bfd_get_32 (input_bfd, hit_data);
|
||||||
bfd_put_32 (input_bfd, value, hit_data);
|
bfd_put_32 (input_bfd, value, hit_data);
|
||||||
|
@ -750,24 +1007,24 @@ v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
bfd_put_8 (input_bfd, value, hit_data);
|
bfd_put_8 (input_bfd, value, hit_data);
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
case R_V850_SDA_OFFSET:
|
case R_V850_SDA_16_16_OFFSET:
|
||||||
{
|
{
|
||||||
unsigned long gp;
|
unsigned long gp;
|
||||||
struct bfd_link_hash_entry *h;
|
struct bfd_link_hash_entry * h;
|
||||||
|
|
||||||
value += (short)bfd_get_16 (input_bfd, hit_data);
|
|
||||||
|
|
||||||
/* Get the value of __gp. */
|
/* Get the value of __gp. */
|
||||||
h = bfd_link_hash_lookup (info->hash, "__gp", false,
|
h = bfd_link_hash_lookup (info->hash, "__gp", false, false, true);
|
||||||
false, true);
|
|
||||||
if (h == (struct bfd_link_hash_entry *) NULL
|
if (h == (struct bfd_link_hash_entry *) NULL
|
||||||
|| h->type != bfd_link_hash_defined)
|
|| h->type != bfd_link_hash_defined)
|
||||||
return bfd_reloc_undefined;
|
return bfd_reloc_other;
|
||||||
|
|
||||||
gp = (h->u.def.value
|
gp = (h->u.def.value
|
||||||
+ h->u.def.section->output_section->vma
|
+ h->u.def.section->output_section->vma
|
||||||
+ h->u.def.section->output_offset);
|
+ h->u.def.section->output_offset);
|
||||||
value -= gp;
|
|
||||||
|
value -= sym_sec->output_section->vma;
|
||||||
|
value -= (gp - sym_sec->output_section->vma);
|
||||||
|
value += (short) bfd_get_16 (input_bfd, hit_data);
|
||||||
|
|
||||||
if ((long)value > 0x7fff || (long)value < -0x8000)
|
if ((long)value > 0x7fff || (long)value < -0x8000)
|
||||||
return bfd_reloc_overflow;
|
return bfd_reloc_overflow;
|
||||||
|
@ -776,35 +1033,59 @@ v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
case R_V850_TDA_OFFSET:
|
case R_V850_SDA_15_16_OFFSET:
|
||||||
|
{
|
||||||
|
unsigned long gp;
|
||||||
|
struct bfd_link_hash_entry * h;
|
||||||
|
|
||||||
|
/* Get the value of __gp. */
|
||||||
|
h = bfd_link_hash_lookup (info->hash, "__gp", false, false, true);
|
||||||
|
if (h == (struct bfd_link_hash_entry *) NULL
|
||||||
|
|| h->type != bfd_link_hash_defined)
|
||||||
|
return bfd_reloc_other;
|
||||||
|
|
||||||
|
gp = (h->u.def.value
|
||||||
|
+ h->u.def.section->output_section->vma
|
||||||
|
+ h->u.def.section->output_offset);
|
||||||
|
|
||||||
|
value -= sym_sec->output_section->vma;
|
||||||
|
value -= (gp - sym_sec->output_section->vma);
|
||||||
|
|
||||||
|
insn = bfd_get_16 (input_bfd, hit_data);
|
||||||
|
|
||||||
|
value += ((insn & 0xfffe) << 1);
|
||||||
|
|
||||||
|
if ((long)value > 0x7ffe || (long)value < -0x8000)
|
||||||
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
|
value &= ~1;
|
||||||
|
value |= (insn & 1);
|
||||||
|
|
||||||
|
bfd_put_16 (input_bfd, value, hit_data);
|
||||||
|
return bfd_reloc_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
case R_V850_TDA_6_8_OFFSET:
|
||||||
{
|
{
|
||||||
unsigned long ep;
|
unsigned long ep;
|
||||||
struct bfd_link_hash_entry *h;
|
struct bfd_link_hash_entry * h;
|
||||||
|
|
||||||
insn = bfd_get_16 (input_bfd, hit_data);
|
insn = bfd_get_16 (input_bfd, hit_data);
|
||||||
|
|
||||||
/* Get the value of __ep. */
|
/* Get the value of __ep. */
|
||||||
h = bfd_link_hash_lookup (info->hash, "__ep", false,
|
h = bfd_link_hash_lookup (info->hash, "__ep", false, false, true);
|
||||||
false, true);
|
|
||||||
if (h == (struct bfd_link_hash_entry *) NULL
|
if (h == (struct bfd_link_hash_entry *) NULL
|
||||||
|| h->type != bfd_link_hash_defined)
|
|| h->type != bfd_link_hash_defined)
|
||||||
return bfd_reloc_undefined;
|
return bfd_reloc_continue; /* Actually this indicates that __ep could not be found. */
|
||||||
|
|
||||||
ep = (h->u.def.value
|
ep = (h->u.def.value
|
||||||
+ h->u.def.section->output_section->vma
|
+ h->u.def.section->output_section->vma
|
||||||
+ h->u.def.section->output_offset);
|
+ h->u.def.section->output_offset);
|
||||||
|
|
||||||
value -= ep;
|
value -= ep;
|
||||||
|
value += ((insn & 0x7e) << 2);
|
||||||
|
|
||||||
|
if ((long) value > 0xfc || (long) value < 0)
|
||||||
/* Overflow computation and operand insertion is complicated
|
|
||||||
by valid offsets and insertions changing depending on the
|
|
||||||
instruction being used! */
|
|
||||||
if ((insn & 0x0780) == 0x0500)
|
|
||||||
{
|
|
||||||
value += ((insn & 0x7f) << 1);
|
|
||||||
|
|
||||||
/* Handle sld.w and sst.w -- 8 bit unsigned offset */
|
|
||||||
if ((long) value > 0xff || (long) value < 0)
|
|
||||||
return bfd_reloc_overflow;
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
if ((value % 2) != 0)
|
if ((value % 2) != 0)
|
||||||
|
@ -812,50 +1093,183 @@ v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
|
|
||||||
insn &= 0xff81;
|
insn &= 0xff81;
|
||||||
insn |= (value >> 1);
|
insn |= (value >> 1);
|
||||||
|
|
||||||
bfd_put_16 (input_bfd, insn, hit_data);
|
bfd_put_16 (input_bfd, insn, hit_data);
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((insn & 0x0780) == 0x0400 || (insn & 0x0780) == 0x0480)
|
case R_V850_TDA_7_8_OFFSET:
|
||||||
{
|
{
|
||||||
|
unsigned long ep;
|
||||||
|
struct bfd_link_hash_entry * h;
|
||||||
|
|
||||||
|
insn = bfd_get_16 (input_bfd, hit_data);
|
||||||
|
|
||||||
|
/* Get the value of __ep. */
|
||||||
|
h = bfd_link_hash_lookup (info->hash, "__ep", false, false, true);
|
||||||
|
if (h == (struct bfd_link_hash_entry *) NULL
|
||||||
|
|| h->type != bfd_link_hash_defined)
|
||||||
|
return bfd_reloc_continue; /* Actually this indicates that __ep could not be found. */
|
||||||
|
|
||||||
|
ep = (h->u.def.value
|
||||||
|
+ h->u.def.section->output_section->vma
|
||||||
|
+ h->u.def.section->output_offset);
|
||||||
|
|
||||||
|
value -= ep;
|
||||||
value += ((insn & 0x7f) << 1);
|
value += ((insn & 0x7f) << 1);
|
||||||
|
|
||||||
/* Handle sld.h and sst.h -- 8 bit unsigned offset */
|
if ((long) value > 0xfe || (long) value < 0)
|
||||||
if ((long) value > 0xff || (long) value < 0)
|
|
||||||
return bfd_reloc_overflow;
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
if ((value % 2) != 0)
|
|
||||||
return bfd_reloc_dangerous;
|
|
||||||
|
|
||||||
insn &= 0xff80;
|
insn &= 0xff80;
|
||||||
insn |= (value >> 1);
|
insn |= (value >> 1);
|
||||||
|
|
||||||
bfd_put_16 (input_bfd, insn, hit_data);
|
bfd_put_16 (input_bfd, insn, hit_data);
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((insn & 0x0780) == 0x0300 || (insn & 0x0780) == 0x0380)
|
case R_V850_TDA_7_7_OFFSET:
|
||||||
{
|
{
|
||||||
value += (insn & 0x7f);
|
unsigned long ep;
|
||||||
|
struct bfd_link_hash_entry * h;
|
||||||
|
|
||||||
|
insn = bfd_get_16 (input_bfd, hit_data);
|
||||||
|
|
||||||
|
/* Get the value of __ep. */
|
||||||
|
h = bfd_link_hash_lookup (info->hash, "__ep", false, false, true);
|
||||||
|
if (h == (struct bfd_link_hash_entry *) NULL
|
||||||
|
|| h->type != bfd_link_hash_defined)
|
||||||
|
return bfd_reloc_continue; /* Actually this indicates that __ep could not be found. */
|
||||||
|
|
||||||
|
ep = (h->u.def.value
|
||||||
|
+ h->u.def.section->output_section->vma
|
||||||
|
+ h->u.def.section->output_offset);
|
||||||
|
value -= ep;
|
||||||
|
|
||||||
|
value += insn & 0x7f;
|
||||||
|
|
||||||
/* Handle sld.b and sst.b -- 7 bit unsigned offset */
|
|
||||||
if ((long) value > 0x7f || (long) value < 0)
|
if ((long) value > 0x7f || (long) value < 0)
|
||||||
return bfd_reloc_overflow;
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
insn &= 0xff80;
|
insn &= 0xff80;
|
||||||
insn |= value;
|
insn |= value;
|
||||||
bfd_put_16 (input_bfd, insn, hit_data);
|
bfd_put_16 (input_bfd, insn, hit_data);
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Guess (XXX) that it's a movea instruction or something
|
/* start-sanitize-v850e */
|
||||||
similar. */
|
case R_V850_TDA_4_5_OFFSET:
|
||||||
value += (short)insn;
|
{
|
||||||
|
unsigned long ep;
|
||||||
|
struct bfd_link_hash_entry * h;
|
||||||
|
|
||||||
|
/* Get the value of __ep. */
|
||||||
|
h = bfd_link_hash_lookup (info->hash, "__ep", false, false, true);
|
||||||
|
if (h == (struct bfd_link_hash_entry *) NULL
|
||||||
|
|| h->type != bfd_link_hash_defined)
|
||||||
|
return bfd_reloc_continue; /* Actually this indicates that __ep could not be found. */
|
||||||
|
|
||||||
|
ep = (h->u.def.value
|
||||||
|
+ h->u.def.section->output_section->vma
|
||||||
|
+ h->u.def.section->output_offset);
|
||||||
|
value -= ep;
|
||||||
|
|
||||||
|
insn = bfd_get_16 (input_bfd, hit_data);
|
||||||
|
|
||||||
|
value += ((insn & 0xf) << 1);
|
||||||
|
|
||||||
|
if ((long) value > 0x1e || (long) value < 0)
|
||||||
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
|
insn &= 0xfff0;
|
||||||
|
insn |= (value >> 1);
|
||||||
|
bfd_put_16 (input_bfd, insn, hit_data);
|
||||||
|
return bfd_reloc_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
case R_V850_TDA_4_4_OFFSET:
|
||||||
|
{
|
||||||
|
unsigned long ep;
|
||||||
|
struct bfd_link_hash_entry * h;
|
||||||
|
|
||||||
|
/* Get the value of __ep. */
|
||||||
|
h = bfd_link_hash_lookup (info->hash, "__ep", false, false, true);
|
||||||
|
if (h == (struct bfd_link_hash_entry *) NULL
|
||||||
|
|| h->type != bfd_link_hash_defined)
|
||||||
|
return bfd_reloc_continue; /* Actually this indicates that __ep could not be found. */
|
||||||
|
|
||||||
|
ep = (h->u.def.value
|
||||||
|
+ h->u.def.section->output_section->vma
|
||||||
|
+ h->u.def.section->output_offset);
|
||||||
|
value -= ep;
|
||||||
|
|
||||||
|
insn = bfd_get_16 (input_bfd, hit_data);
|
||||||
|
|
||||||
|
value += insn & 0xf;
|
||||||
|
|
||||||
|
if ((long) value > 0xf || (long) value < 0)
|
||||||
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
|
insn &= 0xfff0;
|
||||||
|
insn |= value;
|
||||||
|
bfd_put_16 (input_bfd, insn, hit_data);
|
||||||
|
return bfd_reloc_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
case R_V850_SDA_16_16_SPLIT_OFFSET:
|
||||||
|
{
|
||||||
|
unsigned long gp;
|
||||||
|
struct bfd_link_hash_entry * h;
|
||||||
|
|
||||||
|
/* Get the value of __gp. */
|
||||||
|
h = bfd_link_hash_lookup (info->hash, "__gp", false, false, true);
|
||||||
|
if (h == (struct bfd_link_hash_entry *) NULL
|
||||||
|
|| h->type != bfd_link_hash_defined)
|
||||||
|
return bfd_reloc_other;
|
||||||
|
|
||||||
|
gp = (h->u.def.value
|
||||||
|
+ h->u.def.section->output_section->vma
|
||||||
|
+ h->u.def.section->output_offset);
|
||||||
|
|
||||||
|
value -= sym_sec->output_section->vma;
|
||||||
|
value -= (gp - sym_sec->output_section->vma);
|
||||||
|
|
||||||
|
insn = bfd_get_32 (input_bfd, hit_data);
|
||||||
|
|
||||||
|
value += ((insn & 0xfffe0000) >> 16);
|
||||||
|
value += ((insn & 0x20) >> 5);
|
||||||
|
|
||||||
if ((long)value > 0x7fff || (long)value < -0x8000)
|
if ((long)value > 0x7fff || (long)value < -0x8000)
|
||||||
return bfd_reloc_overflow;
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
bfd_put_16 (input_bfd, value, hit_data);
|
insn &= 0x0001ffdf;
|
||||||
|
insn |= (value & 1) << 5;
|
||||||
|
insn |= (value & ~1) << 16;
|
||||||
|
|
||||||
|
bfd_put_32 (input_bfd, insn, hit_data);
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case R_V850_ZDA_16_16_SPLIT_OFFSET:
|
||||||
|
insn = bfd_get_32 (input_bfd, hit_data);
|
||||||
|
|
||||||
|
value -= sym_sec->output_section->vma;
|
||||||
|
value += ((insn & 0xfffe0000) >> 16);
|
||||||
|
value += ((insn & 0x20) >> 5);
|
||||||
|
|
||||||
|
if ((long)value > 0x7fff || (long)value < -0x8000)
|
||||||
|
return bfd_reloc_overflow;
|
||||||
|
|
||||||
|
insn &= 0x0001ffdf;
|
||||||
|
insn |= (value & 1) << 5;
|
||||||
|
insn |= (value & ~1) << 16;
|
||||||
|
|
||||||
|
bfd_put_32 (input_bfd, insn, hit_data);
|
||||||
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
|
/* end-sanitize-v850e */
|
||||||
|
|
||||||
|
|
||||||
case R_V850_NONE:
|
case R_V850_NONE:
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
|
|
||||||
|
@ -869,20 +1283,21 @@ v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
|
||||||
static boolean
|
static boolean
|
||||||
v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
contents, relocs, local_syms, local_sections)
|
contents, relocs, local_syms, local_sections)
|
||||||
bfd *output_bfd;
|
bfd * output_bfd;
|
||||||
struct bfd_link_info *info;
|
struct bfd_link_info * info;
|
||||||
bfd *input_bfd;
|
bfd * input_bfd;
|
||||||
asection *input_section;
|
asection * input_section;
|
||||||
bfd_byte *contents;
|
bfd_byte * contents;
|
||||||
Elf_Internal_Rela *relocs;
|
Elf_Internal_Rela * relocs;
|
||||||
Elf_Internal_Sym *local_syms;
|
Elf_Internal_Sym * local_syms;
|
||||||
asection **local_sections;
|
asection ** local_sections;
|
||||||
{
|
{
|
||||||
Elf_Internal_Shdr *symtab_hdr;
|
Elf_Internal_Shdr * symtab_hdr;
|
||||||
struct elf_link_hash_entry **sym_hashes;
|
struct elf_link_hash_entry ** sym_hashes;
|
||||||
Elf_Internal_Rela *rel, *relend;
|
Elf_Internal_Rela * rel;
|
||||||
|
Elf_Internal_Rela * relend;
|
||||||
|
|
||||||
symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
|
symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
|
||||||
sym_hashes = elf_sym_hashes (input_bfd);
|
sym_hashes = elf_sym_hashes (input_bfd);
|
||||||
|
|
||||||
rel = relocs;
|
rel = relocs;
|
||||||
|
@ -890,11 +1305,11 @@ v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
for (; rel < relend; rel++)
|
for (; rel < relend; rel++)
|
||||||
{
|
{
|
||||||
int r_type;
|
int r_type;
|
||||||
reloc_howto_type *howto;
|
reloc_howto_type * howto;
|
||||||
unsigned long r_symndx;
|
unsigned long r_symndx;
|
||||||
Elf_Internal_Sym *sym;
|
Elf_Internal_Sym * sym;
|
||||||
asection *sec;
|
asection * sec;
|
||||||
struct elf_link_hash_entry *h;
|
struct elf_link_hash_entry * h;
|
||||||
bfd_vma relocation;
|
bfd_vma relocation;
|
||||||
bfd_reloc_status_type r;
|
bfd_reloc_status_type r;
|
||||||
|
|
||||||
|
@ -932,13 +1347,24 @@ v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
relocation = (sec->output_section->vma
|
relocation = (sec->output_section->vma
|
||||||
+ sec->output_offset
|
+ sec->output_offset
|
||||||
+ sym->st_value);
|
+ sym->st_value);
|
||||||
|
#if 0
|
||||||
|
{
|
||||||
|
char * name;
|
||||||
|
name = bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link, sym->st_name);
|
||||||
|
name = (name == NULL) ? "<none>" : name;
|
||||||
|
fprintf (stderr, "local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x rel %x\n", sec->name, name, sym->st_name,
|
||||||
|
sec->output_section->vma, sec->output_offset, sym->st_value, rel->r_addend, rel);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||||
|
|
||||||
while (h->root.type == bfd_link_hash_indirect
|
while (h->root.type == bfd_link_hash_indirect
|
||||||
|| h->root.type == bfd_link_hash_warning)
|
|| h->root.type == bfd_link_hash_warning)
|
||||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||||
|
|
||||||
if (h->root.type == bfd_link_hash_defined
|
if (h->root.type == bfd_link_hash_defined
|
||||||
|| h->root.type == bfd_link_hash_defweak)
|
|| h->root.type == bfd_link_hash_defweak)
|
||||||
{
|
{
|
||||||
|
@ -969,8 +1395,8 @@ v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
|
|
||||||
if (r != bfd_reloc_ok)
|
if (r != bfd_reloc_ok)
|
||||||
{
|
{
|
||||||
const char *name;
|
const char * name;
|
||||||
const char *msg = (const char *)0;
|
const char * msg = (const char *)0;
|
||||||
|
|
||||||
if (h != NULL)
|
if (h != NULL)
|
||||||
name = h->root.root.string;
|
name = h->root.root.string;
|
||||||
|
@ -992,6 +1418,7 @@ v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case bfd_reloc_undefined:
|
case bfd_reloc_undefined:
|
||||||
|
fprintf (stderr, "undef2 %s\n", name );
|
||||||
if (! ((*info->callbacks->undefined_symbol)
|
if (! ((*info->callbacks->undefined_symbol)
|
||||||
(info, name, input_bfd, input_section,
|
(info, name, input_bfd, input_section,
|
||||||
rel->r_offset)))
|
rel->r_offset)))
|
||||||
|
@ -1007,7 +1434,15 @@ v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
goto common_error;
|
goto common_error;
|
||||||
|
|
||||||
case bfd_reloc_dangerous:
|
case bfd_reloc_dangerous:
|
||||||
msg = "internal error: dangerous error";
|
msg = "internal error: dangerous relocation";
|
||||||
|
goto common_error;
|
||||||
|
|
||||||
|
case bfd_reloc_other:
|
||||||
|
msg = "could not locate special linker symbol __gp";
|
||||||
|
goto common_error;
|
||||||
|
|
||||||
|
case bfd_reloc_continue:
|
||||||
|
msg = "could not locate special linker symbol __ep";
|
||||||
goto common_error;
|
goto common_error;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -1054,10 +1489,12 @@ v850_elf_object_p (abfd)
|
||||||
/* start-sanitize-v850e */
|
/* start-sanitize-v850e */
|
||||||
#undef ELF_MACHINE_CODE
|
#undef ELF_MACHINE_CODE
|
||||||
#define ELF_MACHINE_CODE EM_CYGNUS_V850E
|
#define ELF_MACHINE_CODE EM_CYGNUS_V850E
|
||||||
|
#define ELF_MACHINE_ALT1 EM_CYGNUS_V850
|
||||||
/* end-sanitize-v850e */
|
/* end-sanitize-v850e */
|
||||||
/* start-sanitize-v850eq */
|
/* start-sanitize-v850eq */
|
||||||
#undef ELF_MACHINE_CODE
|
#undef ELF_MACHINE_CODE
|
||||||
#define ELF_MACHINE_CODE EM_CYGNUS_V850EQ
|
#define ELF_MACHINE_CODE EM_CYGNUS_V850EQ
|
||||||
|
#define ELF_MACHINE_ALT2 EM_CYGNUS_V850E
|
||||||
/* end-sanitize-v850eq */
|
/* end-sanitize-v850eq */
|
||||||
|
|
||||||
#define ELF_MAXPAGESIZE 0x1000
|
#define ELF_MAXPAGESIZE 0x1000
|
||||||
|
|
17
bfd/libbfd.h
17
bfd/libbfd.h
|
@ -770,10 +770,21 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
|
||||||
"BFD_RELOC_M32R_SDA16",
|
"BFD_RELOC_M32R_SDA16",
|
||||||
/* start-sanitize-v850 */
|
/* start-sanitize-v850 */
|
||||||
"BFD_RELOC_V850_9_PCREL",
|
"BFD_RELOC_V850_9_PCREL",
|
||||||
|
"BFD_RELOC_V850_16_PCREL",
|
||||||
"BFD_RELOC_V850_22_PCREL",
|
"BFD_RELOC_V850_22_PCREL",
|
||||||
"BFD_RELOC_V850_SDA_OFFSET",
|
"BFD_RELOC_V850_SDA_16_16_OFFSET",
|
||||||
"BFD_RELOC_V850_ZDA_OFFSET",
|
"BFD_RELOC_V850_SDA_15_16_OFFSET",
|
||||||
"BFD_RELOC_V850_TDA_OFFSET",
|
"BFD_RELOC_V850_ZDA_16_16_OFFSET",
|
||||||
|
"BFD_RELOC_V850_ZDA_15_16_OFFSET",
|
||||||
|
"BFD_RELOC_V850_TDA_6_8_OFFSET",
|
||||||
|
"BFD_RELOC_V850_TDA_7_8_OFFSET",
|
||||||
|
"BFD_RELOC_V850_TDA_7_7_OFFSET",
|
||||||
|
/* start-sanitize-v850e */
|
||||||
|
"BFD_RELOC_V850_TDA_4_5_OFFSET",
|
||||||
|
"BFD_RELOC_V850_TDA_4_4_OFFSET",
|
||||||
|
"BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET",
|
||||||
|
"BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET",
|
||||||
|
/* end-santize-v850e */
|
||||||
/* end-sanitize-v850 */
|
/* end-sanitize-v850 */
|
||||||
|
|
||||||
"BFD_RELOC_MN10300_32_PCREL",
|
"BFD_RELOC_MN10300_32_PCREL",
|
||||||
|
|
55
bfd/reloc.c
55
bfd/reloc.c
|
@ -983,6 +983,7 @@ bfd_install_relocation (abfd, reloc_entry, data_start, data_start_offset,
|
||||||
if (howto->special_function)
|
if (howto->special_function)
|
||||||
{
|
{
|
||||||
bfd_reloc_status_type cont;
|
bfd_reloc_status_type cont;
|
||||||
|
|
||||||
/* XXX - The special_function calls haven't been fixed up to deal
|
/* XXX - The special_function calls haven't been fixed up to deal
|
||||||
with creating new relocations and section contents. */
|
with creating new relocations and section contents. */
|
||||||
cont = howto->special_function (abfd, reloc_entry, symbol,
|
cont = howto->special_function (abfd, reloc_entry, symbol,
|
||||||
|
@ -1007,7 +1008,6 @@ bfd_install_relocation (abfd, reloc_entry, data_start, data_start_offset,
|
||||||
else
|
else
|
||||||
relocation = symbol->value;
|
relocation = symbol->value;
|
||||||
|
|
||||||
|
|
||||||
reloc_target_output_section = symbol->section->output_section;
|
reloc_target_output_section = symbol->section->output_section;
|
||||||
|
|
||||||
/* Convert input-section-relative symbol value to absolute. */
|
/* Convert input-section-relative symbol value to absolute. */
|
||||||
|
@ -2355,22 +2355,63 @@ ENUM
|
||||||
BFD_RELOC_V850_9_PCREL
|
BFD_RELOC_V850_9_PCREL
|
||||||
ENUMDOC
|
ENUMDOC
|
||||||
This is a 9-bit reloc
|
This is a 9-bit reloc
|
||||||
|
ENUM
|
||||||
|
BFD_RELOC_V850_16_PCREL
|
||||||
|
ENUMDOC
|
||||||
|
This is a 16-bit reloc
|
||||||
ENUM
|
ENUM
|
||||||
BFD_RELOC_V850_22_PCREL
|
BFD_RELOC_V850_22_PCREL
|
||||||
ENUMDOC
|
ENUMDOC
|
||||||
This is a 22-bit reloc
|
This is a 22-bit reloc
|
||||||
|
|
||||||
ENUM
|
ENUM
|
||||||
BFD_RELOC_V850_SDA_OFFSET
|
BFD_RELOC_V850_SDA_16_16_OFFSET,
|
||||||
ENUMDOC
|
ENUMDOC
|
||||||
This is an offset from the short data area pointer..
|
This is a 16 bit offset from the short data area pointer..
|
||||||
ENUM
|
ENUM
|
||||||
BFD_RELOC_V850_ZDA_OFFSET
|
BFD_RELOC_V850_SDA_15_16_OFFSET,
|
||||||
ENUMDOC
|
ENUMDOC
|
||||||
This is an offset from the zero data area pointer..
|
This is a 16 bit offset (of which only 15 bits are used) from the short data area pointer..
|
||||||
ENUM
|
ENUM
|
||||||
BFD_RELOC_V850_TDA_OFFSET
|
BFD_RELOC_V850_ZDA_16_16_OFFSET,
|
||||||
ENUMDOC
|
ENUMDOC
|
||||||
This is an offset from the tiny data area pointer..
|
This is a 16 bit offset from the zero data area pointer..
|
||||||
|
ENUM
|
||||||
|
BFD_RELOC_V850_ZDA_15_16_OFFSET,
|
||||||
|
ENUMDOC
|
||||||
|
This is a 16 bit offset (of which only 15 bits are used) from the zero data area pointer..
|
||||||
|
ENUM
|
||||||
|
BFD_RELOC_V850_TDA_6_8_OFFSET,
|
||||||
|
ENUMDOC
|
||||||
|
This is an 8 bit offset (of which only 6 bits are used) from the tiny data area pointer..
|
||||||
|
ENUM
|
||||||
|
BFD_RELOC_V850_TDA_7_8_OFFSET,
|
||||||
|
ENUMDOC
|
||||||
|
This is an 8bit offset (of which only 7 bits are used) from the tiny data area pointer..
|
||||||
|
ENUM
|
||||||
|
BFD_RELOC_V850_TDA_7_7_OFFSET,
|
||||||
|
ENUMDOC
|
||||||
|
This is a 7 bit offset from the tiny data area pointer..
|
||||||
|
COMMENT
|
||||||
|
{* start-sanitize-v850e *}
|
||||||
|
ENUM
|
||||||
|
BFD_RELOC_V850_TDA_4_5_OFFSET,
|
||||||
|
ENUMDOC
|
||||||
|
This is a 5 bit offset (of which only 4 bits are used) from the tiny data area pointer..
|
||||||
|
ENUM
|
||||||
|
BFD_RELOC_V850_TDA_4_4_OFFSET,
|
||||||
|
ENUMDOC
|
||||||
|
This is a 4 bit offset from the tiny data area pointer..
|
||||||
|
ENUM
|
||||||
|
BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET,
|
||||||
|
ENUMDOC
|
||||||
|
This is a 16 bit offset from the short data area pointer, with the bits placed non-contigously in the instruction..
|
||||||
|
ENUM
|
||||||
|
BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET,
|
||||||
|
ENUMDOC
|
||||||
|
This is a 16 bit offset from the zero data area pointer, with the bits placed non-contigously in the instruction..
|
||||||
|
COMMENT
|
||||||
|
{* end-santize-v850e *}
|
||||||
COMMENT
|
COMMENT
|
||||||
{* end-sanitize-v850 *}
|
{* end-sanitize-v850 *}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue