/* as.h - global header file
Copyright (C) 1987-2024 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
GAS 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, or (at your option)
any later version.
GAS 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 GAS; see the file COPYING. If not, write to the Free
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
02110-1301, USA. */
#ifndef GAS
#define GAS 1
/* I think this stuff is largely out of date. xoxorich.
CAPITALISED names are #defined.
"lowercaseH" is #defined if "lowercase.h" has been #include-d.
"lowercaseT" is a typedef of "lowercase" objects.
"lowercaseP" is type "pointer to object of type 'lowercase'".
"lowercaseS" is typedef struct ... lowercaseS.
#define DEBUG to enable all the "know" assertion tests.
#define SUSPECT when debugging hash code.
#define COMMON as "extern" for all modules except one, where you #define
COMMON as "".
If TEST is #defined, then we are testing a module: #define COMMON as "". */
#include "config.h"
/* Now, tend to the rest of the configuration. */
/* System include files first... */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "getopt.h"
/* The first getopt value for machine-independent long options.
150 isn't special; it's just an arbitrary non-ASCII char value. */
#define OPTION_STD_BASE 150
/* The first getopt value for machine-dependent long options.
290 gives the standard options room to grow. */
#define OPTION_MD_BASE 290
/* Type of symbol value, etc. For use in prototypes. */
typedef addressT valueT;
#ifndef COMMON
#ifdef TEST
#define COMMON /* Declare our COMMONs storage here. */
#else
#define COMMON extern /* Our commons live elsewhere. */
#endif
#endif
/* COMMON now defined */
enum _relax_state
{
/* Dummy frag used by listing code. */
rs_dummy = 0,
/* Variable chars to be repeated fr_offset times.
Fr_symbol unused. Used with fr_offset == 0 for a
constant length frag. */
rs_fill,
/* Align. The fr_offset field holds the power of 2 to which to
align. The fr_var field holds the number of characters in the
fill pattern. The fr_subtype field holds the maximum number of
bytes to skip when aligning, or 0 if there is no maximum. */
rs_align,
/* Align code. The fr_offset field holds the power of 2 to which
to align. This type is only generated by machine specific
code, which is normally responsible for handling the fill
pattern. The fr_subtype field holds the maximum number of
bytes to skip when aligning, or 0 if there is no maximum. */
rs_align_code,
/* Test for alignment. Like rs_align, but used by several targets
to warn if data is not properly aligned. */
rs_align_test,
/* Machine specific relaxable (or similarly alterable) instruction. */
rs_machine_dependent,
/* .space directive with expression operand that needs to be computed
later. Similar to rs_org, but different.
fr_symbol: operand
1 variable char: fill character */
rs_space,
/* .nop directive with expression operand that needs to be computed
later. Similar to rs_space, but different. It fills with no-op
instructions.
fr_symbol: operand
1 constant byte: no-op fill control byte. */
rs_space_nop,
/* Similar to rs_fill. It is used to implement .nops directive.
When listings are enabled, fr_opcode gets the buffer assigned, once
that's available. */
rs_fill_nop,
/* A DWARF leb128 value; only ELF uses this. The subtype is 0 for
unsigned, 1 for signed. */
rs_leb128,
/* Exception frame information which we may be able to optimize. */
rs_cfa,
/* Cross-fragment dwarf2 line number optimization. */
rs_dwarf2dbg,
/* SFrame FRE type selection optimization. */
rs_sframe
};
typedef enum _relax_state relax_stateT;
/* This type is used in prototypes, so it can't be a type that will be
widened for argument passing. */
typedef unsigned int relax_substateT;
/* Enough bits for address, but still an integer type.
Could be a problem, cross-assembling for 64-bit machines. */
typedef addressT relax_addressT;
/* TRUE if we should produce a listing. */
extern int listing;
/* Type of debugging information we should generate. We currently support
stabs, ECOFF, and DWARF2.
NOTE! This means debug information about the assembly source code itself
and _not_ about possible debug information from a high-level language.
This is especially relevant to DWARF2, since the compiler may emit line
number directives that the assembler resolves. */
extern enum debug_info_type debug_type;
extern int use_gnu_debug_info_extensions;
COMMON bool flag_dwarf_sections;
extern int flag_dwarf_cie_version;
extern unsigned int dwarf_level;
/* Maximum level of macro nesting. */
extern int max_macro_nest;
/* Verbosity level. */
extern int verbose;
struct obstack;
/* Obstack chunk size. Keep large for efficient space use, make small to
increase malloc calls for monitoring memory allocation. */
extern int chunksize;
struct _pseudo_type
{
/* assembler mnemonic, lower case, no '.' */
const char *poc_name;
/* Do the work */
void (*poc_handler) (int);
/* Value to pass to handler */
int poc_val;
};
typedef struct _pseudo_type pseudo_typeS;
#if (__GNUC__ >= 2) && !defined(VMS)
/* for use with -Wformat */
#if __GNUC__ == 2 && __GNUC_MINOR__ < 6
/* Support for double underscores in attribute names was added in gcc
2.6, so avoid them if we are using an earlier version. */
#define __printf__ printf
#define __format__ format
#endif
#ifdef H_TICK_HEX
extern int enable_h_tick_hex;
#endif
#ifdef TC_M68K
/* True if we are assembling in m68k MRI mode. */
COMMON int flag_m68k_mri;
#define DOLLAR_AMBIGU flag_m68k_mri
#else
#define flag_m68k_mri 0
#endif