#ifndef GAS
#define GAS 1
#include "config.h"
#include "bin-bugs.h"
#ifndef __GNUC__
# if HAVE_ALLOCA_H
# include <alloca.h>
# else
# ifdef _AIX
#pragma alloca
# else
# ifndef alloca
# if !defined (__STDC__) && !defined (__hpux)
extern char *alloca ();
# else
extern void *alloca ();
# endif
# endif
# endif
# endif
#endif
#include <stdio.h>
#ifdef HAVE_STRING_H
#include <string.h>
#else
#ifdef HAVE_STRINGS_H
#include <strings.h>
#endif
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#include "getopt.h"
#define OPTION_STD_BASE 150
#define OPTION_MD_BASE 190
#ifdef DEBUG
#undef NDEBUG
#endif
#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 6)
#define __PRETTY_FUNCTION__ ((char*)0)
#endif
#if 0
#ifndef BROKEN_ASSERT
#include <assert.h>
#else
#ifndef NDEBUG
#define assert(p) ((p) ? 0 : (as_assert (__FILE__, __LINE__, __PRETTY_FUNCTION__), 0))
#else
#define assert(p) ((p), 0)
#endif
#endif
#else
#define assert(P) ((P) ? 0 : (as_assert (__FILE__, __LINE__, __PRETTY_FUNCTION__), 0))
#undef abort
#define abort() as_abort (__FILE__, __LINE__, __PRETTY_FUNCTION__)
#endif
#include "ansidecl.h"
#ifdef BFD_ASSEMBLER
#include "bfd.h"
#endif
#include "libiberty.h"
#include "progress.h"
#ifndef __MWERKS__
#if !defined (__GNUC__) && !defined (inline)
#define inline
#endif
#endif
#ifdef NEED_DECLARATION_STRSTR
extern char *strstr ();
#endif
#ifdef NEED_DECLARATION_MALLOC
extern PTR malloc ();
extern PTR realloc ();
#endif
#ifdef NEED_DECLARATION_FREE
extern void free ();
#endif
#ifdef NEED_DECLARATION_ERRNO
extern int errno;
#endif
#ifdef NEED_DECLARATION_ENVIRON
extern char **environ;
#endif
#if ! defined (HAVE_UNLINK) && defined (HAVE_REMOVE)
#define unlink remove
#endif
#if !defined (memcpy) && !defined (bcopy)
#define bcopy(src,dest,size) memcpy (dest, src, size)
#endif
#ifdef SABER
#undef __PTR_TO_INT
#define __PTR_TO_INT(P) ((int) (P))
#undef __INT_TO_PTR
#define __INT_TO_PTR(P) ((char *) (P))
#endif
#ifndef __LINE__
#define __LINE__ "unknown"
#endif
#ifndef __FILE__
#define __FILE__ "unknown"
#endif
#ifndef FOPEN_WB
#if defined GO32 || defined __MINGW32__
#include "fopen-bin.h"
#else
#include "fopen-same.h"
#endif
#endif
#ifndef EXIT_SUCCESS
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#endif
#ifndef SEEK_SET
#define SEEK_SET 0
#endif
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free xfree
#define xfree free
#include "asintl.h"
#define BAD_CASE(val) \
{ \
as_fatal (_("Case value %ld unexpected at line %d of file \"%s\"\n"), \
(long) val, __LINE__, __FILE__); \
}
#include "flonum.h"
#ifdef BFD_ASSEMBLER
extern bfd *stdoutput;
typedef bfd_vma addressT;
typedef bfd_signed_vma offsetT;
#else
typedef unsigned long addressT;
typedef long offsetT;
#endif
typedef addressT valueT;
#ifndef COMMON
#ifdef TEST
#define COMMON
#else
#define COMMON extern
#endif
#endif
#ifdef DEBUG
#ifndef know
#define know(p) assert(p)
#endif
#else
#define know(p)
#endif
#ifndef BFD_ASSEMBLER
#ifdef MANY_SEGMENTS
#include "bfd.h"
#define N_SEGMENTS 40
#define SEG_NORMAL(x) ((x) >= SEG_E0 && (x) <= SEG_E39)
#define SEG_LIST SEG_E0,SEG_E1,SEG_E2,SEG_E3,SEG_E4,SEG_E5,SEG_E6,SEG_E7,SEG_E8,SEG_E9,\
SEG_E10,SEG_E11,SEG_E12,SEG_E13,SEG_E14,SEG_E15,SEG_E16,SEG_E17,SEG_E18,SEG_E19,\
SEG_E20,SEG_E21,SEG_E22,SEG_E23,SEG_E24,SEG_E25,SEG_E26,SEG_E27,SEG_E28,SEG_E29,\
SEG_E30,SEG_E31,SEG_E32,SEG_E33,SEG_E34,SEG_E35,SEG_E36,SEG_E37,SEG_E38,SEG_E39
#define SEG_TEXT SEG_E0
#define SEG_DATA SEG_E1
#define SEG_BSS SEG_E2
#define SEG_LAST SEG_E39
#else
#define N_SEGMENTS 3
#define SEG_NORMAL(x) ((x) == SEG_TEXT || (x) == SEG_DATA || (x) == SEG_BSS)
#define SEG_LIST SEG_TEXT,SEG_DATA,SEG_BSS
#endif
typedef enum _segT {
SEG_ABSOLUTE = 0,
SEG_LIST,
SEG_UNKNOWN,
SEG_GOOF,
SEG_EXPR,
SEG_DEBUG,
SEG_NTV,
SEG_PTV,
SEG_REGISTER
} segT;
#define SEG_MAXIMUM_ORDINAL (SEG_REGISTER)
#else
typedef asection *segT;
#define SEG_NORMAL(SEG) ((SEG) != absolute_section \
&& (SEG) != undefined_section \
&& (SEG) != reg_section \
&& (SEG) != expr_section)
#endif
typedef int subsegT;
COMMON subsegT now_subseg;
COMMON segT now_seg;
#ifdef BFD_ASSEMBLER
#define segment_name(SEG) bfd_get_section_name (stdoutput, SEG)
#else
extern char const *const seg_name[];
#define segment_name(SEG) seg_name[(int) (SEG)]
#endif
#ifndef BFD_ASSEMBLER
extern int section_alignment[];
#endif
#ifdef BFD_ASSEMBLER
extern segT reg_section, expr_section;
extern segT text_section, data_section, bss_section;
#define absolute_section bfd_abs_section_ptr
#define undefined_section bfd_und_section_ptr
#else
#define reg_section SEG_REGISTER
#define expr_section SEG_EXPR
#define text_section SEG_TEXT
#define data_section SEG_DATA
#define bss_section SEG_BSS
#define absolute_section SEG_ABSOLUTE
#define undefined_section SEG_UNKNOWN
#endif
enum _relax_state {
rs_fill = 1,
rs_align,
rs_align_code,
rs_align_test,
rs_org,
#ifndef WORKING_DOT_WORD
rs_broken_word,
#endif
rs_machine_dependent,
rs_space,
rs_leb128,
rs_cfa,
rs_dwarf2dbg
};
typedef enum _relax_state relax_stateT;
typedef unsigned int relax_substateT;
typedef addressT relax_addressT;
COMMON unsigned char flag_no_comments;
COMMON unsigned char flag_debug;
COMMON unsigned char flag_signed_overflow_ok;
#ifndef WORKING_DOT_WORD
COMMON unsigned char flag_warn_displacement;
#endif
COMMON int flag_keep_locals;
COMMON int flag_mri;
COMMON unsigned char flag_readonly_data_in_text;
COMMON int flag_no_warnings;
COMMON int flag_fatal_warnings;
COMMON unsigned char flag_always_generate_output;
COMMON unsigned char flag_print_statistics;
COMMON int flag_strip_local_absolute;
COMMON int flag_traditional_format;
COMMON int flag_execstack;
COMMON int flag_noexecstack;
COMMON char *out_file_name;
COMMON char *insttbl_file_name;
COMMON int need_pass_2;
COMMON int linkrelax;
extern int listing;
enum debug_info_type {
DEBUG_UNSPECIFIED,
DEBUG_NONE,
DEBUG_STABS,
DEBUG_ECOFF,
DEBUG_DWARF,
DEBUG_DWARF2
};
extern enum debug_info_type debug_type;
extern int use_gnu_debug_info_extensions;
extern int max_macro_nest;
extern int verbose;
extern int chunksize;
struct _pseudo_type {
const char *poc_name;
void (*poc_handler) (int);
int poc_val;
};
typedef struct _pseudo_type pseudo_typeS;
#if defined (HAVE_VARARGS_H) && !defined (__STDC__)
#undef HAVE_STDARG_H
#endif
#if defined (HAVE_STDARG_H)
#define USE_STDARG
#endif
#if !defined (USE_STDARG) && defined (HAVE_VARARGS_H)
#define USE_VARARGS
#endif
#ifdef USE_STDARG
#if (__GNUC__ >= 2) && !defined(VMS)
#if __GNUC__ == 2 && __GNUC_MINOR__ < 6
#define __printf__ printf
#define __format__ format
#endif
#define PRINTF_LIKE(FCN) \
void FCN (const char *format, ...) \
__attribute__ ((__format__ (__printf__, 1, 2)))
#define PRINTF_WHERE_LIKE(FCN) \
void FCN (char *file, unsigned int line, const char *format, ...) \
__attribute__ ((__format__ (__printf__, 3, 4)))
#else
#define PRINTF_LIKE(FCN) void FCN (const char *format, ...)
#define PRINTF_WHERE_LIKE(FCN) void FCN (char *file, \
unsigned int line, \
const char *format, ...)
#endif
#else
#define PRINTF_LIKE(FCN) void FCN ()
#define PRINTF_WHERE_LIKE(FCN) void FCN ()
#endif
PRINTF_LIKE (as_bad);
PRINTF_LIKE (as_fatal) ATTRIBUTE_NORETURN;
PRINTF_LIKE (as_tsktsk);
PRINTF_LIKE (as_warn);
PRINTF_WHERE_LIKE (as_bad_where);
PRINTF_WHERE_LIKE (as_warn_where);
void as_assert (const char *, int, const char *);
void as_abort (const char *, int, const char *) ATTRIBUTE_NORETURN;
void fprint_value (FILE *file, addressT value);
void sprint_value (char *buf, addressT value);
int had_errors (void);
int had_warnings (void);
void as_warn_value_out_of_range (char *, offsetT, offsetT, offsetT, char *, unsigned);
void as_bad_value_out_of_range (char *, offsetT, offsetT, offsetT, char *, unsigned);
void print_version_id (void);
char *app_push (void);
char *atof_ieee (char *str, int what_kind, LITTLENUM_TYPE * words);
char *input_scrub_include_file (char *filename, char *position);
extern void input_scrub_insert_line (const char *line);
extern void input_scrub_insert_file (char *path);
char *input_scrub_new_file (char *filename);
char *input_scrub_next_buffer (char **bufp);
int do_scrub_chars (int (*get) (char *, int), char *to, int tolen);
int gen_to_words (LITTLENUM_TYPE * words, int precision,
long exponent_bits);
int had_err (void);
int ignore_input (void);
void cond_finish_check (int);
void cond_exit_macro (int);
int seen_at_least_1_file (void);
void app_pop (char *arg);
void as_howmuch (FILE * stream);
void as_perror (const char *gripe, const char *filename);
void as_where (char **namep, unsigned int *linep);
void bump_line_counters (void);
void do_scrub_begin (int);
void input_scrub_begin (void);
void input_scrub_close (void);
void input_scrub_end (void);
int new_logical_line (char *fname, int line_number);
void subsegs_begin (void);
void subseg_change (segT seg, int subseg);
segT subseg_new (const char *name, subsegT subseg);
segT subseg_force_new (const char *name, subsegT subseg);
void subseg_set (segT seg, subsegT subseg);
#ifdef BFD_ASSEMBLER
segT subseg_get (const char *, int);
#endif
int subseg_text_p (segT);
void start_dependencies (char *);
void register_dependency (char *);
void print_dependencies (void);
struct expressionS;
struct fix;
typedef struct symbol symbolS;
struct relax_type;
typedef struct frag fragS;
#ifdef BFD_ASSEMBLER
valueT add_to_literal_pool (symbolS *, valueT, segT, int);
#endif
int check_eh_frame (struct expressionS *, unsigned int *);
int eh_frame_estimate_size_before_relax (fragS *);
int eh_frame_relax_frag (fragS *);
void eh_frame_convert_frag (fragS *);
int generic_force_reloc (struct fix *);
#include "expr.h"
#include "targ-env.h"
#ifdef OBJ_MAYBE_ELF
#define IS_ELF (OUTPUT_FLAVOR == bfd_target_elf_flavour)
#else
#ifdef OBJ_ELF
#define IS_ELF 1
#else
#define IS_ELF 0
#endif
#endif
#include "write.h"
#include "frags.h"
#include "hash.h"
#include "read.h"
#include "symbols.h"
#include "tc.h"
#include "obj.h"
#ifdef USE_EMULATIONS
#include "emul.h"
#endif
#include "listing.h"
#ifdef TC_M68K
COMMON int flag_m68k_mri;
#else
#define flag_m68k_mri 0
#endif
#ifdef WARN_COMMENTS
COMMON int warn_comment;
COMMON unsigned int found_comment;
COMMON char *found_comment_file;
#endif
#ifndef NUMBERS_WITH_SUFFIX
#define NUMBERS_WITH_SUFFIX 0
#endif
#ifndef LOCAL_LABELS_DOLLAR
#define LOCAL_LABELS_DOLLAR 0
#endif
#ifndef LOCAL_LABELS_FB
#define LOCAL_LABELS_FB 0
#endif
#ifndef LABELS_WITHOUT_COLONS
#define LABELS_WITHOUT_COLONS 0
#endif
#ifndef NO_PSEUDO_DOT
#define NO_PSEUDO_DOT 0
#endif
#ifndef TEXT_SECTION_NAME
#define TEXT_SECTION_NAME ".text"
#define DATA_SECTION_NAME ".data"
#define BSS_SECTION_NAME ".bss"
#endif
#ifndef OCTETS_PER_BYTE_POWER
#define OCTETS_PER_BYTE_POWER 0
#endif
#ifndef OCTETS_PER_BYTE
#define OCTETS_PER_BYTE (1<<OCTETS_PER_BYTE_POWER)
#endif
#if OCTETS_PER_BYTE != (1<<OCTETS_PER_BYTE_POWER)
#error "Octets per byte conflicts with its power-of-two definition!"
#endif
#endif