Unused variable fixes related to conditional compilation
[external/binutils.git] / gdb / btrace.c
1 /* Branch trace support for GDB, the GNU debugger.
2
3    Copyright (C) 2013-2018 Free Software Foundation, Inc.
4
5    Contributed by Intel Corp. <markus.t.metzger@intel.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 "btrace.h"
24 #include "gdbthread.h"
25 #include "inferior.h"
26 #include "target.h"
27 #include "record.h"
28 #include "symtab.h"
29 #include "disasm.h"
30 #include "source.h"
31 #include "filenames.h"
32 #include "xml-support.h"
33 #include "regcache.h"
34 #include "rsp-low.h"
35 #include "gdbcmd.h"
36 #include "cli/cli-utils.h"
37
38 /* For maintenance commands.  */
39 #include "record-btrace.h"
40
41 #include <inttypes.h>
42 #include <ctype.h>
43 #include <algorithm>
44
45 /* Command lists for btrace maintenance commands.  */
46 static struct cmd_list_element *maint_btrace_cmdlist;
47 static struct cmd_list_element *maint_btrace_set_cmdlist;
48 static struct cmd_list_element *maint_btrace_show_cmdlist;
49 static struct cmd_list_element *maint_btrace_pt_set_cmdlist;
50 static struct cmd_list_element *maint_btrace_pt_show_cmdlist;
51
52 /* Control whether to skip PAD packets when computing the packet history.  */
53 static int maint_btrace_pt_skip_pad = 1;
54
55 static void btrace_add_pc (struct thread_info *tp);
56
57 /* Print a record debug message.  Use do ... while (0) to avoid ambiguities
58    when used in if statements.  */
59
60 #define DEBUG(msg, args...)                                             \
61   do                                                                    \
62     {                                                                   \
63       if (record_debug != 0)                                            \
64         fprintf_unfiltered (gdb_stdlog,                                 \
65                             "[btrace] " msg "\n", ##args);              \
66     }                                                                   \
67   while (0)
68
69 #define DEBUG_FTRACE(msg, args...) DEBUG ("[ftrace] " msg, ##args)
70
71 /* Return the function name of a recorded function segment for printing.
72    This function never returns NULL.  */
73
74 static const char *
75 ftrace_print_function_name (const struct btrace_function *bfun)
76 {
77   struct minimal_symbol *msym;
78   struct symbol *sym;
79
80   msym = bfun->msym;
81   sym = bfun->sym;
82
83   if (sym != NULL)
84     return SYMBOL_PRINT_NAME (sym);
85
86   if (msym != NULL)
87     return MSYMBOL_PRINT_NAME (msym);
88
89   return "<unknown>";
90 }
91
92 /* Return the file name of a recorded function segment for printing.
93    This function never returns NULL.  */
94
95 static const char *
96 ftrace_print_filename (const struct btrace_function *bfun)
97 {
98   struct symbol *sym;
99   const char *filename;
100
101   sym = bfun->sym;
102
103   if (sym != NULL)
104     filename = symtab_to_filename_for_display (symbol_symtab (sym));
105   else
106     filename = "<unknown>";
107
108   return filename;
109 }
110
111 /* Return a string representation of the address of an instruction.
112    This function never returns NULL.  */
113
114 static const char *
115 ftrace_print_insn_addr (const struct btrace_insn *insn)
116 {
117   if (insn == NULL)
118     return "<nil>";
119
120   return core_addr_to_string_nz (insn->pc);
121 }
122
123 /* Print an ftrace debug status message.  */
124
125 static void
126 ftrace_debug (const struct btrace_function *bfun, const char *prefix)
127 {
128   const char *fun, *file;
129   unsigned int ibegin, iend;
130   int level;
131
132   fun = ftrace_print_function_name (bfun);
133   file = ftrace_print_filename (bfun);
134   level = bfun->level;
135
136   ibegin = bfun->insn_offset;
137   iend = ibegin + bfun->insn.size ();
138
139   DEBUG_FTRACE ("%s: fun = %s, file = %s, level = %d, insn = [%u; %u)",
140                 prefix, fun, file, level, ibegin, iend);
141 }
142
143 /* Return the number of instructions in a given function call segment.  */
144
145 static unsigned int
146 ftrace_call_num_insn (const struct btrace_function* bfun)
147 {
148   if (bfun == NULL)
149     return 0;
150
151   /* A gap is always counted as one instruction.  */
152   if (bfun->errcode != 0)
153     return 1;
154
155   return bfun->insn.size ();
156 }
157
158 /* Return the function segment with the given NUMBER or NULL if no such segment
159    exists.  BTINFO is the branch trace information for the current thread.  */
160
161 static struct btrace_function *
162 ftrace_find_call_by_number (struct btrace_thread_info *btinfo,
163                             unsigned int number)
164 {
165   if (number == 0 || number > btinfo->functions.size ())
166     return NULL;
167
168   return &btinfo->functions[number - 1];
169 }
170
171 /* A const version of the function above.  */
172
173 static const struct btrace_function *
174 ftrace_find_call_by_number (const struct btrace_thread_info *btinfo,
175                             unsigned int number)
176 {
177   if (number == 0 || number > btinfo->functions.size ())
178     return NULL;
179
180   return &btinfo->functions[number - 1];
181 }
182
183 /* Return non-zero if BFUN does not match MFUN and FUN,
184    return zero otherwise.  */
185
186 static int
187 ftrace_function_switched (const struct btrace_function *bfun,
188                           const struct minimal_symbol *mfun,
189                           const struct symbol *fun)
190 {
191   struct minimal_symbol *msym;
192   struct symbol *sym;
193
194   msym = bfun->msym;
195   sym = bfun->sym;
196
197   /* If the minimal symbol changed, we certainly switched functions.  */
198   if (mfun != NULL && msym != NULL
199       && strcmp (MSYMBOL_LINKAGE_NAME (mfun), MSYMBOL_LINKAGE_NAME (msym)) != 0)
200     return 1;
201
202   /* If the symbol changed, we certainly switched functions.  */
203   if (fun != NULL && sym != NULL)
204     {
205       const char *bfname, *fname;
206
207       /* Check the function name.  */
208       if (strcmp (SYMBOL_LINKAGE_NAME (fun), SYMBOL_LINKAGE_NAME (sym)) != 0)
209         return 1;
210
211       /* Check the location of those functions, as well.  */
212       bfname = symtab_to_fullname (symbol_symtab (sym));
213       fname = symtab_to_fullname (symbol_symtab (fun));
214       if (filename_cmp (fname, bfname) != 0)
215         return 1;
216     }
217
218   /* If we lost symbol information, we switched functions.  */
219   if (!(msym == NULL && sym == NULL) && mfun == NULL && fun == NULL)
220     return 1;
221
222   /* If we gained symbol information, we switched functions.  */
223   if (msym == NULL && sym == NULL && !(mfun == NULL && fun == NULL))
224     return 1;
225
226   return 0;
227 }
228
229 /* Allocate and initialize a new branch trace function segment at the end of
230    the trace.
231    BTINFO is the branch trace information for the current thread.
232    MFUN and FUN are the symbol information we have for this function.
233    This invalidates all struct btrace_function pointer currently held.  */
234
235 static struct btrace_function *
236 ftrace_new_function (struct btrace_thread_info *btinfo,
237                      struct minimal_symbol *mfun,
238                      struct symbol *fun)
239 {
240   int level;
241   unsigned int number, insn_offset;
242
243   if (btinfo->functions.empty ())
244     {
245       /* Start counting NUMBER and INSN_OFFSET at one.  */
246       level = 0;
247       number = 1;
248       insn_offset = 1;
249     }
250   else
251     {
252       const struct btrace_function *prev = &btinfo->functions.back ();
253       level = prev->level;
254       number = prev->number + 1;
255       insn_offset = prev->insn_offset + ftrace_call_num_insn (prev);
256     }
257
258   btinfo->functions.emplace_back (mfun, fun, number, insn_offset, level);
259   return &btinfo->functions.back ();
260 }
261
262 /* Update the UP field of a function segment.  */
263
264 static void
265 ftrace_update_caller (struct btrace_function *bfun,
266                       struct btrace_function *caller,
267                       enum btrace_function_flag flags)
268 {
269   if (bfun->up != 0)
270     ftrace_debug (bfun, "updating caller");
271
272   bfun->up = caller->number;
273   bfun->flags = flags;
274
275   ftrace_debug (bfun, "set caller");
276   ftrace_debug (caller, "..to");
277 }
278
279 /* Fix up the caller for all segments of a function.  */
280
281 static void
282 ftrace_fixup_caller (struct btrace_thread_info *btinfo,
283                      struct btrace_function *bfun,
284                      struct btrace_function *caller,
285                      enum btrace_function_flag flags)
286 {
287   unsigned int prev, next;
288
289   prev = bfun->prev;
290   next = bfun->next;
291   ftrace_update_caller (bfun, caller, flags);
292
293   /* Update all function segments belonging to the same function.  */
294   for (; prev != 0; prev = bfun->prev)
295     {
296       bfun = ftrace_find_call_by_number (btinfo, prev);
297       ftrace_update_caller (bfun, caller, flags);
298     }
299
300   for (; next != 0; next = bfun->next)
301     {
302       bfun = ftrace_find_call_by_number (btinfo, next);
303       ftrace_update_caller (bfun, caller, flags);
304     }
305 }
306
307 /* Add a new function segment for a call at the end of the trace.
308    BTINFO is the branch trace information for the current thread.
309    MFUN and FUN are the symbol information we have for this function.  */
310
311 static struct btrace_function *
312 ftrace_new_call (struct btrace_thread_info *btinfo,
313                  struct minimal_symbol *mfun,
314                  struct symbol *fun)
315 {
316   const unsigned int length = btinfo->functions.size ();
317   struct btrace_function *bfun = ftrace_new_function (btinfo, mfun, fun);
318
319   bfun->up = length;
320   bfun->level += 1;
321
322   ftrace_debug (bfun, "new call");
323
324   return bfun;
325 }
326
327 /* Add a new function segment for a tail call at the end of the trace.
328    BTINFO is the branch trace information for the current thread.
329    MFUN and FUN are the symbol information we have for this function.  */
330
331 static struct btrace_function *
332 ftrace_new_tailcall (struct btrace_thread_info *btinfo,
333                      struct minimal_symbol *mfun,
334                      struct symbol *fun)
335 {
336   const unsigned int length = btinfo->functions.size ();
337   struct btrace_function *bfun = ftrace_new_function (btinfo, mfun, fun);
338
339   bfun->up = length;
340   bfun->level += 1;
341   bfun->flags |= BFUN_UP_LINKS_TO_TAILCALL;
342
343   ftrace_debug (bfun, "new tail call");
344
345   return bfun;
346 }
347
348 /* Return the caller of BFUN or NULL if there is none.  This function skips
349    tail calls in the call chain.  BTINFO is the branch trace information for
350    the current thread.  */
351 static struct btrace_function *
352 ftrace_get_caller (struct btrace_thread_info *btinfo,
353                    struct btrace_function *bfun)
354 {
355   for (; bfun != NULL; bfun = ftrace_find_call_by_number (btinfo, bfun->up))
356     if ((bfun->flags & BFUN_UP_LINKS_TO_TAILCALL) == 0)
357       return ftrace_find_call_by_number (btinfo, bfun->up);
358
359   return NULL;
360 }
361
362 /* Find the innermost caller in the back trace of BFUN with MFUN/FUN
363    symbol information.  BTINFO is the branch trace information for the current
364    thread.  */
365
366 static struct btrace_function *
367 ftrace_find_caller (struct btrace_thread_info *btinfo,
368                     struct btrace_function *bfun,
369                     struct minimal_symbol *mfun,
370                     struct symbol *fun)
371 {
372   for (; bfun != NULL; bfun = ftrace_find_call_by_number (btinfo, bfun->up))
373     {
374       /* Skip functions with incompatible symbol information.  */
375       if (ftrace_function_switched (bfun, mfun, fun))
376         continue;
377
378       /* This is the function segment we're looking for.  */
379       break;
380     }
381
382   return bfun;
383 }
384
385 /* Find the innermost caller in the back trace of BFUN, skipping all
386    function segments that do not end with a call instruction (e.g.
387    tail calls ending with a jump).  BTINFO is the branch trace information for
388    the current thread.  */
389
390 static struct btrace_function *
391 ftrace_find_call (struct btrace_thread_info *btinfo,
392                   struct btrace_function *bfun)
393 {
394   for (; bfun != NULL; bfun = ftrace_find_call_by_number (btinfo, bfun->up))
395     {
396       /* Skip gaps.  */
397       if (bfun->errcode != 0)
398         continue;
399
400       btrace_insn &last = bfun->insn.back ();
401
402       if (last.iclass == BTRACE_INSN_CALL)
403         break;
404     }
405
406   return bfun;
407 }
408
409 /* Add a continuation segment for a function into which we return at the end of
410    the trace.
411    BTINFO is the branch trace information for the current thread.
412    MFUN and FUN are the symbol information we have for this function.  */
413
414 static struct btrace_function *
415 ftrace_new_return (struct btrace_thread_info *btinfo,
416                    struct minimal_symbol *mfun,
417                    struct symbol *fun)
418 {
419   struct btrace_function *prev, *bfun, *caller;
420
421   bfun = ftrace_new_function (btinfo, mfun, fun);
422   prev = ftrace_find_call_by_number (btinfo, bfun->number - 1);
423
424   /* It is important to start at PREV's caller.  Otherwise, we might find
425      PREV itself, if PREV is a recursive function.  */
426   caller = ftrace_find_call_by_number (btinfo, prev->up);
427   caller = ftrace_find_caller (btinfo, caller, mfun, fun);
428   if (caller != NULL)
429     {
430       /* The caller of PREV is the preceding btrace function segment in this
431          function instance.  */
432       gdb_assert (caller->next == 0);
433
434       caller->next = bfun->number;
435       bfun->prev = caller->number;
436
437       /* Maintain the function level.  */
438       bfun->level = caller->level;
439
440       /* Maintain the call stack.  */
441       bfun->up = caller->up;
442       bfun->flags = caller->flags;
443
444       ftrace_debug (bfun, "new return");
445     }
446   else
447     {
448       /* We did not find a caller.  This could mean that something went
449          wrong or that the call is simply not included in the trace.  */
450
451       /* Let's search for some actual call.  */
452       caller = ftrace_find_call_by_number (btinfo, prev->up);
453       caller = ftrace_find_call (btinfo, caller);
454       if (caller == NULL)
455         {
456           /* There is no call in PREV's back trace.  We assume that the
457              branch trace did not include it.  */
458
459           /* Let's find the topmost function and add a new caller for it.
460              This should handle a series of initial tail calls.  */
461           while (prev->up != 0)
462             prev = ftrace_find_call_by_number (btinfo, prev->up);
463
464           bfun->level = prev->level - 1;
465
466           /* Fix up the call stack for PREV.  */
467           ftrace_fixup_caller (btinfo, prev, bfun, BFUN_UP_LINKS_TO_RET);
468
469           ftrace_debug (bfun, "new return - no caller");
470         }
471       else
472         {
473           /* There is a call in PREV's back trace to which we should have
474              returned but didn't.  Let's start a new, separate back trace
475              from PREV's level.  */
476           bfun->level = prev->level - 1;
477
478           /* We fix up the back trace for PREV but leave other function segments
479              on the same level as they are.
480              This should handle things like schedule () correctly where we're
481              switching contexts.  */
482           prev->up = bfun->number;
483           prev->flags = BFUN_UP_LINKS_TO_RET;
484
485           ftrace_debug (bfun, "new return - unknown caller");
486         }
487     }
488
489   return bfun;
490 }
491
492 /* Add a new function segment for a function switch at the end of the trace.
493    BTINFO is the branch trace information for the current thread.
494    MFUN and FUN are the symbol information we have for this function.  */
495
496 static struct btrace_function *
497 ftrace_new_switch (struct btrace_thread_info *btinfo,
498                    struct minimal_symbol *mfun,
499                    struct symbol *fun)
500 {
501   struct btrace_function *prev, *bfun;
502
503   /* This is an unexplained function switch.  We can't really be sure about the
504      call stack, yet the best I can think of right now is to preserve it.  */
505   bfun = ftrace_new_function (btinfo, mfun, fun);
506   prev = ftrace_find_call_by_number (btinfo, bfun->number - 1);
507   bfun->up = prev->up;
508   bfun->flags = prev->flags;
509
510   ftrace_debug (bfun, "new switch");
511
512   return bfun;
513 }
514
515 /* Add a new function segment for a gap in the trace due to a decode error at
516    the end of the trace.
517    BTINFO is the branch trace information for the current thread.
518    ERRCODE is the format-specific error code.  */
519
520 static struct btrace_function *
521 ftrace_new_gap (struct btrace_thread_info *btinfo, int errcode,
522                 std::vector<unsigned int> &gaps)
523 {
524   struct btrace_function *bfun;
525
526   if (btinfo->functions.empty ())
527     bfun = ftrace_new_function (btinfo, NULL, NULL);
528   else
529     {
530       /* We hijack the previous function segment if it was empty.  */
531       bfun = &btinfo->functions.back ();
532       if (bfun->errcode != 0 || !bfun->insn.empty ())
533         bfun = ftrace_new_function (btinfo, NULL, NULL);
534     }
535
536   bfun->errcode = errcode;
537   gaps.push_back (bfun->number);
538
539   ftrace_debug (bfun, "new gap");
540
541   return bfun;
542 }
543
544 /* Update the current function segment at the end of the trace in BTINFO with
545    respect to the instruction at PC.  This may create new function segments.
546    Return the chronologically latest function segment, never NULL.  */
547
548 static struct btrace_function *
549 ftrace_update_function (struct btrace_thread_info *btinfo, CORE_ADDR pc)
550 {
551   struct bound_minimal_symbol bmfun;
552   struct minimal_symbol *mfun;
553   struct symbol *fun;
554   struct btrace_function *bfun;
555
556   /* Try to determine the function we're in.  We use both types of symbols
557      to avoid surprises when we sometimes get a full symbol and sometimes
558      only a minimal symbol.  */
559   fun = find_pc_function (pc);
560   bmfun = lookup_minimal_symbol_by_pc (pc);
561   mfun = bmfun.minsym;
562
563   if (fun == NULL && mfun == NULL)
564     DEBUG_FTRACE ("no symbol at %s", core_addr_to_string_nz (pc));
565
566   /* If we didn't have a function, we create one.  */
567   if (btinfo->functions.empty ())
568     return ftrace_new_function (btinfo, mfun, fun);
569
570   /* If we had a gap before, we create a function.  */
571   bfun = &btinfo->functions.back ();
572   if (bfun->errcode != 0)
573     return ftrace_new_function (btinfo, mfun, fun);
574
575   /* Check the last instruction, if we have one.
576      We do this check first, since it allows us to fill in the call stack
577      links in addition to the normal flow links.  */
578   btrace_insn *last = NULL;
579   if (!bfun->insn.empty ())
580     last = &bfun->insn.back ();
581
582   if (last != NULL)
583     {
584       switch (last->iclass)
585         {
586         case BTRACE_INSN_RETURN:
587           {
588             const char *fname;
589
590             /* On some systems, _dl_runtime_resolve returns to the resolved
591                function instead of jumping to it.  From our perspective,
592                however, this is a tailcall.
593                If we treated it as return, we wouldn't be able to find the
594                resolved function in our stack back trace.  Hence, we would
595                lose the current stack back trace and start anew with an empty
596                back trace.  When the resolved function returns, we would then
597                create a stack back trace with the same function names but
598                different frame id's.  This will confuse stepping.  */
599             fname = ftrace_print_function_name (bfun);
600             if (strcmp (fname, "_dl_runtime_resolve") == 0)
601               return ftrace_new_tailcall (btinfo, mfun, fun);
602
603             return ftrace_new_return (btinfo, mfun, fun);
604           }
605
606         case BTRACE_INSN_CALL:
607           /* Ignore calls to the next instruction.  They are used for PIC.  */
608           if (last->pc + last->size == pc)
609             break;
610
611           return ftrace_new_call (btinfo, mfun, fun);
612
613         case BTRACE_INSN_JUMP:
614           {
615             CORE_ADDR start;
616
617             start = get_pc_function_start (pc);
618
619             /* A jump to the start of a function is (typically) a tail call.  */
620             if (start == pc)
621               return ftrace_new_tailcall (btinfo, mfun, fun);
622
623             /* If we can't determine the function for PC, we treat a jump at
624                the end of the block as tail call if we're switching functions
625                and as an intra-function branch if we don't.  */
626             if (start == 0 && ftrace_function_switched (bfun, mfun, fun))
627               return ftrace_new_tailcall (btinfo, mfun, fun);
628
629             break;
630           }
631         }
632     }
633
634   /* Check if we're switching functions for some other reason.  */
635   if (ftrace_function_switched (bfun, mfun, fun))
636     {
637       DEBUG_FTRACE ("switching from %s in %s at %s",
638                     ftrace_print_insn_addr (last),
639                     ftrace_print_function_name (bfun),
640                     ftrace_print_filename (bfun));
641
642       return ftrace_new_switch (btinfo, mfun, fun);
643     }
644
645   return bfun;
646 }
647
648 /* Add the instruction at PC to BFUN's instructions.  */
649
650 static void
651 ftrace_update_insns (struct btrace_function *bfun, const btrace_insn &insn)
652 {
653   bfun->insn.push_back (insn);
654
655   if (record_debug > 1)
656     ftrace_debug (bfun, "update insn");
657 }
658
659 /* Classify the instruction at PC.  */
660
661 static enum btrace_insn_class
662 ftrace_classify_insn (struct gdbarch *gdbarch, CORE_ADDR pc)
663 {
664   enum btrace_insn_class iclass;
665
666   iclass = BTRACE_INSN_OTHER;
667   TRY
668     {
669       if (gdbarch_insn_is_call (gdbarch, pc))
670         iclass = BTRACE_INSN_CALL;
671       else if (gdbarch_insn_is_ret (gdbarch, pc))
672         iclass = BTRACE_INSN_RETURN;
673       else if (gdbarch_insn_is_jump (gdbarch, pc))
674         iclass = BTRACE_INSN_JUMP;
675     }
676   CATCH (error, RETURN_MASK_ERROR)
677     {
678     }
679   END_CATCH
680
681   return iclass;
682 }
683
684 /* Try to match the back trace at LHS to the back trace at RHS.  Returns the
685    number of matching function segments or zero if the back traces do not
686    match.  BTINFO is the branch trace information for the current thread.  */
687
688 static int
689 ftrace_match_backtrace (struct btrace_thread_info *btinfo,
690                         struct btrace_function *lhs,
691                         struct btrace_function *rhs)
692 {
693   int matches;
694
695   for (matches = 0; lhs != NULL && rhs != NULL; ++matches)
696     {
697       if (ftrace_function_switched (lhs, rhs->msym, rhs->sym))
698         return 0;
699
700       lhs = ftrace_get_caller (btinfo, lhs);
701       rhs = ftrace_get_caller (btinfo, rhs);
702     }
703
704   return matches;
705 }
706
707 /* Add ADJUSTMENT to the level of BFUN and succeeding function segments.
708    BTINFO is the branch trace information for the current thread.  */
709
710 static void
711 ftrace_fixup_level (struct btrace_thread_info *btinfo,
712                     struct btrace_function *bfun, int adjustment)
713 {
714   if (adjustment == 0)
715     return;
716
717   DEBUG_FTRACE ("fixup level (%+d)", adjustment);
718   ftrace_debug (bfun, "..bfun");
719
720   while (bfun != NULL)
721     {
722       bfun->level += adjustment;
723       bfun = ftrace_find_call_by_number (btinfo, bfun->number + 1);
724     }
725 }
726
727 /* Recompute the global level offset.  Traverse the function trace and compute
728    the global level offset as the negative of the minimal function level.  */
729
730 static void
731 ftrace_compute_global_level_offset (struct btrace_thread_info *btinfo)
732 {
733   int level = INT_MAX;
734
735   if (btinfo == NULL)
736     return;
737
738   if (btinfo->functions.empty ())
739     return;
740
741   unsigned int length = btinfo->functions.size() - 1;
742   for (unsigned int i = 0; i < length; ++i)
743     level = std::min (level, btinfo->functions[i].level);
744
745   /* The last function segment contains the current instruction, which is not
746      really part of the trace.  If it contains just this one instruction, we
747      ignore the segment.  */
748   struct btrace_function *last = &btinfo->functions.back();
749   if (last->insn.size () != 1)
750     level = std::min (level, last->level);
751
752   DEBUG_FTRACE ("setting global level offset: %d", -level);
753   btinfo->level = -level;
754 }
755
756 /* Connect the function segments PREV and NEXT in a bottom-to-top walk as in
757    ftrace_connect_backtrace.  BTINFO is the branch trace information for the
758    current thread.  */
759
760 static void
761 ftrace_connect_bfun (struct btrace_thread_info *btinfo,
762                      struct btrace_function *prev,
763                      struct btrace_function *next)
764 {
765   DEBUG_FTRACE ("connecting...");
766   ftrace_debug (prev, "..prev");
767   ftrace_debug (next, "..next");
768
769   /* The function segments are not yet connected.  */
770   gdb_assert (prev->next == 0);
771   gdb_assert (next->prev == 0);
772
773   prev->next = next->number;
774   next->prev = prev->number;
775
776   /* We may have moved NEXT to a different function level.  */
777   ftrace_fixup_level (btinfo, next, prev->level - next->level);
778
779   /* If we run out of back trace for one, let's use the other's.  */
780   if (prev->up == 0)
781     {
782       const btrace_function_flags flags = next->flags;
783
784       next = ftrace_find_call_by_number (btinfo, next->up);
785       if (next != NULL)
786         {
787           DEBUG_FTRACE ("using next's callers");
788           ftrace_fixup_caller (btinfo, prev, next, flags);
789         }
790     }
791   else if (next->up == 0)
792     {
793       const btrace_function_flags flags = prev->flags;
794
795       prev = ftrace_find_call_by_number (btinfo, prev->up);
796       if (prev != NULL)
797         {
798           DEBUG_FTRACE ("using prev's callers");
799           ftrace_fixup_caller (btinfo, next, prev, flags);
800         }
801     }
802   else
803     {
804       /* PREV may have a tailcall caller, NEXT can't.  If it does, fixup the up
805          link to add the tail callers to NEXT's back trace.
806
807          This removes NEXT->UP from NEXT's back trace.  It will be added back
808          when connecting NEXT and PREV's callers - provided they exist.
809
810          If PREV's back trace consists of a series of tail calls without an
811          actual call, there will be no further connection and NEXT's caller will
812          be removed for good.  To catch this case, we handle it here and connect
813          the top of PREV's back trace to NEXT's caller.  */
814       if ((prev->flags & BFUN_UP_LINKS_TO_TAILCALL) != 0)
815         {
816           struct btrace_function *caller;
817           btrace_function_flags next_flags, prev_flags;
818
819           /* We checked NEXT->UP above so CALLER can't be NULL.  */
820           caller = ftrace_find_call_by_number (btinfo, next->up);
821           next_flags = next->flags;
822           prev_flags = prev->flags;
823
824           DEBUG_FTRACE ("adding prev's tail calls to next");
825
826           prev = ftrace_find_call_by_number (btinfo, prev->up);
827           ftrace_fixup_caller (btinfo, next, prev, prev_flags);
828
829           for (; prev != NULL; prev = ftrace_find_call_by_number (btinfo,
830                                                                   prev->up))
831             {
832               /* At the end of PREV's back trace, continue with CALLER.  */
833               if (prev->up == 0)
834                 {
835                   DEBUG_FTRACE ("fixing up link for tailcall chain");
836                   ftrace_debug (prev, "..top");
837                   ftrace_debug (caller, "..up");
838
839                   ftrace_fixup_caller (btinfo, prev, caller, next_flags);
840
841                   /* If we skipped any tail calls, this may move CALLER to a
842                      different function level.
843
844                      Note that changing CALLER's level is only OK because we
845                      know that this is the last iteration of the bottom-to-top
846                      walk in ftrace_connect_backtrace.
847
848                      Otherwise we will fix up CALLER's level when we connect it
849                      to PREV's caller in the next iteration.  */
850                   ftrace_fixup_level (btinfo, caller,
851                                       prev->level - caller->level - 1);
852                   break;
853                 }
854
855               /* There's nothing to do if we find a real call.  */
856               if ((prev->flags & BFUN_UP_LINKS_TO_TAILCALL) == 0)
857                 {
858                   DEBUG_FTRACE ("will fix up link in next iteration");
859                   break;
860                 }
861             }
862         }
863     }
864 }
865
866 /* Connect function segments on the same level in the back trace at LHS and RHS.
867    The back traces at LHS and RHS are expected to match according to
868    ftrace_match_backtrace.  BTINFO is the branch trace information for the
869    current thread.  */
870
871 static void
872 ftrace_connect_backtrace (struct btrace_thread_info *btinfo,
873                           struct btrace_function *lhs,
874                           struct btrace_function *rhs)
875 {
876   while (lhs != NULL && rhs != NULL)
877     {
878       struct btrace_function *prev, *next;
879
880       gdb_assert (!ftrace_function_switched (lhs, rhs->msym, rhs->sym));
881
882       /* Connecting LHS and RHS may change the up link.  */
883       prev = lhs;
884       next = rhs;
885
886       lhs = ftrace_get_caller (btinfo, lhs);
887       rhs = ftrace_get_caller (btinfo, rhs);
888
889       ftrace_connect_bfun (btinfo, prev, next);
890     }
891 }
892
893 /* Bridge the gap between two function segments left and right of a gap if their
894    respective back traces match in at least MIN_MATCHES functions.  BTINFO is
895    the branch trace information for the current thread.
896
897    Returns non-zero if the gap could be bridged, zero otherwise.  */
898
899 static int
900 ftrace_bridge_gap (struct btrace_thread_info *btinfo,
901                    struct btrace_function *lhs, struct btrace_function *rhs,
902                    int min_matches)
903 {
904   struct btrace_function *best_l, *best_r, *cand_l, *cand_r;
905   int best_matches;
906
907   DEBUG_FTRACE ("checking gap at insn %u (req matches: %d)",
908                 rhs->insn_offset - 1, min_matches);
909
910   best_matches = 0;
911   best_l = NULL;
912   best_r = NULL;
913
914   /* We search the back traces of LHS and RHS for valid connections and connect
915      the two functon segments that give the longest combined back trace.  */
916
917   for (cand_l = lhs; cand_l != NULL;
918        cand_l = ftrace_get_caller (btinfo, cand_l))
919     for (cand_r = rhs; cand_r != NULL;
920          cand_r = ftrace_get_caller (btinfo, cand_r))
921       {
922         int matches;
923
924         matches = ftrace_match_backtrace (btinfo, cand_l, cand_r);
925         if (best_matches < matches)
926           {
927             best_matches = matches;
928             best_l = cand_l;
929             best_r = cand_r;
930           }
931       }
932
933   /* We need at least MIN_MATCHES matches.  */
934   gdb_assert (min_matches > 0);
935   if (best_matches < min_matches)
936     return 0;
937
938   DEBUG_FTRACE ("..matches: %d", best_matches);
939
940   /* We will fix up the level of BEST_R and succeeding function segments such
941      that BEST_R's level matches BEST_L's when we connect BEST_L to BEST_R.
942
943      This will ignore the level of RHS and following if BEST_R != RHS.  I.e. if
944      BEST_R is a successor of RHS in the back trace of RHS (phases 1 and 3).
945
946      To catch this, we already fix up the level here where we can start at RHS
947      instead of at BEST_R.  We will ignore the level fixup when connecting
948      BEST_L to BEST_R as they will already be on the same level.  */
949   ftrace_fixup_level (btinfo, rhs, best_l->level - best_r->level);
950
951   ftrace_connect_backtrace (btinfo, best_l, best_r);
952
953   return best_matches;
954 }
955
956 /* Try to bridge gaps due to overflow or decode errors by connecting the
957    function segments that are separated by the gap.  */
958
959 static void
960 btrace_bridge_gaps (struct thread_info *tp, std::vector<unsigned int> &gaps)
961 {
962   struct btrace_thread_info *btinfo = &tp->btrace;
963   std::vector<unsigned int> remaining;
964   int min_matches;
965
966   DEBUG ("bridge gaps");
967
968   /* We require a minimum amount of matches for bridging a gap.  The number of
969      required matches will be lowered with each iteration.
970
971      The more matches the higher our confidence that the bridging is correct.
972      For big gaps or small traces, however, it may not be feasible to require a
973      high number of matches.  */
974   for (min_matches = 5; min_matches > 0; --min_matches)
975     {
976       /* Let's try to bridge as many gaps as we can.  In some cases, we need to
977          skip a gap and revisit it again after we closed later gaps.  */
978       while (!gaps.empty ())
979         {
980           for (const unsigned int number : gaps)
981             {
982               struct btrace_function *gap, *lhs, *rhs;
983               int bridged;
984
985               gap = ftrace_find_call_by_number (btinfo, number);
986
987               /* We may have a sequence of gaps if we run from one error into
988                  the next as we try to re-sync onto the trace stream.  Ignore
989                  all but the leftmost gap in such a sequence.
990
991                  Also ignore gaps at the beginning of the trace.  */
992               lhs = ftrace_find_call_by_number (btinfo, gap->number - 1);
993               if (lhs == NULL || lhs->errcode != 0)
994                 continue;
995
996               /* Skip gaps to the right.  */
997               rhs = ftrace_find_call_by_number (btinfo, gap->number + 1);
998               while (rhs != NULL && rhs->errcode != 0)
999                 rhs = ftrace_find_call_by_number (btinfo, rhs->number + 1);
1000
1001               /* Ignore gaps at the end of the trace.  */
1002               if (rhs == NULL)
1003                 continue;
1004
1005               bridged = ftrace_bridge_gap (btinfo, lhs, rhs, min_matches);
1006
1007               /* Keep track of gaps we were not able to bridge and try again.
1008                  If we just pushed them to the end of GAPS we would risk an
1009                  infinite loop in case we simply cannot bridge a gap.  */
1010               if (bridged == 0)
1011                 remaining.push_back (number);
1012             }
1013
1014           /* Let's see if we made any progress.  */
1015           if (remaining.size () == gaps.size ())
1016             break;
1017
1018           gaps.clear ();
1019           gaps.swap (remaining);
1020         }
1021
1022       /* We get here if either GAPS is empty or if GAPS equals REMAINING.  */
1023       if (gaps.empty ())
1024         break;
1025
1026       remaining.clear ();
1027     }
1028
1029   /* We may omit this in some cases.  Not sure it is worth the extra
1030      complication, though.  */
1031   ftrace_compute_global_level_offset (btinfo);
1032 }
1033
1034 /* Compute the function branch trace from BTS trace.  */
1035
1036 static void
1037 btrace_compute_ftrace_bts (struct thread_info *tp,
1038                            const struct btrace_data_bts *btrace,
1039                            std::vector<unsigned int> &gaps)
1040 {
1041   struct btrace_thread_info *btinfo;
1042   struct gdbarch *gdbarch;
1043   unsigned int blk;
1044   int level;
1045
1046   gdbarch = target_gdbarch ();
1047   btinfo = &tp->btrace;
1048   blk = VEC_length (btrace_block_s, btrace->blocks);
1049
1050   if (btinfo->functions.empty ())
1051     level = INT_MAX;
1052   else
1053     level = -btinfo->level;
1054
1055   while (blk != 0)
1056     {
1057       btrace_block_s *block;
1058       CORE_ADDR pc;
1059
1060       blk -= 1;
1061
1062       block = VEC_index (btrace_block_s, btrace->blocks, blk);
1063       pc = block->begin;
1064
1065       for (;;)
1066         {
1067           struct btrace_function *bfun;
1068           struct btrace_insn insn;
1069           int size;
1070
1071           /* We should hit the end of the block.  Warn if we went too far.  */
1072           if (block->end < pc)
1073             {
1074               /* Indicate the gap in the trace.  */
1075               bfun = ftrace_new_gap (btinfo, BDE_BTS_OVERFLOW, gaps);
1076
1077               warning (_("Recorded trace may be corrupted at instruction "
1078                          "%u (pc = %s)."), bfun->insn_offset - 1,
1079                        core_addr_to_string_nz (pc));
1080
1081               break;
1082             }
1083
1084           bfun = ftrace_update_function (btinfo, pc);
1085
1086           /* Maintain the function level offset.
1087              For all but the last block, we do it here.  */
1088           if (blk != 0)
1089             level = std::min (level, bfun->level);
1090
1091           size = 0;
1092           TRY
1093             {
1094               size = gdb_insn_length (gdbarch, pc);
1095             }
1096           CATCH (error, RETURN_MASK_ERROR)
1097             {
1098             }
1099           END_CATCH
1100
1101           insn.pc = pc;
1102           insn.size = size;
1103           insn.iclass = ftrace_classify_insn (gdbarch, pc);
1104           insn.flags = 0;
1105
1106           ftrace_update_insns (bfun, insn);
1107
1108           /* We're done once we pushed the instruction at the end.  */
1109           if (block->end == pc)
1110             break;
1111
1112           /* We can't continue if we fail to compute the size.  */
1113           if (size <= 0)
1114             {
1115               /* Indicate the gap in the trace.  We just added INSN so we're
1116                  not at the beginning.  */
1117               bfun = ftrace_new_gap (btinfo, BDE_BTS_INSN_SIZE, gaps);
1118
1119               warning (_("Recorded trace may be incomplete at instruction %u "
1120                          "(pc = %s)."), bfun->insn_offset - 1,
1121                        core_addr_to_string_nz (pc));
1122
1123               break;
1124             }
1125
1126           pc += size;
1127
1128           /* Maintain the function level offset.
1129              For the last block, we do it here to not consider the last
1130              instruction.
1131              Since the last instruction corresponds to the current instruction
1132              and is not really part of the execution history, it shouldn't
1133              affect the level.  */
1134           if (blk == 0)
1135             level = std::min (level, bfun->level);
1136         }
1137     }
1138
1139   /* LEVEL is the minimal function level of all btrace function segments.
1140      Define the global level offset to -LEVEL so all function levels are
1141      normalized to start at zero.  */
1142   btinfo->level = -level;
1143 }
1144
1145 #if defined (HAVE_LIBIPT)
1146
1147 static enum btrace_insn_class
1148 pt_reclassify_insn (enum pt_insn_class iclass)
1149 {
1150   switch (iclass)
1151     {
1152     case ptic_call:
1153       return BTRACE_INSN_CALL;
1154
1155     case ptic_return:
1156       return BTRACE_INSN_RETURN;
1157
1158     case ptic_jump:
1159       return BTRACE_INSN_JUMP;
1160
1161     default:
1162       return BTRACE_INSN_OTHER;
1163     }
1164 }
1165
1166 /* Return the btrace instruction flags for INSN.  */
1167
1168 static btrace_insn_flags
1169 pt_btrace_insn_flags (const struct pt_insn &insn)
1170 {
1171   btrace_insn_flags flags = 0;
1172
1173   if (insn.speculative)
1174     flags |= BTRACE_INSN_FLAG_SPECULATIVE;
1175
1176   return flags;
1177 }
1178
1179 /* Return the btrace instruction for INSN.  */
1180
1181 static btrace_insn
1182 pt_btrace_insn (const struct pt_insn &insn)
1183 {
1184   return {(CORE_ADDR) insn.ip, (gdb_byte) insn.size,
1185           pt_reclassify_insn (insn.iclass),
1186           pt_btrace_insn_flags (insn)};
1187 }
1188
1189 /* Handle instruction decode events (libipt-v2).  */
1190
1191 static int
1192 handle_pt_insn_events (struct btrace_thread_info *btinfo,
1193                        struct pt_insn_decoder *decoder,
1194                        std::vector<unsigned int> &gaps, int status)
1195 {
1196 #if defined (HAVE_PT_INSN_EVENT)
1197   while (status & pts_event_pending)
1198     {
1199       struct btrace_function *bfun;
1200       struct pt_event event;
1201       uint64_t offset;
1202
1203       status = pt_insn_event (decoder, &event, sizeof (event));
1204       if (status < 0)
1205         break;
1206
1207       switch (event.type)
1208         {
1209         default:
1210           break;
1211
1212         case ptev_enabled:
1213           if (event.variant.enabled.resumed == 0 && !btinfo->functions.empty ())
1214             {
1215               bfun = ftrace_new_gap (btinfo, BDE_PT_DISABLED, gaps);
1216
1217               pt_insn_get_offset (decoder, &offset);
1218
1219               warning (_("Non-contiguous trace at instruction %u (offset = 0x%"
1220                          PRIx64 ")."), bfun->insn_offset - 1, offset);
1221             }
1222
1223           break;
1224
1225         case ptev_overflow:
1226           bfun = ftrace_new_gap (btinfo, BDE_PT_OVERFLOW, gaps);
1227
1228           pt_insn_get_offset (decoder, &offset);
1229
1230           warning (_("Overflow at instruction %u (offset = 0x%" PRIx64 ")."),
1231                    bfun->insn_offset - 1, offset);
1232
1233           break;
1234         }
1235     }
1236 #endif /* defined (HAVE_PT_INSN_EVENT) */
1237
1238   return status;
1239 }
1240
1241 /* Handle events indicated by flags in INSN (libipt-v1).  */
1242
1243 static void
1244 handle_pt_insn_event_flags (struct btrace_thread_info *btinfo,
1245                             struct pt_insn_decoder *decoder,
1246                             const struct pt_insn &insn,
1247                             std::vector<unsigned int> &gaps)
1248 {
1249 #if defined (HAVE_STRUCT_PT_INSN_ENABLED)
1250   /* Tracing is disabled and re-enabled each time we enter the kernel.  Most
1251      times, we continue from the same instruction we stopped before.  This is
1252      indicated via the RESUMED instruction flag.  The ENABLED instruction flag
1253      means that we continued from some other instruction.  Indicate this as a
1254      trace gap except when tracing just started.  */
1255   if (insn.enabled && !btinfo->functions.empty ())
1256     {
1257       struct btrace_function *bfun;
1258       uint64_t offset;
1259
1260       bfun = ftrace_new_gap (btinfo, BDE_PT_DISABLED, gaps);
1261
1262       pt_insn_get_offset (decoder, &offset);
1263
1264       warning (_("Non-contiguous trace at instruction %u (offset = 0x%" PRIx64
1265                  ", pc = 0x%" PRIx64 ")."), bfun->insn_offset - 1, offset,
1266                insn.ip);
1267     }
1268 #endif /* defined (HAVE_STRUCT_PT_INSN_ENABLED) */
1269
1270 #if defined (HAVE_STRUCT_PT_INSN_RESYNCED)
1271   /* Indicate trace overflows.  */
1272   if (insn.resynced)
1273     {
1274       struct btrace_function *bfun;
1275       uint64_t offset;
1276
1277       bfun = ftrace_new_gap (btinfo, BDE_PT_OVERFLOW, gaps);
1278
1279       pt_insn_get_offset (decoder, &offset);
1280
1281       warning (_("Overflow at instruction %u (offset = 0x%" PRIx64 ", pc = 0x%"
1282                  PRIx64 ")."), bfun->insn_offset - 1, offset, insn.ip);
1283     }
1284 #endif /* defined (HAVE_STRUCT_PT_INSN_RESYNCED) */
1285 }
1286
1287 /* Add function branch trace to BTINFO using DECODER.  */
1288
1289 static void
1290 ftrace_add_pt (struct btrace_thread_info *btinfo,
1291                struct pt_insn_decoder *decoder,
1292                int *plevel,
1293                std::vector<unsigned int> &gaps)
1294 {
1295   struct btrace_function *bfun;
1296   uint64_t offset;
1297   int status;
1298
1299   for (;;)
1300     {
1301       struct pt_insn insn;
1302
1303       status = pt_insn_sync_forward (decoder);
1304       if (status < 0)
1305         {
1306           if (status != -pte_eos)
1307             warning (_("Failed to synchronize onto the Intel Processor "
1308                        "Trace stream: %s."), pt_errstr (pt_errcode (status)));
1309           break;
1310         }
1311
1312       for (;;)
1313         {
1314           /* Handle events from the previous iteration or synchronization.  */
1315           status = handle_pt_insn_events (btinfo, decoder, gaps, status);
1316           if (status < 0)
1317             break;
1318
1319           status = pt_insn_next (decoder, &insn, sizeof(insn));
1320           if (status < 0)
1321             break;
1322
1323           /* Handle events indicated by flags in INSN.  */
1324           handle_pt_insn_event_flags (btinfo, decoder, insn, gaps);
1325
1326           bfun = ftrace_update_function (btinfo, insn.ip);
1327
1328           /* Maintain the function level offset.  */
1329           *plevel = std::min (*plevel, bfun->level);
1330
1331           ftrace_update_insns (bfun, pt_btrace_insn (insn));
1332         }
1333
1334       if (status == -pte_eos)
1335         break;
1336
1337       /* Indicate the gap in the trace.  */
1338       bfun = ftrace_new_gap (btinfo, status, gaps);
1339
1340       pt_insn_get_offset (decoder, &offset);
1341
1342       warning (_("Decode error (%d) at instruction %u (offset = 0x%" PRIx64
1343                  ", pc = 0x%" PRIx64 "): %s."), status, bfun->insn_offset - 1,
1344                offset, insn.ip, pt_errstr (pt_errcode (status)));
1345     }
1346 }
1347
1348 /* A callback function to allow the trace decoder to read the inferior's
1349    memory.  */
1350
1351 static int
1352 btrace_pt_readmem_callback (gdb_byte *buffer, size_t size,
1353                             const struct pt_asid *asid, uint64_t pc,
1354                             void *context)
1355 {
1356   int result, errcode;
1357
1358   result = (int) size;
1359   TRY
1360     {
1361       errcode = target_read_code ((CORE_ADDR) pc, buffer, size);
1362       if (errcode != 0)
1363         result = -pte_nomap;
1364     }
1365   CATCH (error, RETURN_MASK_ERROR)
1366     {
1367       result = -pte_nomap;
1368     }
1369   END_CATCH
1370
1371   return result;
1372 }
1373
1374 /* Translate the vendor from one enum to another.  */
1375
1376 static enum pt_cpu_vendor
1377 pt_translate_cpu_vendor (enum btrace_cpu_vendor vendor)
1378 {
1379   switch (vendor)
1380     {
1381     default:
1382       return pcv_unknown;
1383
1384     case CV_INTEL:
1385       return pcv_intel;
1386     }
1387 }
1388
1389 /* Finalize the function branch trace after decode.  */
1390
1391 static void btrace_finalize_ftrace_pt (struct pt_insn_decoder *decoder,
1392                                        struct thread_info *tp, int level)
1393 {
1394   pt_insn_free_decoder (decoder);
1395
1396   /* LEVEL is the minimal function level of all btrace function segments.
1397      Define the global level offset to -LEVEL so all function levels are
1398      normalized to start at zero.  */
1399   tp->btrace.level = -level;
1400
1401   /* Add a single last instruction entry for the current PC.
1402      This allows us to compute the backtrace at the current PC using both
1403      standard unwind and btrace unwind.
1404      This extra entry is ignored by all record commands.  */
1405   btrace_add_pc (tp);
1406 }
1407
1408 /* Compute the function branch trace from Intel Processor Trace
1409    format.  */
1410
1411 static void
1412 btrace_compute_ftrace_pt (struct thread_info *tp,
1413                           const struct btrace_data_pt *btrace,
1414                           std::vector<unsigned int> &gaps)
1415 {
1416   struct btrace_thread_info *btinfo;
1417   struct pt_insn_decoder *decoder;
1418   struct pt_config config;
1419   int level, errcode;
1420
1421   if (btrace->size == 0)
1422     return;
1423
1424   btinfo = &tp->btrace;
1425   if (btinfo->functions.empty ())
1426     level = INT_MAX;
1427   else
1428     level = -btinfo->level;
1429
1430   pt_config_init(&config);
1431   config.begin = btrace->data;
1432   config.end = btrace->data + btrace->size;
1433
1434   /* We treat an unknown vendor as 'no errata'.  */
1435   if (btrace->config.cpu.vendor != CV_UNKNOWN)
1436     {
1437       config.cpu.vendor
1438         = pt_translate_cpu_vendor (btrace->config.cpu.vendor);
1439       config.cpu.family = btrace->config.cpu.family;
1440       config.cpu.model = btrace->config.cpu.model;
1441       config.cpu.stepping = btrace->config.cpu.stepping;
1442
1443       errcode = pt_cpu_errata (&config.errata, &config.cpu);
1444       if (errcode < 0)
1445         error (_("Failed to configure the Intel Processor Trace "
1446                  "decoder: %s."), pt_errstr (pt_errcode (errcode)));
1447     }
1448
1449   decoder = pt_insn_alloc_decoder (&config);
1450   if (decoder == NULL)
1451     error (_("Failed to allocate the Intel Processor Trace decoder."));
1452
1453   TRY
1454     {
1455       struct pt_image *image;
1456
1457       image = pt_insn_get_image(decoder);
1458       if (image == NULL)
1459         error (_("Failed to configure the Intel Processor Trace decoder."));
1460
1461       errcode = pt_image_set_callback(image, btrace_pt_readmem_callback, NULL);
1462       if (errcode < 0)
1463         error (_("Failed to configure the Intel Processor Trace decoder: "
1464                  "%s."), pt_errstr (pt_errcode (errcode)));
1465
1466       ftrace_add_pt (btinfo, decoder, &level, gaps);
1467     }
1468   CATCH (error, RETURN_MASK_ALL)
1469     {
1470       /* Indicate a gap in the trace if we quit trace processing.  */
1471       if (error.reason == RETURN_QUIT && !btinfo->functions.empty ())
1472         ftrace_new_gap (btinfo, BDE_PT_USER_QUIT, gaps);
1473
1474       btrace_finalize_ftrace_pt (decoder, tp, level);
1475
1476       throw_exception (error);
1477     }
1478   END_CATCH
1479
1480   btrace_finalize_ftrace_pt (decoder, tp, level);
1481 }
1482
1483 #else /* defined (HAVE_LIBIPT)  */
1484
1485 static void
1486 btrace_compute_ftrace_pt (struct thread_info *tp,
1487                           const struct btrace_data_pt *btrace,
1488                           std::vector<unsigned int> &gaps)
1489 {
1490   internal_error (__FILE__, __LINE__, _("Unexpected branch trace format."));
1491 }
1492
1493 #endif /* defined (HAVE_LIBIPT)  */
1494
1495 /* Compute the function branch trace from a block branch trace BTRACE for
1496    a thread given by BTINFO.  If CPU is not NULL, overwrite the cpu in the
1497    branch trace configuration.  This is currently only used for the PT
1498    format.  */
1499
1500 static void
1501 btrace_compute_ftrace_1 (struct thread_info *tp,
1502                          struct btrace_data *btrace,
1503                          const struct btrace_cpu *cpu,
1504                          std::vector<unsigned int> &gaps)
1505 {
1506   DEBUG ("compute ftrace");
1507
1508   switch (btrace->format)
1509     {
1510     case BTRACE_FORMAT_NONE:
1511       return;
1512
1513     case BTRACE_FORMAT_BTS:
1514       btrace_compute_ftrace_bts (tp, &btrace->variant.bts, gaps);
1515       return;
1516
1517     case BTRACE_FORMAT_PT:
1518       /* Overwrite the cpu we use for enabling errata workarounds.  */
1519       if (cpu != nullptr)
1520         btrace->variant.pt.config.cpu = *cpu;
1521
1522       btrace_compute_ftrace_pt (tp, &btrace->variant.pt, gaps);
1523       return;
1524     }
1525
1526   internal_error (__FILE__, __LINE__, _("Unkown branch trace format."));
1527 }
1528
1529 static void
1530 btrace_finalize_ftrace (struct thread_info *tp, std::vector<unsigned int> &gaps)
1531 {
1532   if (!gaps.empty ())
1533     {
1534       tp->btrace.ngaps += gaps.size ();
1535       btrace_bridge_gaps (tp, gaps);
1536     }
1537 }
1538
1539 static void
1540 btrace_compute_ftrace (struct thread_info *tp, struct btrace_data *btrace,
1541                        const struct btrace_cpu *cpu)
1542 {
1543   std::vector<unsigned int> gaps;
1544
1545   TRY
1546     {
1547       btrace_compute_ftrace_1 (tp, btrace, cpu, gaps);
1548     }
1549   CATCH (error, RETURN_MASK_ALL)
1550     {
1551       btrace_finalize_ftrace (tp, gaps);
1552
1553       throw_exception (error);
1554     }
1555   END_CATCH
1556
1557   btrace_finalize_ftrace (tp, gaps);
1558 }
1559
1560 /* Add an entry for the current PC.  */
1561
1562 static void
1563 btrace_add_pc (struct thread_info *tp)
1564 {
1565   struct btrace_data btrace;
1566   struct btrace_block *block;
1567   struct regcache *regcache;
1568   CORE_ADDR pc;
1569
1570   regcache = get_thread_regcache (tp);
1571   pc = regcache_read_pc (regcache);
1572
1573   btrace.format = BTRACE_FORMAT_BTS;
1574   btrace.variant.bts.blocks = NULL;
1575
1576   block = VEC_safe_push (btrace_block_s, btrace.variant.bts.blocks, NULL);
1577   block->begin = pc;
1578   block->end = pc;
1579
1580   btrace_compute_ftrace (tp, &btrace, NULL);
1581 }
1582
1583 /* See btrace.h.  */
1584
1585 void
1586 btrace_enable (struct thread_info *tp, const struct btrace_config *conf)
1587 {
1588   if (tp->btrace.target != NULL)
1589     return;
1590
1591 #if !defined (HAVE_LIBIPT)
1592   if (conf->format == BTRACE_FORMAT_PT)
1593     error (_("Intel Processor Trace support was disabled at compile time."));
1594 #endif /* !defined (HAVE_LIBIPT) */
1595
1596   DEBUG ("enable thread %s (%s)", print_thread_id (tp),
1597          target_pid_to_str (tp->ptid));
1598
1599   tp->btrace.target = target_enable_btrace (tp->ptid, conf);
1600
1601   /* We're done if we failed to enable tracing.  */
1602   if (tp->btrace.target == NULL)
1603     return;
1604
1605   /* We need to undo the enable in case of errors.  */
1606   TRY
1607     {
1608       /* Add an entry for the current PC so we start tracing from where we
1609          enabled it.
1610
1611          If we can't access TP's registers, TP is most likely running.  In this
1612          case, we can't really say where tracing was enabled so it should be
1613          safe to simply skip this step.
1614
1615          This is not relevant for BTRACE_FORMAT_PT since the trace will already
1616          start at the PC at which tracing was enabled.  */
1617       if (conf->format != BTRACE_FORMAT_PT
1618           && can_access_registers_thread (tp))
1619         btrace_add_pc (tp);
1620     }
1621   CATCH (exception, RETURN_MASK_ALL)
1622     {
1623       btrace_disable (tp);
1624
1625       throw_exception (exception);
1626     }
1627   END_CATCH
1628 }
1629
1630 /* See btrace.h.  */
1631
1632 const struct btrace_config *
1633 btrace_conf (const struct btrace_thread_info *btinfo)
1634 {
1635   if (btinfo->target == NULL)
1636     return NULL;
1637
1638   return target_btrace_conf (btinfo->target);
1639 }
1640
1641 /* See btrace.h.  */
1642
1643 void
1644 btrace_disable (struct thread_info *tp)
1645 {
1646   struct btrace_thread_info *btp = &tp->btrace;
1647
1648   if (btp->target == NULL)
1649     return;
1650
1651   DEBUG ("disable thread %s (%s)", print_thread_id (tp),
1652          target_pid_to_str (tp->ptid));
1653
1654   target_disable_btrace (btp->target);
1655   btp->target = NULL;
1656
1657   btrace_clear (tp);
1658 }
1659
1660 /* See btrace.h.  */
1661
1662 void
1663 btrace_teardown (struct thread_info *tp)
1664 {
1665   struct btrace_thread_info *btp = &tp->btrace;
1666
1667   if (btp->target == NULL)
1668     return;
1669
1670   DEBUG ("teardown thread %s (%s)", print_thread_id (tp),
1671          target_pid_to_str (tp->ptid));
1672
1673   target_teardown_btrace (btp->target);
1674   btp->target = NULL;
1675
1676   btrace_clear (tp);
1677 }
1678
1679 /* Stitch branch trace in BTS format.  */
1680
1681 static int
1682 btrace_stitch_bts (struct btrace_data_bts *btrace, struct thread_info *tp)
1683 {
1684   struct btrace_thread_info *btinfo;
1685   struct btrace_function *last_bfun;
1686   btrace_block_s *first_new_block;
1687
1688   btinfo = &tp->btrace;
1689   gdb_assert (!btinfo->functions.empty ());
1690   gdb_assert (!VEC_empty (btrace_block_s, btrace->blocks));
1691
1692   last_bfun = &btinfo->functions.back ();
1693
1694   /* If the existing trace ends with a gap, we just glue the traces
1695      together.  We need to drop the last (i.e. chronologically first) block
1696      of the new trace,  though, since we can't fill in the start address.*/
1697   if (last_bfun->insn.empty ())
1698     {
1699       VEC_pop (btrace_block_s, btrace->blocks);
1700       return 0;
1701     }
1702
1703   /* Beware that block trace starts with the most recent block, so the
1704      chronologically first block in the new trace is the last block in
1705      the new trace's block vector.  */
1706   first_new_block = VEC_last (btrace_block_s, btrace->blocks);
1707   const btrace_insn &last_insn = last_bfun->insn.back ();
1708
1709   /* If the current PC at the end of the block is the same as in our current
1710      trace, there are two explanations:
1711        1. we executed the instruction and some branch brought us back.
1712        2. we have not made any progress.
1713      In the first case, the delta trace vector should contain at least two
1714      entries.
1715      In the second case, the delta trace vector should contain exactly one
1716      entry for the partial block containing the current PC.  Remove it.  */
1717   if (first_new_block->end == last_insn.pc
1718       && VEC_length (btrace_block_s, btrace->blocks) == 1)
1719     {
1720       VEC_pop (btrace_block_s, btrace->blocks);
1721       return 0;
1722     }
1723
1724   DEBUG ("stitching %s to %s", ftrace_print_insn_addr (&last_insn),
1725          core_addr_to_string_nz (first_new_block->end));
1726
1727   /* Do a simple sanity check to make sure we don't accidentally end up
1728      with a bad block.  This should not occur in practice.  */
1729   if (first_new_block->end < last_insn.pc)
1730     {
1731       warning (_("Error while trying to read delta trace.  Falling back to "
1732                  "a full read."));
1733       return -1;
1734     }
1735
1736   /* We adjust the last block to start at the end of our current trace.  */
1737   gdb_assert (first_new_block->begin == 0);
1738   first_new_block->begin = last_insn.pc;
1739
1740   /* We simply pop the last insn so we can insert it again as part of
1741      the normal branch trace computation.
1742      Since instruction iterators are based on indices in the instructions
1743      vector, we don't leave any pointers dangling.  */
1744   DEBUG ("pruning insn at %s for stitching",
1745          ftrace_print_insn_addr (&last_insn));
1746
1747   last_bfun->insn.pop_back ();
1748
1749   /* The instructions vector may become empty temporarily if this has
1750      been the only instruction in this function segment.
1751      This violates the invariant but will be remedied shortly by
1752      btrace_compute_ftrace when we add the new trace.  */
1753
1754   /* The only case where this would hurt is if the entire trace consisted
1755      of just that one instruction.  If we remove it, we might turn the now
1756      empty btrace function segment into a gap.  But we don't want gaps at
1757      the beginning.  To avoid this, we remove the entire old trace.  */
1758   if (last_bfun->number == 1 && last_bfun->insn.empty ())
1759     btrace_clear (tp);
1760
1761   return 0;
1762 }
1763
1764 /* Adjust the block trace in order to stitch old and new trace together.
1765    BTRACE is the new delta trace between the last and the current stop.
1766    TP is the traced thread.
1767    May modifx BTRACE as well as the existing trace in TP.
1768    Return 0 on success, -1 otherwise.  */
1769
1770 static int
1771 btrace_stitch_trace (struct btrace_data *btrace, struct thread_info *tp)
1772 {
1773   /* If we don't have trace, there's nothing to do.  */
1774   if (btrace->empty ())
1775     return 0;
1776
1777   switch (btrace->format)
1778     {
1779     case BTRACE_FORMAT_NONE:
1780       return 0;
1781
1782     case BTRACE_FORMAT_BTS:
1783       return btrace_stitch_bts (&btrace->variant.bts, tp);
1784
1785     case BTRACE_FORMAT_PT:
1786       /* Delta reads are not supported.  */
1787       return -1;
1788     }
1789
1790   internal_error (__FILE__, __LINE__, _("Unkown branch trace format."));
1791 }
1792
1793 /* Clear the branch trace histories in BTINFO.  */
1794
1795 static void
1796 btrace_clear_history (struct btrace_thread_info *btinfo)
1797 {
1798   xfree (btinfo->insn_history);
1799   xfree (btinfo->call_history);
1800   xfree (btinfo->replay);
1801
1802   btinfo->insn_history = NULL;
1803   btinfo->call_history = NULL;
1804   btinfo->replay = NULL;
1805 }
1806
1807 /* Clear the branch trace maintenance histories in BTINFO.  */
1808
1809 static void
1810 btrace_maint_clear (struct btrace_thread_info *btinfo)
1811 {
1812   switch (btinfo->data.format)
1813     {
1814     default:
1815       break;
1816
1817     case BTRACE_FORMAT_BTS:
1818       btinfo->maint.variant.bts.packet_history.begin = 0;
1819       btinfo->maint.variant.bts.packet_history.end = 0;
1820       break;
1821
1822 #if defined (HAVE_LIBIPT)
1823     case BTRACE_FORMAT_PT:
1824       xfree (btinfo->maint.variant.pt.packets);
1825
1826       btinfo->maint.variant.pt.packets = NULL;
1827       btinfo->maint.variant.pt.packet_history.begin = 0;
1828       btinfo->maint.variant.pt.packet_history.end = 0;
1829       break;
1830 #endif /* defined (HAVE_LIBIPT)  */
1831     }
1832 }
1833
1834 /* See btrace.h.  */
1835
1836 const char *
1837 btrace_decode_error (enum btrace_format format, int errcode)
1838 {
1839   switch (format)
1840     {
1841     case BTRACE_FORMAT_BTS:
1842       switch (errcode)
1843         {
1844         case BDE_BTS_OVERFLOW:
1845           return _("instruction overflow");
1846
1847         case BDE_BTS_INSN_SIZE:
1848           return _("unknown instruction");
1849
1850         default:
1851           break;
1852         }
1853       break;
1854
1855 #if defined (HAVE_LIBIPT)
1856     case BTRACE_FORMAT_PT:
1857       switch (errcode)
1858         {
1859         case BDE_PT_USER_QUIT:
1860           return _("trace decode cancelled");
1861
1862         case BDE_PT_DISABLED:
1863           return _("disabled");
1864
1865         case BDE_PT_OVERFLOW:
1866           return _("overflow");
1867
1868         default:
1869           if (errcode < 0)
1870             return pt_errstr (pt_errcode (errcode));
1871           break;
1872         }
1873       break;
1874 #endif /* defined (HAVE_LIBIPT)  */
1875
1876     default:
1877       break;
1878     }
1879
1880   return _("unknown");
1881 }
1882
1883 /* See btrace.h.  */
1884
1885 void
1886 btrace_fetch (struct thread_info *tp, const struct btrace_cpu *cpu)
1887 {
1888   struct btrace_thread_info *btinfo;
1889   struct btrace_target_info *tinfo;
1890   struct btrace_data btrace;
1891   int errcode;
1892
1893   DEBUG ("fetch thread %s (%s)", print_thread_id (tp),
1894          target_pid_to_str (tp->ptid));
1895
1896   btinfo = &tp->btrace;
1897   tinfo = btinfo->target;
1898   if (tinfo == NULL)
1899     return;
1900
1901   /* There's no way we could get new trace while replaying.
1902      On the other hand, delta trace would return a partial record with the
1903      current PC, which is the replay PC, not the last PC, as expected.  */
1904   if (btinfo->replay != NULL)
1905     return;
1906
1907   /* With CLI usage, TP->PTID always equals INFERIOR_PTID here.  Now that we
1908      can store a gdb.Record object in Python referring to a different thread
1909      than the current one, temporarily set INFERIOR_PTID.  */
1910   scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
1911   inferior_ptid = tp->ptid;
1912
1913   /* We should not be called on running or exited threads.  */
1914   gdb_assert (can_access_registers_thread (tp));
1915
1916   /* Let's first try to extend the trace we already have.  */
1917   if (!btinfo->functions.empty ())
1918     {
1919       errcode = target_read_btrace (&btrace, tinfo, BTRACE_READ_DELTA);
1920       if (errcode == 0)
1921         {
1922           /* Success.  Let's try to stitch the traces together.  */
1923           errcode = btrace_stitch_trace (&btrace, tp);
1924         }
1925       else
1926         {
1927           /* We failed to read delta trace.  Let's try to read new trace.  */
1928           errcode = target_read_btrace (&btrace, tinfo, BTRACE_READ_NEW);
1929
1930           /* If we got any new trace, discard what we have.  */
1931           if (errcode == 0 && !btrace.empty ())
1932             btrace_clear (tp);
1933         }
1934
1935       /* If we were not able to read the trace, we start over.  */
1936       if (errcode != 0)
1937         {
1938           btrace_clear (tp);
1939           errcode = target_read_btrace (&btrace, tinfo, BTRACE_READ_ALL);
1940         }
1941     }
1942   else
1943     errcode = target_read_btrace (&btrace, tinfo, BTRACE_READ_ALL);
1944
1945   /* If we were not able to read the branch trace, signal an error.  */
1946   if (errcode != 0)
1947     error (_("Failed to read branch trace."));
1948
1949   /* Compute the trace, provided we have any.  */
1950   if (!btrace.empty ())
1951     {
1952       /* Store the raw trace data.  The stored data will be cleared in
1953          btrace_clear, so we always append the new trace.  */
1954       btrace_data_append (&btinfo->data, &btrace);
1955       btrace_maint_clear (btinfo);
1956
1957       btrace_clear_history (btinfo);
1958       btrace_compute_ftrace (tp, &btrace, cpu);
1959     }
1960 }
1961
1962 /* See btrace.h.  */
1963
1964 void
1965 btrace_clear (struct thread_info *tp)
1966 {
1967   struct btrace_thread_info *btinfo;
1968
1969   DEBUG ("clear thread %s (%s)", print_thread_id (tp),
1970          target_pid_to_str (tp->ptid));
1971
1972   /* Make sure btrace frames that may hold a pointer into the branch
1973      trace data are destroyed.  */
1974   reinit_frame_cache ();
1975
1976   btinfo = &tp->btrace;
1977
1978   btinfo->functions.clear ();
1979   btinfo->ngaps = 0;
1980
1981   /* Must clear the maint data before - it depends on BTINFO->DATA.  */
1982   btrace_maint_clear (btinfo);
1983   btinfo->data.clear ();
1984   btrace_clear_history (btinfo);
1985 }
1986
1987 /* See btrace.h.  */
1988
1989 void
1990 btrace_free_objfile (struct objfile *objfile)
1991 {
1992   struct thread_info *tp;
1993
1994   DEBUG ("free objfile");
1995
1996   ALL_NON_EXITED_THREADS (tp)
1997     btrace_clear (tp);
1998 }
1999
2000 #if defined (HAVE_LIBEXPAT)
2001
2002 /* Check the btrace document version.  */
2003
2004 static void
2005 check_xml_btrace_version (struct gdb_xml_parser *parser,
2006                           const struct gdb_xml_element *element,
2007                           void *user_data,
2008                           std::vector<gdb_xml_value> &attributes)
2009 {
2010   const char *version
2011     = (const char *) xml_find_attribute (attributes, "version")->value.get ();
2012
2013   if (strcmp (version, "1.0") != 0)
2014     gdb_xml_error (parser, _("Unsupported btrace version: \"%s\""), version);
2015 }
2016
2017 /* Parse a btrace "block" xml record.  */
2018
2019 static void
2020 parse_xml_btrace_block (struct gdb_xml_parser *parser,
2021                         const struct gdb_xml_element *element,
2022                         void *user_data,
2023                         std::vector<gdb_xml_value> &attributes)
2024 {
2025   struct btrace_data *btrace;
2026   struct btrace_block *block;
2027   ULONGEST *begin, *end;
2028
2029   btrace = (struct btrace_data *) user_data;
2030
2031   switch (btrace->format)
2032     {
2033     case BTRACE_FORMAT_BTS:
2034       break;
2035
2036     case BTRACE_FORMAT_NONE:
2037       btrace->format = BTRACE_FORMAT_BTS;
2038       btrace->variant.bts.blocks = NULL;
2039       break;
2040
2041     default:
2042       gdb_xml_error (parser, _("Btrace format error."));
2043     }
2044
2045   begin = (ULONGEST *) xml_find_attribute (attributes, "begin")->value.get ();
2046   end = (ULONGEST *) xml_find_attribute (attributes, "end")->value.get ();
2047
2048   block = VEC_safe_push (btrace_block_s, btrace->variant.bts.blocks, NULL);
2049   block->begin = *begin;
2050   block->end = *end;
2051 }
2052
2053 /* Parse a "raw" xml record.  */
2054
2055 static void
2056 parse_xml_raw (struct gdb_xml_parser *parser, const char *body_text,
2057                gdb_byte **pdata, size_t *psize)
2058 {
2059   gdb_byte *bin;
2060   size_t len, size;
2061
2062   len = strlen (body_text);
2063   if (len % 2 != 0)
2064     gdb_xml_error (parser, _("Bad raw data size."));
2065
2066   size = len / 2;
2067
2068   gdb::unique_xmalloc_ptr<gdb_byte> data ((gdb_byte *) xmalloc (size));
2069   bin = data.get ();
2070
2071   /* We use hex encoding - see common/rsp-low.h.  */
2072   while (len > 0)
2073     {
2074       char hi, lo;
2075
2076       hi = *body_text++;
2077       lo = *body_text++;
2078
2079       if (hi == 0 || lo == 0)
2080         gdb_xml_error (parser, _("Bad hex encoding."));
2081
2082       *bin++ = fromhex (hi) * 16 + fromhex (lo);
2083       len -= 2;
2084     }
2085
2086   *pdata = data.release ();
2087   *psize = size;
2088 }
2089
2090 /* Parse a btrace pt-config "cpu" xml record.  */
2091
2092 static void
2093 parse_xml_btrace_pt_config_cpu (struct gdb_xml_parser *parser,
2094                                 const struct gdb_xml_element *element,
2095                                 void *user_data,
2096                                 std::vector<gdb_xml_value> &attributes)
2097 {
2098   struct btrace_data *btrace;
2099   const char *vendor;
2100   ULONGEST *family, *model, *stepping;
2101
2102   vendor =
2103     (const char *) xml_find_attribute (attributes, "vendor")->value.get ();
2104   family
2105     = (ULONGEST *) xml_find_attribute (attributes, "family")->value.get ();
2106   model
2107     = (ULONGEST *) xml_find_attribute (attributes, "model")->value.get ();
2108   stepping
2109     = (ULONGEST *) xml_find_attribute (attributes, "stepping")->value.get ();
2110
2111   btrace = (struct btrace_data *) user_data;
2112
2113   if (strcmp (vendor, "GenuineIntel") == 0)
2114     btrace->variant.pt.config.cpu.vendor = CV_INTEL;
2115
2116   btrace->variant.pt.config.cpu.family = *family;
2117   btrace->variant.pt.config.cpu.model = *model;
2118   btrace->variant.pt.config.cpu.stepping = *stepping;
2119 }
2120
2121 /* Parse a btrace pt "raw" xml record.  */
2122
2123 static void
2124 parse_xml_btrace_pt_raw (struct gdb_xml_parser *parser,
2125                          const struct gdb_xml_element *element,
2126                          void *user_data, const char *body_text)
2127 {
2128   struct btrace_data *btrace;
2129
2130   btrace = (struct btrace_data *) user_data;
2131   parse_xml_raw (parser, body_text, &btrace->variant.pt.data,
2132                  &btrace->variant.pt.size);
2133 }
2134
2135 /* Parse a btrace "pt" xml record.  */
2136
2137 static void
2138 parse_xml_btrace_pt (struct gdb_xml_parser *parser,
2139                      const struct gdb_xml_element *element,
2140                      void *user_data,
2141                      std::vector<gdb_xml_value> &attributes)
2142 {
2143   struct btrace_data *btrace;
2144
2145   btrace = (struct btrace_data *) user_data;
2146   btrace->format = BTRACE_FORMAT_PT;
2147   btrace->variant.pt.config.cpu.vendor = CV_UNKNOWN;
2148   btrace->variant.pt.data = NULL;
2149   btrace->variant.pt.size = 0;
2150 }
2151
2152 static const struct gdb_xml_attribute block_attributes[] = {
2153   { "begin", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
2154   { "end", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
2155   { NULL, GDB_XML_AF_NONE, NULL, NULL }
2156 };
2157
2158 static const struct gdb_xml_attribute btrace_pt_config_cpu_attributes[] = {
2159   { "vendor", GDB_XML_AF_NONE, NULL, NULL },
2160   { "family", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
2161   { "model", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
2162   { "stepping", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
2163   { NULL, GDB_XML_AF_NONE, NULL, NULL }
2164 };
2165
2166 static const struct gdb_xml_element btrace_pt_config_children[] = {
2167   { "cpu", btrace_pt_config_cpu_attributes, NULL, GDB_XML_EF_OPTIONAL,
2168     parse_xml_btrace_pt_config_cpu, NULL },
2169   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
2170 };
2171
2172 static const struct gdb_xml_element btrace_pt_children[] = {
2173   { "pt-config", NULL, btrace_pt_config_children, GDB_XML_EF_OPTIONAL, NULL,
2174     NULL },
2175   { "raw", NULL, NULL, GDB_XML_EF_OPTIONAL, NULL, parse_xml_btrace_pt_raw },
2176   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
2177 };
2178
2179 static const struct gdb_xml_attribute btrace_attributes[] = {
2180   { "version", GDB_XML_AF_NONE, NULL, NULL },
2181   { NULL, GDB_XML_AF_NONE, NULL, NULL }
2182 };
2183
2184 static const struct gdb_xml_element btrace_children[] = {
2185   { "block", block_attributes, NULL,
2186     GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL, parse_xml_btrace_block, NULL },
2187   { "pt", NULL, btrace_pt_children, GDB_XML_EF_OPTIONAL, parse_xml_btrace_pt,
2188     NULL },
2189   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
2190 };
2191
2192 static const struct gdb_xml_element btrace_elements[] = {
2193   { "btrace", btrace_attributes, btrace_children, GDB_XML_EF_NONE,
2194     check_xml_btrace_version, NULL },
2195   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
2196 };
2197
2198 #endif /* defined (HAVE_LIBEXPAT) */
2199
2200 /* See btrace.h.  */
2201
2202 void
2203 parse_xml_btrace (struct btrace_data *btrace, const char *buffer)
2204 {
2205 #if defined (HAVE_LIBEXPAT)
2206
2207   int errcode;
2208   btrace_data result;
2209   result.format = BTRACE_FORMAT_NONE;
2210
2211   errcode = gdb_xml_parse_quick (_("btrace"), "btrace.dtd", btrace_elements,
2212                                  buffer, &result);
2213   if (errcode != 0)
2214     error (_("Error parsing branch trace."));
2215
2216   /* Keep parse results.  */
2217   *btrace = std::move (result);
2218
2219 #else  /* !defined (HAVE_LIBEXPAT) */
2220
2221   error (_("Cannot process branch trace.  XML support was disabled at "
2222            "compile time."));
2223
2224 #endif  /* !defined (HAVE_LIBEXPAT) */
2225 }
2226
2227 #if defined (HAVE_LIBEXPAT)
2228
2229 /* Parse a btrace-conf "bts" xml record.  */
2230
2231 static void
2232 parse_xml_btrace_conf_bts (struct gdb_xml_parser *parser,
2233                           const struct gdb_xml_element *element,
2234                           void *user_data,
2235                           std::vector<gdb_xml_value> &attributes)
2236 {
2237   struct btrace_config *conf;
2238   struct gdb_xml_value *size;
2239
2240   conf = (struct btrace_config *) user_data;
2241   conf->format = BTRACE_FORMAT_BTS;
2242   conf->bts.size = 0;
2243
2244   size = xml_find_attribute (attributes, "size");
2245   if (size != NULL)
2246     conf->bts.size = (unsigned int) *(ULONGEST *) size->value.get ();
2247 }
2248
2249 /* Parse a btrace-conf "pt" xml record.  */
2250
2251 static void
2252 parse_xml_btrace_conf_pt (struct gdb_xml_parser *parser,
2253                           const struct gdb_xml_element *element,
2254                           void *user_data,
2255                           std::vector<gdb_xml_value> &attributes)
2256 {
2257   struct btrace_config *conf;
2258   struct gdb_xml_value *size;
2259
2260   conf = (struct btrace_config *) user_data;
2261   conf->format = BTRACE_FORMAT_PT;
2262   conf->pt.size = 0;
2263
2264   size = xml_find_attribute (attributes, "size");
2265   if (size != NULL)
2266     conf->pt.size = (unsigned int) *(ULONGEST *) size->value.get ();
2267 }
2268
2269 static const struct gdb_xml_attribute btrace_conf_pt_attributes[] = {
2270   { "size", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
2271   { NULL, GDB_XML_AF_NONE, NULL, NULL }
2272 };
2273
2274 static const struct gdb_xml_attribute btrace_conf_bts_attributes[] = {
2275   { "size", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
2276   { NULL, GDB_XML_AF_NONE, NULL, NULL }
2277 };
2278
2279 static const struct gdb_xml_element btrace_conf_children[] = {
2280   { "bts", btrace_conf_bts_attributes, NULL, GDB_XML_EF_OPTIONAL,
2281     parse_xml_btrace_conf_bts, NULL },
2282   { "pt", btrace_conf_pt_attributes, NULL, GDB_XML_EF_OPTIONAL,
2283     parse_xml_btrace_conf_pt, NULL },
2284   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
2285 };
2286
2287 static const struct gdb_xml_attribute btrace_conf_attributes[] = {
2288   { "version", GDB_XML_AF_NONE, NULL, NULL },
2289   { NULL, GDB_XML_AF_NONE, NULL, NULL }
2290 };
2291
2292 static const struct gdb_xml_element btrace_conf_elements[] = {
2293   { "btrace-conf", btrace_conf_attributes, btrace_conf_children,
2294     GDB_XML_EF_NONE, NULL, NULL },
2295   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
2296 };
2297
2298 #endif /* defined (HAVE_LIBEXPAT) */
2299
2300 /* See btrace.h.  */
2301
2302 void
2303 parse_xml_btrace_conf (struct btrace_config *conf, const char *xml)
2304 {
2305 #if defined (HAVE_LIBEXPAT)
2306
2307   int errcode;
2308   errcode = gdb_xml_parse_quick (_("btrace-conf"), "btrace-conf.dtd",
2309                                  btrace_conf_elements, xml, conf);
2310   if (errcode != 0)
2311     error (_("Error parsing branch trace configuration."));
2312
2313 #else  /* !defined (HAVE_LIBEXPAT) */
2314
2315   error (_("Cannot process the branch trace configuration.  XML support "
2316            "was disabled at compile time."));
2317
2318 #endif  /* !defined (HAVE_LIBEXPAT) */
2319 }
2320
2321 /* See btrace.h.  */
2322
2323 const struct btrace_insn *
2324 btrace_insn_get (const struct btrace_insn_iterator *it)
2325 {
2326   const struct btrace_function *bfun;
2327   unsigned int index, end;
2328
2329   index = it->insn_index;
2330   bfun = &it->btinfo->functions[it->call_index];
2331
2332   /* Check if the iterator points to a gap in the trace.  */
2333   if (bfun->errcode != 0)
2334     return NULL;
2335
2336   /* The index is within the bounds of this function's instruction vector.  */
2337   end = bfun->insn.size ();
2338   gdb_assert (0 < end);
2339   gdb_assert (index < end);
2340
2341   return &bfun->insn[index];
2342 }
2343
2344 /* See btrace.h.  */
2345
2346 int
2347 btrace_insn_get_error (const struct btrace_insn_iterator *it)
2348 {
2349   return it->btinfo->functions[it->call_index].errcode;
2350 }
2351
2352 /* See btrace.h.  */
2353
2354 unsigned int
2355 btrace_insn_number (const struct btrace_insn_iterator *it)
2356 {
2357   return it->btinfo->functions[it->call_index].insn_offset + it->insn_index;
2358 }
2359
2360 /* See btrace.h.  */
2361
2362 void
2363 btrace_insn_begin (struct btrace_insn_iterator *it,
2364                    const struct btrace_thread_info *btinfo)
2365 {
2366   if (btinfo->functions.empty ())
2367     error (_("No trace."));
2368
2369   it->btinfo = btinfo;
2370   it->call_index = 0;
2371   it->insn_index = 0;
2372 }
2373
2374 /* See btrace.h.  */
2375
2376 void
2377 btrace_insn_end (struct btrace_insn_iterator *it,
2378                  const struct btrace_thread_info *btinfo)
2379 {
2380   const struct btrace_function *bfun;
2381   unsigned int length;
2382
2383   if (btinfo->functions.empty ())
2384     error (_("No trace."));
2385
2386   bfun = &btinfo->functions.back ();
2387   length = bfun->insn.size ();
2388
2389   /* The last function may either be a gap or it contains the current
2390      instruction, which is one past the end of the execution trace; ignore
2391      it.  */
2392   if (length > 0)
2393     length -= 1;
2394
2395   it->btinfo = btinfo;
2396   it->call_index = bfun->number - 1;
2397   it->insn_index = length;
2398 }
2399
2400 /* See btrace.h.  */
2401
2402 unsigned int
2403 btrace_insn_next (struct btrace_insn_iterator *it, unsigned int stride)
2404 {
2405   const struct btrace_function *bfun;
2406   unsigned int index, steps;
2407
2408   bfun = &it->btinfo->functions[it->call_index];
2409   steps = 0;
2410   index = it->insn_index;
2411
2412   while (stride != 0)
2413     {
2414       unsigned int end, space, adv;
2415
2416       end = bfun->insn.size ();
2417
2418       /* An empty function segment represents a gap in the trace.  We count
2419          it as one instruction.  */
2420       if (end == 0)
2421         {
2422           const struct btrace_function *next;
2423
2424           next = ftrace_find_call_by_number (it->btinfo, bfun->number + 1);
2425           if (next == NULL)
2426             break;
2427
2428           stride -= 1;
2429           steps += 1;
2430
2431           bfun = next;
2432           index = 0;
2433
2434           continue;
2435         }
2436
2437       gdb_assert (0 < end);
2438       gdb_assert (index < end);
2439
2440       /* Compute the number of instructions remaining in this segment.  */
2441       space = end - index;
2442
2443       /* Advance the iterator as far as possible within this segment.  */
2444       adv = std::min (space, stride);
2445       stride -= adv;
2446       index += adv;
2447       steps += adv;
2448
2449       /* Move to the next function if we're at the end of this one.  */
2450       if (index == end)
2451         {
2452           const struct btrace_function *next;
2453
2454           next = ftrace_find_call_by_number (it->btinfo, bfun->number + 1);
2455           if (next == NULL)
2456             {
2457               /* We stepped past the last function.
2458
2459                  Let's adjust the index to point to the last instruction in
2460                  the previous function.  */
2461               index -= 1;
2462               steps -= 1;
2463               break;
2464             }
2465
2466           /* We now point to the first instruction in the new function.  */
2467           bfun = next;
2468           index = 0;
2469         }
2470
2471       /* We did make progress.  */
2472       gdb_assert (adv > 0);
2473     }
2474
2475   /* Update the iterator.  */
2476   it->call_index = bfun->number - 1;
2477   it->insn_index = index;
2478
2479   return steps;
2480 }
2481
2482 /* See btrace.h.  */
2483
2484 unsigned int
2485 btrace_insn_prev (struct btrace_insn_iterator *it, unsigned int stride)
2486 {
2487   const struct btrace_function *bfun;
2488   unsigned int index, steps;
2489
2490   bfun = &it->btinfo->functions[it->call_index];
2491   steps = 0;
2492   index = it->insn_index;
2493
2494   while (stride != 0)
2495     {
2496       unsigned int adv;
2497
2498       /* Move to the previous function if we're at the start of this one.  */
2499       if (index == 0)
2500         {
2501           const struct btrace_function *prev;
2502
2503           prev = ftrace_find_call_by_number (it->btinfo, bfun->number - 1);
2504           if (prev == NULL)
2505             break;
2506
2507           /* We point to one after the last instruction in the new function.  */
2508           bfun = prev;
2509           index = bfun->insn.size ();
2510
2511           /* An empty function segment represents a gap in the trace.  We count
2512              it as one instruction.  */
2513           if (index == 0)
2514             {
2515               stride -= 1;
2516               steps += 1;
2517
2518               continue;
2519             }
2520         }
2521
2522       /* Advance the iterator as far as possible within this segment.  */
2523       adv = std::min (index, stride);
2524
2525       stride -= adv;
2526       index -= adv;
2527       steps += adv;
2528
2529       /* We did make progress.  */
2530       gdb_assert (adv > 0);
2531     }
2532
2533   /* Update the iterator.  */
2534   it->call_index = bfun->number - 1;
2535   it->insn_index = index;
2536
2537   return steps;
2538 }
2539
2540 /* See btrace.h.  */
2541
2542 int
2543 btrace_insn_cmp (const struct btrace_insn_iterator *lhs,
2544                  const struct btrace_insn_iterator *rhs)
2545 {
2546   gdb_assert (lhs->btinfo == rhs->btinfo);
2547
2548   if (lhs->call_index != rhs->call_index)
2549     return lhs->call_index - rhs->call_index;
2550
2551   return lhs->insn_index - rhs->insn_index;
2552 }
2553
2554 /* See btrace.h.  */
2555
2556 int
2557 btrace_find_insn_by_number (struct btrace_insn_iterator *it,
2558                             const struct btrace_thread_info *btinfo,
2559                             unsigned int number)
2560 {
2561   const struct btrace_function *bfun;
2562   unsigned int upper, lower;
2563
2564   if (btinfo->functions.empty ())
2565       return 0;
2566
2567   lower = 0;
2568   bfun = &btinfo->functions[lower];
2569   if (number < bfun->insn_offset)
2570     return 0;
2571
2572   upper = btinfo->functions.size () - 1;
2573   bfun = &btinfo->functions[upper];
2574   if (number >= bfun->insn_offset + ftrace_call_num_insn (bfun))
2575     return 0;
2576
2577   /* We assume that there are no holes in the numbering.  */
2578   for (;;)
2579     {
2580       const unsigned int average = lower + (upper - lower) / 2;
2581
2582       bfun = &btinfo->functions[average];
2583
2584       if (number < bfun->insn_offset)
2585         {
2586           upper = average - 1;
2587           continue;
2588         }
2589
2590       if (number >= bfun->insn_offset + ftrace_call_num_insn (bfun))
2591         {
2592           lower = average + 1;
2593           continue;
2594         }
2595
2596       break;
2597     }
2598
2599   it->btinfo = btinfo;
2600   it->call_index = bfun->number - 1;
2601   it->insn_index = number - bfun->insn_offset;
2602   return 1;
2603 }
2604
2605 /* Returns true if the recording ends with a function segment that
2606    contains only a single (i.e. the current) instruction.  */
2607
2608 static bool
2609 btrace_ends_with_single_insn (const struct btrace_thread_info *btinfo)
2610 {
2611   const btrace_function *bfun;
2612
2613   if (btinfo->functions.empty ())
2614     return false;
2615
2616   bfun = &btinfo->functions.back ();
2617   if (bfun->errcode != 0)
2618     return false;
2619
2620   return ftrace_call_num_insn (bfun) == 1;
2621 }
2622
2623 /* See btrace.h.  */
2624
2625 const struct btrace_function *
2626 btrace_call_get (const struct btrace_call_iterator *it)
2627 {
2628   if (it->index >= it->btinfo->functions.size ())
2629     return NULL;
2630
2631   return &it->btinfo->functions[it->index];
2632 }
2633
2634 /* See btrace.h.  */
2635
2636 unsigned int
2637 btrace_call_number (const struct btrace_call_iterator *it)
2638 {
2639   const unsigned int length = it->btinfo->functions.size ();
2640
2641   /* If the last function segment contains only a single instruction (i.e. the
2642      current instruction), skip it.  */
2643   if ((it->index == length) && btrace_ends_with_single_insn (it->btinfo))
2644     return length;
2645
2646   return it->index + 1;
2647 }
2648
2649 /* See btrace.h.  */
2650
2651 void
2652 btrace_call_begin (struct btrace_call_iterator *it,
2653                    const struct btrace_thread_info *btinfo)
2654 {
2655   if (btinfo->functions.empty ())
2656     error (_("No trace."));
2657
2658   it->btinfo = btinfo;
2659   it->index = 0;
2660 }
2661
2662 /* See btrace.h.  */
2663
2664 void
2665 btrace_call_end (struct btrace_call_iterator *it,
2666                  const struct btrace_thread_info *btinfo)
2667 {
2668   if (btinfo->functions.empty ())
2669     error (_("No trace."));
2670
2671   it->btinfo = btinfo;
2672   it->index = btinfo->functions.size ();
2673 }
2674
2675 /* See btrace.h.  */
2676
2677 unsigned int
2678 btrace_call_next (struct btrace_call_iterator *it, unsigned int stride)
2679 {
2680   const unsigned int length = it->btinfo->functions.size ();
2681
2682   if (it->index + stride < length - 1)
2683     /* Default case: Simply advance the iterator.  */
2684     it->index += stride;
2685   else if (it->index + stride == length - 1)
2686     {
2687       /* We land exactly at the last function segment.  If it contains only one
2688          instruction (i.e. the current instruction) it is not actually part of
2689          the trace.  */
2690       if (btrace_ends_with_single_insn (it->btinfo))
2691         it->index = length;
2692       else
2693         it->index = length - 1;
2694     }
2695   else
2696     {
2697       /* We land past the last function segment and have to adjust the stride.
2698          If the last function segment contains only one instruction (i.e. the
2699          current instruction) it is not actually part of the trace.  */
2700       if (btrace_ends_with_single_insn (it->btinfo))
2701         stride = length - it->index - 1;
2702       else
2703         stride = length - it->index;
2704
2705       it->index = length;
2706     }
2707
2708   return stride;
2709 }
2710
2711 /* See btrace.h.  */
2712
2713 unsigned int
2714 btrace_call_prev (struct btrace_call_iterator *it, unsigned int stride)
2715 {
2716   const unsigned int length = it->btinfo->functions.size ();
2717   int steps = 0;
2718
2719   gdb_assert (it->index <= length);
2720
2721   if (stride == 0 || it->index == 0)
2722     return 0;
2723
2724   /* If we are at the end, the first step is a special case.  If the last
2725      function segment contains only one instruction (i.e. the current
2726      instruction) it is not actually part of the trace.  To be able to step
2727      over this instruction, we need at least one more function segment.  */
2728   if ((it->index == length)  && (length > 1))
2729     {
2730       if (btrace_ends_with_single_insn (it->btinfo))
2731         it->index = length - 2;
2732       else
2733         it->index = length - 1;
2734
2735       steps = 1;
2736       stride -= 1;
2737     }
2738
2739   stride = std::min (stride, it->index);
2740
2741   it->index -= stride;
2742   return steps + stride;
2743 }
2744
2745 /* See btrace.h.  */
2746
2747 int
2748 btrace_call_cmp (const struct btrace_call_iterator *lhs,
2749                  const struct btrace_call_iterator *rhs)
2750 {
2751   gdb_assert (lhs->btinfo == rhs->btinfo);
2752   return (int) (lhs->index - rhs->index);
2753 }
2754
2755 /* See btrace.h.  */
2756
2757 int
2758 btrace_find_call_by_number (struct btrace_call_iterator *it,
2759                             const struct btrace_thread_info *btinfo,
2760                             unsigned int number)
2761 {
2762   const unsigned int length = btinfo->functions.size ();
2763
2764   if ((number == 0) || (number > length))
2765     return 0;
2766
2767   it->btinfo = btinfo;
2768   it->index = number - 1;
2769   return 1;
2770 }
2771
2772 /* See btrace.h.  */
2773
2774 void
2775 btrace_set_insn_history (struct btrace_thread_info *btinfo,
2776                          const struct btrace_insn_iterator *begin,
2777                          const struct btrace_insn_iterator *end)
2778 {
2779   if (btinfo->insn_history == NULL)
2780     btinfo->insn_history = XCNEW (struct btrace_insn_history);
2781
2782   btinfo->insn_history->begin = *begin;
2783   btinfo->insn_history->end = *end;
2784 }
2785
2786 /* See btrace.h.  */
2787
2788 void
2789 btrace_set_call_history (struct btrace_thread_info *btinfo,
2790                          const struct btrace_call_iterator *begin,
2791                          const struct btrace_call_iterator *end)
2792 {
2793   gdb_assert (begin->btinfo == end->btinfo);
2794
2795   if (btinfo->call_history == NULL)
2796     btinfo->call_history = XCNEW (struct btrace_call_history);
2797
2798   btinfo->call_history->begin = *begin;
2799   btinfo->call_history->end = *end;
2800 }
2801
2802 /* See btrace.h.  */
2803
2804 int
2805 btrace_is_replaying (struct thread_info *tp)
2806 {
2807   return tp->btrace.replay != NULL;
2808 }
2809
2810 /* See btrace.h.  */
2811
2812 int
2813 btrace_is_empty (struct thread_info *tp)
2814 {
2815   struct btrace_insn_iterator begin, end;
2816   struct btrace_thread_info *btinfo;
2817
2818   btinfo = &tp->btrace;
2819
2820   if (btinfo->functions.empty ())
2821     return 1;
2822
2823   btrace_insn_begin (&begin, btinfo);
2824   btrace_insn_end (&end, btinfo);
2825
2826   return btrace_insn_cmp (&begin, &end) == 0;
2827 }
2828
2829 #if defined (HAVE_LIBIPT)
2830
2831 /* Print a single packet.  */
2832
2833 static void
2834 pt_print_packet (const struct pt_packet *packet)
2835 {
2836   switch (packet->type)
2837     {
2838     default:
2839       printf_unfiltered (("[??: %x]"), packet->type);
2840       break;
2841
2842     case ppt_psb:
2843       printf_unfiltered (("psb"));
2844       break;
2845
2846     case ppt_psbend:
2847       printf_unfiltered (("psbend"));
2848       break;
2849
2850     case ppt_pad:
2851       printf_unfiltered (("pad"));
2852       break;
2853
2854     case ppt_tip:
2855       printf_unfiltered (("tip %u: 0x%" PRIx64 ""),
2856                          packet->payload.ip.ipc,
2857                          packet->payload.ip.ip);
2858       break;
2859
2860     case ppt_tip_pge:
2861       printf_unfiltered (("tip.pge %u: 0x%" PRIx64 ""),
2862                          packet->payload.ip.ipc,
2863                          packet->payload.ip.ip);
2864       break;
2865
2866     case ppt_tip_pgd:
2867       printf_unfiltered (("tip.pgd %u: 0x%" PRIx64 ""),
2868                          packet->payload.ip.ipc,
2869                          packet->payload.ip.ip);
2870       break;
2871
2872     case ppt_fup:
2873       printf_unfiltered (("fup %u: 0x%" PRIx64 ""),
2874                          packet->payload.ip.ipc,
2875                          packet->payload.ip.ip);
2876       break;
2877
2878     case ppt_tnt_8:
2879       printf_unfiltered (("tnt-8 %u: 0x%" PRIx64 ""),
2880                          packet->payload.tnt.bit_size,
2881                          packet->payload.tnt.payload);
2882       break;
2883
2884     case ppt_tnt_64:
2885       printf_unfiltered (("tnt-64 %u: 0x%" PRIx64 ""),
2886                          packet->payload.tnt.bit_size,
2887                          packet->payload.tnt.payload);
2888       break;
2889
2890     case ppt_pip:
2891       printf_unfiltered (("pip %" PRIx64 "%s"), packet->payload.pip.cr3,
2892                          packet->payload.pip.nr ? (" nr") : (""));
2893       break;
2894
2895     case ppt_tsc:
2896       printf_unfiltered (("tsc %" PRIx64 ""), packet->payload.tsc.tsc);
2897       break;
2898
2899     case ppt_cbr:
2900       printf_unfiltered (("cbr %u"), packet->payload.cbr.ratio);
2901       break;
2902
2903     case ppt_mode:
2904       switch (packet->payload.mode.leaf)
2905         {
2906         default:
2907           printf_unfiltered (("mode %u"), packet->payload.mode.leaf);
2908           break;
2909
2910         case pt_mol_exec:
2911           printf_unfiltered (("mode.exec%s%s"),
2912                              packet->payload.mode.bits.exec.csl
2913                              ? (" cs.l") : (""),
2914                              packet->payload.mode.bits.exec.csd
2915                              ? (" cs.d") : (""));
2916           break;
2917
2918         case pt_mol_tsx:
2919           printf_unfiltered (("mode.tsx%s%s"),
2920                              packet->payload.mode.bits.tsx.intx
2921                              ? (" intx") : (""),
2922                              packet->payload.mode.bits.tsx.abrt
2923                              ? (" abrt") : (""));
2924           break;
2925         }
2926       break;
2927
2928     case ppt_ovf:
2929       printf_unfiltered (("ovf"));
2930       break;
2931
2932     case ppt_stop:
2933       printf_unfiltered (("stop"));
2934       break;
2935
2936     case ppt_vmcs:
2937       printf_unfiltered (("vmcs %" PRIx64 ""), packet->payload.vmcs.base);
2938       break;
2939
2940     case ppt_tma:
2941       printf_unfiltered (("tma %x %x"), packet->payload.tma.ctc,
2942                          packet->payload.tma.fc);
2943       break;
2944
2945     case ppt_mtc:
2946       printf_unfiltered (("mtc %x"), packet->payload.mtc.ctc);
2947       break;
2948
2949     case ppt_cyc:
2950       printf_unfiltered (("cyc %" PRIx64 ""), packet->payload.cyc.value);
2951       break;
2952
2953     case ppt_mnt:
2954       printf_unfiltered (("mnt %" PRIx64 ""), packet->payload.mnt.payload);
2955       break;
2956     }
2957 }
2958
2959 /* Decode packets into MAINT using DECODER.  */
2960
2961 static void
2962 btrace_maint_decode_pt (struct btrace_maint_info *maint,
2963                         struct pt_packet_decoder *decoder)
2964 {
2965   int errcode;
2966
2967   for (;;)
2968     {
2969       struct btrace_pt_packet packet;
2970
2971       errcode = pt_pkt_sync_forward (decoder);
2972       if (errcode < 0)
2973         break;
2974
2975       for (;;)
2976         {
2977           pt_pkt_get_offset (decoder, &packet.offset);
2978
2979           errcode = pt_pkt_next (decoder, &packet.packet,
2980                                  sizeof(packet.packet));
2981           if (errcode < 0)
2982             break;
2983
2984           if (maint_btrace_pt_skip_pad == 0 || packet.packet.type != ppt_pad)
2985             {
2986               packet.errcode = pt_errcode (errcode);
2987               VEC_safe_push (btrace_pt_packet_s, maint->variant.pt.packets,
2988                              &packet);
2989             }
2990         }
2991
2992       if (errcode == -pte_eos)
2993         break;
2994
2995       packet.errcode = pt_errcode (errcode);
2996       VEC_safe_push (btrace_pt_packet_s, maint->variant.pt.packets,
2997                      &packet);
2998
2999       warning (_("Error at trace offset 0x%" PRIx64 ": %s."),
3000                packet.offset, pt_errstr (packet.errcode));
3001     }
3002
3003   if (errcode != -pte_eos)
3004     warning (_("Failed to synchronize onto the Intel Processor Trace "
3005                "stream: %s."), pt_errstr (pt_errcode (errcode)));
3006 }
3007
3008 /* Update the packet history in BTINFO.  */
3009
3010 static void
3011 btrace_maint_update_pt_packets (struct btrace_thread_info *btinfo)
3012 {
3013   struct pt_packet_decoder *decoder;
3014   const struct btrace_cpu *cpu;
3015   struct btrace_data_pt *pt;
3016   struct pt_config config;
3017   int errcode;
3018
3019   pt = &btinfo->data.variant.pt;
3020
3021   /* Nothing to do if there is no trace.  */
3022   if (pt->size == 0)
3023     return;
3024
3025   memset (&config, 0, sizeof(config));
3026
3027   config.size = sizeof (config);
3028   config.begin = pt->data;
3029   config.end = pt->data + pt->size;
3030
3031   cpu = record_btrace_get_cpu ();
3032   if (cpu == nullptr)
3033     cpu = &pt->config.cpu;
3034
3035   /* We treat an unknown vendor as 'no errata'.  */
3036   if (cpu->vendor != CV_UNKNOWN)
3037     {
3038       config.cpu.vendor = pt_translate_cpu_vendor (cpu->vendor);
3039       config.cpu.family = cpu->family;
3040       config.cpu.model = cpu->model;
3041       config.cpu.stepping = cpu->stepping;
3042
3043       errcode = pt_cpu_errata (&config.errata, &config.cpu);
3044       if (errcode < 0)
3045         error (_("Failed to configure the Intel Processor Trace "
3046                  "decoder: %s."), pt_errstr (pt_errcode (errcode)));
3047     }
3048
3049   decoder = pt_pkt_alloc_decoder (&config);
3050   if (decoder == NULL)
3051     error (_("Failed to allocate the Intel Processor Trace decoder."));
3052
3053   TRY
3054     {
3055       btrace_maint_decode_pt (&btinfo->maint, decoder);
3056     }
3057   CATCH (except, RETURN_MASK_ALL)
3058     {
3059       pt_pkt_free_decoder (decoder);
3060
3061       if (except.reason < 0)
3062         throw_exception (except);
3063     }
3064   END_CATCH
3065
3066   pt_pkt_free_decoder (decoder);
3067 }
3068
3069 #endif /* !defined (HAVE_LIBIPT)  */
3070
3071 /* Update the packet maintenance information for BTINFO and store the
3072    low and high bounds into BEGIN and END, respectively.
3073    Store the current iterator state into FROM and TO.  */
3074
3075 static void
3076 btrace_maint_update_packets (struct btrace_thread_info *btinfo,
3077                              unsigned int *begin, unsigned int *end,
3078                              unsigned int *from, unsigned int *to)
3079 {
3080   switch (btinfo->data.format)
3081     {
3082     default:
3083       *begin = 0;
3084       *end = 0;
3085       *from = 0;
3086       *to = 0;
3087       break;
3088
3089     case BTRACE_FORMAT_BTS:
3090       /* Nothing to do - we operate directly on BTINFO->DATA.  */
3091       *begin = 0;
3092       *end = VEC_length (btrace_block_s, btinfo->data.variant.bts.blocks);
3093       *from = btinfo->maint.variant.bts.packet_history.begin;
3094       *to = btinfo->maint.variant.bts.packet_history.end;
3095       break;
3096
3097 #if defined (HAVE_LIBIPT)
3098     case BTRACE_FORMAT_PT:
3099       if (VEC_empty (btrace_pt_packet_s, btinfo->maint.variant.pt.packets))
3100         btrace_maint_update_pt_packets (btinfo);
3101
3102       *begin = 0;
3103       *end = VEC_length (btrace_pt_packet_s, btinfo->maint.variant.pt.packets);
3104       *from = btinfo->maint.variant.pt.packet_history.begin;
3105       *to = btinfo->maint.variant.pt.packet_history.end;
3106       break;
3107 #endif /* defined (HAVE_LIBIPT)  */
3108     }
3109 }
3110
3111 /* Print packets in BTINFO from BEGIN (inclusive) until END (exclusive) and
3112    update the current iterator position.  */
3113
3114 static void
3115 btrace_maint_print_packets (struct btrace_thread_info *btinfo,
3116                             unsigned int begin, unsigned int end)
3117 {
3118   switch (btinfo->data.format)
3119     {
3120     default:
3121       break;
3122
3123     case BTRACE_FORMAT_BTS:
3124       {
3125         VEC (btrace_block_s) *blocks;
3126         unsigned int blk;
3127
3128         blocks = btinfo->data.variant.bts.blocks;
3129         for (blk = begin; blk < end; ++blk)
3130           {
3131             const btrace_block_s *block;
3132
3133             block = VEC_index (btrace_block_s, blocks, blk);
3134
3135             printf_unfiltered ("%u\tbegin: %s, end: %s\n", blk,
3136                                core_addr_to_string_nz (block->begin),
3137                                core_addr_to_string_nz (block->end));
3138           }
3139
3140         btinfo->maint.variant.bts.packet_history.begin = begin;
3141         btinfo->maint.variant.bts.packet_history.end = end;
3142       }
3143       break;
3144
3145 #if defined (HAVE_LIBIPT)
3146     case BTRACE_FORMAT_PT:
3147       {
3148         VEC (btrace_pt_packet_s) *packets;
3149         unsigned int pkt;
3150
3151         packets = btinfo->maint.variant.pt.packets;
3152         for (pkt = begin; pkt < end; ++pkt)
3153           {
3154             const struct btrace_pt_packet *packet;
3155
3156             packet = VEC_index (btrace_pt_packet_s, packets, pkt);
3157
3158             printf_unfiltered ("%u\t", pkt);
3159             printf_unfiltered ("0x%" PRIx64 "\t", packet->offset);
3160
3161             if (packet->errcode == pte_ok)
3162               pt_print_packet (&packet->packet);
3163             else
3164               printf_unfiltered ("[error: %s]", pt_errstr (packet->errcode));
3165
3166             printf_unfiltered ("\n");
3167           }
3168
3169         btinfo->maint.variant.pt.packet_history.begin = begin;
3170         btinfo->maint.variant.pt.packet_history.end = end;
3171       }
3172       break;
3173 #endif /* defined (HAVE_LIBIPT)  */
3174     }
3175 }
3176
3177 /* Read a number from an argument string.  */
3178
3179 static unsigned int
3180 get_uint (const char **arg)
3181 {
3182   const char *begin, *pos;
3183   char *end;
3184   unsigned long number;
3185
3186   begin = *arg;
3187   pos = skip_spaces (begin);
3188
3189   if (!isdigit (*pos))
3190     error (_("Expected positive number, got: %s."), pos);
3191
3192   number = strtoul (pos, &end, 10);
3193   if (number > UINT_MAX)
3194     error (_("Number too big."));
3195
3196   *arg += (end - begin);
3197
3198   return (unsigned int) number;
3199 }
3200
3201 /* Read a context size from an argument string.  */
3202
3203 static int
3204 get_context_size (const char **arg)
3205 {
3206   const char *pos = skip_spaces (*arg);
3207
3208   if (!isdigit (*pos))
3209     error (_("Expected positive number, got: %s."), pos);
3210
3211   char *end;
3212   long result = strtol (pos, &end, 10);
3213   *arg = end;
3214   return result;
3215 }
3216
3217 /* Complain about junk at the end of an argument string.  */
3218
3219 static void
3220 no_chunk (const char *arg)
3221 {
3222   if (*arg != 0)
3223     error (_("Junk after argument: %s."), arg);
3224 }
3225
3226 /* The "maintenance btrace packet-history" command.  */
3227
3228 static void
3229 maint_btrace_packet_history_cmd (const char *arg, int from_tty)
3230 {
3231   struct btrace_thread_info *btinfo;
3232   unsigned int size, begin, end, from, to;
3233
3234   thread_info *tp = find_thread_ptid (inferior_ptid);
3235   if (tp == NULL)
3236     error (_("No thread."));
3237
3238   size = 10;
3239   btinfo = &tp->btrace;
3240
3241   btrace_maint_update_packets (btinfo, &begin, &end, &from, &to);
3242   if (begin == end)
3243     {
3244       printf_unfiltered (_("No trace.\n"));
3245       return;
3246     }
3247
3248   if (arg == NULL || *arg == 0 || strcmp (arg, "+") == 0)
3249     {
3250       from = to;
3251
3252       if (end - from < size)
3253         size = end - from;
3254       to = from + size;
3255     }
3256   else if (strcmp (arg, "-") == 0)
3257     {
3258       to = from;
3259
3260       if (to - begin < size)
3261         size = to - begin;
3262       from = to - size;
3263     }
3264   else
3265     {
3266       from = get_uint (&arg);
3267       if (end <= from)
3268         error (_("'%u' is out of range."), from);
3269
3270       arg = skip_spaces (arg);
3271       if (*arg == ',')
3272         {
3273           arg = skip_spaces (++arg);
3274
3275           if (*arg == '+')
3276             {
3277               arg += 1;
3278               size = get_context_size (&arg);
3279
3280               no_chunk (arg);
3281
3282               if (end - from < size)
3283                 size = end - from;
3284               to = from + size;
3285             }
3286           else if (*arg == '-')
3287             {
3288               arg += 1;
3289               size = get_context_size (&arg);
3290
3291               no_chunk (arg);
3292
3293               /* Include the packet given as first argument.  */
3294               from += 1;
3295               to = from;
3296
3297               if (to - begin < size)
3298                 size = to - begin;
3299               from = to - size;
3300             }
3301           else
3302             {
3303               to = get_uint (&arg);
3304
3305               /* Include the packet at the second argument and silently
3306                  truncate the range.  */
3307               if (to < end)
3308                 to += 1;
3309               else
3310                 to = end;
3311
3312               no_chunk (arg);
3313             }
3314         }
3315       else
3316         {
3317           no_chunk (arg);
3318
3319           if (end - from < size)
3320             size = end - from;
3321           to = from + size;
3322         }
3323
3324       dont_repeat ();
3325     }
3326
3327   btrace_maint_print_packets (btinfo, from, to);
3328 }
3329
3330 /* The "maintenance btrace clear-packet-history" command.  */
3331
3332 static void
3333 maint_btrace_clear_packet_history_cmd (const char *args, int from_tty)
3334 {
3335   if (args != NULL && *args != 0)
3336     error (_("Invalid argument."));
3337
3338   if (inferior_ptid == null_ptid)
3339     error (_("No thread."));
3340
3341   thread_info *tp = inferior_thread ();
3342   btrace_thread_info *btinfo = &tp->btrace;
3343
3344   /* Must clear the maint data before - it depends on BTINFO->DATA.  */
3345   btrace_maint_clear (btinfo);
3346   btinfo->data.clear ();
3347 }
3348
3349 /* The "maintenance btrace clear" command.  */
3350
3351 static void
3352 maint_btrace_clear_cmd (const char *args, int from_tty)
3353 {
3354   if (args != NULL && *args != 0)
3355     error (_("Invalid argument."));
3356
3357   if (inferior_ptid == null_ptid)
3358     error (_("No thread."));
3359
3360   thread_info *tp = inferior_thread ();
3361   btrace_clear (tp);
3362 }
3363
3364 /* The "maintenance btrace" command.  */
3365
3366 static void
3367 maint_btrace_cmd (const char *args, int from_tty)
3368 {
3369   help_list (maint_btrace_cmdlist, "maintenance btrace ", all_commands,
3370              gdb_stdout);
3371 }
3372
3373 /* The "maintenance set btrace" command.  */
3374
3375 static void
3376 maint_btrace_set_cmd (const char *args, int from_tty)
3377 {
3378   help_list (maint_btrace_set_cmdlist, "maintenance set btrace ", all_commands,
3379              gdb_stdout);
3380 }
3381
3382 /* The "maintenance show btrace" command.  */
3383
3384 static void
3385 maint_btrace_show_cmd (const char *args, int from_tty)
3386 {
3387   help_list (maint_btrace_show_cmdlist, "maintenance show btrace ",
3388              all_commands, gdb_stdout);
3389 }
3390
3391 /* The "maintenance set btrace pt" command.  */
3392
3393 static void
3394 maint_btrace_pt_set_cmd (const char *args, int from_tty)
3395 {
3396   help_list (maint_btrace_pt_set_cmdlist, "maintenance set btrace pt ",
3397              all_commands, gdb_stdout);
3398 }
3399
3400 /* The "maintenance show btrace pt" command.  */
3401
3402 static void
3403 maint_btrace_pt_show_cmd (const char *args, int from_tty)
3404 {
3405   help_list (maint_btrace_pt_show_cmdlist, "maintenance show btrace pt ",
3406              all_commands, gdb_stdout);
3407 }
3408
3409 /* The "maintenance info btrace" command.  */
3410
3411 static void
3412 maint_info_btrace_cmd (const char *args, int from_tty)
3413 {
3414   struct btrace_thread_info *btinfo;
3415   const struct btrace_config *conf;
3416
3417   if (args != NULL && *args != 0)
3418     error (_("Invalid argument."));
3419
3420   if (inferior_ptid == null_ptid)
3421     error (_("No thread."));
3422
3423   thread_info *tp = inferior_thread ();
3424
3425   btinfo = &tp->btrace;
3426
3427   conf = btrace_conf (btinfo);
3428   if (conf == NULL)
3429     error (_("No btrace configuration."));
3430
3431   printf_unfiltered (_("Format: %s.\n"),
3432                      btrace_format_string (conf->format));
3433
3434   switch (conf->format)
3435     {
3436     default:
3437       break;
3438
3439     case BTRACE_FORMAT_BTS:
3440       printf_unfiltered (_("Number of packets: %u.\n"),
3441                          VEC_length (btrace_block_s,
3442                                      btinfo->data.variant.bts.blocks));
3443       break;
3444
3445 #if defined (HAVE_LIBIPT)
3446     case BTRACE_FORMAT_PT:
3447       {
3448         struct pt_version version;
3449
3450         version = pt_library_version ();
3451         printf_unfiltered (_("Version: %u.%u.%u%s.\n"), version.major,
3452                            version.minor, version.build,
3453                            version.ext != NULL ? version.ext : "");
3454
3455         btrace_maint_update_pt_packets (btinfo);
3456         printf_unfiltered (_("Number of packets: %u.\n"),
3457                            VEC_length (btrace_pt_packet_s,
3458                                        btinfo->maint.variant.pt.packets));
3459       }
3460       break;
3461 #endif /* defined (HAVE_LIBIPT)  */
3462     }
3463 }
3464
3465 /* The "maint show btrace pt skip-pad" show value function. */
3466
3467 static void
3468 show_maint_btrace_pt_skip_pad  (struct ui_file *file, int from_tty,
3469                                   struct cmd_list_element *c,
3470                                   const char *value)
3471 {
3472   fprintf_filtered (file, _("Skip PAD packets is %s.\n"), value);
3473 }
3474
3475
3476 /* Initialize btrace maintenance commands.  */
3477
3478 void
3479 _initialize_btrace (void)
3480 {
3481   add_cmd ("btrace", class_maintenance, maint_info_btrace_cmd,
3482            _("Info about branch tracing data."), &maintenanceinfolist);
3483
3484   add_prefix_cmd ("btrace", class_maintenance, maint_btrace_cmd,
3485                   _("Branch tracing maintenance commands."),
3486                   &maint_btrace_cmdlist, "maintenance btrace ",
3487                   0, &maintenancelist);
3488
3489   add_prefix_cmd ("btrace", class_maintenance, maint_btrace_set_cmd, _("\
3490 Set branch tracing specific variables."),
3491                   &maint_btrace_set_cmdlist, "maintenance set btrace ",
3492                   0, &maintenance_set_cmdlist);
3493
3494   add_prefix_cmd ("pt", class_maintenance, maint_btrace_pt_set_cmd, _("\
3495 Set Intel Processor Trace specific variables."),
3496                   &maint_btrace_pt_set_cmdlist, "maintenance set btrace pt ",
3497                   0, &maint_btrace_set_cmdlist);
3498
3499   add_prefix_cmd ("btrace", class_maintenance, maint_btrace_show_cmd, _("\
3500 Show branch tracing specific variables."),
3501                   &maint_btrace_show_cmdlist, "maintenance show btrace ",
3502                   0, &maintenance_show_cmdlist);
3503
3504   add_prefix_cmd ("pt", class_maintenance, maint_btrace_pt_show_cmd, _("\
3505 Show Intel Processor Trace specific variables."),
3506                   &maint_btrace_pt_show_cmdlist, "maintenance show btrace pt ",
3507                   0, &maint_btrace_show_cmdlist);
3508
3509   add_setshow_boolean_cmd ("skip-pad", class_maintenance,
3510                            &maint_btrace_pt_skip_pad, _("\
3511 Set whether PAD packets should be skipped in the btrace packet history."), _("\
3512 Show whether PAD packets should be skipped in the btrace packet history."),_("\
3513 When enabled, PAD packets are ignored in the btrace packet history."),
3514                            NULL, show_maint_btrace_pt_skip_pad,
3515                            &maint_btrace_pt_set_cmdlist,
3516                            &maint_btrace_pt_show_cmdlist);
3517
3518   add_cmd ("packet-history", class_maintenance, maint_btrace_packet_history_cmd,
3519            _("Print the raw branch tracing data.\n\
3520 With no argument, print ten more packets after the previous ten-line print.\n\
3521 With '-' as argument print ten packets before a previous ten-line print.\n\
3522 One argument specifies the starting packet of a ten-line print.\n\
3523 Two arguments with comma between specify starting and ending packets to \
3524 print.\n\
3525 Preceded with '+'/'-' the second argument specifies the distance from the \
3526 first.\n"),
3527            &maint_btrace_cmdlist);
3528
3529   add_cmd ("clear-packet-history", class_maintenance,
3530            maint_btrace_clear_packet_history_cmd,
3531            _("Clears the branch tracing packet history.\n\
3532 Discards the raw branch tracing data but not the execution history data.\n\
3533 "),
3534            &maint_btrace_cmdlist);
3535
3536   add_cmd ("clear", class_maintenance, maint_btrace_clear_cmd,
3537            _("Clears the branch tracing data.\n\
3538 Discards the raw branch tracing data and the execution history data.\n\
3539 The next 'record' command will fetch the branch tracing data anew.\n\
3540 "),
3541            &maint_btrace_cmdlist);
3542
3543 }