Add support for M32R GOT relocs
This commit is contained in:
parent
e19f872c5b
commit
097f809a19
@ -1,3 +1,14 @@
|
|||||||
|
2004-06-25 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
|
||||||
|
|
||||||
|
* elf32-m32r.c (m32r_elf_howto_table): Support R_M32R_GOTOFF.
|
||||||
|
(m32r_elf_relocate_section): Changed for R_M32R_GOTOFF.
|
||||||
|
(m32r_elf_gcsweep_hook): Likewise.
|
||||||
|
(m32r_elf_check_relocs): Likewise.
|
||||||
|
(m32r_elf_howto_table): Added R_M32R_GOTOFF_HI_ULO,
|
||||||
|
R_M32R_GOTOFF_HI_SLO and R_M32R_GOTOFF_LO.
|
||||||
|
* reloc.c: Added BFD_RELOC_M32R_GOTOFF_HI_ULO,
|
||||||
|
BFD_RELOC_M32R_GOTOFF_HI_SLO and BFD_RELOC_M32R_GOTOFF_LO.
|
||||||
|
|
||||||
2004-06-24 H.J. Lu <hongjiu.lu@intel.com>
|
2004-06-24 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* elf64-x86-64.c (elf64_x86_64_check_relocs): Warn overflow
|
* elf64-x86-64.c (elf64_x86_64_check_relocs): Warn overflow
|
||||||
|
@ -2821,6 +2821,9 @@ add3, load, and store instructions. */
|
|||||||
BFD_RELOC_M32R_JMP_SLOT,
|
BFD_RELOC_M32R_JMP_SLOT,
|
||||||
BFD_RELOC_M32R_RELATIVE,
|
BFD_RELOC_M32R_RELATIVE,
|
||||||
BFD_RELOC_M32R_GOTOFF,
|
BFD_RELOC_M32R_GOTOFF,
|
||||||
|
BFD_RELOC_M32R_GOTOFF_HI_ULO,
|
||||||
|
BFD_RELOC_M32R_GOTOFF_HI_SLO,
|
||||||
|
BFD_RELOC_M32R_GOTOFF_LO,
|
||||||
BFD_RELOC_M32R_GOTPC24,
|
BFD_RELOC_M32R_GOTPC24,
|
||||||
BFD_RELOC_M32R_GOT16_HI_ULO,
|
BFD_RELOC_M32R_GOT16_HI_ULO,
|
||||||
BFD_RELOC_M32R_GOT16_HI_SLO,
|
BFD_RELOC_M32R_GOT16_HI_SLO,
|
||||||
|
@ -678,15 +678,15 @@ static reloc_howto_type m32r_elf_howto_table[] =
|
|||||||
HOWTO (R_M32R_GOTOFF, /* type */
|
HOWTO (R_M32R_GOTOFF, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
32, /* bitsize */
|
24, /* bitsize */
|
||||||
FALSE, /* pc_relative */
|
FALSE, /* pc_relative */
|
||||||
0, /* bitpos */
|
0, /* bitpos */
|
||||||
complain_overflow_bitfield, /* complain_on_overflow */
|
complain_overflow_bitfield, /* complain_on_overflow */
|
||||||
bfd_elf_generic_reloc, /* special_function */
|
bfd_elf_generic_reloc, /* special_function */
|
||||||
"R_M32R_GOTOFF", /* name */
|
"R_M32R_GOTOFF", /* name */
|
||||||
FALSE, /* partial_inplace */
|
FALSE, /* partial_inplace */
|
||||||
0xffffffff, /* src_mask */
|
0xffffff, /* src_mask */
|
||||||
0xffffffff, /* dst_mask */
|
0xffffff, /* dst_mask */
|
||||||
FALSE), /* pcrel_offset */
|
FALSE), /* pcrel_offset */
|
||||||
|
|
||||||
/* An PC Relative 24-bit relocation used when setting PIC offset
|
/* An PC Relative 24-bit relocation used when setting PIC offset
|
||||||
@ -803,6 +803,48 @@ static reloc_howto_type m32r_elf_howto_table[] =
|
|||||||
0x0000ffff, /* src_mask */
|
0x0000ffff, /* src_mask */
|
||||||
0x0000ffff, /* dst_mask */
|
0x0000ffff, /* dst_mask */
|
||||||
TRUE), /* pcrel_offset */
|
TRUE), /* pcrel_offset */
|
||||||
|
|
||||||
|
HOWTO (R_M32R_GOTOFF_HI_ULO, /* type */
|
||||||
|
16, /* rightshift */
|
||||||
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
16, /* bitsize */
|
||||||
|
FALSE, /* pc_relative */
|
||||||
|
0, /* bitpos */
|
||||||
|
complain_overflow_dont, /* complain_on_overflow */
|
||||||
|
bfd_elf_generic_reloc, /* special_function */
|
||||||
|
"R_M32R_GOTOFF_HI_ULO",/* name */
|
||||||
|
FALSE, /* partial_inplace */
|
||||||
|
0x0000ffff, /* src_mask */
|
||||||
|
0x0000ffff, /* dst_mask */
|
||||||
|
FALSE), /* pcrel_offset */
|
||||||
|
|
||||||
|
HOWTO (R_M32R_GOTOFF_HI_SLO, /* type */
|
||||||
|
16, /* rightshift */
|
||||||
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
16, /* bitsize */
|
||||||
|
FALSE, /* pc_relative */
|
||||||
|
0, /* bitpos */
|
||||||
|
complain_overflow_dont, /* complain_on_overflow */
|
||||||
|
bfd_elf_generic_reloc, /* special_function */
|
||||||
|
"R_M32R_GOTOFF_HI_SLO",/* name */
|
||||||
|
FALSE, /* partial_inplace */
|
||||||
|
0x0000ffff, /* src_mask */
|
||||||
|
0x0000ffff, /* dst_mask */
|
||||||
|
FALSE), /* pcrel_offset */
|
||||||
|
|
||||||
|
HOWTO (R_M32R_GOTOFF_LO, /* type */
|
||||||
|
0, /* rightshift */
|
||||||
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
|
16, /* bitsize */
|
||||||
|
FALSE, /* pc_relative */
|
||||||
|
0, /* bitpos */
|
||||||
|
complain_overflow_dont, /* complain_on_overflow */
|
||||||
|
bfd_elf_generic_reloc, /* special_function */
|
||||||
|
"R_M32R_GOTOFF_LO", /* name */
|
||||||
|
FALSE, /* partial_inplace */
|
||||||
|
0x0000ffff, /* src_mask */
|
||||||
|
0x0000ffff, /* dst_mask */
|
||||||
|
FALSE), /* pcrel_offset */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Handle the R_M32R_10_PCREL reloc. */
|
/* Handle the R_M32R_10_PCREL reloc. */
|
||||||
@ -1269,6 +1311,9 @@ static const struct m32r_reloc_map m32r_reloc_map[] =
|
|||||||
{ BFD_RELOC_M32R_GOTPC_HI_ULO, R_M32R_GOTPC_HI_ULO },
|
{ BFD_RELOC_M32R_GOTPC_HI_ULO, R_M32R_GOTPC_HI_ULO },
|
||||||
{ BFD_RELOC_M32R_GOTPC_HI_SLO, R_M32R_GOTPC_HI_SLO },
|
{ BFD_RELOC_M32R_GOTPC_HI_SLO, R_M32R_GOTPC_HI_SLO },
|
||||||
{ BFD_RELOC_M32R_GOTPC_LO, R_M32R_GOTPC_LO },
|
{ BFD_RELOC_M32R_GOTPC_LO, R_M32R_GOTPC_LO },
|
||||||
|
{ BFD_RELOC_M32R_GOTOFF_HI_ULO, R_M32R_GOTOFF_HI_ULO },
|
||||||
|
{ BFD_RELOC_M32R_GOTOFF_HI_SLO, R_M32R_GOTOFF_HI_SLO },
|
||||||
|
{ BFD_RELOC_M32R_GOTOFF_LO, R_M32R_GOTOFF_LO },
|
||||||
};
|
};
|
||||||
|
|
||||||
static reloc_howto_type *
|
static reloc_howto_type *
|
||||||
@ -2796,6 +2841,31 @@ m32r_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
|||||||
|
|
||||||
switch ((int) r_type)
|
switch ((int) r_type)
|
||||||
{
|
{
|
||||||
|
case R_M32R_GOTOFF:
|
||||||
|
/* Relocation is relative to the start of the global offset
|
||||||
|
table (for ld24 rx, #uimm24). eg access at label+addend
|
||||||
|
|
||||||
|
ld24 rx. #label@GOTOFF + addend
|
||||||
|
sub rx, r12. */
|
||||||
|
|
||||||
|
BFD_ASSERT (sgot != NULL);
|
||||||
|
|
||||||
|
relocation = -(relocation - sgot->output_section->vma);
|
||||||
|
rel->r_addend = -rel->r_addend;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case R_M32R_GOTOFF_HI_ULO:
|
||||||
|
case R_M32R_GOTOFF_HI_SLO:
|
||||||
|
case R_M32R_GOTOFF_LO:
|
||||||
|
BFD_ASSERT (sgot != NULL);
|
||||||
|
|
||||||
|
relocation -= sgot->output_section->vma;
|
||||||
|
|
||||||
|
if ((r_type == R_M32R_GOTOFF_HI_SLO)
|
||||||
|
&& ((relocation + rel->r_addend) & 0x8000))
|
||||||
|
rel->r_addend += 0x10000;
|
||||||
|
break;
|
||||||
|
|
||||||
case R_M32R_GOTPC24:
|
case R_M32R_GOTPC24:
|
||||||
/* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
|
/* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
|
||||||
ld24 rx,#_GLOBAL_OFFSET_TABLE_
|
ld24 rx,#_GLOBAL_OFFSET_TABLE_
|
||||||
@ -4306,6 +4376,10 @@ m32r_elf_gc_sweep_hook (abfd, info, sec, relocs)
|
|||||||
case R_M32R_GOT16_HI_ULO:
|
case R_M32R_GOT16_HI_ULO:
|
||||||
case R_M32R_GOT16_HI_SLO:
|
case R_M32R_GOT16_HI_SLO:
|
||||||
case R_M32R_GOT16_LO:
|
case R_M32R_GOT16_LO:
|
||||||
|
case R_M32R_GOTOFF:
|
||||||
|
case R_M32R_GOTOFF_HI_ULO:
|
||||||
|
case R_M32R_GOTOFF_HI_SLO:
|
||||||
|
case R_M32R_GOTOFF_LO:
|
||||||
case R_M32R_GOT24:
|
case R_M32R_GOT24:
|
||||||
case R_M32R_GOTPC_HI_ULO:
|
case R_M32R_GOTPC_HI_ULO:
|
||||||
case R_M32R_GOTPC_HI_SLO:
|
case R_M32R_GOTPC_HI_SLO:
|
||||||
@ -4435,6 +4509,10 @@ m32r_elf_check_relocs (abfd, info, sec, relocs)
|
|||||||
{
|
{
|
||||||
case R_M32R_GOT16_HI_ULO:
|
case R_M32R_GOT16_HI_ULO:
|
||||||
case R_M32R_GOT16_HI_SLO:
|
case R_M32R_GOT16_HI_SLO:
|
||||||
|
case R_M32R_GOTOFF:
|
||||||
|
case R_M32R_GOTOFF_HI_ULO:
|
||||||
|
case R_M32R_GOTOFF_HI_SLO:
|
||||||
|
case R_M32R_GOTOFF_LO:
|
||||||
case R_M32R_GOT16_LO:
|
case R_M32R_GOT16_LO:
|
||||||
case R_M32R_GOTPC24:
|
case R_M32R_GOTPC24:
|
||||||
case R_M32R_GOTPC_HI_ULO:
|
case R_M32R_GOTPC_HI_ULO:
|
||||||
|
@ -1222,6 +1222,9 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
|
|||||||
"BFD_RELOC_M32R_JMP_SLOT",
|
"BFD_RELOC_M32R_JMP_SLOT",
|
||||||
"BFD_RELOC_M32R_RELATIVE",
|
"BFD_RELOC_M32R_RELATIVE",
|
||||||
"BFD_RELOC_M32R_GOTOFF",
|
"BFD_RELOC_M32R_GOTOFF",
|
||||||
|
"BFD_RELOC_M32R_GOTOFF_HI_ULO",
|
||||||
|
"BFD_RELOC_M32R_GOTOFF_HI_SLO",
|
||||||
|
"BFD_RELOC_M32R_GOTOFF_LO",
|
||||||
"BFD_RELOC_M32R_GOTPC24",
|
"BFD_RELOC_M32R_GOTPC24",
|
||||||
"BFD_RELOC_M32R_GOT16_HI_ULO",
|
"BFD_RELOC_M32R_GOT16_HI_ULO",
|
||||||
"BFD_RELOC_M32R_GOT16_HI_SLO",
|
"BFD_RELOC_M32R_GOT16_HI_SLO",
|
||||||
|
@ -2954,6 +2954,12 @@ ENUMX
|
|||||||
BFD_RELOC_M32R_RELATIVE
|
BFD_RELOC_M32R_RELATIVE
|
||||||
ENUMX
|
ENUMX
|
||||||
BFD_RELOC_M32R_GOTOFF
|
BFD_RELOC_M32R_GOTOFF
|
||||||
|
ENUMX
|
||||||
|
BFD_RELOC_M32R_GOTOFF_HI_ULO
|
||||||
|
ENUMX
|
||||||
|
BFD_RELOC_M32R_GOTOFF_HI_SLO
|
||||||
|
ENUMX
|
||||||
|
BFD_RELOC_M32R_GOTOFF_LO
|
||||||
ENUMX
|
ENUMX
|
||||||
BFD_RELOC_M32R_GOTPC24
|
BFD_RELOC_M32R_GOTPC24
|
||||||
ENUMX
|
ENUMX
|
||||||
|
@ -1,3 +1,18 @@
|
|||||||
|
2004-06-25 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
|
||||||
|
|
||||||
|
* config/tc-m32r.c (md_convert_frag): Changed for @PLT.
|
||||||
|
(m32r_cgen_record_fixup_exp): Changed for @GOTOFF, @GOT.
|
||||||
|
(m32r_fix_adjustable): Changed for @GOTOFF, @GOT, @PLT.
|
||||||
|
(tc_gen_reloc): Likewise.
|
||||||
|
(m32r_end_of_match): Add for @GOTOFF, @GOT, @PLT.
|
||||||
|
(m32r_parse_name): Likewise.
|
||||||
|
(m32r_cgen_parse_fix_exp): Likewise.
|
||||||
|
* config/tc-m32r.h (md_parse_name): Define for @GOTOFF, @GOT, @PLT.
|
||||||
|
(O_PIC_reloc): Likewise.
|
||||||
|
(TC_CGEN_PARSE_FIX_EXP): Likewise..
|
||||||
|
* cgen.c (gas_cgen_parse_operand): Add TC_CGEN_PARSE_FIX_EXP
|
||||||
|
for @GOTOFF, @GOT, @PLT.
|
||||||
|
|
||||||
2004-06-21 Jan Beulich <jbeulich@novell.com>
|
2004-06-21 Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
* gas/symbols.c: While discarding ordinary local absolute symbols
|
* gas/symbols.c: While discarding ordinary local absolute symbols
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* GAS interface for targets using CGEN: Cpu tools GENerator.
|
/* GAS interface for targets using CGEN: Cpu tools GENerator.
|
||||||
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
|
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GAS, the GNU Assembler.
|
This file is part of GAS, the GNU Assembler.
|
||||||
@ -355,6 +355,10 @@ gas_cgen_parse_operand (cd, want, strP, opindex, opinfo, resultP, valueP)
|
|||||||
*strP = input_line_pointer;
|
*strP = input_line_pointer;
|
||||||
input_line_pointer = hold;
|
input_line_pointer = hold;
|
||||||
|
|
||||||
|
#ifdef TC_CGEN_PARSE_FIX_EXP
|
||||||
|
opinfo = TC_CGEN_PARSE_FIX_EXP (opinfo, & exp);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* FIXME: Need to check `want'. */
|
/* FIXME: Need to check `want'. */
|
||||||
|
|
||||||
switch (exp.X_op)
|
switch (exp.X_op)
|
||||||
|
@ -489,6 +489,69 @@ const pseudo_typeS md_pseudo_table[] =
|
|||||||
{ NULL, NULL, 0 }
|
{ NULL, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define GOT_NAME "_GLOBAL_OFFSET_TABLE_"
|
||||||
|
symbolS * GOT_symbol;
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
m32r_PIC_related_p (symbolS *sym)
|
||||||
|
{
|
||||||
|
expressionS *exp;
|
||||||
|
|
||||||
|
if (! sym)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (sym == GOT_symbol)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
exp = symbol_get_value_expression (sym);
|
||||||
|
|
||||||
|
return (exp->X_op == O_PIC_reloc
|
||||||
|
|| exp->X_md == BFD_RELOC_M32R_26_PLTREL
|
||||||
|
|| m32r_PIC_related_p (exp->X_add_symbol)
|
||||||
|
|| m32r_PIC_related_p (exp->X_op_symbol));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
m32r_check_fixup (expressionS *main_exp, bfd_reloc_code_real_type *r_type_p)
|
||||||
|
{
|
||||||
|
expressionS *exp = main_exp;
|
||||||
|
|
||||||
|
if (exp->X_op == O_add && m32r_PIC_related_p (exp->X_op_symbol))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (exp->X_op == O_symbol && exp->X_add_symbol)
|
||||||
|
{
|
||||||
|
if (exp->X_add_symbol == GOT_symbol)
|
||||||
|
{
|
||||||
|
*r_type_p = BFD_RELOC_M32R_GOTPC24;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (exp->X_op == O_add)
|
||||||
|
{
|
||||||
|
exp = symbol_get_value_expression (exp->X_add_symbol);
|
||||||
|
if (! exp)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exp->X_op == O_PIC_reloc || exp->X_md != BFD_RELOC_UNUSED)
|
||||||
|
{
|
||||||
|
*r_type_p = exp->X_md;
|
||||||
|
if (exp == main_exp)
|
||||||
|
exp->X_op = O_symbol;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
main_exp->X_add_symbol = exp->X_add_symbol;
|
||||||
|
main_exp->X_add_number += exp->X_add_number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return (m32r_PIC_related_p (exp->X_add_symbol)
|
||||||
|
|| m32r_PIC_related_p (exp->X_op_symbol));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* FIXME: Should be machine generated. */
|
/* FIXME: Should be machine generated. */
|
||||||
#define NOP_INSN 0x7000
|
#define NOP_INSN 0x7000
|
||||||
#define PAR_NOP_INSN 0xf000 /* Can only be used in 2nd slot. */
|
#define PAR_NOP_INSN 0xf000 /* Can only be used in 2nd slot. */
|
||||||
@ -1888,9 +1951,12 @@ md_convert_frag (abfd, sec, fragP)
|
|||||||
|| S_IS_EXTERNAL (fragP->fr_symbol)
|
|| S_IS_EXTERNAL (fragP->fr_symbol)
|
||||||
|| S_IS_WEAK (fragP->fr_symbol))
|
|| S_IS_WEAK (fragP->fr_symbol))
|
||||||
{
|
{
|
||||||
|
fixS *fixP;
|
||||||
|
|
||||||
assert (fragP->fr_subtype != 1);
|
assert (fragP->fr_subtype != 1);
|
||||||
assert (fragP->fr_cgen.insn != 0);
|
assert (fragP->fr_cgen.insn != 0);
|
||||||
gas_cgen_record_fixup (fragP,
|
|
||||||
|
fixP = gas_cgen_record_fixup (fragP,
|
||||||
/* Offset of branch insn in frag. */
|
/* Offset of branch insn in frag. */
|
||||||
fragP->fr_fix + extension - 4,
|
fragP->fr_fix + extension - 4,
|
||||||
fragP->fr_cgen.insn,
|
fragP->fr_cgen.insn,
|
||||||
@ -1905,6 +1971,8 @@ md_convert_frag (abfd, sec, fragP)
|
|||||||
#endif
|
#endif
|
||||||
fragP->fr_cgen.opinfo,
|
fragP->fr_cgen.opinfo,
|
||||||
fragP->fr_symbol, fragP->fr_offset);
|
fragP->fr_symbol, fragP->fr_offset);
|
||||||
|
if (fragP->fr_cgen.opinfo)
|
||||||
|
fixP->fx_r_type = fragP->fr_cgen.opinfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SIZE_FROM_RELAX_STATE(n) ((n) == 1 ? 1 : 3)
|
#define SIZE_FROM_RELAX_STATE(n) ((n) == 1 ? 1 : 3)
|
||||||
@ -2006,7 +2074,13 @@ m32r_cgen_record_fixup_exp (frag, where, insn, length, operand, opinfo, exp)
|
|||||||
int opinfo;
|
int opinfo;
|
||||||
expressionS *exp;
|
expressionS *exp;
|
||||||
{
|
{
|
||||||
fixS *fixP = gas_cgen_record_fixup_exp (frag, where, insn, length,
|
fixS *fixP;
|
||||||
|
bfd_reloc_code_real_type r_type = BFD_RELOC_UNUSED;
|
||||||
|
|
||||||
|
if (m32r_check_fixup (exp, &r_type))
|
||||||
|
as_bad (_("Invalid PIC expression."));
|
||||||
|
|
||||||
|
fixP = gas_cgen_record_fixup_exp (frag, where, insn, length,
|
||||||
operand, opinfo, exp);
|
operand, opinfo, exp);
|
||||||
|
|
||||||
switch (operand->type)
|
switch (operand->type)
|
||||||
@ -2017,11 +2091,49 @@ m32r_cgen_record_fixup_exp (frag, where, insn, length, operand, opinfo, exp)
|
|||||||
|| fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
|
|| fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
|
||||||
m32r_record_hi16 (fixP->fx_cgen.opinfo, fixP, now_seg);
|
m32r_record_hi16 (fixP->fx_cgen.opinfo, fixP, now_seg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* Avoid -Wall warning */
|
/* Avoid -Wall warning. */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (r_type)
|
||||||
|
{
|
||||||
|
case BFD_RELOC_UNUSED:
|
||||||
|
default:
|
||||||
|
return fixP;
|
||||||
|
|
||||||
|
case BFD_RELOC_M32R_GOTPC24:
|
||||||
|
if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO)
|
||||||
|
r_type = BFD_RELOC_M32R_GOTPC_HI_SLO;
|
||||||
|
else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
|
||||||
|
r_type = BFD_RELOC_M32R_GOTPC_HI_ULO;
|
||||||
|
else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16)
|
||||||
|
r_type = BFD_RELOC_M32R_GOTPC_LO;
|
||||||
|
break;
|
||||||
|
case BFD_RELOC_M32R_GOT24:
|
||||||
|
if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO)
|
||||||
|
r_type = BFD_RELOC_M32R_GOT16_HI_SLO;
|
||||||
|
else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
|
||||||
|
r_type = BFD_RELOC_M32R_GOT16_HI_ULO;
|
||||||
|
else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16)
|
||||||
|
r_type = BFD_RELOC_M32R_GOT16_LO;
|
||||||
|
break;
|
||||||
|
case BFD_RELOC_M32R_GOTOFF:
|
||||||
|
if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO)
|
||||||
|
r_type = BFD_RELOC_M32R_GOTOFF_HI_SLO;
|
||||||
|
else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
|
||||||
|
r_type = BFD_RELOC_M32R_GOTOFF_HI_ULO;
|
||||||
|
else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16)
|
||||||
|
r_type = BFD_RELOC_M32R_GOTOFF_LO;
|
||||||
|
break;
|
||||||
|
case BFD_RELOC_M32R_26_PLTREL:
|
||||||
|
as_bad (_("Invalid PIC expression."));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
fixP->fx_r_type = r_type;
|
||||||
|
|
||||||
return fixP;
|
return fixP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2261,6 +2373,16 @@ m32r_fix_adjustable (fixP)
|
|||||||
|| reloc_type == BFD_RELOC_M32R_LO16))
|
|| reloc_type == BFD_RELOC_M32R_LO16))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (reloc_type == BFD_RELOC_M32R_GOT24
|
||||||
|
|| reloc_type == BFD_RELOC_M32R_26_PLTREL
|
||||||
|
|| reloc_type == BFD_RELOC_M32R_GOTPC_HI_SLO
|
||||||
|
|| reloc_type == BFD_RELOC_M32R_GOTPC_HI_ULO
|
||||||
|
|| reloc_type == BFD_RELOC_M32R_GOTPC_LO
|
||||||
|
|| reloc_type == BFD_RELOC_M32R_GOT16_HI_SLO
|
||||||
|
|| reloc_type == BFD_RELOC_M32R_GOT16_HI_ULO
|
||||||
|
|| reloc_type == BFD_RELOC_M32R_GOT16_LO)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* We need the symbol name for the VTABLE entries. */
|
/* We need the symbol name for the VTABLE entries. */
|
||||||
if (reloc_type == BFD_RELOC_VTABLE_INHERIT
|
if (reloc_type == BFD_RELOC_VTABLE_INHERIT
|
||||||
|| reloc_type == BFD_RELOC_VTABLE_ENTRY)
|
|| reloc_type == BFD_RELOC_VTABLE_ENTRY)
|
||||||
@ -2270,17 +2392,16 @@ m32r_fix_adjustable (fixP)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
m32r_elf_final_processing ()
|
m32r_elf_final_processing (void)
|
||||||
{
|
{
|
||||||
if (use_parallel)
|
if (use_parallel)
|
||||||
m32r_flags |= E_M32R_HAS_PARALLEL;
|
m32r_flags |= E_M32R_HAS_PARALLEL;
|
||||||
elf_elfheader (stdoutput)->e_flags |= m32r_flags;
|
elf_elfheader (stdoutput)->e_flags |= m32r_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GOT_NAME "_GLOBAL_OFFSET_TABLE_"
|
|
||||||
|
|
||||||
/* Translate internal representation of relocation info to BFD target
|
/* Translate internal representation of relocation info to BFD target
|
||||||
format. */
|
format. */
|
||||||
|
|
||||||
arelent *
|
arelent *
|
||||||
tc_gen_reloc (section, fixP)
|
tc_gen_reloc (section, fixP)
|
||||||
asection * section;
|
asection * section;
|
||||||
@ -2354,21 +2475,124 @@ printf(" => %s\n",reloc->howto->name);
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Use fx_offset for these cases */
|
/* Use fx_offset for these cases. */
|
||||||
if ( fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
|
if ( fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
|
||||||
|| fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT)
|
|| fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT)
|
||||||
reloc->addend = fixP->fx_offset;
|
reloc->addend = fixP->fx_offset;
|
||||||
else if (!pic_code
|
else if ((!pic_code
|
||||||
|
&& code != BFD_RELOC_M32R_26_PLTREL)
|
||||||
&& fixP->fx_pcrel
|
&& fixP->fx_pcrel
|
||||||
&& fixP->fx_addsy != NULL
|
&& fixP->fx_addsy != NULL
|
||||||
&& (S_GET_SEGMENT(fixP->fx_addsy) != section)
|
&& (S_GET_SEGMENT(fixP->fx_addsy) != section)
|
||||||
&& S_IS_DEFINED (fixP->fx_addsy)
|
&& S_IS_DEFINED (fixP->fx_addsy)
|
||||||
&& ! S_IS_EXTERNAL(fixP->fx_addsy)
|
&& ! S_IS_EXTERNAL(fixP->fx_addsy)
|
||||||
&& ! S_IS_WEAK(fixP->fx_addsy))
|
&& ! S_IS_WEAK(fixP->fx_addsy))
|
||||||
/* already used fx_offset in the opcode field itseld. */
|
/* Already used fx_offset in the opcode field itseld. */
|
||||||
reloc->addend = 0;
|
reloc->addend = 0;
|
||||||
else
|
else
|
||||||
reloc->addend = fixP->fx_addnumber;
|
reloc->addend = fixP->fx_addnumber;
|
||||||
|
|
||||||
return reloc;
|
return reloc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline static char *
|
||||||
|
m32r_end_of_match (char *cont, char *what)
|
||||||
|
{
|
||||||
|
int len = strlen (what);
|
||||||
|
|
||||||
|
if (strncasecmp (cont, what, strlen (what)) == 0
|
||||||
|
&& ! is_part_of_name (cont[len]))
|
||||||
|
return cont + len;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
m32r_parse_name (char const *name, expressionS *exprP, char *nextcharP)
|
||||||
|
{
|
||||||
|
char *next = input_line_pointer;
|
||||||
|
char *next_end;
|
||||||
|
int reloc_type;
|
||||||
|
operatorT op_type;
|
||||||
|
segT segment;
|
||||||
|
|
||||||
|
exprP->X_op_symbol = NULL;
|
||||||
|
exprP->X_md = BFD_RELOC_UNUSED;
|
||||||
|
|
||||||
|
if (strcmp (name, GOT_NAME) == 0)
|
||||||
|
{
|
||||||
|
if (! GOT_symbol)
|
||||||
|
GOT_symbol = symbol_find_or_make (name);
|
||||||
|
|
||||||
|
exprP->X_add_symbol = GOT_symbol;
|
||||||
|
no_suffix:
|
||||||
|
/* If we have an absolute symbol or a
|
||||||
|
reg, then we know its value now. */
|
||||||
|
segment = S_GET_SEGMENT (exprP->X_add_symbol);
|
||||||
|
if (segment == absolute_section)
|
||||||
|
{
|
||||||
|
exprP->X_op = O_constant;
|
||||||
|
exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
|
||||||
|
exprP->X_add_symbol = NULL;
|
||||||
|
}
|
||||||
|
else if (segment == reg_section)
|
||||||
|
{
|
||||||
|
exprP->X_op = O_register;
|
||||||
|
exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
|
||||||
|
exprP->X_add_symbol = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
exprP->X_op = O_symbol;
|
||||||
|
exprP->X_add_number = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
exprP->X_add_symbol = symbol_find_or_make (name);
|
||||||
|
|
||||||
|
if (*nextcharP != '@')
|
||||||
|
goto no_suffix;
|
||||||
|
else if ((next_end = m32r_end_of_match (next + 1, "GOTOFF")))
|
||||||
|
{
|
||||||
|
reloc_type = BFD_RELOC_M32R_GOTOFF;
|
||||||
|
op_type = O_PIC_reloc;
|
||||||
|
}
|
||||||
|
else if ((next_end = m32r_end_of_match (next + 1, "GOT")))
|
||||||
|
{
|
||||||
|
reloc_type = BFD_RELOC_M32R_GOT24;
|
||||||
|
op_type = O_PIC_reloc;
|
||||||
|
}
|
||||||
|
else if ((next_end = m32r_end_of_match (next + 1, "PLT")))
|
||||||
|
{
|
||||||
|
reloc_type = BFD_RELOC_M32R_26_PLTREL;
|
||||||
|
op_type = O_PIC_reloc;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
goto no_suffix;
|
||||||
|
|
||||||
|
*input_line_pointer = *nextcharP;
|
||||||
|
input_line_pointer = next_end;
|
||||||
|
*nextcharP = *input_line_pointer;
|
||||||
|
*input_line_pointer = '\0';
|
||||||
|
|
||||||
|
exprP->X_op = op_type;
|
||||||
|
exprP->X_add_number = 0;
|
||||||
|
exprP->X_md = reloc_type;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
m32r_cgen_parse_fix_exp(int opinfo, expressionS *exp)
|
||||||
|
{
|
||||||
|
if (exp->X_op == O_PIC_reloc
|
||||||
|
&& exp->X_md == BFD_RELOC_M32R_26_PLTREL)
|
||||||
|
{
|
||||||
|
exp->X_op = O_symbol;
|
||||||
|
opinfo = exp->X_md;
|
||||||
|
}
|
||||||
|
|
||||||
|
return opinfo;
|
||||||
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* tc-m32r.h -- Header file for tc-m32r.c.
|
/* tc-m32r.h -- Header file for tc-m32r.c.
|
||||||
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
|
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GAS, the GNU Assembler.
|
This file is part of GAS, the GNU Assembler.
|
||||||
@ -131,3 +131,15 @@ extern void m32r_flush_pending_output PARAMS ((void));
|
|||||||
|
|
||||||
#define elf_tc_final_processing m32r_elf_final_processing
|
#define elf_tc_final_processing m32r_elf_final_processing
|
||||||
extern void m32r_elf_final_processing PARAMS ((void));
|
extern void m32r_elf_final_processing PARAMS ((void));
|
||||||
|
|
||||||
|
#define md_parse_name(name, exprP, nextcharP) \
|
||||||
|
m32r_parse_name ((name), (exprP), (nextcharP))
|
||||||
|
extern int m32r_parse_name (char const *, expressionS *, char *);
|
||||||
|
|
||||||
|
/* This is used to construct expressions out of @GOTOFF, @PLT and @GOT
|
||||||
|
symbols. The relocation type is stored in X_md. */
|
||||||
|
#define O_PIC_reloc O_md1
|
||||||
|
|
||||||
|
#define TC_CGEN_PARSE_FIX_EXP(opinfo, exp) \
|
||||||
|
m32r_cgen_parse_fix_exp(opinfo, exp)
|
||||||
|
extern int m32r_cgen_parse_fix_exp(int, expressionS *);
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2004-06-25 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
|
||||||
|
|
||||||
|
* m32r.h: Add defintions of R_M32R_GOTOFF_HI_ULO,
|
||||||
|
R_M32R_GOTOFF_HI_SLO and R_M32R_GOTOFF_LO.
|
||||||
|
|
||||||
2004-06-19 Alan Modra <amodra@bigpond.net.au>
|
2004-06-19 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
* common.h (ELF64_R_INFO): Warning fix.
|
* common.h (ELF64_R_INFO): Warning fix.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* M32R ELF support for BFD.
|
/* M32R ELF support for BFD.
|
||||||
Copyright 1996, 1997, 1998, 1999, 2000, 2003 Free Software Foundation, Inc.
|
Copyright 1996, 1997, 1998, 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of BFD, the Binary File Descriptor library.
|
This file is part of BFD, the Binary File Descriptor library.
|
||||||
|
|
||||||
@ -67,6 +67,9 @@ START_RELOC_NUMBERS (elf_m32r_reloc_type)
|
|||||||
RELOC_NUMBER (R_M32R_GOTPC_HI_ULO, 59)
|
RELOC_NUMBER (R_M32R_GOTPC_HI_ULO, 59)
|
||||||
RELOC_NUMBER (R_M32R_GOTPC_HI_SLO, 60)
|
RELOC_NUMBER (R_M32R_GOTPC_HI_SLO, 60)
|
||||||
RELOC_NUMBER (R_M32R_GOTPC_LO, 61)
|
RELOC_NUMBER (R_M32R_GOTPC_LO, 61)
|
||||||
|
RELOC_NUMBER (R_M32R_GOTOFF_HI_ULO, 62)
|
||||||
|
RELOC_NUMBER (R_M32R_GOTOFF_HI_SLO, 63)
|
||||||
|
RELOC_NUMBER (R_M32R_GOTOFF_LO, 64)
|
||||||
END_RELOC_NUMBERS (R_M32R_max)
|
END_RELOC_NUMBERS (R_M32R_max)
|
||||||
|
|
||||||
/* Processor specific section indices. These sections do not actually
|
/* Processor specific section indices. These sections do not actually
|
||||||
|
Loading…
Reference in New Issue
Block a user