aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Sandoe <iain@codesourcery.com>2013-09-29 19:34:58 +0000
committerIain Sandoe <iains@gcc.gnu.org>2013-09-29 19:34:58 +0000
commit749278c58dee4d197d9cb951eb524f9159184c4c (patch)
tree7d5fe66a6064c45faff1d129f54f0c6aaa77a68d
parent23b740dbc743a7af498c0b55542fcecfff72dd86 (diff)
downloadgcc-749278c58dee4d197d9cb951eb524f9159184c4c.zip
gcc-749278c58dee4d197d9cb951eb524f9159184c4c.tar.gz
gcc-749278c58dee4d197d9cb951eb524f9159184c4c.tar.bz2
rs6000.c (rs6000_init_dwarf_reg_sizes_extra): Ensure that altivec registers are correctly sized on Darwin.
gcc: * config/rs6000/rs6000.c (rs6000_init_dwarf_reg_sizes_extra): Ensure that altivec registers are correctly sized on Darwin. From-SVN: r203018
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/rs6000/rs6000.c21
2 files changed, 26 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 57edfbb..543d601 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2013-09-29 Iain Sandoe <iain@codesourcery.com>
+ * config/rs6000/rs6000.c (rs6000_init_dwarf_reg_sizes_extra): Ensure
+ that altivec registers are correctly sized on Darwin.
+
+2013-09-29 Iain Sandoe <iain@codesourcery.com>
+
* config/t-darwin (darwin.o, darwin-c.o, darwin-f.o,
darwin-driver.o): Use COMPILE and POSTCOMPILE.
* config/x-darwin (host-darwin.o): Likewise.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 4197687..763847c 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -29050,6 +29050,27 @@ rs6000_init_dwarf_reg_sizes_extra (tree address)
emit_move_insn (adjust_address (mem, mode, offset), value);
}
}
+
+ if (TARGET_MACHO && ! TARGET_ALTIVEC)
+ {
+ int i;
+ enum machine_mode mode = TYPE_MODE (char_type_node);
+ rtx addr = expand_expr (address, NULL_RTX, VOIDmode, EXPAND_NORMAL);
+ rtx mem = gen_rtx_MEM (BLKmode, addr);
+ rtx value = gen_int_mode (16, mode);
+
+ /* On Darwin, libgcc may be built to run on both G3 and G4/5.
+ The unwinder still needs to know the size of Altivec registers. */
+
+ for (i = FIRST_ALTIVEC_REGNO; i < LAST_ALTIVEC_REGNO+1; i++)
+ {
+ int column = DWARF_REG_TO_UNWIND_COLUMN (i);
+ HOST_WIDE_INT offset
+ = DWARF_FRAME_REGNUM (column) * GET_MODE_SIZE (mode);
+
+ emit_move_insn (adjust_address (mem, mode, offset), value);
+ }
+ }
}
/* Map internal gcc register numbers to DWARF2 register numbers. */