123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646 |
- /* *INDENT-OFF* */ /* ATTRIBUTE_PRINTF confuses indent, avoid running it
- for now. */
- /* Basic, host-specific, and target-specific definitions for GDB.
- Copyright (C) 1986-2022 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 DEFS_H
- #define DEFS_H
- #ifdef GDBSERVER
- # error gdbserver should not include gdb/defs.h
- #endif
- #include "gdbsupport/common-defs.h"
- #undef PACKAGE
- #undef PACKAGE_NAME
- #undef PACKAGE_VERSION
- #undef PACKAGE_STRING
- #undef PACKAGE_TARNAME
- #include <config.h>
- #include "bfd.h"
- #include <sys/types.h>
- #include <limits.h>
- /* The libdecnumber library, on which GDB depends, includes a header file
- called gstdint.h instead of relying directly on stdint.h. GDB, on the
- other hand, includes stdint.h directly, relying on the fact that gnulib
- generates a copy if the system doesn't provide one or if it is missing
- some features. Unfortunately, gstdint.h and stdint.h cannot be included
- at the same time, which may happen when we include a file from
- libdecnumber.
- The following macro definition effectively prevents the inclusion of
- gstdint.h, as all the definitions it provides are guarded against
- the GCC_GENERATED_STDINT_H macro. We already have gnulib/stdint.h
- included, so it's ok to blank out gstdint.h. */
- #define GCC_GENERATED_STDINT_H 1
- #include <unistd.h>
- #include <fcntl.h>
- #include "gdb_wchar.h"
- #include "ui-file.h"
- #include "gdbsupport/host-defs.h"
- #include "gdbsupport/enum-flags.h"
- #include "gdbsupport/array-view.h"
- /* Scope types enumerator. List the types of scopes the compiler will
- accept. */
- enum compile_i_scope_types
- {
- COMPILE_I_INVALID_SCOPE,
- /* A simple scope. Wrap an expression into a simple scope that
- takes no arguments, returns no value, and uses the generic
- function name "_gdb_expr". */
- COMPILE_I_SIMPLE_SCOPE,
- /* Do not wrap the expression,
- it has to provide function "_gdb_expr" on its own. */
- COMPILE_I_RAW_SCOPE,
- /* A printable expression scope. Wrap an expression into a scope
- suitable for the "compile print" command. It uses the generic
- function name "_gdb_expr". COMPILE_I_PRINT_ADDRESS_SCOPE variant
- is the usual one, taking address of the object.
- COMPILE_I_PRINT_VALUE_SCOPE is needed for arrays where the array
- name already specifies its address. See get_out_value_type. */
- COMPILE_I_PRINT_ADDRESS_SCOPE,
- COMPILE_I_PRINT_VALUE_SCOPE,
- };
- template<typename T>
- using RequireLongest = gdb::Requires<gdb::Or<std::is_same<T, LONGEST>,
- std::is_same<T, ULONGEST>>>;
- /* Just in case they're not defined in stdio.h. */
- #ifndef SEEK_SET
- #define SEEK_SET 0
- #endif
- #ifndef SEEK_CUR
- #define SEEK_CUR 1
- #endif
- /* The O_BINARY flag is defined in fcntl.h on some non-Posix platforms.
- It is used as an access modifier in calls to open(), where it acts
- similarly to the "b" character in fopen()'s MODE argument. On Posix
- platforms it should be a no-op, so it is defined as 0 here. This
- ensures that the symbol may be used freely elsewhere in gdb. */
- #ifndef O_BINARY
- #define O_BINARY 0
- #endif
- #include "hashtab.h"
- /* * System root path, used to find libraries etc. */
- extern std::string gdb_sysroot;
- /* * GDB datadir, used to store data files. */
- extern std::string gdb_datadir;
- /* * If not empty, the possibly relocated path to python's "lib" directory
- specified with --with-python. */
- extern std::string python_libdir;
- /* * Search path for separate debug files. */
- extern std::string debug_file_directory;
- /* GDB's SIGINT handler basically sets a flag; code that might take a
- long time before it gets back to the event loop, and which ought to
- be interruptible, checks this flag using the QUIT macro, which, if
- GDB has the terminal, throws a quit exception.
- In addition to setting a flag, the SIGINT handler also marks a
- select/poll-able file descriptor as read-ready. That is used by
- interruptible_select in order to support interrupting blocking I/O
- in a race-free manner.
- These functions use the extension_language_ops API to allow extension
- language(s) and GDB SIGINT handling to coexist seamlessly. */
- /* * Evaluate to non-zero if the quit flag is set, zero otherwise. This
- will clear the quit flag as a side effect. */
- extern int check_quit_flag (void);
- /* * Set the quit flag. */
- extern void set_quit_flag (void);
- /* The current quit handler (and its type). This is called from the
- QUIT macro. See default_quit_handler below for default behavior.
- Parts of GDB temporarily override this to e.g., completely suppress
- Ctrl-C because it would not be safe to throw. E.g., normally, you
- wouldn't want to quit between a RSP command and its response, as
- that would break the communication with the target, but you may
- still want to intercept the Ctrl-C and offer to disconnect if the
- user presses Ctrl-C multiple times while the target is stuck
- waiting for the wedged remote stub. */
- typedef void (quit_handler_ftype) (void);
- extern quit_handler_ftype *quit_handler;
- /* The default quit handler. Checks whether Ctrl-C was pressed, and
- if so:
- - If GDB owns the terminal, throws a quit exception.
- - If GDB does not own the terminal, forwards the Ctrl-C to the
- target.
- */
- extern void default_quit_handler (void);
- /* Flag that function quit should call quit_force. */
- extern volatile int sync_quit_force_run;
- extern void quit (void);
- /* Helper for the QUIT macro. */
- extern void maybe_quit (void);
- /* Check whether a Ctrl-C was typed, and if so, call the current quit
- handler. */
- #define QUIT maybe_quit ()
- /* Set the serial event associated with the quit flag. */
- extern void quit_serial_event_set (void);
- /* Clear the serial event associated with the quit flag. */
- extern void quit_serial_event_clear (void);
- /* * Languages represented in the symbol table and elsewhere.
- This should probably be in language.h, but since enum's can't
- be forward declared to satisfy opaque references before their
- actual definition, needs to be here.
- The constants here are in priority order. In particular,
- demangling is attempted according to this order.
- Note that there's ambiguity between the mangling schemes of some of
- these languages, so some symbols could be successfully demangled by
- several languages. For that reason, the constants here are sorted
- in the order we'll attempt demangling them. For example: Rust uses
- C++ mangling, so must come after C++; Ada must come last (see
- ada_sniff_from_mangled_name). (Keep this order in sync with the
- 'languages' array in language.c.) */
- enum language
- {
- language_unknown, /* Language not known */
- language_auto, /* Placeholder for automatic setting */
- language_c, /* C */
- language_objc, /* Objective-C */
- language_cplus, /* C++ */
- language_d, /* D */
- language_go, /* Go */
- language_fortran, /* Fortran */
- language_m2, /* Modula-2 */
- language_asm, /* Assembly language */
- language_pascal, /* Pascal */
- language_opencl, /* OpenCL */
- language_rust, /* Rust */
- language_minimal, /* All other languages, minimal support only */
- language_ada, /* Ada */
- nr_languages
- };
- /* The number of bits needed to represent all languages, with enough
- padding to allow for reasonable growth. */
- #define LANGUAGE_BITS 5
- gdb_static_assert (nr_languages <= (1 << LANGUAGE_BITS));
- enum precision_type
- {
- single_precision,
- double_precision,
- unspecified_precision
- };
- /* * A generic, not quite boolean, enumeration. This is used for
- set/show commands in which the options are on/off/automatic. */
- enum auto_boolean
- {
- AUTO_BOOLEAN_TRUE,
- AUTO_BOOLEAN_FALSE,
- AUTO_BOOLEAN_AUTO
- };
- /* * Potential ways that a function can return a value of a given
- type. */
- enum return_value_convention
- {
- /* * Where the return value has been squeezed into one or more
- registers. */
- RETURN_VALUE_REGISTER_CONVENTION,
- /* * Commonly known as the "struct return convention". The caller
- passes an additional hidden first parameter to the caller. That
- parameter contains the address at which the value being returned
- should be stored. While typically, and historically, used for
- large structs, this is convention is applied to values of many
- different types. */
- RETURN_VALUE_STRUCT_CONVENTION,
- /* * Like the "struct return convention" above, but where the ABI
- guarantees that the called function stores the address at which
- the value being returned is stored in a well-defined location,
- such as a register or memory slot in the stack frame. Don't use
- this if the ABI doesn't explicitly guarantees this. */
- RETURN_VALUE_ABI_RETURNS_ADDRESS,
- /* * Like the "struct return convention" above, but where the ABI
- guarantees that the address at which the value being returned is
- stored will be available in a well-defined location, such as a
- register or memory slot in the stack frame. Don't use this if
- the ABI doesn't explicitly guarantees this. */
- RETURN_VALUE_ABI_PRESERVES_ADDRESS,
- };
- /* Needed for various prototypes */
- struct symtab;
- struct breakpoint;
- struct frame_info;
- struct gdbarch;
- struct value;
- /* From main.c. */
- /* This really belong in utils.c (path-utils.c?), but it references some
- globals that are currently only available to main.c. */
- extern std::string relocate_gdb_directory (const char *initial, bool relocatable);
- /* Annotation stuff. */
- extern int annotation_level; /* in stack.c */
- /* From regex.c or libc. BSD 4.4 declares this with the argument type as
- "const char *" in unistd.h, so we can't declare the argument
- as "char *". */
- EXTERN_C char *re_comp (const char *);
- /* From symfile.c */
- extern void symbol_file_command (const char *, int);
- /* From top.c */
- typedef void initialize_file_ftype (void);
- extern char *gdb_readline_wrapper (const char *);
- extern const char *command_line_input (const char *, const char *);
- extern void print_prompt (void);
- struct ui;
- extern int input_interactive_p (struct ui *);
- extern bool info_verbose;
- /* From printcmd.c */
- extern void set_next_address (struct gdbarch *, CORE_ADDR);
- extern int print_address_symbolic (struct gdbarch *, CORE_ADDR,
- struct ui_file *, int,
- const char *);
- extern void print_address (struct gdbarch *, CORE_ADDR, struct ui_file *);
- extern const char *pc_prefix (CORE_ADDR);
- /* From exec.c */
- /* * Process memory area starting at ADDR with length SIZE. Area is
- readable iff READ is non-zero, writable if WRITE is non-zero,
- executable if EXEC is non-zero. Area is possibly changed against
- its original file based copy if MODIFIED is non-zero. DATA is
- passed without changes from a caller. */
- typedef int (*find_memory_region_ftype) (CORE_ADDR addr, unsigned long size,
- int read, int write, int exec,
- int modified, void *data);
- /* * Possible lvalue types. Like enum language, this should be in
- value.h, but needs to be here for the same reason. */
- enum lval_type
- {
- /* * Not an lval. */
- not_lval,
- /* * In memory. */
- lval_memory,
- /* * In a register. Registers are relative to a frame. */
- lval_register,
- /* * In a gdb internal variable. */
- lval_internalvar,
- /* * Value encapsulates a callable defined in an extension language. */
- lval_xcallable,
- /* * Part of a gdb internal variable (structure field). */
- lval_internalvar_component,
- /* * Value's bits are fetched and stored using functions provided
- by its creator. */
- lval_computed
- };
- /* * Parameters of the "info proc" command. */
- enum info_proc_what
- {
- /* * Display the default cmdline, cwd and exe outputs. */
- IP_MINIMAL,
- /* * Display `info proc mappings'. */
- IP_MAPPINGS,
- /* * Display `info proc status'. */
- IP_STATUS,
- /* * Display `info proc stat'. */
- IP_STAT,
- /* * Display `info proc cmdline'. */
- IP_CMDLINE,
- /* * Display `info proc exe'. */
- IP_EXE,
- /* * Display `info proc cwd'. */
- IP_CWD,
- /* * Display `info proc files'. */
- IP_FILES,
- /* * Display all of the above. */
- IP_ALL
- };
- /* * Default radixes for input and output. Only some values supported. */
- extern unsigned input_radix;
- extern unsigned output_radix;
- /* * Possibilities for prettyformat parameters to routines which print
- things. Like enum language, this should be in value.h, but needs
- to be here for the same reason. FIXME: If we can eliminate this
- as an arg to LA_VAL_PRINT, then we can probably move it back to
- value.h. */
- enum val_prettyformat
- {
- Val_no_prettyformat = 0,
- Val_prettyformat,
- /* * Use the default setting which the user has specified. */
- Val_prettyformat_default
- };
- /* * Optional native machine support. Non-native (and possibly pure
- multi-arch) targets do not need a "nm.h" file. This will be a
- symlink to one of the nm-*.h files, built by the `configure'
- script. */
- #ifdef GDB_NM_FILE
- #include "nm.h"
- #endif
- /* Assume that fopen accepts the letter "b" in the mode string.
- It is demanded by ISO C9X, and should be supported on all
- platforms that claim to have a standard-conforming C library. On
- true POSIX systems it will be ignored and have no effect. There
- may still be systems without a standard-conforming C library where
- an ISO C9X compiler (GCC) is available. Known examples are SunOS
- 4.x and 4.3BSD. This assumption means these systems are no longer
- supported. */
- #ifndef FOPEN_RB
- # include "fopen-bin.h"
- #endif
- /* Defaults for system-wide constants (if not defined by xm.h, we fake it).
- FIXME: Assumes 2's complement arithmetic. */
- #if !defined (UINT_MAX)
- #define UINT_MAX ((unsigned int)(~0)) /* 0xFFFFFFFF for 32-bits */
- #endif
- #if !defined (INT_MAX)
- #define INT_MAX ((int)(UINT_MAX >> 1)) /* 0x7FFFFFFF for 32-bits */
- #endif
- #if !defined (INT_MIN)
- #define INT_MIN ((int)((int) ~0 ^ INT_MAX)) /* 0x80000000 for 32-bits */
- #endif
- #if !defined (ULONG_MAX)
- #define ULONG_MAX ((unsigned long)(~0L)) /* 0xFFFFFFFF for 32-bits */
- #endif
- #if !defined (LONG_MAX)
- #define LONG_MAX ((long)(ULONG_MAX >> 1)) /* 0x7FFFFFFF for 32-bits */
- #endif
- #if !defined (ULONGEST_MAX)
- #define ULONGEST_MAX (~(ULONGEST)0) /* 0xFFFFFFFFFFFFFFFF for 64-bits */
- #endif
- #if !defined (LONGEST_MAX) /* 0x7FFFFFFFFFFFFFFF for 64-bits */
- #define LONGEST_MAX ((LONGEST)(ULONGEST_MAX >> 1))
- #endif
- /* * Convert a LONGEST to an int. This is used in contexts (e.g. number of
- arguments to a function, number in a value history, register number, etc.)
- where the value must not be larger than can fit in an int. */
- extern int longest_to_int (LONGEST);
- /* Enumerate the requirements a symbol has in order to be evaluated.
- These are listed in order of "strength" -- a later entry subsumes
- earlier ones. This fine-grained distinction is important because
- it allows for the evaluation of a TLS symbol during unwinding --
- when unwinding one has access to registers, but not the frame
- itself, because that is being constructed. */
- enum symbol_needs_kind
- {
- /* No special requirements -- just memory. */
- SYMBOL_NEEDS_NONE,
- /* The symbol needs registers. */
- SYMBOL_NEEDS_REGISTERS,
- /* The symbol needs a frame. */
- SYMBOL_NEEDS_FRAME
- };
- /* In findvar.c. */
- template<typename T, typename = RequireLongest<T>>
- T extract_integer (gdb::array_view<const gdb_byte>, enum bfd_endian byte_order);
- static inline LONGEST
- extract_signed_integer (gdb::array_view<const gdb_byte> buf,
- enum bfd_endian byte_order)
- {
- return extract_integer<LONGEST> (buf, byte_order);
- }
- static inline LONGEST
- extract_signed_integer (const gdb_byte *addr, int len,
- enum bfd_endian byte_order)
- {
- return extract_signed_integer (gdb::array_view<const gdb_byte> (addr, len),
- byte_order);
- }
- static inline ULONGEST
- extract_unsigned_integer (gdb::array_view<const gdb_byte> buf,
- enum bfd_endian byte_order)
- {
- return extract_integer<ULONGEST> (buf, byte_order);
- }
- static inline ULONGEST
- extract_unsigned_integer (const gdb_byte *addr, int len,
- enum bfd_endian byte_order)
- {
- return extract_unsigned_integer (gdb::array_view<const gdb_byte> (addr, len),
- byte_order);
- }
- extern int extract_long_unsigned_integer (const gdb_byte *, int,
- enum bfd_endian, LONGEST *);
- extern CORE_ADDR extract_typed_address (const gdb_byte *buf,
- struct type *type);
- /* All 'store' functions accept a host-format integer and store a
- target-format integer at ADDR which is LEN bytes long. */
- template<typename T, typename = RequireLongest<T>>
- extern void store_integer (gdb_byte *addr, int len, enum bfd_endian byte_order,
- T val);
- static inline void
- store_signed_integer (gdb_byte *addr, int len,
- enum bfd_endian byte_order, LONGEST val)
- {
- return store_integer (addr, len, byte_order, val);
- }
- static inline void
- store_unsigned_integer (gdb_byte *addr, int len,
- enum bfd_endian byte_order, ULONGEST val)
- {
- return store_integer (addr, len, byte_order, val);
- }
- extern void store_typed_address (gdb_byte *buf, struct type *type,
- CORE_ADDR addr);
- extern void copy_integer_to_size (gdb_byte *dest, int dest_size,
- const gdb_byte *source, int source_size,
- bool is_signed, enum bfd_endian byte_order);
- /* Hooks for alternate command interfaces. */
- struct target_waitstatus;
- struct cmd_list_element;
- extern void (*deprecated_pre_add_symbol_hook) (const char *);
- extern void (*deprecated_post_add_symbol_hook) (void);
- extern void (*selected_frame_level_changed_hook) (int);
- extern int (*deprecated_ui_loop_hook) (int signo);
- extern void (*deprecated_show_load_progress) (const char *section,
- unsigned long section_sent,
- unsigned long section_size,
- unsigned long total_sent,
- unsigned long total_size);
- extern void (*deprecated_print_frame_info_listing_hook) (struct symtab * s,
- int line,
- int stopline,
- int noerror);
- extern int (*deprecated_query_hook) (const char *, va_list)
- ATTRIBUTE_FPTR_PRINTF(1,0);
- extern void (*deprecated_warning_hook) (const char *, va_list)
- ATTRIBUTE_FPTR_PRINTF(1,0);
- extern void (*deprecated_readline_begin_hook) (const char *, ...)
- ATTRIBUTE_FPTR_PRINTF_1;
- extern char *(*deprecated_readline_hook) (const char *);
- extern void (*deprecated_readline_end_hook) (void);
- extern void (*deprecated_context_hook) (int);
- extern ptid_t (*deprecated_target_wait_hook) (ptid_t ptid,
- struct target_waitstatus *status,
- int options);
- extern void (*deprecated_attach_hook) (void);
- extern void (*deprecated_detach_hook) (void);
- extern void (*deprecated_call_command_hook) (struct cmd_list_element * c,
- const char *cmd, int from_tty);
- extern int (*deprecated_ui_load_progress_hook) (const char *section,
- unsigned long num);
- /* If this definition isn't overridden by the header files, assume
- that isatty and fileno exist on this system. */
- #ifndef ISATTY
- #define ISATTY(FP) (isatty (fileno (FP)))
- #endif
- /* * A width that can achieve a better legibility for GDB MI mode. */
- #define GDB_MI_MSG_WIDTH 80
- /* From progspace.c */
- extern void initialize_progspace (void);
- extern void initialize_inferiors (void);
- /* * Special block numbers */
- enum block_enum
- {
- GLOBAL_BLOCK = 0,
- STATIC_BLOCK = 1,
- FIRST_LOCAL_BLOCK = 2
- };
- /* User selection used in observable.h and multiple print functions. */
- enum user_selected_what_flag
- {
- /* Inferior selected. */
- USER_SELECTED_INFERIOR = 1 << 1,
- /* Thread selected. */
- USER_SELECTED_THREAD = 1 << 2,
- /* Frame selected. */
- USER_SELECTED_FRAME = 1 << 3
- };
- DEF_ENUM_FLAGS_TYPE (enum user_selected_what_flag, user_selected_what);
- #include "utils.h"
- #endif /* #ifndef DEFS_H */
|