diff options
-rw-r--r-- | gas/config/tc-i386.c | 75 |
1 files changed, 43 insertions, 32 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 3694ac2..c77d2cb 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -91,7 +91,7 @@ typedef struct _i386_insn i386_insn; /* This array holds the chars that always start a comment. If the pre-processor is disabled, these aren't very useful */ -#ifdef TE_I386AIX +#if defined (TE_I386AIX) || defined (OBJ_ELF) const char comment_chars[] = "#/"; #else const char comment_chars[] = "#"; @@ -105,7 +105,11 @@ const char comment_chars[] = "#"; #NO_APP at the beginning of its output. */ /* Also note that comments started like this one will always work if '/' isn't otherwise defined. */ -const char line_comment_chars[] = "/"; /* removed '#' xoxorich. */ +#if defined (TE_I386AIX) || defined (OBJ_ELF) +const char line_comment_chars[]; +#else +const char line_comment_chars[] = "/"; +#endif const char line_separator_chars[] = ""; /* Chars that can be used to separate mant from exp in floating point nums */ @@ -631,6 +635,10 @@ reloc (size, pcrel) } abort (); } +#else +#define reloc(SIZE,PCREL) 0 +#define BFD_RELOC_32 0 +#define BFD_RELOC_32_PCREL 0 #endif /* This is the guts of the machine-dependent assembler. LINE points to a @@ -1361,7 +1369,7 @@ md_assemble (line) { /* pace */ /* unconditional jump */ p = frag_more (5); - p[0] = 0xe9; + p[0] = (char) 0xe9; md_number_to_chars (&p[1], n, 4); } else @@ -1426,7 +1434,7 @@ md_assemble (line) else { fix_new_exp (frag_now, p - frag_now->fr_literal, size, - i.disps[0], 1, NO_RELOC); + i.disps[0], 1, reloc (size, 1)); } } else if (t->opcode_modifier & JumpInterSegment) @@ -1437,7 +1445,7 @@ md_assemble (line) md_number_to_chars (p + 1, i.imms[1]->X_add_number, 4); else fix_new_exp (frag_now, p + 1 - frag_now->fr_literal, 4, - i.imms[1], 0, NO_RELOC); + i.imms[1], 0, BFD_RELOC_32); if (i.imms[0]->X_op != O_constant) as_bad ("can't handle non absolute segment in long call/jmp"); md_number_to_chars (p + 5, i.imms[0]->X_add_number, 2); @@ -1527,7 +1535,7 @@ md_assemble (line) /* need a 32-bit fixup (don't support 8bit non-absolute disps) */ p = frag_more (4); fix_new_exp (frag_now, p - frag_now->fr_literal, 4, - i.disps[n], 0, NO_RELOC); + i.disps[n], 0, BFD_RELOC_32); } } } @@ -1573,7 +1581,7 @@ md_assemble (line) size = 4; p = frag_more (size); fix_new_exp (frag_now, p - frag_now->fr_literal, size, - i.imms[n], 0, NO_RELOC); + i.imms[n], 0, reloc (size, 0)); } } } @@ -1688,7 +1696,7 @@ i386_operand (operand_string) exp_seg = expression (exp); input_line_pointer = save_input_line_pointer; - if (exp.X_op == O_absent) + if (exp->X_op == O_absent) { /* missing or bad expr becomes absolute 0 */ as_bad ("missing or invalid immediate expression '%s' taken as 0", @@ -1699,11 +1707,11 @@ i386_operand (operand_string) exp->X_op_symbol = (symbolS *) 0; i.types[this_operand] |= Imm; } - else if (exp.X_op == O_constant) + else if (exp->X_op == O_constant) { i.types[this_operand] |= smallest_imm_type (exp->X_add_number); } -#ifndef I386COFF +#ifdef OBJ_AOUT else if (exp_seg != text_section && exp_seg != data_section && exp_seg != bss_section @@ -1929,7 +1937,7 @@ i386_operand (operand_string) as_bad ("Ignoring junk '%s' after expression", input_line_pointer); RESTORE_END_STRING (displacement_string_end); input_line_pointer = save_input_line_pointer; - if (exp.X_op == O_absent) + if (exp->X_op == O_absent) { /* missing expr becomes absolute 0 */ as_bad ("missing or invalid displacement '%s' taken as 0", @@ -1940,7 +1948,7 @@ i386_operand (operand_string) exp->X_add_symbol = (symbolS *) 0; exp->X_op_symbol = (symbolS *) 0; } - else if (exp.X_op == O_constant) + else if (exp->X_op == O_constant) { i.types[this_operand] |= SMALLEST_DISP_TYPE (exp->X_add_number); } @@ -1953,7 +1961,7 @@ i386_operand (operand_string) } else { -#ifdef I386COFF +#ifndef OBJ_AOUT i.types[this_operand] |= Disp32; #else goto seg_unimplemented; @@ -2034,7 +2042,7 @@ md_estimate_size_before_relax (fragP, segment) fragP->fr_fix += 4; fix_new (fragP, old_fr_fix, 4, fragP->fr_symbol, - fragP->fr_offset, 1, NO_RELOC); + fragP->fr_offset, 1, BFD_RELOC_32_PCREL); break; default: @@ -2045,7 +2053,7 @@ md_estimate_size_before_relax (fragP, segment) fragP->fr_fix += 1 + 4; /* we've added an opcode byte */ fix_new (fragP, old_fr_fix + 1, 4, fragP->fr_symbol, - fragP->fr_offset, 1, NO_RELOC); + fragP->fr_offset, 1, BFD_RELOC_32_PCREL); break; } frag_wane (fragP); @@ -2088,6 +2096,9 @@ md_convert_frag (abfd, sec, fragP) /* Address we want to reach in file space. */ target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset; +#ifdef BFD_ASSEMBLER /* not needed otherwise? */ + target_address += fragP->fr_symbol->sy_frag->fr_address; +#endif /* Address opcode resides at in file space. */ opcode_address = fragP->fr_address + fragP->fr_fix; @@ -2177,7 +2188,7 @@ md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol) md_number_to_chars (ptr, 0xe9, 1); /* opcode for long jmp */ md_number_to_chars (ptr + 1, offset, 4); fix_new (frag, (ptr + 1) - frag->fr_literal, 4, - to_symbol, (offsetT) 0, 0, NO_RELOC); + to_symbol, (offsetT) 0, 0, BFD_RELOC_32); } else { @@ -2187,15 +2198,6 @@ md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol) } } -int -md_parse_option (argP, cntP, vecP) - char **argP; - int *cntP; - char ***vecP; -{ - return 1; -} - void /* Knows about order of bytes in address. */ md_number_to_chars (con, value, nbytes) char con[]; /* Return 'nbytes' of chars here. */ @@ -2239,6 +2241,17 @@ md_apply_fix_1 (fixP, value) { register char *p = fixP->fx_where + fixP->fx_frag->fr_literal; +#ifdef BFD_ASSEMBLER + /* + * This is a hack. There should be a better way to + * handle this. + */ + if (fixP->fx_r_type == BFD_RELOC_32_PCREL && fixP->fx_addsy) + { + value += fixP->fx_where + fixP->fx_frag->fr_address; + } +#endif + switch (fixP->fx_size) { case 1: @@ -2263,7 +2276,7 @@ md_apply_fix_1 (fixP, value) int md_apply_fix (fixP, valp) fixS *fixP; - long *valp; + valueT *valp; { md_apply_fix_1 (fixP, *valp); return 1; @@ -2359,9 +2372,9 @@ output_invalid (c) return output_invalid_buf; } +/* reg_string starts *before* REGISTER_PREFIX */ static reg_entry * parse_register (reg_string) - /* reg_string starts *before* REGISTER_PREFIX */ char *reg_string; { register char *s = reg_string; @@ -2410,9 +2423,9 @@ md_section_align (segment, size) return size; /* Byte alignment is fine */ } -/* Exactly what point is a PC-relative offset relative TO? - On the i386, they're relative to the address of the offset, plus - its size. (??? Is this right? FIXME-SOON!) */ +/* Exactly what point is a PC-relative offset relative TO? On the + i386, they're relative to the address of the offset, plus its + size. (??? Is this right? FIXME-SOON!) */ long md_pcrel_from (fixP) fixS *fixP; @@ -2530,8 +2543,6 @@ tc_coff_fix2rtype (fixP) (fixP->fx_size == 1 ? R_RELBYTE : fixP->fx_size == 2 ? R_RELWORD : R_DIR32)); - - } int |