aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2021-04-03 10:07:48 +0100
committerIain Sandoe <iain@sandoe.co.uk>2021-04-03 21:28:15 +0100
commit89bc1d4e7cdd0b2d012050134ad1d464ec357f0b (patch)
tree687fe8d93b89cace4e5a7c98fdf1cf819b8a73f1 /gcc
parentad7c6298b6f1cf4eaa70a53af3479fab14018896 (diff)
downloadgcc-89bc1d4e7cdd0b2d012050134ad1d464ec357f0b.zip
gcc-89bc1d4e7cdd0b2d012050134ad1d464ec357f0b.tar.gz
gcc-89bc1d4e7cdd0b2d012050134ad1d464ec357f0b.tar.bz2
Darwin : Fix out-of-bounds access to df_regs_ever_live.
During changes made for LRA (or, perhaps, even before) we omitted a check that the current register we are working on is a hard reg before we tried to note its liveness. A stage 1 built with fsanitize=address catches this, as does any attempt to build master with clang and -std=c++11. gcc/ChangeLog: * config/darwin.c (machopic_legitimize_pic_address): Check that the current pic register is one of the hard reg set before setting liveness.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/darwin.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index c1086a0..5d17391 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -907,7 +907,7 @@ machopic_legitimize_pic_address (rtx orig, machine_mode mode, rtx reg)
pic = reg;
}
- if (lra_in_progress)
+ if (lra_in_progress && HARD_REGISTER_P (pic))
df_set_regs_ever_live (REGNO (pic), true);
pic_ref = gen_rtx_PLUS (Pmode, pic,
machopic_gen_offset (XEXP (orig, 0)));
@@ -974,7 +974,8 @@ machopic_legitimize_pic_address (rtx orig, machine_mode mode, rtx reg)
emit_move_insn (reg, pic);
pic = reg;
}
- if (lra_in_progress)
+
+ if (lra_in_progress && HARD_REGISTER_P (pic))
df_set_regs_ever_live (REGNO (pic), true);
pic_ref = gen_rtx_PLUS (Pmode,
pic,