This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: [PATCH] New port @GOTOFF, @GOT,@PLT relocation token for target m32r
- From: Kazuhiro Inaoka <inaoka dot kazuhiro at renesas dot com>
- To: Nick Clifton <nickc at redhat dot com>
- Cc: "binutils at sources dot redhat dot com" <binutils at sources dot redhat dot com>
- Date: Fri, 25 Jun 2004 13:26:22 +0900
- Subject: Re: [PATCH] New port @GOTOFF, @GOT,@PLT relocation token for target m32r
- References: <40D821D3.4090402@renesas.com>
Hi Nick,
Excuse me, The following patch was not enough to support GOTOFF relocation.
http://sources.redhat.com/ml/binutils/2004-06/msg00397.html
This patch is to support GOTOFF relocation.
Please apply it.
Regards,
Kazuhiro Inaoka
include/ChangeLog
2004-06-25 Kazuhiro Inaoka <inaoka dot kazuhiro at renesas dot com>
* elf/m32r.h: Add
R_M32R_GOTOFF_HI_ULO, R_M32R_GOTOFF_HI_SLO, R_M32R_GOTOFF_LO
bfd/ChangeLog
2004-06-25 Kazuhiro Inaoka <inaoka dot kazuhiro at renesas dot 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): Ditto.
(m32r_elf_check_relocs): Ditto.
(m32r_elf_howto_table): Added
R_M32R_GOTOFF_HI_ULO, R_M32R_GOTOFF_HI_SLO, R_M32R_GOTOFF_LO
* reloc.c: Added
BFD_RELOC_M32R_GOTOFF_HI_ULO, BFD_RELOC_M32R_GOTOFF_HI_SLO,
BFD_RELOC_M32R_GOTOFF_LO
gas/ChangeLog
2004-06-25 Kazuhiro Inaoka <inaoka dot kazuhiro at renesas dot 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): Ditto.
(m32r_end_of_match): Add for @GOTOFF, @GOT, @PLT.
(m32r_parse_name): Ditto.
(m32r_cgen_parse_fix_exp): Ditto.
* config/tc-m32r.h (md_parse_name): Define for @GOTOFF, @GOT, @PLT.
(O_PIC_reloc): Ditto
(TC_CGEN_PARSE_FIX_EXP): Ditto.
* cgen.c (gas_cgen_parse_operand): Add TC_CGEN_PARSE_FIX_EXP
for @GOTOFF, @GOT, @PLT.
Index: bfd/elf32-m32r.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-m32r.c,v
retrieving revision 1.45
diff -c -r1.45 elf32-m32r.c
*** bfd/elf32-m32r.c 24 Jun 2004 04:46:19 -0000 1.45
--- bfd/elf32-m32r.c 25 Jun 2004 04:11:34 -0000
***************
*** 678,692 ****
HOWTO (R_M32R_GOTOFF, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
! 32, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_M32R_GOTOFF", /* name */
FALSE, /* partial_inplace */
! 0xffffffff, /* src_mask */
! 0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* An PC Relative 24-bit relocation used when setting PIC offset
--- 678,692 ----
HOWTO (R_M32R_GOTOFF, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
! 24, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_M32R_GOTOFF", /* name */
FALSE, /* partial_inplace */
! 0xffffff, /* src_mask */
! 0xffffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* An PC Relative 24-bit relocation used when setting PIC offset
***************
*** 803,808 ****
--- 803,850 ----
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
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. */
***************
*** 1269,1274 ****
--- 1311,1319 ----
{ 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_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 *
***************
*** 2796,2801 ****
--- 2841,2875 ----
switch ((int) r_type)
{
+ case R_M32R_GOTOFF:
+ /* Relocation is relative to the start of the global offset
+ table. (for ld24 rx,#uimm24)
+ ex) 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:
/* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
ld24 rx,#_GLOBAL_OFFSET_TABLE_
***************
*** 4307,4312 ****
--- 4381,4390 ----
case R_M32R_GOT16_HI_SLO:
case R_M32R_GOT16_LO:
case R_M32R_GOT24:
+ case R_M32R_GOTOFF:
+ case R_M32R_GOTOFF_HI_ULO:
+ case R_M32R_GOTOFF_HI_SLO:
+ case R_M32R_GOTOFF_LO:
case R_M32R_GOTPC_HI_ULO:
case R_M32R_GOTPC_HI_SLO:
case R_M32R_GOTPC_LO:
***************
*** 4436,4441 ****
--- 4514,4523 ----
case R_M32R_GOT16_HI_ULO:
case R_M32R_GOT16_HI_SLO:
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_GOTPC24:
case R_M32R_GOTPC_HI_ULO:
case R_M32R_GOTPC_HI_SLO:
Index: bfd/reloc.c
===================================================================
RCS file: /cvs/src/src/bfd/reloc.c,v
retrieving revision 1.104
diff -c -r1.104 reloc.c
*** bfd/reloc.c 24 Jun 2004 04:46:26 -0000 1.104
--- bfd/reloc.c 25 Jun 2004 04:11:34 -0000
***************
*** 2955,2960 ****
--- 2955,2966 ----
ENUMX
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
BFD_RELOC_M32R_GOTPC24
ENUMX
BFD_RELOC_M32R_GOT16_HI_ULO
Index: gas/cgen.c
===================================================================
RCS file: /cvs/src/src/gas/cgen.c,v
retrieving revision 1.23
diff -c -r1.23 cgen.c
*** gas/cgen.c 21 Nov 2003 01:52:16 -0000 1.23
--- gas/cgen.c 25 Jun 2004 04:11:35 -0000
***************
*** 355,360 ****
--- 355,364 ----
*strP = input_line_pointer;
input_line_pointer = hold;
+ #ifdef TC_CGEN_PARSE_FIX_EXP
+ opinfo = TC_CGEN_PARSE_FIX_EXP (opinfo, &exp);
+ #endif
+
/* FIXME: Need to check `want'. */
switch (exp.X_op)
Index: gas/config/tc-m32r.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-m32r.c,v
retrieving revision 1.36
diff -c -r1.36 tc-m32r.c
*** gas/config/tc-m32r.c 13 Apr 2004 16:47:57 -0000 1.36
--- gas/config/tc-m32r.c 25 Jun 2004 04:11:35 -0000
***************
*** 489,494 ****
--- 489,557 ----
{ 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. */
#define NOP_INSN 0x7000
#define PAR_NOP_INSN 0xf000 /* Can only be used in 2nd slot. */
***************
*** 1888,1895 ****
--- 1951,1961 ----
|| S_IS_EXTERNAL (fragP->fr_symbol)
|| S_IS_WEAK (fragP->fr_symbol))
{
+ fixS *fixP;
assert (fragP->fr_subtype != 1);
assert (fragP->fr_cgen.insn != 0);
+
+ fixP =
gas_cgen_record_fixup (fragP,
/* Offset of branch insn in frag. */
fragP->fr_fix + extension - 4,
***************
*** 1905,1910 ****
--- 1971,1978 ----
#endif
fragP->fr_cgen.opinfo,
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)
***************
*** 2006,2013 ****
int opinfo;
expressionS *exp;
{
! fixS *fixP = gas_cgen_record_fixup_exp (frag, where, insn, length,
! operand, opinfo, exp);
switch (operand->type)
{
--- 2074,2087 ----
int opinfo;
expressionS *exp;
{
! 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);
switch (operand->type)
{
***************
*** 2022,2027 ****
--- 2096,2137 ----
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;
}
***************
*** 2261,2266 ****
--- 2371,2386 ----
|| reloc_type == BFD_RELOC_M32R_LO16))
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. */
if (reloc_type == BFD_RELOC_VTABLE_INHERIT
|| reloc_type == BFD_RELOC_VTABLE_ENTRY)
***************
*** 2277,2284 ****
elf_elfheader (stdoutput)->e_flags |= m32r_flags;
}
- #define GOT_NAME "_GLOBAL_OFFSET_TABLE_"
-
/* Translate internal representation of relocation info to BFD target
format. */
arelent *
--- 2397,2402 ----
***************
*** 2358,2364 ****
if ( fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
|| fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT)
reloc->addend = fixP->fx_offset;
! else if (!pic_code
&& fixP->fx_pcrel
&& fixP->fx_addsy != NULL
&& (S_GET_SEGMENT(fixP->fx_addsy) != section)
--- 2476,2483 ----
if ( fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
|| fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT)
reloc->addend = fixP->fx_offset;
! else if ((!pic_code
! && code != BFD_RELOC_M32R_26_PLTREL)
&& fixP->fx_pcrel
&& fixP->fx_addsy != NULL
&& (S_GET_SEGMENT(fixP->fx_addsy) != section)
***************
*** 2372,2374 ****
--- 2491,2595 ----
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;
+ }
Index: gas/config/tc-m32r.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-m32r.h,v
retrieving revision 1.11
diff -c -r1.11 tc-m32r.h
*** gas/config/tc-m32r.h 19 Dec 2003 11:43:37 -0000 1.11
--- gas/config/tc-m32r.h 25 Jun 2004 04:11:35 -0000
***************
*** 131,133 ****
--- 131,145 ----
#define elf_tc_final_processing m32r_elf_final_processing
extern void m32r_elf_final_processing PARAMS ((void));
+
+ #define md_parse_name(name, exprP, nextcharP) \
+ m32r_parse_name ((name), (exprP), (nextcharP))
+ int m32r_parse_name (char const *name, expressionS *exprP, char *nextchar);
+
+ /* 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)
+ int m32r_cgen_parse_fix_exp(int opinfo, expressionS *exp);
Index: include/elf/m32r.h
===================================================================
RCS file: /cvs/src/src/include/elf/m32r.h,v
retrieving revision 1.7
diff -c -r1.7 m32r.h
*** include/elf/m32r.h 19 Dec 2003 11:44:00 -0000 1.7
--- include/elf/m32r.h 25 Jun 2004 04:11:36 -0000
***************
*** 67,72 ****
--- 67,75 ----
RELOC_NUMBER (R_M32R_GOTPC_HI_ULO, 59)
RELOC_NUMBER (R_M32R_GOTPC_HI_SLO, 60)
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)
/* Processor specific section indices. These sections do not actually