From a52f90a4c836e751c6ae044de70069f617ca2301 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 16 Jun 1997 17:31:46 +0000 Subject: [PATCH] * config/tc-i386.c (i386_operand): Use alloca rather than a fixed buffer size to make a copy of the symbol. --- gas/ChangeLog | 3 ++ gas/config/tc-i386.c | 74 +++++++++++++++++++++++++++----------------- 2 files changed, 48 insertions(+), 29 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 1a24b7a8754..8bf6cc9f0be 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,8 @@ Mon Jun 16 12:45:56 1997 Ian Lance Taylor + * config/tc-i386.c (i386_operand): Use alloca rather than a fixed + buffer size to make a copy of the symbol. + * Makefile.in (OBJS): Put @extra_objects@ on the same line as macro.o. diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 1b4424d3db6..a1e83c53547 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -638,7 +638,8 @@ pi (line, x) fprintf (stdout, " #%d: ", i + 1); pt (x->types[i]); fprintf (stdout, "\n"); - if (x->types[i] & (Reg | SReg2 | SReg3 | Control | Debug | Test)) + if (x->types[i] + & (Reg | SReg2 | SReg3 | Control | Debug | Test | RegMMX)) fprintf (stdout, "%s\n", x->regs[i]->reg_name); if (x->types[i] & Imm) pe (x->imms[i]); @@ -2329,6 +2330,7 @@ i386_operand (operand_string) save_input_line_pointer = input_line_pointer; input_line_pointer = displacement_string_start; END_STRING_AND_SAVE (displacement_string_end); + #ifndef LEX_AT { /* @@ -2338,36 +2340,49 @@ i386_operand (operand_string) * into a temporary buffer... */ register char *cp; - if ((cp = strchr (input_line_pointer,'@')) != NULL) { - char tmpbuf[BUFSIZ]; - - if(!GOT_symbol) - GOT_symbol = symbol_find_or_make(GLOBAL_OFFSET_TABLE_NAME); - - if (strncmp(cp+1, "PLT", 3) == 0) { - i.disp_reloc[this_operand] = BFD_RELOC_386_PLT32; - *cp = '\0'; - strcpy(tmpbuf, input_line_pointer); - strcat(tmpbuf, cp+1+3); - *cp = '@'; - } else if (strncmp(cp+1, "GOTOFF", 6) == 0) { - i.disp_reloc[this_operand] = BFD_RELOC_386_GOTOFF; - *cp = '\0'; - strcpy(tmpbuf, input_line_pointer); - strcat(tmpbuf, cp+1+6); - *cp = '@'; - } else if (strncmp(cp+1, "GOT", 3) == 0) { - i.disp_reloc[this_operand] = BFD_RELOC_386_GOT32; - *cp = '\0'; - strcpy(tmpbuf, input_line_pointer); - strcat(tmpbuf, cp+1+3); - *cp = '@'; - } else - as_bad("Bad reloc specifier '%s' in expression", cp+1); - input_line_pointer = tmpbuf; - } + + cp = strchr (input_line_pointer, '@'); + if (cp != NULL) + { + char *tmpbuf; + + if (GOT_symbol == NULL) + GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME); + + tmpbuf = (char *) alloca ((cp - input_line_pointer) + 20); + + if (strncmp (cp + 1, "PLT", 3) == 0) + { + i.disp_reloc[this_operand] = BFD_RELOC_386_PLT32; + *cp = '\0'; + strcpy (tmpbuf, input_line_pointer); + strcat (tmpbuf, cp + 1 + 3); + *cp = '@'; + } + else if (strncmp (cp + 1, "GOTOFF", 6) == 0) + { + i.disp_reloc[this_operand] = BFD_RELOC_386_GOTOFF; + *cp = '\0'; + strcpy (tmpbuf, input_line_pointer); + strcat (tmpbuf, cp + 1 + 6); + *cp = '@'; + } + else if (strncmp (cp + 1, "GOT", 3) == 0) + { + i.disp_reloc[this_operand] = BFD_RELOC_386_GOT32; + *cp = '\0'; + strcpy (tmpbuf, input_line_pointer); + strcat (tmpbuf, cp + 1 + 3); + *cp = '@'; + } + else + as_bad ("Bad reloc specifier '%s' in expression", cp + 1); + + input_line_pointer = tmpbuf; + } } #endif + exp_seg = expression (exp); #ifdef BFD_ASSEMBLER @@ -3054,6 +3069,7 @@ tc_gen_reloc (section, fixp) case BFD_RELOC_386_GOT32: case BFD_RELOC_386_GOTOFF: case BFD_RELOC_386_GOTPC: + case BFD_RELOC_RVA: code = fixp->fx_r_type; break; default: -- 2.30.2