aboutsummaryrefslogtreecommitdiff
path: root/bfd/elfnn-riscv.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2020-08-31 13:17:06 +0930
committerAlan Modra <amodra@gmail.com>2020-08-31 20:28:10 +0930
commit1174d92070a85a8ad25e9b9686dd1b4921e96702 (patch)
tree490ec9444c93d0d8bfe006afa9292a83eda0d8b1 /bfd/elfnn-riscv.c
parent227d539b17c60a74c583dc66a2c0467243eb4bb2 (diff)
downloadgdb-1174d92070a85a8ad25e9b9686dd1b4921e96702.zip
gdb-1174d92070a85a8ad25e9b9686dd1b4921e96702.tar.gz
gdb-1174d92070a85a8ad25e9b9686dd1b4921e96702.tar.bz2
PR26493 UBSAN: elfnn-riscv.c left shift of negative value
include/ PR 26493 * opcode/riscv.h (OP_MASK_CSR, OP_MASK_CUSTOM_IMM) (OP_MASK_FUNCT7, OP_MASK_RS3): Make unsigned. bfd/ PR 26493 * elfnn-riscv.c (riscv_make_plt_header): Cast PLT_HEADER_SIZE to unsigned when using with RISCV_ITYPE. (_bfd_riscv_relax_call): Use an unsigned foff.
Diffstat (limited to 'bfd/elfnn-riscv.c')
-rw-r--r--bfd/elfnn-riscv.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index e6c5d1f..8a3338c 100644
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -199,7 +199,7 @@ riscv_make_plt_header (bfd *output_bfd, bfd_vma gotplt_addr, bfd_vma addr,
entry[0] = RISCV_UTYPE (AUIPC, X_T2, gotplt_offset_high);
entry[1] = RISCV_RTYPE (SUB, X_T1, X_T1, X_T3);
entry[2] = RISCV_ITYPE (LREG, X_T3, X_T2, gotplt_offset_low);
- entry[3] = RISCV_ITYPE (ADDI, X_T1, X_T1, -(PLT_HEADER_SIZE + 12));
+ entry[3] = RISCV_ITYPE (ADDI, X_T1, X_T1, (uint32_t) -(PLT_HEADER_SIZE + 12));
entry[4] = RISCV_ITYPE (ADDI, X_T0, X_T2, gotplt_offset_low);
entry[5] = RISCV_ITYPE (SRLI, X_T1, X_T1, 4 - RISCV_ELF_LOG_WORD_BYTES);
entry[6] = RISCV_ITYPE (LREG, X_T0, X_T0, RISCV_ELF_WORD_BYTES);
@@ -3455,7 +3455,7 @@ _bfd_riscv_relax_call (bfd *abfd, asection *sec, asection *sym_sec,
bfd_boolean undefined_weak ATTRIBUTE_UNUSED)
{
bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
- bfd_signed_vma foff = symval - (sec_addr (sec) + rel->r_offset);
+ bfd_vma foff = symval - (sec_addr (sec) + rel->r_offset);
bfd_boolean near_zero = (symval + RISCV_IMM_REACH/2) < RISCV_IMM_REACH;
bfd_vma auipc, jalr;
int rd, r_type, len = 4, rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC;
@@ -3469,7 +3469,7 @@ _bfd_riscv_relax_call (bfd *abfd, asection *sec, asection *sym_sec,
if (sym_sec->output_section == sec->output_section
&& sym_sec->output_section != bfd_abs_section_ptr)
max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power;
- foff += (foff < 0 ? -max_alignment : max_alignment);
+ foff += ((bfd_signed_vma) foff < 0 ? -max_alignment : max_alignment);
}
/* See if this function call can be shortened. */