gdb: Change a VEC to std::vector in btrace.{c,h}

Replace a VEC with a std::vector in btrace.h, and update btrace.c to
match.  It is worth noting that this code appears to be currently
untested by the GDB testsuite.  I've tried to do a like for like
replacement when moving to std::vector, with minimal refactoring to
try and avoid introducing any bugs.

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.

gdb/ChangeLog:

	* btrace.c (btrace_maint_clear): Update to handle change from VEC
	to std::vector.
	(btrace_maint_decode_pt): Likewise, and move allocation of the
	vector outside of the loop.
	(btrace_maint_update_packets): Update to handle change from VEC to
	std::vector.
	(btrace_maint_print_packets): Likewise.
	(maint_info_btrace_cmd): Likewise.
	* btrace.h: Remove use of DEF_VEC_O.
	(typedef btrace_pt_packet_s): Delete.
	(struct btrace_maint_info) <packets>: Change fromm VEC to
	std::vector.
	* gdbsupport/btrace-common.h: Remove 'vec.h' include.
This commit is contained in:
Andrew Burgess 2019-09-19 13:17:59 -04:00
parent 46f29a9a26
commit 554ac434b0
4 changed files with 38 additions and 25 deletions

View File

@ -1,3 +1,19 @@
2019-10-02 Andrew Burgess <andrew.burgess@embecosm.com>
* btrace.c (btrace_maint_clear): Update to handle change from VEC
to std::vector.
(btrace_maint_decode_pt): Likewise, and move allocation of the
vector outside of the loop.
(btrace_maint_update_packets): Update to handle change from VEC to
std::vector.
(btrace_maint_print_packets): Likewise.
(maint_info_btrace_cmd): Likewise.
* btrace.h: Remove use of DEF_VEC_O.
(typedef btrace_pt_packet_s): Delete.
(struct btrace_maint_info) <packets>: Change fromm VEC to
std::vector.
* gdbsupport/btrace-common.h: Remove 'vec.h' include.
2019-10-02 Andrew Burgess <andrew.burgess@embecosm.com> 2019-10-02 Andrew Burgess <andrew.burgess@embecosm.com>
* btrace.c (btrace_compute_ftrace_bts): Update for std::vector, * btrace.c (btrace_compute_ftrace_bts): Update for std::vector,

View File

@ -1825,7 +1825,7 @@ btrace_maint_clear (struct btrace_thread_info *btinfo)
#if defined (HAVE_LIBIPT) #if defined (HAVE_LIBIPT)
case BTRACE_FORMAT_PT: case BTRACE_FORMAT_PT:
xfree (btinfo->maint.variant.pt.packets); delete btinfo->maint.variant.pt.packets;
btinfo->maint.variant.pt.packets = NULL; btinfo->maint.variant.pt.packets = NULL;
btinfo->maint.variant.pt.packet_history.begin = 0; btinfo->maint.variant.pt.packet_history.begin = 0;
@ -2962,6 +2962,9 @@ btrace_maint_decode_pt (struct btrace_maint_info *maint,
{ {
int errcode; int errcode;
if (maint->variant.pt.packets == NULL)
maint->variant.pt.packets = new std::vector <btrace_pt_packet>;
for (;;) for (;;)
{ {
struct btrace_pt_packet packet; struct btrace_pt_packet packet;
@ -2982,8 +2985,7 @@ btrace_maint_decode_pt (struct btrace_maint_info *maint,
if (maint_btrace_pt_skip_pad == 0 || packet.packet.type != ppt_pad) if (maint_btrace_pt_skip_pad == 0 || packet.packet.type != ppt_pad)
{ {
packet.errcode = pt_errcode (errcode); packet.errcode = pt_errcode (errcode);
VEC_safe_push (btrace_pt_packet_s, maint->variant.pt.packets, maint->variant.pt.packets->push_back (packet);
&packet);
} }
} }
@ -2991,8 +2993,7 @@ btrace_maint_decode_pt (struct btrace_maint_info *maint,
break; break;
packet.errcode = pt_errcode (errcode); packet.errcode = pt_errcode (errcode);
VEC_safe_push (btrace_pt_packet_s, maint->variant.pt.packets, maint->variant.pt.packets->push_back (packet);
&packet);
warning (_("Error at trace offset 0x%" PRIx64 ": %s."), warning (_("Error at trace offset 0x%" PRIx64 ": %s."),
packet.offset, pt_errstr (packet.errcode)); packet.offset, pt_errstr (packet.errcode));
@ -3093,11 +3094,14 @@ btrace_maint_update_packets (struct btrace_thread_info *btinfo,
#if defined (HAVE_LIBIPT) #if defined (HAVE_LIBIPT)
case BTRACE_FORMAT_PT: case BTRACE_FORMAT_PT:
if (VEC_empty (btrace_pt_packet_s, btinfo->maint.variant.pt.packets)) if (btinfo->maint.variant.pt.packets == nullptr)
btinfo->maint.variant.pt.packets = new std::vector <btrace_pt_packet>;
if (btinfo->maint.variant.pt.packets->empty ())
btrace_maint_update_pt_packets (btinfo); btrace_maint_update_pt_packets (btinfo);
*begin = 0; *begin = 0;
*end = VEC_length (btrace_pt_packet_s, btinfo->maint.variant.pt.packets); *end = btinfo->maint.variant.pt.packets->size ();
*from = btinfo->maint.variant.pt.packet_history.begin; *from = btinfo->maint.variant.pt.packet_history.begin;
*to = btinfo->maint.variant.pt.packet_history.end; *to = btinfo->maint.variant.pt.packet_history.end;
break; break;
@ -3140,23 +3144,21 @@ btrace_maint_print_packets (struct btrace_thread_info *btinfo,
#if defined (HAVE_LIBIPT) #if defined (HAVE_LIBIPT)
case BTRACE_FORMAT_PT: case BTRACE_FORMAT_PT:
{ {
VEC (btrace_pt_packet_s) *packets; const std::vector <btrace_pt_packet> &packets
= *btinfo->maint.variant.pt.packets;
unsigned int pkt; unsigned int pkt;
packets = btinfo->maint.variant.pt.packets;
for (pkt = begin; pkt < end; ++pkt) for (pkt = begin; pkt < end; ++pkt)
{ {
const struct btrace_pt_packet *packet; const struct btrace_pt_packet &packet = packets.at (pkt);
packet = VEC_index (btrace_pt_packet_s, packets, pkt);
printf_unfiltered ("%u\t", pkt); printf_unfiltered ("%u\t", pkt);
printf_unfiltered ("0x%" PRIx64 "\t", packet->offset); printf_unfiltered ("0x%" PRIx64 "\t", packet.offset);
if (packet->errcode == pte_ok) if (packet.errcode == pte_ok)
pt_print_packet (&packet->packet); pt_print_packet (&packet.packet);
else else
printf_unfiltered ("[error: %s]", pt_errstr (packet->errcode)); printf_unfiltered ("[error: %s]", pt_errstr (packet.errcode));
printf_unfiltered ("\n"); printf_unfiltered ("\n");
} }
@ -3447,9 +3449,9 @@ maint_info_btrace_cmd (const char *args, int from_tty)
version.ext != NULL ? version.ext : ""); version.ext != NULL ? version.ext : "");
btrace_maint_update_pt_packets (btinfo); btrace_maint_update_pt_packets (btinfo);
printf_unfiltered (_("Number of packets: %u.\n"), printf_unfiltered (_("Number of packets: %zu.\n"),
VEC_length (btrace_pt_packet_s, ((btinfo->maint.variant.pt.packets == nullptr)
btinfo->maint.variant.pt.packets)); ? 0 : btinfo->maint.variant.pt.packets->size ()));
} }
break; break;
#endif /* defined (HAVE_LIBIPT) */ #endif /* defined (HAVE_LIBIPT) */

View File

@ -264,9 +264,6 @@ struct btrace_pt_packet
struct pt_packet packet; struct pt_packet 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);
#endif /* defined (HAVE_LIBIPT) */ #endif /* defined (HAVE_LIBIPT) */
/* Branch trace iteration state for "maintenance btrace packet-history". */ /* Branch trace iteration state for "maintenance btrace packet-history". */
@ -300,7 +297,7 @@ struct btrace_maint_info
struct struct
{ {
/* A vector of decoded packets. */ /* A vector of decoded packets. */
VEC (btrace_pt_packet_s) *packets; std::vector <btrace_pt_packet> *packets;
/* The packet history iterator. /* The packet history iterator.
We are iterating over the above PACKETS vector. */ We are iterating over the above PACKETS vector. */

View File

@ -26,8 +26,6 @@
inferior. For presentation purposes, the branch trace is represented as a inferior. For presentation purposes, the branch trace is represented as a
list of sequential control-flow blocks, one such list per thread. */ list of sequential control-flow blocks, one such list per thread. */
#include "vec.h"
/* A branch trace block. /* A branch trace block.
This represents a block of sequential control-flow. Adjacent blocks will be This represents a block of sequential control-flow. Adjacent blocks will be