aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-03-26 21:53:58 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2010-03-26 21:53:58 +0100
commit89245ef27b0846d47bceab52811ec6e529caa272 (patch)
tree6dd175a70af2ad8f1a914a721882ba021f783b6f
parentc5e43cc45b27e39016aa1dead023dc5edbd34eb2 (diff)
downloadgcc-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/ChangeLog11
-rw-r--r--gcc/dwarf2out.c25
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);