mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-24 09:43:36 +08:00
8d297bbf60
This patch fixes C++ build errors like this: /home/pedro/gdb/mygit/cxx-convertion/src/gdb/linux-tdep.c:1126:35: error: invalid conversion from ‘int’ to ‘filterflags’ [-fpermissive] | COREFILTER_HUGETLB_PRIVATE); ^ This is a case of enums used as bit flags. Unlike "regular" enums, these values are supposed to be or'ed together. However, in C++, the type of "(ENUM1 | ENUM2)" is int, and you then can't assign an int to an enum variable without a cast. That means that this: enum foo_flags flags = 0; if (...) flags |= FOO_FLAG1; if (...) flags |= FOO_FLAG2; ... would have to be written as: enum foo_flags flags = (enum foo_flags) 0; if (...) flags = (enum foo_flags) (flags | FOO_FLAG1); if (...) flags = (enum foo_flags) (flags | FOO_FLAG2); which is ... ugly. Alternatively, we'd have to use an int for the variable's type, which isn't ideal either. This patch instead adds an "enum flags" class. "enum flags" are exactly the enums where the values are bits that are meant to be ORed together. This allows writing code like the below, while with raw enums this would fail to compile without casts to enum type at the assignments to 'f': enum some_flag { flag_val1 = 1 << 1, flag_val2 = 1 << 2, flag_val3 = 1 << 3, flag_val4 = 1 << 4, }; DEF_ENUM_FLAGS_TYPE(enum some_flag, some_flags) some_flags f = flag_val1 | flag_val2; f |= flag_val3; It's also possible to assign literal zero to an enum flags variable (meaning, no flags), dispensing either adding an awkward explicit "no value" value to the enumeration or the cast to assignments from 0. For example: some_flags f = 0; f |= flag_val3 | flag_val4; Note that literal integers other than zero do fail to compile: some_flags f = 1; // error C is still supported -- DEF_ENUM_FLAGS_TYPE is just a typedef in that case. gdb/ChangeLog: 2015-11-17 Pedro Alves <palves@redhat.com> * btrace.h: Include common/enum-flags.h. (btrace_insn_flags): Define. (struct btrace_insn) <flags>: Change type. (btrace_function_flags): Define. (struct btrace_function) <flags>: Change type. (btrace_thread_flags): Define. (struct btrace_thread_info) <flags>: Change type. * c-exp.y (token_flags): Rename to ... (token_flag): ... this. (token_flags): Define. (struct token) <flags>: Change type. * common/enum-flags.h: New file. * compile/compile-c-types.c (convert_qualified): Change type of 'quals' local. * compile/compile-internal.h: Include "common/enum-flags.h". (gcc_qualifiers_flags): Define. * completer.c (enum reg_completer_targets): Rename to ... (enum reg_completer_target): ... this. (reg_completer_targets): Define. (reg_or_group_completer_1): Change type of 'targets' parameter. * disasm.c (do_mixed_source_and_assembly_deprecated): Change type of 'psl_flags' local. (do_mixed_source_and_assembly): Change type of 'psl_flags' local. * infrun.c: Include "common/enum-flags.h". (enum step_over_what): Rename to ... (enum step_over_what_flag): ... this. (step_over_what): Change type. (start_step_over): Change type of 'step_what' local. (thread_still_needs_step_over): Now returns a step_over_what. Adjust. (keep_going_pass_signal): Change type of 'step_what' local. * linux-tdep.c: Include "common/enum-flags.h". (enum filterflags): Rename to ... (enum filter_flag): ... this. (filter_flags): Define. (dump_mapping_p): Change type of 'filterflags' parameter. (linux_find_memory_regions_full): Change type of 'filterflags' local. (linux_find_memory_regions_full): Pass the address of an unsigned int to sscanf instead of the address of an enum. * record-btrace.c (btrace_print_lines): Change type of local 'psl_flags'. (btrace_call_history): Replace 'flags' parameter with 'int_flags' parameter. Adjust. (record_btrace_call_history, record_btrace_call_history_range) (record_btrace_call_history_from): Rename 'flags' parameter to 'int_flags'. Use record_print_flags. * record.h: Include "common/enum-flags.h". (record_print_flags): Define. * source.c: Include "common/enum-flags.h". (print_source_lines_base, print_source_lines): Change type of flags parameter. * symtab.h: Include "common/enum-flags.h". (enum print_source_lines_flags): Rename to ... (enum print_source_lines_flag): ... this. (print_source_lines_flags): Define. (print_source_lines): Change prototype.
95 lines
3.4 KiB
C
95 lines
3.4 KiB
C
/* Process record and replay target for GDB, the GNU debugger.
|
|
|
|
Copyright (C) 2008-2015 Free Software Foundation, Inc.
|
|
|
|
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/>. */
|
|
|
|
#ifndef _RECORD_H_
|
|
#define _RECORD_H_
|
|
|
|
#include "target/waitstatus.h" /* For enum target_stop_reason. */
|
|
#include "common/enum-flags.h"
|
|
|
|
struct cmd_list_element;
|
|
|
|
extern unsigned int record_debug;
|
|
|
|
/* Allow record targets to add their own sub-commands. */
|
|
extern struct cmd_list_element *record_cmdlist;
|
|
extern struct cmd_list_element *set_record_cmdlist;
|
|
extern struct cmd_list_element *show_record_cmdlist;
|
|
extern struct cmd_list_element *info_record_cmdlist;
|
|
|
|
/* Unwinders for some record targets. */
|
|
extern const struct frame_unwind record_btrace_frame_unwind;
|
|
extern const struct frame_unwind record_btrace_tailcall_frame_unwind;
|
|
|
|
/* A list of flags specifying what record target methods should print. */
|
|
enum record_print_flag
|
|
{
|
|
/* Print the source file and line (if applicable). */
|
|
RECORD_PRINT_SRC_LINE = (1 << 0),
|
|
|
|
/* Print the instruction number range (if applicable). */
|
|
RECORD_PRINT_INSN_RANGE = (1 << 1),
|
|
|
|
/* Indent based on call stack depth (if applicable). */
|
|
RECORD_PRINT_INDENT_CALLS = (1 << 2)
|
|
};
|
|
DEF_ENUM_FLAGS_TYPE (enum record_print_flag, record_print_flags);
|
|
|
|
/* Determined whether the target is stopped at a software or hardware
|
|
breakpoint, based on PC and the breakpoint tables. The breakpoint
|
|
type is translated to the appropriate target_stop_reason and
|
|
written to REASON. Returns true if stopped at a breakpoint, false
|
|
otherwise. */
|
|
|
|
extern int
|
|
record_check_stopped_by_breakpoint (struct address_space *aspace,
|
|
CORE_ADDR pc,
|
|
enum target_stop_reason *reason);
|
|
|
|
/* Wrapper for target_read_memory that prints a debug message if
|
|
reading memory fails. */
|
|
extern int record_read_memory (struct gdbarch *gdbarch,
|
|
CORE_ADDR memaddr, gdb_byte *myaddr,
|
|
ssize_t len);
|
|
|
|
/* A wrapper for target_goto_record that parses ARG as a number. */
|
|
extern void record_goto (const char *arg);
|
|
|
|
/* The default "to_disconnect" target method for record targets. */
|
|
extern void record_disconnect (struct target_ops *, const char *, int);
|
|
|
|
/* The default "to_detach" target method for record targets. */
|
|
extern void record_detach (struct target_ops *, const char *, int);
|
|
|
|
/* The default "to_mourn_inferior" target method for record targets. */
|
|
extern void record_mourn_inferior (struct target_ops *);
|
|
|
|
/* The default "to_kill" target method for record targets. */
|
|
extern void record_kill (struct target_ops *);
|
|
|
|
/* Find the record_stratum target in the current target stack.
|
|
Returns NULL if none is found. */
|
|
extern struct target_ops *find_record_target (void);
|
|
|
|
/* This is to be called by record_stratum targets' open routine before
|
|
it does anything. */
|
|
extern void record_preopen (void);
|
|
|
|
#endif /* _RECORD_H_ */
|