gdb.trace: Fix string collection for 64-bit platforms.
authorMarcin Kościelnicki <koriakin@0x04.net>
Thu, 21 Jan 2016 15:58:12 +0000 (16:58 +0100)
committerMarcin Kościelnicki <koriakin@0x04.net>
Thu, 21 Jan 2016 16:36:27 +0000 (17:36 +0100)
String collection always used ref32 to fetch the string pointer.  Make it
use gen_fetch instead.

As a side effect, this patch changes dup+const+trace+pop sequence used
for collecting the string's address to a trace_quick opcode.  This
results in a shorter agent expression.

This appeared to work on x86_64 since it's a little-endian platform, and
malloc (used in gdb.trace/collection.exp) returns addresses in low 4GB.
Noticed and tested on s390x-ibm-linux-gnu, also tested on
i686-unknown-linux-gnu and x86_64-unknown-linux-gnu.

gdb/ChangeLog:

* ax-gdb.c (gen_traced_pop): Use gen_fetch for string collection.

gdb/ChangeLog
gdb/ax-gdb.c

index 45d8ef9..28173b0 100644 (file)
@@ -1,3 +1,7 @@
+2016-01-21  Marcin Kościelnicki  <koriakin@0x04.net>
+
+       * ax-gdb.c (gen_traced_pop): Use gen_fetch for string collection.
+
 2016-01-21  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * disasm.c (maybe_add_dis_line_entry): Rename to...
index dd6eee6..7c6cb64 100644 (file)
@@ -394,26 +394,25 @@ gen_traced_pop (struct gdbarch *gdbarch,
 
       case axs_lvalue_memory:
        {
-         if (string_trace)
-           ax_simple (ax, aop_dup);
-
          /* Initialize the TYPE_LENGTH if it is a typedef.  */
          check_typedef (value->type);
 
-         /* There's no point in trying to use a trace_quick bytecode
-            here, since "trace_quick SIZE pop" is three bytes, whereas
-            "const8 SIZE trace" is also three bytes, does the same
-            thing, and the simplest code which generates that will also
-            work correctly for objects with large sizes.  */
-         ax_const_l (ax, TYPE_LENGTH (value->type));
-         ax_simple (ax, aop_trace);
-
          if (string_trace)
            {
-             ax_simple (ax, aop_ref32);
+             gen_fetch (ax, value->type);
              ax_const_l (ax, ax->trace_string);
              ax_simple (ax, aop_tracenz);
            }
+         else
+           {
+             /* There's no point in trying to use a trace_quick bytecode
+                here, since "trace_quick SIZE pop" is three bytes, whereas
+                "const8 SIZE trace" is also three bytes, does the same
+                thing, and the simplest code which generates that will also
+                work correctly for objects with large sizes.  */
+             ax_const_l (ax, TYPE_LENGTH (value->type));
+             ax_simple (ax, aop_trace);
+           }
        }
        break;