| /* Copyright (C) 2014-2021 Free Software Foundation, Inc. | |
| Contributed by Intel Corp. <markus.t.metzger@intel.com> | |
| This file is part of GDB. | |
| This program is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; either version 3 of the License, or | |
| (at your option) any later version. | |
| This program is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| GNU General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
| #include "common-defs.h" | |
| #include "btrace-common.h" | |
| /* See btrace-common.h. */ | |
| const char * | |
| btrace_format_string (enum btrace_format format) | |
| { | |
| switch (format) | |
| { | |
| case BTRACE_FORMAT_NONE: | |
| return _("No or unknown format"); | |
| case BTRACE_FORMAT_BTS: | |
| return _("Branch Trace Store"); | |
| case BTRACE_FORMAT_PT: | |
| return _("Intel Processor Trace"); | |
| } | |
| internal_error (__FILE__, __LINE__, _("Unknown branch trace format")); | |
| } | |
| /* See btrace-common.h. */ | |
| const char * | |
| btrace_format_short_string (enum btrace_format format) | |
| { | |
| switch (format) | |
| { | |
| case BTRACE_FORMAT_NONE: | |
| return "unknown"; | |
| case BTRACE_FORMAT_BTS: | |
| return "bts"; | |
| case BTRACE_FORMAT_PT: | |
| return "pt"; | |
| } | |
| internal_error (__FILE__, __LINE__, _("Unknown branch trace format")); | |
| } | |
| /* See btrace-common.h. */ | |
| void | |
| btrace_data::fini () | |
| { | |
| switch (format) | |
| { | |
| case BTRACE_FORMAT_NONE: | |
| /* Nothing to do. */ | |
| return; | |
| case BTRACE_FORMAT_BTS: | |
| delete variant.bts.blocks; | |
| variant.bts.blocks = nullptr; | |
| return; | |
| case BTRACE_FORMAT_PT: | |
| xfree (variant.pt.data); | |
| return; | |
| } | |
| internal_error (__FILE__, __LINE__, _("Unkown branch trace format.")); | |
| } | |
| /* See btrace-common.h. */ | |
| bool | |
| btrace_data::empty () const | |
| { | |
| switch (format) | |
| { | |
| case BTRACE_FORMAT_NONE: | |
| return true; | |
| case BTRACE_FORMAT_BTS: | |
| return variant.bts.blocks->empty (); | |
| case BTRACE_FORMAT_PT: | |
| return (variant.pt.size == 0); | |
| } | |
| internal_error (__FILE__, __LINE__, _("Unkown branch trace format.")); | |
| } | |
| /* See btrace-common.h. */ | |
| void | |
| btrace_data::clear () | |
| { | |
| fini (); | |
| format = BTRACE_FORMAT_NONE; | |
| } | |
| /* See btrace-common.h. */ | |
| int | |
| btrace_data_append (struct btrace_data *dst, | |
| const struct btrace_data *src) | |
| { | |
| switch (src->format) | |
| { | |
| case BTRACE_FORMAT_NONE: | |
| return 0; | |
| case BTRACE_FORMAT_BTS: | |
| switch (dst->format) | |
| { | |
| default: | |
| return -1; | |
| case BTRACE_FORMAT_NONE: | |
| dst->format = BTRACE_FORMAT_BTS; | |
| dst->variant.bts.blocks = new std::vector<btrace_block>; | |
| /* Fall-through. */ | |
| case BTRACE_FORMAT_BTS: | |
| { | |
| unsigned int blk; | |
| /* We copy blocks in reverse order to have the oldest block at | |
| index zero. */ | |
| blk = src->variant.bts.blocks->size (); | |
| while (blk != 0) | |
| { | |
| const btrace_block &block | |
| = src->variant.bts.blocks->at (--blk); | |
| dst->variant.bts.blocks->push_back (block); | |
| } | |
| } | |
| } | |
| return 0; | |
| case BTRACE_FORMAT_PT: | |
| switch (dst->format) | |
| { | |
| default: | |
| return -1; | |
| case BTRACE_FORMAT_NONE: | |
| dst->format = BTRACE_FORMAT_PT; | |
| dst->variant.pt.data = NULL; | |
| dst->variant.pt.size = 0; | |
| /* fall-through. */ | |
| case BTRACE_FORMAT_PT: | |
| { | |
| gdb_byte *data; | |
| size_t size; | |
| size = src->variant.pt.size + dst->variant.pt.size; | |
| data = (gdb_byte *) xmalloc (size); | |
| if (dst->variant.pt.size > 0) | |
| memcpy (data, dst->variant.pt.data, dst->variant.pt.size); | |
| memcpy (data + dst->variant.pt.size, src->variant.pt.data, | |
| src->variant.pt.size); | |
| xfree (dst->variant.pt.data); | |
| dst->variant.pt.data = data; | |
| dst->variant.pt.size = size; | |
| } | |
| } | |
| return 0; | |
| } | |
| internal_error (__FILE__, __LINE__, _("Unkown branch trace format.")); | |
| } |