* config/{tc-alpha.h, tc-arc.h, tc-d10v.h, tc-generic.h, tc-i960.h,

tc-mn10200.h, tc-mn10300.h, tc-sh.h, tc-v850.h, tc-vax.h, tc-w65.h}:
	Add default definition of zero for TARGET_BYTES_BIG_ENDIAN.
	* config/{tc-arm.h, tc-hppa.h, tc-i386.h, tc-mips.h, tc-ns32k.h,
 	tc-ppc.h, tc-sparc.h}: Move definition of TARGET_BYTES_BIG_ENDIAN
	to a location consistent with the rest of the target include files.
	* config/tc-i386.c: Remove misleading comment.
	* doc/internals.texi (CPU backend): Add description of function
	md_undefined_symbol.
start-sanitize-tic80
	* config/tc-tic80.c: Add code to insert predefined symbols into the
	symbol table so they can be parsed by the standard expression parser.
	Remove custom code that use to parse them.
	* config/tc-tic80.h: Move definition of TARGET_BYTES_BIG_ENDIAN
	to a location consistent with the rest of the target include files.
end-sanitize-tic80
This commit is contained in:
Fred Fish
1997-02-14 07:53:14 +00:00
parent 3de9d78cef
commit 16171d7127
4 changed files with 97 additions and 154 deletions

View File

@ -1,3 +1,22 @@
Thu Feb 13 20:02:16 1997 Fred Fish <fnf@cygnus.com>
* config/{tc-alpha.h, tc-arc.h, tc-d10v.h, tc-generic.h, tc-i960.h,
tc-mn10200.h, tc-mn10300.h, tc-sh.h, tc-v850.h, tc-vax.h, tc-w65.h}:
Add default definition of zero for TARGET_BYTES_BIG_ENDIAN.
* config/{tc-arm.h, tc-hppa.h, tc-i386.h, tc-mips.h, tc-ns32k.h,
tc-ppc.h, tc-sparc.h}: Move definition of TARGET_BYTES_BIG_ENDIAN
to a location consistent with the rest of the target include files.
* config/tc-i386.c: Remove misleading comment.
* doc/internals.texi (CPU backend): Add description of function
md_undefined_symbol.
start-sanitize-tic80
* config/tc-tic80.c: Add code to insert predefined symbols into the
symbol table so they can be parsed by the standard expression parser.
Remove custom code that use to parse them.
* config/tc-tic80.h: Move definition of TARGET_BYTES_BIG_ENDIAN
to a location consistent with the rest of the target include files.
end-sanitize-tic80
Thu Feb 13 21:44:18 1997 Klaus Kaempf <kkaempf@progis.de> Thu Feb 13 21:44:18 1997 Klaus Kaempf <kkaempf@progis.de>
* as.h: GNU c provides unlink() function. * as.h: GNU c provides unlink() function.

View File

@ -35,8 +35,9 @@ const char comment_chars[] = ";";
/* Characters which start a comment at the beginning of a line. */ /* Characters which start a comment at the beginning of a line. */
const char line_comment_chars[] = ";*"; const char line_comment_chars[] = ";*";
/* Characters which may be used to separate multiple commands on a /* Characters which may be used to separate multiple commands on a single
single line. */ line. The semicolon is such a character by default and should not be
explicitly listed. */
const char line_separator_chars[] = ""; const char line_separator_chars[] = "";
/* Characters which are used to indicate an exponent in a floating /* Characters which are used to indicate an exponent in a floating
@ -49,14 +50,14 @@ const char FLT_CHARS[] = "dD";
/* This table describes all the machine specific pseudo-ops the assembler /* This table describes all the machine specific pseudo-ops the assembler
has to support. The fields are: has to support. The fields are:
pseudo-op name without dot pseudo-op name without dot
function to call to execute this pseudo-op function to call to execute this pseudo-op
Integer arg to pass to the function integer arg to pass to the function */
*/
const pseudo_typeS md_pseudo_table[] = const pseudo_typeS md_pseudo_table[] =
{ {
{"word", cons, 4}, {"word", cons, 4}, /* FIXME: Should this be machine independent? */
{ NULL, NULL, 0 } { NULL, NULL, 0 }
}; };
@ -66,9 +67,6 @@ static struct hash_control *tic80_hash;
static struct tic80_opcode * find_opcode PARAMS ((struct tic80_opcode *, expressionS [])); static struct tic80_opcode * find_opcode PARAMS ((struct tic80_opcode *, expressionS []));
static void build_insn PARAMS ((struct tic80_opcode *, expressionS *)); static void build_insn PARAMS ((struct tic80_opcode *, expressionS *));
static int get_operands PARAMS ((expressionS exp[])); static int get_operands PARAMS ((expressionS exp[]));
static int register_name PARAMS ((expressionS *expressionP));
static int is_bitnum PARAMS ((expressionS *expressionP));
static int is_ccode PARAMS ((expressionS *expressionP));
static int const_overflow PARAMS ((unsigned long num, int bits, int flags)); static int const_overflow PARAMS ((unsigned long num, int bits, int flags));
@ -147,127 +145,6 @@ md_atof (type, litP, sizeP)
return (NULL); return (NULL);
} }
/* register_name() checks the string at input_line_pointer
to see if it is a valid register name */
static int
register_name (expressionP)
expressionS *expressionP;
{
int reg_number, class;
char c;
char *p = input_line_pointer;
while (*p != '\000' && *p != '\n' && *p != '\r' && *p != ',' && *p != ' ' && *p != '(' && *p != ')')
p++;
c = *p;
if (c)
{
*p++ = '\000';
}
/* look to see if it's in the register table */
class = TIC80_OPERAND_FPA | TIC80_OPERAND_CR | TIC80_OPERAND_GPR;
reg_number = tic80_symbol_to_value (input_line_pointer, class);
if (reg_number != -1)
{
expressionP -> X_op = O_register;
/* temporarily store a pointer to the string here */
expressionP -> X_op_symbol = (struct symbol *) input_line_pointer;
expressionP -> X_add_number = reg_number;
input_line_pointer = p;
return (1);
}
if (c)
{
*(p - 1) = c;
}
return (0);
}
/* is_bitnum() checks the string at input_line_pointer
to see if it is a valid predefined symbol for the BITNUM field */
static int
is_bitnum (expressionP)
expressionS *expressionP;
{
int bitnum_val, class;
char c;
char *p = input_line_pointer;
while (*p != '\000' && *p != '\n' && *p != '\r' && *p != ',' && *p != ' ' && *p != '(' && *p != ')')
p++;
c = *p;
if (c)
{
*p++ = '\000';
}
/* look to see if it's in the register table */
class = TIC80_OPERAND_BITNUM;
bitnum_val = tic80_symbol_to_value (input_line_pointer, class);
if (bitnum_val != -1)
{
expressionP -> X_op = O_constant;
/* temporarily store a pointer to the string here */
expressionP -> X_op_symbol = (struct symbol *) input_line_pointer;
/* Bitnums are stored as one's complement */
expressionP -> X_add_number = ~bitnum_val & 0x1F;
input_line_pointer = p;
return (1);
}
if (c)
{
*(p - 1) = c;
}
return (0);
}
/* is_ccode() checks the string at input_line_pointer
to see if it is a valid predefined symbol for the a condition code */
static int
is_ccode (expressionP)
expressionS *expressionP;
{
int ccode_val, class;
char c;
char *p = input_line_pointer;
while (*p != '\000' && *p != '\n' && *p != '\r' && *p != ',' && *p != ' ' && *p != '(' && *p != ')')
p++;
c = *p;
if (c)
{
*p++ = '\000';
}
/* look to see if it's in the register table */
class = TIC80_OPERAND_CC;
ccode_val = tic80_symbol_to_value (input_line_pointer, class);
if (ccode_val != -1)
{
expressionP -> X_op = O_constant;
/* temporarily store a pointer to the string here */
expressionP -> X_op_symbol = (struct symbol *) input_line_pointer;
expressionP -> X_add_number = ccode_val & 0x1F;
input_line_pointer = p;
return (1);
}
if (c)
{
*(p - 1) = c;
}
return (0);
}
/* Check to see if the constant value in NUM will fit in a field of /* Check to see if the constant value in NUM will fit in a field of
width BITS if it has flags FLAGS. */ width BITS if it has flags FLAGS. */
@ -389,17 +266,7 @@ get_operands (exp)
/* Begin operand parsing at the current scan point. */ /* Begin operand parsing at the current scan point. */
input_line_pointer = p; input_line_pointer = p;
/* Check to see if it might be a register name or some other
predefined symbol name that translates into a constant value. */
if (!register_name (&exp[numexp]) &&
!is_bitnum (&exp[numexp]) &&
!is_ccode (&exp[numexp]))
{
/* parse as an expression */
expression (&exp[numexp]); expression (&exp[numexp]);
}
if (exp[numexp].X_op == O_illegal) if (exp[numexp].X_op == O_illegal)
{ {
@ -766,10 +633,12 @@ build_insn (opcode, opers)
} }
} }
/* This is the main entry point for the machine-dependent assembler. STR points to a /* This is the main entry point for the machine-dependent assembler. Gas
machine dependent instruction. This function is supposed to emit the frags/bytes calls this function for each input line which does not contain a
it assembles to. pseudoop.
*/
STR points to a NULL terminated machine dependent instruction. This
function is supposed to emit the frags/bytes it assembles to. */
void void
md_assemble (str) md_assemble (str)
@ -824,9 +693,12 @@ md_assemble (str)
build_insn (opcode, myops); build_insn (opcode, myops);
} }
/* This function is called once, at assembler startup time. It should /* This function is called once at the start of assembly, after the command
set up all the tables, etc., that the MD part of the assembler will line arguments have been parsed and all the machine independent
need. */ initializations have been completed.
It should set up all the tables, etc., that the machine dependent part of
the assembler will need. */
void void
md_begin () md_begin ()
@ -834,8 +706,9 @@ md_begin ()
char *prev_name = ""; char *prev_name = "";
register const struct tic80_opcode *op; register const struct tic80_opcode *op;
register const struct tic80_opcode *op_end; register const struct tic80_opcode *op_end;
const struct predefined_symbol *pdsp;
tic80_hash = hash_new(); tic80_hash = hash_new ();
/* Insert unique names into hash table. The TIc80 instruction set /* Insert unique names into hash table. The TIc80 instruction set
has many identical opcode names that have different opcodes based has many identical opcode names that have different opcodes based
@ -851,19 +724,66 @@ md_begin ()
hash_insert (tic80_hash, op -> name, (char *) op); hash_insert (tic80_hash, op -> name, (char *) op);
} }
} }
/* Insert the predefined symbols into the symbol table. We use symbol_create
rather than symbol_new so that these symbols don't end up in the object
files' symbol table. Note that the values of the predefined symbols include
some upper bits that distinguish the type of the symbol (register, bitnum,
condition code, etc) and these bits must be masked away before actually
inserting the values into the instruction stream. For registers we put
these bits in the symbol table since we use them later and there is no
question that they aren't part of the register number. For constants we
can't do that since the constant can be any value, so they are masked off
before putting them into the symbol table. */
pdsp = NULL;
while ((pdsp = tic80_next_predefined_symbol (pdsp)) != NULL)
{
segT segment;
valueT valu;
int symtype;
symtype = PDS_VALUE (pdsp) & TIC80_OPERAND_MASK;
switch (symtype)
{
case TIC80_OPERAND_GPR:
case TIC80_OPERAND_FPA:
case TIC80_OPERAND_CR:
segment = reg_section;
valu = PDS_VALUE (pdsp);
break;
case TIC80_OPERAND_CC:
case TIC80_OPERAND_BITNUM:
segment = absolute_section;
valu = PDS_VALUE (pdsp) & ~TIC80_OPERAND_MASK;
break;
default:
internal_error_a ("unhandled predefined symbol bits", symtype);
break;
}
symbol_table_insert (symbol_create (PDS_NAME (pdsp), segment, valu,
&zero_address_frag));
}
} }
/* The assembler adds md_shortopts to the string passed to getopt. */
CONST char *md_shortopts = ""; CONST char *md_shortopts = "";
/* The assembler adds md_longopts to the machine independent long options
that are passed to getopt. */
struct option md_longopts[] = { struct option md_longopts[] = {
{NULL, no_argument, NULL, 0} {NULL, no_argument, NULL, 0}
}; };
size_t md_longopts_size = sizeof(md_longopts); size_t md_longopts_size = sizeof(md_longopts);
/* Take care of the target-specific command-line options. */ /* The md_parse_option function will be called whenever getopt returns an
unrecognized code, presumably indicating a special code value which
appears in md_longopts for machine specific command line options. */
int int
md_parse_option (c, arg) md_parse_option (c, arg)
@ -873,7 +793,9 @@ md_parse_option (c, arg)
return (0); return (0);
} }
/* Print a description of the command-line options that we accept. */ /* The md_show_usage function will be called whenever a usage message is
printed. It should print a description of the machine specific options
found in md_longopts. */
void void
md_show_usage (stream) md_show_usage (stream)

View File

@ -1,6 +1,6 @@
/* This file is tc-tic80.h /* This file is tc-tic80.h
Copyright (C) 1996, Free Software Foundation, Inc. Copyright (C) 1996, 1997, Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler. This file is part of GAS, the GNU Assembler.
@ -20,12 +20,12 @@
#define TC_TIC80 #define TC_TIC80
#define TARGET_BYTES_BIG_ENDIAN 0
#define TARGET_ARCH bfd_arch_tic80 #define TARGET_ARCH bfd_arch_tic80
#define TARGET_FORMAT "coff-tic80" #define TARGET_FORMAT "coff-tic80"
#define BFD_ARCH TARGET_ARCH #define BFD_ARCH TARGET_ARCH
#define TARGET_BYTES_BIG_ENDIAN 0
#define md_number_to_chars number_to_chars_littleendian #define md_number_to_chars number_to_chars_littleendian
/* We have no special operand handling. */ /* We have no special operand handling. */

View File

@ -1,6 +1,6 @@
/* This file is tc-w65.h /* This file is tc-w65.h
Copyright (C) 1995 Free Software Foundation, Inc. Copyright (C) 1995, 1997 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler. This file is part of GAS, the GNU Assembler.
@ -21,6 +21,8 @@
#define TC_W65 #define TC_W65
#define TARGET_BYTES_BIG_ENDIAN 0
/* This macro translates between an internal fix and an coff reloc type */ /* This macro translates between an internal fix and an coff reloc type */
#define TC_COFF_FIX2RTYPE(fixP) tc_coff_fix2rtype(fixP) #define TC_COFF_FIX2RTYPE(fixP) tc_coff_fix2rtype(fixP)