Commit 9d1ae407 authored by Alan Modra's avatar Alan Modra

Report overflow on PowerPC64 @h and @ha relocations.

(cherry picked from commit f9c6b9078c54ea0f018b673e2ff128e61a0aa666)
parent c3e769b1
2013-11-15 Alan Modra <amodra@gmail.com>
Apply changes from mainline to 2.24
2013-10-30 Alan Modra <amodra@gmail.com>
* reloc.c (BFD_RELOC_PPC64_ADDR16_HIGH, BFD_RELOC_PPC64_ADDR16_HIGHA,
BFD_RELOC_PPC64_TPREL16_HIGH, BFD_RELOC_PPC64_TPREL16_HIGHA,
BFD_RELOC_PPC64_DTPREL16_HIGH, BFD_RELOC_PPC64_DTPREL16_HIGHA): New.
* elf64-ppc.c (ppc64_elf_howto_raw): Add entries for new relocs.
Make all _HA and _HI relocs report signed overflow.
(ppc64_elf_reloc_type_lookup): Handle new relocs.
(must_be_dyn_reloc, ppc64_elf_check_relocs): Likewise.
(dec_dynrel_count, ppc64_elf_relocate_section): Likewise.
(ppc64_elf_relocate_section): Don't apply 0x8000 adjust to
R_PPC64_TPREL16_HIGHER, R_PPC64_TPREL16_HIGHEST,
R_PPC64_DTPREL16_HIGHER, and R_PPC64_DTPREL16_HIGHEST.
* libbfd.h: Regenerate.
* bfd-in2.h: Regenerate.
2013-11-13 Yufeng Zhang <yufeng.zhang@arm.com> 2013-11-13 Yufeng Zhang <yufeng.zhang@arm.com>
* elfnn-aarch64.c (elfNN_aarch64_howto_table): Use * elfnn-aarch64.c (elfNN_aarch64_howto_table): Use
......
...@@ -3221,6 +3221,8 @@ instruction. */ ...@@ -3221,6 +3221,8 @@ instruction. */
BFD_RELOC_PPC64_TOC16_LO_DS, BFD_RELOC_PPC64_TOC16_LO_DS,
BFD_RELOC_PPC64_PLTGOT16_DS, BFD_RELOC_PPC64_PLTGOT16_DS,
BFD_RELOC_PPC64_PLTGOT16_LO_DS, BFD_RELOC_PPC64_PLTGOT16_LO_DS,
BFD_RELOC_PPC64_ADDR16_HIGH,
BFD_RELOC_PPC64_ADDR16_HIGHA,
/* PowerPC and PowerPC64 thread-local storage relocations. */ /* PowerPC and PowerPC64 thread-local storage relocations. */
BFD_RELOC_PPC_TLS, BFD_RELOC_PPC_TLS,
...@@ -3265,6 +3267,10 @@ instruction. */ ...@@ -3265,6 +3267,10 @@ instruction. */
BFD_RELOC_PPC64_DTPREL16_HIGHERA, BFD_RELOC_PPC64_DTPREL16_HIGHERA,
BFD_RELOC_PPC64_DTPREL16_HIGHEST, BFD_RELOC_PPC64_DTPREL16_HIGHEST,
BFD_RELOC_PPC64_DTPREL16_HIGHESTA, BFD_RELOC_PPC64_DTPREL16_HIGHESTA,
BFD_RELOC_PPC64_TPREL16_HIGH,
BFD_RELOC_PPC64_TPREL16_HIGHA,
BFD_RELOC_PPC64_DTPREL16_HIGH,
BFD_RELOC_PPC64_DTPREL16_HIGHA,
/* IBM 370/390 relocations */ /* IBM 370/390 relocations */
BFD_RELOC_I370_D12, BFD_RELOC_I370_D12,
......
This diff is collapsed.
...@@ -1397,6 +1397,8 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", ...@@ -1397,6 +1397,8 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
"BFD_RELOC_PPC64_TOC16_LO_DS", "BFD_RELOC_PPC64_TOC16_LO_DS",
"BFD_RELOC_PPC64_PLTGOT16_DS", "BFD_RELOC_PPC64_PLTGOT16_DS",
"BFD_RELOC_PPC64_PLTGOT16_LO_DS", "BFD_RELOC_PPC64_PLTGOT16_LO_DS",
"BFD_RELOC_PPC64_ADDR16_HIGH",
"BFD_RELOC_PPC64_ADDR16_HIGHA",
"BFD_RELOC_PPC_TLS", "BFD_RELOC_PPC_TLS",
"BFD_RELOC_PPC_TLSGD", "BFD_RELOC_PPC_TLSGD",
"BFD_RELOC_PPC_TLSLD", "BFD_RELOC_PPC_TLSLD",
...@@ -1439,6 +1441,10 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", ...@@ -1439,6 +1441,10 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
"BFD_RELOC_PPC64_DTPREL16_HIGHERA", "BFD_RELOC_PPC64_DTPREL16_HIGHERA",
"BFD_RELOC_PPC64_DTPREL16_HIGHEST", "BFD_RELOC_PPC64_DTPREL16_HIGHEST",
"BFD_RELOC_PPC64_DTPREL16_HIGHESTA", "BFD_RELOC_PPC64_DTPREL16_HIGHESTA",
"BFD_RELOC_PPC64_TPREL16_HIGH",
"BFD_RELOC_PPC64_TPREL16_HIGHA",
"BFD_RELOC_PPC64_DTPREL16_HIGH",
"BFD_RELOC_PPC64_DTPREL16_HIGHA",
"BFD_RELOC_I370_D12", "BFD_RELOC_I370_D12",
"BFD_RELOC_CTOR", "BFD_RELOC_CTOR",
"BFD_RELOC_ARM_PCREL_BRANCH", "BFD_RELOC_ARM_PCREL_BRANCH",
......
...@@ -2891,6 +2891,10 @@ ENUMX ...@@ -2891,6 +2891,10 @@ ENUMX
BFD_RELOC_PPC64_PLTGOT16_DS BFD_RELOC_PPC64_PLTGOT16_DS
ENUMX ENUMX
BFD_RELOC_PPC64_PLTGOT16_LO_DS BFD_RELOC_PPC64_PLTGOT16_LO_DS
ENUMX
BFD_RELOC_PPC64_ADDR16_HIGH
ENUMX
BFD_RELOC_PPC64_ADDR16_HIGHA
ENUMDOC ENUMDOC
Power(rs6000) and PowerPC relocations. Power(rs6000) and PowerPC relocations.
...@@ -2978,6 +2982,14 @@ ENUMX ...@@ -2978,6 +2982,14 @@ ENUMX
BFD_RELOC_PPC64_DTPREL16_HIGHEST BFD_RELOC_PPC64_DTPREL16_HIGHEST
ENUMX ENUMX
BFD_RELOC_PPC64_DTPREL16_HIGHESTA BFD_RELOC_PPC64_DTPREL16_HIGHESTA
ENUMX
BFD_RELOC_PPC64_TPREL16_HIGH
ENUMX
BFD_RELOC_PPC64_TPREL16_HIGHA
ENUMX
BFD_RELOC_PPC64_DTPREL16_HIGH
ENUMX
BFD_RELOC_PPC64_DTPREL16_HIGHA
ENUMDOC ENUMDOC
PowerPC and PowerPC64 thread-local storage relocations. PowerPC and PowerPC64 thread-local storage relocations.
......
2013-11-15 Alan Modra <amodra@gmail.com>
Apply mainline changes to 2.24
2013-10-30 Alan Modra <amodra@gmail.com>
* powerpc.h (R_PPC64_ADDR16_HIGH, R_PPC64_ADDR16_HIGHA,
R_PPC64_TPREL16_HIGH, R_PPC64_TPREL16_HIGHA,
R_PPC64_DTPREL16_HIGH, R_PPC64_DTPREL16_HIGHA): Define.
2013-03-01 Cary Coutant <ccoutant@google.com> 2013-03-01 Cary Coutant <ccoutant@google.com>
* dwarf.h (enum DW_LANG): Adjust spacing for consistency. * dwarf.h (enum DW_LANG): Adjust spacing for consistency.
......
...@@ -164,11 +164,17 @@ enum ...@@ -164,11 +164,17 @@ enum
R_PPC_EMB_SDA21 = 109, R_PPC_EMB_SDA21 = 109,
R_PPC64_TOCSAVE = 109, R_PPC64_TOCSAVE = 109,
R_PPC_EMB_MRKREF = 110, R_PPC_EMB_MRKREF = 110,
R_PPC64_ADDR16_HIGH = 110,
R_PPC_EMB_RELSEC16 = 111, R_PPC_EMB_RELSEC16 = 111,
R_PPC64_ADDR16_HIGHA = 111,
R_PPC_EMB_RELST_LO = 112, R_PPC_EMB_RELST_LO = 112,
R_PPC64_TPREL16_HIGH = 112,
R_PPC_EMB_RELST_HI = 113, R_PPC_EMB_RELST_HI = 113,
R_PPC64_TPREL16_HIGHA = 113,
R_PPC_EMB_RELST_HA = 114, R_PPC_EMB_RELST_HA = 114,
R_PPC64_DTPREL16_HIGH = 114,
R_PPC_EMB_BIT_FLD = 115, R_PPC_EMB_BIT_FLD = 115,
R_PPC64_DTPREL16_HIGHA = 115,
R_PPC_EMB_RELSDA = 116, R_PPC_EMB_RELSDA = 116,
R_PPC_VLE_REL8 = 216, R_PPC_VLE_REL8 = 216,
......
2013-11-15 Alan Modra <amodra@gmail.com>
Apply changes from mainline to 2.24
2013-10-30 Alan Modra <amodra@gmail.com>
* config/tc-ppc.c (SEX16): Don't mask.
(REPORT_OVERFLOW_HI): Define as zero.
(ppc_elf_suffix): Support @high, @higha, @dtprel@high, @dtprel@higha,
@tprel@high, and @tprel@higha modifiers.
(md_assemble): Ignore X_unsigned when applying 16-bit insn fields.
Add (disabled) code to check @h and @ha reloc overflow for powerpc64.
Handle new relocs.
(md_apply_fix): Similarly.
2013-11-05 Yufeng Zhang <yufeng.zhang@arm.com> 2013-11-05 Yufeng Zhang <yufeng.zhang@arm.com>
* config/tc-aarch64.c (parse_sys_reg): Update to use aarch64_sys_reg; * config/tc-aarch64.c (parse_sys_reg): Update to use aarch64_sys_reg;
......
...@@ -86,7 +86,11 @@ static int set_target_endian = 0; ...@@ -86,7 +86,11 @@ static int set_target_endian = 0;
compensating for #lo being treated as a signed number. */ compensating for #lo being treated as a signed number. */
#define PPC_HIGHESTA(v) PPC_HIGHEST ((v) + 0x8000) #define PPC_HIGHESTA(v) PPC_HIGHEST ((v) + 0x8000)
#define SEX16(val) ((((val) & 0xffff) ^ 0x8000) - 0x8000) #define SEX16(val) (((val) ^ 0x8000) - 0x8000)
/* For the time being on ppc64, don't report overflow on @h and @ha
applied to constants. */
#define REPORT_OVERFLOW_HI 0
static bfd_boolean reg_names_p = TARGET_REG_NAMES_P; static bfd_boolean reg_names_p = TARGET_REG_NAMES_P;
...@@ -1923,6 +1927,8 @@ ppc_elf_suffix (char **str_p, expressionS *exp_p) ...@@ -1923,6 +1927,8 @@ ppc_elf_suffix (char **str_p, expressionS *exp_p)
MAP32 ("bitfld", BFD_RELOC_PPC_EMB_BIT_FLD), MAP32 ("bitfld", BFD_RELOC_PPC_EMB_BIT_FLD),
MAP32 ("relsda", BFD_RELOC_PPC_EMB_RELSDA), MAP32 ("relsda", BFD_RELOC_PPC_EMB_RELSDA),
MAP32 ("xgot", BFD_RELOC_PPC_TOC16), MAP32 ("xgot", BFD_RELOC_PPC_TOC16),
MAP64 ("high", BFD_RELOC_PPC64_ADDR16_HIGH),
MAP64 ("higha", BFD_RELOC_PPC64_ADDR16_HIGHA),
MAP64 ("higher", BFD_RELOC_PPC64_HIGHER), MAP64 ("higher", BFD_RELOC_PPC64_HIGHER),
MAP64 ("highera", BFD_RELOC_PPC64_HIGHER_S), MAP64 ("highera", BFD_RELOC_PPC64_HIGHER_S),
MAP64 ("highest", BFD_RELOC_PPC64_HIGHEST), MAP64 ("highest", BFD_RELOC_PPC64_HIGHEST),
...@@ -1932,10 +1938,14 @@ ppc_elf_suffix (char **str_p, expressionS *exp_p) ...@@ -1932,10 +1938,14 @@ ppc_elf_suffix (char **str_p, expressionS *exp_p)
MAP64 ("toc@l", BFD_RELOC_PPC64_TOC16_LO), MAP64 ("toc@l", BFD_RELOC_PPC64_TOC16_LO),
MAP64 ("toc@h", BFD_RELOC_PPC64_TOC16_HI), MAP64 ("toc@h", BFD_RELOC_PPC64_TOC16_HI),
MAP64 ("toc@ha", BFD_RELOC_PPC64_TOC16_HA), MAP64 ("toc@ha", BFD_RELOC_PPC64_TOC16_HA),
MAP64 ("dtprel@high", BFD_RELOC_PPC64_DTPREL16_HIGH),
MAP64 ("dtprel@higha", BFD_RELOC_PPC64_DTPREL16_HIGHA),
MAP64 ("dtprel@higher", BFD_RELOC_PPC64_DTPREL16_HIGHER), MAP64 ("dtprel@higher", BFD_RELOC_PPC64_DTPREL16_HIGHER),
MAP64 ("dtprel@highera", BFD_RELOC_PPC64_DTPREL16_HIGHERA), MAP64 ("dtprel@highera", BFD_RELOC_PPC64_DTPREL16_HIGHERA),
MAP64 ("dtprel@highest", BFD_RELOC_PPC64_DTPREL16_HIGHEST), MAP64 ("dtprel@highest", BFD_RELOC_PPC64_DTPREL16_HIGHEST),
MAP64 ("dtprel@highesta", BFD_RELOC_PPC64_DTPREL16_HIGHESTA), MAP64 ("dtprel@highesta", BFD_RELOC_PPC64_DTPREL16_HIGHESTA),
MAP64 ("tprel@high", BFD_RELOC_PPC64_TPREL16_HIGH),
MAP64 ("tprel@higha", BFD_RELOC_PPC64_TPREL16_HIGHA),
MAP64 ("tprel@higher", BFD_RELOC_PPC64_TPREL16_HIGHER), MAP64 ("tprel@higher", BFD_RELOC_PPC64_TPREL16_HIGHER),
MAP64 ("tprel@highera", BFD_RELOC_PPC64_TPREL16_HIGHERA), MAP64 ("tprel@highera", BFD_RELOC_PPC64_TPREL16_HIGHERA),
MAP64 ("tprel@highest", BFD_RELOC_PPC64_TPREL16_HIGHEST), MAP64 ("tprel@highest", BFD_RELOC_PPC64_TPREL16_HIGHEST),
...@@ -2810,55 +2820,76 @@ md_assemble (char *str) ...@@ -2810,55 +2820,76 @@ md_assemble (char *str)
break; break;
case BFD_RELOC_LO16: case BFD_RELOC_LO16:
/* X_unsigned is the default, so if the user has done ex.X_add_number &= 0xffff;
something which cleared it, we always produce a if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
signed value. */
if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
ex.X_add_number &= 0xffff;
else
ex.X_add_number = SEX16 (ex.X_add_number); ex.X_add_number = SEX16 (ex.X_add_number);
break; break;
case BFD_RELOC_HI16: case BFD_RELOC_HI16:
if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED)) if (REPORT_OVERFLOW_HI && ppc_obj64)
ex.X_add_number = PPC_HI (ex.X_add_number); {
else /* PowerPC64 @h is tested for overflow. */
ex.X_add_number = SEX16 (PPC_HI (ex.X_add_number)); ex.X_add_number = (addressT) ex.X_add_number >> 16;
if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
{
addressT sign = (((addressT) -1 >> 16) + 1) >> 1;
ex.X_add_number
= ((addressT) ex.X_add_number ^ sign) - sign;
}
break;
}
/* Fall thru */
case BFD_RELOC_PPC64_ADDR16_HIGH:
ex.X_add_number = PPC_HI (ex.X_add_number);
if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
ex.X_add_number = SEX16 (ex.X_add_number);
break; break;
case BFD_RELOC_HI16_S: case BFD_RELOC_HI16_S:
if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED)) if (REPORT_OVERFLOW_HI && ppc_obj64)
ex.X_add_number = PPC_HA (ex.X_add_number); {
else /* PowerPC64 @ha is tested for overflow. */
ex.X_add_number = SEX16 (PPC_HA (ex.X_add_number)); ex.X_add_number
= ((addressT) ex.X_add_number + 0x8000) >> 16;
if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
{
addressT sign = (((addressT) -1 >> 16) + 1) >> 1;
ex.X_add_number
= ((addressT) ex.X_add_number ^ sign) - sign;
}
break;
}
/* Fall thru */
case BFD_RELOC_PPC64_ADDR16_HIGHA:
ex.X_add_number = PPC_HA (ex.X_add_number);
if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
ex.X_add_number = SEX16 (ex.X_add_number);
break; break;
case BFD_RELOC_PPC64_HIGHER: case BFD_RELOC_PPC64_HIGHER:
if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED)) ex.X_add_number = PPC_HIGHER (ex.X_add_number);
ex.X_add_number = PPC_HIGHER (ex.X_add_number); if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
else ex.X_add_number = SEX16 (ex.X_add_number);
ex.X_add_number = SEX16 (PPC_HIGHER (ex.X_add_number));
break; break;
case BFD_RELOC_PPC64_HIGHER_S: case BFD_RELOC_PPC64_HIGHER_S:
if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED)) ex.X_add_number = PPC_HIGHERA (ex.X_add_number);
ex.X_add_number = PPC_HIGHERA (ex.X_add_number); if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
else ex.X_add_number = SEX16 (ex.X_add_number);
ex.X_add_number = SEX16 (PPC_HIGHERA (ex.X_add_number));
break; break;
case BFD_RELOC_PPC64_HIGHEST: case BFD_RELOC_PPC64_HIGHEST:
if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED)) ex.X_add_number = PPC_HIGHEST (ex.X_add_number);
ex.X_add_number = PPC_HIGHEST (ex.X_add_number); if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
else ex.X_add_number = SEX16 (ex.X_add_number);
ex.X_add_number = SEX16 (PPC_HIGHEST (ex.X_add_number));
break; break;
case BFD_RELOC_PPC64_HIGHEST_S: case BFD_RELOC_PPC64_HIGHEST_S:
if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED)) ex.X_add_number = PPC_HIGHESTA (ex.X_add_number);
ex.X_add_number = PPC_HIGHESTA (ex.X_add_number); if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
else ex.X_add_number = SEX16 (ex.X_add_number);
ex.X_add_number = SEX16 (PPC_HIGHESTA (ex.X_add_number));
break; break;
} }
#endif /* OBJ_ELF */ #endif /* OBJ_ELF */
...@@ -6390,25 +6421,51 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) ...@@ -6390,25 +6421,51 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
fieldval = value & 0xffff; fieldval = value & 0xffff;
sign_extend_16: sign_extend_16:
if (operand != NULL && (operand->flags & PPC_OPERAND_SIGNED) != 0) if (operand != NULL && (operand->flags & PPC_OPERAND_SIGNED) != 0)
fieldval = (fieldval ^ 0x8000) - 0x8000; fieldval = SEX16 (fieldval);
fixP->fx_no_overflow = 1; fixP->fx_no_overflow = 1;
break; break;
case BFD_RELOC_HI16:
case BFD_RELOC_HI16_PCREL:
#ifdef OBJ_ELF #ifdef OBJ_ELF
if (REPORT_OVERFLOW_HI && ppc_obj64)
{
fieldval = value >> 16;
if (operand != NULL && (operand->flags & PPC_OPERAND_SIGNED) != 0)
{
valueT sign = (((valueT) -1 >> 16) + 1) >> 1;
fieldval = ((valueT) fieldval ^ sign) - sign;
}
break;
}
/* Fall thru */
case BFD_RELOC_PPC_VLE_HI16A: case BFD_RELOC_PPC_VLE_HI16A:
case BFD_RELOC_PPC_VLE_HI16D: case BFD_RELOC_PPC_VLE_HI16D:
case BFD_RELOC_PPC64_ADDR16_HIGH:
#endif #endif
case BFD_RELOC_HI16:
case BFD_RELOC_HI16_PCREL:
fieldval = PPC_HI (value); fieldval = PPC_HI (value);
goto sign_extend_16; goto sign_extend_16;
case BFD_RELOC_HI16_S:
case BFD_RELOC_HI16_S_PCREL:
#ifdef OBJ_ELF #ifdef OBJ_ELF
if (REPORT_OVERFLOW_HI && ppc_obj64)
{
fieldval = (value + 0x8000) >> 16;
if (operand != NULL && (operand->flags & PPC_OPERAND_SIGNED) != 0)
{
valueT sign = (((valueT) -1 >> 16) + 1) >> 1;
fieldval = ((valueT) fieldval ^ sign) - sign;
}
break;
}
/* Fall thru */
case BFD_RELOC_PPC_VLE_HA16A: case BFD_RELOC_PPC_VLE_HA16A:
case BFD_RELOC_PPC_VLE_HA16D: case BFD_RELOC_PPC_VLE_HA16D:
case BFD_RELOC_PPC64_ADDR16_HIGHA:
#endif #endif
case BFD_RELOC_HI16_S:
case BFD_RELOC_HI16_S_PCREL:
fieldval = PPC_HA (value); fieldval = PPC_HA (value);
goto sign_extend_16; goto sign_extend_16;
...@@ -6471,10 +6528,14 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) ...@@ -6471,10 +6528,14 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
case BFD_RELOC_PPC_GOT_DTPREL16_HA: case BFD_RELOC_PPC_GOT_DTPREL16_HA:
case BFD_RELOC_PPC64_TPREL16_DS: case BFD_RELOC_PPC64_TPREL16_DS:
case BFD_RELOC_PPC64_TPREL16_LO_DS: case BFD_RELOC_PPC64_TPREL16_LO_DS:
case BFD_RELOC_PPC64_TPREL16_HIGH:
case BFD_RELOC_PPC64_TPREL16_HIGHA:
case BFD_RELOC_PPC64_TPREL16_HIGHER: case BFD_RELOC_PPC64_TPREL16_HIGHER:
case BFD_RELOC_PPC64_TPREL16_HIGHERA: case BFD_RELOC_PPC64_TPREL16_HIGHERA:
case BFD_RELOC_PPC64_TPREL16_HIGHEST: case BFD_RELOC_PPC64_TPREL16_HIGHEST:
case BFD_RELOC_PPC64_TPREL16_HIGHESTA: case BFD_RELOC_PPC64_TPREL16_HIGHESTA:
case BFD_RELOC_PPC64_DTPREL16_HIGH:
case BFD_RELOC_PPC64_DTPREL16_HIGHA:
case BFD_RELOC_PPC64_DTPREL16_DS: case BFD_RELOC_PPC64_DTPREL16_DS:
case BFD_RELOC_PPC64_DTPREL16_LO_DS: case BFD_RELOC_PPC64_DTPREL16_LO_DS:
case BFD_RELOC_PPC64_DTPREL16_HIGHER: case BFD_RELOC_PPC64_DTPREL16_HIGHER:
...@@ -6660,6 +6721,8 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) ...@@ -6660,6 +6721,8 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
case BFD_RELOC_PPC64_HIGHER_S: case BFD_RELOC_PPC64_HIGHER_S:
case BFD_RELOC_PPC64_HIGHEST: case BFD_RELOC_PPC64_HIGHEST:
case BFD_RELOC_PPC64_HIGHEST_S: case BFD_RELOC_PPC64_HIGHEST_S:
case BFD_RELOC_PPC64_ADDR16_HIGH:
case BFD_RELOC_PPC64_ADDR16_HIGHA:
break; break;
case BFD_RELOC_PPC_DTPMOD: case BFD_RELOC_PPC_DTPMOD:
...@@ -6736,10 +6799,14 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) ...@@ -6736,10 +6799,14 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
case BFD_RELOC_PPC64_TOC16_LO: case BFD_RELOC_PPC64_TOC16_LO:
case BFD_RELOC_PPC64_TOC16_HI: case BFD_RELOC_PPC64_TOC16_HI:
case BFD_RELOC_PPC64_TOC16_HA: case BFD_RELOC_PPC64_TOC16_HA:
case BFD_RELOC_PPC64_DTPREL16_HIGH:
case BFD_RELOC_PPC64_DTPREL16_HIGHA:
case BFD_RELOC_PPC64_DTPREL16_HIGHER: case BFD_RELOC_PPC64_DTPREL16_HIGHER:
case BFD_RELOC_PPC64_DTPREL16_HIGHERA: case BFD_RELOC_PPC64_DTPREL16_HIGHERA:
case BFD_RELOC_PPC64_DTPREL16_HIGHEST: case BFD_RELOC_PPC64_DTPREL16_HIGHEST:
case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: case BFD_RELOC_PPC64_DTPREL16_HIGHESTA:
case BFD_RELOC_PPC64_TPREL16_HIGH:
case BFD_RELOC_PPC64_TPREL16_HIGHA:
case BFD_RELOC_PPC64_TPREL16_HIGHER: case BFD_RELOC_PPC64_TPREL16_HIGHER:
case BFD_RELOC_PPC64_TPREL16_HIGHERA: case BFD_RELOC_PPC64_TPREL16_HIGHERA:
case BFD_RELOC_PPC64_TPREL16_HIGHEST: case BFD_RELOC_PPC64_TPREL16_HIGHEST:
......
2013-11-15 Alan Modra <amodra@gmail.com>
Apply changes from mainline to 2.24
2013-10-30 Alan Modra <amodra@gmail.com>
* powerpc.cc (Target_powerpc::Scan::check_non_pic): Handle new relocs.
(Target_powerpc::Scan::global, local): Likewise.
(Target_powerpc::Relocate::relocate): Likewise. Check for overflow
on all ppc64 @h and @ha relocs.
2013-10-30 Roland McGrath <mcgrathr@google.com> 2013-10-30 Roland McGrath <mcgrathr@google.com>
* x86_64.cc (Output_data_plt_x86_64_nacl::first_plt_entry): * x86_64.cc (Output_data_plt_x86_64_nacl::first_plt_entry):
......
...@@ -4877,6 +4877,8 @@ Target_powerpc<size, big_endian>::Scan::check_non_pic(Relobj* object, ...@@ -4877,6 +4877,8 @@ Target_powerpc<size, big_endian>::Scan::check_non_pic(Relobj* object,
case elfcpp::R_PPC64_JMP_IREL: case elfcpp::R_PPC64_JMP_IREL:
case elfcpp::R_PPC64_ADDR16_DS: case elfcpp::R_PPC64_ADDR16_DS:
case elfcpp::R_PPC64_ADDR16_LO_DS: case elfcpp::R_PPC64_ADDR16_LO_DS:
case elfcpp::R_PPC64_ADDR16_HIGH:
case elfcpp::R_PPC64_ADDR16_HIGHA:
case elfcpp::R_PPC64_ADDR16_HIGHER: case elfcpp::R_PPC64_ADDR16_HIGHER:
case elfcpp::R_PPC64_ADDR16_HIGHEST: case elfcpp::R_PPC64_ADDR16_HIGHEST:
case elfcpp::R_PPC64_ADDR16_HIGHERA: case elfcpp::R_PPC64_ADDR16_HIGHERA:
...@@ -4885,6 +4887,8 @@ Target_powerpc<size, big_endian>::Scan::check_non_pic(Relobj* object, ...@@ -4885,6 +4887,8 @@ Target_powerpc<size, big_endian>::Scan::check_non_pic(Relobj* object,
case elfcpp::R_POWERPC_ADDR30: case elfcpp::R_POWERPC_ADDR30:
case elfcpp::R_PPC64_TPREL16_DS: case elfcpp::R_PPC64_TPREL16_DS:
case elfcpp::R_PPC64_TPREL16_LO_DS: case elfcpp::R_PPC64_TPREL16_LO_DS:
case elfcpp::R_PPC64_TPREL16_HIGH:
case elfcpp::R_PPC64_TPREL16_HIGHA:
case elfcpp::R_PPC64_TPREL16_HIGHER: case elfcpp::R_PPC64_TPREL16_HIGHER:
case elfcpp::R_PPC64_TPREL16_HIGHEST: case elfcpp::R_PPC64_TPREL16_HIGHEST:
case elfcpp::R_PPC64_TPREL16_HIGHERA: case elfcpp::R_PPC64_TPREL16_HIGHERA:
...@@ -5057,7 +5061,6 @@ Target_powerpc<size, big_endian>::Scan::local( ...@@ -5057,7 +5061,6 @@ Target_powerpc<size, big_endian>::Scan::local(
case elfcpp::R_POWERPC_GNU_VTINHERIT: case elfcpp::R_POWERPC_GNU_VTINHERIT:
case elfcpp::R_POWERPC_GNU_VTENTRY: case elfcpp::R_POWERPC_GNU_VTENTRY:
case elfcpp::R_PPC64_TOCSAVE: case elfcpp::R_PPC64_TOCSAVE:
case elfcpp::R_PPC_EMB_MRKREF:
case elfcpp::R_POWERPC_TLS: case elfcpp::R_POWERPC_TLS:
break; break;
...@@ -5094,6 +5097,8 @@ Target_powerpc<size, big_endian>::Scan::local( ...@@ -5094,6 +5097,8 @@ Target_powerpc<size, big_endian>::Scan::local(
case elfcpp::R_POWERPC_ADDR16_HI: case elfcpp::R_POWERPC_ADDR16_HI:
case elfcpp::R_POWERPC_ADDR16_HA: case elfcpp::R_POWERPC_ADDR16_HA:
case elfcpp::R_POWERPC_UADDR16: case elfcpp::R_POWERPC_UADDR16:
case elfcpp::R_PPC64_ADDR16_HIGH:
case elfcpp::R_PPC64_ADDR16_HIGHA:
case elfcpp::R_PPC64_ADDR16_HIGHER: case elfcpp::R_PPC64_ADDR16_HIGHER:
case elfcpp::R_PPC64_ADDR16_HIGHERA: case elfcpp::R_PPC64_ADDR16_HIGHERA:
case elfcpp::R_PPC64_ADDR16_HIGHEST: case elfcpp::R_PPC64_ADDR16_HIGHEST:
...@@ -5152,31 +5157,35 @@ Target_powerpc<size, big_endian>::Scan::local( ...@@ -5152,31 +5157,35 @@ Target_powerpc<size, big_endian>::Scan::local(
case elfcpp::R_POWERPC_REL16_HI: case elfcpp::R_POWERPC_REL16_HI:
case elfcpp::R_POWERPC_REL16_HA: case elfcpp::R_POWERPC_REL16_HA:
case elfcpp::R_POWERPC_SECTOFF: case elfcpp::R_POWERPC_SECTOFF:
case elfcpp::R_POWERPC_TPREL16:
case elfcpp::R_POWERPC_DTPREL16:
case elfcpp::R_POWERPC_SECTOFF_LO: case elfcpp::R_POWERPC_SECTOFF_LO:
case elfcpp::R_POWERPC_TPREL16_LO:
case elfcpp::R_POWERPC_DTPREL16_LO:
case elfcpp::R_POWERPC_SECTOFF_HI: case elfcpp::R_POWERPC_SECTOFF_HI:
case elfcpp::R_POWERPC_TPREL16_HI:
case elfcpp::R_POWERPC_DTPREL16_HI:
case elfcpp::R_POWERPC_SECTOFF_HA: case elfcpp::R_POWERPC_SECTOFF_HA:
case elfcpp::R_PPC64_SECTOFF_DS:
case elfcpp::R_PPC64_SECTOFF_LO_DS:
case elfcpp::R_POWERPC_TPREL16:
case elfcpp::R_POWERPC_TPREL16_LO:
case elfcpp::R_POWERPC_TPREL16_HI:
case elfcpp::R_POWERPC_TPREL16_HA: case elfcpp::R_POWERPC_TPREL16_HA:
case elfcpp::R_POWERPC_DTPREL16_HA: case elfcpp::R_PPC64_TPREL16_DS:
case elfcpp::R_PPC64_DTPREL16_HIGHER: case elfcpp::R_PPC64_TPREL16_LO_DS:
case elfcpp::R_PPC64_TPREL16_HIGH:
case elfcpp::R_PPC64_TPREL16_HIGHA:
case elfcpp::R_PPC64_TPREL16_HIGHER: case elfcpp::R_PPC64_TPREL16_HIGHER:
case elfcpp::R_PPC64_DTPREL16_HIGHERA:
case elfcpp::R_PPC64_TPREL16_HIGHERA: case elfcpp::R_PPC64_TPREL16_HIGHERA:
case elfcpp::R_PPC64_DTPREL16_HIGHEST:
case elfcpp::R_PPC64_TPREL16_HIGHEST: case elfcpp::R_PPC64_TPREL16_HIGHEST:
case elfcpp::R_PPC64_DTPREL16_HIGHESTA:
case elfcpp::R_PPC64_TPREL16_HIGHESTA: case elfcpp::R_PPC64_TPREL16_HIGHESTA:
case elfcpp::R_PPC64_TPREL16_DS: case elfcpp::R_POWERPC_DTPREL16:
case elfcpp::R_PPC64_TPREL16_LO_DS: case elfcpp::R_POWERPC_DTPREL16_LO:
case elfcpp::R_POWERPC_DTPREL16_HI:
case elfcpp::R_POWERPC_DTPREL16_HA:
case elfcpp::R_PPC64_DTPREL16_DS: case elfcpp::R_PPC64_DTPREL16_DS:
case elfcpp::R_PPC64_DTPREL16_LO_DS: case elfcpp::R_PPC64_DTPREL16_LO_DS:
case elfcpp::R_PPC64_SECTOFF_DS: case elfcpp::R_PPC64_DTPREL16_HIGH:
case elfcpp::R_PPC64_SECTOFF_LO_DS: case elfcpp::R_PPC64_DTPREL16_HIGHA:
case elfcpp::R_PPC64_DTPREL16_HIGHER:
case elfcpp::R_PPC64_DTPREL16_HIGHERA:
case elfcpp::R_PPC64_DTPREL16_HIGHEST:
case elfcpp::R_PPC64_DTPREL16_HIGHESTA:
case elfcpp::R_PPC64_TLSGD: case elfcpp::R_PPC64_TLSGD:
case elfcpp::R_PPC64_TLSLD: case elfcpp::R_PPC64_TLSLD:
break; break;
...@@ -5407,7 +5416,6 @@ Target_powerpc<size, big_endian>::Scan::global( ...@@ -5407,7 +5416,6 @@ Target_powerpc<size, big_endian>::Scan::global(
case elfcpp::R_POWERPC_GNU_VTINHERIT: case elfcpp::R_POWERPC_GNU_VTINHERIT:
case elfcpp::R_POWERPC_GNU_VTENTRY: case elfcpp::R_POWERPC_GNU_VTENTRY:
case elfcpp::R_PPC_LOCAL24PC: case elfcpp::R_PPC_LOCAL24PC:
case elfcpp::R_PPC_EMB_MRKREF:
case elfcpp::R_POWERPC_TLS: case elfcpp::R_POWERPC_TLS:
break; break;
...@@ -5456,6 +5464,8 @@ Target_powerpc<size, big_endian>::Scan::global( ...@@ -5456,6 +5464,8 @@ Target_powerpc<size, big_endian>::Scan::global(
case elfcpp::R_POWERPC_ADDR16_HI: case elfcpp::R_POWERPC_ADDR16_HI:
case elfcpp::R_POWERPC_ADDR16_HA: case elfcpp::R_POWERPC_ADDR16_HA:
case elfcpp::R_POWERPC_UADDR16: case elfcpp::R_POWERPC_UADDR16:
case elfcpp::R_PPC64_ADDR16_HIGH:
case elfcpp::R_PPC64_ADDR16_HIGHA:
case elfcpp::R_PPC64_ADDR16_HIGHER: case elfcpp::R_PPC64_ADDR16_HIGHER:
case elfcpp::R_PPC64_ADDR16_HIGHERA: case elfcpp::R_PPC64_ADDR16_HIGHERA:
case elfcpp::R_PPC64_ADDR16_HIGHEST: case elfcpp::R_PPC64_ADDR16_HIGHEST:
...@@ -5581,31 +5591,35 @@ Target_powerpc<size, big_endian>::Scan::global( ...@@ -5581,31 +5591,35 @@ Target_powerpc<size, big_endian>::Scan::global(
case elfcpp::R_POWERPC_REL16_HI: case elfcpp::R_POWERPC_REL16_HI:
case elfcpp::R_POWERPC_REL16_HA: case elfcpp::R_POWERPC_REL16_HA:
case elfcpp::R_POWERPC_SECTOFF: case elfcpp::R_POWERPC_SECTOFF:
case elfcpp::R_POWERPC_TPREL16:
case elfcpp::R_POWERPC_DTPREL16:
case elfcpp::R_POWERPC_SECTOFF_LO: case elfcpp::R_POWERPC_SECTOFF_LO:
case elfcpp::R_POWERPC_TPREL16_LO:
case elfcpp::R_POWERPC_DTPREL16_LO:
case elfcpp::R_POWERPC_SECTOFF_HI: case elfcpp::R_POWERPC_SECTOFF_HI:
case elfcpp::R_POWERPC_TPREL16_HI:
case elfcpp::R_POWERPC_DTPREL16_HI:
case elfcpp::R_POWERPC_SECTOFF_HA: case elfcpp::R_POWERPC_SECTOFF_HA:
case elfcpp::R_PPC64_SECTOFF_DS:
case elfcpp::R_PPC64_SECTOFF_LO_DS:
case elfcpp::R_POWERPC_TPREL16:
case elfcpp::R_POWERPC_TPREL16_LO:
case elfcpp::R_POWERPC_TPREL16_HI:
case elfcpp::R_POWERPC_TPREL16_HA: case elfcpp::R_POWERPC_TPREL16_HA:
case elfcpp::R_POWERPC_DTPREL16_HA: case elfcpp::R_PPC64_TPREL16_DS:
case elfcpp::R_PPC64_DTPREL16_HIGHER: case elfcpp::R_PPC64_TPREL16_LO_DS:
case elfcpp::R_PPC64_TPREL16_HIGH:
case elfcpp::R_PPC64_TPREL16_HIGHA:
case elfcpp::R_PPC64_TPREL16_HIGHER: case elfcpp::R_PPC64_TPREL16_HIGHER:
case elfcpp::R_PPC64_DTPREL16_HIGHERA:
case elfcpp::R_PPC64_TPREL16_HIGHERA: case elfcpp::R_PPC64_TPREL16_HIGHERA:
case elfcpp::R_PPC64_DTPREL16_HIGHEST:
case elfcpp::R_PPC64_TPREL16_HIGHEST: case elfcpp::R_PPC64_TPREL16_HIGHEST:
case elfcpp::R_PPC64_DTPREL16_HIGHESTA:
case elfcpp::R_PPC64_TPREL16_HIGHESTA: case elfcpp::R_PPC64_TPREL16_HIGHESTA:
case elfcpp::R_PPC64_TPREL16_DS: case elfcpp::R_POWERPC_DTPREL16:
case elfcpp::R_PPC64_TPREL16_LO_DS: case elfcpp::R_POWERPC_DTPREL16_LO:
case elfcpp::R_POWERPC_DTPREL16_HI:
case elfcpp::R_POWERPC_DTPREL16_HA:
case elfcpp::R_PPC64_DTPREL16_DS: case elfcpp::R_PPC64_DTPREL16_DS:
case elfcpp::R_PPC64_DTPREL16_LO_DS: case elfcpp::R_PPC64_DTPREL16_LO_DS:
case elfcpp::R_PPC64_SECTOFF_DS: case elfcpp::R_PPC64_DTPREL16_HIGH:
case elfcpp::R_PPC64_SECTOFF_LO_DS: case elfcpp::R_PPC64_DTPREL16_HIGHA:
case elfcpp::R_PPC64_DTPREL16_HIGHER:
case elfcpp::R_PPC64_DTPREL16_HIGHERA:
case elfcpp::R_PPC64_DTPREL16_HIGHEST:
case elfcpp::R_PPC64_DTPREL16_HIGHESTA:
case elfcpp::R_PPC64_TLSGD: case elfcpp::R_PPC64_TLSGD:
case elfcpp::R_PPC64_TLSLD: case elfcpp::R_PPC64_TLSLD:
break; break;
...@@ -6748,8 +6762,10 @@ Target_powerpc<size, big_endian>::Relocate::relocate( ...@@ -6748,8 +6762,10 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
case elfcpp::R_PPC64_TPREL16_DS: case elfcpp::R_PPC64_TPREL16_DS:
case elfcpp::R_PPC64_TPREL16_LO_DS: case elfcpp::R_PPC64_TPREL16_LO_DS:
case elfcpp::R_PPC64_TPREL16_HIGH:
case elfcpp::R_PPC64_TPREL16_HIGHA:
if (size != 64) if (size != 64)
// R_PPC_TLSGD and R_PPC_TLSLD // R_PPC_TLSGD, R_PPC_TLSLD, R_PPC_EMB_RELST_LO, R_PPC_EMB_RELST_HI
break; break;
case elfcpp::R_POWERPC_TPREL16: case elfcpp::R_POWERPC_TPREL16:
case elfcpp::R_POWERPC_TPREL16_LO: case elfcpp::R_POWERPC_TPREL16_LO:
...@@ -6779,6 +6795,8 @@ Target_powerpc<size, big_endian>::Relocate::relocate( ...@@ -6779,6 +6795,8 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
case elfcpp::R_POWERPC_DTPREL16_HI: case elfcpp::R_POWERPC_DTPREL16_HI: