[ARC] 24 bit reloc and overflow detection fix.

bfd/
2016-04-05  Cupertino Miranda  <cmiranda@synopsys.com>

	* elf32-arc.c (name_for_global_symbol): Changed assert.
	(get_replace_function): Created.:
	(struct arc_relocation_data): Changed to signed types.
	(defines S, L, P, PDATA): Casted to signed type.
	(defines SECTSTART, _SDA_BASE_, TLS_REL): Likewise.
	(PRINT_DEBUG_RELOC_INFO_BEFORE): Changed.
	(arc_do_relocation): Changed.

include/
2016-04-05  Cupertino Miranda  <cmiranda@synopsys.com>

	* opcode/arc-func.h (replace_bits24): Changed.
	(replace_bits24_be): Created.
This commit is contained in:
Claudiu Zissulescu 2016-04-05 17:05:09 +02:00
parent 589a7d8830
commit 094fb06395
4 changed files with 80 additions and 30 deletions

View file

@ -1,3 +1,13 @@
2016-04-05 Cupertino Miranda <cmiranda@synopsys.com>
* elf32-arc.c (name_for_global_symbol): Changed assert.
(get_replace_function): Created.:
(struct arc_relocation_data): Changed to signed types.
(defines S, L, P, PDATA): Casted to signed type.
(defines SECTSTART, _SDA_BASE_, TLS_REL): Likewise.
(PRINT_DEBUG_RELOC_INFO_BEFORE): Changed.
(arc_do_relocation): Changed.
2016-04-05 Cupertino Miranda <cmiranda@synopsys.com> 2016-04-05 Cupertino Miranda <cmiranda@synopsys.com>
* elf32-arc.c (name_for_global_symbol): Added assert to check for * elf32-arc.c (name_for_global_symbol): Added assert to check for

View file

@ -375,6 +375,29 @@ static const struct arc_reloc_map arc_reloc_map[] =
}; };
#undef ARC_RELOC_HOWTO #undef ARC_RELOC_HOWTO
typedef ATTRIBUTE_UNUSED bfd_vma (*replace_func) (unsigned, int ATTRIBUTE_UNUSED);
#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
case TYPE: \
func = (void *) RELOC_FUNCTION; \
break;
static replace_func
get_replace_function (bfd *abfd, unsigned int r_type)
{
void *func = NULL;
switch (r_type)
{
#include "elf/arc-reloc.def"
}
if (func == replace_bits24 && bfd_big_endian (abfd))
return (replace_func) replace_bits24_be;
return (replace_func) func;
}
#undef ARC_RELOC_HOWTO
static reloc_howto_type * static reloc_howto_type *
arc_elf32_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, arc_elf32_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
bfd_reloc_code_real_type code) bfd_reloc_code_real_type code)
@ -683,20 +706,20 @@ arc_elf_final_write_processing (bfd * abfd,
struct arc_relocation_data struct arc_relocation_data
{ {
bfd_vma reloc_offset; bfd_signed_vma reloc_offset;
bfd_vma reloc_addend; bfd_signed_vma reloc_addend;
bfd_vma got_offset_value; bfd_signed_vma got_offset_value;
bfd_vma sym_value; bfd_signed_vma sym_value;
asection * sym_section; asection * sym_section;
reloc_howto_type *howto; reloc_howto_type *howto;
asection * input_section; asection * input_section;
bfd_vma sdata_begin_symbol_vma; bfd_signed_vma sdata_begin_symbol_vma;
bfd_boolean sdata_begin_symbol_vma_set; bfd_boolean sdata_begin_symbol_vma_set;
bfd_vma got_symbol_vma; bfd_signed_vma got_symbol_vma;
bfd_boolean should_relocate; bfd_boolean should_relocate;
}; };
@ -770,16 +793,14 @@ middle_endian_convert (bfd_vma insn, bfd_boolean do_it)
#define IS_ME(FORMULA,BFD) ((strstr (FORMULA, "ME") != NULL) \ #define IS_ME(FORMULA,BFD) ((strstr (FORMULA, "ME") != NULL) \
&& (!bfd_big_endian (BFD))) && (!bfd_big_endian (BFD)))
#define S (reloc_data.sym_value \ #define S ((bfd_signed_vma) (reloc_data.sym_value \
+ (reloc_data.sym_section->output_section != NULL ? \ + (reloc_data.sym_section->output_section != NULL ? \
(reloc_data.sym_section->output_offset \ (reloc_data.sym_section->output_offset \
+ reloc_data.sym_section->output_section->vma) : 0) \ + reloc_data.sym_section->output_section->vma) : 0)))
) #define L ((bfd_signed_vma) (reloc_data.sym_value \
#define L (reloc_data.sym_value \
+ (reloc_data.sym_section->output_section != NULL ? \ + (reloc_data.sym_section->output_section != NULL ? \
(reloc_data.sym_section->output_offset \ (reloc_data.sym_section->output_offset \
+ reloc_data.sym_section->output_section->vma) : 0) \ + reloc_data.sym_section->output_section->vma) : 0)))
)
#define A (reloc_data.reloc_addend) #define A (reloc_data.reloc_addend)
#define B (0) #define B (0)
#define G (reloc_data.got_offset_value) #define G (reloc_data.got_offset_value)
@ -789,33 +810,32 @@ middle_endian_convert (bfd_vma insn, bfd_boolean do_it)
#define MES (0) #define MES (0)
/* P: relative offset to PCL The offset should be to the /* P: relative offset to PCL The offset should be to the
current location aligned to 32 bits. */ current location aligned to 32 bits. */
#define P ( \ #define P ((bfd_signed_vma) ( \
( \ ( \
(reloc_data.input_section->output_section != NULL ? \ (reloc_data.input_section->output_section != NULL ? \
reloc_data.input_section->output_section->vma : 0) \ reloc_data.input_section->output_section->vma : 0) \
+ reloc_data.input_section->output_offset \ + reloc_data.input_section->output_offset \
+ (reloc_data.reloc_offset - (bitsize >= 32 ? 4 : 0)) \ + (reloc_data.reloc_offset - (bitsize >= 32 ? 4 : 0))) \
) & ~0x3) & ~0x3))
#define PDATA ( \ #define PDATA ((bfd_signed_vma) ( \
(reloc_data.input_section->output_section->vma \ (reloc_data.input_section->output_section->vma \
+ reloc_data.input_section->output_offset \ + reloc_data.input_section->output_offset \
+ (reloc_data.reloc_offset) \ + (reloc_data.reloc_offset))))
)) #define SECTSTART (bfd_signed_vma) (reloc_data.input_section->output_offset)
#define SECTSTAR (reloc_data.input_section->output_offset) #define _SDA_BASE_ (bfd_signed_vma) (reloc_data.sdata_begin_symbol_vma)
#define SECTSTART (reloc_data.input_section->output_offset) #define TLS_REL (bfd_signed_vma) \
#define _SDA_BASE_ (reloc_data.sdata_begin_symbol_vma) ((elf_hash_table (info))->tls_sec->output_section->vma)
#define TLS_REL ((elf_hash_table (info))->tls_sec->output_section->vma)
#define _SDA_BASE_ (reloc_data.sdata_begin_symbol_vma)
#define TLS_TBSS (8) #define TLS_TBSS (8)
#define TCB_SIZE (8) #define TCB_SIZE (8)
#define none (0) #define none (0)
#define PRINT_DEBUG_RELOC_INFO_BEFORE(FORMULA) \ #define PRINT_DEBUG_RELOC_INFO_BEFORE(FORMULA, TYPE) \
{\ {\
asection *sym_section = reloc_data.sym_section; \ asection *sym_section = reloc_data.sym_section; \
asection *input_section = reloc_data.input_section; \ asection *input_section = reloc_data.input_section; \
ARC_DEBUG ("FORMULA = " #FORMULA "\n"); \ ARC_DEBUG ("RELOC_TYPE = " TYPE "\n"); \
ARC_DEBUG ("FORMULA = " FORMULA "\n"); \
ARC_DEBUG ("S = 0x%x\n", S); \ ARC_DEBUG ("S = 0x%x\n", S); \
ARC_DEBUG ("A = 0x%x\n", A); \ ARC_DEBUG ("A = 0x%x\n", A); \
ARC_DEBUG ("L = 0x%x\n", L); \ ARC_DEBUG ("L = 0x%x\n", L); \
@ -856,11 +876,11 @@ middle_endian_convert (bfd_vma insn, bfd_boolean do_it)
#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \ #define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
case R_##TYPE: \ case R_##TYPE: \
{ \ { \
bfd_vma bitsize ATTRIBUTE_UNUSED = BITSIZE; \ bfd_signed_vma bitsize ATTRIBUTE_UNUSED = BITSIZE; \
relocation = FORMULA ; \ relocation = FORMULA ; \
PRINT_DEBUG_RELOC_INFO_BEFORE(FORMULA) \ PRINT_DEBUG_RELOC_INFO_BEFORE (#FORMULA, #TYPE); \
insn = middle_endian_convert (insn, IS_ME (#FORMULA, abfd)); \ insn = middle_endian_convert (insn, IS_ME (#FORMULA, abfd)); \
insn = RELOC_FUNCTION (insn, relocation); \ insn = (* get_replace_function (abfd, TYPE)) (insn, relocation); \
insn = middle_endian_convert (insn, IS_ME (#FORMULA, abfd)); \ insn = middle_endian_convert (insn, IS_ME (#FORMULA, abfd)); \
PRINT_DEBUG_RELOC_INFO_AFTER \ PRINT_DEBUG_RELOC_INFO_AFTER \
} \ } \
@ -871,7 +891,7 @@ arc_do_relocation (bfd_byte * contents,
struct arc_relocation_data reloc_data, struct arc_relocation_data reloc_data,
struct bfd_link_info *info) struct bfd_link_info *info)
{ {
bfd_vma relocation = 0; bfd_signed_vma relocation = 0;
bfd_vma insn; bfd_vma insn;
bfd_vma orig_insn ATTRIBUTE_UNUSED; bfd_vma orig_insn ATTRIBUTE_UNUSED;
bfd * abfd = reloc_data.input_section->owner; bfd * abfd = reloc_data.input_section->owner;

View file

@ -1,3 +1,8 @@
2016-04-05 Cupertino Miranda <cmiranda@synopsys.com>
* opcode/arc-func.h (replace_bits24): Changed.
(replace_bits24_be): Created.
2016-03-29 Claudiu Zissulescu <claziss@synopsys.com> 2016-03-29 Claudiu Zissulescu <claziss@synopsys.com>
* opcode/arc.h (insn_subclass_t): Add QUARKSE subclass. * opcode/arc.h (insn_subclass_t): Add QUARKSE subclass.

View file

@ -65,6 +65,21 @@ replace_bits16 (unsigned insn, int value ATTRIBUTE_UNUSED)
#define REPLACE_bits24 #define REPLACE_bits24
ATTRIBUTE_UNUSED static unsigned ATTRIBUTE_UNUSED static unsigned
replace_bits24 (unsigned insn, int value ATTRIBUTE_UNUSED) replace_bits24 (unsigned insn, int value ATTRIBUTE_UNUSED)
{
insn = insn & ~0xffffff;
insn |= ((value >> 0) & 0xffffff) << 0;
return insn;
}
#endif /* REPLACE_bits24 */
/* Special 24 bit replace for big endian. */
/* mask = 111111111111111111111111. */
#ifndef REPLACE_bits24_be
#define REPLACE_bits24_be
ATTRIBUTE_UNUSED static unsigned
replace_bits24_be (unsigned insn, int value ATTRIBUTE_UNUSED)
{ {
insn = insn & ~0xffffff00; insn = insn & ~0xffffff00;
insn |= ((value >> 0) & 0xffffff) << 8; insn |= ((value >> 0) & 0xffffff) << 8;
@ -72,7 +87,7 @@ replace_bits24 (unsigned insn, int value ATTRIBUTE_UNUSED)
return insn; return insn;
} }
#endif /* REPLACE_bits24 */ #endif /* REPLACE_bits24_be */
/* mask = 11111111111111111111111111111111. */ /* mask = 11111111111111111111111111111111. */
#ifndef REPLACE_word32 #ifndef REPLACE_word32