| /* Basic, host-specific, and target-specific definitions for GDB. | 
 |    Copyright (C) 1986-2025 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 GDB_DEFS_H | 
 | #define GDB_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 <climits> | 
 |  | 
 | /* 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" | 
 |  | 
 | /* 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 | 
 |  | 
 | /* * 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; | 
 |  | 
 | /* * 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 | 
 |    a C++-compatible mangling, so must come before C++; Ada must come | 
 |    last (see ada_sniff_from_mangled_name).  */ | 
 |  | 
 | enum language | 
 |   { | 
 |     language_unknown,		/* Language not known */ | 
 |     language_c,			/* C */ | 
 |     language_objc,		/* Objective-C */ | 
 |     language_rust,		/* Rust */ | 
 |     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_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 | 
 | static_assert (nr_languages <= (1 << LANGUAGE_BITS)); | 
 |  | 
 | /* The number of bytes needed to represent all languages.  */ | 
 | #define LANGUAGE_BYTES ((LANGUAGE_BITS + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT) | 
 |  | 
 | /* * 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; | 
 | class frame_info_ptr; | 
 | 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); | 
 |  | 
 | /* From top.c */ | 
 |  | 
 | typedef void initialize_file_ftype (void); | 
 |  | 
 | extern char *gdb_readline_wrapper (const char *); | 
 |  | 
 | extern const char *command_line_input (std::string &cmd_line_buffer, | 
 | 				       const char *, const char *); | 
 |  | 
 | extern void print_prompt (void); | 
 |  | 
 | 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. | 
 |  | 
 |    MEMORY_TAGGED is true if the memory region contains memory tags, false | 
 |    otherwise. | 
 |  | 
 |    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, bool memory_tagged, | 
 | 					 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; | 
 |  | 
 | /* * 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 | 
 |  | 
 | /* * 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 | 
 | }; | 
 |  | 
 | /* 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_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 | 
 |  | 
 | /* * 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 /* GDB_DEFS_H */ |