diff options
author | Patrick Williams <patrick@stwcx.xyz> | 2016-08-17 14:31:25 -0500 |
---|---|---|
committer | Patrick Williams <patrick@stwcx.xyz> | 2016-08-22 16:43:26 +0000 |
commit | 60f9d69e016b11c468c98ea75ba0a60c44afbbc4 (patch) | |
tree | ecb49581a9e41a37943c22cd9ef3f63451b20ee7 /import-layers/yocto-poky/meta/recipes-devtools/gcc/gcc-4.9/0055-dwarf-reg-processing-helper.patch | |
parent | e18c61205e0234b03697129c20cc69c9b3940efc (diff) | |
download | blackbird-openbmc-60f9d69e016b11c468c98ea75ba0a60c44afbbc4.tar.gz blackbird-openbmc-60f9d69e016b11c468c98ea75ba0a60c44afbbc4.zip |
yocto-poky: Move to import-layers subdir
We are going to import additional layers, so create a subdir to
hold all of the layers that we import with git-subtree.
Change-Id: I6f732153a22be8ca663035c518837e3cc5ec0799
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Diffstat (limited to 'import-layers/yocto-poky/meta/recipes-devtools/gcc/gcc-4.9/0055-dwarf-reg-processing-helper.patch')
-rw-r--r-- | import-layers/yocto-poky/meta/recipes-devtools/gcc/gcc-4.9/0055-dwarf-reg-processing-helper.patch | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/import-layers/yocto-poky/meta/recipes-devtools/gcc/gcc-4.9/0055-dwarf-reg-processing-helper.patch b/import-layers/yocto-poky/meta/recipes-devtools/gcc/gcc-4.9/0055-dwarf-reg-processing-helper.patch new file mode 100644 index 000000000..557dab0f3 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-devtools/gcc/gcc-4.9/0055-dwarf-reg-processing-helper.patch @@ -0,0 +1,148 @@ +From 4fd39f1329379e00f958394adde6be96f0caf21f Mon Sep 17 00:00:00 2001 +From: hainque <hainque@138bc75d-0d04-0410-961f-82ee72b054a4> +Date: Fri, 5 Dec 2014 16:53:22 +0000 +Subject: [PATCH] 2014-12-05 Olivier Hainque <hainque@adacore.com> + + * dwarf2cfi.c (init_one_dwarf_reg_size): New helper, processing + one particular reg for expand_builtin_init_dwarf_reg_sizes. + (expand_builtin_init_dwarf_reg_sizes): Rework to use helper and + account for dwarf register spans. + + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218428 138bc75d-0d04-0410-961f-82ee72b054a4 + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +Upstream-Status: Backport [gcc 5.0] + +--- + gcc/ChangeLog | 7 +++++ + gcc/dwarf2cfi.c | 98 +++++++++++++++++++++++++++++++++++++++++++++------------ + 2 files changed, 85 insertions(+), 20 deletions(-) + +Index: gcc-4.9.2/gcc/dwarf2cfi.c +=================================================================== +--- gcc-4.9.2.orig/gcc/dwarf2cfi.c ++++ gcc-4.9.2/gcc/dwarf2cfi.c +@@ -252,7 +252,59 @@ init_return_column_size (enum machine_mo + gen_int_mode (size, mode)); + } + +-/* Generate code to initialize the register size table. */ ++/* Datastructure used by expand_builtin_init_dwarf_reg_sizes and ++ init_one_dwarf_reg_size to communicate on what has been done by the ++ latter. */ ++ ++typedef struct ++{ ++ /* Whether the dwarf return column was initialized. */ ++ bool wrote_return_column; ++ ++ /* For each hard register REGNO, whether init_one_dwarf_reg_size ++ was given REGNO to process already. */ ++ bool processed_regno [FIRST_PSEUDO_REGISTER]; ++ ++} init_one_dwarf_reg_state; ++ ++/* Helper for expand_builtin_init_dwarf_reg_sizes. Generate code to ++ initialize the dwarf register size table entry corresponding to register ++ REGNO in REGMODE. TABLE is the table base address, SLOTMODE is the mode to ++ use for the size entry to initialize, and INIT_STATE is the communication ++ datastructure conveying what we're doing to our caller. */ ++ ++static ++void init_one_dwarf_reg_size (int regno, machine_mode regmode, ++ rtx table, machine_mode slotmode, ++ init_one_dwarf_reg_state *init_state) ++{ ++ const unsigned int dnum = DWARF_FRAME_REGNUM (regno); ++ const unsigned int rnum = DWARF2_FRAME_REG_OUT (dnum, 1); ++ ++ const HOST_WIDE_INT slotoffset = rnum * GET_MODE_SIZE (slotmode); ++ const HOST_WIDE_INT regsize = GET_MODE_SIZE (regmode); ++ ++ init_state->processed_regno[regno] = true; ++ ++ if (rnum >= DWARF_FRAME_REGISTERS) ++ return; ++ ++ if (dnum == DWARF_FRAME_RETURN_COLUMN) ++ { ++ if (regmode == VOIDmode) ++ return; ++ init_state->wrote_return_column = true; ++ } ++ ++ if (slotoffset < 0) ++ return; ++ ++ emit_move_insn (adjust_address (table, slotmode, slotoffset), ++ gen_int_mode (regsize, slotmode)); ++} ++ ++/* Generate code to initialize the dwarf register size table located ++ at the provided ADDRESS. */ + + void + expand_builtin_init_dwarf_reg_sizes (tree address) +@@ -261,35 +313,40 @@ expand_builtin_init_dwarf_reg_sizes (tre + enum machine_mode mode = TYPE_MODE (char_type_node); + rtx addr = expand_normal (address); + rtx mem = gen_rtx_MEM (BLKmode, addr); +- bool wrote_return_column = false; ++ ++ init_one_dwarf_reg_state init_state; ++ ++ memset ((char *)&init_state, 0, sizeof (init_state)); + + for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) + { +- unsigned int dnum = DWARF_FRAME_REGNUM (i); +- unsigned int rnum = DWARF2_FRAME_REG_OUT (dnum, 1); +- +- if (rnum < DWARF_FRAME_REGISTERS) +- { +- HOST_WIDE_INT offset = rnum * GET_MODE_SIZE (mode); +- HOST_WIDE_INT size; +- enum machine_mode save_mode = targetm.dwarf_frame_reg_mode (i); ++ machine_mode save_mode; ++ rtx span; + +- if (dnum == DWARF_FRAME_RETURN_COLUMN) ++ /* No point in processing a register multiple times. This could happen ++ with register spans, e.g. when a reg is first processed as a piece of ++ a span, then as a register on its own later on. */ ++ ++ if (init_state.processed_regno[i]) ++ continue; ++ ++ save_mode = targetm.dwarf_frame_reg_mode (i); ++ span = targetm.dwarf_register_span (gen_rtx_REG (save_mode, i)); ++ if (!span) ++ init_one_dwarf_reg_size (i, save_mode, mem, mode, &init_state); ++ else ++ { ++ for (int si = 0; si < XVECLEN (span, 0); si++) + { +- if (save_mode == VOIDmode) +- continue; +- wrote_return_column = true; +- } +- size = GET_MODE_SIZE (save_mode); +- if (offset < 0) +- continue; ++ rtx reg = XVECEXP (span, 0, si); ++ init_one_dwarf_reg_size ++ (REGNO (reg), GET_MODE (reg), mem, mode, &init_state); ++ } + +- emit_move_insn (adjust_address (mem, mode, offset), +- gen_int_mode (size, mode)); + } + } + +- if (!wrote_return_column) ++ if (!init_state.wrote_return_column) + init_return_column_size (mode, mem, DWARF_FRAME_RETURN_COLUMN); + + #ifdef DWARF_ALT_FRAME_RETURN_COLUMN |