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
(32) |
Oct
|
Nov
|
Dec
|
|
From: Andreas A. <ar...@so...> - 2023-05-11 16:05:57
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=afa21cd6a259c0b16fdfd78eb84d1ed221cf8268 commit afa21cd6a259c0b16fdfd78eb84d1ed221cf8268 Author: Andreas Arnez <ar...@li...> Date: Tue Jan 24 16:11:12 2023 +0100 s390x: Update information in README.s390 Refresh some of the information in README.s390: * update links to Principles of Operation and Reference Summary * no longer recommend compiling with '-fno-builtin', since there are no known false positives due to builtin string operations anymore * don't mention callgrind as being unsupported, since there are no known issues with it Diff: --- README.s390 | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/README.s390 b/README.s390 index a146eba259..86f867188a 100644 --- a/README.s390 +++ b/README.s390 @@ -13,14 +13,13 @@ Limitations - Hexadecimal floating point is not supported. - Transactional memory is not supported. The transactional-execution facility is masked off from HWCAP. +- A full list of unimplemented instructions can be retrieved from + `docs/internals/s390-opcodes.csv', by grepping for "not implemented". - FP signalling is not accurate. E.g., the "compare and signal" instructions behave like their non-signalling counterparts. -- memcheck, cachegrind, drd, helgrind, massif, lackey, and none are - supported. - On machine models predating z10, cachegrind will assume a z10 cache architecture. Otherwise, cachegrind will query the hosts cache system and use those parameters. -- callgrind and all experimental tools are currently not supported. - Some gcc versions use mvc to copy 4/8 byte values. This will affect certain debug messages. For example, memcheck will complain about 4 one-byte reads/writes instead of just a single read/write. @@ -38,17 +37,11 @@ may not work. As a consequence, programs that attempt to do so may behave differently. It is believed that this is a rare use case. -Recommendations ---------------- -Applications should be compiled with -fno-builtin to avoid -false positives due to builtin string operations when running memcheck. - - Reading Material ---------------- (1) ELF ABI s390x Supplement https://github.com/IBM/s390x-abi/releases (2) z/Architecture Principles of Operation - http://publibfp.dhe.ibm.com/epubs/pdf/a227832c.pdf + https://www.ibm.com/support/pages/zarchitecture-principles-operation (3) z/Architecture Reference Summary - https://www.ibm.com/support/pages/system/files/2020-07/SA22-7871-10.pdf + https://www.ibm.com/support/pages/zarchitecture-reference-summary |
|
From: Andreas A. <ar...@so...> - 2023-05-11 10:52:07
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=053643239ed39e4f6137e78dfd3fd8e259f7827c commit 053643239ed39e4f6137e78dfd3fd8e259f7827c Author: Andreas Arnez <ar...@li...> Date: Thu Sep 1 15:03:01 2022 +0200 Bug 465782 - s390x: Drop -mzarch -march=z900 from assembler options The -mzarch flag is unsupported by Clang, and it is redundant on 64-bit build systems. Remove it. Also remove '-march=z900', since it is unsupported by Clang as well. It would only be needed on build systems with a default architecture lower than z900. Such systems are out of service for some time now. Diff: --- Makefile.all.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.all.am b/Makefile.all.am index 1de1f13a7e..94d65f2ccb 100755 --- a/Makefile.all.am +++ b/Makefile.all.am @@ -270,7 +270,7 @@ AM_CCASFLAGS_AMD64_DARWIN = -arch x86_64 -g AM_FLAG_M3264_S390X_LINUX = @FLAG_M64@ AM_CFLAGS_S390X_LINUX = @FLAG_M64@ $(AM_CFLAGS_BASE) -fomit-frame-pointer AM_CFLAGS_PSO_S390X_LINUX = @FLAG_M64@ $(AM_CFLAGS_BASE) $(AM_CFLAGS_PSO_BASE) -AM_CCASFLAGS_S390X_LINUX = @FLAG_M64@ -g -mzarch -march=z900 +AM_CCASFLAGS_S390X_LINUX = @FLAG_M64@ -g AM_FLAG_M3264_MIPS32_LINUX = @FLAG_M32@ AM_CFLAGS_MIPS32_LINUX = @FLAG_M32@ $(AM_CFLAGS_BASE) |
|
From: Andreas A. <ar...@so...> - 2023-05-11 10:52:06
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=165c3769580b7f256aedb0b5d48972fa28b30094 commit 165c3769580b7f256aedb0b5d48972fa28b30094 Author: Andreas Arnez <ar...@li...> Date: Tue Feb 14 15:35:48 2023 +0100 Bug 465782 - s390x: Adjust inline assemblies for Clang Some s390x inline assemblies are written in such a way that they are understood by GCC but not by Clang: * use of "f" constraint for unsigned long variable * use of "b" modifier when passing a constant * use of the register notation "r11" in ".cfi_def_cfa" Adjust the affected inline assemblies to avoid these constructs. Diff: --- VEX/priv/guest_s390_helpers.c | 246 ++++++++++++++++++++++-------------------- coregrind/m_debuglog.c | 4 +- include/valgrind.h.in | 2 +- 3 files changed, 134 insertions(+), 118 deletions(-) diff --git a/VEX/priv/guest_s390_helpers.c b/VEX/priv/guest_s390_helpers.c index 804b92a296..95bb653274 100644 --- a/VEX/priv/guest_s390_helpers.c +++ b/VEX/priv/guest_s390_helpers.c @@ -913,7 +913,7 @@ s390_do_cvb(ULong decimal) __asm__ volatile ( "cvb %[result],%[input]\n\t" : [result] "=d"(binary) - : [input] "m"(decimal) + : [input] "R"(decimal) ); return binary; @@ -1000,8 +1000,12 @@ UInt s390_do_pfpo(UInt gpr0) { return 0; } /*--- Helper for condition code. ---*/ /*------------------------------------------------------------*/ -/* Convert an IRRoundingMode value to s390_bfp_round_t */ #if defined(VGA_s390x) +typedef long double Float128; +union s390x_F64 { ULong i; Double f; }; +union s390x_F128 { struct { ULong hi, lo; } i; Float128 f; }; + +/* Convert an IRRoundingMode value to s390_bfp_round_t */ static s390_bfp_round_t decode_bfp_rounding_mode(UInt irrm) { @@ -1013,8 +1017,6 @@ decode_bfp_rounding_mode(UInt irrm) } vpanic("decode_bfp_rounding_mode"); } -#endif - #define S390_CC_FOR_BINARY(opcode,cc_dep1,cc_dep2) \ ({ \ @@ -1041,13 +1043,14 @@ decode_bfp_rounding_mode(UInt irrm) /* Recover the original DEP2 value. See comment near s390_cc_thunk_put3 \ for rationale. */ \ cc_dep2 = cc_dep2 ^ cc_ndep; \ + ULong tmp = 1; \ __asm__ volatile ( \ - "lghi 0,1\n\t" \ - "sr 0,%[op3]\n\t" /* borrow to cc */ \ + "sr %[tmp],%[op3]\n\t" /* borrow to cc */ \ opcode " %[op1],%[op2]\n\t" /* then redo the op */\ - "ipm %[psw]\n\t" : [psw] "=d"(psw), [op1] "+&d"(cc_dep1) \ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [op1] "+&d"(cc_dep1), \ + [tmp] "+&d"(tmp) \ : [op2] "d"(cc_dep2), [op3] "d"(cc_ndep) \ - : "0", "cc");\ + : "cc");\ psw >> 28; /* cc */ \ }) @@ -1056,46 +1059,52 @@ decode_bfp_rounding_mode(UInt irrm) /* Recover the original DEP2 value. See comment near s390_cc_thunk_put3 \ for rationale. */ \ cc_dep2 = cc_dep2 ^ cc_ndep; \ + ULong tmp; \ __asm__ volatile ( \ - "lgfr 0,%[op3]\n\t" /* first load cc_ndep */ \ - "aghi 0,0\n\t" /* and convert it into a cc */ \ + "lgfr %[tmp],%[op3]\n\t" /* first load cc_ndep */ \ + "aghi %[tmp],0\n\t" /* and convert it into a cc */ \ opcode " %[op1],%[op2]\n\t" /* then redo the op */\ - "ipm %[psw]\n\t" : [psw] "=d"(psw), [op1] "+&d"(cc_dep1) \ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [op1] "+&d"(cc_dep1), \ + [tmp] "=&d"(tmp) \ : [op2] "d"(cc_dep2), [op3] "d"(cc_ndep) \ - : "0", "cc");\ + : "cc");\ psw >> 28; /* cc */ \ }) #define S390_CC_FOR_BFP_RESULT(opcode,cc_dep1) \ ({ \ + union s390x_F64 op = { .i = cc_dep1 }; \ + Double tmp; \ __asm__ volatile ( \ - opcode " 0,%[op]\n\t" \ - "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [op] "f"(cc_dep1) \ - : "cc", "f0");\ + opcode " %[tmp],%[op]\n\t" \ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [tmp] "=f"(tmp) \ + : [op] "f"(op.f) \ + : "cc");\ psw >> 28; /* cc */ \ }) #define S390_CC_FOR_BFP128_RESULT(hi,lo) \ ({ \ + union s390x_F128 op = { .i = { hi, lo } }; \ + Float128 tmp; \ __asm__ volatile ( \ - "ldr 4,%[high]\n\t" \ - "ldr 6,%[low]\n\t" \ - "ltxbr 0,4\n\t" \ - "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [high] "f"(hi), [low] "f"(lo) \ - : "cc", "f0", "f2", "f4", "f6");\ + "ltxbr %[tmp],%[op]\n\t" \ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [tmp] "=f"(tmp) \ + : [op] "f"(op.f) \ + : "cc");\ psw >> 28; /* cc */ \ }) #define S390_CC_FOR_BFP_CONVERT_AUX(opcode,cc_dep1,rounding_mode) \ ({ \ + union s390x_F64 op = { .i = cc_dep1 }; \ + ULong tmp; \ __asm__ volatile ( \ - opcode " 0," #rounding_mode ",%[op]\n\t" \ - "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [op] "f"(cc_dep1) \ - : "cc", "r0");\ + opcode " %[tmp]," #rounding_mode ",%[op]\n\t" \ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [tmp] "=d"(tmp) \ + : [op] "f"(op.f) \ + : "cc");\ psw >> 28; /* cc */ \ }) @@ -1123,11 +1132,13 @@ decode_bfp_rounding_mode(UInt irrm) #define S390_CC_FOR_BFP_UCONVERT_AUX(opcode,cc_dep1,rounding_mode) \ ({ \ + union s390x_F64 op = { .i = cc_dep1 }; \ + ULong tmp; \ __asm__ volatile ( \ - opcode ",0,%[op]," #rounding_mode ",0\n\t" \ - "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [op] "f"(cc_dep1) \ - : "cc", "r0");\ + opcode ",%[tmp],%[op]," #rounding_mode ",0\n\t" \ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [tmp] "=d"(tmp) \ + : [op] "f"(op.f) \ + : "cc");\ psw >> 28; /* cc */ \ }) @@ -1155,13 +1166,13 @@ decode_bfp_rounding_mode(UInt irrm) #define S390_CC_FOR_BFP128_CONVERT_AUX(opcode,hi,lo,rounding_mode) \ ({ \ + union s390x_F128 op = { .i = { hi, lo } }; \ + ULong tmp; \ __asm__ volatile ( \ - "ldr 4,%[high]\n\t" \ - "ldr 6,%[low]\n\t" \ - opcode " 0," #rounding_mode ",4\n\t" \ - "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [high] "f"(hi), [low] "f"(lo) \ - : "cc", "r0", "f4", "f6");\ + opcode " %[tmp]," #rounding_mode ",%[op]\n\t" \ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [tmp] "=d"(tmp) \ + : [op] "f"(op.f) \ + : "cc");\ psw >> 28; /* cc */ \ }) @@ -1192,13 +1203,13 @@ decode_bfp_rounding_mode(UInt irrm) #define S390_CC_FOR_BFP128_UCONVERT_AUX(opcode,hi,lo,rounding_mode) \ ({ \ + union s390x_F128 op = { .i = { hi, lo } }; \ + ULong tmp; \ __asm__ volatile ( \ - "ldr 4,%[high]\n\t" \ - "ldr 6,%[low]\n\t" \ - opcode ",0,4," #rounding_mode ",0\n\t" \ - "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [high] "f"(hi), [low] "f"(lo) \ - : "cc", "r0", "f4", "f6");\ + opcode ",%[tmp],%[op]," #rounding_mode ",0\n\t" \ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [tmp] "=d"(tmp) \ + : [op] "f"(op.f) \ + : "cc");\ psw >> 28; /* cc */ \ }) @@ -1229,10 +1240,11 @@ decode_bfp_rounding_mode(UInt irrm) #define S390_CC_FOR_BFP_TDC(opcode,cc_dep1,cc_dep2) \ ({ \ + union s390x_F64 val = { .i = cc_dep1 }; \ __asm__ volatile ( \ opcode " %[value],0(%[class])\n\t" \ "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [value] "f"(cc_dep1), \ + : [value] "f"(val.f), \ [class] "a"(cc_dep2) \ : "cc");\ psw >> 28; /* cc */ \ @@ -1243,19 +1255,16 @@ decode_bfp_rounding_mode(UInt irrm) /* Recover the original DEP2 value. See comment near \ s390_cc_thunk_put1f128Z for rationale. */ \ cc_dep2 = cc_dep2 ^ cc_ndep; \ + union s390x_F128 val = { .i = { cc_dep1, cc_dep2 } }; \ __asm__ volatile ( \ - "ldr 4,%[high]\n\t" \ - "ldr 6,%[low]\n\t" \ - "tcxb 4,0(%[class])\n\t" \ + "tcxb %[value],0(%[class])\n\t" \ "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [high] "f"(cc_dep1), [low] "f"(cc_dep2), \ - [class] "a"(cc_ndep) \ - : "cc", "f4", "f6");\ + : [value] "f"(val.f), [class] "a"(cc_ndep) \ + : "cc");\ psw >> 28; /* cc */ \ }) /* Convert an IRRoundingMode value to s390_dfp_round_t */ -#if defined(VGA_s390x) static s390_dfp_round_t decode_dfp_rounding_mode(UInt irrm) { @@ -1279,36 +1288,38 @@ decode_dfp_rounding_mode(UInt irrm) } vpanic("decode_dfp_rounding_mode"); } -#endif #define S390_CC_FOR_DFP_RESULT(cc_dep1) \ ({ \ + union s390x_F64 op = { .i = cc_dep1 }; \ + Double tmp; \ __asm__ volatile ( \ - ".insn rre, 0xb3d60000,0,%[op]\n\t" /* LTDTR */ \ - "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [op] "f"(cc_dep1) \ - : "cc", "f0"); \ + ".insn rre, 0xb3d60000,%[tmp],%[op]\n\t" /* LTDTR */ \ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [tmp] "=f"(tmp) \ + : [op] "f"(op.f) \ + : "cc");\ psw >> 28; /* cc */ \ }) #define S390_CC_FOR_DFP128_RESULT(hi,lo) \ ({ \ + union s390x_F128 op = { .i = { hi, lo } }; \ + Float128 tmp; \ __asm__ volatile ( \ - "ldr 4,%[high]\n\t" \ - "ldr 6,%[low]\n\t" \ - ".insn rre, 0xb3de0000,0,4\n\t" /* LTXTR */ \ - "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [high] "f"(hi), [low] "f"(lo) \ - : "cc", "f0", "f2", "f4", "f6"); \ + ".insn rre, 0xb3de0000,%[tmp],%[op]\n\t" /* LTXTR */ \ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [tmp] "=f"(tmp) \ + : [op] "f"(op.f) \ + : "cc"); \ psw >> 28; /* cc */ \ }) #define S390_CC_FOR_DFP_TD(opcode,cc_dep1,cc_dep2) \ ({ \ + union s390x_F64 val = { .i = cc_dep1 }; \ __asm__ volatile ( \ opcode ",%[value],0(%[class])\n\t" \ "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [value] "f"(cc_dep1), \ + : [value] "f"(val.f), \ [class] "a"(cc_dep2) \ : "cc"); \ psw >> 28; /* cc */ \ @@ -1319,24 +1330,25 @@ decode_dfp_rounding_mode(UInt irrm) /* Recover the original DEP2 value. See comment near \ s390_cc_thunk_put1d128Z for rationale. */ \ cc_dep2 = cc_dep2 ^ cc_ndep; \ + union s390x_F128 val = { .i = { cc_dep1, cc_dep2 } }; \ __asm__ volatile ( \ - "ldr 4,%[high]\n\t" \ - "ldr 6,%[low]\n\t" \ - opcode ",4,0(%[class])\n\t" \ + opcode ",%[value],0(%[class])\n\t" \ "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [high] "f"(cc_dep1), [low] "f"(cc_dep2), \ + : [value] "f"(val.f), \ [class] "a"(cc_ndep) \ - : "cc", "f4", "f6"); \ + : "cc"); \ psw >> 28; /* cc */ \ }) #define S390_CC_FOR_DFP_CONVERT_AUX(opcode,cc_dep1,rounding_mode) \ ({ \ + union s390x_F64 op = { .i = cc_dep1 }; \ + Double tmp; \ __asm__ volatile ( \ - opcode ",0,%[op]," #rounding_mode ",0\n\t" \ - "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [op] "f"(cc_dep1) \ - : "cc", "r0"); \ + opcode ",%[tmp],%[op]," #rounding_mode ",0\n\t" \ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [tmp] "=f"(tmp) \ + : [op] "f"(op.f) \ + : "cc"); \ psw >> 28; /* cc */ \ }) @@ -1382,11 +1394,13 @@ decode_dfp_rounding_mode(UInt irrm) #define S390_CC_FOR_DFP_UCONVERT_AUX(opcode,cc_dep1,rounding_mode) \ ({ \ + union s390x_F64 op = { .i = cc_dep1 }; \ + Double tmp; \ __asm__ volatile ( \ - opcode ",0,%[op]," #rounding_mode ",0\n\t" \ - "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [op] "f"(cc_dep1) \ - : "cc", "r0"); \ + opcode ",%[tmp],%[op]," #rounding_mode ",0\n\t" \ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [tmp] "=f"(tmp) \ + : [op] "f"(op.f) \ + : "cc"); \ psw >> 28; /* cc */ \ }) @@ -1432,13 +1446,13 @@ decode_dfp_rounding_mode(UInt irrm) #define S390_CC_FOR_DFP128_CONVERT_AUX(opcode,hi,lo,rounding_mode) \ ({ \ + union s390x_F128 op = { .i = { hi, lo } }; \ + Double tmp; \ __asm__ volatile ( \ - "ldr 4,%[high]\n\t" \ - "ldr 6,%[low]\n\t" \ - opcode ",0,4," #rounding_mode ",0\n\t" \ - "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [high] "f"(hi), [low] "f"(lo) \ - : "cc", "r0", "f4", "f6"); \ + opcode ",%[tmp],%[op]," #rounding_mode ",0\n\t" \ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [tmp] "=f"(tmp) \ + : [op] "f"(op.f) \ + : "cc"); \ psw >> 28; /* cc */ \ }) @@ -1485,16 +1499,16 @@ decode_dfp_rounding_mode(UInt irrm) cc; \ }) -#define S390_CC_FOR_DFP128_UCONVERT_AUX(opcode,hi,lo,rounding_mode) \ - ({ \ - __asm__ volatile ( \ - "ldr 4,%[high]\n\t" \ - "ldr 6,%[low]\n\t" \ - opcode ",0,4," #rounding_mode ",0\n\t" \ - "ipm %[psw]\n\t" : [psw] "=d"(psw) \ - : [high] "f"(hi), [low] "f"(lo) \ - : "cc", "r0", "f4", "f6"); \ - psw >> 28; /* cc */ \ +#define S390_CC_FOR_DFP128_UCONVERT_AUX(opcode,hi,lo,rounding_mode) \ + ({ \ + union s390x_F128 op = { .i = { hi, lo } }; \ + Double tmp; \ + __asm__ volatile ( \ + opcode ",%[tmp],%[op]," #rounding_mode ",0\n\t" \ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [tmp] "=f"(tmp) \ + : [op] "f"(op.f) \ + : "cc"); \ + psw >> 28; /* cc */ \ }) #define S390_CC_FOR_DFP128_UCONVERT(opcode,cc_dep1,cc_dep2,cc_ndep) \ @@ -1539,6 +1553,7 @@ decode_dfp_rounding_mode(UInt irrm) } \ cc; \ }) +#endif /* VGA_s390x */ /* Return the value of the condition code from the supplied thunk parameters. @@ -1620,14 +1635,15 @@ s390_calculate_cc(ULong cc_op, ULong cc_dep1, ULong cc_dep2, ULong cc_ndep) case S390_CC_OP_TEST_UNDER_MASK_8: { UChar value = cc_dep1; UChar mask = cc_dep2; + ULong pc; __asm__ volatile ( - "bras %%r2,1f\n\t" /* %r2 = address of next insn */ + "bras %[pc],1f\n\t" /* pc = address of next insn */ "tm %[value],0\n\t" /* this is skipped, then EXecuted */ - "1: ex %[mask],0(%%r2)\n\t" /* EXecute TM after modifying mask */ - "ipm %[psw]\n\t" : [psw] "=d"(psw) - : [value] "m"(value), [mask] "a"(mask) - : "r2", "cc"); + "1: ex %[mask],0(%[pc])\n\t" /* EXecute TM after modifying mask */ + "ipm %[psw]\n\t" : [psw] "=d"(psw), [pc] "=&a"(pc) + : [value] "Q"(value), [mask] "a"(mask) + : "cc"); return psw >> 28; /* cc */ } @@ -1641,7 +1657,7 @@ s390_calculate_cc(ULong cc_op, ULong cc_dep1, ULong cc_dep2, ULong cc_ndep) "lhi 2,0x10\n\t" "ex 2,%[insn]\n\t" "ipm %[psw]\n\t" : [psw] "=d"(psw) - : [value] "d"(value), [insn] "m"(insn) + : [value] "d"(value), [insn] "R"(insn) : "r1", "r2", "cc"); return psw >> 28; /* cc */ } @@ -1812,11 +1828,11 @@ s390_calculate_cc(ULong cc_op, ULong cc_dep1, ULong cc_dep2, ULong cc_ndep) case S390_CC_OP_PFPO_32: { __asm__ volatile( - "ler 4, %[cc_dep1]\n\t" /* 32 bit FR move */ - "lr 0, %[cc_dep2]\n\t" /* 32 bit GR move */ - ".short 0x010a\n\t" /* PFPO */ - "ipm %[psw]\n\t" : [psw] "=d"(psw) - : [cc_dep1] "f"(cc_dep1), + "ldgr 4, %[cc_dep1]\n\t" /* Load FR from GR */ + "lr 0, %[cc_dep2]\n\t" /* 32 bit GR move */ + ".insn e,0x010a\n\t" /* PFPO */ + "ipm %[psw]\n\t" : [psw] "=d"(psw) + : [cc_dep1] "d"(cc_dep1), [cc_dep2] "d"(cc_dep2) : "r0", "r1", "f4"); return psw >> 28; /* cc */ @@ -1824,11 +1840,11 @@ s390_calculate_cc(ULong cc_op, ULong cc_dep1, ULong cc_dep2, ULong cc_ndep) case S390_CC_OP_PFPO_64: { __asm__ volatile( - "ldr 4, %[cc_dep1]\n\t" - "lr 0, %[cc_dep2]\n\t" /* 32 bit register move */ - ".short 0x010a\n\t" /* PFPO */ - "ipm %[psw]\n\t" : [psw] "=d"(psw) - : [cc_dep1] "f"(cc_dep1), + "ldgr 4, %[cc_dep1]\n\t" + "lr 0, %[cc_dep2]\n\t" /* 32 bit register move */ + ".insn e,0x010a\n\t" /* PFPO */ + "ipm %[psw]\n\t" : [psw] "=d"(psw) + : [cc_dep1] "d"(cc_dep1), [cc_dep2] "d"(cc_dep2) : "r0", "r1", "f4"); return psw >> 28; /* cc */ @@ -1836,13 +1852,13 @@ s390_calculate_cc(ULong cc_op, ULong cc_dep1, ULong cc_dep2, ULong cc_ndep) case S390_CC_OP_PFPO_128: { __asm__ volatile( - "ldr 4,%[cc_dep1]\n\t" - "ldr 6,%[cc_dep2]\n\t" - "lr 0,%[cc_ndep]\n\t" /* 32 bit register move */ - ".short 0x010a\n\t" /* PFPO */ - "ipm %[psw]\n\t" : [psw] "=d"(psw) - : [cc_dep1] "f"(cc_dep1), - [cc_dep2] "f"(cc_dep2), + "ldgr 4,%[cc_dep1]\n\t" + "ldgr 6,%[cc_dep2]\n\t" + "lr 0,%[cc_ndep]\n\t" /* 32 bit register move */ + ".insn e,0x010a\n\t" /* PFPO */ + "ipm %[psw]\n\t" : [psw] "=d"(psw) + : [cc_dep1] "d"(cc_dep1), + [cc_dep2] "d"(cc_dep2), [cc_ndep] "d"(cc_ndep) : "r0", "r1", "f0", "f2", "f4", "f6"); return psw >> 28; /* cc */ @@ -2689,7 +2705,7 @@ s390x_dirtyhelper_vec_op(VexGuestS390XState *guest_state, [arg3] "r" (&guest_v[d->v4]), [zero] "r" (0ULL), - [insn] "m" (the_insn), + [insn] "R" (the_insn), [read_only] "r" (d->read_only) : "cc", "r10", "v16", "v17", "v18", "v19" diff --git a/coregrind/m_debuglog.c b/coregrind/m_debuglog.c index 355c3caf5b..fd6db4beb4 100644 --- a/coregrind/m_debuglog.c +++ b/coregrind/m_debuglog.c @@ -404,7 +404,7 @@ static UInt local_sys_write_stderr ( const HChar* buf, Int n ) ULong __res; __asm__ __volatile__ ( - "svc %b1\n" + "svc %c1\n" : "=d" (r2_res) : "i" (__NR_write), "0" (r2), @@ -424,7 +424,7 @@ static UInt local_sys_getpid ( void ) ULong __res; __asm__ __volatile__ ( - "svc %b1\n" + "svc %c1\n" : "=d" (r2) : "i" (__NR_getpid) : "cc", "memory"); diff --git a/include/valgrind.h.in b/include/valgrind.h.in index aa0b431256..45f6522f34 100644 --- a/include/valgrind.h.in +++ b/include/valgrind.h.in @@ -4748,7 +4748,7 @@ typedef "lgr 1,%1\n\t" /* copy the argvec pointer in r1 */ \ "lgr 7,11\n\t" \ "lgr 11,%2\n\t" \ - ".cfi_def_cfa r11, 0\n\t" + ".cfi_def_cfa 11, 0\n\t" # define VALGRIND_CFI_EPILOGUE \ "lgr 11, 7\n\t" \ ".cfi_restore_state\n\t" |
|
From: Andreas A. <ar...@so...> - 2023-05-11 10:52:06
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=d3ee8178e1d28c409520646a4f776eb9b946456a commit d3ee8178e1d28c409520646a4f776eb9b946456a Author: Andreas Arnez <ar...@li...> Date: Wed Feb 15 18:02:37 2023 +0100 Bug 465782 - s390x: Avoid __builtin_setjmp Currently Clang doesn't support __builtin_setjmp() on s390x. Since Valgrind already has an alternate implementation of setjmp/longjmp for many other platforms, just add one for s390x as well, to get rid of this dependency. Diff: --- coregrind/m_libcsetjmp.c | 44 +++++++++++++++++++++++++++++++++++++++++-- include/pub_tool_libcsetjmp.h | 8 ++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/coregrind/m_libcsetjmp.c b/coregrind/m_libcsetjmp.c index 4f1ecb1502..f53a223528 100644 --- a/coregrind/m_libcsetjmp.c +++ b/coregrind/m_libcsetjmp.c @@ -36,9 +36,9 @@ /* See include/pub_tool_libcsetjmp.h for background and rationale. */ -/* The alternative implementations are for ppc{32,64}-linux and +/* The alternative implementations are for s390x-linux, ppc{32,64}-linux, and {amd64,x86}-{linux,darwin,solaris,freebsd}. See #259977. That leaves only - {arm,s390x}-linux using the gcc builtins now. + arm-linux using the gcc builtins now. */ /* ------------ ppc32-linux ------------ */ @@ -741,6 +741,46 @@ __asm__( ); #endif /* VGP_nanomips_linux */ +/* ------------ s390x-linux ------------ */ + +#if defined(VGP_s390x_linux) +__asm__( +".text" "\n" +".align 4" "\n" +".globl VG_MINIMAL_SETJMP" "\n" +".type VG_MINIMAL_SETJMP, @function" "\n" +"VG_MINIMAL_SETJMP:" "\n" +" stmg 6,15,0(2)" "\n" +" std 8,80(2)" "\n" +" std 9,88(2)" "\n" +" std 10,96(2)" "\n" +" std 11,104(2)" "\n" +" std 12,112(2)" "\n" +" std 13,120(2)" "\n" +" std 14,128(2)" "\n" +" std 15,136(2)" "\n" +// return zero +" lghi 2,0" "\n" +" br 14" "\n" + +".align 4" "\n" +".globl VG_MINIMAL_LONGJMP" "\n" +".type VG_MINIMAL_LONGJMP, @function" "\n" +"VG_MINIMAL_LONGJMP:" "\n" +" lmg 6,15,0(2)" "\n" +" ld 8,80(2)" "\n" +" ld 9,88(2)" "\n" +" ld 10,96(2)" "\n" +" ld 11,104(2)" "\n" +" ld 12,112(2)" "\n" +" ld 13,120(2)" "\n" +" ld 14,128(2)" "\n" +" ld 15,136(2)" "\n" +// return the argument (nonzero) +" br 14" "\n" +); +#endif /* VGP_s390x_linux */ + /*--------------------------------------------------------------------*/ /*--- end ---*/ /*--------------------------------------------------------------------*/ diff --git a/include/pub_tool_libcsetjmp.h b/include/pub_tool_libcsetjmp.h index 6b278d285b..a3a386f806 100644 --- a/include/pub_tool_libcsetjmp.h +++ b/include/pub_tool_libcsetjmp.h @@ -126,6 +126,14 @@ UWord VG_MINIMAL_SETJMP(VG_MINIMAL_JMP_BUF(_env)); __attribute__((noreturn)) void VG_MINIMAL_LONGJMP(VG_MINIMAL_JMP_BUF(_env)); +#elif defined(VGP_s390x_linux) + +#define VG_MINIMAL_JMP_BUF(_name) ULong _name [10 + 8] +__attribute__((returns_twice)) +UWord VG_MINIMAL_SETJMP(VG_MINIMAL_JMP_BUF(_env)); +__attribute__((noreturn)) +void VG_MINIMAL_LONGJMP(VG_MINIMAL_JMP_BUF(_env)); + #else /* The default implementation. */ |
|
From: Paul F. <pa...@so...> - 2023-05-09 20:14:13
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=306232d40e037274160de417f21fdb957e30fc73 commit 306232d40e037274160de417f21fdb957e30fc73 Author: Paul Floyd <pj...@wa...> Date: Tue May 9 22:13:28 2023 +0200 musl: another fix for building testcases Diff: --- none/tests/x86-linux/seg_override.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/none/tests/x86-linux/seg_override.c b/none/tests/x86-linux/seg_override.c index ca8fbfe2b2..4ef4394bcc 100644 --- a/none/tests/x86-linux/seg_override.c +++ b/none/tests/x86-linux/seg_override.c @@ -3,6 +3,10 @@ #include <errno.h> #include <string.h> #include "../../../config.h" +#if defined(MUSL_LIBC) +#include <syscall.h> +#include <unistd.h> +#endif /* Stuff from Wine. */ |
|
From: Mark W. <ma...@so...> - 2023-05-09 11:57:36
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=4e6d14f3918b974e7937eb4c5bc094ea7e7a8461 commit 4e6d14f3918b974e7937eb4c5bc094ea7e7a8461 Author: Mark Wielaard <ma...@kl...> Date: Tue May 9 13:15:26 2023 +0200 Update libiberty demangler Update the libiberty demangler using the auxprogs/update-demangler script to gcc git commit 1719fa40c4ee4def60a2ce2f27e17f8168cf28ba. This update includes: - Update copyright years. - ansidecl.h (ATTRIBUTE_WARN_UNUSED_RESULT): Add __. - demangler: Templated lambda demangling - cp-demangle.h (D_BUILTIN_TYPE_COUNT): Increment. - cp-demangle.c (cplus_demangle_builtin_types): Add std::bfloat16_t entry. - cp-demangle.c (cplus_demangle_type): Demangle DF16b. - libiberty: Demangling 'M' prefixes - libiberty: Demangle variadic template lambdas - demangle.h (enum demangle_component_type): Add DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE. - demangle.h (struct demangle_component): Add u.s_extended_builtin member. - cp-demangle.c (d_dump): Handle DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE. Don't handle DEMANGLE_COMPONENT_FIXED_TYPE. - cp-demangle.c (d_make_extended_builtin_type): New function. - cp-demangle.c (cplus_demangle_builtin_types): Add _Float entry. - cp-demangle.c(cplus_demangle_type): For DF demangle it as _Float<N> or _Float<N>x rather than fixed point which conflicts with it. - cp-demangle.c (d_count_templates_scopes): Handle DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE. Just break; for DEMANGLE_COMPONENT_FIXED_TYPE. - cp-demangle.c (d_find_pack): Handle DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE. Don't handle DEMANGLE_COMPONENT_FIXED_TYPE. - cp-demangle.c (d_print_comp_inner): Likewise. - cp-demangle.h (D_BUILTIN_TYPE_COUNT): Bump. - rust-demangle.c (demangle_const): Add a missing goto pass_return at the end of the function. - rust-demangle.c (demangle_path_maybe_open_generics): Add recursion limit. - rust-demangle.c (demangle_const): Add recursion limit. - libiberty: remove FINAL and OVERRIDE from ansidecl.h - demangler: C++ modules support - demangler: Reorganize for module demangling - demangler: Structured Bindings - Remove non-ANSI C macros in ansidecl.h. - Remove non-ANSI C path in ansidecl.h. Diff: --- auxprogs/update-demangler | 8 +- coregrind/m_demangle/ansidecl.h | 90 +---- coregrind/m_demangle/cp-demangle.c | 755 +++++++++++++++++++++++++---------- coregrind/m_demangle/cp-demangle.h | 4 +- coregrind/m_demangle/cplus-dem.c | 2 +- coregrind/m_demangle/d-demangle.c | 2 +- coregrind/m_demangle/demangle.h | 31 +- coregrind/m_demangle/dyn-string.c | 2 +- coregrind/m_demangle/dyn-string.h | 2 +- coregrind/m_demangle/rust-demangle.c | 49 ++- coregrind/m_demangle/safe-ctype.c | 2 +- coregrind/m_demangle/safe-ctype.h | 2 +- 12 files changed, 621 insertions(+), 328 deletions(-) diff --git a/auxprogs/update-demangler b/auxprogs/update-demangler index 7b1456315d..efdcf322e7 100755 --- a/auxprogs/update-demangler +++ b/auxprogs/update-demangler @@ -17,8 +17,8 @@ set -e #--------------------------------------------------------------------- # You need to modify these revision numbers for your update. -old_gcc_revision=b3585c0836e729bed56b9afd4292177673a25ca0 # the revision of the previous update -new_gcc_revision=d3b2ead595467166c849950ecd3710501a5094d9 # the revision for this update +old_gcc_revision=d3b2ead595467166c849950ecd3710501a5094d9 # the revision of the previous update +new_gcc_revision=1719fa40c4ee4def60a2ce2f27e17f8168cf28ba # the revision for this update # Unless the organization of demangler related files has changed, no # changes below this line should be necessary. @@ -41,7 +41,9 @@ git remote add origin https://gcc.gnu.org/git/gcc.git git config core.sparsecheckout true echo "libiberty/*" > .git/info/sparse-checkout echo "include/*" >> .git/info/sparse-checkout -git fetch --depth 1 origin $old_gcc_revision $new_gcc_revision +echo git fetch --depth 1 origin $old_gcc_revision $new_gcc_revision +git fetch --depth 1 origin $old_gcc_revision $new_gcc_revision \ + || git fetch origin # In case the above fails we will have to fetch all git checkout $old_gcc_revision cd .. diff --git a/coregrind/m_demangle/ansidecl.h b/coregrind/m_demangle/ansidecl.h index 4275c9b9cb..39375e1715 100644 --- a/coregrind/m_demangle/ansidecl.h +++ b/coregrind/m_demangle/ansidecl.h @@ -1,5 +1,5 @@ -/* ANSI and traditional C compatability macros - Copyright (C) 1991-2022 Free Software Foundation, Inc. +/* Compiler compatibility macros + Copyright (C) 1991-2023 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify @@ -16,18 +16,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ -/* ANSI and traditional C compatibility macros - - ANSI C is assumed if __STDC__ is #defined. - - Macro ANSI C definition Traditional C definition - ----- ---- - ---------- ----------- - ---------- - PTR `void *' `char *' - const not defined `' - volatile not defined `' - signed not defined `' - - For ease of writing code which uses GCC extensions but needs to be +/* For ease of writing code which uses GCC extensions but needs to be portable to other compilers, we provide the GCC_VERSION macro that simplifies testing __GNUC__ and __GNUC_MINOR__ together, and various wrappers around __attribute__. Also, __extension__ will be #defined @@ -62,20 +51,6 @@ So instead we use the macro below and test it against specific values. */ #define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) #endif /* GCC_VERSION */ -#if defined (__STDC__) || defined(__cplusplus) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(_WIN32) -/* All known AIX compilers implement these things (but don't always - define __STDC__). The RISC/OS MIPS compiler defines these things - in SVR4 mode, but does not define __STDC__. */ -/* er...@al...: The Compaq C++ compiler, unlike many other - C++ compilers, does not define __STDC__, though it acts as if this - was so. (Verified versions: 5.7, 6.2, 6.3, 6.5) */ - -#define PTR void * - -#undef const -#undef volatile -#undef signed - /* inline requires special treatment; it's in C99, and GCC >=2.7 supports it too, but it's not in C89. */ #undef inline @@ -89,22 +64,6 @@ So instead we use the macro below and test it against specific values. */ # endif #endif -#else /* Not ANSI C. */ - -#define PTR char * - -/* some systems define these in header files for non-ansi mode */ -#undef const -#undef volatile -#undef signed -#undef inline -#define const -#define volatile -#define signed -#define inline - -#endif /* ANSI C. */ - /* Define macros for some gcc attributes. This permits us to use the macros freely, and know that they will come into play for the version of gcc in which they are supported. */ @@ -320,7 +279,7 @@ So instead we use the macro below and test it against specific values. */ /* Attribute `warn_unused_result' was valid as of gcc 3.3. */ #ifndef ATTRIBUTE_WARN_UNUSED_RESULT # if GCC_VERSION >= 3003 -# define ATTRIBUTE_WARN_UNUSED_RESULT __attribute__ ((warn_unused_result)) +# define ATTRIBUTE_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) # else # define ATTRIBUTE_WARN_UNUSED_RESULT # endif @@ -362,47 +321,6 @@ So instead we use the macro below and test it against specific values. */ #define CONSTEXPR #endif -/* C++11 adds the ability to add "override" after an implementation of a - virtual function in a subclass, to: - (A) document that this is an override of a virtual function - (B) allow the compiler to issue a warning if it isn't (e.g. a mismatch - of the type signature). - - Similarly, it allows us to add a "final" to indicate that no subclass - may subsequently override the vfunc. - - Provide OVERRIDE and FINAL as macros, allowing us to get these benefits - when compiling with C++11 support, but without requiring C++11. - - For gcc, use "-std=c++11" to enable C++11 support; gcc 6 onwards enables - this by default (actually GNU++14). */ - -#if defined __cplusplus -# if __cplusplus >= 201103 - /* C++11 claims to be available: use it. Final/override were only - implemented in 4.7, though. */ -# if GCC_VERSION < 4007 -# define OVERRIDE -# define FINAL -# else -# define OVERRIDE override -# define FINAL final -# endif -# elif GCC_VERSION >= 4007 - /* G++ 4.7 supports __final in C++98. */ -# define OVERRIDE -# define FINAL __final -# else - /* No C++11 support; leave the macros empty. */ -# define OVERRIDE -# define FINAL -# endif -#else - /* No C++11 support; leave the macros empty. */ -# define OVERRIDE -# define FINAL -#endif - /* A macro to disable the copy constructor and assignment operator. When building with C++11 and above, the methods are explicitly deleted, causing a compile-time error if something tries to copy. diff --git a/coregrind/m_demangle/cp-demangle.c b/coregrind/m_demangle/cp-demangle.c index ca82c330d3..870f27bb84 100644 --- a/coregrind/m_demangle/cp-demangle.c +++ b/coregrind/m_demangle/cp-demangle.c @@ -1,5 +1,5 @@ /* Demangler for g++ V3 ABI. - Copyright (C) 2003-2022 Free Software Foundation, Inc. + Copyright (C) 2003-2023 Free Software Foundation, Inc. Written by Ian Lance Taylor <ia...@wa...>. This file is part of the libiberty library, which is part of GCC. @@ -364,9 +364,9 @@ struct d_print_info /* Number of times d_print_comp was recursively called. Should not be bigger than MAX_RECURSION_COUNT. */ int recursion; - /* Non-zero if we're printing a lambda argument. A template - parameter reference actually means 'auto'. */ - int is_lambda_arg; + /* 1 more than the number of explicit template parms of a lambda. Template + parm references >= are actually 'auto'. */ + int lambda_tpl_parms; /* The current index into any template argument packs we are using for printing, or -1 to print the whole pack. */ int pack_index; @@ -442,13 +442,16 @@ is_ctor_dtor_or_conversion (struct demangle_component *); static struct demangle_component *d_encoding (struct d_info *, int); -static struct demangle_component *d_name (struct d_info *); +static struct demangle_component *d_name (struct d_info *, int substable); static struct demangle_component *d_nested_name (struct d_info *); +static int d_maybe_module_name (struct d_info *, struct demangle_component **); + static struct demangle_component *d_prefix (struct d_info *, int); -static struct demangle_component *d_unqualified_name (struct d_info *); +static struct demangle_component *d_unqualified_name (struct d_info *, + struct demangle_component *scope, struct demangle_component *module); static struct demangle_component *d_source_name (struct d_info *); @@ -479,7 +482,7 @@ static struct demangle_component * d_bare_function_type (struct d_info *, int); static struct demangle_component * -d_class_enum_type (struct d_info *); +d_class_enum_type (struct d_info *, int); static struct demangle_component *d_array_type (struct d_info *); @@ -505,6 +508,10 @@ static struct demangle_component *d_local_name (struct d_info *); static int d_discriminator (struct d_info *); +static struct demangle_component *d_template_parm (struct d_info *, int *bad); + +static struct demangle_component *d_template_head (struct d_info *, int *bad); + static struct demangle_component *d_lambda (struct d_info *); static struct demangle_component *d_unnamed_type (struct d_info *); @@ -662,6 +669,13 @@ d_dump (struct demangle_component *dc, int indent) case DEMANGLE_COMPONENT_BUILTIN_TYPE: printf ("builtin type %s\n", dc->u.s_builtin.type->name); return; + case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE: + { + char suffix[2] = { dc->u.s_extended_builtin.type->suffix, 0 }; + printf ("builtin type %s%d%s\n", dc->u.s_extended_builtin.type->name, + dc->u.s_extended_builtin.type->arg, suffix); + } + return; case DEMANGLE_COMPONENT_OPERATOR: printf ("operator %s\n", dc->u.s_operator.op->name); return; @@ -785,11 +799,6 @@ d_dump (struct demangle_component *dc, int indent) case DEMANGLE_COMPONENT_PTRMEM_TYPE: printf ("pointer to member type\n"); break; - case DEMANGLE_COMPONENT_FIXED_TYPE: - printf ("fixed-point type, accum? %d, sat? %d\n", - dc->u.s_fixed.accum, dc->u.s_fixed.sat); - d_dump (dc->u.s_fixed.length, indent + 2); - break; case DEMANGLE_COMPONENT_ARGLIST: printf ("argument list\n"); break; @@ -1000,6 +1009,7 @@ d_make_comp (struct d_info *di, enum demangle_component_type type, case DEMANGLE_COMPONENT_COMPOUND_NAME: case DEMANGLE_COMPONENT_VECTOR_TYPE: case DEMANGLE_COMPONENT_CLONE: + case DEMANGLE_COMPONENT_MODULE_ENTITY: if (left == NULL || right == NULL) return NULL; break; @@ -1037,6 +1047,12 @@ d_make_comp (struct d_info *di, enum demangle_component_type type, case DEMANGLE_COMPONENT_NULLARY: case DEMANGLE_COMPONENT_TRINARY_ARG2: case DEMANGLE_COMPONENT_TPARM_OBJ: + case DEMANGLE_COMPONENT_STRUCTURED_BINDING: + case DEMANGLE_COMPONENT_MODULE_INIT: + case DEMANGLE_COMPONENT_TEMPLATE_HEAD: + case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM: + case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM: + case DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM: if (left == NULL) return NULL; break; @@ -1045,6 +1061,8 @@ d_make_comp (struct d_info *di, enum demangle_component_type type, empty. */ case DEMANGLE_COMPONENT_ARRAY_TYPE: case DEMANGLE_COMPONENT_INITIALIZER_LIST: + case DEMANGLE_COMPONENT_MODULE_NAME: + case DEMANGLE_COMPONENT_MODULE_PARTITION: if (right == NULL) return NULL; break; @@ -1057,6 +1075,7 @@ d_make_comp (struct d_info *di, enum demangle_component_type type, case DEMANGLE_COMPONENT_CONST: case DEMANGLE_COMPONENT_ARGLIST: case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: + case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM: FNQUAL_COMPONENT_CASE: break; @@ -1118,6 +1137,28 @@ d_make_builtin_type (struct d_info *di, return p; } +/* Add a new extended builtin type component. */ + +static struct demangle_component * +d_make_extended_builtin_type (struct d_info *di, + const struct demangle_builtin_type_info *type, + short arg, char suffix) +{ + struct demangle_component *p; + + if (type == NULL) + return NULL; + p = d_make_empty (di); + if (p != NULL) + { + p->type = DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE; + p->u.s_extended_builtin.type = type; + p->u.s_extended_builtin.arg = arg; + p->u.s_extended_builtin.suffix = suffix; + } + return p; +} + /* Add a new operator component. */ static struct demangle_component * @@ -1339,7 +1380,7 @@ d_encoding (struct d_info *di, int top_level) dc = d_special_name (di); else { - dc = d_name (di); + dc = d_name (di, 0); if (!dc) /* Failed already. */; @@ -1433,80 +1474,74 @@ d_abi_tags (struct d_info *di, struct demangle_component *dc) */ static struct demangle_component * -d_name (struct d_info *di) +d_name (struct d_info *di, int substable) { char peek = d_peek_char (di); - struct demangle_component *dc; + struct demangle_component *dc = NULL; + struct demangle_component *module = NULL; + int subst = 0; switch (peek) { case 'N': - return d_nested_name (di); + dc = d_nested_name (di); + break; case 'Z': - return d_local_name (di); + dc = d_local_name (di); + break; case 'U': - return d_unqualified_name (di); + dc = d_unqualified_name (di, NULL, NULL); + break; case 'S': { - int subst; - - if (d_peek_next_char (di) != 't') - { - dc = d_substitution (di, 0); - subst = 1; - } - else + if (d_peek_next_char (di) == 't') { d_advance (di, 2); - dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, - d_make_name (di, "std", 3), - d_unqualified_name (di)); + dc = d_make_name (di, "std", 3); di->expansion += 3; - subst = 0; } - if (d_peek_char (di) != 'I') + if (d_peek_char (di) == 'S') { - /* The grammar does not permit this case to occur if we - called d_substitution() above (i.e., subst == 1). We - don't bother to check. */ - } - else - { - /* This is <template-args>, which means that we just saw - <unscoped-template-name>, which is a substitution - candidate if we didn't just get it from a - substitution. */ - if (! subst) + module = d_substitution (di, 0); + if (!module) + return NULL; + if (!(module->type == DEMANGLE_COMPONENT_MODULE_NAME + || module->type == DEMANGLE_COMPONENT_MODULE_PARTITION)) { - if (! d_add_substitution (di, dc)) + if (dc) return NULL; + subst = 1; + dc = module; + module = NULL; } - dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc, - d_template_args (di)); } - - return dc; } + /* FALLTHROUGH */ case 'L': default: - dc = d_unqualified_name (di); + if (!subst) + dc = d_unqualified_name (di, dc, module); if (d_peek_char (di) == 'I') { /* This is <template-args>, which means that we just saw <unscoped-template-name>, which is a substitution candidate. */ - if (! d_add_substitution (di, dc)) + if (!subst && !d_add_substitution (di, dc)) return NULL; dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc, d_template_args (di)); + subst = 0; } - return dc; + break; } + if (substable && !subst && !d_add_substitution (di, dc)) + return NULL; + return dc; } /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E @@ -1562,94 +1597,122 @@ d_nested_name (struct d_info *di) if not (in an unresolved-name). */ static struct demangle_component * -d_prefix (struct d_info *di, int subst) +d_prefix (struct d_info *di, int substable) { struct demangle_component *ret = NULL; - while (1) + for (;;) { - char peek; - enum demangle_component_type comb_type; - struct demangle_component *dc; - - peek = d_peek_char (di); - if (peek == '\0') - return NULL; + char peek = d_peek_char (di); /* The older code accepts a <local-name> here, but I don't see that in the grammar. The older code does not accept a <template-param> here. */ - comb_type = DEMANGLE_COMPONENT_QUAL_NAME; - if (peek == 'D') + if (peek == 'D' + && (d_peek_next_char (di) == 'T' + || d_peek_next_char (di) == 't')) { - char peek2 = d_peek_next_char (di); - if (peek2 == 'T' || peek2 == 't') - /* Decltype. */ - dc = cplus_demangle_type (di); - else - /* Destructor name. */ - dc = d_unqualified_name (di); + /* Decltype. */ + if (ret) + return NULL; + ret = cplus_demangle_type (di); } - else if (IS_DIGIT (peek) - || IS_LOWER (peek) - || peek == 'C' - || peek == 'U' - || peek == 'L') - dc = d_unqualified_name (di); - else if (peek == 'S') - dc = d_substitution (di, 1); else if (peek == 'I') { if (ret == NULL) return NULL; - comb_type = DEMANGLE_COMPONENT_TEMPLATE; - dc = d_template_args (di); + struct demangle_component *dc = d_template_args (di); + if (!dc) + return NULL; + ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret, dc); } else if (peek == 'T') - dc = d_template_param (di); - else if (peek == 'E') - return ret; - else if (peek == 'M') { - /* Initializer scope for a lambda. We don't need to represent - this; the normal code will just treat the variable as a type - scope, which gives appropriate output. */ - if (ret == NULL) + if (ret) return NULL; + ret = d_template_param (di); + } + else if (peek == 'M') + { + /* Initializer scope for a lambda. We already added it as a + substitution candidate, don't do that again. */ d_advance (di, 1); continue; } else + { + struct demangle_component *module = NULL; + if (peek == 'S') + { + module = d_substitution (di, 1); + if (!module) + return NULL; + if (!(module->type == DEMANGLE_COMPONENT_MODULE_NAME + || module->type == DEMANGLE_COMPONENT_MODULE_PARTITION)) + { + if (ret) + return NULL; + ret = module; + continue; + } + } + ret = d_unqualified_name (di, ret, module); + } + + if (!ret) + break; + + if (d_peek_char (di) == 'E') + break; + + if (substable && !d_add_substitution (di, ret)) return NULL; + } - if (ret == NULL) - ret = dc; - else - ret = d_make_comp (di, comb_type, ret, dc); + return ret; +} - if (peek != 'S' && d_peek_char (di) != 'E' && subst) +static int +d_maybe_module_name (struct d_info *di, struct demangle_component **name) +{ + while (d_peek_char (di) == 'W') + { + d_advance (di, 1); + enum demangle_component_type code = DEMANGLE_COMPONENT_MODULE_NAME; + if (d_peek_char (di) == 'P') { - if (! d_add_substitution (di, ret)) - return NULL; + code = DEMANGLE_COMPONENT_MODULE_PARTITION; + d_advance (di, 1); } + + *name = d_make_comp (di, code, *name, d_source_name (di)); + if (!*name) + return 0; + if (!d_add_substitution (di, *name)) + return 0; } + return 1; } -/* <unqualified-name> ::= <operator-name> - ::= <ctor-dtor-name> - ::= <source-name> - ::= <local-source-name> - - <local-source-name> ::= L <source-name> <discriminator> +/* <unqualified-name> ::= [<module-name>] <operator-name> [<abi-tags>] + ::= [<module-name>] <ctor-dtor-name> [<abi-tags>] + ::= [<module-name>] <source-name> [<abi-tags>] + ::= [<module-name>] <local-source-name> [<abi-tags>] + ::= [<module-name>] DC <source-name>+ E [<abi-tags>] + <local-source-name> ::= L <source-name> <discriminator> [<abi-tags>] */ static struct demangle_component * -d_unqualified_name (struct d_info *di) +d_unqualified_name (struct d_info *di, struct demangle_component *scope, + struct demangle_component *module) { struct demangle_component *ret; char peek; + if (!d_maybe_module_name (di, &module)) + return NULL; + peek = d_peek_char (di); if (IS_DIGIT (peek)) ret = d_source_name (di); @@ -1672,6 +1735,28 @@ d_unqualified_name (struct d_info *di) d_source_name (di)); } } + else if (peek == 'D' && d_peek_next_char (di) == 'C') + { + // structured binding + d_advance (di, 2); + struct demangle_component *prev = NULL; + do + { + struct demangle_component *next = + d_make_comp (di, DEMANGLE_COMPONENT_STRUCTURED_BINDING, + d_source_name (di), NULL); + if (prev) + d_right (prev) = next; + else + ret = next; + prev = next; + } + while (prev && d_peek_char (di) != 'E'); + if (prev) + d_advance (di, 1); + else + ret = NULL; + } else if (peek == 'C' || peek == 'D') ret = d_ctor_dtor_name (di); else if (peek == 'L') @@ -1701,8 +1786,13 @@ d_unqualified_name (struct d_info *di) else return NULL; + if (module) + ret = d_make_comp (di, DEMANGLE_COMPONENT_MODULE_ENTITY, ret, module); if (d_peek_char (di) == 'B') ret = d_abi_tags (di, ret); + if (scope) + ret = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, scope, ret); + return ret; } @@ -2143,11 +2233,11 @@ d_special_name (struct d_info *di) case 'H': return d_make_comp (di, DEMANGLE_COMPONENT_TLS_INIT, - d_name (di), NULL); + d_name (di, 0), NULL); case 'W': return d_make_comp (di, DEMANGLE_COMPONENT_TLS_WRAPPER, - d_name (di), NULL); + d_name (di, 0), NULL); case 'A': return d_make_comp (di, DEMANGLE_COMPONENT_TPARM_OBJ, @@ -2163,11 +2253,11 @@ d_special_name (struct d_info *di) { case 'V': return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, - d_name (di), NULL); + d_name (di, 0), NULL); case 'R': { - struct demangle_component *name = d_name (di); + struct demangle_component *name = d_name (di, 0); return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name, d_number_component (di)); } @@ -2176,6 +2266,14 @@ d_special_name (struct d_info *di) return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS, d_encoding (di, 0), NULL); + case 'I': + { + struct demangle_component *module = NULL; + if (!d_maybe_module_name (di, &module) || !module) + return NULL; + return d_make_comp (di, DEMANGLE_COMPONENT_MODULE_INIT, + module, NULL); + } case 'T': switch (d_next_char (di)) { @@ -2414,6 +2512,8 @@ cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] = /* 32 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT }, /* 33 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"), D_PRINT_DEFAULT }, + /* 34 */ { NL ("_Float"), NL ("_Float"), D_PRINT_FLOAT }, + /* 35 */ { NL ("std::bfloat16_t"), NL ("std::bfloat16_t"), D_PRINT_FLOAT }, }; CP_STATIC_IF_GLIBCPP_V3 @@ -2498,13 +2598,6 @@ cplus_demangle_type (struct d_info *di) ret = d_function_type (di); break; - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - case 'N': - case 'Z': - ret = d_class_enum_type (di); - break; - case 'A': ret = d_array_type (di); break; @@ -2575,39 +2668,6 @@ cplus_demangle_type (struct d_info *di) } break; - case 'S': - /* If this is a special substitution, then it is the start of - <class-enum-type>. */ - { - char peek_next; - - peek_next = d_peek_next_char (di); - if (IS_DIGIT (peek_next) - || peek_next == '_' - || IS_UPPER (peek_next)) - { - ret = d_substitution (di, 0); - /* The substituted name may have been a template name and - may be followed by tepmlate args. */ - if (d_peek_char (di) == 'I') - ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret, - d_template_args (di)); - else - can_subst = 0; - } - else - { - ret = d_class_enum_type (di); - /* If the substitution was a complete type, then it is not - a new substitution candidate. However, if the - substitution was followed by template arguments, then - the whole thing is a substitution candidate. */ - if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD) - can_subst = 0; - } - } - break; - case 'O': d_advance (di, 1); ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE, @@ -2717,19 +2777,37 @@ cplus_demangle_type (struct d_info *di) break; case 'F': - /* Fixed point types. DF<int bits><length><fract bits><sat> */ - ret = d_make_empty (di); - ret->type = DEMANGLE_COMPONENT_FIXED_TYPE; - if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di)))) - /* For demangling we don't care about the bits. */ - d_number (di); - ret->u.s_fixed.length = cplus_demangle_type (di); - if (ret->u.s_fixed.length == NULL) - return NULL; - d_number (di); - peek = d_next_char (di); - ret->u.s_fixed.sat = (peek == 's'); - break; + /* DF<number>_ - _Float<number>. + DF<number>x - _Float<number>x + DF16b - std::bfloat16_t. */ + { + int arg = d_number (di); + char buf[12]; + char suffix = 0; + if (d_peek_char (di) == 'b') + { + if (arg != 16) + return NULL; + d_advance (di, 1); + ret = d_make_builtin_type (di, + &cplus_demangle_builtin_types[35]); + di->expansion += ret->u.s_builtin.type->len; + break; + } + if (d_peek_char (di) == 'x') + suffix = 'x'; + if (!suffix && d_peek_char (di) != '_') + return NULL; + ret + = d_make_extended_builtin_type (di, + &cplus_demangle_builtin_types[34], + arg, suffix); + d_advance (di, 1); + sprintf (buf, "%d", arg); + di->expansion += ret->u.s_extended_builtin.type->len + + strlen (buf) + (suffix != 0); + break; + } case 'v': ret = d_vector_type (di); @@ -2748,7 +2826,7 @@ cplus_demangle_type (struct d_info *di) break; default: - return NULL; + return d_class_enum_type (di, 1); } if (can_subst) @@ -3021,9 +3099,9 @@ d_bare_function_type (struct d_info *di, int has_return_type) /* <class-enum-type> ::= <name> */ static struct demangle_component * -d_class_enum_type (struct d_info *di) +d_class_enum_type (struct d_info *di, int substable) { - return d_name (di); + return d_name (di, substable); } /* <array-type> ::= A <(positive dimension) number> _ <(element) type> @@ -3352,11 +3430,11 @@ d_unresolved_name (struct d_info *di) } else type = cplus_demangle_type (di); - name = d_unqualified_name (di); + name = d_unqualified_name (di, type, NULL); if (d_peek_char (di) == 'I') name = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name, d_template_args (di)); - return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name); + return name; } /* <expression> ::= <(unary) operator-name> <expression> @@ -3425,7 +3503,7 @@ d_expression_1 (struct d_info *di) /* operator-function-id, i.e. operator+(t). */ d_advance (di, 2); - name = d_unqualified_name (di); + name = d_unqualified_name (di, NULL, NULL); if (name == NULL) return NULL; if (d_peek_char (di) == 'I') @@ -3533,7 +3611,7 @@ d_expression_1 (struct d_info *di) /* fold-expression. */ left = d_operator_name (di); else if (!strcmp (code, "di")) - left = d_unqualified_name (di); + left = d_unqualified_name (di, NULL, NULL); else left = d_expression_1 (di); if (!strcmp (code, "cl")) @@ -3551,7 +3629,7 @@ d_expression_1 (struct d_info *di) d_unqualified_name rather than d_expression_1 here for old mangled names that didn't add 'on' before operator names. */ - right = d_unqualified_name (di); + right = d_unqualified_name (di, NULL, NULL); if (d_peek_char (di) == 'I') right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, right, d_template_args (di)); @@ -3761,7 +3839,7 @@ d_local_name (struct d_info *di) return NULL; } - name = d_name (di); + name = d_name (di, 0); if (name /* Lambdas and unnamed types have internal discriminators @@ -3825,32 +3903,120 @@ d_discriminator (struct d_info *di) return 1; } -/* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */ +/* <template-parm> ::= Ty + ::= Tn <type> + ::= Tt <template-head> E + ::= Tp <template-parm> */ static struct demangle_component * -d_lambda (struct d_info *di) +d_template_parm (struct d_info *di, int *bad) { - struct demangle_component *tl; - struct demangle_component *ret; - int num; + if (d_peek_char (di) != 'T') + return NULL; + struct demangle_component *op; + enum demangle_component_type kind; + switch (d_peek_next_char (di)) + { + default: + return NULL; + + case 'p': /* Pack */ + d_advance (di, 2); + op = d_template_parm (di, bad); + kind = DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM; + if (!op) + { + *bad = 1; + return NULL; + } + break; + + case 'y': /* Typename */ + d_advance (di, 2); + op = NULL; + kind = DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM; + break; + + case 'n': /* Non-Type */ + d_advance (di, 2); + op = cplus_demangle_type (di); + kind = DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM; + if (!op) + { + *bad = 1; + return NULL; + } + break; + + case 't': /* Template */ + d_advance (di, 2); + op = d_template_head (di, bad); + kind = DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM; + if (!op || !d_check_char (di, 'E')) + { + *bad = 1; + return NULL; + } + } + + return d_make_comp (di, kind, op, NULL); +} + +/* <template-head> ::= <template-head>? <template-parm> */ + +static struct demangle_component * +d_template_head (struct d_info *di, int *bad) +{ + struct demangle_component *res = NULL, **slot = &res; + struct demangle_component *op; + + while ((op = d_template_parm (di, bad))) + { + *slot = op; + slot = &d_right (op); + } + + /* Wrap it in a template head, to make concatenating with any parm list, and + printing simpler. */ + if (res) + res = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_HEAD, res, NULL); + + return res; +} + +/* <closure-type-name> ::= Ul <template-head>? <lambda-sig> E [ <nonnegative number> ] _ */ + +static struct demangle_component * +d_lambda (struct d_info *di) +{ if (! d_check_char (di, 'U')) return NULL; if (! d_check_char (di, 'l')) return NULL; - tl = d_parmlist (di); + int bad = 0; + struct demangle_component *head = d_template_head (di, &bad); + if (bad) + return NULL; + + struct demangle_component *tl = d_parmlist (di); if (tl == NULL) return NULL; + if (head) + { + d_right (head) = tl; + tl = head; + } if (! d_check_char (di, 'E')) return NULL; - num = d_compact_number (di); + int num = d_compact_number (di); if (num < 0) return NULL; - ret = d_make_empty (di); + struct demangle_component *ret = d_make_empty (di); if (ret) { ret->type = DEMANGLE_COMPONENT_LAMBDA; @@ -4192,10 +4358,21 @@ d_count_templates_scopes (struct d_print_info *dpi, case DEMANGLE_COMPONENT_FUNCTION_PARAM: case DEMANGLE_COMPONENT_SUB_STD: case DEMANGLE_COMPONENT_BUILTIN_TYPE: + case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE: case DEMANGLE_COMPONENT_OPERATOR: case DEMANGLE_COMPONENT_CHARACTER: case DEMANGLE_COMPONENT_NUMBER: case DEMANGLE_COMPONENT_UNNAMED_TYPE: + case DEMANGLE_COMPONENT_STRUCTURED_BINDING: + case DEMANGLE_COMPONENT_MODULE_NAME: + case DEMANGLE_COMPONENT_MODULE_PARTITION: + case DEMANGLE_COMPONENT_MODULE_INIT: + case DEMANGLE_COMPONENT_FIXED_TYPE: + case DEMANGLE_COMPONENT_TEMPLATE_HEAD: + case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM: + case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM: + case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM: + case DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM: break; case DEMANGLE_COMPONENT_TEMPLATE: @@ -4295,12 +4472,9 @@ d_count_templates_scopes (struct d_print_info *dpi, d_count_templates_scopes (dpi, dc->u.s_extended_operator.name); break; - case DEMANGLE_COMPONENT_FIXED_TYPE: - d_count_templates_scopes (dpi, dc->u.s_fixed.length); - break; - case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS: case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS: + case DEMANGLE_COMPONENT_MODULE_ENTITY: d_count_templates_scopes (dpi, d_left (dc)); break; @@ -4329,7 +4503,7 @@ d_print_init (struct d_print_info *dpi, demangle_callbackref callback, dpi->demangle_failure = 0; dpi->recursion = 0; - dpi->is_lambda_arg = 0; + dpi->lambda_tpl_parms = 0; dpi->component_stack = NULL; @@ -4581,11 +4755,11 @@ d_find_pack (struct d_print_info *dpi, case DEMANGLE_COMPONENT_TAGGED_NAME: case DEMANGLE_COMPONENT_OPERATOR: case DEMANGLE_COMPONENT_BUILTIN_TYPE: + case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE: case DEMANGLE_COMPONENT_SUB_STD: case DEMANGLE_COMPONENT_CHARACTER: case DEMANGLE_COMPONENT_FUNCTION_PARAM: case DEMANGLE_COMPONENT_UNNAMED_TYPE: - case DEMANGLE_COMPONENT_FIXED_TYPE: case DEMANGLE_COMPONENT_DEFAULT_ARG: case DEMANGLE_COMPONENT_NUMBER: return NULL; @@ -4842,6 +5016,33 @@ d_maybe_print_designated_init (struct d_print_info *dpi, int options, return 1; } +static void +d_print_lambda_parm_name (struct d_print_info *dpi, int type, unsigned index) +{ + const char *str; + switch (type) + { + default: + dpi->demangle_failure = 1; + str = ""; + break; + + case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM: + str = "$T"; + break; + + case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM: + str = "$N"; + break; + + case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM: + str = "$TT"; + break; + } + d_append_string (dpi, str); + d_append_num (dpi, index); +} + /* Subroutine to handle components. */ static void @@ -4883,6 +5084,38 @@ d_print_comp_inner (struct d_print_info *dpi, int options, d_append_char (dpi, ']'); return; + case DEMANGLE_COMPONENT_STRUCTURED_BINDING: + d_append_char (dpi, '['); + for (;;) + { + d_print_comp (dpi, options, d_left (dc)); + dc = d_right (dc); + if (!dc) + break; + d_append_string (dpi, ", "); + } + d_append_char (dpi, ']'); + return; + + case DEMANGLE_COMPONENT_MODULE_ENTITY: + d_print_comp (dpi, options, d_left (dc)); + d_append_char (dpi, '@'); + d_print_comp (dpi, options, d_right (dc)); + return; + + case DEMANGLE_COMPONENT_MODULE_NAME: + case DEMANGLE_COMPONENT_MODULE_PARTITION: + { + if (d_left (dc)) + d_print_comp (dpi, options, d_left (dc)); + char c = dc->type == DEMANGLE_COMPONENT_MODULE_PARTITION + ? ':' : d_left (dc) ? '.' : 0; + if (c) + d_append_char (dpi, c); + d_print_comp (dpi, options, d_right (dc)); + } + return; + case DEMANGLE_COMPONENT_QUAL_NAME: case DEMANGLE_COMPONENT_LOCAL_NAME: d_print_comp (dpi, options, d_left (dc)); @@ -5064,7 +5297,21 @@ d_print_comp_inner (struct d_print_info *dpi, int options, } case DEMANGLE_COMPONENT_TEMPLATE_PARAM: - if (dpi->is_lambda_arg) + if (dpi->lambda_tpl_parms > dc->u.s_number.number + 1) + { + const struct demangle_component *a + = d_left (dpi->templates->template_decl); + unsigned c; + for (c = dc->u.s_number.number; a && c; c--) + a = d_right (a); + if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM) + a = d_left (a); + if (!a) + dpi->demangle_failure = 1; + else + d_print_lambda_parm_name (dpi, a->type, dc->u.s_number.number); + } + else if (dpi->lambda_tpl_parms) { /* Show the template parm index, as that's how g++ displays these, and future proofs us against potential @@ -5114,6 +5361,11 @@ d_print_comp_inner (struct d_print_info *dpi, int options, d_print_comp (dpi, options, dc->u.s_dtor.name); return; + case DEMANGLE_COMPONENT_MODULE_INIT: + d_append_string (dpi, "initializer for module "); + d_print_comp (dpi, options, d_left (dc)); + return; + case DEMANGLE_COMPONENT_VTABLE: d_append_string (dpi, "vtable for "); d_print_comp (dpi, options, d_left (dc)); @@ -5240,7 +5492,7 @@ d_print_comp_inner (struct d_print_info *dpi, int options, { /* Handle reference smashing: & + && = &. */ struct demangle_component *sub = d_left (dc); - if (!dpi->is_lambda_arg + if (!dpi->lambda_tpl_parms && sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM) { struct d_saved_scope *scope = d_get_saved_scope (dpi, sub); @@ -5351,6 +5603,14 @@ d_print_comp_inner (struct d_print_info *dpi, int options, dc->u.s_builtin.type->java_len); return; + case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE: + d_append_buffer (dpi, dc->u.s_extended_builtin.type->name, + dc->u.s_extended_builtin.type->len); + d_append_num (dpi, dc->u.s_extended_builtin.arg); + if (dc->u.s_extended_builtin.suffix) + d_append_buffer (dpi, &dc->u.s_extended_builtin.suffix, 1); + return; + case DEMANGLE_COMPONENT_VENDOR_TYPE: d_print_comp (dpi, options, d_left (dc)); return; @@ -5489,22 +5749,6 @@ d_print_comp_inner (struct d_print_info *dpi, int options, return; } - case DEMANGLE_COMPONENT_FIXED_TYPE: - if (dc->u.s_fixed.sat) - d_append_string (dpi, "_Sat "); - /* Don't print "int _Accum". */ - if (dc->u.s_fixed.length->u.s_builtin.type - != &cplus_demangle_builtin_types['i'-'a']) - { - d_print_comp (dpi, options, dc->u.s_fixed.length); - d_append_char (dpi, ' '); - } - if (dc->u.s_fixed.accum) - d_append_string (dpi, "_Accum"); - else - d_append_string (dpi, "_Fract"); - return; - case DEMANGLE_COMPONENT_ARGLIST: case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: if (d_left (dc) != NULL) @@ -5872,9 +6116,10 @@ d_print_comp_inner (struct d_print_info *dpi, int options, case DEMANGLE_COMPONENT_PACK_EXPANSION: { - int len; - int i; - struct demangle_component *a = d_find_pack (dpi, d_left (dc)); + struct demangle_component *a = NULL; + + if (!dpi->lambda_tpl_parms) + a = d_find_pack (dpi, d_left (dc)); if (a == NULL) { /* d_find_pack won't find anything if the only packs involved @@ -5882,17 +6127,20 @@ d_print_comp_inner (struct d_print_info *dpi, int options, case, just print the pattern and "...". */ d_print_subexpr (dpi, options, d_left (dc)); d_append_string (dpi, "..."); - return; } - - len = d_pack_length (a); - dc = d_left (dc); - for (i = 0; i < len; ++i) + else { - dpi->pack_index = i; - d_print_comp (dpi, options, dc); - if (i < len-1) - d_append_string (dpi, ", "); + int len = d_pack_length (a); + int i; + + dc = d_left (dc); + for (i = 0; i < len; ++i) + { + if (i) + d_append_string (dpi, ", "); + dpi->pack_index = i; + d_print_comp (dpi, options, dc); + } } } return; @@ -5922,15 +6170,50 @@ d_print_comp_inner (struct d_print_info *dpi, int options, return; case DEMANGLE_COMPONENT_LAMBDA: - d_append_string (dpi, "{lambda("); - /* Generic lambda auto parms are mangled as the template type - parm they are. */ - dpi->is_lambda_arg++; - d_print_comp (dpi, options, dc->u.s_unary_num.sub); - dpi->is_lambda_arg--; - d_append_string (dpi, ")#"); - d_append_num (dpi, dc->u.s_unary_num.num + 1); - d_append_char (dpi, '}'); + { + d_append_string (dpi, "{lambda"); + struct demangle_component *parms = dc->u.s_unary_num.sub; + struct d_print_template dpt; + /* Generic lambda auto parms are mangled as the (synthedic) template + type parm they are. We need to tell the printer that (a) we're in + a lambda, and (b) the number of synthetic parms. */ + int saved_tpl_parms = dpi->lambda_tpl_parms; + dpi->lambda_tpl_parms = 0; + /* Hang any lambda head as-if template args. */ + dpt.template_decl = NULL; + dpt.next = dpi->templates; + dpi->templates = &dpt; + if (parms && parms->type == DEMANGLE_COMPONENT_TEMPLATE_HEAD) + { + dpt.template_decl = parms; + + d_append_char (dpi, '<'); + struct demangle_component *parm; + for (parm = d_left (parms); parm; parm = d_right (parm)) + { + if (dpi->lambda_tpl_parms++) + d_append_string (dpi, ", "); + d_print_comp (dpi, options, parm); + d_append_char (dpi, ' '); + if (parm->type == DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM) + parm = d_left (parm); + d_print_lambda_parm_name (dpi, parm->type, + dpi->lambda_tpl_parms - 1); + } + d_append_char (dpi, '>'); + + parms = d_right (parms); + } + dpi->lambda_tpl_parms++; + + d_append_char (dpi, '('); + d_print_comp (dpi, options, parms); + dpi->lambda_tpl_parms = saved_tpl_parms; + dpi->templates = dpt.next; + d_append_string (dpi, ")#"); + d_append_num (dpi, dc->u.s_unary_num.num + 1); + d_append_char (dpi, '}'); + } return; case DEMANGLE_COMPONENT_UNNAMED_TYPE: @@ -5946,6 +6229,40 @@ d_print_comp_inner (struct d_print_info *dpi, int options, d_append_char (dpi, ']'); return; + case DEMANGLE_COMPONENT_TEMPLATE_HEAD: + { + d_append_char (dpi, '<'); + int count = 0; + struct demangle_component *parm; + for (parm = d_left (dc); parm; parm = d_right (parm)) + { + if (count++) + d_append_string (dpi, ", "); + d_print_comp (dpi, options, parm); + } + d_append_char (dpi, '>'); + } + return; + + case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM: + d_append_string (dpi, "typename"); + return; + + case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM: + d_print_comp (dpi, options, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM: + d_append_string (dpi, "template"); + d_print_comp (dpi, options, d_left (dc)); + d_append_string (dpi, " class"); + return; + + case DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM: + d_print_comp (dpi, options, d_left (dc)); + d_append_string (dpi, "..."); + return; + default: d_print_error (dpi); return; diff --git a/coregrind/m_demangle/cp-demangle.h b/coregrind/m_demangle/cp-demangle.h index c6445036d6..8563f91602 100644 --- a/coregrind/m_demangle/cp-demangle.h +++ b/coregrind/m_demangle/cp-demangle.h @@ -1,5 +1,5 @@ /* Internal demangler interface for g++ V3 ABI. - Copyright (C) 2003-2022 Free Software Foundation, Inc. + Copyright (C) 2003-2023 Free Software Foundation, Inc. Written by Ian Lance Taylor <ia...@wa...>. This file is part of the libiberty library, which is part of GCC. @@ -180,7 +180,7 @@ d_advance (struct d_info *di, int i) extern const struct demangle_operator_info cplus_demangle_operators[]; #endif -#define D_BUILTIN_TYPE_COUNT (34) +#define D_BUILTIN_TYPE_COUNT (36) CP_STATIC_IF_GLIBCPP_V3 const struct demangle_builtin_type_info diff --git a/coregrind/m_demangle/cplus-dem.c b/coregrind/m_demangle/cplus-dem.c index 5d6e04d962..7259d8516c 100644 --- a/coregrind/m_demangle/cplus-dem.c +++ b/coregrind/m_demangle/cplus-dem.c @@ -1,5 +1,5 @@ /* Demangler for GNU C++ - Copyright (C) 1989-2022 Free Software Foundation, Inc. + Copyright (C) 1989-2023 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.uucp) Rewritten by Fred Fish (fn...@cy...) for ARM and Lucid demangling Modified by Satish Pai (pa...@ap...) for HP demangling diff --git a/coregrind/m_demangle/d-demangle.c b/coregrind/m_demangle/d-demangle.c index c2c3e08c8d..a390284b19 100644 --- a/coregrind/m_demangle/d-demangle.c +++ b/coregrind/m_demangle/d-demangle.c @@ -1,5 +1,5 @@ /* Demangler for the D programming language - Copyright (C) 2014-2022 Free Software Foundation, Inc. + Copyright (C) 2014-2023 Free Software Foundation, Inc. Written by Iain Buclaw (ib...@gd...) This file is part of the libiberty library. diff --git a/coregrind/m_demangle/demangle.h b/coregrind/m_demangle/demangle.h index bbce948c5c..3ab23d838b 100644 --- a/coregrind/m_demangle/demangle.h +++ b/coregrind/m_demangle/demangle.h @@ -1,5 +1,5 @@ /* Defs for interface to demanglers. - Copyright (C) 1992-2022 Free Software Foundation, Inc. + Copyright (C) 1992-2023 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License @@ -451,7 +451,25 @@ enum demangle_component_type /* A cloned function. */ DEMANGLE_COMPONENT_CLONE, DEMANGLE_COMPONENT_NOEXCEPT, - DEMANGLE_COMPONENT_THROW_SPEC + DEMANGLE_COMPONENT_THROW_SPEC, + + DEMANGLE_COMPONENT_STRUCTURED_BINDING, + + DEMANGLE_COMPONENT_MODULE_NAME, + DEMANGLE_COMPONENT_MODULE_PARTITION, + DEMANGLE_COMPONENT_MODULE_ENTITY, + DEMANGLE_COMPONENT_MODULE_INIT, + + DEMANGLE_COMPONENT_TEMPLATE_HEAD, + DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM, + DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM, + DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM, + DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM, + + /* A builtin type with argument. This holds the builtin type + information. */ + DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE + }; /* Types which are only used internally. */ @@ -538,6 +556,15 @@ struct demangle_component const struct demangle_builtin_type_info *type; } s_builtin; + /* For DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE. */ + struct + { + /* Builtin type. */ + const struct demangle_builtin_type_info *type; + short arg; + char suffix; + } s_extended_builtin; + /* For DEMANGLE_COMPONENT_SUB_STD. */ struct { diff --git a/coregrind/m_demangle/dyn-string.c b/coregrind/m_demangle/dyn-string.c index 89ce8e12cc..94ec0479a1 100644 --- a/coregrind/m_demangle/dyn-string.c +++ b/coregrind/m_demangle/dyn-string.c @@ -1,5 +1,5 @@ /* An abstract string datatype. - Copyright (C) 1998-2022 Free Software Foundation, Inc. + Copyright (C) 1998-2023 Free Software Foundation, Inc. Contributed by Mark Mitchell (ma...@ma...). This file is part of GNU CC. diff --git a/coregrind/m_demangle/dyn-string.h b/coregrind/m_demangle/dyn-string.h index be2184aa93..20750d2cdc 100644 --- a/coregrind/m_demangle/dyn-string.h +++ b/coregrind/m_demangle/dyn-string.h @@ -1,5 +1,5 @@ /* An abstract string datatype. - Copyright (C) 1998-2022 Free Software Foundation, Inc. + Copyright (C) 1998-2023 Free Software Foundation, Inc. Contributed by Mark Mitchell (ma...@ma...). This file is part of GCC. diff --git a/coregrind/m_demangle/rust-demangle.c b/coregrind/m_demangle/rust-demangle.c index 0a9331ac2e..405e439512 100644 --- a/coregrind/m_demangle/rust-demangle.c +++ b/coregrind/m_demangle/rust-demangle.c @@ -1,5 +1,5 @@ /* Demangler for the Rust programming language - Copyright (C) 2016-2022 Free Software Foundation, Inc. + Copyright (C) 2016-2023 Free Software Foundation, Inc. Written by David Tolnay (dt...@gm...). Rewritten by Eduard-Mihai Burtescu (ed...@ly...) for v0 support. @@ -153,7 +153,7 @@ parse_integer_62 (struct rust_demangler *rdm) return 0; x = 0; - while (!eat (rdm, '_')) + while (!eat (rdm, '_') && !rdm->errored) { c = next (rdm); x *= 62; @@ -1109,6 +1109,18 @@ demangle_path_maybe_open_generics (struct rust_demangler *rdm) if (rdm->errored) return open; + if (rdm->recursion != RUST_NO_RECURSION_LIMIT) + { + ++ rdm->recursion; + if (rdm->recursion > RUST_MAX_RECURSION_COUNT) + { + /* FIXME: There ought to be a way to report + that the recursion limit has been reached. */ + rdm->errored = 1; + goto end_of_func; + } + } + if (eat (rdm, 'B')) { backref = parse_integer_62 (rdm); @@ -1134,6 +1146,11 @@ demangle_path_maybe_open_generics (struct rust_demangler *rdm) } else demangle_path (rdm, 0); + + end_of_func: + if (rdm->recursion != RUST_NO_RECURSION_LIMIT) + -- rdm->recursion; + return open; } @@ -1175,6 +1192,15 @@ demangle_const (struct rust_demangler *rdm) if (rdm->errored) return; + if (rdm->recursion != RUST_NO_RECURSION_LIMIT) + { + ++ rdm->recursion; + if (rdm->recursion > RUST_MAX_RECURSION_COUNT) + /* FIXME: There ought to be a way to report + that the recursion limit has been reached. */ + goto fail_return; + } + if (eat (rdm, 'B')) { backref = parse_integer_62 (rdm); @@ -1185,7 +1211,7 @@ demangle_const (struct rust_demangler *rdm) demangle_const (rdm); rdm->next = old_next; } - return; + goto pass_return; } ty_tag = next (rdm); @@ -1194,7 +1220,7 @@ demangle_const (struct rust_demangler *rdm) /* Placeholder. */ case 'p': PRINT ("_"); - return; + goto pass_return; /* Unsigned integer types. */ case 'h': @@ -1227,18 +1253,21 @@ demangle_const (struct rust_demangler *rdm) break; default: - rdm->errored = 1; - return; + goto fail_return; } - if (rdm->errored) - return; - - if (rdm->verbose) + if (!rdm->errored && rdm->verbose) { PRINT (": "); PRINT (basic_type (ty_tag)); } + goto pass_return; + + fail_return: + rdm->errored = 1; + pass_return: + if (rdm->recursion != RUST_NO_RECURSION_LIMIT) + -- rdm->recursion; } static void diff --git a/coregrind/m_demangle/safe-ctype.c b/coregrind/m_demangle/safe-ctype.c index 97bc436675..44e4428ce4 100644 --- a/coregrind/m_demangle/safe-ctype.c +++ b/coregrind/m_demangle/safe-ctype.c @@ -1,6 +1,6 @@ /* <ctype.h> replacement macros. - Copyright (C) 2000-2022 Free Software Foundation, Inc. + Copyright (C) 2000-2023 Free Software Foundation, Inc. Contributed by Zack Weinberg <za...@st...>. This file is part of the libiberty library. diff --git a/coregrind/m_demangle/safe-ctype.h b/coregrind/m_demangle/safe-ctype.h index 86157ed4b1..b3d62ec7d2 100644 --- a/coregrind/m_demangle/safe-ctype.h +++ b/coregrind/m_demangle/safe-ctype.h @@ -1,6 +1,6 @@ /* <ctype.h> replacement macros. - Copyright (C) 2000-2022 Free Software Foundation, Inc. + Copyright (C) 2000-2023 Free Software Foundation, Inc. Contributed by Zack Weinberg <za...@st...>. This file is part of the libiberty library. |
|
From: Paul F. <pa...@so...> - 2023-05-09 06:42:40
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=5d8e43ea26440673f3d2df9836ca1db546e45673 commit 5d8e43ea26440673f3d2df9836ca1db546e45673 Author: Paul Floyd <pj...@wa...> Date: Tue May 9 08:42:07 2023 +0200 FreeBSD: update auxv test for x86 Diff: --- none/tests/freebsd/auxv.stderr.exp-32on64 | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/none/tests/freebsd/auxv.stderr.exp-32on64 b/none/tests/freebsd/auxv.stderr.exp-32on64 index a0c3cbc86f..db7060abce 100644 --- a/none/tests/freebsd/auxv.stderr.exp-32on64 +++ b/none/tests/freebsd/auxv.stderr.exp-32on64 @@ -6,12 +6,23 @@ val: AT_FLAGS int: 08 ptr: 0x........ val: AT_ENTRY int: 09 ptr: 0x........ val: AT_BASE int: 07 ptr: 0x........ val: AT_EHDRFLAGS int: 24 ptr: 0x........ -val: AT_IGNORE int: 01 ptr: 0x........ +val: AT_EXECPATH int: 15 ptr: 0x........ +EXECPATH: BASEDIR/valgrind/none/tests/freebsd/auxv val: AT_OSRELDATE int: 18 ptr: 0x........ -val: AT_IGNORE int: 01 ptr: 0x........ -val: AT_IGNORE int: 01 ptr: 0x........ +val: AT_CANARY int: 16 ptr: 0x........ +val: AT_CANARYLEN int: 17 ptr: 0x........ val: AT_NCPUS int: 19 ptr: 0x........ val: AT_PAGESIZES int: 20 ptr: 0x........ val: AT_PAGESIZESLEN int: 21 ptr: 0x........ val: AT_IGNORE int: 01 ptr: 0x........ val: AT_STACKPROT int: 23 ptr: 0x........ +val: AT_IGNORE int: 01 ptr: 0x........ +val: AT_ARGC int: 28 ptr: 0x........ +val: AT_ARGV int: 29 ptr: 0x........ +ARGV: ./auxv +val: AT_ENVC int: 30 ptr: 0x........ +val: AT_ENVV int: 31 ptr: 0x........ +val: AT_PS_STRINGS int: 32 ptr: 0x........ +PS_STRINGS ARGV: ./auxv +val: AT_USRSTACKBASE int: 35 ptr: 0x........ +val: AT_USRSTACKLIM int: 36 ptr: 0x........ |
|
From: Paul F. <pa...@so...> - 2023-05-08 20:28:56
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=1d290b3eba444c6dddaacee1f96f6621ece89df4 commit 1d290b3eba444c6dddaacee1f96f6621ece89df4 Author: Paul Floyd <pj...@wa...> Date: Mon May 8 22:27:40 2023 +0200 FreeBSD: add Helgrind suppression for getaddrinfo Testcase was failing on x86 Diff: --- freebsd-helgrind.supp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/freebsd-helgrind.supp b/freebsd-helgrind.supp index be10339c62..16e45c560f 100644 --- a/freebsd-helgrind.supp +++ b/freebsd-helgrind.supp @@ -217,3 +217,9 @@ obj:*/lib*/libc.so.7 fun:vsprintf } +{ + HELGRIND-LIBC-GETADDRINFO + Helgrind:Race + ... + fun:getaddrinfo +} |
|
From: Paul F. <pa...@so...> - 2023-05-07 19:44:14
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=4a6af26713ccae3cb53b6a1f40b447d5155b066e commit 4a6af26713ccae3cb53b6a1f40b447d5155b066e Author: Paul Floyd <pj...@wa...> Date: Sun May 7 21:42:21 2023 +0200 regtest: remove FreeBSD version of expected for memcheck memalign_test During recent aligned allocations cleanup, the output became more consistend and this is no longer needed. Diff: --- memcheck/tests/Makefile.am | 1 - memcheck/tests/memalign_test.stderr.exp-freebsd-clang | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am index 9bbbe7bec5..71c38acbaf 100644 --- a/memcheck/tests/Makefile.am +++ b/memcheck/tests/Makefile.am @@ -224,7 +224,6 @@ EXTRA_DIST = \ manuel3.stderr.exp manuel3.vgtest \ match-overrun.stderr.exp match-overrun.vgtest match-overrun.supp \ memalign_test.stderr.exp memalign_test.vgtest \ - memalign_test.stderr.exp-freebsd-clang \ memalign_args.vgtest memalign_args.stderr.exp \ memalign_args.stderr.exp-glibc \ memalign_args.stderr.exp-darwin \ diff --git a/memcheck/tests/memalign_test.stderr.exp-freebsd-clang b/memcheck/tests/memalign_test.stderr.exp-freebsd-clang deleted file mode 100644 index a71377383f..0000000000 --- a/memcheck/tests/memalign_test.stderr.exp-freebsd-clang +++ /dev/null @@ -1,10 +0,0 @@ -Invalid free() / delete / delete[] / realloc() - at 0x........: free (vg_replace_malloc.c:...) - by 0x........: main (memalign_test.c:25) - Address 0x........ is 0 bytes inside a block of size 111,110 free'd - at 0x........: free (vg_replace_malloc.c:...) - by 0x........: main (memalign_test.c:23) - Block was alloc'd at - at 0x........: valloc (vg_replace_malloc.c:...) - by 0x........: main (memalign_test.c:16) - |
|
From: Paul F. <pa...@so...> - 2023-05-07 10:05:09
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=bf2d61929301a596af3b52602e4319728e291a9b commit bf2d61929301a596af3b52602e4319728e291a9b Author: Paul Floyd <pj...@wa...> Date: Sun May 7 12:02:54 2023 +0200 regtest: Deactivate tall call optimization in Massif bug469146 This optimization truncates the callstack causing fails on some platforms Diff: --- massif/tests/Makefile.am | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/massif/tests/Makefile.am b/massif/tests/Makefile.am index 2f3a84ecc7..132e633124 100644 --- a/massif/tests/Makefile.am +++ b/massif/tests/Makefile.am @@ -89,7 +89,9 @@ AM_CXXFLAGS += $(AM_FLAG_M3264_PRI) # C++ tests bug469146_SOURCES = bug469146.cpp -bug469146_CXXFLAGS = $(AM_CFLAGS) -O2 +# -fno-optimize-sibling-calls because otherwise some platforms will have +# tail call optimization which meeses up --ignore-fn +bug469146_CXXFLAGS = $(AM_CXXFLAGS) -O2 -fno-optimize-sibling-calls new_cpp_SOURCES = new-cpp.cpp overloaded_new_SOURCES = overloaded-new.cpp # pre C++11 compilers don't have exception specs |
|
From: Paul F. <pa...@so...> - 2023-05-07 10:05:01
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=a4d35eabe26211856bd0afc2b285cf932cbb17dc commit a4d35eabe26211856bd0afc2b285cf932cbb17dc Author: Paul Floyd <pj...@wa...> Date: Sun May 7 12:01:06 2023 +0200 Helgrind Linux: make nss gethostbyname4 suppression cover all variants Diff: --- glibc-2.X-helgrind.supp.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/glibc-2.X-helgrind.supp.in b/glibc-2.X-helgrind.supp.in index 0e573b21e7..44aee1c515 100644 --- a/glibc-2.X-helgrind.supp.in +++ b/glibc-2.X-helgrind.supp.in @@ -319,9 +319,9 @@ fun:getaddrinfo } -# * here for dns and files variants +# * here for dns and files variants etc. { - helgrind---_nss_*s_gethostbyname4_r + helgrind---_nss_*_gethostbyname4_r Helgrind:Race - fun:_nss_*s_gethostbyname4_r + fun:_nss_*_gethostbyname4_r } |
|
From: Paul F. <pa...@so...> - 2023-05-07 08:12:10
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=7e73308cea2ee2ad605d229549dd46cf71ed2e4e commit 7e73308cea2ee2ad605d229549dd46cf71ed2e4e Author: Paul Floyd <pj...@wa...> Date: Sun May 7 10:11:08 2023 +0200 Linux Helgrind: broaden _nss_dns_gethostbyname4_r to also cover _nss_files_gethostbyname4_r Diff: --- glibc-2.X-helgrind.supp.in | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/glibc-2.X-helgrind.supp.in b/glibc-2.X-helgrind.supp.in index 95959d2e9a..0e573b21e7 100644 --- a/glibc-2.X-helgrind.supp.in +++ b/glibc-2.X-helgrind.supp.in @@ -319,8 +319,9 @@ fun:getaddrinfo } +# * here for dns and files variants { - helgrind---_nss_dns_gethostbyname4_r + helgrind---_nss_*s_gethostbyname4_r Helgrind:Race - fun:_nss_dns_gethostbyname4_r + fun:_nss_*s_gethostbyname4_r } |
|
From: Paul F. <pa...@so...> - 2023-05-07 08:01:52
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=036a2b3dd8dc413aa3bd469803950f5b7d685296 commit 036a2b3dd8dc413aa3bd469803950f5b7d685296 Author: Paul Floyd <pj...@wa...> Date: Sun May 7 10:00:48 2023 +0200 Linux Helgrind: add another suppression for intermittent failure in dl lookup Diff: --- glibc-2.X-helgrind.supp.in | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/glibc-2.X-helgrind.supp.in b/glibc-2.X-helgrind.supp.in index 6e57e4c56a..95959d2e9a 100644 --- a/glibc-2.X-helgrind.supp.in +++ b/glibc-2.X-helgrind.supp.in @@ -282,6 +282,13 @@ fun:pthread_create@* } +{ + helgrind---_dl_lookup_symbol_x + Helgrind:Race + ... + fun:_dl_lookup_symbol_x +} + #################################################### # To do with GNU libgomp # |
|
From: Paul F. <pa...@so...> - 2023-05-07 07:56:37
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=cfd58a2e6dc208c436587af24bda5a558e17d15a commit cfd58a2e6dc208c436587af24bda5a558e17d15a Author: Paul Floyd <pj...@wa...> Date: Sun May 7 09:54:50 2023 +0200 Linux Helgrind: add suppression for intermittent failure in getaddrinfo regtest Causes intermittent failure on gcc110 ppc Diff: --- glibc-2.X-helgrind.supp.in | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/glibc-2.X-helgrind.supp.in b/glibc-2.X-helgrind.supp.in index d46a7a1166..6e57e4c56a 100644 --- a/glibc-2.X-helgrind.supp.in +++ b/glibc-2.X-helgrind.supp.in @@ -311,3 +311,9 @@ ... fun:getaddrinfo } + +{ + helgrind---_nss_dns_gethostbyname4_r + Helgrind:Race + fun:_nss_dns_gethostbyname4_r +} |
|
From: Paul F. <pa...@so...> - 2023-05-06 11:33:39
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=5ea25f0b0ae711bd30c6d8b21db33a633ec3e4b9 commit 5ea25f0b0ae711bd30c6d8b21db33a633ec3e4b9 Author: Paul Floyd <pj...@wa...> Date: Sat May 6 13:30:44 2023 +0200 FreeBSD regtest: add small hack to mcclean_after_fork gdb script As far as I can tell this was a regression in FreeBSD gdb around Aug 2022 when the default install upgraded from 11.2 to 12.1 Diff: --- gdbserver_tests/mcclean_after_fork.stdinB.gdb | 3 +++ gdbserver_tests/mcclean_after_fork.stdoutB.exp | 1 + 2 files changed, 4 insertions(+) diff --git a/gdbserver_tests/mcclean_after_fork.stdinB.gdb b/gdbserver_tests/mcclean_after_fork.stdinB.gdb index bd2a5685f2..bbe795f95e 100644 --- a/gdbserver_tests/mcclean_after_fork.stdinB.gdb +++ b/gdbserver_tests/mcclean_after_fork.stdinB.gdb @@ -15,6 +15,9 @@ continue # put a read watchpoint on mem # we expect that the read watchpoint is not triggered in the child # (as we expect it will be cleared at fork). +# On FreeBSD directly calling rwatch mem causes an error +# calling print first fixes that as a workaround +p mem rwatch mem # continue diff --git a/gdbserver_tests/mcclean_after_fork.stdoutB.exp b/gdbserver_tests/mcclean_after_fork.stdoutB.exp index 590e4c93b9..c7bdba12d2 100644 --- a/gdbserver_tests/mcclean_after_fork.stdoutB.exp +++ b/gdbserver_tests/mcclean_after_fork.stdoutB.exp @@ -4,6 +4,7 @@ Breakpoint 3 at 0x........: file clean_after_fork.c, line 22. Continuing. Breakpoint 1, main () at clean_after_fork.c:9 9 pid = fork(); +$1 = 0 Hardware read watchpoint 4: mem Continuing. Hardware read watchpoint 4: mem |
|
From: Paul F. <pa...@so...> - 2023-05-06 05:55:18
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=92a661ebf328b4cf0027234a33952e6e13964b5d commit 92a661ebf328b4cf0027234a33952e6e13964b5d Author: Paul Floyd <pj...@wa...> Date: Sat May 6 07:54:45 2023 +0200 Bug 469049 - link failure on ppc64 (big endian) valgrind 3.20 Diff: --- NEWS | 1 + coregrind/Makefile.am | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index f44cfde1dc..0b54c9cb7b 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,7 @@ bugzilla (https://bugs.kde.org/enter_bug.cgi?product=valgrind) rather than mailing the developers (or mailing lists) directly -- bugs that are not entered into bugzilla tend to get forgotten about or ignored. +469049 link failure on ppc64 (big endian) valgrind 3.20 469146 massif --ignore-fn does not ignore inlined functions To see details of a given bug, visit diff --git a/coregrind/Makefile.am b/coregrind/Makefile.am index 80115f21fe..553211782f 100644 --- a/coregrind/Makefile.am +++ b/coregrind/Makefile.am @@ -334,7 +334,6 @@ COREGRIND_SOURCES_COMMON = \ m_seqmatch.c \ m_signals.c \ m_sparsewa.c \ - m_stacks.c \ m_stacktrace.c \ m_syscall.c \ m_threadstate.c \ @@ -394,7 +393,6 @@ COREGRIND_SOURCES_COMMON = \ m_dispatch/dispatch-x86-solaris.S \ m_dispatch/dispatch-amd64-solaris.S \ m_gdbserver/inferiors.c \ - m_gdbserver/m_gdbserver.c \ m_gdbserver/regcache.c \ m_gdbserver/remote-utils.c \ m_gdbserver/server.c \ @@ -493,7 +491,9 @@ COREGRIND_SOURCES_COMMON = \ # These objects are added to the libcoregrind library. NOLTO_COREGRIND_SOURCES_COMMON = \ m_libcsetjmp.c \ - m_main.c + m_main.c \ + m_stacks.c \ + m_gdbserver/m_gdbserver.c noinst_LIBRARIES = libnolto_coregrind-@VGCONF_ARCH_PRI@-@VGCONF_OS@.a libnolto_coregrind_@VGCONF_ARCH_PRI@_@VGCONF_OS@_a_SOURCES = \ $(NOLTO_COREGRIND_SOURCES_COMMON) |
|
From: Paul F. <pa...@so...> - 2023-05-06 05:47:07
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=645de069956aa667b924026d2125433461766e4d commit 645de069956aa667b924026d2125433461766e4d Author: Paul Floyd <pj...@wa...> Date: Sat May 6 07:45:47 2023 +0200 Bug 469146 - massif --ignore-fn does not ignore inlined functions Diff: --- .gitignore | 1 + NEWS | 2 +- coregrind/m_debuginfo/debuginfo.c | 26 +++++++++++++++++++++++++ include/pub_tool_debuginfo.h | 4 +++- massif/docs/ms-manual.xml | 11 +++++++++++ massif/ms_main.c | 31 ++++++++++++++++++++++++----- massif/tests/Makefile.am | 4 ++++ massif/tests/bug469146.cpp | 41 +++++++++++++++++++++++++++++++++++++++ massif/tests/bug469146.post.exp | 38 ++++++++++++++++++++++++++++++++++++ massif/tests/bug469146.stderr.exp | 2 ++ massif/tests/bug469146.vgtest | 8 ++++++++ 11 files changed, 161 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 6155f8f355..076e168ded 100644 --- a/.gitignore +++ b/.gitignore @@ -772,6 +772,7 @@ /massif/tests/basic /massif/tests/basic_malloc /massif/tests/big-alloc +/massif/tests/bug469146 /massif/tests/culling1 /massif/tests/culling2 /massif/tests/custom_alloc diff --git a/NEWS b/NEWS index e269d128b9..f44cfde1dc 100644 --- a/NEWS +++ b/NEWS @@ -26,7 +26,7 @@ bugzilla (https://bugs.kde.org/enter_bug.cgi?product=valgrind) rather than mailing the developers (or mailing lists) directly -- bugs that are not entered into bugzilla tend to get forgotten about or ignored. - +469146 massif --ignore-fn does not ignore inlined functions To see details of a given bug, visit https://bugs.kde.org/show_bug.cgi?id=XXXXXX diff --git a/coregrind/m_debuginfo/debuginfo.c b/coregrind/m_debuginfo/debuginfo.c index 2d2accc999..22b41def21 100644 --- a/coregrind/m_debuginfo/debuginfo.c +++ b/coregrind/m_debuginfo/debuginfo.c @@ -2289,6 +2289,32 @@ Bool VG_(get_fnname) ( DiEpoch ep, Addr a, const HChar** buf ) /*offsetP*/NULL ); } + +Bool VG_(get_fnname_inl) ( DiEpoch ep, Addr a, const HChar** buf, + const InlIPCursor* iipc ) +{ + if (iipc) { + vg_assert(is_DI_valid_for_epoch(iipc->di, ep)); + } + + if (is_bottom(iipc)) { + return get_sym_name ( /*C++-demangle*/True, /*Z-demangle*/True, + /*below-main-renaming*/True, + ep, a, buf, + /*match_anywhere_in_fun*/True, + /*show offset?*/False, + /*text sym*/True, + /*offsetP*/NULL ); + } else { + const DiInlLoc *next_inl = iipc && iipc->next_inltab >= 0 + ? & iipc->di->inltab[iipc->next_inltab] + : NULL; + vg_assert (next_inl); + *buf = next_inl->inlinedfn; + return True; + } +} + /* This is available to tools... always demangle C++ names, match anywhere in function, and show offset if nonzero. NOTE: See IMPORTANT COMMENT above about persistence and ownership diff --git a/include/pub_tool_debuginfo.h b/include/pub_tool_debuginfo.h index 078c562b8e..7631ff67a6 100644 --- a/include/pub_tool_debuginfo.h +++ b/include/pub_tool_debuginfo.h @@ -210,7 +210,9 @@ extern Bool VG_(next_IIPC)(InlIPCursor *iipc); /* Free all memory associated with iipc. */ extern void VG_(delete_IIPC)(InlIPCursor *iipc); - +/* Similar to VG_(get_fnname) but uses InlIPCursor and handles inline functions */ +extern Bool VG_(get_fnname_inl) ( DiEpoch ep, Addr a, const HChar** fnname, + const InlIPCursor* iipc ); /* Get an XArray of StackBlock which describe the stack (auto) blocks for this ip. The caller is expected to free the XArray at some diff --git a/massif/docs/ms-manual.xml b/massif/docs/ms-manual.xml index b589071556..3dff259952 100644 --- a/massif/docs/ms-manual.xml +++ b/massif/docs/ms-manual.xml @@ -760,6 +760,17 @@ various places online. <screen><![CDATA[ --alloc-fn='operator new(unsigned, std::nothrow_t const&)' ]]></screen> + Arguments of type <computeroutput>size_t</computeroutput> need to be replaced + with <computeroutput>unsigned long</computeroutput> on 64bit platforms and <computeroutput>unsigned</computeroutput> + on 32bit platforms. + </para> + + <para><option>--alloc-fn</option> will work with inline functions. + Inline function names are not mangled, which means that you only need + to provide the function name and not the argument list. + </para> + + <para><option>--alloc-fn</option> does not support wildcards. </para> </listitem> </varlistentry> diff --git a/massif/ms_main.c b/massif/ms_main.c index f3500c367d..1040ad53f4 100644 --- a/massif/ms_main.c +++ b/massif/ms_main.c @@ -506,6 +506,8 @@ void filter_IPs (Addr* ips, Int n_ips, { Int i; Bool top_has_fnname = False; + Bool is_alloc_fn = False; + Bool is_inline_fn = False; const HChar *fnname; *top = 0; @@ -519,9 +521,21 @@ void filter_IPs (Addr* ips, Int n_ips, // 0x1 0x2 0x3 alloc func1 main // became 0x1 0x2 0x3 func1 main const DiEpoch ep = VG_(current_DiEpoch)(); - for (i = *top; i < n_ips; i++) { - top_has_fnname = VG_(get_fnname)(ep, ips[*top], &fnname); - if (top_has_fnname && VG_(strIsMemberXA)(alloc_fns, fnname)) { + InlIPCursor *iipc = NULL; + + for (i = *top; i < n_ips; ++i) { + iipc = VG_(new_IIPC)(ep, ips[i]); + do { + top_has_fnname = VG_(get_fnname_inl)(ep, ips[i], &fnname, iipc); + is_alloc_fn = top_has_fnname && VG_(strIsMemberXA)(alloc_fns, fnname); + is_inline_fn = VG_(next_IIPC)(iipc); + if (is_alloc_fn && is_inline_fn) { + VERB(4, "filtering inline alloc fn %s\n", fnname); + } + } while (is_alloc_fn && is_inline_fn); + VG_(delete_IIPC)(iipc); + + if (is_alloc_fn) { VERB(4, "filtering alloc fn %s\n", fnname); (*top)++; (*n_ips_sel)--; @@ -534,8 +548,15 @@ void filter_IPs (Addr* ips, Int n_ips, if (*n_ips_sel > 0 && VG_(sizeXA)(ignore_fns) > 0) { if (!top_has_fnname) { // top has no fnname => search for the first entry that has a fnname - for (i = *top; i < n_ips && !top_has_fnname; i++) { - top_has_fnname = VG_(get_fnname)(ep, ips[i], &fnname); + for (i = *top; i < n_ips && !top_has_fnname; ++i) { + iipc = VG_(new_IIPC)(ep, ips[i]); + do { + top_has_fnname = VG_(get_fnname_inl)(ep, ips[i], &fnname, iipc); + if (top_has_fnname) { + break; + } + } while (VG_(next_IIPC)(iipc)); + VG_(delete_IIPC)(iipc); } } if (top_has_fnname && VG_(strIsMemberXA)(ignore_fns, fnname)) { diff --git a/massif/tests/Makefile.am b/massif/tests/Makefile.am index 84c9b1273a..2f3a84ecc7 100644 --- a/massif/tests/Makefile.am +++ b/massif/tests/Makefile.am @@ -11,6 +11,7 @@ EXTRA_DIST = \ big-alloc.post.exp big-alloc.post.exp-64bit big-alloc.post.exp-ppc64 \ big-alloc.stderr.exp big-alloc.vgtest \ big-alloc.post.exp-x86-freebsd \ + bug469146.post.exp bug469146.stderr.exp bug469146.vgtest \ deep-A.post.exp deep-A.stderr.exp deep-A.vgtest \ deep-B.post.exp deep-B.stderr.exp deep-B.vgtest \ deep-C.post.exp deep-C.stderr.exp deep-C.vgtest \ @@ -59,6 +60,7 @@ check_PROGRAMS = \ alloc-fns \ basic \ big-alloc \ + bug469146 \ culling1 culling2 \ custom_alloc \ deep \ @@ -86,6 +88,8 @@ AM_CFLAGS += $(AM_FLAG_M3264_PRI) AM_CXXFLAGS += $(AM_FLAG_M3264_PRI) # C++ tests +bug469146_SOURCES = bug469146.cpp +bug469146_CXXFLAGS = $(AM_CFLAGS) -O2 new_cpp_SOURCES = new-cpp.cpp overloaded_new_SOURCES = overloaded-new.cpp # pre C++11 compilers don't have exception specs diff --git a/massif/tests/bug469146.cpp b/massif/tests/bug469146.cpp new file mode 100644 index 0000000000..268f07c0a8 --- /dev/null +++ b/massif/tests/bug469146.cpp @@ -0,0 +1,41 @@ +#include <cstdlib> + +// this is inline so it filters as "filter_function1" +static inline int* filter_function1(std::size_t size) +{ + return new int[size]; +} + +// this is out of line C++ +// int is deliberately used here instead of size_t +// so that it is 32/b4 bit portable +// this filters as "filter_function2(int)" +int* __attribute__((optnone)) __attribute__((noinline)) filter_function2(int size) +{ + return new int[static_cast<std::size_t>(size)]; +} + +// finally extern "C" +// this filters as "filter_function3" +extern "C" +int* __attribute__((optnone)) __attribute__((noinline)) filter_function3(std::size_t size) +{ + return new int[size]; +} + +size_t func() +{ + int * mem1 = filter_function1(1000U); + int * mem2 = filter_function2(1000); + int * mem3 = filter_function3(1000U); + delete [] mem1; + delete [] mem2; + delete [] mem3; + + return (size_t)mem1/2 + (size_t)mem2/2 + (size_t)mem3/2; +} + +int main() +{ + return func(); +} diff --git a/massif/tests/bug469146.post.exp b/massif/tests/bug469146.post.exp new file mode 100644 index 0000000000..1e9936cbe1 --- /dev/null +++ b/massif/tests/bug469146.post.exp @@ -0,0 +1,38 @@ +-------------------------------------------------------------------------------- +Command: ./bug469146 +Massif arguments: --stacks=no --time-unit=B --massif-out-file=massif.out --ignore-fn=__part_load_locale --ignore-fn=__time_load_locale --ignore-fn=dwarf2_unwind_dyld_add_image_hook --ignore-fn=get_or_create_key_element --ignore-fn=_GLOBAL__sub_I_eh_alloc.cc --ignore-fn=call_init.part.0 --ignore-fn=call_init --ignore-fn=filter_function1 --ignore-fn=filter_function2(int) --ignore-fn=filter_function3 +ms_print arguments: massif.out +-------------------------------------------------------------------------------- + + + B + 1^ + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + 0 +----------------------------------------------------------------------->B + 0 1 + +Number of snapshots: 1 + Detailed snapshots: [] + +-------------------------------------------------------------------------------- + n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) +-------------------------------------------------------------------------------- + 0 0 0 0 0 0 diff --git a/massif/tests/bug469146.stderr.exp b/massif/tests/bug469146.stderr.exp new file mode 100644 index 0000000000..139597f9cb --- /dev/null +++ b/massif/tests/bug469146.stderr.exp @@ -0,0 +1,2 @@ + + diff --git a/massif/tests/bug469146.vgtest b/massif/tests/bug469146.vgtest new file mode 100644 index 0000000000..68585a4514 --- /dev/null +++ b/massif/tests/bug469146.vgtest @@ -0,0 +1,8 @@ +prog: bug469146 +vgopts: --stacks=no --time-unit=B --massif-out-file=massif.out +vgopts: --ignore-fn=__part_load_locale --ignore-fn=__time_load_locale --ignore-fn=dwarf2_unwind_dyld_add_image_hook +vgopts: --ignore-fn=get_or_create_key_element --ignore-fn=_GLOBAL__sub_I_eh_alloc.cc --ignore-fn=call_init.part.0 +vgopts: --ignore-fn=call_init +vgopts: --ignore-fn=filter_function1 --ignore-fn="filter_function2(int)" --ignore-fn=filter_function3 +post: perl ../../massif/ms_print massif.out | sed 's/gcc[0-9]*/gcc/' | ../../tests/filter_addresses +cleanup: rm massif.out |
|
From: Paul F. <pa...@so...> - 2023-05-06 05:30:54
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=c324a6b1396e9e3827e4625616fc75c6d926a772 commit c324a6b1396e9e3827e4625616fc75c6d926a772 Author: Paul Floyd <pj...@wa...> Date: Sat May 6 07:28:51 2023 +0200 FreeBSD: deactivate helgrind/tests/tls_threads No libc tunable, and I haven't seen any way to hack the libc internals via debuginfo as was previously done on Linux. Diff: --- helgrind/tests/tls_threads.vgtest | 1 + 1 file changed, 1 insertion(+) diff --git a/helgrind/tests/tls_threads.vgtest b/helgrind/tests/tls_threads.vgtest index 5fb4587372..aea30e565a 100644 --- a/helgrind/tests/tls_threads.vgtest +++ b/helgrind/tests/tls_threads.vgtest @@ -1,2 +1,3 @@ +prereq: ! ../../tests/os_test freebsd prog: tls_threads vgopts: -q --sim-hints=no-nptl-pthread-stackcache |
|
From: Paul F. <pa...@so...> - 2023-05-05 20:19:53
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=40b914f0d09c1e021e7398a17ab5cc7a854f39c8 commit 40b914f0d09c1e021e7398a17ab5cc7a854f39c8 Author: Paul Floyd <pj...@wa...> Date: Fri May 5 22:05:36 2023 +0200 Add Helgrind and DRD tests and suppressions for getaddrinfo on Linux Bump version to 3.22.0.GIT The testcase was posted on the freebsd-hackers mailing list. I had time to get suppressions for FreeBSD into 3.21 but ran out of time for the test and Linux suppressions. I did take a look at how thread sanitizer handles this. Basically it intercepts the call, turns off checking, calls the resl function then turns checking back on. I don't see many other similar examples. Might be worth looking at dlopen and atexit. Diff: --- .gitignore | 1 + NEWS | 34 +++++++++++++++++++++++++++++++ configure.ac | 6 +++--- drd/tests/Makefile.am | 2 ++ drd/tests/getaddrinfo.stderr.exp | 0 drd/tests/getaddrinfo.vgtest | 3 +++ glibc-2.X-drd.supp.in | 10 +++++++++ glibc-2.X-helgrind.supp.in | 9 +++++++++ helgrind/tests/Makefile.am | 2 ++ helgrind/tests/getaddrinfo.c | 38 +++++++++++++++++++++++++++++++++++ helgrind/tests/getaddrinfo.stderr.exp | 0 helgrind/tests/getaddrinfo.vgtest | 2 ++ 12 files changed, 104 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 27183b99b9..6155f8f355 100644 --- a/.gitignore +++ b/.gitignore @@ -662,6 +662,7 @@ /helgrind/tests/cond_timedwait_test /helgrind/tests/free_is_write /helgrind/tests/garbage.filtered.out +/helgrind/tests/getaddrinfo /helgrind/tests/hg01_all_ok /helgrind/tests/hg02_deadlock /helgrind/tests/hg03_inherit diff --git a/NEWS b/NEWS index 342a733650..e269d128b9 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,37 @@ +Release 3.22.0 (?? Oct 2023) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This release supports X86/Linux, AMD64/Linux, ARM32/Linux, ARM64/Linux, +PPC32/Linux, PPC64BE/Linux, PPC64LE/Linux, S390X/Linux, MIPS32/Linux, +MIPS64/Linux, ARM/Android, ARM64/Android, MIPS32/Android, X86/Android, +X86/Solaris, AMD64/Solaris, AMD64/MacOSX 10.12, X86/FreeBSD and +AMD64/FreeBSD. There is also preliminary support for X86/macOS 10.13, +AMD64/macOS 10.13 and nanoMIPS/Linux. + +* ==================== CORE CHANGES =================== + + +* ================== PLATFORM CHANGES ================= + + +* ==================== TOOL CHANGES =================== + + +* ==================== FIXED BUGS ==================== + +The following bugs have been fixed or resolved. Note that "n-i-bz" +stands for "not in bugzilla" -- that is, a bug that was reported to us +but never got a bugzilla entry. We encourage you to file bugs in +bugzilla (https://bugs.kde.org/enter_bug.cgi?product=valgrind) rather +than mailing the developers (or mailing lists) directly -- bugs that +are not entered into bugzilla tend to get forgotten about or ignored. + + + +To see details of a given bug, visit + https://bugs.kde.org/show_bug.cgi?id=XXXXXX +where XXXXXX is the bug number as listed above. + Release 3.21.0 (28 Apr 2023) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/configure.ac b/configure.ac index 79b17f3940..15fbf5ea20 100755 --- a/configure.ac +++ b/configure.ac @@ -15,10 +15,10 @@ # Also set the (expected/last) release date here. # Do not forget to rerun ./autogen.sh m4_define([v_major_ver], [3]) -m4_define([v_minor_ver], [21]) +m4_define([v_minor_ver], [22]) m4_define([v_micro_ver], [0]) -m4_define([v_suffix_ver], []) -m4_define([v_rel_date], ["28 Apr 2023"]) +m4_define([v_suffix_ver], [GIT]) +m4_define([v_rel_date], ["?? Oct 2023"]) m4_define([v_version], m4_if(v_suffix_ver, [], [v_major_ver.v_minor_ver.v_micro_ver], diff --git a/drd/tests/Makefile.am b/drd/tests/Makefile.am index 7ea83cbf7e..5482cf7be4 100755 --- a/drd/tests/Makefile.am +++ b/drd/tests/Makefile.am @@ -152,6 +152,8 @@ EXTRA_DIST = \ hold_lock_1.vgtest \ hold_lock_2.stderr.exp \ hold_lock_2.vgtest \ + getaddrinfo.stderr.exp \ + getaddrinfo.vgtest \ linuxthreads_det.stderr.exp \ linuxthreads_det.stderr.exp-linuxthreads \ linuxthreads_det.stdout.exp \ diff --git a/drd/tests/getaddrinfo.stderr.exp b/drd/tests/getaddrinfo.stderr.exp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/drd/tests/getaddrinfo.vgtest b/drd/tests/getaddrinfo.vgtest new file mode 100644 index 0000000000..6faa2b6bde --- /dev/null +++ b/drd/tests/getaddrinfo.vgtest @@ -0,0 +1,3 @@ +prereq: ./supported_libpthread +vgopts: -q +prog: ../../helgrind/tests/getaddrinfo diff --git a/glibc-2.X-drd.supp.in b/glibc-2.X-drd.supp.in index 4c6bdb6a1a..9f8fda9f4f 100644 --- a/glibc-2.X-drd.supp.in +++ b/glibc-2.X-drd.supp.in @@ -351,3 +351,13 @@ ... fun:_ZN5boost6detail23set_current_thread_dataEPNS0_16thread_data_baseE } + +# +# Suppression patterrns for posix functions +{ + drd-libc-getaddrinfo + drd:ConflictingAccess + ... + fun:getaddrinfo +} + diff --git a/glibc-2.X-helgrind.supp.in b/glibc-2.X-helgrind.supp.in index 0f76ad0e9a..d46a7a1166 100644 --- a/glibc-2.X-helgrind.supp.in +++ b/glibc-2.X-helgrind.supp.in @@ -302,3 +302,12 @@ Helgrind:Race fun:gomp_ordered_last } + +#################################################### +# posix functions that are thread safe +{ + helgrind---getaddrinfo + Helgrind:Race + ... + fun:getaddrinfo +} diff --git a/helgrind/tests/Makefile.am b/helgrind/tests/Makefile.am index 5338ea4d6d..13e2d4db66 100755 --- a/helgrind/tests/Makefile.am +++ b/helgrind/tests/Makefile.am @@ -33,6 +33,7 @@ EXTRA_DIST = \ bar_trivial.vgtest bar_trivial.stdout.exp bar_trivial.stderr.exp \ free_is_write.vgtest free_is_write.stdout.exp \ free_is_write.stderr.exp \ + getaddrinfo.vgtest getaddrinfo.stderr.exp \ hg01_all_ok.vgtest hg01_all_ok.stdout.exp hg01_all_ok.stderr.exp \ hg02_deadlock.vgtest hg02_deadlock.stdout.exp hg02_deadlock.stderr.exp \ hg03_inherit.vgtest hg03_inherit.stdout.exp hg03_inherit.stderr.exp \ @@ -153,6 +154,7 @@ check_PROGRAMS = \ cond_timedwait_invalid \ cond_timedwait_test \ free_is_write \ + getaddrinfo \ hg01_all_ok \ hg02_deadlock \ hg03_inherit \ diff --git a/helgrind/tests/getaddrinfo.c b/helgrind/tests/getaddrinfo.c new file mode 100644 index 0000000000..bdb8434588 --- /dev/null +++ b/helgrind/tests/getaddrinfo.c @@ -0,0 +1,38 @@ +#include <netdb.h> +#include <pthread.h> +#include <sys/socket.h> +#include <sys/types.h> + +struct data { + const char *hostname; + struct addrinfo *res; +}; + +struct data threaddat[5] = { + { "www.freebsd.org", 0 }, + { "www.google.com", 0 }, + { "www.freshports.org", 0 }, + { "www.github.com", 0 }, + { "www.kernel.org", 0 } +}; + +pthread_t threads[5]; + +void *resolve(void *d) { + struct data *data = d; + getaddrinfo(data->hostname, 0, 0, &data->res); + return 0; +} + +int main(void) { + int i; + for (i = 0; i < 5; ++i) { + pthread_create(&threads[i], 0, resolve, &threaddat[i]); + } + for (i = 0; i < 5; ++i) { + pthread_join(threads[i], 0); + freeaddrinfo(threaddat[i].res); + } + return 0; +} + diff --git a/helgrind/tests/getaddrinfo.stderr.exp b/helgrind/tests/getaddrinfo.stderr.exp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/helgrind/tests/getaddrinfo.vgtest b/helgrind/tests/getaddrinfo.vgtest new file mode 100644 index 0000000000..b58c618887 --- /dev/null +++ b/helgrind/tests/getaddrinfo.vgtest @@ -0,0 +1,2 @@ +prog: getaddrinfo +vgopts: -q |
|
From: Paul F. <pj...@wa...> - 2023-04-29 16:22:27
|
On 29-04-23 08:20, Paul Floyd wrote:
>
>
> On 28-04-23 21:33, Carl Love wrote:
>
>> .
>> +->85.79% (72,704B) 0x........: ??? (m_trampoline.S:458)
>> +| ->85.79% (72,704B) 0x........: call_init (dl-init.c:70)
>
> The should be filtered by
>
> vgopts: --ignore-fn=call_init
>
> I need to do some debugging to see what is happening - I can reproduce
> the error on one of the gccfarm machines.
I see what is happening now. The stack in question is
==2756940== at 0x48A4C8C: malloc (vg_replace_malloc.c:431)
==2756940== by 0x58025633: ??? (m_trampoline.S:458)
==2756940== by 0x4007D17: call_init (dl-init.c:70)
==2756940== by 0x4007D17: _dl_init (dl-init.c:117)
==2756940== by 0x40311E7: _dl_start_user (in
/usr/lib/powerpc64-linux-gnu/ld64.so.1)
Note the identical addresses for call_init and _dl_init. I believe that
means that call_init is inlined.
This bit of code in ms_main.c skips over call_init
// top has no fnname => search for the first entry that has a fnname
for (i = *top; i < n_ips && !top_has_fnname; i++) {
top_has_fnname = VG_(get_fnname)(ep, ips[i], &fnname);
}
The workaround is to add _dl_init to the ignore functions.
Otherwise I think that the above loop needs to be modified to use
VG_(next_IIPC)(InlIPCursor *iipc)
I've created a bugzilla item for this
https://bugs.kde.org/show_bug.cgi?id=469146
A+
Paul
|
|
From: Paul F. <pj...@wa...> - 2023-04-29 06:20:22
|
On 28-04-23 21:33, Carl Love wrote: > . > +->85.79% (72,704B) 0x........: ??? (m_trampoline.S:458) > +| ->85.79% (72,704B) 0x........: call_init (dl-init.c:70) The should be filtered by vgopts: --ignore-fn=call_init I need to do some debugging to see what is happening - I can reproduce the error on one of the gccfarm machines. A+ Paul |
|
From: Mark W. <ma...@kl...> - 2023-04-29 00:15:24
|
We are pleased to announce a new release of Valgrind, version 3.21.0, available from https://valgrind.org/downloads/current.html. See the release notes below for details of changes. Our thanks to all those who contribute to Valgrind's development. This release represents a great deal of time, energy and effort on the part of many people. Happy and productive debugging and profiling, -- The Valgrind Developers ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This release supports X86/Linux, AMD64/Linux, ARM32/Linux, ARM64/Linux, PPC32/Linux, PPC64BE/Linux, PPC64LE/Linux, S390X/Linux, MIPS32/Linux, MIPS64/Linux, ARM/Android, ARM64/Android, MIPS32/Android, X86/Android, X86/Solaris, AMD64/Solaris, AMD64/MacOSX 10.12, X86/FreeBSD and AMD64/FreeBSD. There is also preliminary support for X86/macOS 10.13, AMD64/macOS 10.13 and nanoMIPS/Linux. * ==================== CORE CHANGES =================== * When GDB is used to debug a program running under valgrind using the valgrind gdbserver, GDB will automatically load some python code provided in valgrind defining GDB front end commands corresponding to the valgrind monitor commands. These GDB front end commands accept the same format as the monitor commands directly sent to the Valgrind gdbserver. These GDB front end commands provide a better integration in the GDB command line interface, so as to use for example GDB auto-completion, command specific help, searching for a command or command help matching a regexp, ... For relevant monitor commands, GDB will evaluate arguments to make the use of monitor commands easier. For example, instead of having to print the address of a variable to pass it to a subsequent monitor command, the GDB front end command will evaluate the address argument. It is for example possible to do: (gdb) memcheck who_points_at &some_struct sizeof(some_struct) instead of: (gdb) p &some_struct $2 = (some_struct_type *) 0x1130a0 <some_struct> (gdb) p sizeof(some_struct) $3 = 40 (gdb) monitor who_point_at 0x1130a0 40 * The vgdb utility now supports extended-remote protocol when invoked with --multi. In this mode the GDB run command is supported. Which means you don't need to run gdb and valgrind from different terminals. So for example to start your program in gdb and run it under valgrind you can do: $ gdb prog (gdb) set remote exec-file prog (gdb) set sysroot / (gdb) target extended-remote | vgdb --multi (gdb) start * The behaviour of realloc with a size of zero can now be changed for tools that intercept malloc. Those tools are memcheck, helgrind, drd, massif and dhat. Realloc implementations generally do one of two things - free the memory like free() and return NULL (GNU libc and ptmalloc). - either free the memory and then allocate a minimum sized block or just return the original pointer. Return NULL if the allocation of the minimum sized block fails (jemalloc, musl, snmalloc, Solaris, macOS). When Valgrind is configured and built it will try to match the OS and libc behaviour. However if you are using a non-default library to replace malloc and family (e.g., musl on a glibc Linux or tcmalloc on FreeBSD) then you can use a command line option to change the behaviour of Valgrind: --realloc-zero-bytes-frees=yes|no [yes on Linux glibc, no otherwise] * ================== PLATFORM CHANGES ================= * Make the address space limit on FreeBSD amd64 128Gbytes (the same as Linux and Solaris, it was 32Gbytes) * ==================== TOOL CHANGES =================== * Memcheck: - When doing a delta leak_search, it is now possible to only output the new loss records compared to the previous leak search. This is available in the memcheck monitor command 'leak_search' by specifying the "new" keyword or in your program by using the client request VALGRIND_DO_NEW_LEAK_CHECK. Whenever a "delta" leak search is done (i.e. when specifying "new" or "increased" or "changed" in the monitor command), the new loss records have a "new" marker. - Valgrind now contains python code that defines GDB memcheck front end monitor commands. See CORE CHANGES. - Performs checks for the use of realloc with a size of zero. This is non-portable and a source of errors. If memcheck detects such a usage it will generate an error realloc() with size 0 followed by the usual callstacks. A switch has been added to allow this to be turned off: --show-realloc-size-zero=yes|no [yes] * Helgrind: - The option ---history-backtrace-size=<number> allows to configure the number of entries to record in the stack traces of "old" accesses. Previously, this number was hardcoded to 8. - Valgrind now contains python code that defines GDB helgrind front end monitor commands. See CORE CHANGES. * Cachegrind: - `--cache-sim=no` is now the default. The cache simulation is old and unlikely to match any real modern machine. This means only the `Ir` event are gathered by default, but that is by far the most useful event. - `cg_annotate`, `cg_diff`, and `cg_merge` have been rewritten in Python. As a result, they all have more flexible command line argument handling, e.g. supporting `--show-percs` and `--no-show-percs` forms as well as the existing `--show-percs=yes` and `--show-percs=no`. - `cg_annotate` has some functional changes. - It's much faster, e.g. 3-4x on common cases. - It now supports diffing (with `--diff`, `--mod-filename`, and `--mod-funcname`) and merging (by passing multiple data files). - It now provides more information at the file and function level. There are now "File:function" and "Function:file" sections. These are very useful for programs that use inlining a lot. - Support for user-annotated files and the `-I`/`--include` option has been removed, because it was of little use and blocked other improvements. - The `--auto` option is renamed `--annotate`, though the old `--auto=yes`/`--auto=no` forms are still supported. - `cg_diff` and `cg_merge` are now deprecated, because `cg_annotate` now does a better job of diffing and merging. - The Cachegrind output file format has changed very slightly, but in ways nobody is likely to notice. * Callgrind: - Valgrind now contains python code that defines GDB callgrind front end monitor commands. See CORE CHANGES. * Massif: - Valgrind now contains python code that defines GDB massif front end monitor commands. See CORE CHANGES. * DHAT: - A new kind of user request has been added which allows you to override the 1024 byte limit on access count histograms for blocks of memory. The client request is DHAT_HISTOGRAM_MEMORY. * ==================== FIXED BUGS ==================== The following bugs have been fixed or resolved. Note that "n-i-bz" stands for "not in bugzilla" -- that is, a bug that was reported to us but never got a bugzilla entry. We encourage you to file bugs in bugzilla (https://bugs.kde.org/enter_bug.cgi?product=valgrind) rather than mailing the developers (or mailing lists) directly -- bugs that are not entered into bugzilla tend to get forgotten about or ignored. 170510 Don't warn about ioctl of size 0 without direction hint 241072 List tools in --help output 327548 false positive while destroying mutex 382034 Testcases build fixes for musl 351857 confusing error message about valid command line option 374596 inconsistent RDTSCP support on x86_64 392331 Spurious lock not held error from inside pthread_cond_timedwait 397083 Likely false positive "uninitialised value(s)" for __wmemchr_avx2 and __wmemcmp_avx2_movbe 400793 pthread_rwlock_timedwrlock false positive 419054 Unhandled syscall getcpu on arm32 433873 openat2 syscall unimplemented on Linux 434057 Add stdio mode to valgrind's gdbserver 435441 valgrind fails to interpose malloc on musl 1.2.2 due to weak symbol name and no libc soname 436413 Warn about realloc of size zero 439685 compiler warning in callgrind/main.c 444110 priv/guest_ppc_toIR.c:36198:31: warning: duplicated 'if' condition. 444487 hginfo test detects an extra lock inside data symbol "_rtld_local" 444488 Use glibc.pthread.stack_cache_size tunable 444568 drd/tests/pth_barrier_thr_cr fails on Fedora 38 445743 "The impossible happened: mutex is locked simultaneously by two threads" while using mutexes with priority inheritance and signals 449309 Missing loopback device ioctl(s) 459476 vgdb: allow address reuse to avoid "address already in use" errorsuse" errors 460356 s390: Sqrt32Fx4 -- cannot reduce tree 462830 WARNING: unhandled amd64-freebsd syscall: 474 463027 broken check for MPX instruction support in assembler 464103 Enhancement: add a client request to DHAT to mark memory to be histogrammed 464476 Firefox fails to start under Valgrind 464609 Valgrind memcheck should support Linux pidfd_open 464680 Show issues caused by memory policies like selinux deny_execmem 464859 Build failures with GCC-13 (drd tsan_unittest) 464969 D language demangling 465435 m_libcfile.c:66 (vgPlain_safe_fd): Assertion 'newfd >= VG_(fd_hard_limit)' failed. 466104 aligned_alloc problems, part 1 467036 Add time cost statistics for Regtest 467482 Build failure on aarch64 Alpine 467714 fdleak_* and rlimit tests fail when parent process has more than 64 descriptors opened 467839 Gdbserver: Improve compatibility of library directory name 468401 [PATCH] Add a style file for clang-format 468556 Build failure for vgdb 468606 build: remove "Valgrind relies on GCC" check/output 469097 ppc64(be) doesn't support SCV syscall instruction n-i-bz FreeBSD rfork syscall fail with EINVAL or ENOSYS rather than VG_(unimplemented) To see details of a given bug, visit https://bugs.kde.org/show_bug.cgi?id=XXXXXX where XXXXXX is the bug number as listed above. * ==================== KNOWN ISSUES =================== * configure --enable-lto=yes is know to not work in all setups. See bug 469049. Workaround: Build without LTO. |
|
From: Carl L. <ce...@us...> - 2023-04-28 19:57:10
|
On Fri, 2023-04-28 at 20:30 +0200, Paul Floyd wrote:
>
> On 28-04-23 18:04, Carl Love wrote:
>
> > I don't see any explicit "post" errors printed? So I am clearly
> > missing something. :-)
> >
>
< snip >
> Unfortunately the pesky libc and libstdc++ can get in the way and do
> other, system dependent allocations. These allocations are for stuff
> like exception handlers and dynamic loading.
>
> The --ignore-fn options are supposed to filter out all those extras,
> leaving us with only the calls to operator new and delete.
>
> I thought that you might have a different function on power 10. But
> looking at the diff from what you posted I only see
>
> 47c42
> < ->33.24% (4,000B) 0x........: main (new-cpp.cpp:20)
> ---
> > ->33.24% (4,000B) 0x........: main (new-cpp.cpp:20)
>
> That's an extra trailing whitespace.
>
> Could you post the post.diff files, if they aren't too big?
OK, not too big. Here is the diff.
--- new-cpp.post.exp 2023-04-21 20:54:40.000000000 -0400
+++ new-cpp.post.out 2023-04-24 16:29:56.907990371 -0400
@@ -6,54 +6,61 @@
KB
-11.75^ ###########
- | #
- | #
- | #
- | :::::::#
- | : #
- | : #
- | ::::::: # ::::::::::::
- | : : # :
- | : : # :
- | : : # :
- | : : # :
- | : : # :
- | : : # :
- | ::::::::::::: : # : ::::::
- | : : : # : :
- | : : : # : :
- | : : : # : : ::::::
- | : : : # : : :
- | : : : # : : :
+82.76^ #
+ | ::#::
+ | ::::#: :
+ | ::: ::#: ::::::::::::::::::::::::::::::::
+ | : : ::#: :::
+ | : : ::#: :::
+ | : : ::#: :::
+ | : : ::#: :::
+ | : : ::#: :::
+ | : : ::#: :::
+ | : : ::#: :::
+ | : : ::#: :::
+ | : : ::#: :::
+ | : : ::#: :::
+ | : : ::#: :::
+ | : : ::#: :::
+ | : : ::#: :::
+ | : : ::#: :::
+ | : : ::#: :::
+ | : : ::#: :::
0 +----------------------------------------------------------------------->K
B
- 0 23.50
+ 0 165.5
-Number of snapshots: 10
- Detailed snapshots: [5 (peak)]
+Number of snapshots: 12
+ Detailed snapshots: [6 (peak)]
-------------------------------------------------------------------------------
-
n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B)
-------------------------------------------------------------------------------
-
0 0 0 0 0 0
- 1 4,008 4,008 4,000 8 0
- 2 8,016 8,016 8,000 16 0
- 3 10,024 10,024 10,000 24 0
- 4 12,032 12,032 12,000 32 0
- 5 12,032 12,032 12,000 32 0
-99.73% (12,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc
.
-->33.24% (4,000B) 0x........: main (new-cpp.cpp:19)
+ 1 72,712 72,712 72,704 8 0
+ 2 76,720 76,720 76,704 16 0
+ 3 80,728 80,728 80,704 24 0
+ 4 82,736 82,736 82,704 32 0
+ 5 84,744 84,744 84,704 40 0
+ 6 84,744 84,744 84,704 40 0
+99.95% (84,704B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc
.
+->85.79% (72,704B) 0x........: ??? (m_trampoline.S:458)
+| ->85.79% (72,704B) 0x........: call_init (dl-init.c:70)
+| ->85.79% (72,704B) 0x........: _dl_init (dl-init.c:117)
+| ->85.79% (72,704B) 0x........: _dl_start_user (in /usr/lib64/ld64.so.2)
+|
+->04.72% (4,000B) 0x........: main (new-cpp.cpp:19)
|
-->33.24% (4,000B) 0x........: main (new-cpp.cpp:20)
+->04.72% (4,000B) 0x........: main (new-cpp.cpp:20)
|
-->16.62% (2,000B) 0x........: main (new-cpp.cpp:21)
+->02.36% (2,000B) 0x........: main (new-cpp.cpp:21)
|
-->16.62% (2,000B) 0x........: main (new-cpp.cpp:22)
+->02.36% (2,000B) 0x........: main (new-cpp.cpp:22)
-------------------------------------------------------------------------------
-
n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B)
-------------------------------------------------------------------------------
-
- 6 16,040 8,024 8,000 24 0
- 7 20,048 4,016 4,000 16 0
- 8 22,056 2,008 2,000 8 0
- 9 24,064 0 0 0 0
+ 7 88,752 80,736 80,704 32 0
+ 8 92,760 76,728 76,704 24 0
+ 9 94,768 74,720 74,704 16 0
+ 10 96,776 72,712 72,704 8 0
+ 11 169,488 0 0 0 0
|
|
From: Paul F. <pj...@wa...> - 2023-04-28 18:31:10
|
On 28-04-23 18:04, Carl Love wrote:
> I don't see any explicit "post" errors printed? So I am clearly
> missing something. :-)
>
> I am hoping you can give me a hint here as I am not seeing where the
> issue with the test is. Thanks.
Hi Carl
The test is supposed to be profiling calls to new. That should turn
s* p1 = new s;
s* p2 = new (std::nothrow) s;
char* c1 = new char[2000];
char* c2 = new (std::nothrow) char[2000];
into
KB
11.75^ ###########
| #
| #
| #
| :::::::#
| : #
| : #
| ::::::: # ::::::::::::
| : : # :
| : : # :
| : : # :
| : : # :
| : : # :
| : : # :
| ::::::::::::: : # : ::::::
| : : : # : :
| : : : # : :
| : : : # : : :
| : : : # : : :
| : : : # : : :
0
+----------------------------------------------------------------------->KB
0
23.50
Unfortunately the pesky libc and libstdc++ can get in the way and do
other, system dependent allocations. These allocations are for stuff
like exception handlers and dynamic loading.
The --ignore-fn options are supposed to filter out all those extras,
leaving us with only the calls to operator new and delete.
I thought that you might have a different function on power 10. But
looking at the diff from what you posted I only see
47c42
< ->33.24% (4,000B) 0x........: main (new-cpp.cpp:20)
---
> ->33.24% (4,000B) 0x........: main (new-cpp.cpp:20)
That's an extra trailing whitespace.
Could you post the post.diff files, if they aren't too big?
A+
Paul
|
|
From: Carl L. <ce...@us...> - 2023-04-28 17:42:13
|
Paul:
On Thu, 2023-04-27 at 22:01 +0200, Paul Floyd wrote:
> On 24/04/2023 23:29, Carl Love via Valgrind-developers wrote:
> > == 714 tests, 2 stderr failures, 0 stdout failures, 0 stderrB
> > failures,
> > 0 stdoutB failures, 2 post failures ==
> > massif/tests/new-cpp (post)
> > massif/tests/overloaded-new (post)
> >
> And these two might be easy to fix if you run the testcase normally
> and
> see if you can identify the extra allocating functions and add them
> to
> the vgtest files in the --ignore-fn list.
So, just playing around with this to try and understand what causes the
post failures.
Looking at the new-cpp.vgtest file and the output from running regtes,
It looks like the test is run with the command (edited a little to make
it readable):
valgrind --tool=massif --stacks=no --time-unit=B --massif-out-file=massif.out
--ignore-fn=__part_load_locale --ignore-fn=__time_load_locale
--ignore-fn=dwarf2_unwind_dyld_add_image_hook --ignore-fn=get_or_create_key_element
--ignore-fn=_GLOBAL__sub_I_eh_alloc.cc --ignore-fn=call_init.part.0
--ignore-fn=call_init ./new-cpp
The command line output is:
==789558== Massif, a heap profiler
==789558== Copyright (C) 2003-2017, and GNU GPL'd, by Nicholas Nethercote
==789558== Using Valgrind-3.21.0.RC2 and LibVEX; rerun with -h for copyright info
==789558== Command: ./new-cpp
==789558==
==789558==
The contents of the output file massif.out is:
time_unit: B
#-----------
snapshot=0
#-----------
time=0
mem_heap_B=0
mem_heap_extra_B=0
mem_stacks_B=0
heap_tree=empty
#-----------
snapshot=1
#-----------
time=4008
mem_heap_B=4000
mem_heap_extra_B=8
mem_stacks_B=0
heap_tree=empty
#-----------
snapshot=2
#-----------
time=8016
mem_heap_B=8000
mem_heap_extra_B=16
mem_stacks_B=0
heap_tree=empty
#-----------
snapshot=3
#-----------
time=10024
mem_heap_B=10000
mem_heap_extra_B=24
mem_stacks_B=0
heap_tree=empty
#-----------
snapshot=4
#-----------
time=12032
mem_heap_B=12000
mem_heap_extra_B=32
mem_stacks_B=0
heap_tree=empty
#-----------
snapshot=5
#-----------
time=12032
mem_heap_B=12000
mem_heap_extra_B=32
mem_stacks_B=0
heap_tree=peak
n4: 12000 (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
n0: 4000 0x10000973: main (new-cpp.cpp:19)
n0: 4000 0x1000098F: main (new-cpp.cpp:20)
n0: 2000 0x100009A3: main (new-cpp.cpp:21)
n0: 2000 0x100009BB: main (new-cpp.cpp:22)
#-----------
snapshot=6
#-----------
time=16040
mem_heap_B=8000
mem_heap_extra_B=24
mem_stacks_B=0
heap_tree=empty
#-----------
snapshot=7
#-----------
time=20048
mem_heap_B=4000
mem_heap_extra_B=16
mem_stacks_B=0
heap_tree=empty
#-----------
snapshot=8
#-----------
time=22056
mem_heap_B=2000
mem_heap_extra_B=8
mem_stacks_B=0
heap_tree=empty
#-----------
snapshot=9
#-----------
time=24064
mem_heap_B=0
mem_heap_extra_B=0
mem_stacks_B=0
heap_tree=empty
I then ran the perl script:
perl ../../massif/ms_print massif.out | sed 's/gcc[0-9]*/gcc/' | ../../tests/filter_addresses
KB
11.75^ ###########
| #
| #
| #
| :::::::#
| : #
| : #
| ::::::: # ::::::::::::
| : : # :
| : : # :
| : : # :
| : : # :
| : : # :
| : : # :
| ::::::::::::: : # : ::::::
| : : : # : :
| : : : # : :
| : : : # : : ::::::
| : : : # : : :
| : : : # : : :
0 +----------------------------------------------------------------------->KB
0 23.50
Number of snapshots: 10
Detailed snapshots: [5 (peak)]
--------------------------------------------------------------------------------
n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B)
--------------------------------------------------------------------------------
0 0 0 0 0 0
1 4,008 4,008 4,000 8 0
2 8,016 8,016 8,000 16 0
3 10,024 10,024 10,000 24 0
4 12,032 12,032 12,000 32 0
5 12,032 12,032 12,000 32 0
99.73% (12,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->33.24% (4,000B) 0x........: main (new-cpp.cpp:19)
|
->33.24% (4,000B) 0x........: main (new-cpp.cpp:20)
|
->16.62% (2,000B) 0x........: main (new-cpp.cpp:21)
|
->16.62% (2,000B) 0x........: main (new-cpp.cpp:22)
--------------------------------------------------------------------------------
n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B)
--------------------------------------------------------------------------------
6 16,040 8,024 8,000 24 0
7 20,048 4,016 4,000 16 0
8 22,056 2,008 2,000 8 0
9 24,064 0 0 0 0
I don't see any explicit "post" errors printed? So I am clearly
missing something. :-)
I am hoping you can give me a hint here as I am not seeing where the
issue with the test is. Thanks.
Carl
|