You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(122) |
Nov
(152) |
Dec
(69) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(6) |
Feb
(25) |
Mar
(73) |
Apr
(82) |
May
(24) |
Jun
(25) |
Jul
(10) |
Aug
(11) |
Sep
(10) |
Oct
(54) |
Nov
(203) |
Dec
(182) |
| 2004 |
Jan
(307) |
Feb
(305) |
Mar
(430) |
Apr
(312) |
May
(187) |
Jun
(342) |
Jul
(487) |
Aug
(637) |
Sep
(336) |
Oct
(373) |
Nov
(441) |
Dec
(210) |
| 2005 |
Jan
(385) |
Feb
(480) |
Mar
(636) |
Apr
(544) |
May
(679) |
Jun
(625) |
Jul
(810) |
Aug
(838) |
Sep
(634) |
Oct
(521) |
Nov
(965) |
Dec
(543) |
| 2006 |
Jan
(494) |
Feb
(431) |
Mar
(546) |
Apr
(411) |
May
(406) |
Jun
(322) |
Jul
(256) |
Aug
(401) |
Sep
(345) |
Oct
(542) |
Nov
(308) |
Dec
(481) |
| 2007 |
Jan
(427) |
Feb
(326) |
Mar
(367) |
Apr
(255) |
May
(244) |
Jun
(204) |
Jul
(223) |
Aug
(231) |
Sep
(354) |
Oct
(374) |
Nov
(497) |
Dec
(362) |
| 2008 |
Jan
(322) |
Feb
(482) |
Mar
(658) |
Apr
(422) |
May
(476) |
Jun
(396) |
Jul
(455) |
Aug
(267) |
Sep
(280) |
Oct
(253) |
Nov
(232) |
Dec
(304) |
| 2009 |
Jan
(486) |
Feb
(470) |
Mar
(458) |
Apr
(423) |
May
(696) |
Jun
(461) |
Jul
(551) |
Aug
(575) |
Sep
(134) |
Oct
(110) |
Nov
(157) |
Dec
(102) |
| 2010 |
Jan
(226) |
Feb
(86) |
Mar
(147) |
Apr
(117) |
May
(107) |
Jun
(203) |
Jul
(193) |
Aug
(238) |
Sep
(300) |
Oct
(246) |
Nov
(23) |
Dec
(75) |
| 2011 |
Jan
(133) |
Feb
(195) |
Mar
(315) |
Apr
(200) |
May
(267) |
Jun
(293) |
Jul
(353) |
Aug
(237) |
Sep
(278) |
Oct
(611) |
Nov
(274) |
Dec
(260) |
| 2012 |
Jan
(303) |
Feb
(391) |
Mar
(417) |
Apr
(441) |
May
(488) |
Jun
(655) |
Jul
(590) |
Aug
(610) |
Sep
(526) |
Oct
(478) |
Nov
(359) |
Dec
(372) |
| 2013 |
Jan
(467) |
Feb
(226) |
Mar
(391) |
Apr
(281) |
May
(299) |
Jun
(252) |
Jul
(311) |
Aug
(352) |
Sep
(481) |
Oct
(571) |
Nov
(222) |
Dec
(231) |
| 2014 |
Jan
(185) |
Feb
(329) |
Mar
(245) |
Apr
(238) |
May
(281) |
Jun
(399) |
Jul
(382) |
Aug
(500) |
Sep
(579) |
Oct
(435) |
Nov
(487) |
Dec
(256) |
| 2015 |
Jan
(338) |
Feb
(357) |
Mar
(330) |
Apr
(294) |
May
(191) |
Jun
(108) |
Jul
(142) |
Aug
(261) |
Sep
(190) |
Oct
(54) |
Nov
(83) |
Dec
(22) |
| 2016 |
Jan
(49) |
Feb
(89) |
Mar
(33) |
Apr
(50) |
May
(27) |
Jun
(34) |
Jul
(53) |
Aug
(53) |
Sep
(98) |
Oct
(206) |
Nov
(93) |
Dec
(53) |
| 2017 |
Jan
(65) |
Feb
(82) |
Mar
(102) |
Apr
(86) |
May
(187) |
Jun
(67) |
Jul
(23) |
Aug
(93) |
Sep
(65) |
Oct
(45) |
Nov
(35) |
Dec
(17) |
| 2018 |
Jan
(26) |
Feb
(35) |
Mar
(38) |
Apr
(32) |
May
(8) |
Jun
(43) |
Jul
(27) |
Aug
(30) |
Sep
(43) |
Oct
(42) |
Nov
(38) |
Dec
(67) |
| 2019 |
Jan
(32) |
Feb
(37) |
Mar
(53) |
Apr
(64) |
May
(49) |
Jun
(18) |
Jul
(14) |
Aug
(53) |
Sep
(25) |
Oct
(30) |
Nov
(49) |
Dec
(31) |
| 2020 |
Jan
(87) |
Feb
(45) |
Mar
(37) |
Apr
(51) |
May
(99) |
Jun
(36) |
Jul
(11) |
Aug
(14) |
Sep
(20) |
Oct
(24) |
Nov
(40) |
Dec
(23) |
| 2021 |
Jan
(14) |
Feb
(53) |
Mar
(85) |
Apr
(15) |
May
(19) |
Jun
(3) |
Jul
(14) |
Aug
(1) |
Sep
(57) |
Oct
(73) |
Nov
(56) |
Dec
(22) |
| 2022 |
Jan
(3) |
Feb
(22) |
Mar
(6) |
Apr
(55) |
May
(46) |
Jun
(39) |
Jul
(15) |
Aug
(9) |
Sep
(11) |
Oct
(34) |
Nov
(20) |
Dec
(36) |
| 2023 |
Jan
(79) |
Feb
(41) |
Mar
(99) |
Apr
(169) |
May
(48) |
Jun
(16) |
Jul
(16) |
Aug
(57) |
Sep
(19) |
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
1
(5) |
2
(11) |
3
|
4
(9) |
5
(10) |
6
(4) |
7
(14) |
|
8
(15) |
9
(15) |
10
(14) |
11
(13) |
12
(16) |
13
(12) |
14
(9) |
|
15
(21) |
16
(13) |
17
(11) |
18
(13) |
19
(5) |
20
(29) |
21
(20) |
|
22
(13) |
23
(18) |
24
(21) |
25
(17) |
26
(26) |
27
(13) |
28
(17) |
|
29
(10) |
30
(5) |
|
|
|
|
|
|
From: <sv...@va...> - 2014-06-15 21:57:02
|
Author: sewardj
Date: Sun Jun 15 21:56:54 2014
New Revision: 14043
Log:
Handle new IROp Iop_Abs64x2.
Modified:
trunk/memcheck/mc_translate.c
Modified: trunk/memcheck/mc_translate.c
==============================================================================
--- trunk/memcheck/mc_translate.c (original)
+++ trunk/memcheck/mc_translate.c Sun Jun 15 21:56:54 2014
@@ -4244,6 +4244,7 @@
case Iop_CmpNEZ64x2:
case Iop_CipherSV128:
case Iop_Clz64x2:
+ case Iop_Abs64x2:
return mkPCast64x2(mce, vatom);
case Iop_PwBitMtxXpose64x2:
|
|
From: <sv...@va...> - 2014-06-15 21:56:35
|
Author: sewardj
Date: Sun Jun 15 21:56:28 2014
New Revision: 14042
Log:
Enable test cases for instructions implemented today.
Modified:
trunk/none/tests/arm64/fp_and_simd.c
Modified: trunk/none/tests/arm64/fp_and_simd.c
==============================================================================
--- trunk/none/tests/arm64/fp_and_simd.c (original)
+++ trunk/none/tests/arm64/fp_and_simd.c Sun Jun 15 21:56:28 2014
@@ -3259,18 +3259,18 @@
// abs d
// neg d
- if (0) test_abs_d_d(TyD);
- if (0) test_neg_d_d(TyD);
+ if (1) test_abs_d_d(TyD);
+ if (1) test_neg_d_d(TyD);
// abs 2d,4s,2s,8h,4h,16b,8b
// neg 2d,4s,2s,8h,4h,16b,8b
- if (0) test_abs_2d_2d(TyD);
- if (0) test_abs_4s_4s(TyS);
- if (0) test_abs_2s_2s(TyS);
- if (0) test_abs_8h_8h(TyH);
- if (0) test_abs_4h_4h(TyH);
- if (0) test_abs_16b_16b(TyB);
- if (0) test_abs_8b_8b(TyB);
+ if (1) test_abs_2d_2d(TyD);
+ if (1) test_abs_4s_4s(TyS);
+ if (1) test_abs_2s_2s(TyS);
+ if (1) test_abs_8h_8h(TyH);
+ if (1) test_abs_4h_4h(TyH);
+ if (1) test_abs_16b_16b(TyB);
+ if (1) test_abs_8b_8b(TyB);
if (1) test_neg_2d_2d(TyD);
if (1) test_neg_4s_4s(TyS);
if (1) test_neg_2s_2s(TyS);
@@ -3305,49 +3305,49 @@
// subhn{2} 2s/4s_2d_2d, 4h/8h_4s_4s, 8b/16b_8h_8h
// raddhn{2} 2s/4s_2d_2d, 4h/8h_4s_4s, 8b/16b_8h_8h
// rsubhn{2} 2s/4s_2d_2d, 4h/8h_4s_4s, 8b/16b_8h_8h
- if (0) test_addhn_2s_2d_2d(TyD);
- if (0) test_addhn2_4s_2d_2d(TyD);
- if (0) test_addhn_4h_4s_4s(TyS);
- if (0) test_addhn2_8h_4s_4s(TyS);
- if (0) test_addhn_8b_8h_8h(TyH);
- if (0) test_addhn2_16b_8h_8h(TyH);
- if (0) test_subhn_2s_2d_2d(TyD);
- if (0) test_subhn2_4s_2d_2d(TyD);
- if (0) test_subhn_4h_4s_4s(TyS);
- if (0) test_subhn2_8h_4s_4s(TyS);
- if (0) test_subhn_8b_8h_8h(TyH);
- if (0) test_subhn2_16b_8h_8h(TyH);
- if (0) test_raddhn_2s_2d_2d(TyD);
- if (0) test_raddhn2_4s_2d_2d(TyD);
- if (0) test_raddhn_4h_4s_4s(TyS);
- if (0) test_raddhn2_8h_4s_4s(TyS);
- if (0) test_raddhn_8b_8h_8h(TyH);
- if (0) test_raddhn2_16b_8h_8h(TyH);
- if (0) test_rsubhn_2s_2d_2d(TyD);
- if (0) test_rsubhn2_4s_2d_2d(TyD);
- if (0) test_rsubhn_4h_4s_4s(TyS);
- if (0) test_rsubhn2_8h_4s_4s(TyS);
- if (0) test_rsubhn_8b_8h_8h(TyH);
- if (0) test_rsubhn2_16b_8h_8h(TyH);
+ if (1) test_addhn_2s_2d_2d(TyD);
+ if (1) test_addhn2_4s_2d_2d(TyD);
+ if (1) test_addhn_4h_4s_4s(TyS);
+ if (1) test_addhn2_8h_4s_4s(TyS);
+ if (1) test_addhn_8b_8h_8h(TyH);
+ if (1) test_addhn2_16b_8h_8h(TyH);
+ if (1) test_subhn_2s_2d_2d(TyD);
+ if (1) test_subhn2_4s_2d_2d(TyD);
+ if (1) test_subhn_4h_4s_4s(TyS);
+ if (1) test_subhn2_8h_4s_4s(TyS);
+ if (1) test_subhn_8b_8h_8h(TyH);
+ if (1) test_subhn2_16b_8h_8h(TyH);
+ if (1) test_raddhn_2s_2d_2d(TyD);
+ if (1) test_raddhn2_4s_2d_2d(TyD);
+ if (1) test_raddhn_4h_4s_4s(TyS);
+ if (1) test_raddhn2_8h_4s_4s(TyS);
+ if (1) test_raddhn_8b_8h_8h(TyH);
+ if (1) test_raddhn2_16b_8h_8h(TyH);
+ if (1) test_rsubhn_2s_2d_2d(TyD);
+ if (1) test_rsubhn2_4s_2d_2d(TyD);
+ if (1) test_rsubhn_4h_4s_4s(TyS);
+ if (1) test_rsubhn2_8h_4s_4s(TyS);
+ if (1) test_rsubhn_8b_8h_8h(TyH);
+ if (1) test_rsubhn2_16b_8h_8h(TyH);
// addp d (add pairs, across)
- if (0) test_addp_d_2d(TyD);
+ if (1) test_addp_d_2d(TyD);
// addp 2d,4s,2s,8h,4h,16b,8b
- if (0) test_addp_2d_2d_2d(TyD);
- if (0) test_addp_4s_4s_4s(TyS);
- if (0) test_addp_2s_2s_2s(TyS);
- if (0) test_addp_8h_8h_8h(TyH);
- if (0) test_addp_4h_4h_4h(TyH);
- if (0) test_addp_16b_16b_16b(TyB);
- if (0) test_addp_8b_8b_8b(TyB);
+ if (1) test_addp_2d_2d_2d(TyD);
+ if (1) test_addp_4s_4s_4s(TyS);
+ if (1) test_addp_2s_2s_2s(TyS);
+ if (1) test_addp_8h_8h_8h(TyH);
+ if (1) test_addp_4h_4h_4h(TyH);
+ if (1) test_addp_16b_16b_16b(TyB);
+ if (1) test_addp_8b_8b_8b(TyB);
// addv 4s,8h,4h,16b,18b (reduce across vector)
- if (0) test_addv_s_4s(TyS);
- if (0) test_addv_h_8h(TyH);
- if (0) test_addv_h_4h(TyH);
- if (0) test_addv_b_16b(TyB);
- if (0) test_addv_b_8b(TyB);
+ if (1) test_addv_s_4s(TyS);
+ if (1) test_addv_h_8h(TyH);
+ if (1) test_addv_h_4h(TyH);
+ if (1) test_addv_b_16b(TyB);
+ if (1) test_addv_b_8b(TyB);
// and 16b,8b
// bic 16b,8b
|
|
From: <sv...@va...> - 2014-06-15 21:55:44
|
Author: sewardj
Date: Sun Jun 15 21:55:33 2014
New Revision: 2878
Log:
arm64: implement: addp std7_std7_std7, addv vector, addp d_2d
Modified:
trunk/priv/guest_arm64_toIR.c
Modified: trunk/priv/guest_arm64_toIR.c
==============================================================================
--- trunk/priv/guest_arm64_toIR.c (original)
+++ trunk/priv/guest_arm64_toIR.c Sun Jun 15 21:55:33 2014
@@ -5251,7 +5251,7 @@
zero out all but the least significant lane. */
switch (op) {
case Iop_Min8Sx16: case Iop_Min8Ux16:
- case Iop_Max8Sx16: case Iop_Max8Ux16: {
+ case Iop_Max8Sx16: case Iop_Max8Ux16: case Iop_Add8x16: {
/* NB: temp naming here is misleading -- the naming is for 8
lanes of 16 bit, whereas what is being operated on is 16
lanes of 8 bits. */
@@ -5353,7 +5353,7 @@
return res;
}
case Iop_Min16Sx8: case Iop_Min16Ux8:
- case Iop_Max16Sx8: case Iop_Max16Ux8: {
+ case Iop_Max16Sx8: case Iop_Max16Ux8: case Iop_Add16x8: {
IRTemp x76543210 = src;
IRTemp x76547654 = newTemp(Ity_V128);
IRTemp x32103210 = newTemp(Ity_V128);
@@ -5402,7 +5402,7 @@
return res;
}
case Iop_Min32Sx4: case Iop_Min32Ux4:
- case Iop_Max32Sx4: case Iop_Max32Ux4: {
+ case Iop_Max32Sx4: case Iop_Max32Ux4: case Iop_Add32x4: {
IRTemp x3210 = src;
IRTemp x3232 = newTemp(Ity_V128);
IRTemp x1010 = newTemp(Ity_V128);
@@ -5653,41 +5653,59 @@
UInt nn = INSN(9,5);
UInt dd = INSN(4,0);
- if (opcode == BITS5(0,1,0,1,0) || opcode == BITS5(1,1,0,1,0)) {
- /* -------- 0,xx,01010: SMAXV -------- */
- /* -------- 1,xx,01010: UMAXV -------- */
- /* -------- 0,xx,11010: SMINV -------- */
- /* -------- 1,xx,11010: UMINV -------- */
- Bool isU = bitU == 1;
- Bool isMAX = (opcode & 16) == 0;
+ UInt ix = 0;
+ /**/ if (opcode == BITS5(0,1,0,1,0)) { ix = bitU == 0 ? 1 : 2; }
+ else if (opcode == BITS5(1,1,0,1,0)) { ix = bitU == 0 ? 3 : 4; }
+ else if (opcode == BITS5(1,1,0,1,1) && bitU == 0) { ix = 5; }
+ /**/
+ if (ix != 0) {
+ /* -------- 0,xx,01010: SMAXV -------- (1) */
+ /* -------- 1,xx,01010: UMAXV -------- (2) */
+ /* -------- 0,xx,11010: SMINV -------- (3) */
+ /* -------- 1,xx,11010: UMINV -------- (4) */
+ /* -------- 0,xx,11011: ADDV -------- (5) */
+ vassert(ix >= 1 && ix <= 5);
if (size == X11) return False; // 1d,2d cases not allowed
if (size == X10 && bitQ == 0) return False; // 2s case not allowed
- const IROp opMINS[3]
- = { Iop_Min8Sx16, Iop_Min16Sx8, Iop_Min32Sx4 };
- const IROp opMINU[3]
- = { Iop_Min8Ux16, Iop_Min16Ux8, Iop_Min32Ux4 };
const IROp opMAXS[3]
= { Iop_Max8Sx16, Iop_Max16Sx8, Iop_Max32Sx4 };
const IROp opMAXU[3]
= { Iop_Max8Ux16, Iop_Max16Ux8, Iop_Max32Ux4 };
+ const IROp opMINS[3]
+ = { Iop_Min8Sx16, Iop_Min16Sx8, Iop_Min32Sx4 };
+ const IROp opMINU[3]
+ = { Iop_Min8Ux16, Iop_Min16Ux8, Iop_Min32Ux4 };
+ const IROp opADD[3]
+ = { Iop_Add8x16, Iop_Add16x8, Iop_Add32x4 };
vassert(size < 3);
- IROp op = isMAX ? (isU ? opMAXU[size] : opMAXS[size])
- : (isU ? opMINU[size] : opMINS[size]);
+ IROp op = Iop_INVALID;
+ const HChar* nm = NULL;
+ switch (ix) {
+ case 1: op = opMAXS[size]; nm = "smaxv"; break;
+ case 2: op = opMAXU[size]; nm = "umaxv"; break;
+ case 3: op = opMINS[size]; nm = "sminv"; break;
+ case 4: op = opMINU[size]; nm = "uminv"; break;
+ case 5: op = opADD[size]; nm = "addv"; break;
+ default: vassert(0);
+ }
+ vassert(op != Iop_INVALID && nm != NULL);
IRTemp tN1 = newTemp(Ity_V128);
assign(tN1, getQReg128(nn));
/* If Q == 0, we're just folding lanes in the lower half of
the value. In which case, copy the lower half of the
source into the upper half, so we can then treat it the
- same as the full width case. */
+ same as the full width case. Except for the addition case,
+ in which we have to zero out the upper half. */
IRTemp tN2 = newTemp(Ity_V128);
- assign(tN2, bitQ == 0 ? mk_CatEvenLanes64x2(tN1,tN1) : mkexpr(tN1));
+ assign(tN2, bitQ == 0
+ ? (ix == 5 ? unop(Iop_ZeroHI64ofV128, mkexpr(tN1))
+ : mk_CatEvenLanes64x2(tN1,tN1))
+ : mkexpr(tN1));
IRTemp res = math_MINMAXV(tN2, op);
if (res == IRTemp_INVALID)
return False; /* means math_MINMAXV
doesn't handle this case yet */
putQReg128(dd, mkexpr(res));
- const HChar* nm = isMAX ? (isU ? "umaxv" : "smaxv")
- : (isU ? "uminv" : "sminv");
const IRType tys[3] = { Ity_I8, Ity_I16, Ity_I32 };
IRType laneTy = tys[size];
const HChar* arr = nameArr_Q_SZ(bitQ, size);
@@ -6037,7 +6055,35 @@
static
Bool dis_AdvSIMD_scalar_pairwise(/*MB_OUT*/DisResult* dres, UInt insn)
{
+ /* 31 28 23 21 16 11 9 4
+ 01 u 11110 sz 11000 opcode 10 n d
+ Decode fields: u,sz,opcode
+ */
# define INSN(_bMax,_bMin) SLICE_UInt(insn, (_bMax), (_bMin))
+ if (INSN(31,30) != BITS2(0,1)
+ || INSN(28,24) != BITS5(1,1,1,1,0)
+ || INSN(21,17) != BITS5(1,1,0,0,0)
+ || INSN(11,10) != BITS2(1,0)) {
+ return False;
+ }
+ UInt bitU = INSN(29,29);
+ UInt sz = INSN(23,22);
+ UInt opcode = INSN(16,12);
+ UInt nn = INSN(9,5);
+ UInt dd = INSN(4,0);
+
+ if (bitU == 0 && sz == X11 && opcode == BITS5(1,1,0,1,1)) {
+ /* -------- 0,11,11011 ADDP d_2d -------- */
+ IRTemp xy = newTemp(Ity_V128);
+ IRTemp xx = newTemp(Ity_V128);
+ assign(xy, getQReg128(nn));
+ assign(xx, binop(Iop_InterleaveHI64x2, mkexpr(xy), mkexpr(xy)));
+ putQReg128(dd, unop(Iop_ZeroHI64ofV128,
+ binop(Iop_Add64x2, mkexpr(xy), mkexpr(xx))));
+ DIP("addp d%u, %s.2d\n", dd, nameQReg128(nn));
+ return True;
+ }
+
return False;
# undef INSN
}
@@ -6715,6 +6761,39 @@
return False;
}
+ if (bitU == 0 && opcode == BITS5(1,0,1,1,1)) {
+ if (bitQ == 0 && size == X11) return False; // implied 1d case
+ /* -------- 0,xx,10111 ADDP std7_std7_std7 -------- */
+ const IROp opsADD[4]
+ = { Iop_Add8x16, Iop_Add16x8, Iop_Add32x4, Iop_Add64x2 };
+ const IROp opsCEV[4]
+ = { Iop_CatEvenLanes8x16, Iop_CatEvenLanes16x8, Iop_CatEvenLanes32x4,
+ Iop_InterleaveLO64x2 };
+ const IROp opsCOD[4]
+ = { Iop_CatOddLanes8x16, Iop_CatOddLanes16x8, Iop_CatOddLanes32x4,
+ Iop_InterleaveHI64x2 };
+ IRTemp vN = newTemp(Ity_V128);
+ IRTemp vM = newTemp(Ity_V128);
+ assign(vN, getQReg128(nn));
+ assign(vM, getQReg128(mm));
+ IRTemp res128 = newTemp(Ity_V128);
+ assign(res128, binop(opsADD[size],
+ binop(opsCEV[size], mkexpr(vM), mkexpr(vN)),
+ binop(opsCOD[size], mkexpr(vM), mkexpr(vN))));
+ /* In the half-width case, use CatEL32x4 to extract the half-width
+ result from the full-width result. */
+ IRExpr* res
+ = bitQ == 0 ? unop(Iop_ZeroHI64ofV128,
+ binop(Iop_CatEvenLanes32x4, mkexpr(res128),
+ mkexpr(res128)))
+ : mkexpr(res128);
+ putQReg128(dd, res);
+ const HChar* arr = nameArr_Q_SZ(bitQ, size);
+ DIP("addp %s.%s, %s.%s, %s.%s\n",
+ nameQReg128(dd), arr, nameQReg128(nn), arr, nameQReg128(mm), arr);
+ return True;
+ }
+
if (opcode == BITS5(1,0,0,1,1)) {
/* -------- 0,xx,10011 MUL std7_std7_std7 -------- */
/* -------- 1,xx,10011 PMUL 16b_16b_16b, 8b_8b_8b -------- */
|
|
From: <sv...@va...> - 2014-06-15 21:49:22
|
Author: philippe
Date: Sun Jun 15 21:49:13 2014
New Revision: 14041
Log:
Add a comment to document a possible optimisation (avoid double reading
of DIEs when one or more parsers will read them also)
+ add the name of the parser in the barf output.
Modified:
trunk/coregrind/m_debuginfo/readdwarf3.c
Modified: trunk/coregrind/m_debuginfo/readdwarf3.c
==============================================================================
--- trunk/coregrind/m_debuginfo/readdwarf3.c (original)
+++ trunk/coregrind/m_debuginfo/readdwarf3.c Sun Jun 15 21:49:13 2014
@@ -1676,6 +1676,7 @@
__attribute__((noreturn))
static void dump_bad_die_and_barf(
+ const HChar *whichparser,
DW_TAG dtag,
UWord posn,
Int level,
@@ -1709,14 +1710,14 @@
get_Form_contents( &cts, cc, c_die, True, form );
VG_(printf)("\t\n");
}
- VG_(printf)("\n");
- cc->barf("parse_var_DIE: confused by the above DIE");
+ VG_(printf)("\n%s:\n", whichparser);
+ cc->barf("confused by the above DIE");
}
__attribute__((noinline))
static void bad_DIE_confusion(int linenr)
{
- VG_(printf)("\nparse_var_DIE(%d): confused by:\n", linenr);
+ VG_(printf)("\nparse DIE(readdwarf3.c:%d): confused by:\n", linenr);
}
#define goto_bad_DIE do {bad_DIE_confusion(__LINE__); goto bad_DIE;} while (0)
@@ -2186,7 +2187,7 @@
return;
bad_DIE:
- dump_bad_die_and_barf(dtag, posn, level,
+ dump_bad_die_and_barf("parse_var_DIE", dtag, posn, level,
c_die, saved_die_c_offset,
abbv,
cc);
@@ -2409,7 +2410,7 @@
|| dtag == DW_TAG_compile_unit || dtag == DW_TAG_partial_unit;
bad_DIE:
- dump_bad_die_and_barf(dtag, posn, level,
+ dump_bad_die_and_barf("parse_inl_DIE", dtag, posn, level,
c_die, saved_die_c_offset,
abbv,
cc);
@@ -3347,7 +3348,7 @@
/*NOTREACHED*/
bad_DIE:
- dump_bad_die_and_barf(dtag, posn, level,
+ dump_bad_die_and_barf("parse_type_DIE", dtag, posn, level,
c_die, saved_die_c_offset,
abbv,
cc);
@@ -3738,6 +3739,19 @@
its contents. */
start_die_c_offset = get_position_of_Cursor( c );
+ /* "pre-read" the DIE (while doing nothing with the data)
+ for 3 reasons:
+ 1. it td3, trace the DIE data.
+ 2. determine if this DIE has a sibling (used for
+ optimising when only reading the inline info).
+ 3. determine the end of the DIE (after_die_c_offset).
+
+ The parsers below will re-read the DIEs if they are interested
+ in the atag. The var/type parsers re-read many DIEs. The
+ inline parser re-reads a smaller subset.
+ We could possibly avoid this double reading by having each
+ parser optionally parse the DIE and (if needed) skip
+ the DIE data if it was not read by any parser. */
nf_i = 0;
while (True) {
FormContents cts;
@@ -3756,7 +3770,6 @@
TRACE_D3("\t");
TRACE_D3("\n");
}
-
after_die_c_offset = get_position_of_Cursor( c );
if (VG_(clo_read_var_info)) {
|
Author: sewardj
Date: Sun Jun 15 19:36:29 2014
New Revision: 2877
Log:
arm64: implement: abs d_d, neg d_d, abs std7_std7, addhn, subhn, raddhn, rsubhn
Modified:
trunk/priv/guest_arm64_toIR.c
trunk/priv/host_arm64_defs.c
trunk/priv/host_arm64_defs.h
trunk/priv/host_arm64_isel.c
trunk/priv/ir_defs.c
trunk/pub/libvex_ir.h
Modified: trunk/priv/guest_arm64_toIR.c
==============================================================================
--- trunk/priv/guest_arm64_toIR.c (original)
+++ trunk/priv/guest_arm64_toIR.c Sun Jun 15 19:36:29 2014
@@ -273,6 +273,12 @@
return IRExpr_Const(IRConst_U32(i));
}
+static IRExpr* mkU16 ( UInt i )
+{
+ vassert(i < 65536);
+ return IRExpr_Const(IRConst_U16(i));
+}
+
static IRExpr* mkU8 ( UInt i )
{
vassert(i < 256);
@@ -3183,7 +3189,7 @@
{
vassert(bitQ <= 1 && size <= 3);
const HChar* nms[8]
- = { "2d", "4s", "8h", "16b", "1d", "2s", "4h", "8b" };
+ = { "8b", "4h", "2s", "1d", "16b", "8h", "4s", "2d" };
UInt ix = (bitQ << 2) | size;
vassert(ix < 8);
return nms[ix];
@@ -5516,6 +5522,36 @@
}
+/* Let |new64| be a V128 in which only the lower 64 bits are interesting,
+ and the upper can contain any value -- it is ignored. If |is2| is False,
+ generate IR to put |new64| in the lower half of vector reg |dd| and zero
+ the upper half. If |is2| is True, generate IR to put |new64| in the upper
+ half of vector reg |dd| and leave the lower half unchanged. This
+ simulates the behaviour of the "foo/foo2" instructions in which the
+ destination is half the width of sources, for example addhn/addhn2.
+*/
+static
+void putLO64andZUorPutHI64 ( Bool is2, UInt dd, IRTemp new64 )
+{
+ if (is2) {
+ /* Get the old contents of Vdd, zero the upper half, and replace
+ it with 'x'. */
+ IRTemp t_zero_oldLO = newTemp(Ity_V128);
+ assign(t_zero_oldLO, unop(Iop_ZeroHI64ofV128, getQReg128(dd)));
+ IRTemp t_newHI_zero = newTemp(Ity_V128);
+ assign(t_newHI_zero, binop(Iop_InterleaveLO64x2, mkexpr(new64),
+ mkV128(0x0000)));
+ IRTemp res = newTemp(Ity_V128);
+ assign(res, binop(Iop_OrV128, mkexpr(t_zero_oldLO),
+ mkexpr(t_newHI_zero)));
+ putQReg128(dd, mkexpr(res));
+ } else {
+ /* This is simple. */
+ putQReg128(dd, unop(Iop_ZeroHI64ofV128, mkexpr(new64)));
+ }
+}
+
+
static
Bool dis_AdvSIMD_EXT(/*MB_OUT*/DisResult* dres, UInt insn)
{
@@ -6153,6 +6189,22 @@
return True;
}
+ if (bitU == 0 && size == X11 && opcode == BITS5(0,1,0,1,1)) {
+ /* -------- 0,11,01011 ABS d_d -------- */
+ putQReg128(dd, unop(Iop_ZeroHI64ofV128,
+ unop(Iop_Abs64x2, getQReg128(nn))));
+ DIP("abs d%u, d%u\n", dd, nn);
+ return True;
+ }
+
+ if (bitU == 1 && size == X11 && opcode == BITS5(0,1,0,1,1)) {
+ /* -------- 1,11,01011 NEG d_d -------- */
+ putQReg128(dd, unop(Iop_ZeroHI64ofV128,
+ binop(Iop_Sub64x2, mkV128(0x0000), getQReg128(nn))));
+ DIP("neg d%u, d%u\n", dd, nn);
+ return True;
+ }
+
# define INSN(_bMax,_bMin) SLICE_UInt(insn, (_bMax), (_bMin))
return False;
# undef INSN
@@ -6338,7 +6390,80 @@
static
Bool dis_AdvSIMD_three_different(/*MB_OUT*/DisResult* dres, UInt insn)
{
+ /* 31 30 29 28 23 21 20 15 11 9 4
+ 0 Q U 01110 size 1 m opcode 00 n d
+ Decode fields: u,opcode
+ */
# define INSN(_bMax,_bMin) SLICE_UInt(insn, (_bMax), (_bMin))
+ if (INSN(31,31) != 0
+ || INSN(28,24) != BITS5(0,1,1,1,0)
+ || INSN(21,21) != 1
+ || INSN(11,10) != BITS2(0,0)) {
+ return False;
+ }
+ UInt bitQ = INSN(30,30);
+ UInt bitU = INSN(29,29);
+ UInt size = INSN(23,22);
+ UInt mm = INSN(20,16);
+ UInt opcode = INSN(15,12);
+ UInt nn = INSN(9,5);
+ UInt dd = INSN(4,0);
+ vassert(size < 4);
+ Bool is2 = bitQ == 1;
+
+ if (opcode == BITS4(0,1,0,0) || opcode == BITS4(0,1,1,0)) {
+ /* -------- 0,0100 ADDHN{2} -------- */
+ /* -------- 1,0100 RADDHN{2} -------- */
+ /* -------- 0,0110 SUBHN{2} -------- */
+ /* -------- 1,0110 RSUBHN{2} -------- */
+ /* Narrows, and size refers to the narrowed lanes. */
+ if (size == X11) return False;
+ vassert(size <= 2);
+ const IROp opADD[3] = { Iop_Add16x8, Iop_Add32x4, Iop_Add64x2 };
+ const IROp opSUB[3] = { Iop_Sub16x8, Iop_Sub32x4, Iop_Sub64x2 };
+ const IROp opSHR[3] = { Iop_ShrN16x8, Iop_ShrN32x4, Iop_ShrN64x2 };
+ const UInt shift[3] = { 8, 16, 32 };
+ const IROp opCAT[3] = { Iop_CatEvenLanes8x16, Iop_CatEvenLanes16x8,
+ Iop_CatEvenLanes32x4 };
+ Bool isADD = opcode == BITS4(0,1,0,0);
+ Bool isR = bitU == 1;
+ /* Combined elements in wide lanes */
+ IRTemp wide = newTemp(Ity_V128);
+ IRExpr* wideE = binop(isADD ? opADD[size] : opSUB[size],
+ getQReg128(nn), getQReg128(mm));
+ if (isR) {
+ IRType ty = Ity_INVALID;
+ IRTemp rcS = IRTemp_INVALID;
+ switch (size) {
+ case X00: ty = Ity_I16;
+ rcS = newTemp(ty); assign(rcS, mkU16(0x80)); break;
+ case X01: ty = Ity_I32;
+ rcS = newTemp(ty); assign(rcS, mkU32(0x8000)); break;
+ case X10: ty = Ity_I64;
+ rcS = newTemp(ty); assign(rcS, mkU64(0x80000000)); break;
+ default: vassert(0);
+ }
+ IRTemp rcV = math_DUP_TO_V128(rcS, ty);
+ wideE = binop(opADD[size], wideE, mkexpr(rcV));
+ }
+ assign(wide, wideE);
+ /* Top halves of elements, still in wide lanes */
+ IRTemp shrd = newTemp(Ity_V128);
+ assign(shrd, binop(opSHR[size], mkexpr(wide), mkU8(shift[size])));
+ /* Elements now compacted into lower 64 bits */
+ IRTemp new64 = newTemp(Ity_V128);
+ assign(new64, binop(opCAT[size], mkexpr(shrd), mkexpr(shrd)));
+ putLO64andZUorPutHI64(is2, dd, new64);
+ const HChar* arrNarrow = nameArr_Q_SZ(bitQ, size);
+ const HChar* arrWide = nameArr_Q_SZ(1, size+1);
+ const HChar* nm = isADD ? (isR ? "raddhn" : "addhn")
+ : (isR ? "rsubhn" : "subhn");
+ DIP("%s%s %s.%s, %s.%s, %s.%s\n", nm, is2 ? "2" : "",
+ nameQReg128(dd), arrNarrow,
+ nameQReg128(nn), arrWide, nameQReg128(mm), arrWide);
+ return True;
+ }
+
return False;
# undef INSN
}
@@ -6858,6 +6983,20 @@
return True;
}
+ if (bitU == 0 && opcode == BITS5(0,1,0,1,1)) {
+ /* -------- 0,xx,01011: ABS std7_std7 -------- */
+ if (bitQ == 0 && size == X11) return False; // implied 1d case
+ const IROp opABS[4]
+ = { Iop_Abs8x16, Iop_Abs16x8, Iop_Abs32x4, Iop_Abs64x2 };
+ IRTemp res = newTemp(Ity_V128);
+ assign(res, unop(opABS[size], getQReg128(nn)));
+ putQReg128(dd, bitQ == 0 ? unop(Iop_ZeroHI64ofV128, mkexpr(res))
+ : mkexpr(res));
+ const HChar* arr = nameArr_Q_SZ(bitQ, size);
+ DIP("abs %s.%s, %s.%s\n", nameQReg128(dd), arr, nameQReg128(nn), arr);
+ return True;
+ }
+
if (bitU == 1 && opcode == BITS5(0,1,0,1,1)) {
/* -------- 1,xx,01011: NEG std7_std7 -------- */
if (bitQ == 0 && size == X11) return False; // implied 1d case
Modified: trunk/priv/host_arm64_defs.c
==============================================================================
--- trunk/priv/host_arm64_defs.c (original)
+++ trunk/priv/host_arm64_defs.c Sun Jun 15 19:36:29 2014
@@ -929,6 +929,10 @@
case ARM64vecu_FNEG32x4: *nm = "fneg "; *ar = "4s"; return;
case ARM64vecu_FABS64x2: *nm = "fabs "; *ar = "2d"; return;
case ARM64vecu_FABS32x4: *nm = "fabs "; *ar = "4s"; return;
+ case ARM64vecu_ABS64x2: *nm = "abs"; *ar = "2d"; return;
+ case ARM64vecu_ABS32x4: *nm = "abs"; *ar = "4s"; return;
+ case ARM64vecu_ABS16x8: *nm = "abs"; *ar = "8h"; return;
+ case ARM64vecu_ABS8x16: *nm = "abs"; *ar = "16b"; return;
case ARM64vecu_NOT: *nm = "not "; *ar = "all"; return;
default: vpanic("showARM64VecUnaryOp");
}
@@ -3422,6 +3426,7 @@
#define X100101 BITS8(0,0, 1,0,0,1,0,1)
#define X100110 BITS8(0,0, 1,0,0,1,1,0)
#define X100111 BITS8(0,0, 1,0,0,1,1,1)
+#define X101110 BITS8(0,0, 1,0,1,1,1,0)
#define X110000 BITS8(0,0, 1,1,0,0,0,0)
#define X110001 BITS8(0,0, 1,1,0,0,0,1)
#define X110101 BITS8(0,0, 1,1,0,1,0,1)
@@ -5309,6 +5314,11 @@
011 01110 11 1 00000 111110 n d FNEG Vd.2d, Vn.2d
011 01110 10 1 00000 111110 n d FNEG Vd.4s, Vn.4s
011 01110 00 1 00000 010110 n d NOT Vd.16b, Vn.16b
+
+ 010 01110 11 1 00000 101110 n d ABS Vd.2d, Vn.2d
+ 010 01110 10 1 00000 101110 n d ABS Vd.4s, Vn.4s
+ 010 01110 01 1 00000 101110 n d ABS Vd.8h, Vn.8h
+ 010 01110 00 1 00000 101110 n d ABS Vd.16b, Vn.16b
*/
UInt vD = qregNo(i->ARM64in.VUnaryV.dst);
UInt vN = qregNo(i->ARM64in.VUnaryV.arg);
@@ -5328,6 +5338,18 @@
case ARM64vecu_NOT:
*p++ = X_3_8_5_6_5_5(X011, X01110001, X00000, X010110, vN, vD);
break;
+ case ARM64vecu_ABS64x2:
+ *p++ = X_3_8_5_6_5_5(X010, X01110111, X00000, X101110, vN, vD);
+ break;
+ case ARM64vecu_ABS32x4:
+ *p++ = X_3_8_5_6_5_5(X010, X01110101, X00000, X101110, vN, vD);
+ break;
+ case ARM64vecu_ABS16x8:
+ *p++ = X_3_8_5_6_5_5(X010, X01110011, X00000, X101110, vN, vD);
+ break;
+ case ARM64vecu_ABS8x16:
+ *p++ = X_3_8_5_6_5_5(X010, X01110001, X00000, X101110, vN, vD);
+ break;
default:
goto bad;
}
Modified: trunk/priv/host_arm64_defs.h
==============================================================================
--- trunk/priv/host_arm64_defs.h (original)
+++ trunk/priv/host_arm64_defs.h Sun Jun 15 19:36:29 2014
@@ -307,102 +307,67 @@
typedef
enum {
- ARM64vecb_ADD64x2=120,
- ARM64vecb_ADD32x4,
- ARM64vecb_ADD16x8,
- ARM64vecb_ADD8x16,
- ARM64vecb_SUB64x2,
- ARM64vecb_SUB32x4,
- ARM64vecb_SUB16x8,
- ARM64vecb_SUB8x16,
- ARM64vecb_MUL32x4,
- ARM64vecb_MUL16x8,
- ARM64vecb_MUL8x16,
- ARM64vecb_FADD64x2,
- ARM64vecb_FSUB64x2,
- ARM64vecb_FMUL64x2,
- ARM64vecb_FDIV64x2,
- ARM64vecb_FADD32x4,
- ARM64vecb_FSUB32x4,
- ARM64vecb_FMUL32x4,
- ARM64vecb_FDIV32x4,
- ARM64vecb_UMAX32x4,
- ARM64vecb_UMAX16x8,
- ARM64vecb_UMAX8x16,
- ARM64vecb_UMIN32x4,
- ARM64vecb_UMIN16x8,
- ARM64vecb_UMIN8x16,
- ARM64vecb_SMAX32x4,
- ARM64vecb_SMAX16x8,
- ARM64vecb_SMAX8x16,
- ARM64vecb_SMIN32x4,
- ARM64vecb_SMIN16x8,
- ARM64vecb_SMIN8x16,
+ ARM64vecb_ADD64x2=120, ARM64vecb_ADD32x4,
+ ARM64vecb_ADD16x8, ARM64vecb_ADD8x16,
+ ARM64vecb_SUB64x2, ARM64vecb_SUB32x4,
+ ARM64vecb_SUB16x8, ARM64vecb_SUB8x16,
+ ARM64vecb_MUL32x4,
+ ARM64vecb_MUL16x8, ARM64vecb_MUL8x16,
+ ARM64vecb_FADD64x2, ARM64vecb_FADD32x4,
+ ARM64vecb_FSUB64x2, ARM64vecb_FSUB32x4,
+ ARM64vecb_FMUL64x2, ARM64vecb_FMUL32x4,
+ ARM64vecb_FDIV64x2, ARM64vecb_FDIV32x4,
+ ARM64vecb_UMAX32x4,
+ ARM64vecb_UMAX16x8, ARM64vecb_UMAX8x16,
+ ARM64vecb_UMIN32x4,
+ ARM64vecb_UMIN16x8, ARM64vecb_UMIN8x16,
+ ARM64vecb_SMAX32x4,
+ ARM64vecb_SMAX16x8, ARM64vecb_SMAX8x16,
+ ARM64vecb_SMIN32x4,
+ ARM64vecb_SMIN16x8, ARM64vecb_SMIN8x16,
ARM64vecb_AND,
ARM64vecb_ORR,
ARM64vecb_XOR,
- ARM64vecb_CMEQ64x2,
- ARM64vecb_CMEQ32x4,
- ARM64vecb_CMEQ16x8,
- ARM64vecb_CMEQ8x16,
- ARM64vecb_CMHI64x2, /* >u */
- ARM64vecb_CMHI32x4,
- ARM64vecb_CMHI16x8,
- ARM64vecb_CMHI8x16,
- ARM64vecb_CMGT64x2, /* >s */
- ARM64vecb_CMGT32x4,
- ARM64vecb_CMGT16x8,
- ARM64vecb_CMGT8x16,
- ARM64vecb_FCMEQ64x2,
- ARM64vecb_FCMEQ32x4,
- ARM64vecb_FCMGE64x2,
- ARM64vecb_FCMGE32x4,
- ARM64vecb_FCMGT64x2,
- ARM64vecb_FCMGT32x4,
+ ARM64vecb_CMEQ64x2, ARM64vecb_CMEQ32x4,
+ ARM64vecb_CMEQ16x8, ARM64vecb_CMEQ8x16,
+ ARM64vecb_CMHI64x2, ARM64vecb_CMHI32x4, /* >u */
+ ARM64vecb_CMHI16x8, ARM64vecb_CMHI8x16,
+ ARM64vecb_CMGT64x2, ARM64vecb_CMGT32x4, /* >s */
+ ARM64vecb_CMGT16x8, ARM64vecb_CMGT8x16,
+ ARM64vecb_FCMEQ64x2, ARM64vecb_FCMEQ32x4,
+ ARM64vecb_FCMGE64x2, ARM64vecb_FCMGE32x4,
+ ARM64vecb_FCMGT64x2, ARM64vecb_FCMGT32x4,
ARM64vecb_TBL1,
- ARM64vecb_UZP164x2,
- ARM64vecb_UZP132x4,
- ARM64vecb_UZP116x8,
- ARM64vecb_UZP18x16,
- ARM64vecb_UZP264x2,
- ARM64vecb_UZP232x4,
- ARM64vecb_UZP216x8,
- ARM64vecb_UZP28x16,
- ARM64vecb_ZIP132x4,
- ARM64vecb_ZIP116x8,
- ARM64vecb_ZIP18x16,
- ARM64vecb_ZIP232x4,
- ARM64vecb_ZIP216x8,
- ARM64vecb_ZIP28x16,
+ ARM64vecb_UZP164x2, ARM64vecb_UZP132x4,
+ ARM64vecb_UZP116x8, ARM64vecb_UZP18x16,
+ ARM64vecb_UZP264x2, ARM64vecb_UZP232x4,
+ ARM64vecb_UZP216x8, ARM64vecb_UZP28x16,
+ ARM64vecb_ZIP132x4, ARM64vecb_ZIP116x8,
+ ARM64vecb_ZIP18x16, ARM64vecb_ZIP232x4,
+ ARM64vecb_ZIP216x8, ARM64vecb_ZIP28x16,
ARM64vecb_INVALID
}
ARM64VecBinOp;
typedef
enum {
- ARM64vecu_FNEG64x2=300,
- ARM64vecu_FNEG32x4,
- ARM64vecu_FABS64x2,
- ARM64vecu_FABS32x4,
+ ARM64vecu_FNEG64x2=300, ARM64vecu_FNEG32x4,
+ ARM64vecu_FABS64x2, ARM64vecu_FABS32x4,
ARM64vecu_NOT,
+ ARM64vecu_ABS64x2, ARM64vecu_ABS32x4,
+ ARM64vecu_ABS16x8, ARM64vecu_ABS8x16,
ARM64vecu_INVALID
}
ARM64VecUnaryOp;
typedef
enum {
- ARM64vecsh_USHR64x2=350,
- ARM64vecsh_USHR32x4,
- ARM64vecsh_USHR16x8,
- ARM64vecsh_USHR8x16,
- ARM64vecsh_SSHR64x2,
- ARM64vecsh_SSHR32x4,
- ARM64vecsh_SSHR16x8,
- ARM64vecsh_SSHR8x16,
- ARM64vecsh_SHL64x2,
- ARM64vecsh_SHL32x4,
- ARM64vecsh_SHL16x8,
- ARM64vecsh_SHL8x16,
+ ARM64vecsh_USHR64x2=350, ARM64vecsh_USHR32x4,
+ ARM64vecsh_USHR16x8, ARM64vecsh_USHR8x16,
+ ARM64vecsh_SSHR64x2, ARM64vecsh_SSHR32x4,
+ ARM64vecsh_SSHR16x8, ARM64vecsh_SSHR8x16,
+ ARM64vecsh_SHL64x2, ARM64vecsh_SHL32x4,
+ ARM64vecsh_SHL16x8, ARM64vecsh_SHL8x16,
ARM64vecsh_INVALID
}
ARM64VecShiftOp;
Modified: trunk/priv/host_arm64_isel.c
==============================================================================
--- trunk/priv/host_arm64_isel.c (original)
+++ trunk/priv/host_arm64_isel.c Sun Jun 15 19:36:29 2014
@@ -4413,7 +4413,12 @@
case Iop_Abs64Fx2:
case Iop_Abs32Fx4:
case Iop_Neg64Fx2:
- case Iop_Neg32Fx4: {
+ case Iop_Neg32Fx4:
+ case Iop_Abs64x2:
+ case Iop_Abs32x4:
+ case Iop_Abs16x8:
+ case Iop_Abs8x16:
+ {
HReg res = newVRegV(env);
HReg arg = iselV128Expr(env, e->Iex.Unop.arg);
ARM64VecUnaryOp op = ARM64vecu_INVALID;
@@ -4423,6 +4428,10 @@
case Iop_Abs32Fx4: op = ARM64vecu_FABS32x4; break;
case Iop_Neg64Fx2: op = ARM64vecu_FNEG64x2; break;
case Iop_Neg32Fx4: op = ARM64vecu_FNEG32x4; break;
+ case Iop_Abs64x2: op = ARM64vecu_ABS64x2; break;
+ case Iop_Abs32x4: op = ARM64vecu_ABS32x4; break;
+ case Iop_Abs16x8: op = ARM64vecu_ABS16x8; break;
+ case Iop_Abs8x16: op = ARM64vecu_ABS8x16; break;
default: vassert(0);
}
addInstr(env, ARM64Instr_VUnaryV(op, res, arg));
Modified: trunk/priv/ir_defs.c
==============================================================================
--- trunk/priv/ir_defs.c (original)
+++ trunk/priv/ir_defs.c Sun Jun 15 19:36:29 2014
@@ -726,6 +726,7 @@
case Iop_Abs8x16: vex_printf("Abs8x16"); return;
case Iop_Abs16x8: vex_printf("Abs16x8"); return;
case Iop_Abs32x4: vex_printf("Abs32x4"); return;
+ case Iop_Abs64x2: vex_printf("Abs64x2"); return;
case Iop_Add8x16: vex_printf("Add8x16"); return;
case Iop_Add16x8: vex_printf("Add16x8"); return;
@@ -2910,7 +2911,7 @@
case Iop_Reverse32_8x16: case Iop_Reverse32_16x8:
case Iop_Reverse16_8x16:
case Iop_Neg64Fx2: case Iop_Neg32Fx4:
- case Iop_Abs8x16: case Iop_Abs16x8: case Iop_Abs32x4:
+ case Iop_Abs8x16: case Iop_Abs16x8: case Iop_Abs32x4: case Iop_Abs64x2:
case Iop_CipherSV128:
case Iop_PwBitMtxXpose64x2:
case Iop_ZeroHI64ofV128: case Iop_ZeroHI96ofV128:
Modified: trunk/pub/libvex_ir.h
==============================================================================
--- trunk/pub/libvex_ir.h (original)
+++ trunk/pub/libvex_ir.h Sun Jun 15 19:36:29 2014
@@ -1483,7 +1483,7 @@
Iop_PwBitMtxXpose64x2,
/* ABSOLUTE VALUE */
- Iop_Abs8x16, Iop_Abs16x8, Iop_Abs32x4,
+ Iop_Abs8x16, Iop_Abs16x8, Iop_Abs32x4, Iop_Abs64x2,
/* AVERAGING: note: (arg1 + arg2 + 1) >>u 1 */
Iop_Avg8Ux16, Iop_Avg16Ux8, Iop_Avg32Ux4,
|
|
From: <sv...@va...> - 2014-06-15 19:16:56
|
Author: philippe
Date: Sun Jun 15 19:16:46 2014
New Revision: 14040
Log:
When only reading inline info, no need to parse debug_types sections
Modified:
trunk/coregrind/m_debuginfo/readdwarf3.c
Modified: trunk/coregrind/m_debuginfo/readdwarf3.c
==============================================================================
--- trunk/coregrind/m_debuginfo/readdwarf3.c (original)
+++ trunk/coregrind/m_debuginfo/readdwarf3.c Sun Jun 15 19:16:46 2014
@@ -4179,6 +4179,8 @@
} else {
if (!ML_(sli_is_valid)(escn_debug_types))
continue;
+ if (!VG_(clo_read_var_info))
+ continue; // Types not needed when only reading inline info.
init_Cursor( &info, escn_debug_types, 0, barf,
"Overrun whilst reading .debug_types section" );
section_size = escn_debug_types.szB;
|
|
From: <sv...@va...> - 2014-06-15 18:28:39
|
Author: philippe
Date: Sun Jun 15 18:28:31 2014
New Revision: 14039
Log:
Fix some obsolete comments, now that we have an ht of parsed abbvs
Modified:
trunk/coregrind/m_debuginfo/readdwarf3.c
Modified: trunk/coregrind/m_debuginfo/readdwarf3.c
==============================================================================
--- trunk/coregrind/m_debuginfo/readdwarf3.c (original)
+++ trunk/coregrind/m_debuginfo/readdwarf3.c Sun Jun 15 18:28:31 2014
@@ -3733,10 +3733,9 @@
/* We're set up to look at the fields of this DIE. Hand it off to
any parser(s) that want to see it. Since they will in general
- advance both the DIE and abbrev cursors, remember their current
- settings so that we can then back up and do one final pass over
- the DIE, to print out its contents. */
-
+ advance the DIE cursor, remember the current settings so that we
+ can then back up and do one final pass over the DIE, to print out
+ its contents. */
start_die_c_offset = get_position_of_Cursor( c );
nf_i = 0;
@@ -4239,8 +4238,7 @@
cu_start_offset = get_position_of_Cursor( &info );
TRACE_D3("\n");
TRACE_D3(" Compilation Unit @ offset 0x%llx:\n", cu_start_offset);
- /* parse_CU_header initialises the CU's set_abbv_Cursor cache
- (saC_cache) */
+ /* parse_CU_header initialises the CU's hashtable of abbvs ht_abbvs */
if (pass == 0) {
parse_CU_Header( &cc, td3, &info, escn_debug_abbv_alt,
False, True );
|
|
From: <sv...@va...> - 2014-06-15 18:06:31
|
Author: philippe
Date: Sun Jun 15 18:06:20 2014
New Revision: 14038
Log:
separate the tracing code in other function, call the tracing code only
if trace active.
This makes the code somewhat easier to read and somewhat more efficient
Modified:
trunk/coregrind/m_debuginfo/readdwarf3.c
Modified: trunk/coregrind/m_debuginfo/readdwarf3.c
==============================================================================
--- trunk/coregrind/m_debuginfo/readdwarf3.c (original)
+++ trunk/coregrind/m_debuginfo/readdwarf3.c Sun Jun 15 18:06:20 2014
@@ -3835,41 +3835,10 @@
}
-
-static
-void new_dwarf3_reader_wrk (
- struct _DebugInfo* di,
- __attribute__((noreturn)) void (*barf)( const HChar* ),
- DiSlice escn_debug_info, DiSlice escn_debug_types,
- DiSlice escn_debug_abbv, DiSlice escn_debug_line,
- DiSlice escn_debug_str, DiSlice escn_debug_ranges,
- DiSlice escn_debug_loc, DiSlice escn_debug_info_alt,
- DiSlice escn_debug_abbv_alt, DiSlice escn_debug_line_alt,
- DiSlice escn_debug_str_alt
-)
+static void trace_debug_loc (struct _DebugInfo* di,
+ __attribute__((noreturn)) void (*barf)( const HChar* ),
+ DiSlice escn_debug_loc)
{
- XArray* /* of TyEnt */ tyents = NULL;
- XArray* /* of TyEnt */ tyents_to_keep = NULL;
- XArray* /* of GExpr* */ gexprs = NULL;
- XArray* /* of TempVar* */ tempvars = NULL;
- WordFM* /* of (XArray* of AddrRange, void) */ rangestree = NULL;
- TyEntIndexCache* tyents_cache = NULL;
- TyEntIndexCache* tyents_to_keep_cache = NULL;
- TempVar *varp, *varp2;
- GExpr* gexpr;
- Cursor abbv; /* for showing .debug_abbrev */
- Cursor info; /* primary cursor for parsing .debug_info */
- Cursor ranges; /* for showing .debug_ranges */
- D3TypeParser typarser;
- D3VarParser varparser;
- D3InlParser inlparser;
- Addr dr_base;
- UWord dr_offset;
- Word i, j, n;
- Bool td3 = di->trace_symtab;
- XArray* /* of TempVar* */ dioff_lookup_tab;
- Int pass;
- VgHashTable signature_types = NULL;
#if 0
/* This doesn't work properly because it assumes all entries are
packed end to end, with no holes. But that doesn't always
@@ -3879,55 +3848,68 @@
Addr dl_base;
UWord dl_offset;
Cursor loc; /* for showing .debug_loc */
+ Bool td3 = di->trace_symtab;
+
TRACE_SYMTAB("\n");
TRACE_SYMTAB("\n------ The contents of .debug_loc ------\n");
TRACE_SYMTAB(" Offset Begin End Expression\n");
- init_Cursor( &loc, debug_loc_img,
- debug_loc_sz, 0, barf,
- "Overrun whilst reading .debug_loc section(1)" );
- dl_base = 0;
- dl_offset = 0;
- while (True) {
- UWord w1, w2;
- UWord len;
- if (is_at_end_Cursor( &loc ))
- break;
+ if (ML_(sli_is_valid)(escn_debug_loc)) {
+ init_Cursor( &loc, escn_debug_loc, 0, barf,
+ "Overrun whilst reading .debug_loc section(1)" );
+ dl_base = 0;
+ dl_offset = 0;
+ while (True) {
+ UWord w1, w2;
+ UWord len;
+ if (is_at_end_Cursor( &loc ))
+ break;
+
+ /* Read a (host-)word pair. This is something of a hack since
+ the word size to read is really dictated by the ELF file;
+ however, we assume we're reading a file with the same
+ word-sizeness as the host. Reasonably enough. */
+ w1 = get_UWord( &loc );
+ w2 = get_UWord( &loc );
+
+ if (w1 == 0 && w2 == 0) {
+ /* end of list. reset 'base' */
+ TRACE_D3(" %08lx <End of list>\n", dl_offset);
+ dl_base = 0;
+ dl_offset = get_position_of_Cursor( &loc );
+ continue;
+ }
+
+ if (w1 == -1UL) {
+ /* new value for 'base' */
+ TRACE_D3(" %08lx %16lx %08lx (base address)\n",
+ dl_offset, w1, w2);
+ dl_base = w2;
+ continue;
+ }
- /* Read a (host-)word pair. This is something of a hack since
- the word size to read is really dictated by the ELF file;
- however, we assume we're reading a file with the same
- word-sizeness as the host. Reasonably enough. */
- w1 = get_UWord( &loc );
- w2 = get_UWord( &loc );
-
- if (w1 == 0 && w2 == 0) {
- /* end of list. reset 'base' */
- TRACE_D3(" %08lx <End of list>\n", dl_offset);
- dl_base = 0;
- dl_offset = get_position_of_Cursor( &loc );
- continue;
- }
-
- if (w1 == -1UL) {
- /* new value for 'base' */
- TRACE_D3(" %08lx %16lx %08lx (base address)\n",
- dl_offset, w1, w2);
- dl_base = w2;
- continue;
- }
-
- /* else a location expression follows */
- TRACE_D3(" %08lx %08lx %08lx ",
- dl_offset, w1 + dl_base, w2 + dl_base);
- len = (UWord)get_UShort( &loc );
- while (len > 0) {
- UChar byte = get_UChar( &loc );
- TRACE_D3("%02x", (UInt)byte);
- len--;
+ /* else a location expression follows */
+ TRACE_D3(" %08lx %08lx %08lx ",
+ dl_offset, w1 + dl_base, w2 + dl_base);
+ len = (UWord)get_UShort( &loc );
+ while (len > 0) {
+ UChar byte = get_UChar( &loc );
+ TRACE_D3("%02x", (UInt)byte);
+ len--;
+ }
+ TRACE_SYMTAB("\n");
}
- TRACE_SYMTAB("\n");
}
#endif
+}
+
+static void trace_debug_ranges (struct _DebugInfo* di,
+ __attribute__((noreturn)) void (*barf)( const HChar* ),
+ DiSlice escn_debug_ranges)
+{
+ Cursor ranges; /* for showing .debug_ranges */
+ Addr dr_base;
+ UWord dr_offset;
+ Bool td3 = di->trace_symtab;
/* Display .debug_ranges */
TRACE_SYMTAB("\n");
@@ -3972,6 +3954,14 @@
dr_offset, w1 + dr_base, w2 + dr_base);
}
}
+}
+
+static void trace_debug_abbrev (struct _DebugInfo* di,
+ __attribute__((noreturn)) void (*barf)( const HChar* ),
+ DiSlice escn_debug_abbv)
+{
+ Cursor abbv; /* for showing .debug_abbrev */
+ Bool td3 = di->trace_symtab;
/* Display .debug_abbrev */
TRACE_SYMTAB("\n");
@@ -4004,7 +3994,47 @@
}
}
}
- TRACE_SYMTAB("\n");
+}
+
+static
+void new_dwarf3_reader_wrk (
+ struct _DebugInfo* di,
+ __attribute__((noreturn)) void (*barf)( const HChar* ),
+ DiSlice escn_debug_info, DiSlice escn_debug_types,
+ DiSlice escn_debug_abbv, DiSlice escn_debug_line,
+ DiSlice escn_debug_str, DiSlice escn_debug_ranges,
+ DiSlice escn_debug_loc, DiSlice escn_debug_info_alt,
+ DiSlice escn_debug_abbv_alt, DiSlice escn_debug_line_alt,
+ DiSlice escn_debug_str_alt
+)
+{
+ XArray* /* of TyEnt */ tyents = NULL;
+ XArray* /* of TyEnt */ tyents_to_keep = NULL;
+ XArray* /* of GExpr* */ gexprs = NULL;
+ XArray* /* of TempVar* */ tempvars = NULL;
+ WordFM* /* of (XArray* of AddrRange, void) */ rangestree = NULL;
+ TyEntIndexCache* tyents_cache = NULL;
+ TyEntIndexCache* tyents_to_keep_cache = NULL;
+ TempVar *varp, *varp2;
+ GExpr* gexpr;
+ Cursor info; /* primary cursor for parsing .debug_info */
+ D3TypeParser typarser;
+ D3VarParser varparser;
+ D3InlParser inlparser;
+ Word i, j, n;
+ Bool td3 = di->trace_symtab;
+ XArray* /* of TempVar* */ dioff_lookup_tab;
+ Int pass;
+ VgHashTable signature_types = NULL;
+
+ /* Display/trace various information, if requested. */
+ if (td3) {
+ trace_debug_loc (di, barf, escn_debug_loc);
+ trace_debug_ranges (di, barf, escn_debug_ranges);
+ trace_debug_abbrev (di, barf, escn_debug_abbv);
+ TRACE_SYMTAB("\n");
+ }
+
if (VG_(clo_read_var_info)) {
/* We'll park the harvested type information in here. Also create
|
|
From: <sv...@va...> - 2014-06-15 15:55:06
|
Author: philippe
Date: Sun Jun 15 15:54:58 2014
New Revision: 14037
Log:
Announce in NEWS the support for inlined function calls in stacktraces/suppressions
Modified:
trunk/NEWS
Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS (original)
+++ trunk/NEWS Sun Jun 15 15:54:58 2014
@@ -24,6 +24,12 @@
* ==================== OTHER CHANGES ====================
+* Better stacktraces and suppression matching for inlined function calls.
+ The new option --read-inline-info=yes|no allows to control the reading
+ of the dwarf debug information describing inlined function calls.
+ When this debug info is read, stacktraces will properly show inlined
+ function calls.
+
* Address description logic has been improved and is now common
between memcheck and helgrind, resulting in better address
descriptions for some error messages.
@@ -72,6 +78,7 @@
175819 Support for ipv6 socket reporting with --track-fds
232510 make distcheck fails
+278972 valgrind stacktraces and suppression do not handle inlined function call debuginfo
308729 vex x86->IR: unhandled instruction bytes 0xf 0x5 (syscall)
325110 Add test-cases for Power ISA 2.06 insns: divdo/divdo. and divduo/divduo.
325124 [MIPSEL] Compilation error
|
|
From: <sv...@va...> - 2014-06-15 15:42:34
|
Author: philippe
Date: Sun Jun 15 15:42:20 2014
New Revision: 14036
Log:
This patch implements the support needed for stacktraces
showing inlined function calls.
See 278972 valgrind stacktraces and suppression do not handle inlined function call debuginfo
Reading the inlined dwarf call info is activated using the new clo
--read-inline-info=yes
Default is currently no but an objective is to optimise the performance
and memory in order to possibly set it on by default.
(see below discussion about performances).
Basically, the patch provides the following pieces:
1. Implement a new dwarf3 reader that reads the inlined call info
2. Some performance improvements done for this new parser, and
on some common code between the new parser and the var info parser.
3. Use the parsed inlined info to produce stacktrace showing inlined calls
4. Use the parsed inlined info in the suppression matching and suppression generation
5. and of course, some reg tests
1. new dwarf3 reader:
---------------------
Two options were possible: add the reading of the inlined info
in the current var info dwarf reader, or add a 2nd reader.
The 2nd approach was preferred, for the following reasons:
The var info reader is slow, memory hungry and quite complex.
Having a separate parsing phase for the inlined information
is simpler/faster when just reading the inlined info.
Possibly, a single parser would be faster when using both
--read-var-info=yes and --read-inline-info=yes.
However, var-info being extremely memory/cpu hungry, it is unlikely
to be used often, and having a separate parsing for inlined info
does in any case make not much difference.
(--read-var-info=yes is also now less interesting thanks to commit
r13991, which provides a fast and low memory "reasonable" location
for an address).
The inlined info parser reads the dwarf info to make calls
to priv_storage.h ML_(addInlInfo).
2. performance optimisations
----------------------------
* the abbrev cache has been improved in revision r14035.
* The new parser skips the non interesting DIEs
(the var-info parser has no logic to skip uninteresting DIEs).
* Some other minor perf optimisation here and there.
In total now, on a big executable, 15 seconds CPU are needed to
create the inlined info (on my slow x86 pentium).
With regards to memory, the dinfo arena:
with inlined info: 172281856/121085952 max/curr mmap'd
without : 157892608/106721280 max/curr mmap'd,
So, basically, inlined information costs about 15Mb of memory for
my big executable (compared to first version of the patch, this is
already using less memory, thanks to the strpool deduppoolalloc.
The needed memory can probably be decreased somewhat more.
3. produce better stack traces
------------------------------
VG_(describe_IP) has a new argument InlIPCursor *iipc which allows
to describe inlined function calls by doing repetitive calls
to describe_IP. See pub_tool_debuginfo.h for a description.
4. suppression generation and matching
--------------------------------------
* suppression generation now also uses an InlIPCursor *iipc
to generate a line for each inlined fn call.
* suppression matching: to allow suppression matching to
match one IP to several function calls in a suppression entry,
the 'inputCompleter' object (that allows to lazily generate
function or object names for a stacktrace when matching
an error with a suppression) has been generalised a little bit
more to also lazily generate the input sequence.
VG_(generic_match) has been updated so as to be more generic
with respect to the input completer : when providing an
input completer, VG_(generic_match) does not need anymore
to produce/compute any input itself : this is all delegated
to the input completer.
5. various regtests
-------------------
to test stack traces with inlined calls, and suppressions
of (some of) these errors using inlined fn calls matching.
Work still to do:
-----------------
* improve parsing performance
* improve the memory overhead.
* handling the directory name for files of the inlined function calls is not yet done.
(probably implies to refactor some code)
* see if m_errormgr.c *offsets arrays cannot be managed via xarray
Added:
trunk/memcheck/tests/inlinfo.c
trunk/memcheck/tests/inlinfo.stderr.exp
trunk/memcheck/tests/inlinfo.stdout.exp
trunk/memcheck/tests/inlinfo.vgtest
trunk/memcheck/tests/inlinfosupp.stderr.exp
trunk/memcheck/tests/inlinfosupp.stdout.exp
trunk/memcheck/tests/inlinfosupp.supp
trunk/memcheck/tests/inlinfosupp.vgtest
trunk/memcheck/tests/inlinfosuppobj.stderr.exp
trunk/memcheck/tests/inlinfosuppobj.stdout.exp
trunk/memcheck/tests/inlinfosuppobj.supp
trunk/memcheck/tests/inlinfosuppobj.vgtest
Modified:
trunk/coregrind/m_debuginfo/debuginfo.c
trunk/coregrind/m_debuginfo/priv_storage.h
trunk/coregrind/m_debuginfo/readdwarf3.c
trunk/coregrind/m_debuginfo/readelf.c
trunk/coregrind/m_debuginfo/readmacho.c
trunk/coregrind/m_debuginfo/storage.c
trunk/coregrind/m_errormgr.c
trunk/coregrind/m_gdbserver/m_gdbserver.c
trunk/coregrind/m_gdbserver/target.c
trunk/coregrind/m_main.c
trunk/coregrind/m_options.c
trunk/coregrind/m_seqmatch.c
trunk/coregrind/m_stacktrace.c
trunk/coregrind/pub_core_debuginfo.h
trunk/coregrind/pub_core_options.h
trunk/docs/xml/manual-core.xml
trunk/include/pub_tool_debuginfo.h
trunk/include/pub_tool_seqmatch.h
trunk/massif/ms_main.c
trunk/memcheck/tests/Makefile.am
trunk/none/tests/cmdline1.stdout.exp
trunk/none/tests/cmdline2.stdout.exp
Modified: trunk/coregrind/m_debuginfo/debuginfo.c
==============================================================================
--- trunk/coregrind/m_debuginfo/debuginfo.c (original)
+++ trunk/coregrind/m_debuginfo/debuginfo.c Sun Jun 15 15:42:20 2014
@@ -212,6 +212,7 @@
if (di->fsm.filename) ML_(dinfo_free)(di->fsm.filename);
if (di->soname) ML_(dinfo_free)(di->soname);
if (di->loctab) ML_(dinfo_free)(di->loctab);
+ if (di->inltab) ML_(dinfo_free)(di->inltab);
if (di->cfsi) ML_(dinfo_free)(di->cfsi);
if (di->cfsi_exprs) VG_(deleteXA)(di->cfsi_exprs);
if (di->fpo) ML_(dinfo_free)(di->fpo);
@@ -1258,8 +1259,10 @@
if (VG_(clo_verbosity) > 0) {
VG_(message)(Vg_UserMsg, "LOAD_PDB_DEBUGINFO: done: "
- "%lu syms, %lu src locs, %lu fpo recs\n",
- di->symtab_used, di->loctab_used, di->fpo_size);
+ "%lu syms, %lu src locs, "
+ "%lu src locs, %lu fpo recs\n",
+ di->symtab_used, di->loctab_used,
+ di->inltab_used, di->fpo_size);
}
}
@@ -1313,6 +1316,167 @@
return NULL;
}
+/*------------------------------------------------------------*/
+/*--- Types and functions for inlined IP cursor ---*/
+/*------------------------------------------------------------*/
+struct _InlIPCursor {
+ Addr eip; // Cursor used to describe calls at eip.
+ DebugInfo* di; // DebugInfo describing inlined calls at eip
+
+ Word inltab_lopos; // The inlined fn calls covering eip are in
+ Word inltab_hipos; // di->inltab[inltab_lopos..inltab_hipos].
+ // Note that not all inlined fn calls in this range
+ // are necessarily covering eip.
+
+ Int curlevel; // Current level to describe.
+ // 0 means to describe eip itself.
+ Word cur_inltab; // inltab pos for call inlined at current level.
+ Word next_inltab; // inltab pos for call inlined at next (towards main)
+ // level.
+};
+
+static Bool is_top(InlIPCursor *iipc)
+{
+ return !iipc || iipc->cur_inltab == -1;
+}
+
+static Bool is_bottom(InlIPCursor *iipc)
+{
+ return !iipc || iipc->next_inltab == -1;
+}
+
+Bool VG_(next_IIPC)(InlIPCursor *iipc)
+{
+ Word i;
+ DiInlLoc *hinl = NULL;
+ Word hinl_pos = -1;
+ DebugInfo *di;
+
+ if (iipc == NULL)
+ return False;
+
+ if (iipc->curlevel <= 0) {
+ iipc->curlevel--;
+ return False;
+ }
+
+ di = iipc->di;
+ for (i = iipc->inltab_lopos; i <= iipc->inltab_hipos; i++) {
+ if (di->inltab[i].addr_lo <= iipc->eip
+ && iipc->eip < di->inltab[i].addr_hi
+ && di->inltab[i].level < iipc->curlevel
+ && (!hinl || hinl->level < di->inltab[i].level)) {
+ hinl = &di->inltab[i];
+ hinl_pos = i;
+ }
+ }
+
+ iipc->cur_inltab = iipc->next_inltab;
+ iipc->next_inltab = hinl_pos;
+ if (iipc->next_inltab < 0)
+ iipc->curlevel = 0; // no inlined call anymore, describe eip itself
+ else
+ iipc->curlevel = di->inltab[iipc->next_inltab].level;
+
+ return True;
+}
+
+/* Forward */
+static void search_all_loctabs ( Addr ptr, /*OUT*/DebugInfo** pdi,
+ /*OUT*/Word* locno );
+
+/* Returns the position after which eip would be inserted in inltab.
+ (-1 if eip should be inserted before position 0).
+ This is the highest position with an addr_lo <= eip.
+ As inltab is sorted on addr_lo, dichotomic search can be done
+ (note that inltab might have duplicates addr_lo). */
+static Word inltab_insert_pos (DebugInfo *di, Addr eip)
+{
+ Word mid,
+ lo = 0,
+ hi = di->inltab_used-1;
+ while (lo <= hi) {
+ mid = (lo + hi) / 2;
+ if (eip < di->inltab[mid].addr_lo) { hi = mid-1; continue; }
+ if (eip > di->inltab[mid].addr_lo) { lo = mid+1; continue; }
+ lo = mid; break;
+ }
+
+ while (lo <= di->inltab_used-1 && di->inltab[lo].addr_lo <= eip)
+ lo++;
+#if 0
+ for (mid = 0; mid <= di->inltab_used-1; mid++)
+ if (eip < di->inltab[mid].addr_lo)
+ break;
+ vg_assert (lo - 1 == mid - 1);
+#endif
+ return lo - 1;
+}
+
+InlIPCursor* VG_(new_IIPC)(Addr eip)
+{
+ DebugInfo* di;
+ Word locno;
+ Word i;
+ InlIPCursor *ret;
+ Bool avail;
+
+ if (!VG_(clo_read_inline_info))
+ return NULL; // No way we can find inlined calls.
+
+ /* Search the DebugInfo for eip */
+ search_all_loctabs ( eip, &di, &locno );
+ if (di == NULL || di->inltab_used == 0)
+ return NULL; // No di (with inltab) containing eip.
+
+ /* Search the entry in di->inltab with the highest addr_lo that
+ contains eip. */
+ /* We start from the highest pos in inltab after which eip would
+ be inserted. */
+ for (i = inltab_insert_pos (di, eip); i >= 0; i--) {
+ if (di->inltab[i].addr_lo <= eip && eip < di->inltab[i].addr_hi) {
+ break;
+ }
+ /* Stop the backward scan when reaching an addr_lo which
+ cannot anymore contain eip : we know that all ranges before
+ i also cannot contain eip. */
+ if (di->inltab[i].addr_lo < eip - di->maxinl_codesz)
+ return NULL;
+ }
+
+ if (i < 0)
+ return NULL; // No entry containing eip.
+
+ /* We have found the highest entry containing eip.
+ Build a cursor. */
+ ret = ML_(dinfo_zalloc) ("dinfo.new_IIPC", sizeof(*ret));
+ ret->eip = eip;
+ ret->di = di;
+ ret->inltab_hipos = i;
+ for (i = ret->inltab_hipos - 1; i >= 0; i--) {
+
+ if (di->inltab[i].addr_lo < eip - di->maxinl_codesz)
+ break; /* Similar stop backward scan logic as above. */
+ }
+ ret->inltab_lopos = i + 1;
+ ret->curlevel = MAX_LEVEL;
+ ret->cur_inltab = -1;
+ ret->next_inltab = -1;
+
+ /* MAX_LEVEL is higher than any stored level. We can use
+ VG_(next_IIPC) to get to the 'real' first highest call level. */
+ avail = VG_(next_IIPC) (ret);
+ vg_assert (avail);
+
+ return ret;
+}
+
+void VG_(delete_IIPC)(InlIPCursor *iipc)
+{
+ if (iipc)
+ ML_(dinfo_free)( iipc );
+}
+
/*------------------------------------------------------------*/
/*--- Use of symbol table & location info to create ---*/
@@ -1544,15 +1708,27 @@
/* This is only available to core... don't demangle C++ names, but do
do Z-demangling and below-main-renaming, match anywhere in function, and
don't show offsets. */
-Bool VG_(get_fnname_no_cxx_demangle) ( Addr a, HChar* buf, Int nbuf )
+Bool VG_(get_fnname_no_cxx_demangle) ( Addr a, HChar* buf, Int nbuf,
+ InlIPCursor* iipc )
{
- return get_sym_name ( /*C++-demangle*/False, /*Z-demangle*/True,
- /*below-main-renaming*/True,
- a, buf, nbuf,
- /*match_anywhere_in_fun*/True,
- /*show offset?*/False,
- /*text syms only*/True,
- /*offsetP*/NULL );
+ if (is_bottom(iipc)) {
+ // At the bottom (towards main), we describe the fn at eip.
+ return get_sym_name ( /*C++-demangle*/False, /*Z-demangle*/True,
+ /*below-main-renaming*/True,
+ a, buf, nbuf,
+ /*match_anywhere_in_fun*/True,
+ /*show offset?*/False,
+ /*text syms only*/True,
+ /*offsetP*/NULL );
+ } else {
+ const DiInlLoc *next_inl = iipc && iipc->next_inltab >= 0
+ ? & iipc->di->inltab[iipc->next_inltab]
+ : NULL;
+ vg_assert (next_inl);
+ // The function we are in is called by next_inl.
+ VG_(snprintf)(buf, nbuf, "%s", next_inl->inlinedfn);
+ return True;
+ }
}
/* mips-linux only: find the offset of current address. This is needed for
@@ -1873,7 +2049,7 @@
return n;
}
-HChar* VG_(describe_IP)(Addr eip, HChar* buf, Int n_buf)
+HChar* VG_(describe_IP)(Addr eip, HChar* buf, Int n_buf, InlIPCursor *iipc)
{
# define APPEND(_str) \
n = putStr(n, n_buf, buf, _str)
@@ -1885,6 +2061,8 @@
HChar ibuf[50];
Int n = 0;
+ vg_assert (!iipc || iipc->eip == eip);
+
static HChar buf_fn[BUF_LEN];
static HChar buf_obj[BUF_LEN];
static HChar buf_srcloc[BUF_LEN];
@@ -1892,16 +2070,57 @@
buf_fn[0] = buf_obj[0] = buf_srcloc[0] = buf_dirname[0] = 0;
Bool know_dirinfo = False;
- Bool know_fnname = VG_(clo_sym_offsets)
- ? VG_(get_fnname_w_offset) (eip, buf_fn, BUF_LEN)
- : VG_(get_fnname) (eip, buf_fn, BUF_LEN);
- Bool know_objname = VG_(get_objname)(eip, buf_obj, BUF_LEN);
- Bool know_srcloc = VG_(get_filename_linenum)(
- eip,
- buf_srcloc, BUF_LEN,
- buf_dirname, BUF_LEN, &know_dirinfo,
- &lineno
- );
+ Bool know_fnname;
+ Bool know_objname;
+ Bool know_srcloc;
+
+ if (is_bottom(iipc)) {
+ // At the bottom (towards main), we describe the fn at eip.
+ know_fnname = VG_(clo_sym_offsets)
+ ? VG_(get_fnname_w_offset) (eip, buf_fn, BUF_LEN)
+ : VG_(get_fnname) (eip, buf_fn, BUF_LEN);
+ } else {
+ const DiInlLoc *next_inl = iipc && iipc->next_inltab >= 0
+ ? & iipc->di->inltab[iipc->next_inltab]
+ : NULL;
+ vg_assert (next_inl);
+ // The function we are in is called by next_inl.
+ VG_(snprintf)(buf_fn, BUF_LEN, "%s", next_inl->inlinedfn);
+ know_fnname = True;
+
+ // INLINED????
+ // ??? Can we compute an offset for an inlined fn call ?
+ // ??? Offset from what ? The beginning of the inl info ?
+ // ??? But that is not necessarily the beginning of the fn
+ // ??? as e.g. an inlined fn call can be in several ranges.
+ // ??? Currently never showing an offset.
+ }
+
+ know_objname = VG_(get_objname)(eip, buf_obj, BUF_LEN);
+
+ if (is_top(iipc)) {
+ // The source for the highest level is in the loctab entry.
+ know_srcloc = VG_(get_filename_linenum)(
+ eip,
+ buf_srcloc, BUF_LEN,
+ buf_dirname, BUF_LEN, &know_dirinfo,
+ &lineno
+ );
+ } else {
+ const DiInlLoc *cur_inl = iipc && iipc->cur_inltab >= 0
+ ? & iipc->di->inltab[iipc->cur_inltab]
+ : NULL;
+ vg_assert (cur_inl);
+ // The filename and lineno for the inlined fn caller is in cur_inl.
+ VG_(snprintf) (buf_srcloc, BUF_LEN, cur_inl->filename);
+ lineno = cur_inl->lineno;
+
+ know_dirinfo = False; //INLINED TBD
+
+ know_srcloc = True;
+ }
+
+
buf_fn [ sizeof(buf_fn)-1 ] = 0;
buf_obj [ sizeof(buf_obj)-1 ] = 0;
buf_srcloc [ sizeof(buf_srcloc)-1 ] = 0;
Modified: trunk/coregrind/m_debuginfo/priv_storage.h
==============================================================================
--- trunk/coregrind/m_debuginfo/priv_storage.h (original)
+++ trunk/coregrind/m_debuginfo/priv_storage.h Sun Jun 15 15:42:20 2014
@@ -119,6 +119,29 @@
}
DiLoc;
+#define LEVEL_BITS (32 - LINENO_BITS)
+#define MAX_LEVEL ((1 << LEVEL_BITS) - 1)
+
+/* A structure to hold addr-to-inlined fn info. There
+ can be a lot of these, hence the dense packing. */
+typedef
+ struct {
+ /* Word 1 */
+ Addr addr_lo; /* lowest address for inlined fn */
+ /* Word 2 */
+ Addr addr_hi; /* highest address following the inlined fn */
+ /* Word 3 */
+ const HChar* inlinedfn; /* inlined function name */
+ /* Word 4 */
+ const HChar* filename; /* caller source filename */
+ /* Word 5 */
+ const HChar* dirname; /* caller source directory name */
+ /* Word 6 */
+ UInt lineno:LINENO_BITS; /* caller line number */
+ UShort level:LEVEL_BITS; /* level of inlining */
+ }
+ DiInlLoc;
+
/* --------------------- CF INFO --------------------- */
/* DiCfSI: a structure to summarise DWARF2/3 CFA info for the code
@@ -790,6 +813,13 @@
DiLoc* loctab;
UWord loctab_used;
UWord loctab_size;
+ /* An expandable array of inlined fn info.
+ maxinl_codesz is the biggest inlined piece of code
+ in inltab (i.e. the max of 'addr_hi - addr_lo'. */
+ DiInlLoc* inltab;
+ UWord inltab_used;
+ UWord inltab_size;
+ SizeT maxinl_codesz;
/* An expandable array of CFI summary info records. Also includes
summary address bounds, showing the min and max address covered
by any of the records, as an aid to fast searching. And, if the
@@ -874,6 +904,21 @@
const HChar* dirname, /* NULL is allowable */
Addr this, Addr next, Int lineno, Int entry);
+/* Add a call inlined record to a DebugInfo.
+ A call to the below means that inlinedfn code has been
+ inlined, resulting in code from [addr_lo, addr_hi[.
+ Note that addr_hi is excluded, i.e. is not part of the inlined code.
+ The call that caused this inlining is in filename/dirname/lineno
+ In case of nested inlining, a small level indicates the call
+ is closer to main that a call with a higher level. */
+extern
+void ML_(addInlInfo) ( struct _DebugInfo* di,
+ Addr addr_lo, Addr addr_hi,
+ const HChar* inlinedfn,
+ const HChar* filename,
+ const HChar* dirname, /* NULL is allowable */
+ Int lineno, UShort level);
+
/* Add a CFI summary record. The supplied DiCfSI is copied. */
extern void ML_(addDiCfSI) ( struct _DebugInfo* di, DiCfSI* cfsi );
Modified: trunk/coregrind/m_debuginfo/readdwarf3.c
==============================================================================
--- trunk/coregrind/m_debuginfo/readdwarf3.c (original)
+++ trunk/coregrind/m_debuginfo/readdwarf3.c Sun Jun 15 15:42:20 2014
@@ -161,7 +161,7 @@
/*------------------------------------------------------------*/
#define TRACE_D3(format, args...) \
- if (td3) { VG_(printf)(format, ## args); }
+ if (UNLIKELY(td3)) { VG_(printf)(format, ## args); }
#define D3_INVALID_CUOFF ((UWord)(-1UL))
#define D3_FAKEVOID_CUOFF ((UWord)(-2UL))
@@ -1564,7 +1564,7 @@
static
-void read_filename_table( /*MOD*/D3VarParser* parser,
+void read_filename_table( /*MOD*/XArray* /* of UChar* */ filenameTable,
CUConst* cc, ULong debug_line_offset,
Bool td3 )
{
@@ -1575,7 +1575,7 @@
UChar opcode_base;
HChar* str;
- vg_assert(parser && cc && cc->barf);
+ vg_assert(filenameTable && cc && cc->barf);
if (!ML_(sli_is_valid)(cc->escn_debug_line)
|| cc->escn_debug_line.szB <= debug_line_offset) {
cc->barf("read_filename_table: .debug_line is missing?");
@@ -1610,18 +1610,17 @@
(void)get_UChar(&c); /* skip terminating zero */
/* Read and record the file names table */
- vg_assert(parser->filenameTable);
- vg_assert( VG_(sizeXA)( parser->filenameTable ) == 0 );
+ vg_assert( VG_(sizeXA)( filenameTable ) == 0 );
/* Add a dummy index-zero entry. DWARF3 numbers its files
from 1, for some reason. */
str = ML_(addStr)( cc->di, "<unknown_file>", -1 );
- VG_(addToXA)( parser->filenameTable, &str );
+ VG_(addToXA)( filenameTable, &str );
while (peek_UChar(&c) != 0) {
DiCursor cur = get_AsciiZ(&c);
str = ML_(addStrFromCursor)( cc->di, cur );
TRACE_D3(" read_filename_table: %ld %s\n",
- VG_(sizeXA)(parser->filenameTable), str);
- VG_(addToXA)( parser->filenameTable, &str );
+ VG_(sizeXA)(filenameTable), str);
+ VG_(addToXA)( filenameTable, &str );
(void)get_ULEB128( &c ); /* skip directory index # */
(void)get_ULEB128( &c ); /* skip last mod time */
(void)get_ULEB128( &c ); /* file size */
@@ -1629,6 +1628,91 @@
/* We're done! The rest of it is not interesting. */
}
+/* setup_cu_svma to be called when a cu is found at level 0,
+ to establish the cu_svma. */
+static void setup_cu_svma(CUConst* cc, Bool have_lo, Addr ip_lo, Bool td3)
+{
+ Addr cu_svma;
+ /* We have potentially more than one type of parser parsing the
+ dwarf information. At least currently, each parser establishes
+ the cu_svma. So, in case cu_svma_known, we check that the same
+ result is obtained by the 2nd parsing of the cu.
+
+ Alternatively, we could reset cu_svma_known after each parsing
+ and then check that we only see a single DW_TAG_compile_unit DIE
+ at level 0, DWARF3 only allows exactly one top level DIE per
+ CU. */
+
+ if (have_lo)
+ cu_svma = ip_lo;
+ else {
+ /* Now, it may be that this DIE doesn't tell us the CU's
+ SVMA, by way of not having a DW_AT_low_pc. That's OK --
+ the CU doesn't *have* to have its SVMA specified.
+
+ But as per last para D3 spec sec 3.1.1 ("Normal and
+ Partial Compilation Unit Entries", "If the base address
+ (viz, the SVMA) is undefined, then any DWARF entry of
+ structure defined interms of the base address of that
+ compilation unit is not valid.". So that means, if whilst
+ processing the children of this top level DIE (or their
+ children, etc) we see a DW_AT_range, and cu_svma_known is
+ False, then the DIE that contains it is (per the spec)
+ invalid, and we can legitimately stop and complain. */
+ /* .. whereas The Reality is, simply assume the SVMA is zero
+ if it isn't specified. */
+ cu_svma = 0;
+ }
+
+ if (cc->cu_svma_known) {
+ vg_assert (cu_svma == cc->cu_svma);
+ } else {
+ cc->cu_svma_known = True;
+ cc->cu_svma = cu_svma;
+ if (0)
+ TRACE_D3("setup_cu_svma: acquire CU_SVMA of %p\n", (void*) cc->cu_svma);
+ }
+}
+
+__attribute__((noreturn))
+static void dump_bad_die_and_barf(
+ DW_TAG dtag,
+ UWord posn,
+ Int level,
+ Cursor* c_die, UWord saved_die_c_offset,
+ g_abbv *abbv,
+ CUConst* cc)
+{
+ FormContents cts;
+ UInt nf_i;
+ Bool debug_types_flag;
+ Bool alt_flag;
+
+ set_position_of_Cursor( c_die, saved_die_c_offset );
+ posn = uncook_die( cc, posn, &debug_types_flag, &alt_flag );
+ VG_(printf)(" <%d><%lx>: %s", level, posn, ML_(pp_DW_TAG)( dtag ) );
+ if (debug_types_flag) {
+ VG_(printf)(" (in .debug_types)");
+ }
+ else if (alt_flag) {
+ VG_(printf)(" (in alternate .debug_info)");
+ }
+ VG_(printf)("\n");
+ nf_i = 0;
+ while (True) {
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
+ if (attr == 0 && form == 0) break;
+ VG_(printf)(" %18s: ", ML_(pp_DW_AT)(attr));
+ /* Get the form contents, so as to print them */
+ get_Form_contents( &cts, cc, c_die, True, form );
+ VG_(printf)("\t\n");
+ }
+ VG_(printf)("\n");
+ cc->barf("parse_var_DIE: confused by the above DIE");
+}
+
__attribute__((noinline))
static void bad_DIE_confusion(int linenr)
{
@@ -1655,8 +1739,6 @@
UInt nf_i;
UWord saved_die_c_offset = get_position_of_Cursor( c_die );
- Bool debug_types_flag;
- Bool alt_flag;
varstack_preen( parser, td3, level-1 );
@@ -1692,49 +1774,17 @@
have_range = True;
}
if (attr == DW_AT_stmt_list && cts.szB > 0) {
- read_filename_table( parser, cc, cts.u.val, td3 );
+ read_filename_table( parser->filenameTable, cc, cts.u.val, td3 );
}
}
if (have_lo && have_hi1 && hiIsRelative)
ip_hi1 += ip_lo;
+
/* Now, does this give us an opportunity to find this
CU's svma? */
-#if 0
- if (level == 0 && have_lo) {
- vg_assert(!cc->cu_svma_known); /* if this fails, it must be
- because we've already seen a DW_TAG_compile_unit DIE at level
- 0. But that can't happen, because DWARF3 only allows exactly
- one top level DIE per CU. */
- cc->cu_svma_known = True;
- cc->cu_svma = ip_lo;
- if (1)
- TRACE_D3("BBBBAAAA acquire CU_SVMA of %p\n", cc->cu_svma);
- /* Now, it may be that this DIE doesn't tell us the CU's
- SVMA, by way of not having a DW_AT_low_pc. That's OK --
- the CU doesn't *have* to have its SVMA specified.
-
- But as per last para D3 spec sec 3.1.1 ("Normal and
- Partial Compilation Unit Entries", "If the base address
- (viz, the SVMA) is undefined, then any DWARF entry of
- structure defined interms of the base address of that
- compilation unit is not valid.". So that means, if whilst
- processing the children of this top level DIE (or their
- children, etc) we see a DW_AT_range, and cu_svma_known is
- False, then the DIE that contains it is (per the spec)
- invalid, and we can legitimately stop and complain. */
- }
-#else
- /* .. whereas The Reality is, simply assume the SVMA is zero
- if it isn't specified. */
- if (level == 0) {
- vg_assert(!cc->cu_svma_known);
- cc->cu_svma_known = True;
- if (have_lo)
- cc->cu_svma = ip_lo;
- else
- cc->cu_svma = 0;
- }
-#endif
+ if (level == 0)
+ setup_cu_svma(cc, have_lo, ip_lo, td3);
+
/* Do we have something that looks sane? */
if (have_lo && have_hi1 && (!have_range)) {
if (ip_lo < ip_hi1)
@@ -2136,29 +2186,233 @@
return;
bad_DIE:
- set_position_of_Cursor( c_die, saved_die_c_offset );
- posn = uncook_die( cc, posn, &debug_types_flag, &alt_flag );
- VG_(printf)(" <%d><%lx>: %s", level, posn, ML_(pp_DW_TAG)( dtag ) );
- if (debug_types_flag) {
- VG_(printf)(" (in .debug_types)");
- }
- else if (alt_flag) {
- VG_(printf)(" (in alternate .debug_info)");
+ dump_bad_die_and_barf(dtag, posn, level,
+ c_die, saved_die_c_offset,
+ abbv,
+ cc);
+ /*NOTREACHED*/
+}
+
+typedef
+ struct {
+ /* The file name table. Is a mapping from integer index to the
+ (permanent) copy of the string in DebugInfo's .strchunks. */
+ XArray* /* of UChar* */ filenameTable;
}
- VG_(printf)("\n");
+ D3InlParser;
+
+/* Return the function name corresponding to absori.
+ The return value is a (permanent) string in DebugInfo's .strchunks. */
+static HChar* get_inlFnName (Int absori, CUConst* cc, Bool td3)
+{
+ Cursor c;
+ g_abbv *abbv;
+ ULong atag, abbv_code;
+ UInt has_children;
+ UWord posn;
+ HChar *ret = NULL;
+ FormContents cts;
+ UInt nf_i;
+
+ init_Cursor (&c, cc->escn_debug_info, absori, cc->barf,
+ "Overrun get_inlFnName absori");
+
+ posn = cook_die( cc, get_position_of_Cursor( &c ) );
+ abbv_code = get_ULEB128( &c );
+ abbv = get_abbv ( cc, abbv_code);
+ atag = abbv->atag;
+ TRACE_D3("\n");
+ TRACE_D3(" <get_inlFnName><%lx>: Abbrev Number: %llu (%s)\n",
+ posn, abbv_code, ML_(pp_DW_TAG)( atag ) );
+
+ if (atag == 0)
+ cc->barf("get_inlFnName: invalid zero tag on DIE");
+
+ has_children = abbv->has_children;
+ if (has_children != DW_children_no && has_children != DW_children_yes)
+ cc->barf("get_inlFnName: invalid has_children value");
+
+ if (atag != DW_TAG_subprogram)
+ cc->barf("get_inlFnName: absori not a subprogram");
+
nf_i = 0;
while (True) {
DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
nf_i++;
if (attr == 0 && form == 0) break;
- VG_(printf)(" %18s: ", ML_(pp_DW_AT)(attr));
- /* Get the form contents, so as to print them */
- get_Form_contents( &cts, cc, c_die, True, form );
- VG_(printf)("\t\n");
+ get_Form_contents( &cts, cc, &c, False/*td3*/, form );
+ if (attr == DW_AT_name) {
+ HChar *fnname;
+ if (cts.szB >= 0)
+ cc->barf("get_inlFnName: expecting indirect string");
+ fnname = ML_(cur_read_strdup)( cts.u.cur,
+ "get_inlFnName.1" );
+ ret = ML_(addStr)(cc->di, fnname, -1);
+ ML_(dinfo_free) (fnname);
+ break;
+ }
}
- VG_(printf)("\n");
- cc->barf("parse_var_DIE: confused by the above DIE");
+
+ if (ret)
+ return ret;
+ else
+ return ML_(addStr)(cc->di, "AbsOriFnNameNotFound", -1);
+}
+
+/* Returns True if the (possibly) childrens of the current DIE are interesting
+ to parse. Returns False otherwise.
+ If the current DIE has a sibling, the non interesting children can
+ maybe be skipped (if the DIE has a DW_AT_sibling). */
+__attribute__((noinline))
+static Bool parse_inl_DIE (
+ /*MOD*/D3InlParser* parser,
+ DW_TAG dtag,
+ UWord posn,
+ Int level,
+ Cursor* c_die,
+ g_abbv *abbv,
+ CUConst* cc,
+ Bool td3
+)
+{
+ FormContents cts;
+ UInt nf_i;
+
+ UWord saved_die_c_offset = get_position_of_Cursor( c_die );
+
+ /* Get info about DW_TAG_compile_unit and DW_TAG_partial_unit 'which
+ in theory could also contain inlined fn calls). */
+ if (dtag == DW_TAG_compile_unit || dtag == DW_TAG_partial_unit) {
+ Bool have_lo = False;
+ Addr ip_lo = 0;
+
+ nf_i = 0;
+ while (True) {
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
+ if (attr == 0 && form == 0) break;
+ get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
+ if (attr == DW_AT_low_pc && cts.szB > 0) {
+ ip_lo = cts.u.val;
+ have_lo = True;
+ }
+ if (attr == DW_AT_stmt_list && cts.szB > 0) {
+ read_filename_table( parser->filenameTable, cc, cts.u.val, td3 );
+ }
+ }
+ if (level == 0)
+ setup_cu_svma (cc, have_lo, ip_lo, td3);
+ }
+
+ if (dtag == DW_TAG_inlined_subroutine) {
+ Bool have_lo = False;
+ Bool have_hi1 = False;
+ Bool have_range = False;
+ Bool hiIsRelative = False;
+ Addr ip_lo = 0;
+ Addr ip_hi1 = 0;
+ Addr rangeoff = 0;
+ HChar* caller_filename = NULL;
+ Int caller_lineno = 0;
+ Int inlinedfn_abstract_origin = 0;
+
+ nf_i = 0;
+ while (True) {
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
+ if (attr == 0 && form == 0) break;
+ get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
+ if (attr == DW_AT_call_file && cts.szB > 0) {
+ Int ftabIx = (Int)cts.u.val;
+ if (ftabIx >= 1
+ && ftabIx < VG_(sizeXA)( parser->filenameTable )) {
+ caller_filename = *(HChar**)
+ VG_(indexXA)( parser->filenameTable, ftabIx );
+ vg_assert(caller_filename);
+ }
+ if (0) VG_(printf)("XXX caller_filename = %s\n", caller_filename);
+ }
+ if (attr == DW_AT_call_line && cts.szB > 0) {
+ caller_lineno = cts.u.val;
+ }
+
+ if (attr == DW_AT_abstract_origin && cts.szB > 0) {
+ inlinedfn_abstract_origin = cts.u.val;
+ }
+
+ if (attr == DW_AT_low_pc && cts.szB > 0) {
+ ip_lo = cts.u.val;
+ have_lo = True;
+ }
+ if (attr == DW_AT_high_pc && cts.szB > 0) {
+ ip_hi1 = cts.u.val;
+ have_hi1 = True;
+ if (form != DW_FORM_addr)
+ hiIsRelative = True;
+ }
+ if (attr == DW_AT_ranges && cts.szB > 0) {
+ rangeoff = cts.u.val;
+ have_range = True;
+ }
+ }
+ if (have_lo && have_hi1 && hiIsRelative)
+ ip_hi1 += ip_lo;
+ /* Do we have something that looks sane? */
+ if (dtag == DW_TAG_inlined_subroutine
+ && (!have_lo) && (!have_hi1) && (!have_range)) {
+ /* Seems strange. How can an inlined subroutine have
+ no code ? */
+ goto_bad_DIE;
+ } else
+ if (have_lo && have_hi1 && (!have_range)) {
+ /* This inlined call is just a single address range. */
+ if (ip_lo < ip_hi1) {
+ ML_(addInlInfo) (cc->di,
+ ip_lo, ip_hi1,
+ get_inlFnName (inlinedfn_abstract_origin, cc, td3),
+ caller_filename,
+ NULL, // INLINED TBD dirname ?????
+ caller_lineno, level);
+ }
+ } else if (have_range) {
+ /* This inlined call is several address ranges. */
+ XArray *ranges;
+ Word j;
+ HChar *inlfnname = get_inlFnName (inlinedfn_abstract_origin, cc, td3);
+
+ ranges = get_range_list( cc, td3,
+ rangeoff, cc->cu_svma );
+ for (j = 0; j < VG_(sizeXA)( ranges ); j++) {
+ AddrRange* range = (AddrRange*) VG_(indexXA)( ranges, j );
+ ML_(addInlInfo) (cc->di,
+ range->aMin, range->aMax+1,
+ // aMax+1 as range has its last bound included
+ // while ML_(addInlInfo) expects last bound not
+ // included.
+ inlfnname,
+ caller_filename,
+ NULL, // INLINED TBD dirname ?????
+ caller_lineno, level);
+ }
+ VG_(deleteXA)( ranges );
+ } else
+ goto_bad_DIE;
+ }
+
+ // Only recursively parse the (possible) children for the DIE which
+ // might maybe contain a DW_TAG_inlined_subroutine:
+ return dtag == DW_TAG_lexical_block || dtag == DW_TAG_subprogram
+ || dtag == DW_TAG_inlined_subroutine
+ || dtag == DW_TAG_compile_unit || dtag == DW_TAG_partial_unit;
+
+ bad_DIE:
+ dump_bad_die_and_barf(dtag, posn, level,
+ c_die, saved_die_c_offset,
+ abbv,
+ cc);
/*NOTREACHED*/
}
@@ -2320,13 +2574,11 @@
Bool td3 )
{
FormContents cts;
+ UInt nf_i;
TyEnt typeE;
TyEnt atomE;
TyEnt fieldE;
TyEnt boundE;
- Bool debug_types_flag;
- Bool alt_flag;
- UInt nf_i;
UWord saved_die_c_offset = get_position_of_Cursor( c_die );
@@ -3095,28 +3347,10 @@
/*NOTREACHED*/
bad_DIE:
- set_position_of_Cursor( c_die, saved_die_c_offset );
- posn = uncook_die( cc, posn, &debug_types_flag, &alt_flag );
- VG_(printf)(" <%d><%lx>: %s", level, posn, ML_(pp_DW_TAG)( dtag ) );
- if (debug_types_flag) {
- VG_(printf)(" (in .debug_types)");
- } else if (alt_flag) {
- VG_(printf)(" (in alternate .debug_info)");
- }
- VG_(printf)("\n");
- nf_i = 0;
- while (True) {
- DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
- DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
- nf_i++;
- if (attr == 0 && form == 0) break;
- VG_(printf)(" %18s: ", ML_(pp_DW_AT)(attr));
- /* Get the form contents, so as to print them */
- get_Form_contents( &cts, cc, c_die, True, form );
- VG_(printf)("\t\n");
- }
- VG_(printf)("\n");
- cc->barf("parse_type_DIE: confused by the above DIE");
+ dump_bad_die_and_barf(dtag, posn, level,
+ c_die, saved_die_c_offset,
+ abbv,
+ cc);
/*NOTREACHED*/
}
@@ -3463,6 +3697,7 @@
/*MOD*/XArray* /* of GExpr* */ gexprs,
/*MOD*/D3TypeParser* typarser,
/*MOD*/D3VarParser* varparser,
+ /*MOD*/D3InlParser* inlparser,
Cursor* c, Bool td3, CUConst* cc, Int level
)
{
@@ -3473,6 +3708,12 @@
UInt has_children;
UWord start_die_c_offset;
UWord after_die_c_offset;
+ // If the DIE we will parse has a sibling and the parser(s) are
+ // all indicating that parse_children is not necessary, then
+ // we will skip the children by jumping to the sibling of this DIE
+ // (if it has a sibling).
+ UWord sibling = 0;
+ Bool parse_children = False;
/* --- Deal with this DIE --- */
posn = cook_die( cc, get_position_of_Cursor( c ) );
@@ -3509,54 +3750,87 @@
/* Get the form contents, but ignore them; the only purpose is
to print them, if td3 is True */
get_Form_contents( &cts, cc, c, td3, (DW_FORM)at_form );
+ /* Except that we remember if this DIE has a sibling. */
+ if (UNLIKELY(at_name == DW_AT_sibling && cts.szB > 0)) {
+ sibling = cts.u.val;
+ }
TRACE_D3("\t");
TRACE_D3("\n");
}
after_die_c_offset = get_position_of_Cursor( c );
- set_position_of_Cursor( c, start_die_c_offset );
+ if (VG_(clo_read_var_info)) {
+ set_position_of_Cursor( c, start_die_c_offset );
- parse_type_DIE( tyents,
- typarser,
- (DW_TAG)atag,
- posn,
- level,
- c, /* DIE cursor */
- abbv, /* abbrev */
- cc,
- td3 );
-
- set_position_of_Cursor( c, start_die_c_offset );
-
- parse_var_DIE( rangestree,
- tempvars,
- gexprs,
- varparser,
- (DW_TAG)atag,
- posn,
- level,
- c, /* DIE cursor */
- abbv, /* abbrev */
- cc,
- td3 );
+ parse_type_DIE( tyents,
+ typarser,
+ (DW_TAG)atag,
+ posn,
+ level,
+ c, /* DIE cursor */
+ abbv, /* abbrev */
+ cc,
+ td3 );
+
+ set_position_of_Cursor( c, start_die_c_offset );
+
+ parse_var_DIE( rangestree,
+ tempvars,
+ gexprs,
+ varparser,
+ (DW_TAG)atag,
+ posn,
+ level,
+ c, /* DIE cursor */
+ abbv, /* abbrev */
+ cc,
+ td3 );
+
+ parse_children = True;
+ // type and var parsers do not have logic to skip childrens.
+ }
+
+ if (VG_(clo_read_inline_info)) {
+ set_position_of_Cursor( c, start_die_c_offset );
+
+ parse_children =
+ parse_inl_DIE( inlparser,
+ (DW_TAG)atag,
+ posn,
+ level,
+ c, /* DIE cursor */
+ abbv, /* abbrev */
+ cc,
+ td3 )
+ || parse_children;
+ }
set_position_of_Cursor( c, after_die_c_offset );
- /* --- Now recurse into its children, if any --- */
+ /* --- Now recurse into its children, if any
+ and the parsing of the children is requested by a parser --- */
if (has_children == DW_children_yes) {
- if (0) TRACE_D3("BEGIN children of level %d\n", level);
- while (True) {
- atag = peek_ULEB128( c );
- if (atag == 0) break;
- read_DIE( rangestree, tyents, tempvars, gexprs,
- typarser, varparser,
- c, td3, cc, level+1 );
- }
- /* Now we need to eat the terminating zero */
- atag = get_ULEB128( c );
- vg_assert(atag == 0);
- if (0) TRACE_D3("END children of level %d\n", level);
+ if (parse_children || sibling == 0) {
+ if (0) TRACE_D3("BEGIN children of level %d\n", level);
+ while (True) {
+ atag = peek_ULEB128( c );
+ if (atag == 0) break;
+ read_DIE( rangestree, tyents, tempvars, gexprs,
+ typarser, varparser, inlparser,
+ c, td3, cc, level+1 );
+ }
+ /* Now we need to eat the terminating zero */
+ atag = get_ULEB128( c );
+ vg_assert(atag == 0);
+ if (0) TRACE_D3("END children of level %d\n", level);
+ } else {
+ // We can skip the childrens, by jumping to the sibling
+ TRACE_D3("SKIPPING DIE's children,"
+ "jumping to sibling <%d><%lx>\n",
+ level, sibling);
+ set_position_of_Cursor( c, sibling );
+ }
}
}
@@ -3574,11 +3848,11 @@
DiSlice escn_debug_str_alt
)
{
- XArray* /* of TyEnt */ tyents;
- XArray* /* of TyEnt */ tyents_to_keep;
- XArray* /* of GExpr* */ gexprs;
- XArray* /* of TempVar* */ tempvars;
- WordFM* /* of (XArray* of AddrRange, void) */ rangestree;
+ XArray* /* of TyEnt */ tyents = NULL;
+ XArray* /* of TyEnt */ tyents_to_keep = NULL;
+ XArray* /* of GExpr* */ gexprs = NULL;
+ XArray* /* of TempVar* */ tempvars = NULL;
+ WordFM* /* of (XArray* of AddrRange, void) */ rangestree = NULL;
TyEntIndexCache* tyents_cache = NULL;
TyEntIndexCache* tyents_to_keep_cache = NULL;
TempVar *varp, *varp2;
@@ -3588,13 +3862,14 @@
Cursor ranges; /* for showing .debug_ranges */
D3TypeParser typarser;
D3VarParser varparser;
+ D3InlParser inlparser;
Addr dr_base;
UWord dr_offset;
Word i, j, n;
Bool td3 = di->trace_symtab;
XArray* /* of TempVar* */ dioff_lookup_tab;
Int pass;
- VgHashTable signature_types;
+ VgHashTable signature_types = NULL;
#if 0
/* This doesn't work properly because it assumes all entries are
packed end to end, with no holes. But that doesn't always
@@ -3731,74 +4006,79 @@
}
TRACE_SYMTAB("\n");
- /* We'll park the harvested type information in here. Also create
- a fake "void" entry with offset D3_FAKEVOID_CUOFF, so we always
- have at least one type entry to refer to. D3_FAKEVOID_CUOFF is
- huge and presumably will not occur in any valid DWARF3 file --
- it would need to have a .debug_info section 4GB long for that to
- happen. These type entries end up in the DebugInfo. */
- tyents = VG_(newXA)( ML_(dinfo_zalloc),
- "di.readdwarf3.ndrw.1 (TyEnt temp array)",
- ML_(dinfo_free), sizeof(TyEnt) );
- { TyEnt tyent;
- VG_(memset)(&tyent, 0, sizeof(tyent));
- tyent.tag = Te_TyVoid;
- tyent.cuOff = D3_FAKEVOID_CUOFF;
- tyent.Te.TyVoid.isFake = True;
- VG_(addToXA)( tyents, &tyent );
- }
- { TyEnt tyent;
- VG_(memset)(&tyent, 0, sizeof(tyent));
- tyent.tag = Te_UNKNOWN;
- tyent.cuOff = D3_INVALID_CUOFF;
- VG_(addToXA)( tyents, &tyent );
- }
-
- /* This is a tree used to unique-ify the range lists that are
- manufactured by parse_var_DIE. References to the keys in the
- tree wind up in .rngMany fields in TempVars. We'll need to
- delete this tree, and the XArrays attached to it, at the end of
- this function. */
- rangestree = VG_(newFM)( ML_(dinfo_zalloc),
- "di.readdwarf3.ndrw.2 (rangestree)",
- ML_(dinfo_free),
- (Word(*)(UWord,UWord))cmp__XArrays_of_AddrRange );
-
- /* List of variables we're accumulating. These don't end up in the
- DebugInfo; instead their contents are handed to ML_(addVar) and
- the list elements are then deleted. */
- tempvars = VG_(newXA)( ML_(dinfo_zalloc),
- "di.readdwarf3.ndrw.3 (TempVar*s array)",
- ML_(dinfo_free),
- sizeof(TempVar*) );
-
- /* List of GExprs we're accumulating. These wind up in the
- DebugInfo. */
- gexprs = VG_(newXA)( ML_(dinfo_zalloc), "di.readdwarf3.ndrw.4",
- ML_(dinfo_free), sizeof(GExpr*) );
-
- /* We need a D3TypeParser to keep track of partially constructed
- types. It'll be discarded as soon as we've completed the CU,
- since the resulting information is tipped in to 'tyents' as it
- is generated. */
- VG_(memset)( &typarser, 0, sizeof(typarser) );
- typarser.sp = -1;
- typarser.language = '?';
- for (i = 0; i < N_D3_TYPE_STACK; i++) {
- typarser.qparentE[i].tag = Te_EMPTY;
- typarser.qparentE[i].cuOff = D3_INVALID_CUOFF;
+ if (VG_(clo_read_var_info)) {
+ /* We'll park the harvested type information in here. Also create
+ a fake "void" entry with offset D3_FAKEVOID_CUOFF, so we always
+ have at least one type entry to refer to. D3_FAKEVOID_CUOFF is
+ huge and presumably will not occur in any valid DWARF3 file --
+ it would need to have a .debug_info section 4GB long for that to
+ happen. These type entries end up in the DebugInfo. */
+ tyents = VG_(newXA)( ML_(dinfo_zalloc),
+ "di.readdwarf3.ndrw.1 (TyEnt temp array)",
+ ML_(dinfo_free), sizeof(TyEnt) );
+ { TyEnt tyent;
+ VG_(memset)(&tyent, 0, sizeof(tyent));
+ tyent.tag = Te_TyVoid;
+ tyent.cuOff = D3_FAKEVOID_CUOFF;
+ tyent.Te.TyVoid.isFake = True;
+ VG_(addToXA)( tyents, &tyent );
+ }
+ { TyEnt tyent;
+ VG_(memset)(&tyent, 0, sizeof(tyent));
+ tyent.tag = Te_UNKNOWN;
+ tyent.cuOff = D3_INVALID_CUOFF;
+ VG_(addToXA)( tyents, &tyent );
+ }
+
+ /* This is a tree used to unique-ify the range lists that are
+ manufactured by parse_var_DIE. References to the keys in the
+ tree wind up in .rngMany fields in TempVars. We'll need to
+ delete this tree, and the XArrays attached to it, at the end of
+ this function. */
+ rangestree = VG_(newFM)( ML_(dinfo_zalloc),
+ "di.readdwarf3.ndrw.2 (rangestree)",
+ ML_(dinfo_free),
+ (Word(*)(UWord,UWord))cmp__XArrays_of_AddrRange );
+
+ /* List of variables we're accumulating. These don't end up in the
+ DebugInfo; instead their contents are handed to ML_(addVar) and
+ the list elements are then deleted. */
+ tempvars = VG_(newXA)( ML_(dinfo_zalloc),
+ "di.readdwarf3.ndrw.3 (TempVar*s array)",
+ ML_(dinfo_free),
+ sizeof(TempVar*) );
+
+ /* List of GExprs we're accumulating. These wind up in the
+ DebugInfo. */
+ gexprs = VG_(newXA)( ML_(dinfo_zalloc), "di.readdwarf3.ndrw.4",
+ ML_(dinfo_free), sizeof(GExpr*) );
+
+ /* We need a D3TypeParser to keep track of partially constructed
+ types. It'll be discarded as soon as we've completed the CU,
+ since the resulting information is tipped in to 'tyents' as it
+ is generated. */
+ VG_(memset)( &typarser, 0, sizeof(typarser) );
+ typarser.sp = -1;
+ typarser.language = '?';
+ for (i = 0; i < N_D3_TYPE_STACK; i++) {
+ typarser.qparentE[i].tag = Te_EMPTY;
+ typarser.qparentE[i].cuOff = D3_INVALID_CUOFF;
+ }
+
+ VG_(memset)( &varparser, 0, sizeof(varparser) );
+ varparser.sp = -1;
+
+ signature_types = VG_(HT_construct) ("signature_types");
}
- VG_(memset)( &varparser, 0, sizeof(varparser) );
- varparser.sp = -1;
+ if (VG_(clo_read_inline_info))
+ VG_(memset)( &inlparser, 0, sizeof(inlparser) );
- signature_types = VG_(HT_construct) ("signature_types");
-
/* Do an initial pass to scan the .debug_types section, if any, and
fill in the signatured types hash table. This lets us handle
mapping from a type signature to a (cooked) DIE offset directly
in get_Form_contents. */
- if (ML_(sli_is_valid)(escn_debug_types)) {
+ if (VG_(clo_read_var_info) && ML_(sli_is_valid)(escn_debug_types)) {
init_Cursor( &info, escn_debug_types, 0, barf,
"Overrun whilst reading .debug_types section" );
TRACE_D3("\n------ Collecting signatures from "
@@ -3912,16 +4192,18 @@
break;
}
- /* Check the varparser's stack is in a sane state. */
- vg_assert(varparser.sp == -1);
- for (i = 0; i < N_D3_VAR_STACK; i++) {
- vg_assert(varparser.ranges[i] == NULL);
- vg_assert(varparser.level[i] == 0);
- }
- for (i = 0; i < N_D3_TYPE_STACK; i++) {
- vg_assert(typarser.qparentE[i].cuOff == D3_INVALID_CUOFF);
- vg_assert(typarser.qparentE[i].tag == Te_EMPTY);
- vg_assert(typarser.qlevel[i] == 0);
+ if (VG_(clo_read_var_info)) {
+ /* Check the varparser's stack is in a sane state. */
+ vg_assert(varparser.sp == -1);
+ for (i = 0; i < N_D3_VAR_STACK; i++) {
+ vg_assert(varparser.ranges[i] == NULL);
+ vg_assert(varparser.level[i] == 0);
+ }
+ for (i = 0; i < N_D3_TYPE_STACK; i++) {
+ vg_assert(typarser.qparentE[i].cuOff == D3_INVALID_CUOFF);
+ vg_assert(typarser.qparentE[i].tag == Te_EMPTY);
+ vg_assert(typarser.qlevel[i] == 0);
+ }
}
cu_start_offset = get_position_of_Cursor( &info );
@@ -3959,33 +4241,45 @@
cc.cu_svma_known = False;
cc.cu_svma = 0;
- cc.signature_types = signature_types;
+ if (VG_(clo_read_var_info)) {
+ cc.signature_types = signature_types;
- /* Create a fake outermost-level range covering the entire
- address range. So we always have *something* to catch all
- variable declarations. */
- varstack_push( &cc, &varparser, td3,
- unitary_range_list(0UL, ~0UL),
- -1, False/*isFunc*/, NULL/*fbGX*/ );
-
- /* And set up the file name table. When we come across the top
- level DIE for this CU (which is what the next call to
- read_DIE should process) we will copy all the file names out
- of the .debug_line img area and use this table to look up the
- copies when we later see filename numbers in DW_TAG_variables
- etc. */
- vg_assert(!varparser.filenameTable );
- varparser.filenameTable
- = VG_(newXA)( ML_(dinfo_zalloc), "di.readdwarf3.ndrw.5",
- ML_(dinfo_free),
- sizeof(UChar*) );
- vg_assert(varparser.filenameTable);
+ /* Create a fake outermost-level range covering the entire
+ address range. So we always have *something* to catch all
+ variable declarations. */
+ varstack_push( &cc, &varparser, td3,
+ unitary_range_list(0UL, ~0UL),
+ -1, False/*isFunc*/, NULL/*fbGX*/ );
+
+ /* And set up the file name table. When we come across the top
+ level DIE for this CU (which is what the next call to
+ read_DIE should process) we will copy all the file names out
+ of the .debug_line img area and use this table to look up the
+ copies when we later see filename numbers in DW_TAG_variables
+ etc. */
+ vg_assert(!varparser.filenameTable );
+ varparser.filenameTable
+ = VG_(newXA)( ML_(dinfo_zalloc), "di.readdwarf3.ndrw.5var",
+ ML_(dinfo_free),
+ sizeof(UChar*) );
+ vg_assert(varparser.filenameTable);
+ }
+
+ if (VG_(clo_read_inline_info)) {
+ /* filename table for the inlined call parser */
+ vg_assert(!inlparser.filenameTable );
+ inlparser.filenameTable
+ = VG_(newXA)( ML_(dinfo_zalloc), "di.readdwarf3.ndrw.5inl",
+ ML_(dinfo_free),
+ sizeof(UChar*) );
+ vg_assert(inlparser.filenameTable);
+ }
/* Now read the one-and-only top-level DIE for this CU. */
- vg_assert(varparser.sp == 0);
+ vg_assert(!VG_(clo_read_var_info) || varparser.sp == 0);
read_DIE( rangestree,
tyents, tempvars, gexprs,
- &typarser, &varparser,
+ &typarser, &varparser, &inlparser,
&info, td3, &cc, 0 );
cu_offset_now = get_position_of_Cursor( &info );
@@ -4019,18 +4313,27 @@
cu_amount_used = cu_offset_now - cc.cu_start_offset;
}
- /* Preen to level -2. DIEs have level >= 0 so -2 cannot occur
- anywhere else at all. Our fake the-entire-address-space
- range is at level -1, so preening to -2 should completely
- empty the stack out. */
- TRACE_D3("\n");
- varstack_preen( &varparser, td3, -2 );
- /* Similarly, empty the type stack out. */
- typestack_preen( &typarser, td3, -2 );
-
- vg_assert(varparser.filenameTable );
- VG_(deleteXA)( varparser.filenameTable );
- varparser.filenameTable = NULL;
+ if (VG_(clo_read_var_info)) {
+ /* Preen to level -2. DIEs have level >= 0 so -2 cannot occur
+ anywhere else at all. Our fake the-entire-address-space
+ range is at level -1, so preening to -2 should completely
+ empty the stack out. */
+ TRACE_D3("\n");
+ varstack_preen( &varparser, td3, -2 );
+ /* Similarly, empty the type stack out. */
+ typestack_preen( &typarser, td3, -2 );
+ }
+
+ if (VG_(clo_read_var_info)) {
+ vg_assert(varparser.filenameTable );
+ VG_(deleteXA)( varparser.filenameTable );
+ varparser.filenameTable = NULL;
+ vg_assert(inlparser.filenameTable );
+ }
+ if (VG_(clo_read_inline_info)) {
+ VG_(deleteXA)( inlparser.filenameTable );
+ inlparser.filenameTable = NULL;
+ }
clear_CUConst(&cc);
if (cu_offset_now == section_size)
@@ -4039,328 +4342,331 @@
}
}
- /* From here on we're post-processing the stuff we got
- out of the .debug_info section. */
- if (td3) {
- TRACE_D3("\n");
- ML_(pp_TyEnts)(tyents, "Initial type entity (TyEnt) array");
- TRACE_D3("\n");
- TRACE_D3("------ Compressing type entries ------\n");
- }
- tyents_cache = ML_(dinfo_zalloc)( "di.readdwarf3.ndrw.6",
- sizeof(TyEntIndexCache) );
- ML_(TyEntIndexCache__invalidate)( tyents_cache );
- dedup_types( td3, tyents, tyents_cache );
- if (td3) {
- TRACE_D3("\n");
- ML_(pp_TyEnts)(tyents, "After type entity (TyEnt) compression");
- }
+ if (VG_(clo_read_var_info)) {
+ /* From here on we're post-processing the stuff we got
+ out of the .debug_info section. */
+ if (td3) {
+ TRACE_D3("\n");
+ ML_(pp_TyEnts)(tyents, "Initial type entity (TyEnt) array");
+ TRACE_D3("\n");
+ TRACE_D3("------ Compressing type entries ------\n");
+ }
- TRACE_D3("\n");
- TRACE_D3("------ Resolving the types of variables ------\n" );
- resolve_variable_types( barf, tyents, tyents_cache, tempvars );
+ tyents_cache = ML_(dinfo_zalloc)( "di.readdwarf3.ndrw.6",
+ sizeof(TyEntIndexCache) );
+ ML_(TyEntIndexCache__invalidate)( tyents_cache );
+ dedup_types( td3, tyents, tyents_cache );
+ if (td3) {
+ TRACE_D3("\n");
+ ML_(pp_TyEnts)(tyents, "After type entity (TyEnt) compression");
+ }
- /* Copy all the non-INDIR tyents into a new table. For large
- .so's, about 90% of the tyents will by now have been resolved to
- INDIRs, and we no longer need them, and so don't need to store
- them. */
- tyents_to_keep
- = VG_(newXA)( ML_(dinfo_zalloc),
- "di.readdwarf3.ndrw.7 (TyEnt to-keep array)",
- ML_(dinfo_free), sizeof(TyEnt) );
- n = VG_(sizeXA)( tyents );
- for (i = 0; i < n; i++) {
- TyEnt* ent = VG_(indexXA)( tyents, i );
- if (ent->tag != Te_INDIR)
- VG_(addToXA)( tyents_to_keep, ent );
- }
-
- VG_(deleteXA)( tyents );
- tyents = NULL;
- ML_(dinfo_free)( tyents_cache );
- tyents_cache = NULL;
-
- /* Sort tyents_to_keep so we can lookup in it. A complete (if
- minor) waste of time, since tyents itself is sorted, but
- necessary since VG_(lookupXA) refuses to cooperate if we
- don't. */
- VG_(setCmpFnXA)( tyents_to_keep, (XACmpFn_t) ML_(TyEnt__cmp_by_cuOff_only) );
- VG_(sortXA)( tyents_to_keep );
-
- /* Enable cacheing on tyents_to_keep */
- tyents_to_keep_cache
- = ML_(dinfo_zalloc)( "di.readdwarf3.ndrw.8",
- sizeof(TyEntIndexCache) );
- ML_(TyEntIndexCache__invalidate)( tyents_to_keep_cache );
-
- /* And record the tyents in the DebugInfo. We do this before
- starting to hand variables to ML_(addVar), since if ML_(addVar)
- wants to do debug printing (of the types of said vars) then it
- will need the tyents.*/
- vg_assert(!di->admin_tyents);
- di->admin_tyents = tyents_to_keep;
+ TRACE_D3("\n");
+ TRACE_D3("------ Resolving the types of variables ------\n" );
+ resolve_variable_types( barf, tyents, tyents_cache, tempvars );
- /* Bias all the location expressions. */
- TRACE_D3("\n");
- TRACE_D3("------ Biasing the location expressions ------\n" );
+ /* Copy all the non-INDIR tyents into a new table. For large
+ .so's, about 90% of the tyents will by now have been resolved to
+ INDIRs, and we no longer need them, and so don't need to store
+ them. */
+ tyents_to_keep
+ = VG_(newXA)( ML_(dinfo_zalloc),
+ "di.readdwarf3.ndrw.7 (TyEnt to-keep array)",
+ ML_(dinfo_free), sizeof(TyEnt) );
+ n = VG_(sizeXA)( tyents );
+ for (i = 0; i < n; i++) {
+ TyEnt* ent = VG_(indexXA)( tyents, i );
+ if (ent->tag != Te_INDIR)
+ VG_(addToXA)( tyents_to_keep, ent );
+ }
+
+ VG_(deleteXA)( tyents );
+ tyents = NULL;
+ ML_(dinfo_free)( tyents_cache );
+ tyents_cache = NULL;
+
+ /* Sort tyents_to_keep so we can lookup in it. A complete (if
+ ...
[truncated message content] |
|
From: <sv...@va...> - 2014-06-15 10:51:36
|
Author: philippe
Date: Sun Jun 15 10:51:14 2014
New Revision: 14035
Log:
Improve performance of dwarf3 reader using a hashtable of parsed abbreviations
For each DIE, the dwarf3 reader must know which data elements to read.
These elements are described by an abbreviation.
Re-reading these abbreviations for each DIE is costly as
the location of the needed abbreviation is found by scanning the full
abbv section, which is very costly.
(A small cache of 32 abbv offsets in the abbv section somewhat decreases
the cost, but reading the abbvs is still a hot spot, in particular for
big debug informations).
This patch:
* adds an hash table of parsed abbreviations
* all abbreviations for a CU are read in one single scan of the abbv
section, when the CU header is read
So, with the patch, the di image is not accessed anymore for reading the abbvs
after the CU header parsing.
On a big executable, --read-var-info=yes user cpu changes from
trunk: 320 seconds
to
abbv cache: 270 seconds
This further improves on a previous (not committed) abbv cache that
was just caching up to 513 entries in the abbv pos cache and populating
the cache with an initial scan. The user cpu for this version was 285 seconds.
NB: this is some work in anticipation of a following patch that
will add reading dwarf3 inlined information, with the hope to make
this reading fast enough to activate it by default.
Note: on the examples I looked at, all abbreviations were numbered starting
from 1, with no holes. If that would always be the case, then one could use
an xarray of parsed abbreviations rather than an hash table. However,
I found nothing in the dwarf standard that guarantees that abbreviations
are numbered from 1. So, the hash table.
Modified:
trunk/coregrind/m_debuginfo/readdwarf3.c
Modified: trunk/coregrind/m_debuginfo/readdwarf3.c
==============================================================================
--- trunk/coregrind/m_debuginfo/readdwarf3.c (original)
+++ trunk/coregrind/m_debuginfo/readdwarf3.c Sun Jun 15 10:51:14 2014
@@ -377,7 +377,22 @@
/*--- ---*/
/*------------------------------------------------------------*/
-#define N_ABBV_CACHE 32
+typedef
+ struct _name_form {
+ ULong at_name;
+ ULong at_form;
+ } name_form;
+
+typedef
+ struct _g_abbv {
+ struct _g_abbv *next; // read/write by hash table.
+ UWord abbv_code; // key, read by hash table
+ ULong atag;
+ ULong has_children;
+ name_form nf[0];
+ /* Variable-length array of name/form pairs, terminated
+ by a 0/0 pair. */
+ } g_abbv;
/* Holds information that is constant through the parsing of a
Compilation Unit. This is basically plumbed through to
@@ -429,11 +444,8 @@
UWord alt_cuOff_bias;
/* --- Needed so we can add stuff to the string table. --- */
struct _DebugInfo* di;
- /* --- a cache for set_abbv_Cursor --- */
- /* abbv_code == (ULong)-1 for an unused entry. */
- struct { ULong abbv_code; UWord posn; } saC_cache[N_ABBV_CACHE];
- UWord saC_cache_queries;
- UWord saC_cache_misses;
+ /* --- a hash table of g_abbv (i.e. parsed abbreviations) --- */
+ VgHashTable ht_abbvs;
/* True if this came from .debug_types; otherwise it came from
.debug_info. */
@@ -852,6 +864,84 @@
return xa;
}
+/* Initialises the hash table of abbreviations.
+ We do a single scan of the abbv slice to parse and
+ build all abbreviations, for the following reasons:
+ * all or most abbreviations will be needed in any case
+ (at least for var-info reading).
+ * re-reading each time an abbreviation causes a lot of calls
+ to get_ULEB128.
+ * a CU should not have many abbreviations. */
+static void init_ht_abbvs (CUConst* cc,
+ Bool td3)
+{
+ Cursor c;
+ g_abbv *ta; // temporary abbreviation, reallocated if needed.
+ UInt ta_nf_maxE; // max nr of pairs in ta.nf[], doubled when reallocated.
+ UInt ta_nf_n; // nr of pairs in ta->nf that are initialised.
+ g_abbv *ht_ta; // abbv to insert in hash table.
+
+ #define SZ_G_ABBV(_nf_szE) (sizeof(g_abbv) + _nf_szE * sizeof(name_form))
+
+ ta_nf_maxE = 10; // starting with enough for 9 pairs+terminating pair.
+ ta = ML_(dinfo_zalloc) ("di.readdwarf3.ht_ta_nf", SZ_G_ABBV(ta_nf_maxE));
+ cc->ht_abbvs = VG_(HT_construct) ("di.readdwarf3.ht_abbvs");
+
+ init_Cursor( &c, cc->debug_abbv, 0, cc->barf,
+ "Overrun whilst parsing .debug_abbrev section(2)" );
+ while (True) {
+ ta->abbv_code = get_ULEB128( &c );
+ if (ta->abbv_code == 0) break; /* end of the table */
+
+ ta->atag = get_ULEB128( &c );
+ ta->has_children = get_UChar( &c );
+ ta_nf_n = 0;
+ while (True) {
+ if (ta_nf_n >= ta_nf_maxE) {
+ g_abbv *old_ta = ta;
+ ta = ML_(dinfo_zalloc) ("di.readdwarf3.ht_ta_nf",
+ SZ_G_ABBV(2 * ta_nf_maxE));
+ ta_nf_maxE = 2 * ta_nf_maxE;
+ VG_(memcpy) (ta, old_ta, SZ_G_ABBV(ta_nf_n));
+ ML_(dinfo_free) (old_ta);
+ }
+ ta->nf[ta_nf_n].at_name = get_ULEB128( &c );
+ ta->nf[ta_nf_n].at_form = get_ULEB128( &c );
+ if (ta->nf[ta_nf_n].at_name == 0 && ta->nf[ta_nf_n].at_form == 0) {
+ ta_nf_n++;
+ break;
+ }
+ ta_nf_n++;
+ }
+ ht_ta = ML_(dinfo_zalloc) ("di.readdwarf3.ht_ta", SZ_G_ABBV(ta_nf_n));
+ VG_(memcpy) (ht_ta, ta, SZ_G_ABBV(ta_nf_n));
+ VG_(HT_add_node) ( cc->ht_abbvs, ht_ta );
+ TRACE_D3(" Adding abbv_code %llu TAG %s [%s] nf %d\n",
+ (ULong) ht_ta->abbv_code, ML_(pp_DW_TAG)(ht_ta->atag),
+ ML_(pp_DW_children)(ht_ta->has_children),
+ ta_nf_n);
+ }
+
+ ML_(dinfo_free) (ta);
+ #undef SZ_G_ABBV
+}
+
+static g_abbv* get_abbv (CUConst* cc, ULong abbv_code)
+{
+ g_abbv *abbv;
+
+ abbv = VG_(HT_lookup) (cc->ht_abbvs, abbv_code);
+ if (!abbv)
+ cc->barf ("abbv_code not found in ht_abbvs table");
+ return abbv;
+}
+
+/* Free the memory allocated in CUConst. */
+static void clear_CUConst (CUConst* cc)
+{
+ VG_(HT_destruct) ( cc->ht_abbvs, ML_(dinfo_free));
+ cc->ht_abbvs = NULL;
+}
/* Parse the Compilation Unit header indicated at 'c' and
initialise 'cc' accordingly. */
@@ -865,7 +955,6 @@
{
UChar address_size;
ULong debug_abbrev_offset;
- Int i;
VG_(memset)(cc, 0, sizeof(*cc));
vg_assert(c && c->barf);
@@ -923,105 +1012,7 @@
cc->debug_abbv.ioff += debug_abbrev_offset;
cc->debug_abbv.szB -= debug_abbrev_offset;
- /* and empty out the set_abbv_Cursor cache */
- if (0) VG_(printf)("XXXXXX initialise set_abbv_Cursor cache\n");
- for (i = 0; i < N_ABBV_CACHE; i++) {
- cc->saC_cache[i].abbv_code = (ULong)-1; /* unused */
- cc->saC_cache[i].posn = 0;
- }
- cc->saC_cache_queries = 0;
- cc->saC_cache_misses = 0;
-}
-
-
-/* Set up 'c' so it is ready to parse the abbv table entry code
- 'abbv_code' for this compilation unit. */
-static __attribute__((noinline))
-void set_abbv_Cursor ( /*OUT*/Cursor* c, Bool td3,
- CUConst* cc, ULong abbv_code )
-{
- Int i;
- ULong acode;
-
- if (abbv_code == 0)
- cc->barf("set_abbv_Cursor: abbv_code == 0" );
-
- /* (ULong)-1 is used to represent an empty cache slot. So we can't
- allow it. In any case no valid DWARF3 should make a reference
- to a negative abbreviation code. [at least, they always seem to
- be numbered upwards from zero as far as I have seen] */
- vg_assert(abbv_code != (ULong)-1);
-
- /* First search the cache. */
- if (0) VG_(printf)("XXXXXX search set_abbv_Cursor cache\n");
- cc->saC_cache_queries++;
- for (i = 0; i < N_ABBV_CACHE; i++) {
- /* No need to test the cached abbv_codes for -1 (empty), since
- we just asserted that abbv_code is not -1. */
- if (LIKELY(cc->saC_cache[i].abbv_code == abbv_code)) {
- /* Found it. Set up the parser using the cached position,
- and move this cache entry to the front. */
- if (0) VG_(printf)("XXXXXX found in set_abbv_Cursor cache\n");
- init_Cursor( c, cc->debug_abbv, cc->saC_cache[i].posn,
- cc->barf,
- "Overrun whilst parsing .debug_abbrev section(1)" );
- if (i > 0) {
- ULong t_abbv_code = cc->saC_cache[i].abbv_code;
- UWord t_posn = cc->saC_cache[i].posn;
- while (i > 0) {
- cc->saC_cache[i] = cc->saC_cache[i-1];
- i--;
- }
- cc->saC_cache[0].abbv_code = t_abbv_code;
- cc->saC_cache[0].posn = t_posn;
- }
- return;
- }
- }
-
- /* No. It's not in the cache. We have to search through
- .debug_abbrev, of course taking care to update the cache
- when done. */
-
- cc->saC_cache_misses++;
- init_Cursor( c, cc->debug_abbv, 0, cc->barf,
- "Overrun whilst parsing .debug_abbrev section(2)" );
-
- /* Now iterate though the table until we find the requested
- entry. */
- while (True) {
- //ULong atag;
- //UInt has_children;
- acode = get_ULEB128( c );
- if (acode == 0) break; /* end of the table */
- if (acode == abbv_code) break; /* found it */
- /*atag = */ get_ULEB128( c );
- /*has_children = */ get_UChar( c );
- //TRACE_D3(" %llu %s [%s]\n",
- // acode, pp_DW_TAG(atag), pp_DW_children(has_children));
- while (True) {
- ULong at_name = get_ULEB128( c );
- ULong at_form = get_ULEB128( c );
- if (at_name == 0 && at_form == 0) break;
- //TRACE_D3(" %18s %s\n",
- // pp_DW_AT(at_name), pp_DW_FORM(at_form));
- }
- }
-
- if (acode == 0) {
- /* Not found. This is fatal. */
- cc->barf("set_abbv_Cursor: abbv_code not found");
- }
-
- /* Otherwise, 'c' is now set correctly to parse the relevant entry,
- starting from the abbreviation entry's tag. So just cache
- the result, and return. */
- for (i = N_ABBV_CACHE-1; i > N_ABBV_CACHE/2; i--) {
- cc->saC_cache[i] = cc->saC_cache[i-1];
- }
- if (0) VG_(printf)("XXXXXX update set_abbv_Cursor cache\n");
- cc->saC_cache[N_ABBV_CACHE/2].abbv_code = abbv_code;
- cc->saC_cache[N_ABBV_CACHE/2].posn = get_position_of_Cursor(c);
+ init_ht_abbvs(cc, td3);
}
/* This represents a single signatured type. It maps a type signature
@@ -1655,15 +1646,15 @@
UWord posn,
Int level,
Cursor* c_die,
- Cursor* c_abbv,
+ g_abbv *abbv,
CUConst* cc,
Bool td3
)
{
FormContents cts;
+ UInt nf_i;
UWord saved_die_c_offset = get_position_of_Cursor( c_die );
- UWord saved_abbv_c_offset = get_position_of_Cursor( c_abbv );
Bool debug_types_flag;
Bool alt_flag;
@@ -1679,9 +1670,11 @@
Addr ip_lo = 0;
Addr ip_hi1 = 0;
Addr rangeoff = 0;
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
if (attr == DW_AT_low_pc && cts.szB > 0) {
@@ -1802,9 +1795,11 @@
Addr rangeoff = 0;
Bool isFunc = dtag == DW_TAG_subprogram;
GExpr* fbGX = NULL;
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
if (attr == DW_AT_low_pc && cts.szB > 0) {
@@ -1886,9 +1881,11 @@
UWord abs_ori = (UWord)D3_INVALID_CUOFF;
Int lineNo = 0;
HChar* fileName = NULL;
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
n_attrs++;
@@ -2140,7 +2137,6 @@
bad_DIE:
set_position_of_Cursor( c_die, saved_die_c_offset );
- set_position_of_Cursor( c_abbv, saved_abbv_c_offset );
posn = uncook_die( cc, posn, &debug_types_flag, &alt_flag );
VG_(printf)(" <%d><%lx>: %s", level, posn, ML_(pp_DW_TAG)( dtag ) );
if (debug_types_flag) {
@@ -2150,9 +2146,11 @@
VG_(printf)(" (in alternate .debug_info)");
}
VG_(printf)("\n");
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
VG_(printf)(" %18s: ", ML_(pp_DW_AT)(attr));
/* Get the form contents, so as to print them */
@@ -2286,8 +2284,8 @@
/* Parse a type-related DIE. 'parser' holds the current parser state.
'admin' is where the completed types are dumped. 'dtag' is the tag
for this DIE. 'c_die' points to the start of the data fields (FORM
- stuff) for the DIE. c_abbv points to the start of the (name,form)
- pairs which describe the DIE.
+ stuff) for the DIE. abbv is the parsed abbreviation which describe
+ the DIE.
We may find the DIE uninteresting, in which case we should ignore
it.
@@ -2317,7 +2315,7 @@
UWord posn,
Int level,
Cursor* c_die,
- Cursor* c_abbv,
+ g_abbv *abbv,
CUConst* cc,
Bool td3 )
{
@@ -2328,9 +2326,9 @@
TyEnt boundE;
Bool debug_types_flag;
Bool alt_flag;
+ UInt nf_i;
UWord saved_die_c_offset = get_position_of_Cursor( c_die );
- UWord saved_abbv_c_offset = get_position_of_Cursor( c_abbv );
VG_(memset)( &typeE, 0xAA, sizeof(typeE) );
VG_(memset)( &atomE, 0xAA, sizeof(atomE) );
@@ -2348,9 +2346,11 @@
/* See if we can find DW_AT_language, since it is important for
establishing array bounds (see DW_TAG_subrange_type below in
this fn) */
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
if (attr != DW_AT_language)
@@ -2386,9 +2386,11 @@
VG_(memset)(&typeE, 0, sizeof(typeE));
typeE.cuOff = D3_INVALID_CUOFF;
typeE.tag = Te_TyBase;
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
if (attr == DW_AT_name && cts.szB < 0) {
@@ -2495,9 +2497,11 @@
same size as that on the machine. gcc appears to give a size
whereas icc9 doesn't. */
typeE.Te.TyPorR.szB = sizeof(UWord);
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
if (attr == DW_AT_byte_size && cts.szB > 0) {
@@ -2525,9 +2529,11 @@
= VG_(newXA)( ML_(dinfo_zalloc), "di.readdwarf3.ptD.enum_type.1",
ML_(dinfo_free),
sizeof(UWord) );
+ nf_i=0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
if (attr == DW_AT_name && cts.szB < 0) {
@@ -2604,9 +2610,11 @@
VG_(memset)( &atomE, 0, sizeof(atomE) );
atomE.cuOff = posn;
atomE.tag = Te_Atom;
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
if (attr == DW_AT_name && cts.szB < 0) {
@@ -2657,9 +2665,11 @@
typeE.Te.TyStOrUn.complete = True;
typeE.Te.TyStOrUn.isStruct = dtag == DW_TAG_structure_type
|| dtag == DW_TAG_class_type;
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
if (attr == DW_AT_name && cts.szB < 0) {
@@ -2742,9 +2752,11 @@
fieldE.cuOff = posn;
fieldE.tag = Te_Field;
fieldE.Te.Field.typeR = D3_INVALID_CUOFF;
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
if (attr == DW_AT_name && cts.szB < 0) {
@@ -2828,9 +2840,11 @@
= VG_(newXA)( ML_(dinfo_zalloc), "di.readdwarf3.ptD.array_type.1",
ML_(dinfo_free),
sizeof(UWord) );
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
if (attr == DW_AT_type && cts.szB > 0) {
@@ -2866,9 +2880,11 @@
VG_(memset)( &boundE, 0, sizeof(boundE) );
boundE.cuOff = D3_INVALID_CUOFF;
boundE.tag = Te_Bound;
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
if (attr == DW_AT_lower_bound && cts.szB > 0) {
@@ -2945,9 +2961,11 @@
typeE.tag = Te_TyTyDef;
typeE.Te.TyTyDef.name = NULL;
typeE.Te.TyTyDef.typeR = D3_INVALID_CUOFF;
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
if (attr == DW_AT_name && cts.szB < 0) {
@@ -2991,9 +3009,11 @@
= dtag == DW_TAG_volatile_type ? 'V' : 'C';
/* target type defaults to 'void' */
typeE.Te.TyQual.typeR = D3_FAKEVOID_CUOFF;
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
get_Form_contents( &cts, cc, c_die, False/*td3*/, form );
if (attr == DW_AT_type && cts.szB > 0) {
@@ -3076,7 +3096,6 @@
bad_DIE:
set_position_of_Cursor( c_die, saved_die_c_offset );
- set_position_of_Cursor( c_abbv, saved_abbv_c_offset );
posn = uncook_die( cc, posn, &debug_types_flag, &alt_flag );
VG_(printf)(" <%d><%lx>: %s", level, posn, ML_(pp_DW_TAG)( dtag ) );
if (debug_types_flag) {
@@ -3085,9 +3104,11 @@
VG_(printf)(" (in alternate .debug_info)");
}
VG_(printf)("\n");
+ nf_i = 0;
while (True) {
- DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
- DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
+ DW_AT attr = (DW_AT) abbv->nf[nf_i].at_name;
+ DW_FORM form = (DW_FORM)abbv->nf[nf_i].at_form;
+ nf_i++;
if (attr == 0 && form == 0) break;
VG_(printf)(" %18s: ", ML_(pp_DW_AT)(attr));
/* Get the form contents, so as to print them */
@@ -3445,18 +3466,19 @@
Cursor* c, Bool td3, CUConst* cc, Int level
)
{
- Cursor abbv;
+ g_abbv *abbv;
ULong atag, abbv_code;
+ UInt nf_i;
UWord posn;
UInt has_children;
- UWord start_die_c_offset, start_abbv_c_offset;
- UWord after_die_c_offset, after_abbv_c_offset;
+ UWord start_die_c_offset;
+ UWord after_die_c_offset;
/* --- Deal with this DIE --- */
posn = cook_die( cc, get_position_of_Cursor( c ) );
abbv_code = get_ULEB128( c );
- set_abbv_Cursor( &abbv, td3, cc, abbv_code );
- atag = get_ULEB128( &abbv );
+ abbv = get_abbv(cc, abbv_code);
+ atag = abbv->atag;
TRACE_D3("\n");
TRACE_D3(" <%d><%lx>: Abbrev Number: %llu (%s)\n",
level, posn, abbv_code, ML_(pp_DW_TAG)( atag ) );
@@ -3464,7 +3486,7 @@
if (atag == 0)
cc->barf("read_DIE: invalid zero tag on DIE");
- has_children = get_UChar( &abbv );
+ has_children = abbv->has_children;
if (has_children != DW_children_no && has_children != DW_children_yes)
cc->barf("read_DIE: invalid has_children value");
@@ -3475,12 +3497,13 @@
the DIE, to print out its contents. */
start_die_c_offset = get_position_of_Cursor( c );
- start_abbv_c_offset = get_position_of_Cursor( &abbv );
+ nf_i = 0;
while (True) {
FormContents cts;
- ULong at_name = get_ULEB128( &abbv );
- ULong at_form = get_ULEB128( &abbv );
+ ULong at_name = abbv->nf[nf_i].at_name;
+ ULong at_form = abbv->nf[nf_i].at_form;
+ nf_i++;
if (at_name == 0 && at_form == 0) break;
TRACE_D3(" %18s: ", ML_(pp_DW_AT)(at_name));
/* Get the form contents, but ignore them; the only purpose is
@@ -3491,10 +3514,8 @@
}
after_die_c_offset = get_position_of_Cursor( c );
- after_abbv_c_offset = get_position_of_Cursor( &abbv );
set_position_of_Cursor( c, start_die_c_offset );
- set_position_of_Cursor( &abbv, start_abbv_c_offset );
parse_type_DIE( tyents,
typarser,
@@ -3502,12 +3523,11 @@
posn,
level,
c, /* DIE cursor */
- &abbv, /* abbrev cursor */
+ abbv, /* abbrev */
cc,
td3 );
set_position_of_Cursor( c, start_die_c_offset );
- set_position_of_Cursor( &abbv, start_abbv_c_offset );
parse_var_DIE( rangestree,
tempvars,
@@ -3517,12 +3537,11 @@
posn,
level,
c, /* DIE cursor */
- &abbv, /* abbrev cursor */
+ abbv, /* abbrev */
cc,
td3 );
set_position_of_Cursor( c, after_die_c_offset );
- set_position_of_Cursor( &abbv, after_abbv_c_offset );
/* --- Now recurse into its children, if any --- */
if (has_children == DW_children_yes) {
@@ -3792,8 +3811,7 @@
cu_start_offset = get_position_of_Cursor( &info );
TRACE_D3("\n");
TRACE_D3(" Compilation Unit @ offset 0x%lx:\n", cu_start_offset);
- /* parse_CU_header initialises the CU's set_abbv_Cursor cache
- (saC_cache) */
+ /* parse_CU_header initialises the CU's abbv hash table. */
parse_CU_Header( &cc, td3, &info, escn_debug_abbv, True, False );
/* Needed by cook_die. */
@@ -3808,8 +3826,10 @@
cu_offset_now = (cu_start_offset + cc.unit_length
+ (cc.is_dw64 ? 12 : 4));
- if (cu_offset_now >= escn_debug_types.szB)
+ if (cu_offset_now >= escn_debug_types.szB) {
+ clear_CUConst ( &cc);
break;
+ }
set_position_of_Cursor ( &info, cu_offset_now );
}
@@ -4008,12 +4028,10 @@
/* Similarly, empty the type stack out. */
typestack_preen( &typarser, td3, -2 );
- TRACE_D3("set_abbv_Cursor cache: %lu queries, %lu misses\n",
- cc.saC_cache_queries, cc.saC_cache_misses);
-
vg_assert(varparser.filenameTable );
VG_(deleteXA)( varparser.filenameTable );
varparser.filenameTable = NULL;
+ clear_CUConst(&cc);
if (cu_offset_now == section_size)
break;
|
|
From: <sv...@va...> - 2014-06-15 08:18:03
|
Author: sewardj
Date: Sun Jun 15 08:17:35 2014
New Revision: 2876
Log:
Remove temporary front end scaffolding for Cat{Even,Odd}Lanes
and Interleave{LO,HI} operations, and instead generate real
UZP1/UZP2/ZIP1/ZIP2 instructions in the back end.
Modified:
trunk/priv/guest_arm64_toIR.c
trunk/priv/host_arm64_defs.c
trunk/priv/host_arm64_defs.h
trunk/priv/host_arm64_isel.c
Modified: trunk/priv/guest_arm64_toIR.c
==============================================================================
--- trunk/priv/guest_arm64_toIR.c (original)
+++ trunk/priv/guest_arm64_toIR.c Sun Jun 15 08:17:35 2014
@@ -4949,25 +4949,85 @@
/*--- SIMD and FP instructions ---*/
/*------------------------------------------------------------*/
-/* begin FIXME -- rm temp scaffolding */
-static IRExpr* mk_CatEvenLanes64x2 ( IRTemp, IRTemp );
-static IRExpr* mk_CatOddLanes64x2 ( IRTemp, IRTemp );
-
-static IRExpr* mk_CatEvenLanes32x4 ( IRTemp, IRTemp );
-static IRExpr* mk_CatOddLanes32x4 ( IRTemp, IRTemp );
-static IRExpr* mk_InterleaveLO32x4 ( IRTemp, IRTemp );
-static IRExpr* mk_InterleaveHI32x4 ( IRTemp, IRTemp );
-
-static IRExpr* mk_CatEvenLanes16x8 ( IRTemp, IRTemp );
-static IRExpr* mk_CatOddLanes16x8 ( IRTemp, IRTemp );
-static IRExpr* mk_InterleaveLO16x8 ( IRTemp, IRTemp );
-static IRExpr* mk_InterleaveHI16x8 ( IRTemp, IRTemp );
-
-static IRExpr* mk_CatEvenLanes8x16 ( IRTemp, IRTemp );
-static IRExpr* mk_CatOddLanes8x16 ( IRTemp, IRTemp );
-static IRExpr* mk_InterleaveLO8x16 ( IRTemp, IRTemp );
-static IRExpr* mk_InterleaveHI8x16 ( IRTemp, IRTemp );
-/* end FIXME -- rm temp scaffolding */
+/* Some constructors for interleave/deinterleave expressions. */
+
+static IRExpr* mk_CatEvenLanes64x2 ( IRTemp a10, IRTemp b10 ) {
+ // returns a0 b0
+ return binop(Iop_InterleaveLO64x2, mkexpr(a10), mkexpr(b10));
+}
+
+static IRExpr* mk_CatOddLanes64x2 ( IRTemp a10, IRTemp b10 ) {
+ // returns a1 b1
+ return binop(Iop_InterleaveHI64x2, mkexpr(a10), mkexpr(b10));
+}
+
+static IRExpr* mk_CatEvenLanes32x4 ( IRTemp a3210, IRTemp b3210 ) {
+ // returns a2 a0 b2 b0
+ return binop(Iop_CatEvenLanes32x4, mkexpr(a3210), mkexpr(b3210));
+}
+
+static IRExpr* mk_CatOddLanes32x4 ( IRTemp a3210, IRTemp b3210 ) {
+ // returns a3 a1 b3 b1
+ return binop(Iop_CatOddLanes32x4, mkexpr(a3210), mkexpr(b3210));
+}
+
+static IRExpr* mk_InterleaveLO32x4 ( IRTemp a3210, IRTemp b3210 ) {
+ // returns a1 b1 a0 b0
+ return binop(Iop_InterleaveLO32x4, mkexpr(a3210), mkexpr(b3210));
+}
+
+static IRExpr* mk_InterleaveHI32x4 ( IRTemp a3210, IRTemp b3210 ) {
+ // returns a3 b3 a2 b2
+ return binop(Iop_InterleaveHI32x4, mkexpr(a3210), mkexpr(b3210));
+}
+
+static IRExpr* mk_CatEvenLanes16x8 ( IRTemp a76543210, IRTemp b76543210 ) {
+ // returns a6 a4 a2 a0 b6 b4 b2 b0
+ return binop(Iop_CatEvenLanes16x8, mkexpr(a76543210), mkexpr(b76543210));
+}
+
+static IRExpr* mk_CatOddLanes16x8 ( IRTemp a76543210, IRTemp b76543210 ) {
+ // returns a7 a5 a3 a1 b7 b5 b3 b1
+ return binop(Iop_CatOddLanes16x8, mkexpr(a76543210), mkexpr(b76543210));
+}
+
+static IRExpr* mk_InterleaveLO16x8 ( IRTemp a76543210, IRTemp b76543210 ) {
+ // returns a3 b3 a2 b2 a1 b1 a0 b0
+ return binop(Iop_InterleaveLO16x8, mkexpr(a76543210), mkexpr(b76543210));
+}
+
+static IRExpr* mk_InterleaveHI16x8 ( IRTemp a76543210, IRTemp b76543210 ) {
+ // returns a7 b7 a6 b6 a5 b5 a4 b4
+ return binop(Iop_InterleaveHI16x8, mkexpr(a76543210), mkexpr(b76543210));
+}
+
+static IRExpr* mk_CatEvenLanes8x16 ( IRTemp aFEDCBA9876543210,
+ IRTemp bFEDCBA9876543210 ) {
+ // returns aE aC aA a8 a6 a4 a2 a0 bE bC bA b8 b6 b4 b2 b0
+ return binop(Iop_CatEvenLanes8x16, mkexpr(aFEDCBA9876543210),
+ mkexpr(bFEDCBA9876543210));
+}
+
+static IRExpr* mk_CatOddLanes8x16 ( IRTemp aFEDCBA9876543210,
+ IRTemp bFEDCBA9876543210 ) {
+ // returns aF aD aB a9 a7 a5 a3 a1 bF bD bB b9 b7 b5 b3 b1
+ return binop(Iop_CatOddLanes8x16, mkexpr(aFEDCBA9876543210),
+ mkexpr(bFEDCBA9876543210));
+}
+
+static IRExpr* mk_InterleaveLO8x16 ( IRTemp aFEDCBA9876543210,
+ IRTemp bFEDCBA9876543210 ) {
+ // returns a7 b7 a6 b6 a5 b5 a4 b4 a3 b3 a2 b2 a1 b1 a0 b0
+ return binop(Iop_InterleaveLO8x16, mkexpr(aFEDCBA9876543210),
+ mkexpr(bFEDCBA9876543210));
+}
+
+static IRExpr* mk_InterleaveHI8x16 ( IRTemp aFEDCBA9876543210,
+ IRTemp bFEDCBA9876543210 ) {
+ // returns aF bF aE bE aD bD aC bC aB bB aA bA a9 b9 a8 b8
+ return binop(Iop_InterleaveHI8x16, mkexpr(aFEDCBA9876543210),
+ mkexpr(bFEDCBA9876543210));
+}
/* Generate N copies of |bit| in the bottom of a ULong. */
static ULong Replicate ( ULong bit, Int N )
@@ -7999,441 +8059,6 @@
return dres;
}
-////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////
-
-/* Spare code for doing reference implementations of various 128-bit
- SIMD interleaves/deinterleaves/concatenation ops. For 64-bit
- equivalents see the end of guest_arm_toIR.c. */
-
-////////////////////////////////////////////////////////////////
-// 64x2 operations
-//
-static IRExpr* mk_CatEvenLanes64x2 ( IRTemp a10, IRTemp b10 )
-{
- // returns a0 b0
- return binop(Iop_64HLtoV128, unop(Iop_V128to64, mkexpr(a10)),
- unop(Iop_V128to64, mkexpr(b10)));
-}
-
-static IRExpr* mk_CatOddLanes64x2 ( IRTemp a10, IRTemp b10 )
-{
- // returns a1 b1
- return binop(Iop_64HLtoV128, unop(Iop_V128HIto64, mkexpr(a10)),
- unop(Iop_V128HIto64, mkexpr(b10)));
-}
-
-
-////////////////////////////////////////////////////////////////
-// 32x4 operations
-//
-
-// Split a 128 bit value into 4 32 bit ones, in 64-bit IRTemps with
-// the top halves guaranteed to be zero.
-static void breakV128to32s ( IRTemp* out3, IRTemp* out2, IRTemp* out1,
- IRTemp* out0, IRTemp v128 )
-{
- if (out3) *out3 = newTemp(Ity_I64);
- if (out2) *out2 = newTemp(Ity_I64);
- if (out1) *out1 = newTemp(Ity_I64);
- if (out0) *out0 = newTemp(Ity_I64);
- IRTemp hi64 = newTemp(Ity_I64);
- IRTemp lo64 = newTemp(Ity_I64);
- assign(hi64, unop(Iop_V128HIto64, mkexpr(v128)) );
- assign(lo64, unop(Iop_V128to64, mkexpr(v128)) );
- if (out3) assign(*out3, binop(Iop_Shr64, mkexpr(hi64), mkU8(32)));
- if (out2) assign(*out2, binop(Iop_And64, mkexpr(hi64), mkU64(0xFFFFFFFF)));
- if (out1) assign(*out1, binop(Iop_Shr64, mkexpr(lo64), mkU8(32)));
- if (out0) assign(*out0, binop(Iop_And64, mkexpr(lo64), mkU64(0xFFFFFFFF)));
-}
-
-// Make a V128 bit value from 4 32 bit ones, each of which is in a 64 bit
-// IRTemp.
-static IRTemp mkV128from32s ( IRTemp in3, IRTemp in2, IRTemp in1, IRTemp in0 )
-{
- IRTemp hi64 = newTemp(Ity_I64);
- IRTemp lo64 = newTemp(Ity_I64);
- assign(hi64,
- binop(Iop_Or64,
- binop(Iop_Shl64, mkexpr(in3), mkU8(32)),
- binop(Iop_And64, mkexpr(in2), mkU64(0xFFFFFFFF))));
- assign(lo64,
- binop(Iop_Or64,
- binop(Iop_Shl64, mkexpr(in1), mkU8(32)),
- binop(Iop_And64, mkexpr(in0), mkU64(0xFFFFFFFF))));
- IRTemp res = newTemp(Ity_V128);
- assign(res, binop(Iop_64HLtoV128, mkexpr(hi64), mkexpr(lo64)));
- return res;
-}
-
-static IRExpr* mk_CatEvenLanes32x4 ( IRTemp a3210, IRTemp b3210 )
-{
- // returns a2 a0 b2 b0
- IRTemp a2, a0, b2, b0;
- breakV128to32s(NULL, &a2, NULL, &a0, a3210);
- breakV128to32s(NULL, &b2, NULL, &b0, b3210);
- return mkexpr(mkV128from32s(a2, a0, b2, b0));
-}
-
-static IRExpr* mk_CatOddLanes32x4 ( IRTemp a3210, IRTemp b3210 )
-{
- // returns a3 a1 b3 b1
- IRTemp a3, a1, b3, b1;
- breakV128to32s(&a3, NULL, &a1, NULL, a3210);
- breakV128to32s(&b3, NULL, &b1, NULL, b3210);
- return mkexpr(mkV128from32s(a3, a1, b3, b1));
-}
-
-static IRExpr* mk_InterleaveLO32x4 ( IRTemp a3210, IRTemp b3210 )
-{
- // returns a1 b1 a0 b0
- IRTemp a1, a0, b1, b0;
- breakV128to32s(NULL, NULL, &a1, &a0, a3210);
- breakV128to32s(NULL, NULL, &b1, &b0, b3210);
- return mkexpr(mkV128from32s(a1, b1, a0, b0));
-}
-
-static IRExpr* mk_InterleaveHI32x4 ( IRTemp a3210, IRTemp b3210 )
-{
- // returns a3 b3 a2 b2
- IRTemp a3, a2, b3, b2;
- breakV128to32s(&a3, &a2, NULL, NULL, a3210);
- breakV128to32s(&b3, &b2, NULL, NULL, b3210);
- return mkexpr(mkV128from32s(a3, b3, a2, b2));
-}
-
-////////////////////////////////////////////////////////////////
-// 16x8 operations
-//
-
-static void breakV128to16s ( IRTemp* out7, IRTemp* out6, IRTemp* out5,
- IRTemp* out4, IRTemp* out3, IRTemp* out2,
- IRTemp* out1,IRTemp* out0, IRTemp v128 )
-{
- if (out7) *out7 = newTemp(Ity_I64);
- if (out6) *out6 = newTemp(Ity_I64);
- if (out5) *out5 = newTemp(Ity_I64);
- if (out4) *out4 = newTemp(Ity_I64);
- if (out3) *out3 = newTemp(Ity_I64);
- if (out2) *out2 = newTemp(Ity_I64);
- if (out1) *out1 = newTemp(Ity_I64);
- if (out0) *out0 = newTemp(Ity_I64);
- IRTemp hi64 = newTemp(Ity_I64);
- IRTemp lo64 = newTemp(Ity_I64);
- assign(hi64, unop(Iop_V128HIto64, mkexpr(v128)) );
- assign(lo64, unop(Iop_V128to64, mkexpr(v128)) );
- if (out7)
- assign(*out7, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(hi64), mkU8(48)),
- mkU64(0xFFFF)));
- if (out6)
- assign(*out6, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(hi64), mkU8(32)),
- mkU64(0xFFFF)));
- if (out5)
- assign(*out5, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(hi64), mkU8(16)),
- mkU64(0xFFFF)));
- if (out4)
- assign(*out4, binop(Iop_And64, mkexpr(hi64), mkU64(0xFFFF)));
- if (out3)
- assign(*out3, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(lo64), mkU8(48)),
- mkU64(0xFFFF)));
- if (out2)
- assign(*out2, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(lo64), mkU8(32)),
- mkU64(0xFFFF)));
- if (out1)
- assign(*out1, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(lo64), mkU8(16)),
- mkU64(0xFFFF)));
- if (out0)
- assign(*out0, binop(Iop_And64, mkexpr(lo64), mkU64(0xFFFF)));
-}
-
-static IRTemp mkV128from16s ( IRTemp in7, IRTemp in6, IRTemp in5, IRTemp in4,
- IRTemp in3, IRTemp in2, IRTemp in1, IRTemp in0 )
-{
- IRTemp hi64 = newTemp(Ity_I64);
- IRTemp lo64 = newTemp(Ity_I64);
- assign(hi64,
- binop(Iop_Or64,
- binop(Iop_Or64,
- binop(Iop_Shl64,
- binop(Iop_And64, mkexpr(in7), mkU64(0xFFFF)),
- mkU8(48)),
- binop(Iop_Shl64,
- binop(Iop_And64, mkexpr(in6), mkU64(0xFFFF)),
- mkU8(32))),
- binop(Iop_Or64,
- binop(Iop_Shl64,
- binop(Iop_And64, mkexpr(in5), mkU64(0xFFFF)),
- mkU8(16)),
- binop(Iop_And64,
- mkexpr(in4), mkU64(0xFFFF)))));
- assign(lo64,
- binop(Iop_Or64,
- binop(Iop_Or64,
- binop(Iop_Shl64,
- binop(Iop_And64, mkexpr(in3), mkU64(0xFFFF)),
- mkU8(48)),
- binop(Iop_Shl64,
- binop(Iop_And64, mkexpr(in2), mkU64(0xFFFF)),
- mkU8(32))),
- binop(Iop_Or64,
- binop(Iop_Shl64,
- binop(Iop_And64, mkexpr(in1), mkU64(0xFFFF)),
- mkU8(16)),
- binop(Iop_And64,
- mkexpr(in0), mkU64(0xFFFF)))));
- IRTemp res = newTemp(Ity_V128);
- assign(res, binop(Iop_64HLtoV128, mkexpr(hi64), mkexpr(lo64)));
- return res;
-}
-
-static IRExpr* mk_CatEvenLanes16x8 ( IRTemp a76543210, IRTemp b76543210 )
-{
- // returns a6 a4 a2 a0 b6 b4 b2 b0
- IRTemp a6, a4, a2, a0, b6, b4, b2, b0;
- breakV128to16s(NULL, &a6, NULL, &a4, NULL, &a2, NULL, &a0, a76543210);
- breakV128to16s(NULL, &b6, NULL, &b4, NULL, &b2, NULL, &b0, b76543210);
- return mkexpr(mkV128from16s(a6, a4, a2, a0, b6, b4, b2, b0));
-}
-
-static IRExpr* mk_CatOddLanes16x8 ( IRTemp a76543210, IRTemp b76543210 )
-{
- // returns a7 a5 a3 a1 b7 b5 b3 b1
- IRTemp a7, a5, a3, a1, b7, b5, b3, b1;
- breakV128to16s(&a7, NULL, &a5, NULL, &a3, NULL, &a1, NULL, a76543210);
- breakV128to16s(&b7, NULL, &b5, NULL, &b3, NULL, &b1, NULL, b76543210);
- return mkexpr(mkV128from16s(a7, a5, a3, a1, b7, b5, b3, b1));
-}
-
-static IRExpr* mk_InterleaveLO16x8 ( IRTemp a76543210, IRTemp b76543210 )
-{
- // returns a3 b3 a2 b2 a1 b1 a0 b0
- IRTemp a3, b3, a2, b2, a1, a0, b1, b0;
- breakV128to16s(NULL, NULL, NULL, NULL, &a3, &a2, &a1, &a0, a76543210);
- breakV128to16s(NULL, NULL, NULL, NULL, &b3, &b2, &b1, &b0, b76543210);
- return mkexpr(mkV128from16s(a3, b3, a2, b2, a1, b1, a0, b0));
-}
-
-static IRExpr* mk_InterleaveHI16x8 ( IRTemp a76543210, IRTemp b76543210 )
-{
- // returns a7 b7 a6 b6 a5 b5 a4 b4
- IRTemp a7, b7, a6, b6, a5, b5, a4, b4;
- breakV128to16s(&a7, &a6, &a5, &a4, NULL, NULL, NULL, NULL, a76543210);
- breakV128to16s(&b7, &b6, &b5, &b4, NULL, NULL, NULL, NULL, b76543210);
- return mkexpr(mkV128from16s(a7, b7, a6, b6, a5, b5, a4, b4));
-}
-
-////////////////////////////////////////////////////////////////
-// 8x16 operations
-//
-
-static void breakV128to8s ( IRTemp* outF, IRTemp* outE, IRTemp* outD,
- IRTemp* outC, IRTemp* outB, IRTemp* outA,
- IRTemp* out9, IRTemp* out8,
- IRTemp* out7, IRTemp* out6, IRTemp* out5,
- IRTemp* out4, IRTemp* out3, IRTemp* out2,
- IRTemp* out1,IRTemp* out0, IRTemp v128 )
-{
- if (outF) *outF = newTemp(Ity_I64);
- if (outE) *outE = newTemp(Ity_I64);
- if (outD) *outD = newTemp(Ity_I64);
- if (outC) *outC = newTemp(Ity_I64);
- if (outB) *outB = newTemp(Ity_I64);
- if (outA) *outA = newTemp(Ity_I64);
- if (out9) *out9 = newTemp(Ity_I64);
- if (out8) *out8 = newTemp(Ity_I64);
- if (out7) *out7 = newTemp(Ity_I64);
- if (out6) *out6 = newTemp(Ity_I64);
- if (out5) *out5 = newTemp(Ity_I64);
- if (out4) *out4 = newTemp(Ity_I64);
- if (out3) *out3 = newTemp(Ity_I64);
- if (out2) *out2 = newTemp(Ity_I64);
- if (out1) *out1 = newTemp(Ity_I64);
- if (out0) *out0 = newTemp(Ity_I64);
- IRTemp hi64 = newTemp(Ity_I64);
- IRTemp lo64 = newTemp(Ity_I64);
- assign(hi64, unop(Iop_V128HIto64, mkexpr(v128)) );
- assign(lo64, unop(Iop_V128to64, mkexpr(v128)) );
- if (outF)
- assign(*outF, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(hi64), mkU8(56)),
- mkU64(0xFF)));
- if (outE)
- assign(*outE, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(hi64), mkU8(48)),
- mkU64(0xFF)));
- if (outD)
- assign(*outD, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(hi64), mkU8(40)),
- mkU64(0xFF)));
- if (outC)
- assign(*outC, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(hi64), mkU8(32)),
- mkU64(0xFF)));
- if (outB)
- assign(*outB, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(hi64), mkU8(24)),
- mkU64(0xFF)));
- if (outA)
- assign(*outA, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(hi64), mkU8(16)),
- mkU64(0xFF)));
- if (out9)
- assign(*out9, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(hi64), mkU8(8)),
- mkU64(0xFF)));
- if (out8)
- assign(*out8, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(hi64), mkU8(0)),
- mkU64(0xFF)));
- if (out7)
- assign(*out7, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(lo64), mkU8(56)),
- mkU64(0xFF)));
- if (out6)
- assign(*out6, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(lo64), mkU8(48)),
- mkU64(0xFF)));
- if (out5)
- assign(*out5, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(lo64), mkU8(40)),
- mkU64(0xFF)));
- if (out4)
- assign(*out4, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(lo64), mkU8(32)),
- mkU64(0xFF)));
- if (out3)
- assign(*out3, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(lo64), mkU8(24)),
- mkU64(0xFF)));
- if (out2)
- assign(*out2, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(lo64), mkU8(16)),
- mkU64(0xFF)));
- if (out1)
- assign(*out1, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(lo64), mkU8(8)),
- mkU64(0xFF)));
- if (out0)
- assign(*out0, binop(Iop_And64,
- binop(Iop_Shr64, mkexpr(lo64), mkU8(0)),
- mkU64(0xFF)));
-}
-
-static IRTemp mkV128from8s ( IRTemp inF, IRTemp inE, IRTemp inD, IRTemp inC,
- IRTemp inB, IRTemp inA, IRTemp in9, IRTemp in8,
- IRTemp in7, IRTemp in6, IRTemp in5, IRTemp in4,
- IRTemp in3, IRTemp in2, IRTemp in1, IRTemp in0 )
-{
- IRTemp vFE = newTemp(Ity_I64);
- IRTemp vDC = newTemp(Ity_I64);
- IRTemp vBA = newTemp(Ity_I64);
- IRTemp v98 = newTemp(Ity_I64);
- IRTemp v76 = newTemp(Ity_I64);
- IRTemp v54 = newTemp(Ity_I64);
- IRTemp v32 = newTemp(Ity_I64);
- IRTemp v10 = newTemp(Ity_I64);
- assign(vFE, binop(Iop_Or64,
- binop(Iop_Shl64,
- binop(Iop_And64, mkexpr(inF), mkU64(0xFF)), mkU8(8)),
- binop(Iop_And64, mkexpr(inE), mkU64(0xFF))));
- assign(vDC, binop(Iop_Or64,
- binop(Iop_Shl64,
- binop(Iop_And64, mkexpr(inD), mkU64(0xFF)), mkU8(8)),
- binop(Iop_And64, mkexpr(inC), mkU64(0xFF))));
- assign(vBA, binop(Iop_Or64,
- binop(Iop_Shl64,
- binop(Iop_And64, mkexpr(inB), mkU64(0xFF)), mkU8(8)),
- binop(Iop_And64, mkexpr(inA), mkU64(0xFF))));
- assign(v98, binop(Iop_Or64,
- binop(Iop_Shl64,
- binop(Iop_And64, mkexpr(in9), mkU64(0xFF)), mkU8(8)),
- binop(Iop_And64, mkexpr(in8), mkU64(0xFF))));
- assign(v76, binop(Iop_Or64,
- binop(Iop_Shl64,
- binop(Iop_And64, mkexpr(in7), mkU64(0xFF)), mkU8(8)),
- binop(Iop_And64, mkexpr(in6), mkU64(0xFF))));
- assign(v54, binop(Iop_Or64,
- binop(Iop_Shl64,
- binop(Iop_And64, mkexpr(in5), mkU64(0xFF)), mkU8(8)),
- binop(Iop_And64, mkexpr(in4), mkU64(0xFF))));
- assign(v32, binop(Iop_Or64,
- binop(Iop_Shl64,
- binop(Iop_And64, mkexpr(in3), mkU64(0xFF)), mkU8(8)),
- binop(Iop_And64, mkexpr(in2), mkU64(0xFF))));
- assign(v10, binop(Iop_Or64,
- binop(Iop_Shl64,
- binop(Iop_And64, mkexpr(in1), mkU64(0xFF)), mkU8(8)),
- binop(Iop_And64, mkexpr(in0), mkU64(0xFF))));
- return mkV128from16s(vFE, vDC, vBA, v98, v76, v54, v32, v10);
-}
-
-static IRExpr* mk_CatEvenLanes8x16 ( IRTemp aFEDCBA9876543210,
- IRTemp bFEDCBA9876543210 )
-{
- // returns aE aC aA a8 a6 a4 a2 a0 bE bC bA b8 b6 b4 b2 b0
- IRTemp aE, aC, aA, a8, a6, a4, a2, a0, bE, bC, bA, b8, b6, b4, b2, b0;
- breakV128to8s(NULL, &aE, NULL, &aC, NULL, &aA, NULL, &a8,
- NULL, &a6, NULL, &a4, NULL, &a2, NULL, &a0,
- aFEDCBA9876543210);
- breakV128to8s(NULL, &bE, NULL, &bC, NULL, &bA, NULL, &b8,
- NULL, &b6, NULL, &b4, NULL, &b2, NULL, &b0,
- bFEDCBA9876543210);
- return mkexpr(mkV128from8s(aE, aC, aA, a8, a6, a4, a2, a0,
- bE, bC, bA, b8, b6, b4, b2, b0));
-}
-
-static IRExpr* mk_CatOddLanes8x16 ( IRTemp aFEDCBA9876543210,
- IRTemp bFEDCBA9876543210 )
-{
- // returns aF aD aB a9 a7 a5 a3 a1 bF bD bB b9 b7 b5 b3 b1
- IRTemp aF, aD, aB, a9, a7, a5, a3, a1, bF, bD, bB, b9, b7, b5, b3, b1;
- breakV128to8s(&aF, NULL, &aD, NULL, &aB, NULL, &a9, NULL,
- &a7, NULL, &a5, NULL, &a3, NULL, &a1, NULL,
- aFEDCBA9876543210);
-
- breakV128to8s(&bF, NULL, &bD, NULL, &bB, NULL, &b9, NULL,
- &b7, NULL, &b5, NULL, &b3, NULL, &b1, NULL,
- aFEDCBA9876543210);
-
- return mkexpr(mkV128from8s(aF, aD, aB, a9, a7, a5, a3, a1,
- bF, bD, bB, b9, b7, b5, b3, b1));
-}
-
-static IRExpr* mk_InterleaveLO8x16 ( IRTemp aFEDCBA9876543210,
- IRTemp bFEDCBA9876543210 )
-{
- // returns a7 b7 a6 b6 a5 b5 a4 b4 a3 b3 a2 b2 a1 b1 a0 b0
- IRTemp a7, b7, a6, b6, a5, b5, a4, b4, a3, b3, a2, b2, a1, b1, a0, b0;
- breakV128to8s(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- &a7, &a6, &a5, &a4, &a3, &a2, &a1, &a0,
- aFEDCBA9876543210);
- breakV128to8s(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- &b7, &b6, &b5, &b4, &b3, &b2, &b1, &b0,
- bFEDCBA9876543210);
- return mkexpr(mkV128from8s(a7, b7, a6, b6, a5, b5, a4, b4,
- a3, b3, a2, b2, a1, b1, a0, b0));
-}
-
-static IRExpr* mk_InterleaveHI8x16 ( IRTemp aFEDCBA9876543210,
- IRTemp bFEDCBA9876543210 )
-{
- // returns aF bF aE bE aD bD aC bC aB bB aA bA a9 b9 a8 b8
- IRTemp aF, bF, aE, bE, aD, bD, aC, bC, aB, bB, aA, bA, a9, b9, a8, b8;
- breakV128to8s(&aF, &aE, &aD, &aC, &aB, &aA, &a9, &a8,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- aFEDCBA9876543210);
- breakV128to8s(&bF, &bE, &bD, &bC, &bB, &bA, &b9, &b8,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- bFEDCBA9876543210);
- return mkexpr(mkV128from8s(aF, bF, aE, bE, aD, bD, aC, bC,
- aB, bB, aA, bA, a9, b9, a8, b8));
-}
/*--------------------------------------------------------------------*/
/*--- end guest_arm64_toIR.c ---*/
Modified: trunk/priv/host_arm64_defs.c
==============================================================================
--- trunk/priv/host_arm64_defs.c (original)
+++ trunk/priv/host_arm64_defs.c Sun Jun 15 08:17:35 2014
@@ -896,13 +896,27 @@
case ARM64vecb_CMGT32x4: *nm = "cmgt"; *ar = "4s"; return;
case ARM64vecb_CMGT16x8: *nm = "cmgt"; *ar = "8h"; return;
case ARM64vecb_CMGT8x16: *nm = "cmgt"; *ar = "16b"; return;
- case ARM64vecb_FCMEQ64x2: *nm = "fcmeq"; *ar = "2d"; return;
- case ARM64vecb_FCMEQ32x4: *nm = "fcmeq"; *ar = "4s"; return;
- case ARM64vecb_FCMGE64x2: *nm = "fcmge"; *ar = "2d"; return;
- case ARM64vecb_FCMGE32x4: *nm = "fcmge"; *ar = "4s"; return;
- case ARM64vecb_FCMGT64x2: *nm = "fcmgt"; *ar = "2d"; return;
- case ARM64vecb_FCMGT32x4: *nm = "fcmgt"; *ar = "4s"; return;
+ case ARM64vecb_FCMEQ64x2: *nm = "fcmeq"; *ar = "2d"; return;
+ case ARM64vecb_FCMEQ32x4: *nm = "fcmeq"; *ar = "4s"; return;
+ case ARM64vecb_FCMGE64x2: *nm = "fcmge"; *ar = "2d"; return;
+ case ARM64vecb_FCMGE32x4: *nm = "fcmge"; *ar = "4s"; return;
+ case ARM64vecb_FCMGT64x2: *nm = "fcmgt"; *ar = "2d"; return;
+ case ARM64vecb_FCMGT32x4: *nm = "fcmgt"; *ar = "4s"; return;
case ARM64vecb_TBL1: *nm = "tbl "; *ar = "16b"; return;
+ case ARM64vecb_UZP164x2: *nm = "uzp1"; *ar = "2d"; return;
+ case ARM64vecb_UZP132x4: *nm = "uzp1"; *ar = "4s"; return;
+ case ARM64vecb_UZP116x8: *nm = "uzp1"; *ar = "8h"; return;
+ case ARM64vecb_UZP18x16: *nm = "uzp1"; *ar = "16b"; return;
+ case ARM64vecb_UZP264x2: *nm = "uzp2"; *ar = "2d"; return;
+ case ARM64vecb_UZP232x4: *nm = "uzp2"; *ar = "4s"; return;
+ case ARM64vecb_UZP216x8: *nm = "uzp2"; *ar = "8h"; return;
+ case ARM64vecb_UZP28x16: *nm = "uzp2"; *ar = "16b"; return;
+ case ARM64vecb_ZIP132x4: *nm = "zip1"; *ar = "4s"; return;
+ case ARM64vecb_ZIP116x8: *nm = "zip1"; *ar = "8h"; return;
+ case ARM64vecb_ZIP18x16: *nm = "zip1"; *ar = "16b"; return;
+ case ARM64vecb_ZIP232x4: *nm = "zip2"; *ar = "4s"; return;
+ case ARM64vecb_ZIP216x8: *nm = "zip2"; *ar = "8h"; return;
+ case ARM64vecb_ZIP28x16: *nm = "zip2"; *ar = "16b"; return;
default: vpanic("showARM64VecBinOp");
}
}
@@ -3385,11 +3399,13 @@
#define X000000 BITS8(0,0, 0,0,0,0,0,0)
#define X000001 BITS8(0,0, 0,0,0,0,0,1)
#define X000100 BITS8(0,0, 0,0,0,1,0,0)
+#define X000110 BITS8(0,0, 0,0,0,1,1,0)
#define X000111 BITS8(0,0, 0,0,0,1,1,1)
#define X001000 BITS8(0,0, 0,0,1,0,0,0)
#define X001001 BITS8(0,0, 0,0,1,0,0,1)
#define X001010 BITS8(0,0, 0,0,1,0,1,0)
#define X001101 BITS8(0,0, 0,0,1,1,0,1)
+#define X001110 BITS8(0,0, 0,0,1,1,1,0)
#define X001111 BITS8(0,0, 0,0,1,1,1,1)
#define X010000 BITS8(0,0, 0,1,0,0,0,0)
#define X010001 BITS8(0,0, 0,1,0,0,0,1)
@@ -3435,8 +3451,11 @@
#define X01100011 BITS8(0,1,1,0,0,0,1,1)
#define X01110000 BITS8(0,1,1,1,0,0,0,0)
#define X01110001 BITS8(0,1,1,1,0,0,0,1)
+#define X01110010 BITS8(0,1,1,1,0,0,1,0)
#define X01110011 BITS8(0,1,1,1,0,0,1,1)
+#define X01110100 BITS8(0,1,1,1,0,1,0,0)
#define X01110101 BITS8(0,1,1,1,0,1,0,1)
+#define X01110110 BITS8(0,1,1,1,0,1,1,0)
#define X01110111 BITS8(0,1,1,1,0,1,1,1)
#define X11000001 BITS8(1,1,0,0,0,0,0,1)
#define X11000011 BITS8(1,1,0,0,0,0,1,1)
@@ -5038,6 +5057,23 @@
010 01110 00 0 m 000000 n d TBL Vd.16b, {Vn.16b}, Vm.16b
+ 010 01110 11 0 m 000110 n d UZP1 Vd.2d, Vn.2d, Vm.2d
+ 010 01110 10 0 m 000110 n d UZP1 Vd.4s, Vn.4s, Vm.4s
+ 010 01110 01 0 m 000110 n d UZP1 Vd.8h, Vn.8h, Vm.8h
+ 010 01110 00 0 m 000110 n d UZP1 Vd.16b, Vn.16b, Vm.16b
+
+ 010 01110 11 0 m 010110 n d UZP2 Vd.2d, Vn.2d, Vm.2d
+ 010 01110 10 0 m 010110 n d UZP2 Vd.4s, Vn.4s, Vm.4s
+ 010 01110 01 0 m 010110 n d UZP2 Vd.8h, Vn.8h, Vm.8h
+ 010 01110 00 0 m 010110 n d UZP2 Vd.16b, Vn.16b, Vm.16b
+
+ 010 01110 10 0 m 001110 n d ZIP1 Vd.4s, Vn.4s, Vm.4s
+ 010 01110 01 0 m 001110 n d ZIP1 Vd.8h, Vn.8h, Vm.8h
+ 010 01110 10 0 m 001110 n d ZIP1 Vd.16b, Vn.16b, Vm.16b
+
+ 010 01110 10 0 m 011110 n d ZIP2 Vd.4s, Vn.4s, Vm.4s
+ 010 01110 01 0 m 011110 n d ZIP2 Vd.8h, Vn.8h, Vm.8h
+ 010 01110 10 0 m 011110 n d ZIP2 Vd.16b, Vn.16b, Vm.16b
*/
UInt vD = qregNo(i->ARM64in.VBinV.dst);
UInt vN = qregNo(i->ARM64in.VBinV.argL);
@@ -5212,7 +5248,53 @@
break;
case ARM64vecb_TBL1:
- *p++ = X_3_8_5_6_5_5(X010, X01110000, vM, X000000, vN, vD);
+ *p++ = X_3_8_5_6_5_5(X010, X01110000, vM, X000000, vN, vD);
+ break;
+
+ case ARM64vecb_UZP164x2:
+ *p++ = X_3_8_5_6_5_5(X010, X01110110, vM, X000110, vN, vD);
+ break;
+ case ARM64vecb_UZP132x4:
+ *p++ = X_3_8_5_6_5_5(X010, X01110100, vM, X000110, vN, vD);
+ break;
+ case ARM64vecb_UZP116x8:
+ *p++ = X_3_8_5_6_5_5(X010, X01110010, vM, X000110, vN, vD);
+ break;
+ case ARM64vecb_UZP18x16:
+ *p++ = X_3_8_5_6_5_5(X010, X01110000, vM, X000110, vN, vD);
+ break;
+
+ case ARM64vecb_UZP264x2:
+ *p++ = X_3_8_5_6_5_5(X010, X01110110, vM, X010110, vN, vD);
+ break;
+ case ARM64vecb_UZP232x4:
+ *p++ = X_3_8_5_6_5_5(X010, X01110100, vM, X010110, vN, vD);
+ break;
+ case ARM64vecb_UZP216x8:
+ *p++ = X_3_8_5_6_5_5(X010, X01110010, vM, X010110, vN, vD);
+ break;
+ case ARM64vecb_UZP28x16:
+ *p++ = X_3_8_5_6_5_5(X010, X01110000, vM, X010110, vN, vD);
+ break;
+
+ case ARM64vecb_ZIP132x4:
+ *p++ = X_3_8_5_6_5_5(X010, X01110100, vM, X001110, vN, vD);
+ break;
+ case ARM64vecb_ZIP116x8:
+ *p++ = X_3_8_5_6_5_5(X010, X01110010, vM, X001110, vN, vD);
+ break;
+ case ARM64vecb_ZIP18x16:
+ *p++ = X_3_8_5_6_5_5(X010, X01110000, vM, X001110, vN, vD);
+ break;
+
+ case ARM64vecb_ZIP232x4:
+ *p++ = X_3_8_5_6_5_5(X010, X01110100, vM, X011110, vN, vD);
+ break;
+ case ARM64vecb_ZIP216x8:
+ *p++ = X_3_8_5_6_5_5(X010, X01110010, vM, X011110, vN, vD);
+ break;
+ case ARM64vecb_ZIP28x16:
+ *p++ = X_3_8_5_6_5_5(X010, X01110000, vM, X011110, vN, vD);
break;
default:
Modified: trunk/priv/host_arm64_defs.h
==============================================================================
--- trunk/priv/host_arm64_defs.h (original)
+++ trunk/priv/host_arm64_defs.h Sun Jun 15 08:17:35 2014
@@ -360,6 +360,20 @@
ARM64vecb_FCMGT64x2,
ARM64vecb_FCMGT32x4,
ARM64vecb_TBL1,
+ ARM64vecb_UZP164x2,
+ ARM64vecb_UZP132x4,
+ ARM64vecb_UZP116x8,
+ ARM64vecb_UZP18x16,
+ ARM64vecb_UZP264x2,
+ ARM64vecb_UZP232x4,
+ ARM64vecb_UZP216x8,
+ ARM64vecb_UZP28x16,
+ ARM64vecb_ZIP132x4,
+ ARM64vecb_ZIP116x8,
+ ARM64vecb_ZIP18x16,
+ ARM64vecb_ZIP232x4,
+ ARM64vecb_ZIP216x8,
+ ARM64vecb_ZIP28x16,
ARM64vecb_INVALID
}
ARM64VecBinOp;
Modified: trunk/priv/host_arm64_isel.c
==============================================================================
--- trunk/priv/host_arm64_isel.c (original)
+++ trunk/priv/host_arm64_isel.c Sun Jun 15 08:17:35 2014
@@ -4957,6 +4957,20 @@
case Iop_CmpLT64Fx2:
case Iop_CmpLT32Fx4:
case Iop_Perm8x16:
+ case Iop_InterleaveLO64x2:
+ case Iop_CatEvenLanes32x4:
+ case Iop_CatEvenLanes16x8:
+ case Iop_CatEvenLanes8x16:
+ case Iop_InterleaveHI64x2:
+ case Iop_CatOddLanes32x4:
+ case Iop_CatOddLanes16x8:
+ case Iop_CatOddLanes8x16:
+ case Iop_InterleaveHI32x4:
+ case Iop_InterleaveHI16x8:
+ case Iop_InterleaveHI8x16:
+ case Iop_InterleaveLO32x4:
+ case Iop_InterleaveLO16x8:
+ case Iop_InterleaveLO8x16:
{
HReg res = newVRegV(env);
HReg argL = iselV128Expr(env, e->Iex.Binop.arg1);
@@ -5009,6 +5023,34 @@
case Iop_CmpLT64Fx2: op = ARM64vecb_FCMGT64x2; sw = True; break;
case Iop_CmpLT32Fx4: op = ARM64vecb_FCMGT32x4; sw = True; break;
case Iop_Perm8x16: op = ARM64vecb_TBL1; break;
+ case Iop_InterleaveLO64x2: op = ARM64vecb_UZP164x2; sw = True;
+ break;
+ case Iop_CatEvenLanes32x4: op = ARM64vecb_UZP132x4; sw = True;
+ break;
+ case Iop_CatEvenLanes16x8: op = ARM64vecb_UZP116x8; sw = True;
+ break;
+ case Iop_CatEvenLanes8x16: op = ARM64vecb_UZP18x16; sw = True;
+ break;
+ case Iop_InterleaveHI64x2: op = ARM64vecb_UZP264x2; sw = True;
+ break;
+ case Iop_CatOddLanes32x4: op = ARM64vecb_UZP232x4; sw = True;
+ break;
+ case Iop_CatOddLanes16x8: op = ARM64vecb_UZP216x8; sw = True;
+ break;
+ case Iop_CatOddLanes8x16: op = ARM64vecb_UZP28x16; sw = True;
+ break;
+ case Iop_InterleaveHI32x4: op = ARM64vecb_ZIP232x4; sw = True;
+ break;
+ case Iop_InterleaveHI16x8: op = ARM64vecb_ZIP216x8; sw = True;
+ break;
+ case Iop_InterleaveHI8x16: op = ARM64vecb_ZIP28x16; sw = True;
+ break;
+ case Iop_InterleaveLO32x4: op = ARM64vecb_ZIP132x4; sw = True;
+ break;
+ case Iop_InterleaveLO16x8: op = ARM64vecb_ZIP116x8; sw = True;
+ break;
+ case Iop_InterleaveLO8x16: op = ARM64vecb_ZIP18x16; sw = True;
+ break;
default: vassert(0);
}
if (sw) {
|
|
From: Philippe W. <phi...@sk...> - 2014-06-15 06:09:03
|
valgrind revision: 14034 VEX revision: 2875 C compiler: gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8) GDB: GNU gdb (GDB) Fedora (7.5.1-37.fc18) Assembler: GNU assembler version 2.23.51.0.1-7.fc18 20120806 C library: GNU C Library stable release version 2.16 uname -mrs: Linux 3.8.8-202.fc18.ppc64p7 ppc64 Vendor version: Fedora release 18 (Spherical Cow) Nightly build on gcc110 ( Fedora release 18 (Spherical Cow), ppc64 ) Started at 2014-06-14 20:00:16 PDT Ended at 2014-06-14 23:05:39 PDT Results differ from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 581 tests, 8 stderr failures, 3 stdout failures, 0 stderrB failures, 0 stdoutB failures, 2 post failures == memcheck/tests/linux/getregset (stdout) memcheck/tests/linux/getregset (stderr) memcheck/tests/ppc64/power_ISA2_05 (stdout) memcheck/tests/supp_unknown (stderr) memcheck/tests/varinfo6 (stderr) memcheck/tests/wrap8 (stdout) memcheck/tests/wrap8 (stderr) massif/tests/big-alloc (post) massif/tests/deep-D (post) helgrind/tests/pth_cond_destroy_busy (stderr) helgrind/tests/tc06_two_races_xml (stderr) helgrind/tests/tc18_semabuse (stderr) helgrind/tests/tc20_verifywrap (stderr) ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 582 tests, 9 stderr failures, 3 stdout failures, 0 stderrB failures, 0 stdoutB failures, 2 post failures == memcheck/tests/linux/getregset (stdout) memcheck/tests/linux/getregset (stderr) memcheck/tests/ppc64/power_ISA2_05 (stdout) memcheck/tests/supp_unknown (stderr) memcheck/tests/varinfo6 (stderr) memcheck/tests/wrap8 (stdout) memcheck/tests/wrap8 (stderr) massif/tests/big-alloc (post) massif/tests/deep-D (post) helgrind/tests/pth_cond_destroy_busy (stderr) helgrind/tests/tc06_two_races_xml (stderr) helgrind/tests/tc18_semabuse (stderr) helgrind/tests/tc20_verifywrap (stderr) drd/tests/boost_thread (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Sat Jun 14 20:46:35 2014 --- new.short Sat Jun 14 22:11:56 2014 *************** *** 8,10 **** ! == 582 tests, 9 stderr failures, 3 stdout failures, 0 stderrB failures, 0 stdoutB failures, 2 post failures == memcheck/tests/linux/getregset (stdout) --- 8,10 ---- ! == 581 tests, 8 stderr failures, 3 stdout failures, 0 stderrB failures, 0 stdoutB failures, 2 post failures == memcheck/tests/linux/getregset (stdout) *************** *** 22,24 **** helgrind/tests/tc20_verifywrap (stderr) - drd/tests/boost_thread (stderr) --- 22,23 ---- --tools=none,memcheck,callgrind,helgrind,cachegrind,drd,massif --reps=3 --vg=../valgrind-new --vg=../valgrind-old -- Running tests in perf ---------------------------------------------- -- bigcode1 -- bigcode1 valgrind-new:0.23s no: 1.5s ( 6.7x, -----) me: 3.0s (13.0x, -----) ca:18.8s (81.8x, -----) he: 1.7s ( 7.6x, -----) ca: 5.7s (24.9x, -----) dr: 1.9s ( 8.1x, -----) ma: 2.2s ( 9.4x, -----) bigcode1 valgrind-old:0.23s no: 1.7s ( 7.4x,-11.8%) me: 3.1s (13.5x, -3.7%) ca:17.9s (78.0x, 4.7%) he: 1.7s ( 7.5x, 0.6%) ca: 5.3s (23.0x, 7.7%) dr: 1.7s ( 7.3x, 10.2%) ma: 2.1s ( 9.3x, 0.9%) -- bigcode2 -- bigcode2 valgrind-new:0.23s no: 1.5s ( 6.7x, -----) me: 2.9s (12.7x, -----) ca:19.1s (83.2x, -----) he: 2.1s ( 9.1x, -----) ca: 5.5s (24.0x, -----) dr: 1.9s ( 8.0x, -----) ma: 2.1s ( 9.3x, -----) bigcode2 valgrind-old:0.23s no: 1.6s ( 6.7x, -1.3%) me: 2.9s (12.7x, -0.3%) ca:18.2s (79.2x, 4.9%) he: 2.3s (10.0x,-10.0%) ca: 5.5s (24.0x, -0.2%) dr: 2.0s ( 8.7x, -7.6%) ma: 2.3s ( 9.8x, -6.1%) -- bz2 -- bz2 valgrind-new:0.74s no: 4.5s ( 6.1x, -----) me:11.5s (15.6x, -----) ca:26.4s (35.7x, -----) he:14.8s (20.0x, -----) ca:25.7s (34.8x, -----) dr:19.1s (25.8x, -----) ma: 5.0s ( 6.7x, -----) bz2 valgrind-old:0.74s no: 4.8s ( 6.5x, -6.4%) me:11.6s (15.7x, -0.8%) ca:26.2s (35.4x, 0.8%) he:14.7s (19.9x, 0.4%) ca:24.9s (33.7x, 3.1%) dr:19.3s (26.1x, -0.9%) ma: 4.7s ( 6.3x, 6.0%) -- fbench -- fbench valgrind-new:0.34s no: 2.1s ( 6.3x, -----) me: 5.2s (15.2x, -----) ca: 8.8s (25.8x, -----) he: 5.2s (15.4x, -----) ca: 7.5s (22.1x, -----) dr: 4.8s (14.3x, -----) ma: 2.1s ( 6.3x, -----) fbench valgrind-old:0.34s no: 2.1s ( 6.3x, -0.5%) me: 5.2s (15.4x, -1.2%) ca: 8.5s (24.9x, 3.3%) he: 5.5s (16.0x, -4.4%) ca: 7.4s (21.9x, 1.1%) dr: 4.8s (14.1x, 0.8%) ma: 2.1s ( 6.3x, 0.5%) -- ffbench -- ffbench valgrind-new:0.44s no: 1.3s ( 3.0x, -----) me: 2.5s ( 5.6x, -----) ca: 2.6s ( 5.9x, -----) he: 7.1s (16.1x, -----) ca: 7.4s (16.9x, -----) dr: 4.9s (11.2x, -----) ma: 1.0s ( 2.3x, -----) ffbench valgrind-old:0.44s no: 1.3s ( 3.0x, 0.0%) me: 2.4s ( 5.5x, 0.4%) ca: 2.5s ( 5.7x, 3.1%) he: 7.0s (15.9x, 1.0%) ca: 7.1s (16.2x, 4.2%) dr: 4.9s (11.2x, -0.2%) ma: 1.2s ( 2.8x,-22.5%) -- heap -- heap valgrind-new:0.40s no: 2.7s ( 6.8x, -----) me: 9.5s (23.7x, -----) ca:13.7s (34.2x, -----) he:11.8s (29.6x, -----) ca:12.1s (30.2x, -----) dr: 8.5s (21.2x, -----) ma: 8.7s (21.7x, -----) heap valgrind-old:0.40s no: 2.5s ( 6.2x, 9.2%) me: 9.6s (24.0x, -1.6%) ca:13.1s (32.8x, 4.1%) he:12.0s (30.1x, -1.6%) ca:12.2s (30.4x, -0.6%) dr: 8.1s (20.4x, 4.1%) ma: 8.5s (21.2x, 2.4%) -- heap_pdb4 -- heap_pdb4 valgrind-new:0.42s no: 2.6s ( 6.1x, -----) me:13.7s (32.6x, -----) ca:14.7s (35.0x, -----) he:13.3s (31.7x, -----) ca:13.2s (31.4x, -----) dr: 9.1s (21.7x, -----) ma: 8.7s (20.7x, -----) heap_pdb4 valgrind-old:0.42s no: 2.5s ( 6.1x, 1.2%) me:13.5s (32.2x, 1.1%) ca:14.2s (33.7x, 3.5%) he:13.5s (32.1x, -1.4%) ca:13.2s (31.4x, -0.1%) dr: 9.2s (21.9x, -1.0%) ma: 8.8s (21.0x, -1.4%) -- many-loss-records -- many-loss-records valgrind-new:0.03s no: 0.5s (18.0x, -----) me: 2.1s (71.0x, -----) ca: 2.0s (65.7x, -----) he: 1.8s (60.7x, -----) ca: 1.9s (62.7x, -----) dr: 1.6s (53.7x, -----) ma: 1.6s (52.3x, -----) many-loss-records valgrind-old:0.03s no: 0.5s (17.7x, 1.9%) me: 2.1s (71.7x, -0.9%) ca: 1.9s (62.7x, 4.6%) he: 1.9s (61.7x, -1.6%) ca: 1.9s (62.3x, 0.5%) dr: 1.6s (52.7x, 1.9%) ma: 1.6s (53.3x, -1.9%) -- many-xpts -- many-xpts valgrind-new:0.06s no: 0.8s (12.5x, -----) me: 3.3s (55.7x, -----) ca: 5.0s (82.7x, -----) he: 4.8s (80.8x, -----) ca: 2.9s (48.5x, -----) dr: 2.3s (38.8x, -----) ma: 2.3s (37.7x, -----) many-xpts valgrind-old:0.06s no: 0.7s (12.3x, 1.3%) me: 3.4s (56.3x, -1.2%) ca: 4.7s (78.3x, 5.2%) he: 4.8s (80.7x, 0.2%) ca: 2.9s (48.3x, 0.3%) dr: 2.3s (38.7x, 0.4%) ma: 2.3s (37.8x, -0.4%) -- sarp -- sarp valgrind-new:0.02s no: 0.4s (20.0x, -----) me: 3.0s (152.0x, -----) ca: 3.2s (158.0x, -----) he:11.3s (563.0x, -----) ca: 1.7s (86.0x, -----) dr: 1.1s (53.5x, -----) ma: 0.4s (21.5x, -----) sarp valgrind-old:0.02s no: 0.4s (20.0x, 0.0%) me: 3.0s (151.5x, 0.3%) ca: 3.0s (149.0x, 5.7%) he:11.1s (552.5x, 1.9%) ca: 1.7s (87.0x, -1.2%) dr: 1.1s (53.0x, 0.9%) ma: 0.4s (21.0x, 2.3%) -- tinycc -- tinycc valgrind-new:0.28s no: 3.0s (10.7x, -----) me:13.9s (49.7x, -----) ca:18.1s (64.8x, -----) he:19.0s (67.9x, -----) ca:15.8s (56.2x, -----) dr:12.1s (43.0x, -----) ma: 3.8s (13.7x, -----) tinycc valgrind-old:0.28s no: 3.0s (10.6x, 0.7%) me:13.8s (49.2x, 0.9%) ca:17.5s (62.5x, 3.6%) he:19.0s (67.9x, -0.1%) ca:15.7s (56.0x, 0.4%) dr:12.1s (43.1x, -0.1%) ma: 3.8s (13.6x, 0.8%) -- Finished tests in perf ---------------------------------------------- == 11 programs, 154 timings ================= real 53m42.941s user 52m46.095s sys 0m20.065s |
|
From: Christian B. <bor...@de...> - 2014-06-15 04:13:49
|
valgrind revision: 14034 VEX revision: 2875 C compiler: gcc (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973] GDB: GNU gdb (GDB) SUSE (7.5.1-0.7.29) Assembler: GNU assembler (GNU Binutils; SUSE Linux Enterprise 11) 2.23.1 C library: GNU C Library stable release version 2.11.3 (20110527) uname -mrs: Linux 3.0.101-0.21-default s390x Vendor version: Welcome to SUSE Linux Enterprise Server 11 SP3 (s390x) - Kernel %r (%t). Nightly build on sless390 ( SUSE Linux Enterprise Server 11 SP3 gcc 4.3.4 on z196 (s390x) ) Started at 2014-06-15 03:45:01 CEST Ended at 2014-06-15 06:13:36 CEST Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 647 tests, 2 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures == helgrind/tests/pth_cond_destroy_busy (stderr) helgrind/tests/tc20_verifywrap (stderr) --tools=none,memcheck,callgrind,helgrind,cachegrind,drd,massif --reps=3 --vg=../valgrind-new --vg=../valgrind-old -- Running tests in perf ---------------------------------------------- -- bigcode1 -- bigcode1 valgrind-new:0.23s no: 4.3s (18.9x, -----) me: 7.0s (30.4x, -----) ca:26.4s (114.7x, -----) he: 5.1s (22.0x, -----) ca: 9.1s (39.7x, -----) dr: 5.4s (23.4x, -----) ma: 4.7s (20.3x, -----) bigcode1 valgrind-old:0.23s no: 4.5s (19.6x, -3.4%) me: 6.9s (29.9x, 1.6%) ca:26.4s (114.9x, -0.2%) he: 5.1s (22.0x, 0.2%) ca: 9.1s (39.7x, 0.0%) dr: 5.4s (23.3x, 0.4%) ma: 4.6s (19.9x, 2.1%) -- bigcode2 -- bigcode2 valgrind-new:0.24s no: 7.4s (30.9x, -----) me:13.8s (57.6x, -----) ca:39.5s (164.5x, -----) he:10.1s (42.0x, -----) ca:14.3s (59.7x, -----) dr: 9.6s (40.0x, -----) ma: 8.1s (33.8x, -----) bigcode2 valgrind-old:0.24s no: 7.4s (30.7x, 0.7%) me:13.8s (57.6x, 0.0%) ca:40.3s (167.9x, -2.1%) he:10.1s (42.3x, -0.5%) ca:14.3s (59.6x, 0.1%) dr: 9.5s (39.8x, 0.7%) ma: 8.1s (33.9x, -0.4%) -- bz2 -- bz2 valgrind-new:0.70s no: 5.1s ( 7.3x, -----) me:12.7s (18.2x, -----) ca:30.6s (43.8x, -----) he:19.6s (28.0x, -----) ca:34.3s (48.9x, -----) dr:31.7s (45.3x, -----) ma: 3.9s ( 5.6x, -----) bz2 valgrind-old:0.70s no: 5.1s ( 7.3x, 0.2%) me:12.7s (18.2x, -0.2%) ca:30.6s (43.7x, 0.2%) he:19.7s (28.1x, -0.3%) ca:34.4s (49.1x, -0.3%) dr:29.0s (41.4x, 8.7%) ma: 3.9s ( 5.6x, 0.3%) -- fbench -- fbench valgrind-new:0.40s no: 1.6s ( 4.0x, -----) me: 4.2s (10.6x, -----) ca: 9.3s (23.3x, -----) he: 6.2s (15.5x, -----) ca: 7.2s (17.9x, -----) dr: 5.8s (14.6x, -----) ma: 1.7s ( 4.2x, -----) fbench valgrind-old:0.40s no: 1.6s ( 4.0x, -0.0%) me: 4.2s (10.5x, 0.7%) ca: 9.3s (23.2x, 0.6%) he: 6.2s (15.6x, -0.6%) ca: 7.2s (18.0x, -0.4%) dr: 5.5s (13.8x, 5.1%) ma: 1.7s ( 4.2x, 0.6%) -- ffbench -- ffbench valgrind-new:0.21s no: 1.1s ( 5.1x, -----) me: 3.0s (14.2x, -----) ca: 3.0s (14.5x, -----) he:44.1s (210.0x, -----) ca: 9.7s (46.0x, -----) dr: 7.1s (33.8x, -----) ma: 1.0s ( 4.7x, -----) ffbench valgrind-old:0.21s no: 1.1s ( 5.2x, -1.9%) me: 3.0s (14.4x, -1.3%) ca: 3.1s (14.6x, -0.7%) he:44.2s (210.6x, -0.3%) ca: 9.6s (45.8x, 0.4%) dr: 6.9s (33.0x, 2.3%) ma: 1.0s ( 4.6x, 2.0%) -- heap -- heap valgrind-new:0.23s no: 1.9s ( 8.1x, -----) me: 8.6s (37.3x, -----) ca:13.2s (57.2x, -----) he:12.6s (54.7x, -----) ca:11.3s (49.0x, -----) dr: 8.2s (35.6x, -----) ma: 7.9s (34.5x, -----) heap valgrind-old:0.23s no: 1.9s ( 8.1x, 0.5%) me: 8.6s (37.2x, 0.2%) ca:13.1s (57.1x, 0.2%) he:12.7s (55.2x, -1.0%) ca:11.2s (48.6x, 0.9%) dr: 7.7s (33.6x, 5.6%) ma: 7.9s (34.3x, 0.5%) -- heap_pdb4 -- heap_pdb4 valgrind-new:0.22s no: 2.0s ( 9.3x, -----) me:12.7s (57.8x, -----) ca:14.2s (64.5x, -----) he:13.9s (63.4x, -----) ca:12.3s (56.1x, -----) dr: 9.1s (41.5x, -----) ma: 8.0s (36.5x, -----) heap_pdb4 valgrind-old:0.22s no: 2.0s ( 9.3x, 0.0%) me:12.8s (58.0x, -0.3%) ca:14.2s (64.7x, -0.4%) he:14.3s (65.2x, -2.9%) ca:12.5s (56.6x, -0.9%) dr: 8.6s (39.0x, 6.0%) ma: 8.1s (36.7x, -0.7%) -- many-loss-records -- many-loss-records valgrind-new:0.02s no: 0.5s (24.5x, -----) me: 2.1s (103.5x, -----) ca: 1.9s (97.5x, -----) he: 2.1s (106.5x, -----) ca: 1.9s (95.5x, -----) dr: 1.8s (90.5x, -----) ma: 1.7s (85.0x, -----) many-loss-records valgrind-old:0.02s no: 0.5s (24.5x, 0.0%) me: 2.1s (103.5x, 0.0%) ca: 1.9s (97.0x, 0.5%) he: 2.2s (108.5x, -1.9%) ca: 1.9s (95.5x, 0.0%) dr: 1.7s (86.5x, 4.4%) ma: 1.7s (83.5x, 1.8%) -- many-xpts -- many-xpts valgrind-new:0.07s no: 0.6s ( 9.1x, -----) me: 3.1s (44.7x, -----) ca:371.4s (5305.7x, -----) he: 6.5s (92.7x, -----) ca: 2.8s (40.0x, -----) dr: 2.6s (37.4x, -----) ma: 2.7s (38.0x, -----) many-xpts valgrind-old:0.07s no: 0.7s ( 9.3x, -1.6%) me: 3.1s (44.6x, 0.3%) ca:370.3s (5290.0x, 0.3%) he: 6.5s (93.3x, -0.6%) ca: 2.8s (39.7x, 0.7%) dr: 2.5s (35.4x, 5.3%) ma: 2.6s (37.6x, 1.1%) -- sarp -- sarp valgrind-new:0.03s no: 0.6s (19.3x, -----) me: 3.4s (114.3x, -----) ca: 3.2s (106.3x, -----) he:16.3s (544.7x, -----) ca: 2.0s (68.3x, -----) dr: 1.6s (53.3x, -----) ma: 0.5s (16.3x, -----) sarp valgrind-old:0.03s no: 0.6s (19.3x, 0.0%) me: 3.4s (114.0x, 0.3%) ca: 3.1s (105.0x, 1.3%) he:16.6s (554.3x, -1.8%) ca: 2.0s (68.3x, 0.0%) dr: 1.4s (45.0x, 15.6%) ma: 0.5s (16.0x, 2.0%) -- tinycc -- tinycc valgrind-new:0.22s no: 3.0s (13.5x, -----) me:14.4s (65.6x, -----) ca:30.1s (136.9x, -----) he:27.6s (125.5x, -----) ca:21.3s (96.9x, -----) dr:22.1s (100.5x, -----) ma: 4.0s (18.1x, -----) tinycc valgrind-old:0.22s no: 2.8s (12.9x, 4.4%) me:14.4s (65.5x, 0.2%) ca:30.0s (136.5x, 0.3%) he:27.6s (125.6x, -0.0%) ca:21.3s (96.8x, 0.1%) dr:20.6s (93.7x, 6.8%) ma: 4.0s (18.2x, -0.3%) -- Finished tests in perf ---------------------------------------------- == 11 programs, 154 timings ================= real 111m32.640s user 110m13.840s sys 1m9.220s |
|
From: Tom H. <to...@co...> - 2014-06-15 03:49:48
|
valgrind revision: 14034 VEX revision: 2875 C compiler: gcc (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8) GDB: Assembler: GNU assembler version 2.18.50.0.6-2 20080403 C library: GNU C Library stable release version 2.8 uname -mrs: Linux 3.13.10-200.fc20.x86_64 x86_64 Vendor version: Fedora release 9 (Sulphur) Nightly build on bristol ( x86_64, Fedora 9 ) Started at 2014-06-15 03:51:17 BST Ended at 2014-06-15 04:49:27 BST Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 650 tests, 2 stderr failures, 1 stdout failure, 0 stderrB failures, 0 stdoutB failures, 0 post failures == memcheck/tests/amd64/insn-pcmpistri (stderr) memcheck/tests/err_disable4 (stderr) none/tests/amd64/sse4-64 (stdout) |
|
From: Rich C. <rc...@wi...> - 2014-06-15 03:36:04
|
valgrind revision: 14034
VEX revision: 2875
C compiler: gcc (SUSE Linux) 4.7.2 20130108 [gcc-4_7-branch revision 195012]
GDB: GNU gdb (GDB) SUSE (7.5.1-2.1.1)
Assembler: GNU assembler (GNU Binutils; openSUSE 12.3) 2.23.1
C library: GNU C Library (GNU libc) stable release version 2.17 (git c758a6861537)
uname -mrs: Linux 3.7.9-1.1-desktop x86_64
Vendor version: Welcome to openSUSE 12.3 "Dartmouth" Beta 1 - Kernel %r (%t).
Nightly build on ultra ( gcc (SUSE Linux) 4.7.2 20130108 [gcc-4_7-branch revision 195012] Linux 3.7.9-1.1-desktop x86_64 )
Started at 2014-06-14 21:30:01 CDT
Ended at 2014-06-14 22:35:53 CDT
Results differ from 24 hours ago
Checking out valgrind source tree ... done
Configuring valgrind ... done
Building valgrind ... done
Running regression tests ... failed
Regression test results follow
== 674 tests, 0 stderr failures, 0 stdout failures, 2 stderrB failures, 0 stdoutB failures, 0 post failures ==
gdbserver_tests/hginfo (stderrB)
gdbserver_tests/mssnapshot (stderrB)
=================================================
== Results from 24 hours ago ==
=================================================
Checking out valgrind source tree ... done
Configuring valgrind ... done
Building valgrind ... done
Running regression tests ... failed
Regression test results follow
== 675 tests, 0 stderr failures, 0 stdout failures, 2 stderrB failures, 0 stdoutB failures, 0 post failures ==
gdbserver_tests/hginfo (stderrB)
gdbserver_tests/mssnapshot (stderrB)
=================================================
== Difference between 24 hours ago and now ==
=================================================
*** old.short Sat Jun 14 22:00:10 2014
--- new.short Sat Jun 14 22:35:53 2014
***************
*** 8,10 ****
! == 675 tests, 0 stderr failures, 0 stdout failures, 2 stderrB failures, 0 stdoutB failures, 0 post failures ==
gdbserver_tests/hginfo (stderrB)
--- 8,10 ----
! == 674 tests, 0 stderr failures, 0 stdout failures, 2 stderrB failures, 0 stdoutB failures, 0 post failures ==
gdbserver_tests/hginfo (stderrB)
=================================================
./valgrind-new/gdbserver_tests/hginfo.stderrB.diff
=================================================
--- hginfo.stderrB.exp 2014-06-14 22:14:26.525880599 -0500
+++ hginfo.stderrB.out 2014-06-14 22:24:12.573591225 -0500
@@ -1,5 +1,11 @@
relaying data between gdb and process ....
+Missing separate debuginfo for /lib64/ld-linux-x86-64.so.2
+Try: zypper install -C "debuginfo(build-id)=ecb8ef1a6904a2a3ec60a527f415f520c8636158"
vgdb-error value changed from 0 to 999999
+Missing separate debuginfo for /lib64/libpthread.so.0
+Try: zypper install -C "debuginfo(build-id)=ef5f5dbcb2398c608fef7884e1bfb65be3b5f0ef"
+Missing separate debuginfo for /lib64/libc.so.6
+Try: zypper install -C "debuginfo(build-id)=bd1473e8e6a4c10a14731b5be4b35b4e87db2af7"
Lock ga 0x........ {
Address 0x........ is 0 bytes inside data symbol "mx"
kind mbRec
=================================================
./valgrind-new/gdbserver_tests/mssnapshot.stderrB.diff
=================================================
--- mssnapshot.stderrB.exp 2014-06-14 22:14:26.528880645 -0500
+++ mssnapshot.stderrB.out 2014-06-14 22:24:45.907659753 -0500
@@ -1,5 +1,11 @@
relaying data between gdb and process ....
+Missing separate debuginfo for /lib64/ld-linux-x86-64.so.2
+Try: zypper install -C "debuginfo(build-id)=ecb8ef1a6904a2a3ec60a527f415f520c8636158"
vgdb-error value changed from 0 to 999999
+Missing separate debuginfo for /lib64/libpthread.so.0
+Try: zypper install -C "debuginfo(build-id)=ef5f5dbcb2398c608fef7884e1bfb65be3b5f0ef"
+Missing separate debuginfo for /lib64/libc.so.6
+Try: zypper install -C "debuginfo(build-id)=bd1473e8e6a4c10a14731b5be4b35b4e87db2af7"
general valgrind monitor commands:
help [debug] : monitor command help. With debug: + debugging commands
v.wait [<ms>] : sleep <ms> (default 0) then continue
=================================================
./valgrind-old/gdbserver_tests/hginfo.stderrB.diff
=================================================
--- hginfo.stderrB.exp 2014-06-14 21:31:11.300451902 -0500
+++ hginfo.stderrB.out 2014-06-14 21:48:37.456592108 -0500
@@ -1,5 +1,11 @@
relaying data between gdb and process ....
+Missing separate debuginfo for /lib64/ld-linux-x86-64.so.2
+Try: zypper install -C "debuginfo(build-id)=ecb8ef1a6904a2a3ec60a527f415f520c8636158"
vgdb-error value changed from 0 to 999999
+Missing separate debuginfo for /lib64/libpthread.so.0
+Try: zypper install -C "debuginfo(build-id)=ef5f5dbcb2398c608fef7884e1bfb65be3b5f0ef"
+Missing separate debuginfo for /lib64/libc.so.6
+Try: zypper install -C "debuginfo(build-id)=bd1473e8e6a4c10a14731b5be4b35b4e87db2af7"
Lock ga 0x........ {
Address 0x........ is 0 bytes inside data symbol "mx"
kind mbRec
=================================================
./valgrind-old/gdbserver_tests/mssnapshot.stderrB.diff
=================================================
--- mssnapshot.stderrB.exp 2014-06-14 21:31:11.326451184 -0500
+++ mssnapshot.stderrB.out 2014-06-14 21:49:09.687702964 -0500
@@ -1,5 +1,11 @@
relaying data between gdb and process ....
+Missing separate debuginfo for /lib64/ld-linux-x86-64.so.2
+Try: zypper install -C "debuginfo(build-id)=ecb8ef1a6904a2a3ec60a527f415f520c8636158"
vgdb-error value changed from 0 to 999999
+Missing separate debuginfo for /lib64/libpthread.so.0
+Try: zypper install -C "debuginfo(build-id)=ef5f5dbcb2398c608fef7884e1bfb65be3b5f0ef"
+Missing separate debuginfo for /lib64/libc.so.6
+Try: zypper install -C "debuginfo(build-id)=bd1473e8e6a4c10a14731b5be4b35b4e87db2af7"
general valgrind monitor commands:
help [debug] : monitor command help. With debug: + debugging commands
v.wait [<ms>] : sleep <ms> (default 0) then continue
|
|
From: Rich C. <rc...@wi...> - 2014-06-15 03:11:45
|
valgrind revision: 14034
VEX revision: 2875
C compiler: gcc (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]
GDB: GNU gdb (GDB; openSUSE Factory) 7.6.50.20130731-cvs
Assembler: GNU assembler (GNU Binutils; openSUSE Factory) 2.23.2
C library: GNU C Library (GNU libc) stable release version 2.18 (git )
uname -mrs: Linux 3.11.4-3-desktop x86_64
Vendor version: Welcome to openSUSE 13.1 "Bottle" Beta 1 - Kernel %r (%t).
Nightly build on rodan ( Linux 3.11.4-3-desktop x86_64 )
Started at 2014-06-14 19:22:01 CDT
Ended at 2014-06-14 22:11:39 CDT
Results differ from 24 hours ago
Checking out valgrind source tree ... done
Configuring valgrind ... done
Building valgrind ... done
Running regression tests ... failed
Regression test results follow
== 596 tests, 5 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures ==
memcheck/tests/err_disable3 (stderr)
memcheck/tests/err_disable4 (stderr)
memcheck/tests/threadname (stderr)
memcheck/tests/threadname_xml (stderr)
exp-sgcheck/tests/hackedbz2 (stderr)
=================================================
== Results from 24 hours ago ==
=================================================
Checking out valgrind source tree ... done
Configuring valgrind ... done
Building valgrind ... done
Running regression tests ... failed
Regression test results follow
== 597 tests, 5 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures ==
memcheck/tests/err_disable3 (stderr)
memcheck/tests/err_disable4 (stderr)
memcheck/tests/threadname (stderr)
memcheck/tests/threadname_xml (stderr)
exp-sgcheck/tests/hackedbz2 (stderr)
=================================================
== Difference between 24 hours ago and now ==
=================================================
*** old.short Sat Jun 14 20:41:54 2014
--- new.short Sat Jun 14 22:11:39 2014
***************
*** 8,10 ****
! == 597 tests, 5 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures ==
memcheck/tests/err_disable3 (stderr)
--- 8,10 ----
! == 596 tests, 5 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures ==
memcheck/tests/err_disable3 (stderr)
=================================================
./valgrind-new/exp-sgcheck/tests/hackedbz2.stderr.diff-glibc28-amd64
=================================================
--- hackedbz2.stderr.exp-glibc28-amd64 2014-06-14 20:43:00.739949891 -0500
+++ hackedbz2.stderr.out 2014-06-14 22:10:20.169729649 -0500
@@ -1,7 +1,6 @@
Invalid read of size 1
- at 0x........: vex_strlen (hackedbz2.c:1006)
- by 0x........: add_to_myprintf_buf (hackedbz2.c:1284)
+ at 0x........: add_to_myprintf_buf (hackedbz2.c:1006)
by 0x........: vex_printf (hackedbz2.c:1155)
by 0x........: BZ2_compressBlock (hackedbz2.c:4039)
by 0x........: handle_compress (hackedbz2.c:4761)
=================================================
./valgrind-new/memcheck/tests/err_disable3.stderr.diff
=================================================
--- err_disable3.stderr.exp 2014-06-14 21:02:07.293250429 -0500
+++ err_disable3.stderr.out 2014-06-14 21:27:24.301848416 -0500
@@ -10,8 +10,6 @@
Thread 2:
Invalid read of size 1
at 0x........: err (err_disable3.c:25)
- by 0x........: child_fn (err_disable3.c:31)
- ...
Address 0x........ is 5 bytes inside a block of size 10 free'd
at 0x........: free (vg_replace_malloc.c:...)
by 0x........: main (err_disable3.c:42)
=================================================
./valgrind-new/memcheck/tests/err_disable4.stderr.diff
=================================================
--- err_disable4.stderr.exp 2014-06-14 21:00:59.237460951 -0500
+++ err_disable4.stderr.out 2014-06-14 21:27:28.806900676 -0500
@@ -1501,8 +1501,6 @@
Thread x:
Invalid read of size 1
at 0x........: err (err_disable4.c:41)
- by 0x........: child_fn_2 (err_disable4.c:55)
- ...
Address 0x........ is 5 bytes inside a block of size 10 free'd
at 0x........: free (vg_replace_malloc.c:...)
by 0x........: main (err_disable4.c:68)
=================================================
./valgrind-new/memcheck/tests/threadname.stderr.diff
=================================================
--- threadname.stderr.exp 2014-06-14 21:00:59.260461218 -0500
+++ threadname.stderr.out 2014-06-14 21:33:24.637028467 -0500
@@ -9,36 +9,12 @@
Thread 2:
Invalid write of size 1
at 0x........: bad_things (threadname.c:16)
- by 0x........: child_fn_0 (threadname.c:53)
- ...
Address 0x........ is 0 bytes after a block of size 2 alloc'd
at 0x........: malloc (vg_replace_malloc.c:...)
by 0x........: bad_things (threadname.c:15)
by 0x........: child_fn_0 (threadname.c:53)
...
-Thread 3 try1:
-Invalid write of size 1
- at 0x........: bad_things (threadname.c:16)
- by 0x........: child_fn_1 (threadname.c:38)
- ...
- Address 0x........ is 0 bytes after a block of size 3 alloc'd
- at 0x........: malloc (vg_replace_malloc.c:...)
- by 0x........: bad_things (threadname.c:15)
- by 0x........: child_fn_1 (threadname.c:38)
- ...
-
-Thread 4 012345678901234:
-Invalid write of size 1
- at 0x........: bad_things (threadname.c:16)
- by 0x........: child_fn_2 (threadname.c:26)
- ...
- Address 0x........ is 0 bytes after a block of size 4 alloc'd
- at 0x........: malloc (vg_replace_malloc.c:...)
- by 0x........: bad_things (threadname.c:15)
- by 0x........: child_fn_2 (threadname.c:26)
- ...
-
Thread 1:
Invalid write of size 1
at 0x........: bad_things (threadname.c:16)
=================================================
./valgrind-new/memcheck/tests/threadname_xml.stderr.diff
=================================================
--- threadname_xml.stderr.exp 2014-06-14 21:02:19.134387791 -0500
+++ threadname_xml.stderr.out 2014-06-14 21:33:26.718052608 -0500
@@ -94,14 +94,6 @@
<file>threadname.c</file>
<line>...</line>
</frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_0</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
</stack>
<auxwhat>Address 0x........ is 0 bytes after a block of size 2 alloc'd</auxwhat>
<stack>
@@ -135,112 +127,6 @@
<error>
<unique>0x........</unique>
<tid>...</tid>
- <threadname>try1</threadname>
- <kind>InvalidWrite</kind>
- <what>Invalid write of size 1</what>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>bad_things</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_1</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- </stack>
- <auxwhat>Address 0x........ is 0 bytes after a block of size 3 alloc'd</auxwhat>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>malloc</fn>
- <dir>...</dir>
- <file>vg_replace_malloc.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>bad_things</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_1</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- </stack>
-</error>
-
-<error>
- <unique>0x........</unique>
- <tid>...</tid>
- <threadname>012345678901234</threadname>
- <kind>InvalidWrite</kind>
- <what>Invalid write of size 1</what>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>bad_things</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_2</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- </stack>
- <auxwhat>Address 0x........ is 0 bytes after a block of size 4 alloc'd</auxwhat>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
<truncated beyond 100 lines>
=================================================
./valgrind-old/exp-sgcheck/tests/hackedbz2.stderr.diff-glibc28-amd64
=================================================
--- hackedbz2.stderr.exp-glibc28-amd64 2014-06-14 19:22:34.229960190 -0500
+++ hackedbz2.stderr.out 2014-06-14 20:40:34.736256182 -0500
@@ -1,7 +1,6 @@
Invalid read of size 1
- at 0x........: vex_strlen (hackedbz2.c:1006)
- by 0x........: add_to_myprintf_buf (hackedbz2.c:1284)
+ at 0x........: add_to_myprintf_buf (hackedbz2.c:1006)
by 0x........: vex_printf (hackedbz2.c:1155)
by 0x........: BZ2_compressBlock (hackedbz2.c:4039)
by 0x........: handle_compress (hackedbz2.c:4761)
=================================================
./valgrind-old/memcheck/tests/err_disable3.stderr.diff
=================================================
--- err_disable3.stderr.exp 2014-06-14 19:27:12.661190118 -0500
+++ err_disable3.stderr.out 2014-06-14 19:57:42.062412001 -0500
@@ -10,8 +10,6 @@
Thread 2:
Invalid read of size 1
at 0x........: err (err_disable3.c:25)
- by 0x........: child_fn (err_disable3.c:31)
- ...
Address 0x........ is 5 bytes inside a block of size 10 free'd
at 0x........: free (vg_replace_malloc.c:...)
by 0x........: main (err_disable3.c:42)
=================================================
./valgrind-old/memcheck/tests/err_disable4.stderr.diff
=================================================
--- err_disable4.stderr.exp 2014-06-14 19:27:37.904482952 -0500
+++ err_disable4.stderr.out 2014-06-14 19:57:46.488463345 -0500
@@ -1501,8 +1501,6 @@
Thread x:
Invalid read of size 1
at 0x........: err (err_disable4.c:41)
- by 0x........: child_fn_2 (err_disable4.c:55)
- ...
Address 0x........ is 5 bytes inside a block of size 10 free'd
at 0x........: free (vg_replace_malloc.c:...)
by 0x........: main (err_disable4.c:68)
=================================================
./valgrind-old/memcheck/tests/threadname.stderr.diff
=================================================
--- threadname.stderr.exp 2014-06-14 19:27:37.927483219 -0500
+++ threadname.stderr.out 2014-06-14 20:03:42.390591971 -0500
@@ -9,36 +9,12 @@
Thread 2:
Invalid write of size 1
at 0x........: bad_things (threadname.c:16)
- by 0x........: child_fn_0 (threadname.c:53)
- ...
Address 0x........ is 0 bytes after a block of size 2 alloc'd
at 0x........: malloc (vg_replace_malloc.c:...)
by 0x........: bad_things (threadname.c:15)
by 0x........: child_fn_0 (threadname.c:53)
...
-Thread 3 try1:
-Invalid write of size 1
- at 0x........: bad_things (threadname.c:16)
- by 0x........: child_fn_1 (threadname.c:38)
- ...
- Address 0x........ is 0 bytes after a block of size 3 alloc'd
- at 0x........: malloc (vg_replace_malloc.c:...)
- by 0x........: bad_things (threadname.c:15)
- by 0x........: child_fn_1 (threadname.c:38)
- ...
-
-Thread 4 012345678901234:
-Invalid write of size 1
- at 0x........: bad_things (threadname.c:16)
- by 0x........: child_fn_2 (threadname.c:26)
- ...
- Address 0x........ is 0 bytes after a block of size 4 alloc'd
- at 0x........: malloc (vg_replace_malloc.c:...)
- by 0x........: bad_things (threadname.c:15)
- by 0x........: child_fn_2 (threadname.c:26)
- ...
-
Thread 1:
Invalid write of size 1
at 0x........: bad_things (threadname.c:16)
=================================================
./valgrind-old/memcheck/tests/threadname_xml.stderr.diff
=================================================
--- threadname_xml.stderr.exp 2014-06-14 19:27:21.797296101 -0500
+++ threadname_xml.stderr.out 2014-06-14 20:03:44.433615671 -0500
@@ -94,14 +94,6 @@
<file>threadname.c</file>
<line>...</line>
</frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_0</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
</stack>
<auxwhat>Address 0x........ is 0 bytes after a block of size 2 alloc'd</auxwhat>
<stack>
@@ -135,112 +127,6 @@
<error>
<unique>0x........</unique>
<tid>...</tid>
- <threadname>try1</threadname>
- <kind>InvalidWrite</kind>
- <what>Invalid write of size 1</what>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>bad_things</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_1</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- </stack>
- <auxwhat>Address 0x........ is 0 bytes after a block of size 3 alloc'd</auxwhat>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>malloc</fn>
- <dir>...</dir>
- <file>vg_replace_malloc.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>bad_things</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_1</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- </stack>
-</error>
-
-<error>
- <unique>0x........</unique>
- <tid>...</tid>
- <threadname>012345678901234</threadname>
- <kind>InvalidWrite</kind>
- <what>Invalid write of size 1</what>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>bad_things</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_2</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- </stack>
- <auxwhat>Address 0x........ is 0 bytes after a block of size 4 alloc'd</auxwhat>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
<truncated beyond 100 lines>
|
|
From: Tom H. <to...@co...> - 2014-06-15 02:43:07
|
valgrind revision: 14034 VEX revision: 2875 C compiler: gcc (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2) GDB: GNU gdb (GDB) Fedora (7.3.50.20110722-16.fc16) Assembler: GNU assembler version 2.21.53.0.1-6.fc16 20110716 C library: GNU C Library development release version 2.14.90 uname -mrs: Linux 3.13.10-200.fc20.x86_64 x86_64 Vendor version: Fedora release 16 (Verne) Nightly build on bristol ( x86_64, Fedora 16 ) Started at 2014-06-15 03:01:42 BST Ended at 2014-06-15 03:42:54 BST Results differ from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 681 tests, 1 stderr failure, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures == memcheck/tests/err_disable4 (stderr) ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 682 tests, 1 stderr failure, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures == memcheck/tests/err_disable4 (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short 2014-06-15 03:21:34.108283657 +0100 --- new.short 2014-06-15 03:42:54.138915852 +0100 *************** *** 8,10 **** ! == 682 tests, 1 stderr failure, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures == memcheck/tests/err_disable4 (stderr) --- 8,10 ---- ! == 681 tests, 1 stderr failure, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures == memcheck/tests/err_disable4 (stderr) |
|
From: Tom H. <to...@co...> - 2014-06-15 02:32:14
|
valgrind revision: 14034 VEX revision: 2875 C compiler: gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2) GDB: GNU gdb (GDB) Fedora (7.4.50.20120120-54.fc17) Assembler: GNU assembler version 2.22.52.0.1-10.fc17 20120131 C library: GNU C Library stable release version 2.15 uname -mrs: Linux 3.13.10-200.fc20.x86_64 x86_64 Vendor version: Fedora release 17 (Beefy Miracle) Nightly build on bristol ( x86_64, Fedora 17 (Beefy Miracle) ) Started at 2014-06-15 02:51:00 BST Ended at 2014-06-15 03:31:58 BST Results differ from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 681 tests, 5 stderr failures, 1 stdout failure, 0 stderrB failures, 0 stdoutB failures, 0 post failures == gdbserver_tests/mcinfcallRU (stderr) gdbserver_tests/mcinfcallWSRU (stderr) gdbserver_tests/mcmain_pic (stderr) memcheck/tests/err_disable4 (stderr) exp-sgcheck/tests/preen_invars (stdout) exp-sgcheck/tests/preen_invars (stderr) ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 682 tests, 5 stderr failures, 1 stdout failure, 0 stderrB failures, 0 stdoutB failures, 0 post failures == gdbserver_tests/mcinfcallRU (stderr) gdbserver_tests/mcinfcallWSRU (stderr) gdbserver_tests/mcmain_pic (stderr) memcheck/tests/err_disable4 (stderr) exp-sgcheck/tests/preen_invars (stdout) exp-sgcheck/tests/preen_invars (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short 2014-06-15 03:10:26.725626308 +0100 --- new.short 2014-06-15 03:31:58.866871714 +0100 *************** *** 8,10 **** ! == 682 tests, 5 stderr failures, 1 stdout failure, 0 stderrB failures, 0 stdoutB failures, 0 post failures == gdbserver_tests/mcinfcallRU (stderr) --- 8,10 ---- ! == 681 tests, 5 stderr failures, 1 stdout failure, 0 stderrB failures, 0 stdoutB failures, 0 post failures == gdbserver_tests/mcinfcallRU (stderr) |
|
From: Tom H. <to...@co...> - 2014-06-15 02:21:53
|
valgrind revision: 14034 VEX revision: 2875 C compiler: gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8) GDB: GNU gdb (GDB) Fedora 7.5.1-42.fc18 Assembler: GNU assembler version 2.23.51.0.1-10.fc18 20120806 C library: GNU C Library stable release version 2.16 uname -mrs: Linux 3.13.10-200.fc20.x86_64 x86_64 Vendor version: Fedora release 18 (Spherical Cow) Nightly build on bristol ( x86_64, Fedora 18 (Spherical Cow) ) Started at 2014-06-15 02:41:12 BST Ended at 2014-06-15 03:21:40 BST Results differ from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 681 tests, 2 stderr failures, 1 stdout failure, 0 stderrB failures, 0 stdoutB failures, 0 post failures == memcheck/tests/err_disable4 (stderr) exp-sgcheck/tests/preen_invars (stdout) exp-sgcheck/tests/preen_invars (stderr) ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 682 tests, 2 stderr failures, 1 stdout failure, 0 stderrB failures, 0 stdoutB failures, 0 post failures == memcheck/tests/err_disable4 (stderr) exp-sgcheck/tests/preen_invars (stdout) exp-sgcheck/tests/preen_invars (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short 2014-06-15 03:00:46.360123953 +0100 --- new.short 2014-06-15 03:21:40.394158394 +0100 *************** *** 8,10 **** ! == 682 tests, 2 stderr failures, 1 stdout failure, 0 stderrB failures, 0 stdoutB failures, 0 post failures == memcheck/tests/err_disable4 (stderr) --- 8,10 ---- ! == 681 tests, 2 stderr failures, 1 stdout failure, 0 stderrB failures, 0 stdoutB failures, 0 post failures == memcheck/tests/err_disable4 (stderr) |
|
From: Tom H. <to...@co...> - 2014-06-15 02:12:22
|
valgrind revision: 14034 VEX revision: 2875 C compiler: gcc (GCC) 4.8.2 20131212 (Red Hat 4.8.2-7) GDB: GNU gdb (GDB) Fedora 7.6.1-46.fc19 Assembler: GNU assembler version 2.23.52.0.1-9.fc19 20130226 C library: GNU C Library (GNU libc) stable release version 2.17 uname -mrs: Linux 3.13.10-200.fc20.x86_64 x86_64 Vendor version: Fedora release 19 (Schrödingerâs Cat) Nightly build on bristol ( x86_64, Fedora 19 (Schrödingerâs Cat) ) Started at 2014-06-15 02:31:42 BST Ended at 2014-06-15 03:12:09 BST Results differ from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 681 tests, 2 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures == memcheck/tests/err_disable4 (stderr) exp-sgcheck/tests/hackedbz2 (stderr) ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 682 tests, 2 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures == memcheck/tests/err_disable4 (stderr) exp-sgcheck/tests/hackedbz2 (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short 2014-06-15 02:52:19.074056971 +0100 --- new.short 2014-06-15 03:12:09.604579461 +0100 *************** *** 8,10 **** ! == 682 tests, 2 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures == memcheck/tests/err_disable4 (stderr) --- 8,10 ---- ! == 681 tests, 2 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures == memcheck/tests/err_disable4 (stderr) |