diff options
author | Nick Clifton <nickc@redhat.com> | 2002-07-31 16:23:29 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2002-07-31 16:23:29 +0000 |
commit | 4eb6b71c65bbf121ebdb51966e5ce2ed411d2848 (patch) | |
tree | dfdde929db884a0491cbf5e809c7e4901791a207 /gas | |
parent | cd67d26656b0a34397fe0b6be4e9f3083e487eba (diff) | |
download | gdb-4eb6b71c65bbf121ebdb51966e5ce2ed411d2848.zip gdb-4eb6b71c65bbf121ebdb51966e5ce2ed411d2848.tar.gz gdb-4eb6b71c65bbf121ebdb51966e5ce2ed411d2848.tar.bz2 |
Fix bugs and remove compile time warnings for N"32K port.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 28 | ||||
-rw-r--r-- | gas/config/tc-ns32k.c | 479 | ||||
-rw-r--r-- | gas/config/tc-ns32k.h | 70 |
3 files changed, 314 insertions, 263 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 6595dff..3586257 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,31 @@ +2002-07-31 Ian Dall <ian@sibyl.beware.dropbear.id.au> + + * config/tc-ns32k.h (md_pcrel_adjust): Supply prototype. + * config/tc-ns32k.c (convert_iif, md_parse_option, md_show_usage): + Allow default displacement size to be an option "--disp-size-default". + (md_number_to_disp): Make error messages include value. Use %d to + print integers, not %s. + (fix_new_ns32k): Conditionally set fx_no_overflow so we don't + get duplicate messages sometimes. + (convert_iif): Grow frag to max possible instruction size. Avoid + creating unnecessary fixes. + (md_number_to_field) Add prototype. + (encode_operand, parse, convert_iif, md_fix_pcrel_adjust): Add + prototypes and make static. + (struct addr_mode): Make mode and scaled_mode explicitly signed. + (evaluate_expr): Use resultP argument instead of exprP global. + (get_addr_mode): Quiten compiler warnings. + (encode_operand): eliminate unused variables. Quiten compiler + warnings. Eliminate nul character in format strings. + (parse): argc is unsigned. + (reloc): Type cast index to quieten compiler. + (md_pcrel_adjust, md_apply_fix3): Remove unused variable. + (md_convert_frag): Note unused parameters. Remove unused + variables. + (md_create_long_jump, md_create_short_jump, + md_undefined_symbol_name, md_section_align, tc_gen_reloc): Note + unused parameters. + 2002-07-31 Nick Clifton <nickc@redhat.com> * NEWS: Retroactively add entry for Lars Brinkhoff's contribution diff --git a/gas/config/tc-ns32k.c b/gas/config/tc-ns32k.c index 4ed9ea0..bf28f04 100644 --- a/gas/config/tc-ns32k.c +++ b/gas/config/tc-ns32k.c @@ -63,26 +63,27 @@ const char comment_chars[] = "#"; const char line_comment_chars[] = LINE_COMMENT_CHARS; const char line_separator_chars[] = ";"; +static int default_disp_size = 4; /* Displacement size for external refs. */ #if !defined(ABSOLUTE_PREFIX) && !defined(IMMEDIATE_PREFIX) -#define ABSOLUTE_PREFIX '@' /* One or the other MUST be defined */ +#define ABSOLUTE_PREFIX '@' /* One or the other MUST be defined. */ #endif struct addr_mode { - char mode; /* addressing mode of operand (0-31) */ - char scaled_mode; /* mode combined with scaled mode */ - char scaled_reg; /* register used in scaled+1 (1-8) */ - char float_flag; /* set if R0..R7 was F0..F7 ie a - floating-point-register */ - char am_size; /* estimated max size of general addr-mode - parts */ - char im_disp; /* if im_disp==1 we have a displacement */ - char pcrel; /* 1 if pcrel, this is really redundant info */ - char disp_suffix[2]; /* length of displacement(s), 0=undefined */ - char *disp[2]; /* pointer(s) at displacement(s) - or immediates(s) (ascii) */ - char index_byte; /* index byte */ + signed char mode; /* Addressing mode of operand (0-31). */ + signed char scaled_mode; /* Mode combined with scaled mode. */ + char scaled_reg; /* Register used in scaled+1 (1-8). */ + char float_flag; /* Set if R0..R7 was F0..F7 ie a + floating-point-register. */ + char am_size; /* Estimated max size of general addr-mode + parts. */ + char im_disp; /* If im_disp==1 we have a displacement. */ + char pcrel; /* 1 if pcrel, this is really redundant info. */ + char disp_suffix[2]; /* Length of displacement(s), 0=undefined. */ + char *disp[2]; /* Pointer(s) at displacement(s) + or immediates(s) (ascii). */ + char index_byte; /* Index byte. */ }; typedef struct addr_mode addr_modeS; @@ -96,11 +97,11 @@ const char FLT_CHARS[] = "fd"; /* We don't want to support lowercase, do we? */ /* UPPERCASE denotes live names when an instruction is built, IIF is - * used as an intermediate form to store the actual parts of the - * instruction. A ns32k machine instruction can be divided into a - * couple of sub PARTs. When an instruction is assembled the - * appropriate PART get an assignment. When an IIF has been completed - * it is converted to a FRAGment as specified in AS.H. */ + used as an intermediate form to store the actual parts of the + instruction. A ns32k machine instruction can be divided into a + couple of sub PARTs. When an instruction is assembled the + appropriate PART get an assignment. When an IIF has been completed + it is converted to a FRAGment as specified in AS.H. */ /* Internal structs. */ struct ns32k_option @@ -112,21 +113,20 @@ struct ns32k_option typedef struct { - int type; /* how to interpret object */ - int size; /* Estimated max size of object */ - unsigned long object; /* binary data */ - int object_adjust; /* number added to object */ - int pcrel; /* True if object is pcrel */ - int pcrel_adjust; /* length in bytes from the - instruction start to the - displacement */ - int im_disp; /* True if the object is a displacement */ - relax_substateT relax_substate; /* Initial relaxsubstate */ - bit_fixS *bit_fixP; /* Pointer at bit_fix struct */ + int type; /* How to interpret object. */ + int size; /* Estimated max size of object. */ + unsigned long object; /* Binary data. */ + int object_adjust; /* Number added to object. */ + int pcrel; /* True if object is pcrel. */ + int pcrel_adjust; /* Length in bytes from the instruction + start to the displacement. */ + int im_disp; /* True if the object is a displacement. */ + relax_substateT relax_substate; /* Initial relaxsubstate. */ + bit_fixS *bit_fixP; /* Pointer at bit_fix struct. */ int addr_mode; /* What addrmode do we associate with this - iif-entry */ - char bsr; /* Sequent hack */ - } iif_entryT; /* Internal Instruction Format */ + iif-entry. */ + char bsr; /* Sequent hack. */ + } iif_entryT; /* Internal Instruction Format. */ struct int_ins_form { @@ -184,7 +184,7 @@ char *input_line_pointer; With this representation we simplify the assembly and separates the machine dependent/independent parts in a more clean way (said OE). */ -struct ns32k_option opt1[] = /* restore, exit */ +struct ns32k_option opt1[] = /* restore, exit. */ { {"r0", 0x80, 0xff}, {"r1", 0x40, 0xff}, @@ -196,7 +196,7 @@ struct ns32k_option opt1[] = /* restore, exit */ {"r7", 0x01, 0xff}, {0, 0x00, 0xff} }; -struct ns32k_option opt2[] = /* save, enter */ +struct ns32k_option opt2[] = /* save, enter. */ { {"r0", 0x01, 0xff}, {"r1", 0x02, 0xff}, @@ -208,7 +208,7 @@ struct ns32k_option opt2[] = /* save, enter */ {"r7", 0x80, 0xff}, {0, 0x00, 0xff} }; -struct ns32k_option opt3[] = /* setcfg */ +struct ns32k_option opt3[] = /* setcfg. */ { {"c", 0x8, 0xff}, {"m", 0x4, 0xff}, @@ -216,21 +216,21 @@ struct ns32k_option opt3[] = /* setcfg */ {"i", 0x1, 0xff}, {0, 0x0, 0xff} }; -struct ns32k_option opt4[] = /* cinv */ +struct ns32k_option opt4[] = /* cinv. */ { {"a", 0x4, 0xff}, {"i", 0x2, 0xff}, {"d", 0x1, 0xff}, {0, 0x0, 0xff} }; -struct ns32k_option opt5[] = /* string inst */ +struct ns32k_option opt5[] = /* String inst. */ { {"b", 0x2, 0xff}, {"u", 0xc, 0xff}, {"w", 0x4, 0xff}, {0, 0x0, 0xff} }; -struct ns32k_option opt6[] = /* plain reg ext,cvtp etc */ +struct ns32k_option opt6[] = /* Plain reg ext,cvtp etc. */ { {"r0", 0x00, 0xff}, {"r1", 0x01, 0xff}, @@ -247,7 +247,7 @@ struct ns32k_option opt6[] = /* plain reg ext,cvtp etc */ #define NS32532 #endif -struct ns32k_option cpureg_532[] = /* lpr spr */ +struct ns32k_option cpureg_532[] = /* lpr spr. */ { {"us", 0x0, 0xff}, {"dcr", 0x1, 0xff}, @@ -264,7 +264,7 @@ struct ns32k_option cpureg_532[] = /* lpr spr */ {"mod", 0xf, 0xff}, {0, 0x00, 0xff} }; -struct ns32k_option mmureg_532[] = /* lmr smr */ +struct ns32k_option mmureg_532[] = /* lmr smr. */ { {"mcr", 0x9, 0xff}, {"msr", 0xa, 0xff}, @@ -276,7 +276,7 @@ struct ns32k_option mmureg_532[] = /* lmr smr */ {0, 0x0, 0xff} }; -struct ns32k_option cpureg_032[] = /* lpr spr */ +struct ns32k_option cpureg_032[] = /* lpr spr. */ { {"upsr", 0x0, 0xff}, {"fp", 0x8, 0xff}, @@ -287,7 +287,7 @@ struct ns32k_option cpureg_032[] = /* lpr spr */ {"mod", 0xf, 0xff}, {0, 0x0, 0xff} }; -struct ns32k_option mmureg_032[] = /* lmr smr */ +struct ns32k_option mmureg_032[] = /* lmr smr. */ { {"bpr0", 0x0, 0xff}, {"bpr1", 0x1, 0xff}, @@ -367,9 +367,10 @@ char disp_test[] = char disp_size[] = {4, 1, 2, 0, 4}; -static void evaluate_expr PARAMS ((expressionS * resultP, char *ptr)); -static void md_number_to_disp PARAMS ((char *buf, long val, int n)); -static void md_number_to_imm PARAMS ((char *buf, long val, int n)); +static void evaluate_expr PARAMS ((expressionS * resultP, char *)); +static void md_number_to_disp PARAMS ((char *, long, int)); +static void md_number_to_imm PARAMS ((char *, long, int)); +static void md_number_to_field PARAMS ((char *, long, bit_fixS *)); /* Parse a general operand into an addressingmode struct @@ -379,25 +380,27 @@ static void md_number_to_imm PARAMS ((char *buf, long val, int n)); Out: data in addr_mode struct. */ -int +static int addr_mode PARAMS ((char *, addr_modeS *, int)); + +static int addr_mode (operand, addr_modeP, recursive_level) char *operand; - register addr_modeS *addr_modeP; + addr_modeS *addr_modeP; int recursive_level; { - register char *str; - register int i; - register int strl; - register int mode; + char *str; + int i; + int strl; + int mode; int j; - mode = DEFAULT; /* default */ - addr_modeP->scaled_mode = 0; /* why not */ - addr_modeP->scaled_reg = 0; /* if 0, not scaled index */ + mode = DEFAULT; /* Default. */ + addr_modeP->scaled_mode = 0; /* Why not. */ + addr_modeP->scaled_reg = 0; /* If 0, not scaled index. */ addr_modeP->float_flag = 0; addr_modeP->am_size = 0; addr_modeP->im_disp = 0; - addr_modeP->pcrel = 0; /* not set in this function */ + addr_modeP->pcrel = 0; /* Not set in this function. */ addr_modeP->disp_suffix[0] = 0; addr_modeP->disp_suffix[1] = 0; addr_modeP->disp[0] = NULL; @@ -443,7 +446,7 @@ addr_mode (operand, addr_modeP, recursive_level) return -1; } default: - as_warn (_("Invalid syntax in PC-relative addressing mode")); + as_bad (_("Invalid syntax in PC-relative addressing mode")); return 0; } } @@ -457,7 +460,7 @@ addr_mode (operand, addr_modeP, recursive_level) i = 0; j = 2; do - { /* disp[0]'s termination point */ + { /* disp[0]'s termination point. */ j += 1; if (str[j] == '(') i++; @@ -467,7 +470,7 @@ addr_mode (operand, addr_modeP, recursive_level) while (j < strl && i != 0); if (i != 0 || !(str[j + 1] == '-' || str[j + 1] == '+')) { - as_warn (_("Invalid syntax in External addressing mode")); + as_bad (_("Invalid syntax in External addressing mode")); return (0); } str[j] = '\000'; /* null terminate disp[0] */ @@ -530,7 +533,8 @@ addr_mode (operand, addr_modeP, recursive_level) mode = 18; if (mode != DEFAULT) - { /* Memory relative. */ + { + /* Memory relative. */ addr_modeP->mode = mode; j = strl - 5; /* Temp for end of disp[0]. */ i = 0; @@ -547,7 +551,7 @@ addr_mode (operand, addr_modeP, recursive_level) if (i != 0) { - as_warn (_("Invalid syntax in Memory Relative addressing mode")); + as_bad (_("Invalid syntax in Memory Relative addressing mode")); return (0); } @@ -614,28 +618,28 @@ addr_mode (operand, addr_modeP, recursive_level) mode = 31; break; default: - as_warn (_("Invalid scaled-indexed mode, use (b,w,d,q)")); + as_bad (_("Invalid scaled-indexed mode, use (b,w,d,q)")); if (str[strl - 3] != ':' || str[strl - 6] != '[' || str[strl - 5] == 'r' || str[strl - 4] < '0' || str[strl - 4] > '7') - as_warn (_("Syntax in scaled-indexed mode, use [Rn:m] where n=[0..7] m={b,w,d,q}")); + as_bad (_("Syntax in scaled-indexed mode, use [Rn:m] where n=[0..7] m={b,w,d,q}")); } /* Scaled index. */ if (recursive_level > 0) { - as_warn (_("Scaled-indexed addressing mode combined with scaled-index")); + as_bad (_("Scaled-indexed addressing mode combined with scaled-index")); return 0; } - addr_modeP->am_size += 1; /* scaled index byte */ - j = str[strl - 4] - '0'; /* store temporary */ - str[strl - 6] = '\000'; /* nullterminate for recursive call */ + addr_modeP->am_size += 1; /* scaled index byte. */ + j = str[strl - 4] - '0'; /* store temporary. */ + str[strl - 6] = '\000'; /* nullterminate for recursive call. */ i = addr_mode (str, addr_modeP, 1); if (!i || addr_modeP->mode == 20) { - as_warn (_("Invalid or illegal addressing mode combined with scaled-index")); + as_bad (_("Invalid or illegal addressing mode combined with scaled-index")); return 0; } @@ -659,7 +663,8 @@ addr_mode (operand, addr_modeP, recursive_level) specifying suffixes and determines size of immediate mode via ns32k-opcode. Also builds index bytes if needed. */ -int +static int get_addr_mode PARAMS ((char *, addr_modeS *)); +static int get_addr_mode (ptr, addr_modeP) char *ptr; addr_modeS *addr_modeP; @@ -700,7 +705,7 @@ get_addr_mode (ptr, addr_modeP) case. Think it does so with local labels too, not optimum, pcrel is better. When I have time I will make gas check this and select pcrel when possible Actually that is trivial. */ - if (tmp = addr_modeP->scaled_reg) + if ((tmp = addr_modeP->scaled_reg)) { /* Build indexbyte. */ tmp--; /* Remember regnumber comes incremented for flagpurpose. */ @@ -709,19 +714,21 @@ get_addr_mode (ptr, addr_modeP) addr_modeP->am_size += 1; } - if (disp_test[addr_modeP->mode]) + assert (addr_modeP->mode >= 0); + if (disp_test[(unsigned int) addr_modeP->mode]) { - register char c; - register char suffix; - register char suffix_sub; - register int i; - register char *toP; - register char *fromP; + char c; + char suffix; + char suffix_sub; + int i; + char *toP; + char *fromP; /* There was a displacement, probe for length specifying suffix. */ addr_modeP->pcrel = 0; - if (disp_test[addr_modeP->mode]) + assert(addr_modeP->mode >= 0); + if (disp_test[(unsigned int) addr_modeP->mode]) { /* There is a displacement. */ if (addr_modeP->mode == 27 || addr_modeP->scaled_mode == 27) @@ -734,12 +741,12 @@ get_addr_mode (ptr, addr_modeP) { suffix_sub = suffix = 0; - if (toP = addr_modeP->disp[i]) + if ((toP = addr_modeP->disp[i])) { /* Suffix of expression, the largest size rules. */ fromP = toP; - while (c = *fromP++) + while ((c = *fromP++)) { *toP++ = c; if (c == ':') @@ -794,14 +801,15 @@ get_addr_mode (ptr, addr_modeP) /* Read an optionlist. */ -void +static void optlist PARAMS ((char *, struct ns32k_option *, unsigned long *)); +static void optlist (str, optionP, default_map) char *str; /* The string to extract options from. */ struct ns32k_option *optionP; /* How to search the string. */ unsigned long *default_map; /* Default pattern and output. */ { - register int i, j, k, strlen1, strlen2; - register char *patternP, *strP; + int i, j, k, strlen1, strlen2; + char *patternP, *strP; strlen1 = strlen (str); @@ -837,13 +845,15 @@ optlist (str, optionP, default_map) the instructions lmr, smr, lpr, spr return true if str is found in list. */ -int +static int list_search PARAMS ((char *, struct ns32k_option *, unsigned long *)); + +static int list_search (str, optionP, default_map) char *str; /* The string to match. */ struct ns32k_option *optionP; /* List to search. */ unsigned long *default_map; /* Default pattern and output. */ { - register int i; + int i; for (i = 0; optionP[i].pattern != 0; i++) { @@ -857,7 +867,7 @@ list_search (str, optionP, default_map) } } - as_warn (_("No such entry in list. (cpu/mmu register)")); + as_bad (_("No such entry in list. (cpu/mmu register)")); return 0; } @@ -866,11 +876,11 @@ evaluate_expr (resultP, ptr) expressionS *resultP; char *ptr; { - register char *tmp_line; + char *tmp_line; tmp_line = input_line_pointer; input_line_pointer = ptr; - expression (&exprP); + expression (resultP); input_line_pointer = tmp_line; } @@ -880,18 +890,20 @@ evaluate_expr (resultP, ptr) opcode. Be carefull not to put to objects in the same iif-slot. */ -void +static void encode_operand PARAMS ((int argc, char **argv, char *operandsP, char *, char, char)); +static void encode_operand (argc, argv, operandsP, suffixP, im_size, opcode_bit_ptr) int argc; char **argv; char *operandsP; char *suffixP; - char im_size; + char im_size ATTRIBUTE_UNUSED; char opcode_bit_ptr; { - register int i, j; + int i, j; char d; - int pcrel, tmp, b, loop, pcrel_adjust; + int pcrel, b, loop, pcrel_adjust; + unsigned long tmp; for (loop = 0; loop < argc; loop++) { @@ -906,18 +918,18 @@ encode_operand (argc, argv, operandsP, suffixP, im_size, opcode_bit_ptr) switch ((d = operandsP[(loop << 1) + 1])) { - case 'f': /* operand of sfsr turns out to be a nasty - specialcase */ + case 'f': /* Operand of sfsr turns out to be a nasty + specialcase. */ opcode_bit_ptr -= 5; - case 'Z': /* float not immediate */ - case 'F': /* 32 bit float general form */ - case 'L': /* 64 bit float */ - case 'I': /* integer not immediate */ - case 'B': /* byte */ - case 'W': /* word */ - case 'D': /* double-word */ - case 'A': /* double-word gen-address-form ie no regs - allowed */ + case 'Z': /* Float not immediate. */ + case 'F': /* 32 bit float general form. */ + case 'L': /* 64 bit float. */ + case 'I': /* Integer not immediate. */ + case 'B': /* Byte */ + case 'W': /* Word */ + case 'D': /* Double-word. */ + case 'A': /* Double-word gen-address-form ie no regs + allowed. */ get_addr_mode (argv[i], &addr_modeP); if ((addr_modeP.mode == 20) && @@ -961,23 +973,23 @@ encode_operand (argc, argv, operandsP, suffixP, im_size, opcode_bit_ptr) } break; - case 'b': /* multiple instruction disp */ - freeptr++; /* OVE:this is an useful hack */ - sprintf (freeptr, "((%s-1)*%d)\000", argv[i], desc->im_size); + case 'b': /* Multiple instruction disp. */ + freeptr++; /* OVE:this is an useful hack. */ + sprintf (freeptr, "((%s-1)*%d)", argv[i], desc->im_size); argv[i] = freeptr; - pcrel -= 1; /* make pcrel 0 inspite of what case 'p': - wants */ + pcrel -= 1; /* Make pcrel 0 inspite of what case 'p': + wants. */ /* fall thru */ - case 'p': /* displacement - pc relative addressing */ + case 'p': /* Displacement - pc relative addressing. */ pcrel += 1; /* fall thru */ - case 'd': /* displacement */ + case 'd': /* Displacement. */ iif.instr_size += suffixP[i] ? suffixP[i] : 4; IIF (12, 2, suffixP[i], (unsigned long) argv[i], 0, pcrel, pcrel_adjust, 1, IND (BRANCH, BYTE), NULL, -1, 0); break; - case 'H': /* sequent-hack: the linker wants a bit set - when bsr */ + case 'H': /* Sequent-hack: the linker wants a bit set + when bsr. */ pcrel = 1; iif.instr_size += suffixP[i] ? suffixP[i] : 4; IIF (12, 2, suffixP[i], (unsigned long) argv[i], 0, @@ -988,68 +1000,68 @@ encode_operand (argc, argv, operandsP, suffixP, im_size, opcode_bit_ptr) IIF (11, 2, 42, (unsigned long) argv[i], 0, 0, 0, 0, 0, bit_fix_new (4, opcode_bit_ptr, -8, 7, 0, 1, 0), -1, 0); break; - case 'r': /* register number (3 bits) */ + case 'r': /* Register number (3 bits). */ list_search (argv[i], opt6, &tmp); opcode_bit_ptr -= 3; iif.iifP[1].object |= tmp << opcode_bit_ptr; break; - case 'O': /* setcfg instruction optionslist */ + case 'O': /* Setcfg instruction optionslist. */ optlist (argv[i], opt3, &tmp); opcode_bit_ptr -= 4; iif.iifP[1].object |= tmp << 15; break; - case 'C': /* cinv instruction optionslist */ + case 'C': /* Cinv instruction optionslist. */ optlist (argv[i], opt4, &tmp); opcode_bit_ptr -= 4; - iif.iifP[1].object |= tmp << 15; /* insert the regtype in opcode */ + iif.iifP[1].object |= tmp << 15; /* Insert the regtype in opcode. */ break; - case 'S': /* stringinstruction optionslist */ + case 'S': /* String instruction options list. */ optlist (argv[i], opt5, &tmp); opcode_bit_ptr -= 4; iif.iifP[1].object |= tmp << 15; break; case 'u': - case 'U': /* registerlist */ + case 'U': /* Register list. */ IIF (10, 1, 1, 0, 0, 0, 0, 0, 0, NULL, -1, 0); switch (operandsP[(i << 1) + 1]) { - case 'u': /* restore, exit */ + case 'u': /* Restore, exit. */ optlist (argv[i], opt1, &iif.iifP[10].object); break; - case 'U': /* save,enter */ + case 'U': /* Save, enter. */ optlist (argv[i], opt2, &iif.iifP[10].object); break; } iif.instr_size += 1; break; - case 'M': /* mmu register */ + case 'M': /* MMU register. */ list_search (argv[i], mmureg, &tmp); opcode_bit_ptr -= 4; iif.iifP[1].object |= tmp << opcode_bit_ptr; break; - case 'P': /* cpu register */ + case 'P': /* CPU register. */ list_search (argv[i], cpureg, &tmp); opcode_bit_ptr -= 4; iif.iifP[1].object |= tmp << opcode_bit_ptr; break; - case 'g': /* inss exts */ - iif.instr_size += 1; /* 1 byte is allocated after the opcode */ + case 'g': /* Inss exts. */ + iif.instr_size += 1; /* 1 byte is allocated after the opcode. */ IIF (10, 2, 1, - (unsigned long) argv[i], /* i always 2 here */ + (unsigned long) argv[i], /* i always 2 here. */ 0, 0, 0, 0, 0, - bit_fix_new (3, 5, 0, 7, 0, 0, 0), /* a bit_fix is targeted to - the byte */ + bit_fix_new (3, 5, 0, 7, 0, 0, 0), /* A bit_fix is targeted to + the byte. */ -1, 0); break; case 'G': IIF (11, 2, 42, - (unsigned long) argv[i], /* i always 3 here */ + (unsigned long) argv[i], /* i always 3 here. */ 0, 0, 0, 0, 0, bit_fix_new (5, 0, 1, 32, -1, 0, -1), -1, 0); break; case 'i': iif.instr_size += 1; - b = 2 + i; /* put the extension byte after opcode */ + b = 2 + i; /* Put the extension byte after opcode. */ IIF (b, 2, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0); break; default: @@ -1062,17 +1074,19 @@ encode_operand (argc, argv, operandsP, suffixP, im_size, opcode_bit_ptr) out: internal structure of instruction that has been prepared for direct conversion to fragment(s) and fixes in a systematical fashion - Return-value = recursive_level. */ + Return-value = recursive_level. */ /* Build iif of one assembly text line. */ -int +static int parse PARAMS ((char *, int)); +static int parse (line, recursive_level) char *line; int recursive_level; { - register char *lineptr, c, suffix_separator; - register int i; - int argc, arg_type; + char *lineptr, c, suffix_separator; + int i; + unsigned int argc; + int arg_type; char sqr, sep; char suffix[MAX_ARGS], *argv[MAX_ARGS]; /* No more than 4 operands. */ @@ -1128,7 +1142,7 @@ parse (line, recursive_level) break; } - suffix[argc] = 0; /* 0 when no ':' is encountered */ + suffix[argc] = 0; /* 0 when no ':' is encountered. */ argv[argc] = freeptr; *freeptr = '\0'; @@ -1257,7 +1271,8 @@ parse (line, recursive_level) objects not part of an instruction, the pointer to the opcode frag is always zero. */ -void +static void convert_iif PARAMS ((void)); +static void convert_iif () { int i; @@ -1270,8 +1285,8 @@ convert_iif () int k; char type; char size = 0; - int size_so_far; + frag_grow (iif.instr_size); /* This is important. */ memP = frag_more (0); inst_opcode = memP; inst_offset = (memP - frag_now->fr_literal); @@ -1279,7 +1294,7 @@ convert_iif () for (i = 0; i < IIF_ENTRIES; i++) { - if (type = iif.iifP[i].type) + if ((type = iif.iifP[i].type)) { /* The object exist, so handle it. */ switch (size = iif.iifP[i].size) @@ -1292,7 +1307,7 @@ convert_iif () iif.iifP[i].bit_fixP->fx_bit_base = (long) inst_opcode; /* Fall through. */ - case 8: /* bignum or doublefloat */ + case 8: /* bignum or doublefloat. */ case 1: case 2: case 3: @@ -1304,7 +1319,11 @@ convert_iif () switch (type) { case 1: /* The object is pure binary. */ - if (j || iif.iifP[i].pcrel) + if (j) + { + md_number_to_field(memP, exprP.X_add_number, j); + } + else if (iif.iifP[i].pcrel) { fix_new_ns32k (frag_now, (long) (memP - frag_now->fr_literal), @@ -1313,8 +1332,8 @@ convert_iif () iif.iifP[i].object, iif.iifP[i].pcrel, iif.iifP[i].im_disp, - j, - iif.iifP[i].bsr, /* sequent hack */ + 0, + iif.iifP[i].bsr, /* Sequent hack. */ inst_frag, inst_offset); } else @@ -1346,17 +1365,15 @@ convert_iif () /* We have a bignum ie a quad. This can only happens in a long suffixed instruction. */ if (k * 2 > size) - as_warn (_("Bignum too big for long")); + as_bad (_("Bignum too big for long")); if (k == 3) memP += 2; for (l = 0; k > 0; k--, l += 2) - { - md_number_to_chars (memP + l, - generic_bignum[l >> 1], - sizeof (LITTLENUM_TYPE)); - } + md_number_to_chars (memP + l, + generic_bignum[l >> 1], + sizeof (LITTLENUM_TYPE)); } else { @@ -1393,8 +1410,7 @@ convert_iif () } break; } - if (j || - exprP.X_add_symbol || + if (exprP.X_add_symbol || exprP.X_op_symbol || iif.iifP[i].pcrel) { @@ -1412,6 +1428,10 @@ convert_iif () iif.iifP[i].bsr, inst_frag, inst_offset); } + else if (j) + { + md_number_to_field(memP, exprP.X_add_number, j); + } else { /* Good, just put them bytes out. */ @@ -1445,9 +1465,8 @@ convert_iif () if ((exprP.X_add_symbol || exprP.X_op_symbol) && !iif.iifP[i].pcrel) { - /* Size is unknown until link time so have to - allow 4 bytes. */ - size = 4; + /* Size is unknown until link time so have to default. */ + size = default_disp_size; /* Normally 4 bytes. */ memP = frag_more (size); fix_new_ns32k_exp (frag_now, (long) (memP - frag_now->fr_literal), @@ -1458,7 +1477,7 @@ convert_iif () (bit_fixS *) 0, 0, inst_frag, inst_offset); - break; /* exit this absolute hack */ + break; /* Exit this absolute hack. */ } if (exprP.X_add_symbol || exprP.X_op_symbol) @@ -1515,7 +1534,7 @@ convert_iif () } else { - as_warn (_("Displacement to large for :d")); + as_bad (_("Displacement to large for :d")); size = 4; } } @@ -1584,7 +1603,7 @@ reloc (int size, int pcrel, int type) index = length + 3 * pcrel + 6 * type; - if (index >= 0 && index < sizeof (relocs) / sizeof (relocs[0])) + if (index >= 0 && (unsigned int) index < sizeof (relocs) / sizeof (relocs[0])) return relocs[index]; if (pcrel) @@ -1711,7 +1730,7 @@ md_number_to_disp (buf, val, n) { case 1: if (val < -64 || val > 63) - as_warn (_("Byte displacement out of range. line number not valid")); + as_bad (_("value of %ld out of byte displacement range."), val); val &= 0x7f; #ifdef SHOW_NUM printf ("%x ", val & 0xff); @@ -1720,7 +1739,7 @@ md_number_to_disp (buf, val, n) break; case 2: if (val < -8192 || val > 8191) - as_warn (_("Word displacement out of range. line number not valid")); + as_bad (_("value of %ld out of word displacement range."), val); val &= 0x3fff; val |= 0x8000; #ifdef SHOW_NUM @@ -1734,7 +1753,7 @@ md_number_to_disp (buf, val, n) break; case 4: if (val < -0x20000000 || val >= 0x20000000) - as_warn (_("Double word displacement out of range")); + as_bad (_("value of %ld out of double word displacement range."), val); val |= 0xc0000000; #ifdef SHOW_NUM printf ("%x ", val >> 24 & 0xff); @@ -1754,7 +1773,7 @@ md_number_to_disp (buf, val, n) *buf++ = val; break; default: - as_fatal (_("Internal logic error. line %s, file \"%s\""), + as_fatal (_("Internal logic error. line %d, file \"%s\""), __LINE__, __FILE__); } } @@ -1802,7 +1821,7 @@ md_number_to_imm (buf, val, n) *buf++ = val; break; default: - as_fatal (_("Internal logic error. line %s, file \"%s\""), + as_fatal (_("Internal logic error. line %d, file \"%s\""), __LINE__, __FILE__); } } @@ -1841,18 +1860,19 @@ static unsigned long r_mask[] = static void md_number_to_field (buf, val, field_ptr) - register char *buf; - register long val; - register bit_fixS *field_ptr; + char *buf; + long val; + bit_fixS *field_ptr; { - register unsigned long object; - register unsigned long mask; - /* define ENDIAN on a ns32k machine */ + unsigned long object; + unsigned long mask; + /* Define ENDIAN on a ns32k machine. */ #ifdef ENDIAN - register unsigned long *mem_ptr; + unsigned long *mem_ptr; #else - register char *mem_ptr; + char *mem_ptr; #endif + if (field_ptr->fx_bit_min <= val && val <= field_ptr->fx_bit_max) { #ifdef ENDIAN @@ -1875,7 +1895,7 @@ md_number_to_field (buf, val, field_ptr) #ifdef ENDIAN /* We have a nice ns32k machine with lowbyte at low-physical mem. */ object = *mem_ptr; /* get some bytes */ -#else /* OVE Goof! the machine is a m68k or dito */ +#else /* OVE Goof! the machine is a m68k or dito. */ /* That takes more byte fiddling. */ object = 0; object |= mem_ptr[3] & 0xff; @@ -1906,7 +1926,7 @@ md_number_to_field (buf, val, field_ptr) } else { - as_warn (_("Bit field out of range")); + as_bad (_("Bit field out of range")); } } @@ -1928,11 +1948,11 @@ md_pcrel_adjust (fragP) return fragP->fr_address + fragP->fr_fix - opcode_address; } -int +static int md_fix_pcrel_adjust PARAMS ((fixS *fixP)); +static int md_fix_pcrel_adjust (fixP) fixS *fixP; { - fragS *fragP = fixP->fx_frag; fragS *opcode_frag; addressT opcode_address; unsigned int offset; @@ -1961,13 +1981,13 @@ md_apply_fix3 (fixP, valP, seg) segT seg ATTRIBUTE_UNUSED; { long val = * (long *) valP; - fragS *fragP = fixP->fx_frag; char *buf = fixP->fx_where + fixP->fx_frag->fr_literal; if (fix_bit_fixP (fixP)) - /* Bitfields to fix, sigh. */ - md_number_to_field (buf, val, fix_bit_fixP (fixP)); - + { + /* Bitfields to fix, sigh. */ + md_number_to_field (buf, val, fix_bit_fixP (fixP)); + } else switch (fix_im_disp (fixP)) { case 0: @@ -1977,7 +1997,7 @@ md_apply_fix3 (fixP, valP, seg) case 1: /* Displacement field. */ - /* Calculate offset */ + /* Calculate offset. */ md_number_to_disp (buf, (fixP->fx_pcrel ? val + md_fix_pcrel_adjust (fixP) : val), fixP->fx_size); @@ -1993,32 +2013,29 @@ md_apply_fix3 (fixP, valP, seg) fixP->fx_done = 1; } -/* Convert a relaxed displacement to ditto in final output */ +/* Convert a relaxed displacement to ditto in final output. */ #ifndef BFD_ASSEMBLER void md_convert_frag (headers, sec, fragP) object_headers *headers; segT sec; - register fragS *fragP; + fragS *fragP; #else void md_convert_frag (abfd, sec, fragP) - bfd *abfd; - segT sec; - register fragS *fragP; + bfd *abfd ATTRIBUTE_UNUSED; + segT sec ATTRIBUTE_UNUSED; + fragS *fragP; #endif { long disp; long ext = 0; - /* Address in gas core of the place to store the displacement. */ - register char *buffer_address = fragP->fr_fix + fragP->fr_literal; + char *buffer_address = fragP->fr_fix + fragP->fr_literal; /* Address in object code of the displacement. */ int object_address; - fragS *opcode_frag; - switch (fragP->fr_subtype) { case IND (BRANCH, BYTE): @@ -2053,7 +2070,7 @@ md_convert_frag (abfd, sec, fragP) int md_estimate_size_before_relax (fragP, segment) - register fragS *fragP; + fragS *fragP; segT segment; { if (fragP->fr_subtype == IND (BRANCH, UNDEF)) @@ -2070,7 +2087,7 @@ md_estimate_size_before_relax (fragP, segment) 1, 1, 0, - frag_bsr(fragP), /*sequent hack */ + frag_bsr(fragP), /* Sequent hack. */ frag_opcode_frag (fragP), frag_opcode_offset (fragP)); fragP->fr_fix += 4; @@ -2101,8 +2118,8 @@ void md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol) char *ptr; addressT from_addr, to_addr; - fragS *frag; - symbolS *to_symbol; + fragS *frag ATTRIBUTE_UNUSED; + symbolS *to_symbol ATTRIBUTE_UNUSED; { valueT offset; @@ -2115,8 +2132,8 @@ void md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol) char *ptr; addressT from_addr, to_addr; - fragS *frag; - symbolS *to_symbol; + fragS *frag ATTRIBUTE_UNUSED; + symbolS *to_symbol ATTRIBUTE_UNUSED; { valueT offset; @@ -2129,6 +2146,8 @@ const char *md_shortopts = "m:"; struct option md_longopts[] = { +#define OPTION_DISP_SIZE (OPTION_MD_BASE) + {"disp-size-default", required_argument , NULL, OPTION_DISP_SIZE}, {NULL, no_argument, NULL, 0} }; @@ -2154,10 +2173,24 @@ md_parse_option (c, arg) } else { - as_bad (_("invalid architecture option -m%s"), arg); + as_warn (_("invalid architecture option -m%s, ignored"), arg); return 0; } break; + case OPTION_DISP_SIZE: + { + int size = atoi(arg); + switch (size) + { + case 1: case 2: case 4: + default_disp_size = size; + break; + default: + as_warn (_("invalid default displacement size \"%s\". Defaulting to %d."), + arg, default_disp_size); + } + break; + } default: return 0; @@ -2172,7 +2205,8 @@ md_show_usage (stream) { fprintf (stream, _("\ NS32K options:\n\ --m32032 | -m32532 select variant of NS32K architecture\n")); +-m32032 | -m32532 select variant of NS32K architecture\n\ +--disp-size-default=<1|2|4>\n")); } /* Create a bit_fixS in obstack 'notes'. @@ -2182,15 +2216,15 @@ NS32K options:\n\ bit_fixS * bit_fix_new (size, offset, min, max, add, base_type, base_adj) - char size; /* Length of bitfield */ - char offset; /* Bit offset to bitfield */ - long min; /* Signextended min for bitfield */ - long max; /* Signextended max for bitfield */ - long add; /* Add mask, used for huffman prefix */ - long base_type; /* 0 or 1, if 1 it's exploded to opcode ptr */ + char size; /* Length of bitfield. */ + char offset; /* Bit offset to bitfield. */ + long min; /* Signextended min for bitfield. */ + long max; /* Signextended max for bitfield. */ + long add; /* Add mask, used for huffman prefix. */ + long base_type; /* 0 or 1, if 1 it's exploded to opcode ptr. */ long base_adj; { - register bit_fixS *bit_fixP; + bit_fixS *bit_fixP; bit_fixP = (bit_fixS *) obstack_alloc (¬es, sizeof (bit_fixS)); @@ -2202,7 +2236,7 @@ bit_fix_new (size, offset, min, max, add, base_type, base_adj) bit_fixP->fx_bit_min = min; bit_fixP->fx_bit_add = add; - return (bit_fixP); + return bit_fixP; } void @@ -2213,13 +2247,13 @@ fix_new_ns32k (frag, where, size, add_symbol, offset, pcrel, int size; /* 1, 2 or 4 usually. */ symbolS *add_symbol; /* X_add_symbol. */ long offset; /* X_add_number. */ - int pcrel; /* TRUE if PC-relative relocation. */ - char im_disp; /* true if the value to write is a - displacement */ - bit_fixS *bit_fixP; /* pointer at struct of bit_fix's, ignored if - NULL */ - char bsr; /* sequent-linker-hack: 1 when relocobject is - a bsr */ + int pcrel; /* True if PC-relative relocation. */ + char im_disp; /* True if the value to write is a + displacement. */ + bit_fixS *bit_fixP; /* Pointer at struct of bit_fix's, ignored if + NULL. */ + char bsr; /* Sequent-linker-hack: 1 when relocobject is + a bsr. */ fragS *opcode_frag; unsigned int opcode_offset; { @@ -2237,6 +2271,8 @@ fix_new_ns32k (frag, where, size, add_symbol, offset, pcrel, fix_im_disp (fixP) = im_disp; fix_bsr (fixP) = bsr; fix_bit_fixP (fixP) = bit_fixP; + /* We have a MD overflow check for displacements. */ + fixP->fx_no_overflow = (im_disp != 0); } void @@ -2246,13 +2282,13 @@ fix_new_ns32k_exp (frag, where, size, exp, pcrel, int where; /* Where in that frag? */ int size; /* 1, 2 or 4 usually. */ expressionS *exp; /* Expression. */ - int pcrel; /* TRUE if PC-relative relocation. */ - char im_disp; /* true if the value to write is a - displacement */ - bit_fixS *bit_fixP; /* pointer at struct of bit_fix's, ignored if - NULL */ - char bsr; /* sequent-linker-hack: 1 when relocobject is - a bsr */ + int pcrel; /* True if PC-relative relocation. */ + char im_disp; /* True if the value to write is a + displacement. */ + bit_fixS *bit_fixP; /* Pointer at struct of bit_fix's, ignored if + NULL. */ + char bsr; /* Sequent-linker-hack: 1 when relocobject is + a bsr. */ fragS *opcode_frag; unsigned int opcode_offset; { @@ -2269,6 +2305,8 @@ fix_new_ns32k_exp (frag, where, size, exp, pcrel, fix_im_disp (fixP) = im_disp; fix_bsr (fixP) = bsr; fix_bit_fixP (fixP) = bit_fixP; + /* We have a MD overflow check for displacements. */ + fixP->fx_no_overflow = (im_disp != 0); } /* This is TC_CONS_FIX_NEW, called by emit_expr in read.c. */ @@ -2288,7 +2326,7 @@ cons_fix_new_ns32k (frag, where, size, exp) symbolS * md_undefined_symbol (name) - char *name; + char *name ATTRIBUTE_UNUSED; { return 0; } @@ -2297,7 +2335,7 @@ md_undefined_symbol (name) valueT md_section_align (segment, size) - segT segment; + segT segment ATTRIBUTE_UNUSED; valueT size; { return size; /* Byte alignment is fine. */ @@ -2311,6 +2349,7 @@ md_pcrel_from (fixP) fixS *fixP; { long res; + res = fixP->fx_where + fixP->fx_frag->fr_address; #ifdef SEQUENT_COMPATABILITY if (frag_bsr (fixP->fx_frag)) @@ -2323,7 +2362,7 @@ md_pcrel_from (fixP) arelent * tc_gen_reloc (section, fixp) - asection *section; + asection *section ATTRIBUTE_UNUSED; fixS *fixp; { arelent *rel; diff --git a/gas/config/tc-ns32k.h b/gas/config/tc-ns32k.h index 258afd0..417395d 100644 --- a/gas/config/tc-ns32k.h +++ b/gas/config/tc-ns32k.h @@ -1,5 +1,5 @@ /* tc-ns32k.h -- Opcode table for National Semi 32k processor - Copyright 1987, 1992, 1993, 1994, 1995, 1997, 2000 + Copyright 1987, 1992, 1993, 1994, 1995, 1997, 2000, 2002 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -24,6 +24,7 @@ #define TARGET_BYTES_BIG_ENDIAN 0 #define TC_PCREL_ADJUST(F) md_pcrel_adjust(F) +extern int md_pcrel_adjust PARAMS((fragS *fragP)); #ifdef BFD_ASSEMBLER #define NO_RELOC BFD_RELOC_NONE @@ -62,35 +63,17 @@ #define ARG_LEN 50 #define TC_CONS_FIX_NEW cons_fix_new_ns32k -extern void fix_new_ns32k_exp PARAMS((fragS *frag, - int where, - int size, - expressionS *exp, - int pcrel, - int im_disp, - bit_fixS *bit_fixP, /* really bit_fixS */ - int bsr, - fragS *opcode_frag, - unsigned int opcode_offset)); - -extern void fix_new_ns32k PARAMS ((fragS *frag, - int where, - int size, - symbolS *add_symbol, - long offset, - int pcrel, - int im_disp, - bit_fixS *bit_fixP, /* really bit_fixS */ - int bsr, - fragS *opcode_frag, - unsigned int opcode_offset)); - -extern void cons_fix_new_ns32k PARAMS ((fragS *frag, - int where, - int size, - expressionS *exp)); - -/* the NS32x32 has a non 0 nop instruction which should be used in aligns */ +extern void fix_new_ns32k_exp PARAMS ((fragS *, int, int, expressionS *, + int, int, bit_fixS *, int, fragS *, + unsigned int)); + +extern void fix_new_ns32k PARAMS ((fragS *, int, int, symbolS *, long, + int, int, bit_fixS *, int, fragS *, + unsigned int)); + +extern void cons_fix_new_ns32k PARAMS ((fragS *, int, int, expressionS *)); + +/* The NS32x32 has a non 0 nop instruction which should be used in aligns. */ #define NOP_OPCODE 0xa2 #define md_operand(x) @@ -99,33 +82,34 @@ extern const struct relax_type md_relax_table[]; #define TC_GENERIC_RELAX_TABLE md_relax_table #define TC_FRAG_TYPE \ -struct { \ - fragS *fr_opcode_fragP; \ - unsigned int fr_opcode_offset; \ - char fr_bsr; \ -} + struct \ + { \ + fragS * fr_opcode_fragP; \ + unsigned int fr_opcode_offset; \ + char fr_bsr; \ + } #define TC_FRAG_INIT(X) \ do \ { \ frag_opcode_frag (X) = NULL; \ frag_opcode_offset (X) = 0; \ - frag_bsr (X) = 0; \ + frag_bsr (X) = 0; \ } \ while (0) -/* Accessor macros for things which may move around */ +/* Accessor macros for things which may move around. */ #define frag_opcode_frag(X) (X)->tc_frag_data.fr_opcode_fragP #define frag_opcode_offset(X) (X)->tc_frag_data.fr_opcode_offset #define frag_bsr(X) (X)->tc_frag_data.fr_bsr #define TC_FIX_TYPE \ -struct \ -{ \ - fragS *opcode_fragP; \ - unsigned int opcode_offset; \ - unsigned int bsr : 1; \ -} + struct \ + { \ + fragS * opcode_fragP; \ + unsigned int opcode_offset; \ + unsigned int bsr : 1; \ + } /* Accessor macros for things which may move around. See comments in write.h. */ |