Remove --vex-iropt-precise-memory-exns, implement --vex-iropt-register-updates
* Option --vex-iropt-precise-memory-exns has been removed.
It is replaced by --vex-iropt-register-updates which accepts
3 values : 'unwindregs-at-mem-access' (replacing
--vex-iropt-precise-memory-exns=no), 'allregs-at-mem-access'
(replacing --vex-iropt-precise-memory-exns=yes)
and a new value 'allregs-at-each-insn'.
'allregs-at-each-insn' allows the Valgrind gdbserver to always
show up to date values to GDB.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12809 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/NEWS b/NEWS
index ad79d6e..4df34f4 100644
--- a/NEWS
+++ b/NEWS
@@ -88,6 +88,15 @@
* Improved DWARF4 support (284124)
+* Option --vex-iropt-precise-memory-exns has been removed.
+ It is replaced by --vex-iropt-register-updates which accepts
+ 3 values : 'unwindregs-at-mem-access' (replacing
+ --vex-iropt-precise-memory-exns=no), 'allregs-at-mem-access'
+ (replacing --vex-iropt-precise-memory-exns=yes)
+ and a new value 'allregs-at-each-insn'.
+ 'allregs-at-each-insn' allows the Valgrind gdbserver to always
+ show up to date values to GDB.
+
* ==================== FIXED BUGS ====================
The following bugs have been fixed or resolved. Note that "n-i-bz"
diff --git a/coregrind/m_main.c b/coregrind/m_main.c
index 7229bf2..3d7fc1c 100644
--- a/coregrind/m_main.c
+++ b/coregrind/m_main.c
@@ -228,7 +228,9 @@
" Vex options for all Valgrind tools:\n"
" --vex-iropt-verbosity=<0..9> [0]\n"
" --vex-iropt-level=<0..2> [2]\n"
-" --vex-iropt-precise-memory-exns=no|yes [no]\n"
+" --vex-iropt-register-updates=unwindregs-at-mem-access\n"
+" |allregs-at-mem-access\n"
+" |allregs-at-each-insn [unwindregs-at-mem-access]\n"
" --vex-iropt-unroll-thresh=<0..400> [120]\n"
" --vex-guest-max-insns=<1..100> [50]\n"
" --vex-guest-chase-thresh=<0..99> [10]\n"
@@ -488,6 +490,21 @@
else if VG_STREQN(14, arg, "--core-redzone-size") {}
else if VG_STREQN(14, arg, "--redzone-size") {}
+ /* Obsolete options. Report an error and exit */
+ else if VG_STREQN(34, arg, "--vex-iropt-precise-memory-exns=no") {
+ VG_(fmsg_bad_option)
+ (arg,
+ "--vex-iropt-precise-memory-exns is obsolete\n"
+ "Use --vex-iropt-register-updates=unwindregs-at-mem-access instead\n");
+ }
+ else if VG_STREQN(35, arg, "--vex-iropt-precise-memory-exns=yes") {
+ VG_(fmsg_bad_option)
+ (arg,
+ "--vex-iropt-precise-memory-exns is obsolete\n"
+ "Use --vex-iropt-register-updates=allregs-at-mem-access instead\n"
+ " (or --vex-iropt-register-updates=allregs-at-each-insn)\n");
+ }
+
// These options are new.
else if (VG_STREQ(arg, "-v") ||
VG_STREQ(arg, "--verbose"))
@@ -503,7 +520,12 @@
else if VG_XACT_CLO(arg, "--vgdb=no", VG_(clo_vgdb), Vg_VgdbNo) {}
else if VG_XACT_CLO(arg, "--vgdb=yes", VG_(clo_vgdb), Vg_VgdbYes) {}
- else if VG_XACT_CLO(arg, "--vgdb=full", VG_(clo_vgdb), Vg_VgdbFull) {}
+ else if VG_XACT_CLO(arg, "--vgdb=full", VG_(clo_vgdb), Vg_VgdbFull) {
+ /* automatically updates register values at each insn
+ with --vgdb=full */
+ VG_(clo_vex_control).iropt_register_updates
+ = VexRegUpdAllregsAtEachInsn;
+ }
else if VG_INT_CLO (arg, "--vgdb-poll", VG_(clo_vgdb_poll)) {}
else if VG_INT_CLO (arg, "--vgdb-error", VG_(clo_vgdb_error)) {}
else if VG_STR_CLO (arg, "--vgdb-prefix", VG_(clo_vgdb_prefix)) {}
@@ -582,8 +604,18 @@
VG_(clo_vex_control).iropt_verbosity, 0, 10) {}
else if VG_BINT_CLO(arg, "--vex-iropt-level",
VG_(clo_vex_control).iropt_level, 0, 2) {}
- else if VG_BOOL_CLO(arg, "--vex-iropt-precise-memory-exns",
- VG_(clo_vex_control).iropt_precise_memory_exns) {}
+ else if VG_XACT_CLO(arg,
+ "--vex-iropt-register-updates=unwindregs-at-mem-access",
+ VG_(clo_vex_control).iropt_register_updates,
+ VexRegUpdUnwindregsAtMemAccess);
+ else if VG_XACT_CLO(arg,
+ "--vex-iropt-register-updates=allregs-at-mem-access",
+ VG_(clo_vex_control).iropt_register_updates,
+ VexRegUpdAllregsAtMemAccess);
+ else if VG_XACT_CLO(arg,
+ "--vex-iropt-register-updates=allregs-at-each-insn",
+ VG_(clo_vex_control).iropt_register_updates,
+ VexRegUpdAllregsAtEachInsn);
else if VG_BINT_CLO(arg, "--vex-iropt-unroll-thresh",
VG_(clo_vex_control).iropt_unroll_thresh, 0, 400) {}
else if VG_BINT_CLO(arg, "--vex-guest-max-insns",
diff --git a/docs/xml/manual-core-adv.xml b/docs/xml/manual-core-adv.xml
index b7e83b3..d3c43e8 100644
--- a/docs/xml/manual-core-adv.xml
+++ b/docs/xml/manual-core-adv.xml
@@ -788,21 +788,28 @@
<para>When Valgrind gdbserver stops on an error, on a breakpoint
or when single stepping, registers and flags values might not be always
up to date due to the optimisations done by the Valgrind core.
- Disabling some optimisations using the following options will increase
+ The default value
+ <option>--vex-iropt-register-updates=unwindregs-at-mem-access</option>
+ ensures that the registers needed to make a stack trace (typically
+ PC/SP/FP) are up to date at each memory access (i.e. memory exception
+ points).
+ Disabling some optimisations using the following values will increase
the precision of registers and flags values (a typical performance
impact for memcheck is given for each option).
<itemizedlist>
<listitem>
- <option>--vex-iropt-precise-memory-exns=yes</option> (+5%) ensures
- that all integer registers are up to date at each memory access.
+ <option>--vex-iropt-register-updates=allregs-at-mem-access</option> (+10%)
+ ensures that all registers and flags are up to date at each memory
+ access.
</listitem>
<listitem>
- <option>--vex-guest-max-insns=1</option> (+100%) ensures that
- all registers and flags values are up to date at each instruction.
+ <option>--vex-iropt-register-updates=allregs-at-each-insn</option> (+25%)
+ ensures that all registers and flags are up to date at each instruction.
</listitem>
</itemizedlist>
- Note that the above options can be combined with <option>--vgdb=full</option>
- (+500%, see above Precision of "stop-at" commands).
+ Note that <option>--vgdb=full</option> (+500%, see above
+ Precision of "stop-at" commands) automatically
+ activates <option>--vex-iropt-register-updates=allregs-at-each-insn</option>.
</para>
</listitem>
@@ -898,7 +905,8 @@
<para>On PPC32/PPC64, stack unwinding for leaf functions
(functions that do not call any other functions) works properly
only when you give the option
- <option>--vex-iropt-precise-memory-exns=yes</option>.
+ <option>--vex-iropt-register-updates=allregs-at-mem-access</option>
+ or <option>--vex-iropt-register-updates=allregs-at-each-insn</option>.
You must also pass this option in order to get a precise stack when
a signal is trapped by GDB.
</para>
diff --git a/docs/xml/manual-core.xml b/docs/xml/manual-core.xml
index f9da843..fe11c17 100644
--- a/docs/xml/manual-core.xml
+++ b/docs/xml/manual-core.xml
@@ -2074,7 +2074,8 @@
<para>If you're using signals in clever ways (for example, catching
SIGSEGV, modifying page state and restarting the instruction), you're
probably relying on precise exceptions. In this case, you will need
-to use <option>--vex-iropt-precise-memory-exns=yes</option>.
+to use <option>--vex-iropt-register-updates=allregs-at-mem-access</option>
+or <option>--vex-iropt-register-updates=allregs-at-each-insn</option>.
</para>
<para>If your program dies as a result of a fatal core-dumping signal,
diff --git a/gdbserver_tests/mcsignopass.vgtest b/gdbserver_tests/mcsignopass.vgtest
index 32d1697..61992aa 100644
--- a/gdbserver_tests/mcsignopass.vgtest
+++ b/gdbserver_tests/mcsignopass.vgtest
@@ -6,7 +6,7 @@
# are eventually passed.
prereq: test -e gdb
prog: ../none/tests/faultstatus
-vgopts: --tool=memcheck --vgdb=full --vex-iropt-precise-memory-exns=yes --vgdb-error=0 --vgdb-prefix=./vgdb-prefix-mcsignopass
+vgopts: --tool=memcheck --vgdb=full --vex-iropt-register-updates=allregs-at-mem-access --vgdb-error=0 --vgdb-prefix=./vgdb-prefix-mcsignopass
stderr_filter: filter_memcheck_monitor
stderr_filter_args: faultstatus.c
progB: gdb
diff --git a/gdbserver_tests/mcsigpass.vgtest b/gdbserver_tests/mcsigpass.vgtest
index c23845b..20f7864 100644
--- a/gdbserver_tests/mcsigpass.vgtest
+++ b/gdbserver_tests/mcsigpass.vgtest
@@ -1,7 +1,7 @@
# test the signal handling, when signals are passed to the Valgrind guest.
prereq: test -e gdb
prog: ../none/tests/faultstatus
-vgopts: --tool=memcheck --vgdb=full --vex-iropt-precise-memory-exns=yes --vgdb-error=0 --vgdb-prefix=./vgdb-prefix-mcsigpass
+vgopts: --tool=memcheck --vgdb=full --vex-iropt-register-updates=allregs-at-mem-access --vgdb-error=0 --vgdb-prefix=./vgdb-prefix-mcsigpass
stderr_filter: filter_memcheck_monitor
stderr_filter_args: faultstatus.c
progB: gdb
diff --git a/none/tests/cmdline2.stdout.exp b/none/tests/cmdline2.stdout.exp
index 72184a8..0caaba4 100644
--- a/none/tests/cmdline2.stdout.exp
+++ b/none/tests/cmdline2.stdout.exp
@@ -117,7 +117,9 @@
Vex options for all Valgrind tools:
--vex-iropt-verbosity=<0..9> [0]
--vex-iropt-level=<0..2> [2]
- --vex-iropt-precise-memory-exns=no|yes [no]
+ --vex-iropt-register-updates=unwindregs-at-mem-access
+ |allregs-at-mem-access
+ |allregs-at-each-insn [unwindregs-at-mem-access]
--vex-iropt-unroll-thresh=<0..400> [120]
--vex-guest-max-insns=<1..100> [50]
--vex-guest-chase-thresh=<0..99> [10]
diff --git a/none/tests/selfrun.vgtest b/none/tests/selfrun.vgtest
index 8db2779..55cc8c9 100644
--- a/none/tests/selfrun.vgtest
+++ b/none/tests/selfrun.vgtest
@@ -1,3 +1,3 @@
prog: ../../coregrind/valgrind --tool=none --command-line-only=yes ./selfrun
-vgopts: --vex-iropt-precise-memory-exns=yes
+vgopts: --vex-iropt-register-updates=allregs-at-mem-access
prereq: grep '^#define HAVE_PIE 1' ../../config.h > /dev/null