diff --git a/toolchain/gcc/patches/9.2.0/100-Fix_uninitialised_use_in_mips_split_move.patch b/toolchain/gcc/patches/9.2.0/100-Fix_uninitialised_use_in_mips_split_move.patch new file mode 100644 index 0000000000..3529a19d8c --- /dev/null +++ b/toolchain/gcc/patches/9.2.0/100-Fix_uninitialised_use_in_mips_split_move.patch @@ -0,0 +1,55 @@ +From d57faea9337ad595d005687247c3322252f70ba1 Mon Sep 17 00:00:00 2001 +From: rsandifo +Date: Sun, 7 Jul 2019 09:49:14 +0000 +Subject: [PATCH] Fix uninitialised use in mips_split_move + +While testing the fix for PR91068, I hit an rtl checking failure +while building newlib. mips_split_move was decomposing an address that +happened to be symbolic and then tried to access the REGNO of the base +register field, which wasn't initialised but which by chance pointed to +valid memory. + +2019-07-07 Richard Sandiford + +gcc/ + * config/mips/mips.c (mips_split_move): Zero-initialize addr + and check whether addr.reg is nonnull before using it. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@273174 138bc75d-0d04-0410-961f-82ee72b054a4 +--- + gcc/ChangeLog | 5 +++++ + gcc/config/mips/mips.c | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +--- a/gcc/ChangeLog ++++ b/gcc/ChangeLog +@@ -1,3 +1,8 @@ ++2019-07-07 Richard Sandiford ++ ++ * config/mips/mips.c (mips_split_move): Zero-initialize addr ++ and check whether addr.reg is nonnull before using it. ++ + 2019-08-12 Release Manager + + * GCC 9.2.0 released. +--- a/gcc/config/mips/mips.c ++++ b/gcc/config/mips/mips.c +@@ -4849,7 +4849,7 @@ mips_split_move (rtx dest, rtx src, enum + can forward SRC for DEST. This is most useful if the next insn is a + simple store. */ + rtx_insn *insn = (rtx_insn *)insn_; +- struct mips_address_info addr; ++ struct mips_address_info addr = {}; + if (insn) + { + rtx_insn *next = next_nonnote_nondebug_insn_bb (insn); +@@ -4862,7 +4862,7 @@ mips_split_move (rtx dest, rtx src, enum + { + rtx tmp = XEXP (src, 0); + mips_classify_address (&addr, tmp, GET_MODE (tmp), true); +- if (REGNO (addr.reg) != REGNO (dest)) ++ if (addr.reg && REGNO (addr.reg) != REGNO (dest)) + validate_change (next, &SET_SRC (set), src, false); + } + else