240e909aa11fa5c58612c11b11a72327cee6daec
[external/binutils.git] / gdb / ctf.c
1 /* CTF format support.
2
3    Copyright (C) 2012-2013 Free Software Foundation, Inc.
4    Contributed by Hui Zhu <hui_zhu@mentor.com>
5    Contributed by Yao Qi <yao@codesourcery.com>
6
7    This file is part of GDB.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21
22 #include "defs.h"
23 #include "ctf.h"
24 #include "tracepoint.h"
25 #include "regcache.h"
26 #include "gdb_stat.h"
27 #include "exec.h"
28 #include "completer.h"
29
30 #include <ctype.h>
31
32 /* GDB saves trace buffers and other information (such as trace
33    status) got from the remote target into Common Trace Format (CTF).
34    The following types of information are expected to save in CTF:
35
36    1. The length (in bytes) of register cache.  Event "register" will
37    be defined in metadata, which includes the length.
38
39    2. Trace status.  Event "status" is defined in metadata, which
40    includes all aspects of trace status.
41
42    3. Uploaded trace variables.  Event "tsv_def" is defined in
43    metadata, which is about all aspects of a uploaded trace variable.
44    Uploaded tracepoints.   Event "tp_def" is defined in meta, which
45    is about all aspects of an uploaded tracepoint.  Note that the
46    "sequence" (a CTF type, which is a dynamically-sized array.) is
47    used for "actions" "step_actions" and "cmd_strings".
48
49    4. Trace frames.  Each trace frame is composed by several blocks
50    of different types ('R', 'M', 'V').  One trace frame is saved in
51    one CTF packet and the blocks of this frame are saved as events.
52    4.1: The trace frame related information (such as the number of
53    tracepoint associated with this frame) is saved in the packet
54    context.
55    4.2: The block 'M', 'R' and 'V' are saved in event "memory",
56    "register" and "tsv" respectively.
57    4.3: When iterating over events, babeltrace can't tell iterator
58    goes to a new packet, so we need a marker or anchor to tell GDB
59    that iterator goes into a new packet or frame.  We define event
60    "frame".  */
61
62 #define CTF_MAGIC               0xC1FC1FC1
63 #define CTF_SAVE_MAJOR          1
64 #define CTF_SAVE_MINOR          8
65
66 #define CTF_METADATA_NAME       "metadata"
67 #define CTF_DATASTREAM_NAME     "datastream"
68
69 /* Reserved event id.  */
70
71 #define CTF_EVENT_ID_REGISTER 0
72 #define CTF_EVENT_ID_TSV 1
73 #define CTF_EVENT_ID_MEMORY 2
74 #define CTF_EVENT_ID_FRAME 3
75 #define CTF_EVENT_ID_STATUS 4
76 #define CTF_EVENT_ID_TSV_DEF 5
77 #define CTF_EVENT_ID_TP_DEF 6
78
79 /* The state kept while writing the CTF datastream file.  */
80
81 struct trace_write_handler
82 {
83   /* File descriptor of metadata.  */
84   FILE *metadata_fd;
85   /* File descriptor of traceframes.  */
86   FILE *datastream_fd;
87
88   /* This is the content size of the current packet.  */
89   size_t content_size;
90
91   /* This is the start offset of current packet.  */
92   long packet_start;
93 };
94
95 /* Write metadata in FORMAT.  */
96
97 static void
98 ctf_save_write_metadata (struct trace_write_handler *handler,
99                          const char *format, ...)
100 {
101   va_list args;
102
103   va_start (args, format);
104   if (vfprintf (handler->metadata_fd, format, args) < 0)
105     error (_("Unable to write metadata file (%s)"),
106              safe_strerror (errno));
107   va_end (args);
108 }
109
110 /* Write BUF of length SIZE to datastream file represented by
111    HANDLER.  */
112
113 static int
114 ctf_save_write (struct trace_write_handler *handler,
115                 const gdb_byte *buf, size_t size)
116 {
117   if (fwrite (buf, size, 1, handler->datastream_fd) != 1)
118     error (_("Unable to write file for saving trace data (%s)"),
119            safe_strerror (errno));
120
121   handler->content_size += size;
122
123   return 0;
124 }
125
126 /* Write a unsigned 32-bit integer to datastream file represented by
127    HANDLER.  */
128
129 #define ctf_save_write_uint32(HANDLER, U32) \
130   ctf_save_write (HANDLER, (gdb_byte *) &U32, 4)
131
132 /* Write a signed 32-bit integer to datastream file represented by
133    HANDLER.  */
134
135 #define ctf_save_write_int32(HANDLER, INT32) \
136   ctf_save_write ((HANDLER), (gdb_byte *) &(INT32), 4)
137
138 /* Set datastream file position.  Update HANDLER->content_size
139    if WHENCE is SEEK_CUR.  */
140
141 static int
142 ctf_save_fseek (struct trace_write_handler *handler, long offset,
143                 int whence)
144 {
145   gdb_assert (whence != SEEK_END);
146   gdb_assert (whence != SEEK_SET
147               || offset <= handler->content_size + handler->packet_start);
148
149   if (fseek (handler->datastream_fd, offset, whence))
150     error (_("Unable to seek file for saving trace data (%s)"),
151            safe_strerror (errno));
152
153   if (whence == SEEK_CUR)
154     handler->content_size += offset;
155
156   return 0;
157 }
158
159 /* Change the datastream file position to align on ALIGN_SIZE,
160    and write BUF to datastream file.  The size of BUF is SIZE.  */
161
162 static int
163 ctf_save_align_write (struct trace_write_handler *handler,
164                       const gdb_byte *buf,
165                       size_t size, size_t align_size)
166 {
167   long offset
168     = (align_up (handler->content_size, align_size)
169        - handler->content_size);
170
171   if (ctf_save_fseek (handler, offset, SEEK_CUR))
172     return -1;
173
174   if (ctf_save_write (handler, buf, size))
175     return -1;
176
177   return 0;
178 }
179
180 /* Write events to next new packet.  */
181
182 static void
183 ctf_save_next_packet (struct trace_write_handler *handler)
184 {
185   handler->packet_start += (handler->content_size + 4);
186   ctf_save_fseek (handler, handler->packet_start, SEEK_SET);
187   handler->content_size = 0;
188 }
189
190 /* Write the CTF metadata header.  */
191
192 static void
193 ctf_save_metadata_header (struct trace_write_handler *handler)
194 {
195   const char metadata_fmt[] =
196   "\ntrace {\n"
197   "     major = %u;\n"
198   "     minor = %u;\n"
199   "     byte_order = %s;\n"             /* be or le */
200   "     packet.header := struct {\n"
201   "             uint32_t magic;\n"
202   "     };\n"
203   "};\n"
204   "\n"
205   "stream {\n"
206   "     packet.context := struct {\n"
207   "             uint32_t content_size;\n"
208   "             uint32_t packet_size;\n"
209   "             uint16_t tpnum;\n"
210   "     };\n"
211   "     event.header := struct {\n"
212   "             uint32_t id;\n"
213   "     };\n"
214   "};\n";
215
216   ctf_save_write_metadata (handler, "/* CTF %d.%d */\n",
217                            CTF_SAVE_MAJOR, CTF_SAVE_MINOR);
218   ctf_save_write_metadata (handler,
219                            "typealias integer { size = 8; align = 8; "
220                            "signed = false; encoding = ascii;}"
221                            " := ascii;\n");
222   ctf_save_write_metadata (handler,
223                            "typealias integer { size = 8; align = 8; "
224                            "signed = false; }"
225                            " := uint8_t;\n");
226   ctf_save_write_metadata (handler,
227                            "typealias integer { size = 16; align = 16;"
228                            "signed = false; } := uint16_t;\n");
229   ctf_save_write_metadata (handler,
230                            "typealias integer { size = 32; align = 32;"
231                            "signed = false; } := uint32_t;\n");
232   ctf_save_write_metadata (handler,
233                            "typealias integer { size = 64; align = 64;"
234                            "signed = false; base = hex;}"
235                            " := uint64_t;\n");
236   ctf_save_write_metadata (handler,
237                            "typealias integer { size = 32; align = 32;"
238                            "signed = true; } := int32_t;\n");
239   ctf_save_write_metadata (handler,
240                            "typealias integer { size = 64; align = 64;"
241                            "signed = true; } := int64_t;\n");
242   ctf_save_write_metadata (handler,
243                            "typealias string { encoding = ascii;"
244                            " } := chars;\n");
245   ctf_save_write_metadata (handler, "\n");
246
247   /* Get the byte order of the host and write CTF data in this byte
248      order.  */
249 #if WORDS_BIGENDIAN
250 #define HOST_ENDIANNESS "be"
251 #else
252 #define HOST_ENDIANNESS "le"
253 #endif
254
255   ctf_save_write_metadata (handler, metadata_fmt,
256                            CTF_SAVE_MAJOR, CTF_SAVE_MINOR,
257                            HOST_ENDIANNESS);
258   ctf_save_write_metadata (handler, "\n");
259 }
260
261 /* CTF trace writer.  */
262
263 struct ctf_trace_file_writer
264 {
265   struct trace_file_writer base;
266
267   /* States related to writing CTF trace file.  */
268   struct trace_write_handler tcs;
269 };
270
271 /* This is the implementation of trace_file_write_ops method
272    dtor.  */
273
274 static void
275 ctf_dtor (struct trace_file_writer *self)
276 {
277   struct ctf_trace_file_writer *writer
278     = (struct ctf_trace_file_writer *) self;
279
280   if (writer->tcs.metadata_fd != NULL)
281     fclose (writer->tcs.metadata_fd);
282
283   if (writer->tcs.datastream_fd != NULL)
284     fclose (writer->tcs.datastream_fd);
285
286 }
287
288 /* This is the implementation of trace_file_write_ops method
289    target_save.  */
290
291 static int
292 ctf_target_save (struct trace_file_writer *self,
293                  const char *dirname)
294 {
295   /* Don't support save trace file to CTF format in the target.  */
296   return 0;
297 }
298
299 #ifdef USE_WIN32API
300 #undef mkdir
301 #define mkdir(pathname, mode) mkdir (pathname)
302 #endif
303
304 /* This is the implementation of trace_file_write_ops method
305    start.  It creates the directory DIRNAME, metadata and datastream
306    in the directory.  */
307
308 static void
309 ctf_start (struct trace_file_writer *self, const char *dirname)
310 {
311   char *file_name;
312   struct cleanup *old_chain;
313   struct ctf_trace_file_writer *writer
314     = (struct ctf_trace_file_writer *) self;
315   int i;
316   mode_t hmode = S_IRUSR | S_IWUSR | S_IXUSR
317 #ifdef S_IRGRP
318     | S_IRGRP
319 #endif
320 #ifdef S_IXGRP
321     | S_IXGRP
322 #endif
323     | S_IROTH /* Defined in common/gdb_stat.h if not defined.  */
324 #ifdef S_IXOTH
325     | S_IXOTH
326 #endif
327     ;
328
329   /* Create DIRNAME.  */
330   if (mkdir (dirname, hmode) && errno != EEXIST)
331     error (_("Unable to open directory '%s' for saving trace data (%s)"),
332            dirname, safe_strerror (errno));
333
334   memset (&writer->tcs, '\0', sizeof (writer->tcs));
335
336   file_name = xstrprintf ("%s/%s", dirname, CTF_METADATA_NAME);
337   old_chain = make_cleanup (xfree, file_name);
338
339   writer->tcs.metadata_fd = fopen (file_name, "w");
340   if (writer->tcs.metadata_fd == NULL)
341     error (_("Unable to open file '%s' for saving trace data (%s)"),
342            file_name, safe_strerror (errno));
343   do_cleanups (old_chain);
344
345   ctf_save_metadata_header (&writer->tcs);
346
347   file_name = xstrprintf ("%s/%s", dirname, CTF_DATASTREAM_NAME);
348   old_chain = make_cleanup (xfree, file_name);
349   writer->tcs.datastream_fd = fopen (file_name, "w");
350   if (writer->tcs.datastream_fd == NULL)
351     error (_("Unable to open file '%s' for saving trace data (%s)"),
352            file_name, safe_strerror (errno));
353   do_cleanups (old_chain);
354 }
355
356 /* This is the implementation of trace_file_write_ops method
357    write_header.  Write the types of events on trace variable and
358    frame.  */
359
360 static void
361 ctf_write_header (struct trace_file_writer *self)
362 {
363   struct ctf_trace_file_writer *writer
364     = (struct ctf_trace_file_writer *) self;
365
366
367   ctf_save_write_metadata (&writer->tcs, "\n");
368   ctf_save_write_metadata (&writer->tcs,
369                            "event {\n\tname = \"memory\";\n\tid = %u;\n"
370                            "\tfields := struct { \n"
371                            "\t\tuint64_t address;\n"
372                            "\t\tuint16_t length;\n"
373                            "\t\tuint8_t contents[length];\n"
374                            "\t};\n"
375                            "};\n", CTF_EVENT_ID_MEMORY);
376
377   ctf_save_write_metadata (&writer->tcs, "\n");
378   ctf_save_write_metadata (&writer->tcs,
379                            "event {\n\tname = \"tsv\";\n\tid = %u;\n"
380                            "\tfields := struct { \n"
381                            "\t\tuint64_t val;\n"
382                            "\t\tuint32_t num;\n"
383                            "\t};\n"
384                            "};\n", CTF_EVENT_ID_TSV);
385
386   ctf_save_write_metadata (&writer->tcs, "\n");
387   ctf_save_write_metadata (&writer->tcs,
388                            "event {\n\tname = \"frame\";\n\tid = %u;\n"
389                            "\tfields := struct { \n"
390                            "\t};\n"
391                            "};\n", CTF_EVENT_ID_FRAME);
392
393   ctf_save_write_metadata (&writer->tcs, "\n");
394   ctf_save_write_metadata (&writer->tcs,
395                           "event {\n\tname = \"tsv_def\";\n"
396                           "\tid = %u;\n\tfields := struct { \n"
397                           "\t\tint64_t initial_value;\n"
398                           "\t\tint32_t number;\n"
399                           "\t\tint32_t builtin;\n"
400                           "\t\tchars name;\n"
401                           "\t};\n"
402                           "};\n", CTF_EVENT_ID_TSV_DEF);
403
404   ctf_save_write_metadata (&writer->tcs, "\n");
405   ctf_save_write_metadata (&writer->tcs,
406                            "event {\n\tname = \"tp_def\";\n"
407                            "\tid = %u;\n\tfields := struct { \n"
408                            "\t\tuint64_t addr;\n"
409                            "\t\tuint64_t traceframe_usage;\n"
410                            "\t\tint32_t number;\n"
411                            "\t\tint32_t enabled;\n"
412                            "\t\tint32_t step;\n"
413                            "\t\tint32_t pass;\n"
414                            "\t\tint32_t hit_count;\n"
415                            "\t\tint32_t type;\n"
416                            "\t\tchars cond;\n"
417
418                           "\t\tuint32_t action_num;\n"
419                           "\t\tchars actions[action_num];\n"
420
421                           "\t\tuint32_t step_action_num;\n"
422                           "\t\tchars step_actions[step_action_num];\n"
423
424                           "\t\tchars at_string;\n"
425                           "\t\tchars cond_string;\n"
426
427                           "\t\tuint32_t cmd_num;\n"
428                           "\t\tchars cmd_strings[cmd_num];\n"
429                           "\t};\n"
430                           "};\n", CTF_EVENT_ID_TP_DEF);
431
432   gdb_assert (writer->tcs.content_size == 0);
433   gdb_assert (writer->tcs.packet_start == 0);
434
435   /* Create a new packet to contain this event.  */
436   self->ops->frame_ops->start (self, 0);
437 }
438
439 /* This is the implementation of trace_file_write_ops method
440    write_regblock_type.  Write the type of register event in
441    metadata.  */
442
443 static void
444 ctf_write_regblock_type (struct trace_file_writer *self, int size)
445 {
446   struct ctf_trace_file_writer *writer
447     = (struct ctf_trace_file_writer *) self;
448
449   ctf_save_write_metadata (&writer->tcs, "\n");
450
451   ctf_save_write_metadata (&writer->tcs,
452                            "event {\n\tname = \"register\";\n\tid = %u;\n"
453                            "\tfields := struct { \n"
454                            "\t\tascii contents[%d];\n"
455                            "\t};\n"
456                            "};\n",
457                            CTF_EVENT_ID_REGISTER, size);
458 }
459
460 /* This is the implementation of trace_file_write_ops method
461    write_status.  */
462
463 static void
464 ctf_write_status (struct trace_file_writer *self,
465                   struct trace_status *ts)
466 {
467   struct ctf_trace_file_writer *writer
468     = (struct ctf_trace_file_writer *) self;
469   uint32_t id;
470   int32_t int32;
471
472   ctf_save_write_metadata (&writer->tcs, "\n");
473   ctf_save_write_metadata (&writer->tcs,
474                            "event {\n\tname = \"status\";\n\tid = %u;\n"
475                            "\tfields := struct { \n"
476                            "\t\tint32_t stop_reason;\n"
477                            "\t\tint32_t stopping_tracepoint;\n"
478                            "\t\tint32_t traceframe_count;\n"
479                            "\t\tint32_t traceframes_created;\n"
480                            "\t\tint32_t buffer_free;\n"
481                            "\t\tint32_t buffer_size;\n"
482                            "\t\tint32_t disconnected_tracing;\n"
483                            "\t\tint32_t circular_buffer;\n"
484                            "\t};\n"
485                            "};\n",
486                            CTF_EVENT_ID_STATUS);
487
488   id = CTF_EVENT_ID_STATUS;
489   /* Event Id.  */
490   ctf_save_align_write (&writer->tcs, (gdb_byte *) &id, 4, 4);
491
492   ctf_save_write_int32 (&writer->tcs, ts->stop_reason);
493   ctf_save_write_int32 (&writer->tcs, ts->stopping_tracepoint);
494   ctf_save_write_int32 (&writer->tcs, ts->traceframe_count);
495   ctf_save_write_int32 (&writer->tcs, ts->traceframes_created);
496   ctf_save_write_int32 (&writer->tcs, ts->buffer_free);
497   ctf_save_write_int32 (&writer->tcs, ts->buffer_size);
498   ctf_save_write_int32 (&writer->tcs, ts->disconnected_tracing);
499   ctf_save_write_int32 (&writer->tcs, ts->circular_buffer);
500 }
501
502 /* This is the implementation of trace_file_write_ops method
503    write_uploaded_tsv.  */
504
505 static void
506 ctf_write_uploaded_tsv (struct trace_file_writer *self,
507                         struct uploaded_tsv *tsv)
508 {
509   struct ctf_trace_file_writer *writer
510     = (struct ctf_trace_file_writer *) self;
511   int32_t int32;
512   int64_t int64;
513   unsigned int len;
514   const gdb_byte zero = 0;
515
516   /* Event Id.  */
517   int32 = CTF_EVENT_ID_TSV_DEF;
518   ctf_save_align_write (&writer->tcs, (gdb_byte *) &int32, 4, 4);
519
520   /* initial_value */
521   int64 = tsv->initial_value;
522   ctf_save_align_write (&writer->tcs, (gdb_byte *) &int64, 8, 8);
523
524   /* number */
525   ctf_save_write_int32 (&writer->tcs, tsv->number);
526
527   /* builtin */
528   ctf_save_write_int32 (&writer->tcs, tsv->builtin);
529
530   /* name */
531   if (tsv->name != NULL)
532     ctf_save_write (&writer->tcs, (gdb_byte *) tsv->name,
533                     strlen (tsv->name));
534   ctf_save_write (&writer->tcs, &zero, 1);
535 }
536
537 /* This is the implementation of trace_file_write_ops method
538    write_uploaded_tp.  */
539
540 static void
541 ctf_write_uploaded_tp (struct trace_file_writer *self,
542                        struct uploaded_tp *tp)
543 {
544   struct ctf_trace_file_writer *writer
545     = (struct ctf_trace_file_writer *) self;
546   int32_t int32;
547   int64_t int64;
548   uint32_t u32;
549   const gdb_byte zero = 0;
550   int a;
551   char *act;
552
553   /* Event Id.  */
554   int32 = CTF_EVENT_ID_TP_DEF;
555   ctf_save_align_write (&writer->tcs, (gdb_byte *) &int32, 4, 4);
556
557   /* address */
558   int64 = tp->addr;
559   ctf_save_align_write (&writer->tcs, (gdb_byte *) &int64, 8, 8);
560
561   /* traceframe_usage */
562   int64 = tp->traceframe_usage;
563   ctf_save_align_write (&writer->tcs, (gdb_byte *) &int64, 8, 8);
564
565   /* number */
566   ctf_save_write_int32 (&writer->tcs, tp->number);
567
568   /* enabled */
569   ctf_save_write_int32 (&writer->tcs, tp->enabled);
570
571   /* step */
572   ctf_save_write_int32 (&writer->tcs, tp->step);
573
574   /* pass */
575   ctf_save_write_int32 (&writer->tcs, tp->pass);
576
577   /* hit_count */
578   ctf_save_write_int32 (&writer->tcs, tp->hit_count);
579
580   /* type */
581   ctf_save_write_int32 (&writer->tcs, tp->type);
582
583   /* condition  */
584   if (tp->cond != NULL)
585     ctf_save_write (&writer->tcs, (gdb_byte *) tp->cond, strlen (tp->cond));
586   ctf_save_write (&writer->tcs, &zero, 1);
587
588   /* actions */
589   u32 = VEC_length (char_ptr, tp->actions);
590   ctf_save_align_write (&writer->tcs, (gdb_byte *) &u32, 4, 4);
591   for (a = 0; VEC_iterate (char_ptr, tp->actions, a, act); ++a)
592     ctf_save_write (&writer->tcs, (gdb_byte *) act, strlen (act) + 1);
593
594   /* step_actions */
595   u32 = VEC_length (char_ptr, tp->step_actions);
596   ctf_save_align_write (&writer->tcs, (gdb_byte *) &u32, 4, 4);
597   for (a = 0; VEC_iterate (char_ptr, tp->step_actions, a, act); ++a)
598     ctf_save_write (&writer->tcs, (gdb_byte *) act, strlen (act) + 1);
599
600   /* at_string */
601   if (tp->at_string != NULL)
602     ctf_save_write (&writer->tcs, (gdb_byte *) tp->at_string,
603                     strlen (tp->at_string));
604   ctf_save_write (&writer->tcs, &zero, 1);
605
606   /* cond_string */
607   if (tp->cond_string != NULL)
608     ctf_save_write (&writer->tcs, (gdb_byte *) tp->cond_string,
609                     strlen (tp->cond_string));
610   ctf_save_write (&writer->tcs, &zero, 1);
611
612   /* cmd_strings */
613   u32 = VEC_length (char_ptr, tp->cmd_strings);
614   ctf_save_align_write (&writer->tcs, (gdb_byte *) &u32, 4, 4);
615   for (a = 0; VEC_iterate (char_ptr, tp->cmd_strings, a, act); ++a)
616     ctf_save_write (&writer->tcs, (gdb_byte *) act, strlen (act) + 1);
617
618 }
619
620 /* This is the implementation of trace_file_write_ops method
621    write_definition_end.  */
622
623 static void
624 ctf_write_definition_end (struct trace_file_writer *self)
625 {
626   struct ctf_trace_file_writer *writer
627     = (struct ctf_trace_file_writer *) self;
628
629   self->ops->frame_ops->end (self);
630 }
631
632 /* The minimal file size of data stream.  It is required by
633    babeltrace.  */
634
635 #define CTF_FILE_MIN_SIZE               4096
636
637 /* This is the implementation of trace_file_write_ops method
638    end.  */
639
640 static void
641 ctf_end (struct trace_file_writer *self)
642 {
643   struct ctf_trace_file_writer *writer = (struct ctf_trace_file_writer *) self;
644
645   gdb_assert (writer->tcs.content_size == 0);
646   /* The babeltrace requires or assumes that the size of datastream
647      file is greater than 4096 bytes.  If we don't generate enough
648      packets and events, create a fake packet which has zero event,
649       to use up the space.  */
650   if (writer->tcs.packet_start < CTF_FILE_MIN_SIZE)
651     {
652       uint32_t u32;
653
654       /* magic.  */
655       u32 = CTF_MAGIC;
656       ctf_save_write_uint32 (&writer->tcs, u32);
657
658       /* content_size.  */
659       u32 = 0;
660       ctf_save_write_uint32 (&writer->tcs, u32);
661
662       /* packet_size.  */
663       u32 = 12;
664       if (writer->tcs.packet_start + u32 < CTF_FILE_MIN_SIZE)
665         u32 = CTF_FILE_MIN_SIZE - writer->tcs.packet_start;
666
667       u32 *= TARGET_CHAR_BIT;
668       ctf_save_write_uint32 (&writer->tcs, u32);
669
670       /* tpnum.  */
671       u32 = 0;
672       ctf_save_write (&writer->tcs, (gdb_byte *) &u32, 2);
673
674       /* Enlarge the file to CTF_FILE_MIN_SIZE is it is still less
675          than that.  */
676       if (CTF_FILE_MIN_SIZE
677           > (writer->tcs.packet_start + writer->tcs.content_size))
678         {
679           gdb_byte b = 0;
680
681           /* Fake the content size to avoid assertion failure in
682              ctf_save_fseek.  */
683           writer->tcs.content_size = (CTF_FILE_MIN_SIZE
684                                       - 1 - writer->tcs.packet_start);
685           ctf_save_fseek (&writer->tcs, CTF_FILE_MIN_SIZE - 1,
686                           SEEK_SET);
687           ctf_save_write (&writer->tcs, &b, 1);
688         }
689     }
690 }
691
692 /* This is the implementation of trace_frame_write_ops method
693    start.  */
694
695 static void
696 ctf_write_frame_start (struct trace_file_writer *self, uint16_t tpnum)
697 {
698   struct ctf_trace_file_writer *writer
699     = (struct ctf_trace_file_writer *) self;
700   uint32_t id = CTF_EVENT_ID_FRAME;
701   uint32_t u32;
702
703   /* Step 1: Write packet context.  */
704   /* magic.  */
705   u32 = CTF_MAGIC;
706   ctf_save_write_uint32 (&writer->tcs, u32);
707   /* content_size and packet_size..  We still don't know the value,
708      write it later.  */
709   ctf_save_fseek (&writer->tcs, 4, SEEK_CUR);
710   ctf_save_fseek (&writer->tcs, 4, SEEK_CUR);
711   /* Tracepoint number.  */
712   ctf_save_write (&writer->tcs, (gdb_byte *) &tpnum, 2);
713
714   /* Step 2: Write event "frame".  */
715   /* Event Id.  */
716   ctf_save_align_write (&writer->tcs, (gdb_byte *) &id, 4, 4);
717 }
718
719 /* This is the implementation of trace_frame_write_ops method
720    write_r_block.  */
721
722 static void
723 ctf_write_frame_r_block (struct trace_file_writer *self,
724                          gdb_byte *buf, int32_t size)
725 {
726   struct ctf_trace_file_writer *writer
727     = (struct ctf_trace_file_writer *) self;
728   uint32_t id = CTF_EVENT_ID_REGISTER;
729
730   /* Event Id.  */
731   ctf_save_align_write (&writer->tcs, (gdb_byte *) &id, 4, 4);
732
733   /* array contents.  */
734   ctf_save_align_write (&writer->tcs, buf, size, 1);
735 }
736
737 /* This is the implementation of trace_frame_write_ops method
738    write_m_block_header.  */
739
740 static void
741 ctf_write_frame_m_block_header (struct trace_file_writer *self,
742                                 uint64_t addr, uint16_t length)
743 {
744   struct ctf_trace_file_writer *writer
745     = (struct ctf_trace_file_writer *) self;
746   uint32_t event_id = CTF_EVENT_ID_MEMORY;
747
748   /* Event Id.  */
749   ctf_save_align_write (&writer->tcs, (gdb_byte *) &event_id, 4, 4);
750
751   /* Address.  */
752   ctf_save_align_write (&writer->tcs, (gdb_byte *) &addr, 8, 8);
753
754   /* Length.  */
755   ctf_save_align_write (&writer->tcs, (gdb_byte *) &length, 2, 2);
756 }
757
758 /* This is the implementation of trace_frame_write_ops method
759    write_m_block_memory.  */
760
761 static void
762 ctf_write_frame_m_block_memory (struct trace_file_writer *self,
763                                 gdb_byte *buf, uint16_t length)
764 {
765   struct ctf_trace_file_writer *writer
766     = (struct ctf_trace_file_writer *) self;
767
768   /* Contents.  */
769   ctf_save_align_write (&writer->tcs, (gdb_byte *) buf, length, 1);
770 }
771
772 /* This is the implementation of trace_frame_write_ops method
773    write_v_block.  */
774
775 static void
776 ctf_write_frame_v_block (struct trace_file_writer *self,
777                          int32_t num, uint64_t val)
778 {
779   struct ctf_trace_file_writer *writer
780     = (struct ctf_trace_file_writer *) self;
781   uint32_t id = CTF_EVENT_ID_TSV;
782
783   /* Event Id.  */
784   ctf_save_align_write (&writer->tcs, (gdb_byte *) &id, 4, 4);
785
786   /* val.  */
787   ctf_save_align_write (&writer->tcs, (gdb_byte *) &val, 8, 8);
788   /* num.  */
789   ctf_save_align_write (&writer->tcs, (gdb_byte *) &num, 4, 4);
790 }
791
792 /* This is the implementation of trace_frame_write_ops method
793    end.  */
794
795 static void
796 ctf_write_frame_end (struct trace_file_writer *self)
797 {
798   struct ctf_trace_file_writer *writer
799     = (struct ctf_trace_file_writer *) self;
800   uint32_t u32;
801   uint32_t t;
802
803   /* Write the content size to packet header.  */
804   ctf_save_fseek (&writer->tcs, writer->tcs.packet_start + 4,
805                   SEEK_SET);
806   u32 = writer->tcs.content_size * TARGET_CHAR_BIT;
807
808   t = writer->tcs.content_size;
809   ctf_save_write_uint32 (&writer->tcs, u32);
810
811   /* Write the packet size.  */
812   u32 += 4 * TARGET_CHAR_BIT;
813   ctf_save_write_uint32 (&writer->tcs, u32);
814
815   writer->tcs.content_size = t;
816
817   /* Write zero at the end of the packet.  */
818   ctf_save_fseek (&writer->tcs, writer->tcs.packet_start + t,
819                   SEEK_SET);
820   u32 = 0;
821   ctf_save_write_uint32 (&writer->tcs, u32);
822   writer->tcs.content_size = t;
823
824   ctf_save_next_packet (&writer->tcs);
825 }
826
827 /* Operations to write various types of trace frames into CTF
828    format.  */
829
830 static const struct trace_frame_write_ops ctf_write_frame_ops =
831 {
832   ctf_write_frame_start,
833   ctf_write_frame_r_block,
834   ctf_write_frame_m_block_header,
835   ctf_write_frame_m_block_memory,
836   ctf_write_frame_v_block,
837   ctf_write_frame_end,
838 };
839
840 /* Operations to write trace buffers into CTF format.  */
841
842 static const struct trace_file_write_ops ctf_write_ops =
843 {
844   ctf_dtor,
845   ctf_target_save,
846   ctf_start,
847   ctf_write_header,
848   ctf_write_regblock_type,
849   ctf_write_status,
850   ctf_write_uploaded_tsv,
851   ctf_write_uploaded_tp,
852   ctf_write_definition_end,
853   NULL,
854   &ctf_write_frame_ops,
855   ctf_end,
856 };
857
858 /* Return a trace writer for CTF format.  */
859
860 struct trace_file_writer *
861 ctf_trace_file_writer_new (void)
862 {
863   struct ctf_trace_file_writer *writer
864     = xmalloc (sizeof (struct ctf_trace_file_writer));
865
866   writer->base.ops = &ctf_write_ops;
867
868   return (struct trace_file_writer *) writer;
869 }
870
871 #if HAVE_LIBBABELTRACE
872 /* Use libbabeltrace to read CTF data.  The libbabeltrace provides
873    iterator to iterate over each event in CTF data and APIs to get
874    details of event and packet, so it is very convenient to use
875    libbabeltrace to access events in CTF.  */
876
877 #include <babeltrace/babeltrace.h>
878 #include <babeltrace/ctf/events.h>
879 #include <babeltrace/ctf/iterator.h>
880
881 /* The struct pointer for current CTF directory.  */
882 static struct bt_context *ctx = NULL;
883 static struct bt_ctf_iter *ctf_iter = NULL;
884 /* The position of the first packet containing trace frame.  */
885 static struct bt_iter_pos *start_pos;
886
887 /* The name of CTF directory.  */
888 static char *trace_dirname;
889
890 static struct target_ops ctf_ops;
891
892 /* Destroy ctf iterator and context.  */
893
894 static void
895 ctf_destroy (void)
896 {
897   if (ctf_iter != NULL)
898     {
899       bt_ctf_iter_destroy (ctf_iter);
900       ctf_iter = NULL;
901     }
902   if (ctx != NULL)
903     {
904       bt_context_put (ctx);
905       ctx = NULL;
906     }
907 }
908
909 /* Open CTF trace data in DIRNAME.  */
910
911 static void
912 ctf_open_dir (char *dirname)
913 {
914   int ret;
915   struct bt_iter_pos begin_pos;
916   struct bt_iter_pos *pos;
917
918   ctx = bt_context_create ();
919   if (ctx == NULL)
920     error (_("Unable to create bt_context"));
921   ret = bt_context_add_trace (ctx, dirname, "ctf", NULL, NULL, NULL);
922   if (ret < 0)
923     {
924       ctf_destroy ();
925       error (_("Unable to use libbabeltrace on directory \"%s\""),
926              dirname);
927     }
928
929   begin_pos.type = BT_SEEK_BEGIN;
930   ctf_iter = bt_ctf_iter_create (ctx, &begin_pos, NULL);
931   if (ctf_iter == NULL)
932     {
933       ctf_destroy ();
934       error (_("Unable to create bt_iterator"));
935     }
936
937   /* Iterate over events, and look for an event for register block
938      to set trace_regblock_size.  */
939
940   /* Save the current position.  */
941   pos = bt_iter_get_pos (bt_ctf_get_iter (ctf_iter));
942   gdb_assert (pos->type == BT_SEEK_RESTORE);
943
944   while (1)
945     {
946       const char *name;
947       struct bt_ctf_event *event;
948
949       event = bt_ctf_iter_read_event (ctf_iter);
950
951       name = bt_ctf_event_name (event);
952
953       if (name == NULL)
954         break;
955       else if (strcmp (name, "register") == 0)
956         {
957           const struct bt_definition *scope
958             = bt_ctf_get_top_level_scope (event,
959                                           BT_EVENT_FIELDS);
960           const struct bt_definition *array
961             = bt_ctf_get_field (event, scope, "contents");
962
963           trace_regblock_size
964             = bt_ctf_get_array_len (bt_ctf_get_decl_from_def (array));
965         }
966
967       if (bt_iter_next (bt_ctf_get_iter (ctf_iter)) < 0)
968         break;
969     }
970
971   /* Restore the position.  */
972   bt_iter_set_pos (bt_ctf_get_iter (ctf_iter), pos);
973 }
974
975 #define SET_INT32_FIELD(EVENT, SCOPE, VAR, FIELD)                       \
976   (VAR)->FIELD = (int) bt_ctf_get_int64 (bt_ctf_get_field ((EVENT),     \
977                                                            (SCOPE),     \
978                                                            #FIELD))
979
980 /* EVENT is the "status" event and TS is filled in.  */
981
982 static void
983 ctf_read_status (struct bt_ctf_event *event, struct trace_status *ts)
984 {
985   const struct bt_definition *scope
986     = bt_ctf_get_top_level_scope (event, BT_EVENT_FIELDS);
987
988   SET_INT32_FIELD (event, scope, ts, stop_reason);
989   SET_INT32_FIELD (event, scope, ts, stopping_tracepoint);
990   SET_INT32_FIELD (event, scope, ts, traceframe_count);
991   SET_INT32_FIELD (event, scope, ts, traceframes_created);
992   SET_INT32_FIELD (event, scope, ts, buffer_free);
993   SET_INT32_FIELD (event, scope, ts, buffer_size);
994   SET_INT32_FIELD (event, scope, ts, disconnected_tracing);
995   SET_INT32_FIELD (event, scope, ts, circular_buffer);
996
997   bt_iter_next (bt_ctf_get_iter (ctf_iter));
998 }
999
1000 /* Read the events "tsv_def" one by one, extract its contents and fill
1001    in the list UPLOADED_TSVS.  */
1002
1003 static void
1004 ctf_read_tsv (struct uploaded_tsv **uploaded_tsvs)
1005 {
1006   gdb_assert (ctf_iter != NULL);
1007
1008   while (1)
1009     {
1010       struct bt_ctf_event *event;
1011       const struct bt_definition *scope;
1012       const struct bt_definition *def;
1013       uint32_t event_id;
1014       struct uploaded_tsv *utsv = NULL;
1015
1016       event = bt_ctf_iter_read_event (ctf_iter);
1017       scope = bt_ctf_get_top_level_scope (event,
1018                                           BT_STREAM_EVENT_HEADER);
1019       event_id = bt_ctf_get_uint64 (bt_ctf_get_field (event, scope,
1020                                                       "id"));
1021       if (event_id != CTF_EVENT_ID_TSV_DEF)
1022         break;
1023
1024       scope = bt_ctf_get_top_level_scope (event,
1025                                           BT_EVENT_FIELDS);
1026
1027       def = bt_ctf_get_field (event, scope, "number");
1028       utsv = get_uploaded_tsv ((int32_t) bt_ctf_get_int64 (def),
1029                                uploaded_tsvs);
1030
1031       def = bt_ctf_get_field (event, scope, "builtin");
1032       utsv->builtin = (int32_t) bt_ctf_get_int64 (def);
1033       def = bt_ctf_get_field (event, scope, "initial_value");
1034       utsv->initial_value = bt_ctf_get_int64 (def);
1035
1036       def = bt_ctf_get_field (event, scope, "name");
1037       utsv->name =  xstrdup (bt_ctf_get_string (def));
1038
1039       if (bt_iter_next (bt_ctf_get_iter (ctf_iter)) < 0)
1040         break;
1041     }
1042
1043 }
1044
1045 /* Read the value of element whose index is NUM from CTF and write it
1046    to the corresponding VAR->ARRAY. */
1047
1048 #define SET_ARRAY_FIELD(EVENT, SCOPE, VAR, NUM, ARRAY)  \
1049   do                                                    \
1050     {                                                   \
1051       uint32_t u32, i;                                          \
1052       const struct bt_definition *def;                          \
1053                                                                 \
1054       u32 = (uint32_t) bt_ctf_get_uint64 (bt_ctf_get_field ((EVENT),    \
1055                                                             (SCOPE),    \
1056                                                             #NUM));     \
1057       def = bt_ctf_get_field ((EVENT), (SCOPE), #ARRAY);                \
1058       for (i = 0; i < u32; i++)                                 \
1059         {                                                               \
1060           const struct bt_definition *element                           \
1061             = bt_ctf_get_index ((EVENT), def, i);                       \
1062                                                                         \
1063           VEC_safe_push (char_ptr, (VAR)->ARRAY,                        \
1064                          xstrdup (bt_ctf_get_string (element)));        \
1065         }                                                               \
1066     }                                                                   \
1067   while (0)
1068
1069 /* Read a string from CTF and set VAR->FIELD. If the length of string
1070    is zero, set VAR->FIELD to NULL.  */
1071
1072 #define SET_STRING_FIELD(EVENT, SCOPE, VAR, FIELD)                      \
1073   do                                                                    \
1074     {                                                                   \
1075       const char *p = bt_ctf_get_string (bt_ctf_get_field ((EVENT),     \
1076                                                            (SCOPE),     \
1077                                                            #FIELD));    \
1078                                                                         \
1079       if (strlen (p) > 0)                                               \
1080         (VAR)->FIELD = xstrdup (p);                                     \
1081       else                                                              \
1082         (VAR)->FIELD = NULL;                                            \
1083     }                                                                   \
1084   while (0)
1085
1086 /* Read the events "tp_def" one by one, extract its contents and fill
1087    in the list UPLOADED_TPS.  */
1088
1089 static void
1090 ctf_read_tp (struct uploaded_tp **uploaded_tps)
1091 {
1092   gdb_assert (ctf_iter != NULL);
1093
1094   while (1)
1095     {
1096       struct bt_ctf_event *event;
1097       const struct bt_definition *scope;
1098       uint32_t u32;
1099       int32_t int32;
1100       uint64_t u64;
1101       struct uploaded_tp *utp = NULL;
1102
1103       event = bt_ctf_iter_read_event (ctf_iter);
1104       scope = bt_ctf_get_top_level_scope (event,
1105                                           BT_STREAM_EVENT_HEADER);
1106       u32 = bt_ctf_get_uint64 (bt_ctf_get_field (event, scope,
1107                                                  "id"));
1108       if (u32 != CTF_EVENT_ID_TP_DEF)
1109         break;
1110
1111       scope = bt_ctf_get_top_level_scope (event,
1112                                           BT_EVENT_FIELDS);
1113       int32 = (int32_t) bt_ctf_get_int64 (bt_ctf_get_field (event,
1114                                                             scope,
1115                                                             "number"));
1116       u64 = bt_ctf_get_uint64 (bt_ctf_get_field (event, scope,
1117                                                  "addr"));
1118       utp = get_uploaded_tp (int32, u64,  uploaded_tps);
1119
1120       SET_INT32_FIELD (event, scope, utp, enabled);
1121       SET_INT32_FIELD (event, scope, utp, step);
1122       SET_INT32_FIELD (event, scope, utp, pass);
1123       SET_INT32_FIELD (event, scope, utp, hit_count);
1124       SET_INT32_FIELD (event, scope, utp, type);
1125
1126       /* Read 'cmd_strings'.  */
1127       SET_ARRAY_FIELD (event, scope, utp, cmd_num, cmd_strings);
1128       /* Read 'actions'.  */
1129       SET_ARRAY_FIELD (event, scope, utp, action_num, actions);
1130       /* Read 'step_actions'.  */
1131       SET_ARRAY_FIELD (event, scope, utp, step_action_num,
1132                        step_actions);
1133
1134       SET_STRING_FIELD(event, scope, utp, at_string);
1135       SET_STRING_FIELD(event, scope, utp, cond_string);
1136
1137       if (bt_iter_next (bt_ctf_get_iter (ctf_iter)) < 0)
1138         break;
1139     }
1140 }
1141
1142 /* This is the implementation of target_ops method to_open.  Open CTF
1143    trace data, read trace status, trace state variables and tracepoint
1144    definitions from the first packet.  Set the start position at the
1145    second packet which contains events on trace blocks.  */
1146
1147 static void
1148 ctf_open (char *dirname, int from_tty)
1149 {
1150   struct bt_ctf_event *event;
1151   uint32_t event_id;
1152   const struct bt_definition *scope;
1153   struct uploaded_tsv *uploaded_tsvs = NULL;
1154   struct uploaded_tp *uploaded_tps = NULL;
1155
1156   if (!dirname)
1157     error (_("No CTF directory specified."));
1158
1159   ctf_open_dir (dirname);
1160
1161   target_preopen (from_tty);
1162
1163   /* Skip the first packet which about the trace status.  The first
1164      event is "frame".  */
1165   event = bt_ctf_iter_read_event (ctf_iter);
1166   scope = bt_ctf_get_top_level_scope (event, BT_STREAM_EVENT_HEADER);
1167   event_id = bt_ctf_get_uint64 (bt_ctf_get_field (event, scope, "id"));
1168   if (event_id != CTF_EVENT_ID_FRAME)
1169     error (_("Wrong event id of the first event"));
1170   /* The second event is "status".  */
1171   bt_iter_next (bt_ctf_get_iter (ctf_iter));
1172   event = bt_ctf_iter_read_event (ctf_iter);
1173   scope = bt_ctf_get_top_level_scope (event, BT_STREAM_EVENT_HEADER);
1174   event_id = bt_ctf_get_uint64 (bt_ctf_get_field (event, scope, "id"));
1175   if (event_id != CTF_EVENT_ID_STATUS)
1176     error (_("Wrong event id of the second event"));
1177   ctf_read_status (event, current_trace_status ());
1178
1179   ctf_read_tsv (&uploaded_tsvs);
1180
1181   ctf_read_tp (&uploaded_tps);
1182
1183   event = bt_ctf_iter_read_event (ctf_iter);
1184   /* EVENT can be NULL if we've already gone to the end of stream of
1185      events.  */
1186   if (event != NULL)
1187     {
1188       scope = bt_ctf_get_top_level_scope (event,
1189                                           BT_STREAM_EVENT_HEADER);
1190       event_id = bt_ctf_get_uint64 (bt_ctf_get_field (event,
1191                                                       scope, "id"));
1192       if (event_id != CTF_EVENT_ID_FRAME)
1193         error (_("Wrong event id of the first event of the second packet"));
1194     }
1195
1196   start_pos = bt_iter_get_pos (bt_ctf_get_iter (ctf_iter));
1197   gdb_assert (start_pos->type == BT_SEEK_RESTORE);
1198
1199   trace_dirname = xstrdup (dirname);
1200   push_target (&ctf_ops);
1201
1202   merge_uploaded_trace_state_variables (&uploaded_tsvs);
1203   merge_uploaded_tracepoints (&uploaded_tps);
1204 }
1205
1206 /* This is the implementation of target_ops method to_close.  Destroy
1207    CTF iterator and context.  */
1208
1209 static void
1210 ctf_close (void)
1211 {
1212   ctf_destroy ();
1213   xfree (trace_dirname);
1214   trace_dirname = NULL;
1215 }
1216
1217 /* This is the implementation of target_ops method to_files_info.
1218    Print the directory name of CTF trace data.  */
1219
1220 static void
1221 ctf_files_info (struct target_ops *t)
1222 {
1223   printf_filtered ("\t`%s'\n", trace_dirname);
1224 }
1225
1226 /* This is the implementation of target_ops method to_fetch_registers.
1227    Iterate over events whose name is "register" in current frame,
1228    extract contents from events, and set REGCACHE with the contents.
1229    If no matched events are found, mark registers unavailable.  */
1230
1231 static void
1232 ctf_fetch_registers (struct target_ops *ops,
1233                      struct regcache *regcache, int regno)
1234 {
1235   struct gdbarch *gdbarch = get_regcache_arch (regcache);
1236   int offset, regn, regsize, pc_regno;
1237   char *regs = NULL;
1238   struct bt_ctf_event *event = NULL;
1239   struct bt_iter_pos *pos;
1240
1241   /* An uninitialized reg size says we're not going to be
1242      successful at getting register blocks.  */
1243   if (trace_regblock_size == 0)
1244     return;
1245
1246   gdb_assert (ctf_iter != NULL);
1247   /* Save the current position.  */
1248   pos = bt_iter_get_pos (bt_ctf_get_iter (ctf_iter));
1249   gdb_assert (pos->type == BT_SEEK_RESTORE);
1250
1251   while (1)
1252     {
1253       const char *name;
1254       struct bt_ctf_event *event1;
1255
1256       event1 = bt_ctf_iter_read_event (ctf_iter);
1257
1258       name = bt_ctf_event_name (event1);
1259
1260       if (name == NULL || strcmp (name, "frame") == 0)
1261         break;
1262       else if (strcmp (name, "register") == 0)
1263         {
1264           event = event1;
1265           break;
1266         }
1267
1268       if (bt_iter_next (bt_ctf_get_iter (ctf_iter)) < 0)
1269         break;
1270     }
1271
1272   /* Restore the position.  */
1273   bt_iter_set_pos (bt_ctf_get_iter (ctf_iter), pos);
1274
1275   if (event != NULL)
1276     {
1277       const struct bt_definition *scope
1278         = bt_ctf_get_top_level_scope (event,
1279                                       BT_EVENT_FIELDS);
1280       const struct bt_definition *array
1281         = bt_ctf_get_field (event, scope, "contents");
1282
1283       regs = bt_ctf_get_char_array (array);
1284       /* Assume the block is laid out in GDB register number order,
1285          each register with the size that it has in GDB.  */
1286       offset = 0;
1287       for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
1288         {
1289           regsize = register_size (gdbarch, regn);
1290           /* Make sure we stay within block bounds.  */
1291           if (offset + regsize >= trace_regblock_size)
1292             break;
1293           if (regcache_register_status (regcache, regn) == REG_UNKNOWN)
1294             {
1295               if (regno == regn)
1296                 {
1297                   regcache_raw_supply (regcache, regno, regs + offset);
1298                   break;
1299                 }
1300               else if (regno == -1)
1301                 {
1302                   regcache_raw_supply (regcache, regn, regs + offset);
1303                 }
1304             }
1305           offset += regsize;
1306         }
1307       return;
1308     }
1309
1310   regs = alloca (trace_regblock_size);
1311
1312   /* We get here if no register data has been found.  Mark registers
1313      as unavailable.  */
1314   for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
1315     regcache_raw_supply (regcache, regn, NULL);
1316
1317   /* We can often usefully guess that the PC is going to be the same
1318      as the address of the tracepoint.  */
1319   pc_regno = gdbarch_pc_regnum (gdbarch);
1320   if (pc_regno >= 0 && (regno == -1 || regno == pc_regno))
1321     {
1322       struct tracepoint *tp = get_tracepoint (get_tracepoint_number ());
1323
1324       if (tp != NULL && tp->base.loc)
1325         {
1326           /* But don't try to guess if tracepoint is multi-location...  */
1327           if (tp->base.loc->next != NULL)
1328             {
1329               warning (_("Tracepoint %d has multiple "
1330                          "locations, cannot infer $pc"),
1331                        tp->base.number);
1332               return;
1333             }
1334           /* ... or does while-stepping.  */
1335           if (tp->step_count > 0)
1336             {
1337               warning (_("Tracepoint %d does while-stepping, "
1338                          "cannot infer $pc"),
1339                        tp->base.number);
1340               return;
1341             }
1342
1343           store_unsigned_integer (regs, register_size (gdbarch, pc_regno),
1344                                   gdbarch_byte_order (gdbarch),
1345                                   tp->base.loc->address);
1346           regcache_raw_supply (regcache, pc_regno, regs);
1347         }
1348     }
1349 }
1350
1351 /* This is the implementation of target_ops method to_xfer_partial.
1352    Iterate over events whose name is "memory" in
1353    current frame, extract the address and length from events.  If
1354    OFFSET is within the range, read the contents from events to
1355    READBUF.  */
1356
1357 static LONGEST
1358 ctf_xfer_partial (struct target_ops *ops, enum target_object object,
1359                   const char *annex, gdb_byte *readbuf,
1360                   const gdb_byte *writebuf, ULONGEST offset,
1361                   LONGEST len)
1362 {
1363   /* We're only doing regular memory for now.  */
1364   if (object != TARGET_OBJECT_MEMORY)
1365     return -1;
1366
1367   if (readbuf == NULL)
1368     error (_("ctf_xfer_partial: trace file is read-only"));
1369
1370   if (get_traceframe_number () != -1)
1371     {
1372       struct bt_iter_pos *pos;
1373       int i = 0;
1374
1375       gdb_assert (ctf_iter != NULL);
1376       /* Save the current position.  */
1377       pos = bt_iter_get_pos (bt_ctf_get_iter (ctf_iter));
1378       gdb_assert (pos->type == BT_SEEK_RESTORE);
1379
1380       /* Iterate through the traceframe's blocks, looking for
1381          memory.  */
1382       while (1)
1383         {
1384           ULONGEST amt;
1385           uint64_t maddr;
1386           uint16_t mlen;
1387           enum bfd_endian byte_order
1388             = gdbarch_byte_order (target_gdbarch ());
1389           const struct bt_definition *scope;
1390           const struct bt_definition *def;
1391           struct bt_ctf_event *event
1392             = bt_ctf_iter_read_event (ctf_iter);
1393           const char *name = bt_ctf_event_name (event);
1394
1395           if (strcmp (name, "frame") == 0)
1396             break;
1397           else if (strcmp (name, "memory") != 0)
1398             {
1399               if (bt_iter_next (bt_ctf_get_iter (ctf_iter)) < 0)
1400                 break;
1401
1402               continue;
1403             }
1404
1405           scope = bt_ctf_get_top_level_scope (event,
1406                                               BT_EVENT_FIELDS);
1407
1408           def = bt_ctf_get_field (event, scope, "address");
1409           maddr = bt_ctf_get_uint64 (def);
1410           def = bt_ctf_get_field (event, scope, "length");
1411           mlen = (uint16_t) bt_ctf_get_uint64 (def);
1412
1413           /* If the block includes the first part of the desired
1414              range, return as much it has; GDB will re-request the
1415              remainder, which might be in a different block of this
1416              trace frame.  */
1417           if (maddr <= offset && offset < (maddr + mlen))
1418             {
1419               const struct bt_definition *array
1420                 = bt_ctf_get_field (event, scope, "contents");
1421               const struct bt_declaration *decl
1422                 = bt_ctf_get_decl_from_def (array);
1423               gdb_byte *contents;
1424               int k;
1425
1426               contents = xmalloc (mlen);
1427
1428               for (k = 0; k < mlen; k++)
1429                 {
1430                   const struct bt_definition *element
1431                     = bt_ctf_get_index (event, array, k);
1432
1433                   contents[k] = (gdb_byte) bt_ctf_get_uint64 (element);
1434                 }
1435
1436               amt = (maddr + mlen) - offset;
1437               if (amt > len)
1438                 amt = len;
1439
1440               memcpy (readbuf, &contents[offset - maddr], amt);
1441
1442               xfree (contents);
1443
1444               /* Restore the position.  */
1445               bt_iter_set_pos (bt_ctf_get_iter (ctf_iter), pos);
1446
1447               return amt;
1448             }
1449
1450           if (bt_iter_next (bt_ctf_get_iter (ctf_iter)) < 0)
1451             break;
1452         }
1453
1454       /* Restore the position.  */
1455       bt_iter_set_pos (bt_ctf_get_iter (ctf_iter), pos);
1456     }
1457
1458   /* It's unduly pedantic to refuse to look at the executable for
1459      read-only pieces; so do the equivalent of readonly regions aka
1460      QTro packet.  */
1461   if (exec_bfd != NULL)
1462     {
1463       asection *s;
1464       bfd_size_type size;
1465       bfd_vma vma;
1466
1467       for (s = exec_bfd->sections; s; s = s->next)
1468         {
1469           if ((s->flags & SEC_LOAD) == 0
1470               || (s->flags & SEC_READONLY) == 0)
1471             continue;
1472
1473           vma = s->vma;
1474           size = bfd_get_section_size (s);
1475           if (vma <= offset && offset < (vma + size))
1476             {
1477               ULONGEST amt;
1478
1479               amt = (vma + size) - offset;
1480               if (amt > len)
1481                 amt = len;
1482
1483               amt = bfd_get_section_contents (exec_bfd, s,
1484                                               readbuf, offset - vma, amt);
1485               return amt;
1486             }
1487         }
1488     }
1489
1490   /* Indicate failure to find the requested memory block.  */
1491   return -1;
1492 }
1493
1494 /* This is the implementation of target_ops method
1495    to_get_trace_state_variable_value.
1496    Iterate over events whose name is "tsv" in current frame.  When the
1497    trace variable is found, set the value of it to *VAL and return
1498    true, otherwise return false.  */
1499
1500 static int
1501 ctf_get_trace_state_variable_value (int tsvnum, LONGEST *val)
1502 {
1503   struct bt_iter_pos *pos;
1504   int found = 0;
1505
1506   gdb_assert (ctf_iter != NULL);
1507   /* Save the current position.  */
1508   pos = bt_iter_get_pos (bt_ctf_get_iter (ctf_iter));
1509   gdb_assert (pos->type == BT_SEEK_RESTORE);
1510
1511   /* Iterate through the traceframe's blocks, looking for 'V'
1512      block.  */
1513   while (1)
1514     {
1515       struct bt_ctf_event *event
1516         = bt_ctf_iter_read_event (ctf_iter);
1517       const char *name = bt_ctf_event_name (event);
1518
1519       if (name == NULL || strcmp (name, "frame") == 0)
1520         break;
1521       else if (strcmp (name, "tsv") == 0)
1522         {
1523           const struct bt_definition *scope;
1524           const struct bt_definition *def;
1525
1526           scope = bt_ctf_get_top_level_scope (event,
1527                                               BT_EVENT_FIELDS);
1528
1529           def = bt_ctf_get_field (event, scope, "num");
1530           if (tsvnum == (int32_t) bt_ctf_get_uint64 (def))
1531             {
1532               def = bt_ctf_get_field (event, scope, "val");
1533               *val = bt_ctf_get_uint64 (def);
1534
1535               found = 1;
1536             }
1537         }
1538
1539       if (bt_iter_next (bt_ctf_get_iter (ctf_iter)) < 0)
1540         break;
1541     }
1542
1543   /* Restore the position.  */
1544   bt_iter_set_pos (bt_ctf_get_iter (ctf_iter), pos);
1545
1546   return found;
1547 }
1548
1549 /* Return the tracepoint number in "frame" event.  */
1550
1551 static int
1552 ctf_get_tpnum_from_frame_event (struct bt_ctf_event *event)
1553 {
1554   /* The packet context of events has a field "tpnum".  */
1555   const struct bt_definition *scope
1556     = bt_ctf_get_top_level_scope (event, BT_STREAM_PACKET_CONTEXT);
1557   uint64_t tpnum
1558     = bt_ctf_get_uint64 (bt_ctf_get_field (event, scope, "tpnum"));
1559
1560   return (int) tpnum;
1561 }
1562
1563 /* Return the address at which the current frame was collected.  */
1564
1565 static CORE_ADDR
1566 ctf_get_traceframe_address (void)
1567 {
1568   struct bt_ctf_event *event = NULL;
1569   struct bt_iter_pos *pos;
1570   CORE_ADDR addr = 0;
1571
1572   gdb_assert (ctf_iter != NULL);
1573   pos  = bt_iter_get_pos (bt_ctf_get_iter (ctf_iter));
1574   gdb_assert (pos->type == BT_SEEK_RESTORE);
1575
1576   while (1)
1577     {
1578       const char *name;
1579       struct bt_ctf_event *event1;
1580
1581       event1 = bt_ctf_iter_read_event (ctf_iter);
1582
1583       name = bt_ctf_event_name (event1);
1584
1585       if (name == NULL)
1586         break;
1587       else if (strcmp (name, "frame") == 0)
1588         {
1589           event = event1;
1590           break;
1591         }
1592
1593       if (bt_iter_next (bt_ctf_get_iter (ctf_iter)) < 0)
1594         break;
1595     }
1596
1597   if (event != NULL)
1598     {
1599       int tpnum = ctf_get_tpnum_from_frame_event (event);
1600       struct tracepoint *tp
1601         = get_tracepoint_by_number_on_target (tpnum);
1602
1603       if (tp && tp->base.loc)
1604         addr = tp->base.loc->address;
1605     }
1606
1607   /* Restore the position.  */
1608   bt_iter_set_pos (bt_ctf_get_iter (ctf_iter), pos);
1609
1610   return addr;
1611 }
1612
1613 /* This is the implementation of target_ops method to_trace_find.
1614    Iterate the events whose name is "frame", extract the tracepoint
1615    number in it.  Return traceframe number when matched.  */
1616
1617 static int
1618 ctf_trace_find (enum trace_find_type type, int num,
1619                 CORE_ADDR addr1, CORE_ADDR addr2, int *tpp)
1620 {
1621   int ret = -1;
1622   int tfnum = 0;
1623   int found = 0;
1624   struct bt_iter_pos pos;
1625
1626   if (num == -1)
1627     {
1628       if (tpp != NULL)
1629         *tpp = -1;
1630       return -1;
1631     }
1632
1633   gdb_assert (ctf_iter != NULL);
1634   /* Set iterator back to the start.  */
1635   bt_iter_set_pos (bt_ctf_get_iter (ctf_iter), start_pos);
1636
1637   while (1)
1638     {
1639       int id;
1640       struct bt_ctf_event *event;
1641       const char *name;
1642
1643       event = bt_ctf_iter_read_event (ctf_iter);
1644
1645       name = bt_ctf_event_name (event);
1646
1647       if (event == NULL || name == NULL)
1648         break;
1649
1650       if (strcmp (name, "frame") == 0)
1651         {
1652           CORE_ADDR tfaddr;
1653
1654           if (type == tfind_number)
1655             {
1656               /* Looking for a specific trace frame.  */
1657               if (tfnum == num)
1658                 found = 1;
1659             }
1660           else
1661             {
1662               /* Start from the _next_ trace frame.  */
1663               if (tfnum > get_traceframe_number ())
1664                 {
1665                   switch (type)
1666                     {
1667                     case tfind_tp:
1668                       {
1669                         struct tracepoint *tp = get_tracepoint (num);
1670
1671                         if (tp != NULL
1672                             && (tp->number_on_target
1673                                 == ctf_get_tpnum_from_frame_event (event)))
1674                           found = 1;
1675                         break;
1676                       }
1677                     case tfind_pc:
1678                       tfaddr = ctf_get_traceframe_address ();
1679                       if (tfaddr == addr1)
1680                         found = 1;
1681                       break;
1682                     case tfind_range:
1683                       tfaddr = ctf_get_traceframe_address ();
1684                       if (addr1 <= tfaddr && tfaddr <= addr2)
1685                         found = 1;
1686                       break;
1687                     case tfind_outside:
1688                       tfaddr = ctf_get_traceframe_address ();
1689                       if (!(addr1 <= tfaddr && tfaddr <= addr2))
1690                         found = 1;
1691                       break;
1692                     default:
1693                       internal_error (__FILE__, __LINE__, _("unknown tfind type"));
1694                     }
1695                 }
1696             }
1697           if (found)
1698             {
1699               if (tpp != NULL)
1700                 *tpp = ctf_get_tpnum_from_frame_event (event);
1701
1702               /* Skip the event "frame".  */
1703               bt_iter_next (bt_ctf_get_iter (ctf_iter));
1704
1705               return tfnum;
1706             }
1707           tfnum++;
1708         }
1709
1710       if (bt_iter_next (bt_ctf_get_iter (ctf_iter)) < 0)
1711         break;
1712     }
1713
1714   return -1;
1715 }
1716
1717 /* This is the implementation of target_ops method to_has_stack.
1718    The target has a stack when GDB has already selected one trace
1719    frame.  */
1720
1721 static int
1722 ctf_has_stack (struct target_ops *ops)
1723 {
1724   return get_traceframe_number () != -1;
1725 }
1726
1727 /* This is the implementation of target_ops method to_has_registers.
1728    The target has registers when GDB has already selected one trace
1729    frame.  */
1730
1731 static int
1732 ctf_has_registers (struct target_ops *ops)
1733 {
1734   return get_traceframe_number () != -1;
1735 }
1736
1737 /* This is the implementation of target_ops method to_traceframe_info.
1738    Iterate the events whose name is "memory", in current
1739    frame, extract memory range information, and return them in
1740    traceframe_info.  */
1741
1742 static struct traceframe_info *
1743 ctf_traceframe_info (void)
1744 {
1745   struct traceframe_info *info = XCNEW (struct traceframe_info);
1746   const char *name;
1747   struct bt_iter_pos *pos;
1748
1749   gdb_assert (ctf_iter != NULL);
1750   /* Save the current position.  */
1751   pos = bt_iter_get_pos (bt_ctf_get_iter (ctf_iter));
1752   gdb_assert (pos->type == BT_SEEK_RESTORE);
1753
1754   do
1755     {
1756       struct bt_ctf_event *event
1757         = bt_ctf_iter_read_event (ctf_iter);
1758
1759       name = bt_ctf_event_name (event);
1760
1761       if (name == NULL || strcmp (name, "register") == 0
1762           || strcmp (name, "frame") == 0)
1763         ;
1764       else if (strcmp (name, "memory") == 0)
1765         {
1766           const struct bt_definition *scope
1767             = bt_ctf_get_top_level_scope (event,
1768                                           BT_EVENT_FIELDS);
1769           const struct bt_definition *def;
1770           struct mem_range *r;
1771
1772           r = VEC_safe_push (mem_range_s, info->memory, NULL);
1773           def = bt_ctf_get_field (event, scope, "address");
1774           r->start = bt_ctf_get_uint64 (def);
1775
1776           def = bt_ctf_get_field (event, scope, "length");
1777           r->length = (uint16_t) bt_ctf_get_uint64 (def);
1778         }
1779       else
1780         {
1781           warning (_("Unhandled trace block type (%s) "
1782                      "while building trace frame info."),
1783                    name);
1784         }
1785
1786       if (bt_iter_next (bt_ctf_get_iter (ctf_iter)) < 0)
1787         break;
1788     }
1789   while (name != NULL && strcmp (name, "frame") != 0);
1790
1791   /* Restore the position.  */
1792   bt_iter_set_pos (bt_ctf_get_iter (ctf_iter), pos);
1793
1794   return info;
1795 }
1796
1797 /* This is the implementation of target_ops method to_get_trace_status.
1798    The trace status for a file is that tracing can never be run.  */
1799
1800 static int
1801 ctf_get_trace_status (struct trace_status *ts)
1802 {
1803   /* Other bits of trace status were collected as part of opening the
1804      trace files, so nothing to do here.  */
1805
1806   return -1;
1807 }
1808
1809 static void
1810 init_ctf_ops (void)
1811 {
1812   memset (&ctf_ops, 0, sizeof (ctf_ops));
1813
1814   ctf_ops.to_shortname = "ctf";
1815   ctf_ops.to_longname = "CTF file";
1816   ctf_ops.to_doc = "Use a CTF directory as a target.\n\
1817 Specify the filename of the CTF directory.";
1818   ctf_ops.to_open = ctf_open;
1819   ctf_ops.to_close = ctf_close;
1820   ctf_ops.to_fetch_registers = ctf_fetch_registers;
1821   ctf_ops.to_xfer_partial = ctf_xfer_partial;
1822   ctf_ops.to_files_info = ctf_files_info;
1823   ctf_ops.to_get_trace_status = ctf_get_trace_status;
1824   ctf_ops.to_trace_find = ctf_trace_find;
1825   ctf_ops.to_get_trace_state_variable_value
1826     = ctf_get_trace_state_variable_value;
1827   ctf_ops.to_stratum = process_stratum;
1828   ctf_ops.to_has_stack = ctf_has_stack;
1829   ctf_ops.to_has_registers = ctf_has_registers;
1830   ctf_ops.to_traceframe_info = ctf_traceframe_info;
1831   ctf_ops.to_magic = OPS_MAGIC;
1832 }
1833
1834 #endif
1835
1836 /* -Wmissing-prototypes */
1837
1838 extern initialize_file_ftype _initialize_ctf;
1839
1840 /* module initialization */
1841
1842 void
1843 _initialize_ctf (void)
1844 {
1845 #if HAVE_LIBBABELTRACE
1846   init_ctf_ops ();
1847
1848   add_target_with_completer (&ctf_ops, filename_completer);
1849 #endif
1850 }