diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-03-26 21:53:58 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-03-26 21:53:58 +0100 |
commit | 89245ef27b0846d47bceab52811ec6e529caa272 (patch) | |
tree | 6dd175a70af2ad8f1a914a721882ba021f783b6f | |
parent | c5e43cc45b27e39016aa1dead023dc5edbd34eb2 (diff) | |
download | gcc-89245ef27b0846d47bceab52811ec6e529caa272.zip gcc-89245ef27b0846d47bceab52811ec6e529caa272.tar.gz gcc-89245ef27b0846d47bceab52811ec6e529caa272.tar.bz2 |
re PR debug/43540 (ICE: vector VEC(dw_cfi_ref,heap) grow domain error, in output_cfis at dwarf2out.c:3346 or OOM-killed)
PR debug/43540
* dwarf2out.c (reg_save): For DW_CFA_expression put regnum
into first operand and location into second.
(dw_cfi_oprnd1_desc): Return dw_cfi_oprnd_reg_num instead of
dw_cfi_oprnd_loc for DW_CFA_expression.
(dw_cfi_oprnd2_desc): Return dw_cfi_oprnd_loc for DW_CFA_expression.
(output_cfa_loc, output_cfa_loc_raw): For DW_CFA_expression
assume first argument is regnum and second argument is location.
From-SVN: r157762
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 25 |
2 files changed, 29 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1dbd25b..528a299 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2010-03-26 Jakub Jelinek <jakub@redhat.com> + + PR debug/43540 + * dwarf2out.c (reg_save): For DW_CFA_expression put regnum + into first operand and location into second. + (dw_cfi_oprnd1_desc): Return dw_cfi_oprnd_reg_num instead of + dw_cfi_oprnd_loc for DW_CFA_expression. + (dw_cfi_oprnd2_desc): Return dw_cfi_oprnd_loc for DW_CFA_expression. + (output_cfa_loc, output_cfa_loc_raw): For DW_CFA_expression + assume first argument is regnum and second argument is location. + 2010-03-26 Uros Bizjak <ubizjak@gmail.com> PR target/42113 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 3ca61c3..bd75de9 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -1115,8 +1115,8 @@ reg_save (const char *label, unsigned int reg, unsigned int sreg, HOST_WIDE_INT && sreg == INVALID_REGNUM) { cfi->dw_cfi_opc = DW_CFA_expression; - cfi->dw_cfi_oprnd2.dw_cfi_reg_num = reg; - cfi->dw_cfi_oprnd1.dw_cfi_loc + cfi->dw_cfi_oprnd1.dw_cfi_reg_num = reg; + cfi->dw_cfi_oprnd2.dw_cfi_loc = build_cfa_aligned_loc (offset, fde->stack_realignment); } else if (sreg == INVALID_REGNUM) @@ -2911,6 +2911,7 @@ dw_cfi_oprnd1_desc (enum dwarf_call_frame_info cfi) case DW_CFA_same_value: case DW_CFA_def_cfa_register: case DW_CFA_register: + case DW_CFA_expression: return dw_cfi_oprnd_reg_num; case DW_CFA_def_cfa_offset: @@ -2919,7 +2920,6 @@ dw_cfi_oprnd1_desc (enum dwarf_call_frame_info cfi) return dw_cfi_oprnd_offset; case DW_CFA_def_cfa_expression: - case DW_CFA_expression: return dw_cfi_oprnd_loc; default: @@ -2946,6 +2946,9 @@ dw_cfi_oprnd2_desc (enum dwarf_call_frame_info cfi) case DW_CFA_register: return dw_cfi_oprnd_reg_num; + case DW_CFA_expression: + return dw_cfi_oprnd_loc; + default: return dw_cfi_oprnd_unused; } @@ -5193,10 +5196,14 @@ output_cfa_loc (dw_cfi_ref cfi) unsigned long size; if (cfi->dw_cfi_opc == DW_CFA_expression) - dw2_asm_output_data (1, cfi->dw_cfi_oprnd2.dw_cfi_reg_num, NULL); + { + dw2_asm_output_data (1, cfi->dw_cfi_oprnd1.dw_cfi_reg_num, NULL); + loc = cfi->dw_cfi_oprnd2.dw_cfi_loc; + } + else + loc = cfi->dw_cfi_oprnd1.dw_cfi_loc; /* Output the size of the block. */ - loc = cfi->dw_cfi_oprnd1.dw_cfi_loc; size = size_of_locs (loc); dw2_asm_output_data_uleb128 (size, NULL); @@ -5213,10 +5220,14 @@ output_cfa_loc_raw (dw_cfi_ref cfi) unsigned long size; if (cfi->dw_cfi_opc == DW_CFA_expression) - fprintf (asm_out_file, "0x%x,", cfi->dw_cfi_oprnd2.dw_cfi_reg_num); + { + fprintf (asm_out_file, "0x%x,", cfi->dw_cfi_oprnd1.dw_cfi_reg_num); + loc = cfi->dw_cfi_oprnd2.dw_cfi_loc; + } + else + loc = cfi->dw_cfi_oprnd1.dw_cfi_loc; /* Output the size of the block. */ - loc = cfi->dw_cfi_oprnd1.dw_cfi_loc; size = size_of_locs (loc); dw2_asm_output_data_uleb128_raw (size); fputc (',', asm_out_file); |