Re: [PATCH 2/2] gdb: Change a VEC to std::vector in btrace.{c,h}

Simon Marchi
2019-09-24T02:19:59Z

On 2019-09-23 6:09 p.m., Andrew Burgess wrote:
> Replace a VEC with a std::vector in btrace.h, and update btrace.c to
> match. This code is currently untested, so I've been quite
> conservative with the changes - where previously we used VEC_safe_push
> which would allocate the vector if it isn't already allocated - I now
> check and allocate the std::vector using 'new' before pushing to the
> vector.
>
> As the new vector is inside a union I've currently used a pointer to
> vector, which makes the code slightly uglier than it might otherwise
> be, but again, due to lack of testing I'm reluctant to start
> refactoring the code in a big way.

Hi Andrew,

Looks fine to me, just a few nits:

> diff --git a/gdb/btrace.c b/gdb/btrace.c
> index 5013b568a45..59e2a49bcd8 100644
> --- a/gdb/btrace.c
> +++ b/gdb/btrace.c
> @@ -1828,7 +1828,7 @@ btrace_maint_clear (struct btrace_thread_info *btinfo)
>
> #if defined (HAVE_LIBIPT)
> case BTRACE_FORMAT_PT:
> - xfree (btinfo->maint.variant.pt.packets);
> + delete (btinfo->maint.variant.pt.packets);

You can remove the parenthesis.

>
> btinfo->maint.variant.pt.packets = NULL;
> btinfo->maint.variant.pt.packet_history.begin = 0;
> @@ -2987,8 +2987,10 @@ btrace_maint_decode_pt (struct btrace_maint_info *maint,
> if (maint_btrace_pt_skip_pad == 0 || packet.packet.type != ppt_pad)
> {
> packet.errcode = pt_errcode (errcode);
> - VEC_safe_push (btrace_pt_packet_s, maint->variant.pt.packets,
> - &packet);
> + if (maint->variant.pt.packets == NULL)
> + maint->variant.pt.packets
> + = new std::vector <btrace_pt_packet_s>;

This will fit on a single line once you remove the `_s` :).

> --- a/gdb/btrace.h
> +++ b/gdb/btrace.h
> @@ -29,7 +29,6 @@
> #include "gdbsupport/btrace-common.h"
> #include "target/waitstatus.h" /* For enum target_stop_reason. */
> #include "gdbsupport/enum-flags.h"
> -#include "gdbsupport/vec.h"
>
> #if defined (HAVE_LIBIPT)
> # include <intel-pt.h>
> @@ -267,7 +266,6 @@ struct btrace_pt_packet
>
> /* Define functions operating on a vector of packets. */
> typedef struct btrace_pt_packet btrace_pt_packet_s;
> -DEF_VEC_O (btrace_pt_packet_s);

Like in the previous patch, you can drop this typedef. It was only useful to define the VEC.

Simon