|
From: <sv...@va...> - 2006-04-08 16:22:58
|
Author: sewardj
Date: 2006-04-08 17:22:53 +0100 (Sat, 08 Apr 2006)
New Revision: 5838
Log:
Fold in a patch which appeared in FC5's default valgrind build, which
causes V to ignore more DWARF3 CFA expressions on amd64 and so gets
rid of complaints from the CFA reader. Why didn't Red Hat push this
patch upstream? I don't know.
Modified:
trunk/coregrind/m_debuginfo/readdwarf.c
Modified: trunk/coregrind/m_debuginfo/readdwarf.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_debuginfo/readdwarf.c 2006-04-08 13:17:25 UTC (rev =
5837)
+++ trunk/coregrind/m_debuginfo/readdwarf.c 2006-04-08 16:22:53 UTC (rev =
5838)
@@ -1349,8 +1349,8 @@
8 is the return address (EIP) */
=20
/* Note that we don't support DWARF3 expressions (DW_CFA_expression,
- DW_CFA_def_cfa_expression). The code just reads over them and
- ignores them.=20
+ DW_CFA_def_cfa_expression, DW_CFA_val_expression). The code just=20
+ reads over them and ignores them.=20
=20
Note also, does not support the 64-bit DWARF format (only known
compiler that generates it so far is IBM's xlc/xlC/xlf suite).
@@ -1411,10 +1411,15 @@
DW_CFA_def_cfa_expression =3D 0x0f, /* DWARF3 only */
DW_CFA_expression =3D 0x10, /* DWARF3 only */
DW_CFA_offset_extended_sf =3D 0x11, /* DWARF3 only */
+ DW_CFA_def_cfa_sf =3D 0x12, /* DWARF3 only */
DW_CFA_def_cfa_offset_sf =3D 0x13, /* DWARF3 only */
+ DW_CFA_val_offset =3D 0x14, /* DWARF3 only */
+ DW_CFA_val_offset_sf =3D 0x15, /* DWARF3 only */
+ DW_CFA_val_expression =3D 0x16, /* DWARF3 only */
DW_CFA_lo_user =3D 0x1c,
DW_CFA_GNU_window_save =3D 0x2d, /* GNU extension */
DW_CFA_GNU_args_size =3D 0x2e, /* GNU extension */
+ DW_CFA_GNU_negative_offset_extended =3D 0x2f, /* GNU extension */
DW_CFA_hi_user =3D 0x3f
};
=20
@@ -1447,7 +1452,8 @@
*/
typedef
struct {
- enum { RR_Undef, RR_Same, RR_CFAoff, RR_Reg, RR_Arch, RR_Expr } ta=
g;
+ enum { RR_Undef, RR_Same, RR_CFAoff, RR_Reg, RR_Arch, RR_Expr,
+ RR_CFAValoff, RR_ValExpr } tag;
=20
/* Note, .coff and .reg are never both in use. Therefore could
merge them into one. */
@@ -1466,9 +1472,11 @@
case RR_Undef: VG_(printf)("u "); break;
case RR_Same: VG_(printf)("s "); break;
case RR_CFAoff: VG_(printf)("c%d ", reg->coff); break;
+ case RR_CFAValoff: VG_(printf)("v%d ", reg->coff); break;
case RR_Reg: VG_(printf)("r%d ", reg->reg); break;
case RR_Arch: VG_(printf)("a "); break;
case RR_Expr: VG_(printf)("e "); break;
+ case RR_ValExpr: VG_(printf)("ve "); break;
default: VG_(core_panic)("ppRegRule");
}
}
@@ -1576,6 +1584,7 @@
case RR_Undef: _how =3D CFIR_UNKNOWN; _off =3D 0; break; =
\
case RR_Same: _how =3D CFIR_SAME; _off =3D 0; break; =
\
case RR_CFAoff: _how =3D CFIR_MEMCFAREL; _off =3D _ctxreg.coff; br=
eak; \
+ case RR_CFAValoff: _how =3D CFIR_CFAREL; _off =3D _ctxreg.coff; br=
eak; \
default: { why =3D 2; goto failed; } /* otherwise give up *=
/ \
}
=20
@@ -1902,6 +1911,17 @@
ctx->cfa_offset =3D off;
break;
=20
+ case DW_CFA_def_cfa_sf:
+ reg =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ off =3D read_leb128( &instr[i], &nleb, 1 );
+ i +=3D nleb;
+ if (reg < 0 || reg >=3D N_CFI_REGS)
+ return 0; /* fail */
+ ctx->cfa_reg =3D reg;
+ ctx->cfa_offset =3D off;
+ break;
+
case DW_CFA_register:
reg =3D read_leb128( &instr[i], &nleb, 0);
i +=3D nleb;
@@ -1915,6 +1935,17 @@
ctx->reg[reg].reg =3D reg2;
break;
=20
+ case DW_CFA_offset_extended:
+ reg =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ off =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ if (reg < 0 || reg >=3D N_CFI_REGS)
+ return 0; /* fail */
+ ctx->reg[reg].tag =3D RR_CFAoff;
+ ctx->reg[reg].coff =3D off * ctx->data_a_f;
+ break;
+
case DW_CFA_offset_extended_sf:
reg =3D read_leb128( &instr[i], &nleb, 0 );
i +=3D nleb;
@@ -1926,6 +1957,49 @@
ctx->reg[reg].coff =3D off * ctx->data_a_f;
break; =20
=20
+ case DW_CFA_GNU_negative_offset_extended:
+ reg =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ off =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ if (reg < 0 || reg >=3D N_CFI_REGS)
+ return 0; /* fail */
+ ctx->reg[reg].tag =3D RR_CFAoff;
+ ctx->reg[reg].coff =3D -off * ctx->data_a_f;
+ break;
+
+ case DW_CFA_restore_extended:
+ reg =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ if (reg < 0 || reg >=3D N_CFI_REGS)
+ return 0; /* fail */
+ if (restore_ctx =3D=3D NULL)
+ return 0; /* fail */
+ ctx->reg[reg] =3D restore_ctx->reg[reg];
+ break;
+
+ case DW_CFA_val_offset:
+ reg =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ off =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ if (reg < 0 || reg >=3D N_CFI_REGS)
+ return 0; /* fail */
+ ctx->reg[reg].tag =3D RR_CFAValoff;
+ ctx->reg[reg].coff =3D off * ctx->data_a_f;
+ break;
+
+ case DW_CFA_val_offset_sf:
+ reg =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ off =3D read_leb128( &instr[i], &nleb, 1 );
+ i +=3D nleb;
+ if (reg < 0 || reg >=3D N_CFI_REGS)
+ return 0; /* fail */
+ ctx->reg[reg].tag =3D RR_CFAValoff;
+ ctx->reg[reg].coff =3D off * ctx->data_a_f;
+ break;
+
case DW_CFA_def_cfa_register:
reg =3D read_leb128( &instr[i], &nleb, 0);
i +=3D nleb;
@@ -1969,6 +2043,22 @@
ctx->reg[reg].tag =3D RR_Expr;
break;
=20
+ case DW_CFA_val_expression:
+ /* Too difficult to really handle; just skip over it and say
+ that we don't know what do to with the register. */
+ if (VG_(clo_trace_cfi))
+ VG_(printf)("DWARF2 CFI reader: "
+ "ignoring DW_CFA_val_expression\n");
+ reg =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ len =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ i +=3D len;
+ if (reg < 0 || reg >=3D N_CFI_REGS)
+ return 0; /* fail */
+ ctx->reg[reg].tag =3D RR_ValExpr;
+ break;
+
case DW_CFA_def_cfa_expression:
if (VG_(clo_trace_cfi))
VG_(printf)("DWARF2 CFI reader: "
@@ -2025,7 +2115,7 @@
}
=20
if (hi2 =3D=3D DW_CFA_restore) {
- VG_(printf)("DW_CFA_restore(%d)\n", (Int)lo6);
+ VG_(printf)("DW_CFA_restore(r%d)\n", (Int)lo6);
return i;
}
=20
@@ -2065,6 +2155,14 @@
VG_(printf)("DW_CFA_def_cfa(r%d, off %d)\n", reg, off);=20
break;
=20
+ case DW_CFA_def_cfa_sf:
+ reg =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ off =3D read_leb128( &instr[i], &nleb, 1 );
+ i +=3D nleb;
+ VG_(printf)("DW_CFA_def_cfa_sf(r%d, off %d)\n", reg, off);
+ break;
+
case DW_CFA_register:
reg =3D read_leb128( &instr[i], &nleb, 0);
i +=3D nleb;
@@ -2085,6 +2183,38 @@
VG_(printf)("DW_CFA_def_cfa_offset(%d)\n", off);=20
break;
=20
+ case DW_CFA_def_cfa_offset_sf:
+ off =3D read_leb128( &instr[i], &nleb, 1);
+ i +=3D nleb;
+ VG_(printf)("DW_CFA_def_cfa_offset_sf(%d)\n", off);
+ break;
+
+ case DW_CFA_restore_extended:
+ reg =3D read_leb128( &instr[i], &nleb, 0);
+ i +=3D nleb;
+ VG_(printf)("DW_CFA_restore_extended(r%d)\n", reg);
+ break;
+
+ case DW_CFA_undefined:
+ reg =3D read_leb128( &instr[i], &nleb, 0);
+ i +=3D nleb;
+ VG_(printf)("DW_CFA_undefined(r%d)\n", reg);
+ break;
+
+ case DW_CFA_same_value:
+ reg =3D read_leb128( &instr[i], &nleb, 0);
+ i +=3D nleb;
+ VG_(printf)("DW_CFA_same_value(r%d)\n", reg);
+ break;
+
+ case DW_CFA_remember_state:
+ VG_(printf)("DW_CFA_remember_state\n");
+ break;
+
+ case DW_CFA_restore_state:
+ VG_(printf)("DW_CFA_restore_state\n");
+ break;
+
case DW_CFA_GNU_args_size:
off =3D read_leb128( &instr[i], &nleb, 0 );
i +=3D nleb;
@@ -2107,6 +2237,55 @@
VG_(printf)("DW_CFA_expression(r%d, length %d)\n", reg, len);
break;
=20
+ case DW_CFA_val_expression:
+ reg =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ len =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ i +=3D len;
+ VG_(printf)("DW_CFA_val_expression(r%d, length %d)\n", reg, len=
);
+ break;
+
+ case DW_CFA_offset_extended:
+ reg =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ off =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ VG_(printf)("DW_CFA_offset_extended(r%d, off %d x data_af)\n", =
reg, off);
+ break;
+
+ case DW_CFA_offset_extended_sf:
+ reg =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ off =3D read_leb128( &instr[i], &nleb, 1 );
+ i +=3D nleb;
+ VG_(printf)("DW_CFA_offset_extended_sf(r%d, off %d x data_af)\n=
", reg, off);
+ break;
+
+ case DW_CFA_GNU_negative_offset_extended:
+ reg =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ off =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ VG_(printf)("DW_CFA_GNU_negative_offset_extended(r%d, off %d x =
data_af)\n", reg, -off);
+ break;
+
+ case DW_CFA_val_offset:
+ reg =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ off =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ VG_(printf)("DW_CFA_val_offset(r%d, off %d x data_af)\n", reg, =
off);
+ break;
+
+ case DW_CFA_val_offset_sf:
+ reg =3D read_leb128( &instr[i], &nleb, 0 );
+ i +=3D nleb;
+ off =3D read_leb128( &instr[i], &nleb, 1 );
+ i +=3D nleb;
+ VG_(printf)("DW_CFA_val_offset_sf(r%d, off %d x data_af)\n", re=
g, off);
+ break;
+
case DW_CFA_GNU_window_save:
VG_(printf)("DW_CFA_GNU_window_save\n");
break;
@@ -2397,6 +2576,9 @@
data++;
cie_augmentation++;
break;
+ case 'S':
+ cie_augmentation++;
+ break;
default:
if (the_CIEs[this_CIE].instrs =3D=3D NULL) {
how =3D "unhandled cie.augmentation";
|
|
From: Oswald B. <os...@kd...> - 2006-04-08 16:36:09
|
On Sat, Apr 08, 2006 at 05:22:55PM +0100, sv...@va... wrote: > Why didn't Red Hat push this patch upstream? I don't know. > because it is common practice. "no time", you know ... -- Hi! I'm a .signature virus! Copy me into your ~/.signature, please! -- Chaos, panic, and disorder - my work here is done. |