From f098cfc24bae8e0685bcae53ea4fdc3326ddc6c4 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Thu, 13 Sep 2012 14:59:10 -0700 Subject: binutils-2.22: Backport PR fixes from 2.22 branch These are fixes mainly cherrypicks for mips/ppc/x86 mainly fixing PRs in ld and gold Signed-off-by: Khem Raj Signed-off-by: Saul Wold --- meta/recipes-devtools/binutils/binutils-2.22.inc | 16 +- ...print_insn_micromips-Rename-local-variabl.patch | 634 +++++++ .../binutils/binutils/0019-PR-ld-13468.patch | 46 + .../binutils/0028-Backport-from-mainline.patch | 139 ++ ...19-Chung-Lin-Tang-cltang-codesourcery.com.patch | 47 + ...19-Chung-Lin-Tang-cltang-codesourcery.com.patch | 214 +++ ...19-Chung-Lin-Tang-cltang-codesourcery.com.patch | 1068 +++++++++++ ...opy-from-mainline-to-binutils-2.22-branch.patch | 1944 ++++++++++++++++++++ ...elf32bmip.sh-OTHER_SECTIONS-Put-.mdebug.-.patch | 49 + .../binutils/binutils/0052-gas.patch | 83 + ...55-Remove-ABI_64_P-check-on-R_X86_64_PCXX.patch | 176 ++ .../binutils/binutils/0078-PR-binutils-13622.patch | 48 + .../binutils/0144-timer.cc-include-unistd.h.patch | 32 + ...-2012-04-27-Doug-Kwan-dougkwan-google.com.patch | 169 ++ .../binutils/binutils/0182-PR-ld-13991.patch | 1617 ++++++++++++++++ 15 files changed, 6281 insertions(+), 1 deletion(-) create mode 100644 meta/recipes-devtools/binutils/binutils/0006-mips-dis.c-print_insn_micromips-Rename-local-variabl.patch create mode 100644 meta/recipes-devtools/binutils/binutils/0019-PR-ld-13468.patch create mode 100644 meta/recipes-devtools/binutils/binutils/0028-Backport-from-mainline.patch create mode 100644 meta/recipes-devtools/binutils/binutils/0035-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch create mode 100644 meta/recipes-devtools/binutils/binutils/0036-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch create mode 100644 meta/recipes-devtools/binutils/binutils/0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch create mode 100644 meta/recipes-devtools/binutils/binutils/0038-Copy-from-mainline-to-binutils-2.22-branch.patch create mode 100644 meta/recipes-devtools/binutils/binutils/0039-emulparams-elf32bmip.sh-OTHER_SECTIONS-Put-.mdebug.-.patch create mode 100644 meta/recipes-devtools/binutils/binutils/0052-gas.patch create mode 100644 meta/recipes-devtools/binutils/binutils/0055-Remove-ABI_64_P-check-on-R_X86_64_PCXX.patch create mode 100644 meta/recipes-devtools/binutils/binutils/0078-PR-binutils-13622.patch create mode 100644 meta/recipes-devtools/binutils/binutils/0144-timer.cc-include-unistd.h.patch create mode 100644 meta/recipes-devtools/binutils/binutils/0166-2012-04-27-Doug-Kwan-dougkwan-google.com.patch create mode 100644 meta/recipes-devtools/binutils/binutils/0182-PR-ld-13991.patch diff --git a/meta/recipes-devtools/binutils/binutils-2.22.inc b/meta/recipes-devtools/binutils/binutils-2.22.inc index 821cc555d0..42dc6b78b5 100644 --- a/meta/recipes-devtools/binutils/binutils-2.22.inc +++ b/meta/recipes-devtools/binutils/binutils-2.22.inc @@ -1,4 +1,4 @@ -PR = "r15" +PR = "r16" LIC_FILES_CHKSUM="\ file://src-release;endline=17;md5=4830a9ef968f3b18dd5e9f2c00db2d35\ @@ -32,6 +32,20 @@ SRC_URI = "\ file://mips64-default-ld-emulation.patch \ file://0001-PR-ld-13470.patch \ file://rpath-sysroot.patch \ + file://0006-mips-dis.c-print_insn_micromips-Rename-local-variabl.patch \ + file://0019-PR-ld-13468.patch \ + file://0028-Backport-from-mainline.patch \ + file://0035-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch \ + file://0036-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch \ + file://0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch \ + file://0038-Copy-from-mainline-to-binutils-2.22-branch.patch \ + file://0039-emulparams-elf32bmip.sh-OTHER_SECTIONS-Put-.mdebug.-.patch \ + file://0052-gas.patch \ + file://0055-Remove-ABI_64_P-check-on-R_X86_64_PCXX.patch \ + file://0078-PR-binutils-13622.patch \ + file://0144-timer.cc-include-unistd.h.patch \ + file://0166-2012-04-27-Doug-Kwan-dougkwan-google.com.patch \ + file://0182-PR-ld-13991.patch \ " SRC_URI[md5sum] = "ee0f10756c84979622b992a4a61ea3f5" diff --git a/meta/recipes-devtools/binutils/binutils/0006-mips-dis.c-print_insn_micromips-Rename-local-variabl.patch b/meta/recipes-devtools/binutils/binutils/0006-mips-dis.c-print_insn_micromips-Rename-local-variabl.patch new file mode 100644 index 0000000000..1baf1e839a --- /dev/null +++ b/meta/recipes-devtools/binutils/binutils/0006-mips-dis.c-print_insn_micromips-Rename-local-variabl.patch @@ -0,0 +1,634 @@ +Upstream-Status: Backport + +From f72b2c498bc98f42048a3bf7f7d7891db9cabcfc Mon Sep 17 00:00:00 2001 +From: Pierre Muller +Date: Fri, 25 Nov 2011 16:57:32 +0000 +Subject: [PATCH 006/262] * mips-dis.c (print_insn_micromips): Rename + local variable iprintf to infprintf to + avoid shadow warning. + +--- + opcodes/ChangeLog | 5 ++ + opcodes/mips-dis.c | 188 ++++++++++++++++++++++++++-------------------------- + 2 files changed, 99 insertions(+), 94 deletions(-) + +2011-11-25 Pierre Muller + + * mips-dis.c (print_insn_micromips): Rename local variable iprintf + to infprintf to avoid shadow warning. + +diff --git a/opcodes/mips-dis.c b/opcodes/mips-dis.c +index 4e18d8a..72285de 100644 +--- a/opcodes/mips-dis.c ++++ b/opcodes/mips-dis.c +@@ -2260,7 +2260,7 @@ print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info) + static int + print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + { +- const fprintf_ftype iprintf = info->fprintf_func; ++ const fprintf_ftype infprintf = info->fprintf_func; + const struct mips_opcode *op, *opend; + unsigned int lsb, msbd, msb; + void *is = info->stream; +@@ -2307,7 +2307,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info); + if (status != 0) + { +- iprintf (is, "micromips 0x%x", higher); ++ infprintf (is, "micromips 0x%x", higher); + (*info->memory_error_func) (status, memaddr + 2, info); + return -1; + } +@@ -2320,7 +2320,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + status = (*info->read_memory_func) (memaddr + 4, buffer, 2, info); + if (status != 0) + { +- iprintf (is, "micromips 0x%x", higher); ++ infprintf (is, "micromips 0x%x", higher); + (*info->memory_error_func) (status, memaddr + 4, info); + return -1; + } +@@ -2328,7 +2328,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + insn = bfd_getb16 (buffer); + else + insn = bfd_getl16 (buffer); +- iprintf (is, "0x%x%04x (48-bit insn)", higher, insn); ++ infprintf (is, "0x%x%04x (48-bit insn)", higher, insn); + + info->insn_type = dis_noninsn; + return 6; +@@ -2341,7 +2341,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info); + if (status != 0) + { +- iprintf (is, "micromips 0x%x", higher); ++ infprintf (is, "micromips 0x%x", higher); + (*info->memory_error_func) (status, memaddr + 2, info); + return -1; + } +@@ -2371,9 +2371,9 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + { + const char *s; + +- iprintf (is, "%s", op->name); ++ infprintf (is, "%s", op->name); + if (op->args[0] != '\0') +- iprintf (is, "\t"); ++ infprintf (is, "\t"); + + for (s = op->args; *s != '\0'; s++) + { +@@ -2382,37 +2382,37 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + case ',': + case '(': + case ')': +- iprintf (is, "%c", *s); ++ infprintf (is, "%c", *s); + break; + + case '.': + delta = GET_OP (insn, OFFSET10); + if (delta & 0x200) + delta |= ~0x3ff; +- iprintf (is, "%d", delta); ++ infprintf (is, "%d", delta); + break; + + case '1': +- iprintf (is, "0x%lx", GET_OP (insn, STYPE)); ++ infprintf (is, "0x%lx", GET_OP (insn, STYPE)); + break; + + case '<': +- iprintf (is, "0x%lx", GET_OP (insn, SHAMT)); ++ infprintf (is, "0x%lx", GET_OP (insn, SHAMT)); + break; + + case '\\': +- iprintf (is, "0x%lx", GET_OP (insn, 3BITPOS)); ++ infprintf (is, "0x%lx", GET_OP (insn, 3BITPOS)); + break; + + case '|': +- iprintf (is, "0x%lx", GET_OP (insn, TRAP)); ++ infprintf (is, "0x%lx", GET_OP (insn, TRAP)); + break; + + case '~': + delta = GET_OP (insn, OFFSET12); + if (delta & 0x800) + delta |= ~0x7ff; +- iprintf (is, "%d", delta); ++ infprintf (is, "%d", delta); + break; + + case 'a': +@@ -2433,34 +2433,34 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + case 'r': + case 's': + case 'v': +- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS)]); ++ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS)]); + break; + + case 'c': +- iprintf (is, "0x%lx", GET_OP (insn, CODE)); ++ infprintf (is, "0x%lx", GET_OP (insn, CODE)); + break; + + case 'd': +- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, RD)]); ++ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RD)]); + break; + + case 'h': +- iprintf (is, "0x%lx", GET_OP (insn, PREFX)); ++ infprintf (is, "0x%lx", GET_OP (insn, PREFX)); + break; + + case 'i': + case 'u': +- iprintf (is, "0x%lx", GET_OP (insn, IMMEDIATE)); ++ infprintf (is, "0x%lx", GET_OP (insn, IMMEDIATE)); + break; + + case 'j': /* Same as i, but sign-extended. */ + case 'o': + delta = (GET_OP (insn, DELTA) ^ 0x8000) - 0x8000; +- iprintf (is, "%d", delta); ++ infprintf (is, "%d", delta); + break; + + case 'k': +- iprintf (is, "0x%x", GET_OP (insn, CACHE)); ++ infprintf (is, "0x%x", GET_OP (insn, CACHE)); + break; + + case 'n': +@@ -2472,26 +2472,26 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + if (s_reg_encode != 0) + { + if (s_reg_encode == 1) +- iprintf (is, "%s", mips_gpr_names[16]); ++ infprintf (is, "%s", mips_gpr_names[16]); + else if (s_reg_encode < 9) +- iprintf (is, "%s-%s", ++ infprintf (is, "%s-%s", + mips_gpr_names[16], + mips_gpr_names[15 + s_reg_encode]); + else if (s_reg_encode == 9) +- iprintf (is, "%s-%s,%s", ++ infprintf (is, "%s-%s,%s", + mips_gpr_names[16], + mips_gpr_names[23], + mips_gpr_names[30]); + else +- iprintf (is, "UNKNOWN"); ++ infprintf (is, "UNKNOWN"); + } + + if (immed & 0x10) /* For ra. */ + { + if (s_reg_encode == 0) +- iprintf (is, "%s", mips_gpr_names[31]); ++ infprintf (is, "%s", mips_gpr_names[31]); + else +- iprintf (is, ",%s", mips_gpr_names[31]); ++ infprintf (is, ",%s", mips_gpr_names[31]); + } + break; + } +@@ -2504,32 +2504,32 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + break; + + case 'q': +- iprintf (is, "0x%lx", GET_OP (insn, CODE2)); ++ infprintf (is, "0x%lx", GET_OP (insn, CODE2)); + break; + + case 't': + case 'w': +- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, RT)]); ++ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RT)]); + break; + + case 'y': +- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS3)]); ++ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS3)]); + break; + + case 'z': +- iprintf (is, "%s", mips_gpr_names[0]); ++ infprintf (is, "%s", mips_gpr_names[0]); + break; + + case 'B': +- iprintf (is, "0x%lx", GET_OP (insn, CODE10)); ++ infprintf (is, "0x%lx", GET_OP (insn, CODE10)); + break; + + case 'C': +- iprintf (is, "0x%lx", GET_OP (insn, COPZ)); ++ infprintf (is, "0x%lx", GET_OP (insn, COPZ)); + break; + + case 'D': +- iprintf (is, "%s", mips_fpr_names[GET_OP (insn, FD)]); ++ infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FD)]); + break; + + case 'E': +@@ -2540,7 +2540,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + 'T' format. Therefore, until we gain understanding of + cp2 register names, we can simply print the register + numbers. */ +- iprintf (is, "$%ld", GET_OP (insn, RT)); ++ infprintf (is, "$%ld", GET_OP (insn, RT)); + break; + + case 'G': +@@ -2559,44 +2559,44 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + case 0x000002fc: /* mtc0 */ + case 0x580000fc: /* dmfc0 */ + case 0x580002fc: /* dmtc0 */ +- iprintf (is, "%s", mips_cp0_names[GET_OP (insn, RS)]); ++ infprintf (is, "%s", mips_cp0_names[GET_OP (insn, RS)]); + break; + default: +- iprintf (is, "$%ld", GET_OP (insn, RS)); ++ infprintf (is, "$%ld", GET_OP (insn, RS)); + break; + } + break; + + case 'H': +- iprintf (is, "%ld", GET_OP (insn, SEL)); ++ infprintf (is, "%ld", GET_OP (insn, SEL)); + break; + + case 'K': +- iprintf (is, "%s", mips_hwr_names[GET_OP (insn, RS)]); ++ infprintf (is, "%s", mips_hwr_names[GET_OP (insn, RS)]); + break; + + case 'M': +- iprintf (is, "$fcc%ld", GET_OP (insn, CCC)); ++ infprintf (is, "$fcc%ld", GET_OP (insn, CCC)); + break; + + case 'N': +- iprintf (is, ++ infprintf (is, + (op->pinfo & (FP_D | FP_S)) != 0 + ? "$fcc%ld" : "$cc%ld", + GET_OP (insn, BCC)); + break; + + case 'R': +- iprintf (is, "%s", mips_fpr_names[GET_OP (insn, FR)]); ++ infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FR)]); + break; + + case 'S': + case 'V': +- iprintf (is, "%s", mips_fpr_names[GET_OP (insn, FS)]); ++ infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FS)]); + break; + + case 'T': +- iprintf (is, "%s", mips_fpr_names[GET_OP (insn, FT)]); ++ infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FT)]); + break; + + case '+': +@@ -2606,18 +2606,18 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + { + case 'A': + lsb = GET_OP (insn, EXTLSB); +- iprintf (is, "0x%x", lsb); ++ infprintf (is, "0x%x", lsb); + break; + + case 'B': + msb = GET_OP (insn, INSMSB); +- iprintf (is, "0x%x", msb - lsb + 1); ++ infprintf (is, "0x%x", msb - lsb + 1); + break; + + case 'C': + case 'H': + msbd = GET_OP (insn, EXTMSBD); +- iprintf (is, "0x%x", msbd + 1); ++ infprintf (is, "0x%x", msbd + 1); + break; + + case 'D': +@@ -2637,30 +2637,30 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + mips_cp0sel_names_len, + cp0reg, sel); + if (n != NULL) +- iprintf (is, "%s", n->name); ++ infprintf (is, "%s", n->name); + else +- iprintf (is, "$%d,%d", cp0reg, sel); ++ infprintf (is, "$%d,%d", cp0reg, sel); + break; + } + + case 'E': + lsb = GET_OP (insn, EXTLSB) + 32; +- iprintf (is, "0x%x", lsb); ++ infprintf (is, "0x%x", lsb); + break; + + case 'F': + msb = GET_OP (insn, INSMSB) + 32; +- iprintf (is, "0x%x", msb - lsb + 1); ++ infprintf (is, "0x%x", msb - lsb + 1); + break; + + case 'G': + msbd = GET_OP (insn, EXTMSBD) + 32; +- iprintf (is, "0x%x", msbd + 1); ++ infprintf (is, "0x%x", msbd + 1); + break; + + default: + /* xgettext:c-format */ +- iprintf (is, ++ infprintf (is, + _("# internal disassembler error, " + "unrecognized modifier (+%c)"), + *s); +@@ -2674,111 +2674,111 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + switch (*s) + { + case 'a': /* global pointer. */ +- iprintf (is, "%s", mips_gpr_names[28]); ++ infprintf (is, "%s", mips_gpr_names[28]); + break; + + case 'b': + regno = micromips_to_32_reg_b_map[GET_OP (insn, MB)]; +- iprintf (is, "%s", mips_gpr_names[regno]); ++ infprintf (is, "%s", mips_gpr_names[regno]); + break; + + case 'c': + regno = micromips_to_32_reg_c_map[GET_OP (insn, MC)]; +- iprintf (is, "%s", mips_gpr_names[regno]); ++ infprintf (is, "%s", mips_gpr_names[regno]); + break; + + case 'd': + regno = micromips_to_32_reg_d_map[GET_OP (insn, MD)]; +- iprintf (is, "%s", mips_gpr_names[regno]); ++ infprintf (is, "%s", mips_gpr_names[regno]); + break; + + case 'e': + regno = micromips_to_32_reg_e_map[GET_OP (insn, ME)]; +- iprintf (is, "%s", mips_gpr_names[regno]); ++ infprintf (is, "%s", mips_gpr_names[regno]); + break; + + case 'f': + /* Save lastregno for "mt" to print out later. */ + lastregno = micromips_to_32_reg_f_map[GET_OP (insn, MF)]; +- iprintf (is, "%s", mips_gpr_names[lastregno]); ++ infprintf (is, "%s", mips_gpr_names[lastregno]); + break; + + case 'g': + regno = micromips_to_32_reg_g_map[GET_OP (insn, MG)]; +- iprintf (is, "%s", mips_gpr_names[regno]); ++ infprintf (is, "%s", mips_gpr_names[regno]); + break; + + case 'h': + regno = micromips_to_32_reg_h_map[GET_OP (insn, MH)]; +- iprintf (is, "%s", mips_gpr_names[regno]); ++ infprintf (is, "%s", mips_gpr_names[regno]); + break; + + case 'i': + regno = micromips_to_32_reg_i_map[GET_OP (insn, MI)]; +- iprintf (is, "%s", mips_gpr_names[regno]); ++ infprintf (is, "%s", mips_gpr_names[regno]); + break; + + case 'j': +- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, MJ)]); ++ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, MJ)]); + break; + + case 'l': + regno = micromips_to_32_reg_l_map[GET_OP (insn, ML)]; +- iprintf (is, "%s", mips_gpr_names[regno]); ++ infprintf (is, "%s", mips_gpr_names[regno]); + break; + + case 'm': + regno = micromips_to_32_reg_m_map[GET_OP (insn, MM)]; +- iprintf (is, "%s", mips_gpr_names[regno]); ++ infprintf (is, "%s", mips_gpr_names[regno]); + break; + + case 'n': + regno = micromips_to_32_reg_n_map[GET_OP (insn, MN)]; +- iprintf (is, "%s", mips_gpr_names[regno]); ++ infprintf (is, "%s", mips_gpr_names[regno]); + break; + + case 'p': + /* Save lastregno for "mt" to print out later. */ + lastregno = GET_OP (insn, MP); +- iprintf (is, "%s", mips_gpr_names[lastregno]); ++ infprintf (is, "%s", mips_gpr_names[lastregno]); + break; + + case 'q': + regno = micromips_to_32_reg_q_map[GET_OP (insn, MQ)]; +- iprintf (is, "%s", mips_gpr_names[regno]); ++ infprintf (is, "%s", mips_gpr_names[regno]); + break; + + case 'r': /* program counter. */ +- iprintf (is, "$pc"); ++ infprintf (is, "$pc"); + break; + + case 's': /* stack pointer. */ + lastregno = 29; +- iprintf (is, "%s", mips_gpr_names[29]); ++ infprintf (is, "%s", mips_gpr_names[29]); + break; + + case 't': +- iprintf (is, "%s", mips_gpr_names[lastregno]); ++ infprintf (is, "%s", mips_gpr_names[lastregno]); + break; + + case 'z': /* $0. */ +- iprintf (is, "%s", mips_gpr_names[0]); ++ infprintf (is, "%s", mips_gpr_names[0]); + break; + + case 'A': + /* Sign-extend the immediate. */ + immed = ((GET_OP (insn, IMMA) ^ 0x40) - 0x40) << 2; +- iprintf (is, "%d", immed); ++ infprintf (is, "%d", immed); + break; + + case 'B': + immed = micromips_imm_b_map[GET_OP (insn, IMMB)]; +- iprintf (is, "%d", immed); ++ infprintf (is, "%d", immed); + break; + + case 'C': + immed = micromips_imm_c_map[GET_OP (insn, IMMC)]; +- iprintf (is, "0x%lx", immed); ++ infprintf (is, "0x%lx", immed); + break; + + case 'D': +@@ -2797,50 +2797,50 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + + case 'F': + immed = GET_OP (insn, IMMF); +- iprintf (is, "0x%x", immed); ++ infprintf (is, "0x%x", immed); + break; + + case 'G': + immed = (insn >> MICROMIPSOP_SH_IMMG) + 1; + immed = (immed & MICROMIPSOP_MASK_IMMG) - 1; +- iprintf (is, "%d", immed); ++ infprintf (is, "%d", immed); + break; + + case 'H': + immed = GET_OP (insn, IMMH) << 1; +- iprintf (is, "%d", immed); ++ infprintf (is, "%d", immed); + break; + + case 'I': + immed = (insn >> MICROMIPSOP_SH_IMMI) + 1; + immed = (immed & MICROMIPSOP_MASK_IMMI) - 1; +- iprintf (is, "%d", immed); ++ infprintf (is, "%d", immed); + break; + + case 'J': + immed = GET_OP (insn, IMMJ) << 2; +- iprintf (is, "%d", immed); ++ infprintf (is, "%d", immed); + break; + + case 'L': + immed = GET_OP (insn, IMML); +- iprintf (is, "%d", immed); ++ infprintf (is, "%d", immed); + break; + + case 'M': + immed = (insn >> MICROMIPSOP_SH_IMMM) - 1; + immed = (immed & MICROMIPSOP_MASK_IMMM) + 1; +- iprintf (is, "%d", immed); ++ infprintf (is, "%d", immed); + break; + + case 'N': + immed = GET_OP (insn, IMMN); + if (immed == 0) +- iprintf (is, "%s,%s", ++ infprintf (is, "%s,%s", + mips_gpr_names[16], + mips_gpr_names[31]); + else +- iprintf (is, "%s-%s,%s", ++ infprintf (is, "%s-%s,%s", + mips_gpr_names[16], + mips_gpr_names[16 + immed], + mips_gpr_names[31]); +@@ -2848,35 +2848,35 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + + case 'O': + immed = GET_OP (insn, IMMO); +- iprintf (is, "0x%x", immed); ++ infprintf (is, "0x%x", immed); + break; + + case 'P': + immed = GET_OP (insn, IMMP) << 2; +- iprintf (is, "%d", immed); ++ infprintf (is, "%d", immed); + break; + + case 'Q': + /* Sign-extend the immediate. */ + immed = (GET_OP (insn, IMMQ) ^ 0x400000) - 0x400000; + immed <<= 2; +- iprintf (is, "%d", immed); ++ infprintf (is, "%d", immed); + break; + + case 'U': + immed = GET_OP (insn, IMMU) << 2; +- iprintf (is, "%d", immed); ++ infprintf (is, "%d", immed); + break; + + case 'W': + immed = GET_OP (insn, IMMW) << 2; +- iprintf (is, "%d", immed); ++ infprintf (is, "%d", immed); + break; + + case 'X': + /* Sign-extend the immediate. */ + immed = (GET_OP (insn, IMMX) ^ 0x8) - 0x8; +- iprintf (is, "%d", immed); ++ infprintf (is, "%d", immed); + break; + + case 'Y': +@@ -2885,12 +2885,12 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + if (immed >= -2 && immed <= 1) + immed ^= 0x100; + immed = immed << 2; +- iprintf (is, "%d", immed); ++ infprintf (is, "%d", immed); + break; + + default: + /* xgettext:c-format */ +- iprintf (is, ++ infprintf (is, + _("# internal disassembler error, " + "unrecognized modifier (m%c)"), + *s); +@@ -2900,7 +2900,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + + default: + /* xgettext:c-format */ +- iprintf (is, ++ infprintf (is, + _("# internal disassembler error, " + "unrecognized modifier (%c)"), + *s); +@@ -2937,7 +2937,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info) + } + #undef GET_OP + +- iprintf (is, "0x%x", insn); ++ infprintf (is, "0x%x", insn); + info->insn_type = dis_noninsn; + + return length; +-- +1.7.9.5 + diff --git a/meta/recipes-devtools/binutils/binutils/0019-PR-ld-13468.patch b/meta/recipes-devtools/binutils/binutils/0019-PR-ld-13468.patch new file mode 100644 index 0000000000..79d9f48453 --- /dev/null +++ b/meta/recipes-devtools/binutils/binutils/0019-PR-ld-13468.patch @@ -0,0 +1,46 @@ +Upstream-Status: Backport + +From 4c362e4511c4046e230fc9e330bf086753f04338 Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Sat, 3 Dec 2011 10:29:17 +0000 +Subject: [PATCH 019/262] PR ld/13468 * elflink.c + (bfd_elf_final_link): Don't segfault when checking + for DT_TEXTREL and .dynamic does not exist. + +--- + bfd/ChangeLog | 6 ++++++ + bfd/elflink.c | 9 +++------ + 2 files changed, 9 insertions(+), 6 deletions(-) + + 2011-12-03 Alan Modra + + PR ld/13468 + * elflink.c (bfd_elf_final_link): Don't segfault when checking + for DT_TEXTREL and .dynamic does not exist. + +diff --git a/bfd/elflink.c b/bfd/elflink.c +index fc4266b..8556cec 100644 +--- a/bfd/elflink.c ++++ b/bfd/elflink.c +@@ -11188,15 +11188,12 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info) + goto error_return; + + /* Check for DT_TEXTREL (late, in case the backend removes it). */ +- if ((info->warn_shared_textrel && info->shared) +- || info->error_textrel) ++ if (((info->warn_shared_textrel && info->shared) ++ || info->error_textrel) ++ && (o = bfd_get_section_by_name (dynobj, ".dynamic")) != NULL) + { + bfd_byte *dyncon, *dynconend; + +- /* Fix up .dynamic entries. */ +- o = bfd_get_section_by_name (dynobj, ".dynamic"); +- BFD_ASSERT (o != NULL); +- + dyncon = o->contents; + dynconend = o->contents + o->size; + for (; dyncon < dynconend; dyncon += bed->s->sizeof_dyn) +-- +1.7.9.5 + diff --git a/meta/recipes-devtools/binutils/binutils/0028-Backport-from-mainline.patch b/meta/recipes-devtools/binutils/binutils/0028-Backport-from-mainline.patch new file mode 100644 index 0000000000..2b86b6bf3b --- /dev/null +++ b/meta/recipes-devtools/binutils/binutils/0028-Backport-from-mainline.patch @@ -0,0 +1,139 @@ +Upstream-Status: Backport + +From fbd07e4e15de7a81a2de7f9583fa3240302e2867 Mon Sep 17 00:00:00 2001 +From: David Daney +Date: Sun, 11 Dec 2011 02:28:10 +0000 +Subject: [PATCH 028/262] Backport from mainline: + + 2011-12-10 David Daney + + * elfxx-mips.c (mips_elf_link_hash_table.rld_value): Remove. + (mips_elf_link_hash_table.rld_symbol): New field; + (MIPS_ELF_RLD_MAP_SIZE): New macro. + (_bfd_mips_elf_add_symbol_hook): Remember __rld_obj_head symbol + in rld_symbol. + (_bfd_mips_elf_create_dynamic_sections): Remember __rld_map symbol + in rld_symbol. + (_bfd_mips_elf_size_dynamic_sections): Set correct size for .rld_map. + (_bfd_mips_elf_finish_dynamic_symbol): Remove .rld_map handling. + (_bfd_mips_elf_finish_dynamic_sections): Use rld_symbol to + calculate DT_MIPS_RLD_MAP value. + (_bfd_mips_elf_link_hash_table_create): Initialize rld_symbol, + quit initializing rld_value. + +diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c +index 33a454d..6b908ad 100644 +--- a/bfd/elfxx-mips.c ++++ b/bfd/elfxx-mips.c +@@ -436,8 +436,8 @@ struct mips_elf_link_hash_table + entry is set to the address of __rld_obj_head as in IRIX5. */ + bfd_boolean use_rld_obj_head; + +- /* This is the value of the __rld_map or __rld_obj_head symbol. */ +- bfd_vma rld_value; ++ /* The __rld_map or __rld_obj_head symbol. */ ++ struct elf_link_hash_entry *rld_symbol; + + /* This is set if we see any mips16 stub sections. */ + bfd_boolean mips16_stubs_seen; +@@ -768,6 +768,10 @@ static bfd *reldyn_sorting_bfd; + #define MIPS_ELF_GOT_SIZE(abfd) \ + (get_elf_backend_data (abfd)->s->arch_size / 8) + ++/* The size of the .rld_map section. */ ++#define MIPS_ELF_RLD_MAP_SIZE(abfd) \ ++ (get_elf_backend_data (abfd)->s->arch_size / 8) ++ + /* The size of a symbol-table entry. */ + #define MIPS_ELF_SYM_SIZE(abfd) \ + (get_elf_backend_data (abfd)->s->sizeof_sym) +@@ -7081,6 +7085,7 @@ _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, + return FALSE; + + mips_elf_hash_table (info)->use_rld_obj_head = TRUE; ++ mips_elf_hash_table (info)->rld_symbol = h; + } + + /* If this is a mips16 text symbol, add 1 to the value to make it +@@ -7266,6 +7271,7 @@ _bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) + + if (! bfd_elf_link_record_dynamic_symbol (info, h)) + return FALSE; ++ mips_elf_hash_table (info)->rld_symbol = h; + } + } + +@@ -9027,7 +9033,7 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd, + { + /* We add a room for __rld_map. It will be filled in by the + rtld to contain a pointer to the _r_debug structure. */ +- s->size += 4; ++ s->size += MIPS_ELF_RLD_MAP_SIZE (output_bfd); + } + else if (SGI_COMPAT (output_bfd) + && CONST_STRNEQ (name, ".compact_rel")) +@@ -10030,31 +10036,6 @@ _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd, + if (IRIX_COMPAT (output_bfd) == ict_irix6) + mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym); + +- if (! info->shared) +- { +- if (! mips_elf_hash_table (info)->use_rld_obj_head +- && (strcmp (name, "__rld_map") == 0 +- || strcmp (name, "__RLD_MAP") == 0)) +- { +- asection *s = bfd_get_section_by_name (dynobj, ".rld_map"); +- BFD_ASSERT (s != NULL); +- sym->st_value = s->output_section->vma + s->output_offset; +- bfd_put_32 (output_bfd, 0, s->contents); +- if (mips_elf_hash_table (info)->rld_value == 0) +- mips_elf_hash_table (info)->rld_value = sym->st_value; +- } +- else if (mips_elf_hash_table (info)->use_rld_obj_head +- && strcmp (name, "__rld_obj_head") == 0) +- { +- /* IRIX6 does not use a .rld_map section. */ +- if (IRIX_COMPAT (output_bfd) == ict_irix5 +- || IRIX_COMPAT (output_bfd) == ict_none) +- BFD_ASSERT (bfd_get_section_by_name (dynobj, ".rld_map") +- != NULL); +- mips_elf_hash_table (info)->rld_value = sym->st_value; +- } +- } +- + /* Keep dynamic MIPS16 symbols odd. This allows the dynamic linker to + treat MIPS16 symbols like any other. */ + if (ELF_ST_IS_MIPS16 (sym->st_other)) +@@ -10517,7 +10498,19 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd, + break; + + case DT_MIPS_RLD_MAP: +- dyn.d_un.d_ptr = mips_elf_hash_table (info)->rld_value; ++ { ++ struct elf_link_hash_entry *h; ++ h = mips_elf_hash_table (info)->rld_symbol; ++ if (!h) ++ { ++ dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj); ++ swap_out_p = FALSE; ++ break; ++ } ++ s = h->root.u.def.section; ++ dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset ++ + h->root.u.def.value); ++ } + break; + + case DT_MIPS_OPTIONS: +@@ -12794,7 +12787,7 @@ _bfd_mips_elf_link_hash_table_create (bfd *abfd) + ret->procedure_count = 0; + ret->compact_rel_size = 0; + ret->use_rld_obj_head = FALSE; +- ret->rld_value = 0; ++ ret->rld_symbol = NULL; + ret->mips16_stubs_seen = FALSE; + ret->use_plts_and_copy_relocs = FALSE; + ret->is_vxworks = FALSE; +-- +1.7.9.5 + diff --git a/meta/recipes-devtools/binutils/binutils/0035-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch b/meta/recipes-devtools/binutils/binutils/0035-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch new file mode 100644 index 0000000000..a83a5979f6 --- /dev/null +++ b/meta/recipes-devtools/binutils/binutils/0035-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch @@ -0,0 +1,47 @@ +Upstream-Status: Backport + +From 97beee82f0e45e65308083a7e4cfaab57623733c Mon Sep 17 00:00:00 2001 +From: cltang +Date: Mon, 19 Dec 2011 10:34:15 +0000 +Subject: [PATCH 035/262] 2011-12-19 Chung-Lin Tang + + + Backport from mainline: + + 2011-12-13 Chung-Lin Tang + + * elfxx-mips.c (mips_elf_calculate_relocation): Correct + R_MIPS16_HI16/R_MIPS16_LO16 handling of two cleared lower bits, + update comments. + +diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c +index 6b908ad..3939183 100644 +--- a/bfd/elfxx-mips.c ++++ b/bfd/elfxx-mips.c +@@ -5531,10 +5531,11 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, + 12: addu $v0,$v1 + 14: move $gp,$v0 + So the offsets of hi and lo relocs are the same, but the +- $pc is four higher than $t9 would be, so reduce +- both reloc addends by 4. */ ++ base $pc is that used by the ADDIUPC instruction at $t9 + 4. ++ ADDIUPC clears the low two bits of the instruction address, ++ so the base is ($t9 + 4) & ~3. */ + if (r_type == R_MIPS16_HI16) +- value = mips_elf_high (addend + gp - p - 4); ++ value = mips_elf_high (addend + gp - ((p + 4) & ~(bfd_vma) 0x3)); + /* The microMIPS .cpload sequence uses the same assembly + instructions as the traditional psABI version, but the + incoming $t9 has the low bit set. */ +@@ -5557,7 +5558,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, + /* See the comment for R_MIPS16_HI16 above for the reason + for this conditional. */ + if (r_type == R_MIPS16_LO16) +- value = addend + gp - p; ++ value = addend + gp - (p & ~(bfd_vma) 0x3); + else if (r_type == R_MICROMIPS_LO16 + || r_type == R_MICROMIPS_HI0_LO16) + value = addend + gp - p + 3; +-- +1.7.9.5 + diff --git a/meta/recipes-devtools/binutils/binutils/0036-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch b/meta/recipes-devtools/binutils/binutils/0036-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch new file mode 100644 index 0000000000..9017c250de --- /dev/null +++ b/meta/recipes-devtools/binutils/binutils/0036-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch @@ -0,0 +1,214 @@ +Upstream-Status: Backport + +From 26e802720ccd055d70addadbc39f4119716f8573 Mon Sep 17 00:00:00 2001 +From: cltang +Date: Mon, 19 Dec 2011 10:39:27 +0000 +Subject: [PATCH 036/262] 2011-12-19 Chung-Lin Tang + + + Backport from mainline: + + 2011-12-19 Chung-Lin Tang + Catherine Moore + Sandra Loosemore + Richard Sandiford + + * elfxx-mips.c (mips_elf_local_pic_function_p): Return true when + H is a MIPS16 function with a kept 32-bit stub. Update comments. + (mips_elf_get_la25_target): New function. + (mips_elf_add_la25_intro): Change to use mips_elf_get_la25_target(). + (mips_elf_add_la25_stub): Move compute of use_trampoline_p down, + change to use mips_elf_get_la25_target(). + (mips_elf_relocation_needs_la25_stub): Add target_is_16_bit_code_p + parameter, add switch case for R_MIPS16_26. + (mips_elf_calculate_relocation): Redirect relocation to point to the + LA25 stub if it exists, instead of the MIPS16 stub. Update arguments + of call to mips_elf_relocation_needs_la25_stub(), don't use la25 stub + for mips16->mips16 calls. + (_bfd_mips_elf_check_relocs): Update arguments of call to + mips_elf_relocation_needs_la25_stub(). + (mips_elf_create_la25_stub): Change to use mips_elf_get_la25_target(). + +diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c +index 3939183..9f3833b 100644 +--- a/bfd/elfxx-mips.c ++++ b/bfd/elfxx-mips.c +@@ -1575,9 +1575,10 @@ _bfd_mips_elf_init_stubs (struct bfd_link_info *info, + } + + /* Return true if H is a locally-defined PIC function, in the sense +- that it might need $25 to be valid on entry. Note that MIPS16 +- functions never need $25 to be valid on entry; they set up $gp +- using PC-relative instructions instead. */ ++ that it or its fn_stub might need $25 to be valid on entry. ++ Note that MIPS16 functions set up $gp using PC-relative instructions, ++ so they themselves never need $25 to be valid. Only non-MIPS16 ++ entry points are of interest here. */ + + static bfd_boolean + mips_elf_local_pic_function_p (struct mips_elf_link_hash_entry *h) +@@ -1586,11 +1587,32 @@ mips_elf_local_pic_function_p (struct mips_elf_link_hash_entry *h) + || h->root.root.type == bfd_link_hash_defweak) + && h->root.def_regular + && !bfd_is_abs_section (h->root.root.u.def.section) +- && !ELF_ST_IS_MIPS16 (h->root.other) ++ && (!ELF_ST_IS_MIPS16 (h->root.other) ++ || (h->fn_stub && h->need_fn_stub)) + && (PIC_OBJECT_P (h->root.root.u.def.section->owner) + || ELF_ST_IS_MIPS_PIC (h->root.other))); + } + ++/* Set *SEC to the input section that contains the target of STUB. ++ Return the offset of the target from the start of that section. */ ++ ++static bfd_vma ++mips_elf_get_la25_target (struct mips_elf_la25_stub *stub, ++ asection **sec) ++{ ++ if (ELF_ST_IS_MIPS16 (stub->h->root.other)) ++ { ++ BFD_ASSERT (stub->h->need_fn_stub); ++ *sec = stub->h->fn_stub; ++ return 0; ++ } ++ else ++ { ++ *sec = stub->h->root.root.u.def.section; ++ return stub->h->root.root.u.def.value; ++ } ++} ++ + /* STUB describes an la25 stub that we have decided to implement + by inserting an LUI/ADDIU pair before the target function. + Create the section and redirect the function symbol to it. */ +@@ -1615,7 +1637,7 @@ mips_elf_add_la25_intro (struct mips_elf_la25_stub *stub, + sprintf (name, ".text.stub.%d", (int) htab_elements (htab->la25_stubs)); + + /* Create the section. */ +- input_section = stub->h->root.root.u.def.section; ++ mips_elf_get_la25_target (stub, &input_section); + s = htab->add_stub_section (name, input_section, + input_section->output_section); + if (s == NULL) +@@ -1689,12 +1711,6 @@ mips_elf_add_la25_stub (struct bfd_link_info *info, + bfd_vma value; + void **slot; + +- /* Prefer to use LUI/ADDIU stubs if the function is at the beginning +- of the section and if we would need no more than 2 nops. */ +- s = h->root.root.u.def.section; +- value = h->root.root.u.def.value; +- use_trampoline_p = (value != 0 || s->alignment_power > 4); +- + /* Describe the stub we want. */ + search.stub_section = NULL; + search.offset = 0; +@@ -1724,6 +1740,11 @@ mips_elf_add_la25_stub (struct bfd_link_info *info, + *stub = search; + *slot = stub; + ++ /* Prefer to use LUI/ADDIU stubs if the function is at the beginning ++ of the section and if we would need no more than 2 nops. */ ++ value = mips_elf_get_la25_target (stub, &s); ++ use_trampoline_p = (value != 0 || s->alignment_power > 4); ++ + h->la25_stub = stub; + return (use_trampoline_p + ? mips_elf_add_la25_trampoline (stub, info) +@@ -4911,7 +4932,8 @@ is_gott_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h) + stub. */ + + static bfd_boolean +-mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type) ++mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type, ++ bfd_boolean target_is_16_bit_code_p) + { + /* We specifically ignore branches and jumps from EF_PIC objects, + where the onus is on the compiler or programmer to perform any +@@ -4925,7 +4947,6 @@ mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type) + { + case R_MIPS_26: + case R_MIPS_PC16: +- case R_MIPS16_26: + case R_MICROMIPS_26_S1: + case R_MICROMIPS_PC7_S1: + case R_MICROMIPS_PC10_S1: +@@ -4933,6 +4954,9 @@ mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type) + case R_MICROMIPS_PC23_S2: + return TRUE; + ++ case R_MIPS16_26: ++ return !target_is_16_bit_code_p; ++ + default: + return FALSE; + } +@@ -5193,14 +5217,28 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, + have already noticed that we were going to need the + stub. */ + if (local_p) +- sec = elf_tdata (input_bfd)->local_stubs[r_symndx]; ++ { ++ sec = elf_tdata (input_bfd)->local_stubs[r_symndx]; ++ value = 0; ++ } + else + { + BFD_ASSERT (h->need_fn_stub); +- sec = h->fn_stub; ++ if (h->la25_stub) ++ { ++ /* If a LA25 header for the stub itself exists, point to the ++ prepended LUI/ADDIU sequence. */ ++ sec = h->la25_stub->stub_section; ++ value = h->la25_stub->offset; ++ } ++ else ++ { ++ sec = h->fn_stub; ++ value = 0; ++ } + } + +- symbol = sec->output_section->vma + sec->output_offset; ++ symbol = sec->output_section->vma + sec->output_offset + value; + /* The target is 16-bit, but the stub isn't. */ + target_is_16_bit_code_p = FALSE; + } +@@ -5250,7 +5288,8 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, + /* If this is a direct call to a PIC function, redirect to the + non-PIC stub. */ + else if (h != NULL && h->la25_stub +- && mips_elf_relocation_needs_la25_stub (input_bfd, r_type)) ++ && mips_elf_relocation_needs_la25_stub (input_bfd, r_type, ++ target_is_16_bit_code_p)) + symbol = (h->la25_stub->stub_section->output_section->vma + + h->la25_stub->stub_section->output_offset + + h->la25_stub->offset); +@@ -7925,7 +7964,9 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, + return FALSE; + } + +- if (h != NULL && mips_elf_relocation_needs_la25_stub (abfd, r_type)) ++ if (h != NULL ++ && mips_elf_relocation_needs_la25_stub (abfd, r_type, ++ ELF_ST_IS_MIPS16 (h->other))) + ((struct mips_elf_link_hash_entry *) h)->has_nonpic_branches = TRUE; + + switch (r_type) +@@ -9622,9 +9663,9 @@ mips_elf_create_la25_stub (void **slot, void *data) + offset = stub->offset; + + /* Work out the target address. */ +- target = (stub->h->root.root.u.def.section->output_section->vma +- + stub->h->root.root.u.def.section->output_offset +- + stub->h->root.root.u.def.value); ++ target = mips_elf_get_la25_target (stub, &s); ++ target += s->output_section->vma + s->output_offset; ++ + target_high = ((target + 0x8000) >> 16) & 0xffff; + target_low = (target & 0xffff); + +-- +1.7.9.5 + diff --git a/meta/recipes-devtools/binutils/binutils/0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch b/meta/recipes-devtools/binutils/binutils/0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch new file mode 100644 index 0000000000..4b0caafb48 --- /dev/null +++ b/meta/recipes-devtools/binutils/binutils/0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch @@ -0,0 +1,1068 @@ +Upstream-Status: Backport + +From 7e2b7154b03e4c77233171eec5cba8d113e04fea Mon Sep 17 00:00:00 2001 +From: cltang +Date: Mon, 19 Dec 2011 10:49:24 +0000 +Subject: [PATCH 037/262] 2011-12-19 Chung-Lin Tang + + + Backport from mainline: + + 2011-12-19 Chung-Lin Tang + + gas/ + * config/tc-mips.c (mips_pseudo_table): Add tprelword/tpreldword + entries. + (mips16_percent_op): Add MIPS16 TLS relocation ops. + (md_apply_fix): Add BFD_RELOC_MIPS16_TLS_* switch cases. + (s_tls_rel_directive): Rename from s_dtprel_internal(). Abstract out + directive string and reloc type as function parameters. Update + comments. + (s_dtprelword,s_dtpreldword): Change to use s_tls_rel_directive(). + (s_tprelword,s_tpreldword): New functions. + + include/ + * elf/mips.h (elf_mips_reloc_type): Add R_MIPS16_TLS_* entries. + + bfd/ + * reloc.c (BFD_RELOC_MIPS16_TLS_GD,BFD_RELOC_MIPS16_TLS_LDM, + BFD_RELOC_MIPS16_TLS_DTPREL_HI16,BFD_RELOC_MIPS16_TLS_DTPREL_LO16, + BFD_RELOC_MIPS16_TLS_GOTTPREL,BFD_RELOC_MIPS16_TLS_TPREL_HI16, + BFD_RELOC_MIPS16_TLS_TPREL_LO16): New relocations for MIPS16 TLS. + * bfd-in2.h (bfd_reloc_code_real): Regenerate. + * libbfd.h (bfd_reloc_code_real_names): Regenerate. + * elf32-mips.c (elf_mips16_howto_table_rel): Add R_MIPS16_TLS_* + entries. + (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_* + mappings. + * elfn32-mips.c (elf_mips16_howto_table_rel, + elf_mips16_howto_table_rela): Add R_MIPS16_TLS_* entries. + (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_* + mappings. + * elf64-mips.c (mips16_elf64_howto_table_rel, + mips16_elf64_howto_table_rela): Add R_MIPS16_TLS_* entries. + (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_* + mappings. + * elfxx-mips.c (TLS_RELOC_P,mips16_reloc_p, + _bfd_mips_elf_check_relocs): Add cases for R_MIPS16_TLS_* relocations. + (tls_gd_reloc_p): Add R_MIPS16_TLS_GD case. + (tls_ldm_reloc_p): Add R_MIPS16_TLS_LDM case. + (tls_gottprel_reloc_p): Add R_MIPS16_TLS_GOTTPREL case. + (mips_elf_calculate_relocation): Add cases for R_MIPS16_TLS_*, + R_MIPS_TLS_DTPREL32/64, and R_MIPS_TLS_TPREL32/64 relocations. +--- + bfd/ChangeLog | 32 ++++++++ + bfd/bfd-in2.h | 9 +++ + bfd/elf32-mips.c | 114 ++++++++++++++++++++++++++ + bfd/elf64-mips.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++ + bfd/elfn32-mips.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++ + bfd/elfxx-mips.c | 48 +++++++++-- + bfd/libbfd.h | 7 ++ + bfd/reloc.c | 17 ++++ + gas/ChangeLog | 16 ++++ + gas/config/tc-mips.c | 62 ++++++++++---- + include/ChangeLog | 8 ++ + include/elf/mips.h | 9 ++- + 12 files changed, 739 insertions(+), 21 deletions(-) + +diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h +index 22fcdf6..cd90740 100644 +--- a/bfd/bfd-in2.h ++++ b/bfd/bfd-in2.h +@@ -2780,6 +2780,15 @@ to compensate for the borrow when the low bits are added. */ + /* MIPS16 low 16 bits. */ + BFD_RELOC_MIPS16_LO16, + ++/* MIPS16 TLS relocations */ ++ BFD_RELOC_MIPS16_TLS_GD, ++ BFD_RELOC_MIPS16_TLS_LDM, ++ BFD_RELOC_MIPS16_TLS_DTPREL_HI16, ++ BFD_RELOC_MIPS16_TLS_DTPREL_LO16, ++ BFD_RELOC_MIPS16_TLS_GOTTPREL, ++ BFD_RELOC_MIPS16_TLS_TPREL_HI16, ++ BFD_RELOC_MIPS16_TLS_TPREL_LO16, ++ + /* Relocation against a MIPS literal section. */ + BFD_RELOC_MIPS_LITERAL, + BFD_RELOC_MICROMIPS_LITERAL, +diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c +index fd3d4ba..61e8b45 100644 +--- a/bfd/elf32-mips.c ++++ b/bfd/elf32-mips.c +@@ -830,6 +830,111 @@ static reloc_howto_type elf_mips16_howto_table_rel[] = + 0x0000ffff, /* src_mask */ + 0x0000ffff, /* dst_mask */ + FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS general dynamic variable reference. */ ++ HOWTO (R_MIPS16_TLS_GD, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_GD", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS local dynamic variable reference. */ ++ HOWTO (R_MIPS16_TLS_LDM, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_LDM", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS local dynamic offset. */ ++ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_DTPREL_HI16", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS local dynamic offset. */ ++ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_DTPREL_LO16", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS thread pointer offset. */ ++ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_GOTTPREL", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS thread pointer offset. */ ++ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_TPREL_HI16", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS thread pointer offset. */ ++ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_TPREL_LO16", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ + }; + + static reloc_howto_type elf_micromips_howto_table_rel[] = +@@ -1796,6 +1901,15 @@ static const struct elf_reloc_map mips16_reloc_map[] = + { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min }, + { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min }, + { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min }, ++ { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min }, ++ { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min }, ++ { BFD_RELOC_MIPS16_TLS_DTPREL_HI16, ++ R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min }, ++ { BFD_RELOC_MIPS16_TLS_DTPREL_LO16, ++ R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min }, ++ { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min }, ++ { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min }, ++ { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min } + }; + + static const struct elf_reloc_map micromips_reloc_map[] = +diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c +index 3feb1bb..bdd0c19 100644 +--- a/bfd/elf64-mips.c ++++ b/bfd/elf64-mips.c +@@ -1590,6 +1590,111 @@ static reloc_howto_type mips16_elf64_howto_table_rel[] = + 0x0000ffff, /* src_mask */ + 0x0000ffff, /* dst_mask */ + FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS general dynamic variable reference. */ ++ HOWTO (R_MIPS16_TLS_GD, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_GD", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS local dynamic variable reference. */ ++ HOWTO (R_MIPS16_TLS_LDM, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_LDM", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS local dynamic offset. */ ++ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_DTPREL_HI16", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS local dynamic offset. */ ++ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_DTPREL_LO16", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS thread pointer offset. */ ++ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_GOTTPREL", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS thread pointer offset. */ ++ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_TPREL_HI16", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS thread pointer offset. */ ++ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_TPREL_LO16", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ + }; + + static reloc_howto_type mips16_elf64_howto_table_rela[] = +@@ -1686,6 +1791,111 @@ static reloc_howto_type mips16_elf64_howto_table_rela[] = + 0x0000ffff, /* src_mask */ + 0x0000ffff, /* dst_mask */ + FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS general dynamic variable reference. */ ++ HOWTO (R_MIPS16_TLS_GD, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_GD", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS local dynamic variable reference. */ ++ HOWTO (R_MIPS16_TLS_LDM, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_LDM", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS local dynamic offset. */ ++ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_DTPREL_HI16", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS local dynamic offset. */ ++ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_DTPREL_LO16", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS thread pointer offset. */ ++ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_GOTTPREL", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS thread pointer offset. */ ++ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_TPREL_HI16", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS thread pointer offset. */ ++ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_TPREL_LO16", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ + }; + + static reloc_howto_type micromips_elf64_howto_table_rel[] = +@@ -2908,6 +3118,15 @@ static const struct elf_reloc_map mips16_reloc_map[] = + { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min }, + { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min }, + { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min }, ++ { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min }, ++ { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min }, ++ { BFD_RELOC_MIPS16_TLS_DTPREL_HI16, ++ R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min }, ++ { BFD_RELOC_MIPS16_TLS_DTPREL_LO16, ++ R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min }, ++ { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min }, ++ { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min }, ++ { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min } + }; + + static const struct elf_reloc_map micromips_reloc_map[] = +diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c +index 00ec8b0..2189566 100644 +--- a/bfd/elfn32-mips.c ++++ b/bfd/elfn32-mips.c +@@ -1555,6 +1555,111 @@ static reloc_howto_type elf_mips16_howto_table_rel[] = + 0x0000ffff, /* src_mask */ + 0x0000ffff, /* dst_mask */ + FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS general dynamic variable reference. */ ++ HOWTO (R_MIPS16_TLS_GD, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_GD", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS local dynamic variable reference. */ ++ HOWTO (R_MIPS16_TLS_LDM, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_LDM", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS local dynamic offset. */ ++ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_DTPREL_HI16", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS local dynamic offset. */ ++ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_DTPREL_LO16", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS thread pointer offset. */ ++ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_GOTTPREL", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS thread pointer offset. */ ++ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_TPREL_HI16", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS thread pointer offset. */ ++ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_TPREL_LO16", /* name */ ++ TRUE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ + }; + + static reloc_howto_type elf_mips16_howto_table_rela[] = +@@ -1651,6 +1756,111 @@ static reloc_howto_type elf_mips16_howto_table_rela[] = + 0x0000ffff, /* src_mask */ + 0x0000ffff, /* dst_mask */ + FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS general dynamic variable reference. */ ++ HOWTO (R_MIPS16_TLS_GD, /* type */ ++ 0, /* rightshift */ ++ 2, /* size (0 = byte, 1 = short, 2 = long) */ ++ 16, /* bitsize */ ++ FALSE, /* pc_relative */ ++ 0, /* bitpos */ ++ complain_overflow_signed, /* complain_on_overflow */ ++ _bfd_mips_elf_generic_reloc, /* special_function */ ++ "R_MIPS16_TLS_GD", /* name */ ++ FALSE, /* partial_inplace */ ++ 0x0000ffff, /* src_mask */ ++ 0x0000ffff, /* dst_mask */ ++ FALSE), /* pcrel_offset */ ++ ++ /* MIPS16 TLS local dynamic variable reference. */ ++ HOWTO (R_MIPS16