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