|
|
|
@ -18,25 +18,6 @@ |
|
|
|
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ |
|
|
|
|
|
|
|
#define GAS 1 |
|
|
|
#include <ansidecl.h> |
|
|
|
#include "host.h" |
|
|
|
#include "flonum.h" |
|
|
|
|
|
|
|
#ifndef __STDC__ |
|
|
|
#define volatile /**/ |
|
|
|
#ifndef const |
|
|
|
#define const /**/ |
|
|
|
#endif /* const */ |
|
|
|
#endif /* __STDC__ */ |
|
|
|
|
|
|
|
#ifndef __LINE__ |
|
|
|
#define __LINE__ "unknown" |
|
|
|
#endif /* __LINE__ */ |
|
|
|
|
|
|
|
#ifndef __FILE__ |
|
|
|
#define __FILE__ "unknown" |
|
|
|
#endif /* __FILE__ */ |
|
|
|
|
|
|
|
/*
|
|
|
|
* I think this stuff is largely out of date. xoxorich. |
|
|
|
* |
|
|
|
@ -47,7 +28,7 @@ |
|
|
|
* "lowercaseS" is typedef struct ... lowercaseS. |
|
|
|
* |
|
|
|
* #define DEBUG to enable all the "know" assertion tests. |
|
|
|
* #define SUSPECT when debugging. |
|
|
|
* #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 "". |
|
|
|
@ -55,12 +36,30 @@ |
|
|
|
|
|
|
|
/* These #defines are for parameters of entire assembler. */ |
|
|
|
|
|
|
|
/* #define SUSPECT JF remove for speed testing */ |
|
|
|
#define DEBUG /* temporary */ |
|
|
|
/* These #includes are for type definitions etc. */ |
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
#ifdef DEBUG |
|
|
|
#undef NDEBUG |
|
|
|
#endif |
|
|
|
#include <assert.h> |
|
|
|
|
|
|
|
#include <ansidecl.h> |
|
|
|
#ifdef BFD_ASSEMBLER |
|
|
|
#include <bfd.h> |
|
|
|
#endif |
|
|
|
#include "host.h" |
|
|
|
#include "flonum.h" |
|
|
|
|
|
|
|
#ifndef __LINE__ |
|
|
|
#define __LINE__ "unknown" |
|
|
|
#endif /* __LINE__ */ |
|
|
|
|
|
|
|
#ifndef __FILE__ |
|
|
|
#define __FILE__ "unknown" |
|
|
|
#endif /* __FILE__ */ |
|
|
|
|
|
|
|
#define obstack_chunk_alloc xmalloc |
|
|
|
#define obstack_chunk_free xfree |
|
|
|
|
|
|
|
@ -75,6 +74,9 @@ |
|
|
|
|
|
|
|
/* These are assembler-wide concepts */ |
|
|
|
|
|
|
|
#ifdef BFD_ASSEMBLER |
|
|
|
extern bfd *stdoutput; |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifndef COMMON |
|
|
|
#ifdef TEST |
|
|
|
@ -84,25 +86,23 @@ |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
/* COMMON now defined */ |
|
|
|
#define DEBUG /* temporary */ |
|
|
|
|
|
|
|
#ifdef BROKEN_ASSERT |
|
|
|
/* Turn off all assertion checks, on machines where the assert macro
|
|
|
|
is buggy. (For example, on the RS/6000, Reiser-cpp substitution is |
|
|
|
done to put the condition into a string, so if the condition contains |
|
|
|
a string, parse errors result.) */ |
|
|
|
#undef DEBUG |
|
|
|
#define NDEBUG |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifdef DEBUG |
|
|
|
#undef NDEBUG |
|
|
|
#ifndef know |
|
|
|
#define know(p) assert(p) /* Verify our assumptions! */ |
|
|
|
#endif /* not yet defined */ |
|
|
|
#else |
|
|
|
#define know(p) /* know() checks are no-op.ed */ |
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined (BROKEN_ASSERT) && !defined (NDEBUG) |
|
|
|
/* Used on machines where the "assert" macro is buggy. (For example, on the
|
|
|
|
RS/6000, Reiser-cpp substitution is done to put the condition into a |
|
|
|
string, so if the condition contains a string, parse errors result.) If |
|
|
|
the condition fails, just drop core file. */ |
|
|
|
#undef assert |
|
|
|
#define assert(p) ((p) ? 0 : (abort (), 0)) |
|
|
|
#endif |
|
|
|
|
|
|
|
/* input_scrub.c */ |
|
|
|
|
|
|
|
@ -114,6 +114,7 @@ |
|
|
|
|
|
|
|
/* subsegs.c Sub-segments. Also, segment(=expression type)s.*/ |
|
|
|
|
|
|
|
#ifndef BFD_ASSEMBLER |
|
|
|
/*
|
|
|
|
* This table describes the use of segments as EXPRESSION types. |
|
|
|
* |
|
|
|
@ -149,8 +150,8 @@ |
|
|
|
#define N_SEGMENTS 10 |
|
|
|
#define SEG_NORMAL(x) ((x) >= SEG_E0 && (x) <= SEG_E9) |
|
|
|
#define SEG_LIST SEG_E0,SEG_E1,SEG_E2,SEG_E3,SEG_E4,SEG_E5,SEG_E6,SEG_E7,SEG_E8,SEG_E9 |
|
|
|
#define SEG_DATA SEG_E1 |
|
|
|
#define SEG_TEXT SEG_E0 |
|
|
|
#define SEG_DATA SEG_E1 |
|
|
|
#define SEG_BSS SEG_E2 |
|
|
|
#else |
|
|
|
#define N_SEGMENTS 3 |
|
|
|
@ -177,19 +178,54 @@ typedef enum _segT |
|
|
|
} segT; |
|
|
|
|
|
|
|
#define SEG_MAXIMUM_ORDINAL (SEG_REGISTER) |
|
|
|
|
|
|
|
#else |
|
|
|
typedef asection *segT; |
|
|
|
#define SEG_NORMAL(SEG) ((SEG) != absolute_section \ |
|
|
|
&& (SEG) != undefined_section \ |
|
|
|
&& (SEG) != big_section \ |
|
|
|
&& (SEG) != reg_section \ |
|
|
|
&& (SEG) != pass1_section \ |
|
|
|
&& (SEG) != diff_section \ |
|
|
|
&& (SEG) != absent_section) |
|
|
|
#endif |
|
|
|
typedef int subsegT; |
|
|
|
|
|
|
|
/* What subseg we are accreting now? */ |
|
|
|
COMMON subsegT now_subseg; |
|
|
|
|
|
|
|
/* Segment our instructions emit to. */ |
|
|
|
/* Only OK values are SEG_TEXT or SEG_DATA. */ |
|
|
|
COMMON segT now_seg; |
|
|
|
|
|
|
|
extern char *const seg_name[]; |
|
|
|
#ifdef BFD_ASSEMBLER |
|
|
|
#define segment_name(SEG) bfd_get_section_name (stdoutput, SEG) |
|
|
|
#else |
|
|
|
extern char *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 big_section, reg_section, pass1_section; |
|
|
|
extern segT diff_section, absent_section; |
|
|
|
/* Shouldn't these be eliminated someday? */ |
|
|
|
extern segT text_section, data_section, bss_section; |
|
|
|
#define absolute_section (&bfd_abs_section) |
|
|
|
#define undefined_section (&bfd_und_section) |
|
|
|
#else |
|
|
|
#define big_section SEG_BIG |
|
|
|
#define reg_section SEG_REGISTER |
|
|
|
#define pass1_section SEG_PASS1 |
|
|
|
#define diff_section SEG_DIFFERENCE |
|
|
|
#define absent_section SEG_ABSENT |
|
|
|
#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 |
|
|
|
|
|
|
|
/* relax() */ |
|
|
|
|
|
|
|
@ -242,26 +278,28 @@ typedef unsigned long relax_addressT; |
|
|
|
BUG: it may be smarter to have a single pointer off to various different |
|
|
|
notes for different frag kinds. See how code pans |
|
|
|
*/ |
|
|
|
struct frag /* a code fragment */ |
|
|
|
struct frag |
|
|
|
{ |
|
|
|
/* Object file address. */ |
|
|
|
unsigned long fr_address; |
|
|
|
/* Chain forward; ascending address order. */ |
|
|
|
/* Rooted in frch_root. */ |
|
|
|
/* Chain forward; ascending address order. Rooted in frch_root. */ |
|
|
|
struct frag *fr_next; |
|
|
|
|
|
|
|
/* (Fixed) number of chars we know we have. */ |
|
|
|
/* May be 0. */ |
|
|
|
/* (Fixed) number of chars we know we have. May be 0. */ |
|
|
|
long fr_fix; |
|
|
|
/* (Variable) number of chars after above. */ |
|
|
|
/* May be 0. */ |
|
|
|
/* (Variable) number of chars after above. May be 0. */ |
|
|
|
long fr_var; |
|
|
|
/* For variable-length tail. */ |
|
|
|
struct symbol *fr_symbol; |
|
|
|
/* For variable-length tail. */ |
|
|
|
long fr_offset; |
|
|
|
/*->opcode low addr byte,for relax()ation*/ |
|
|
|
/* Points to opcode low addr byte, for relaxation. */ |
|
|
|
char *fr_opcode; |
|
|
|
|
|
|
|
#ifndef NO_LISTING |
|
|
|
struct list_info_struct *line; |
|
|
|
#endif |
|
|
|
|
|
|
|
/* What state is my tail in? */ |
|
|
|
relax_stateT fr_type; |
|
|
|
relax_substateT fr_subtype; |
|
|
|
@ -269,9 +307,7 @@ struct frag /* a code fragment */ |
|
|
|
/* These are needed only on the NS32K machines */ |
|
|
|
char fr_pcrel_adjust; |
|
|
|
char fr_bsr; |
|
|
|
#ifndef NO_LISTING |
|
|
|
struct list_info_struct *line; |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Chars begin here.
|
|
|
|
One day we will compile fr_literal[0]. */ |
|
|
|
char fr_literal[1]; |
|
|
|
@ -287,6 +323,7 @@ typedef struct frag fragS; |
|
|
|
included in frchain_now. The fr_fix field is bogus; instead, use: |
|
|
|
obstack_next_free(&frags)-frag_now->fr_literal. */ |
|
|
|
COMMON fragS *frag_now; |
|
|
|
#define frag_now_fix() (obstack_next_free (&frags) - frag_now->fr_literal) |
|
|
|
|
|
|
|
/* For foreign-segment symbol fixups. */ |
|
|
|
COMMON fragS zero_address_frag; |
|
|
|
@ -323,25 +360,36 @@ struct _pseudo_type |
|
|
|
|
|
|
|
typedef struct _pseudo_type pseudo_typeS; |
|
|
|
|
|
|
|
#ifndef NO_STDARG |
|
|
|
#ifdef BFD_ASSEMBLER_xxx |
|
|
|
struct lineno_struct |
|
|
|
{ |
|
|
|
alent line; |
|
|
|
fragS *frag; |
|
|
|
struct lineno_struct *next; |
|
|
|
}; |
|
|
|
typedef struct lineno_struct lineno; |
|
|
|
#endif |
|
|
|
|
|
|
|
int had_errors PARAMS ((void)); |
|
|
|
int had_warnings PARAMS ((void)); |
|
|
|
void as_bad PARAMS ((const char *Format,...)); |
|
|
|
void as_fatal PARAMS ((const char *Format,...)); |
|
|
|
void as_tsktsk PARAMS ((const char *Format,...)); |
|
|
|
void as_warn PARAMS ((const char *Format,...)); |
|
|
|
#if defined (__STDC__) && !defined(NO_STDARG) |
|
|
|
|
|
|
|
#else |
|
|
|
#if __GNUC__ >= 2 |
|
|
|
/* for use with -Wformat */ |
|
|
|
#define PRINTF_LIKE(FCN) void FCN (const char *Format, ...) \ |
|
|
|
__attribute__ ((format (printf, 1, 2))) |
|
|
|
#else /* ANSI C with stdarg, but not GNU C */ |
|
|
|
#define PRINTF_LIKE(FCN) void FCN (const char *Format, ...) |
|
|
|
#endif |
|
|
|
#else /* not ANSI C, or not stdarg */ |
|
|
|
#define PRINTF_LIKE(FCN) void FCN () |
|
|
|
#endif |
|
|
|
|
|
|
|
int had_errors (); |
|
|
|
int had_warnings (); |
|
|
|
void as_bad (); |
|
|
|
void as_fatal (); |
|
|
|
void as_tsktsk (); |
|
|
|
void as_warn (); |
|
|
|
PRINTF_LIKE (as_bad); |
|
|
|
PRINTF_LIKE (as_fatal); |
|
|
|
PRINTF_LIKE (as_tsktsk); |
|
|
|
PRINTF_LIKE (as_warn); |
|
|
|
|
|
|
|
#endif /* __STDC__ & !NO_STDARG */ |
|
|
|
int had_errors PARAMS ((void)); |
|
|
|
int had_warnings PARAMS ((void)); |
|
|
|
|
|
|
|
char *app_push PARAMS ((void)); |
|
|
|
char *atof_ieee PARAMS ((char *str, int what_kind, LITTLENUM_TYPE * words)); |
|
|
|
@ -375,9 +423,14 @@ void int_to_gen PARAMS ((long x)); |
|
|
|
void new_logical_line PARAMS ((char *fname, int line_number)); |
|
|
|
void scrub_to_file PARAMS ((int ch)); |
|
|
|
void scrub_to_string PARAMS ((int ch)); |
|
|
|
void subsegs_begin PARAMS ((void)); |
|
|
|
void subseg_change PARAMS ((segT seg, int subseg)); |
|
|
|
#ifdef BFD_ASSEMBLER |
|
|
|
segT subseg_new PARAMS ((char *name, subsegT subseg)); |
|
|
|
void subseg_set PARAMS ((segT seg, subsegT subseg)); |
|
|
|
#else |
|
|
|
void subseg_new PARAMS ((segT seg, subsegT subseg)); |
|
|
|
void subsegs_begin PARAMS ((void)); |
|
|
|
#endif |
|
|
|
|
|
|
|
/* this one starts the chain of target dependant headers */ |
|
|
|
#include "targ-env.h" |
|
|
|
|