mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-02-18 00:18:11 +00:00
* tc-i386.h (NO_RELOC) [BFD_ASSEMBLER]: Define as BFD_RELOC_NONE.
(md_parse_option): New macro, converted from function. * tc-i386.c (md_parse_option): Function deleted. (comment_chars) [OBJ_ELF]: Include "/". (line_comment_chars) [OBJ_ELF || TE_I386AIX]: Don't include "/". (md_assemble): Cast 0xe9 to char explicitly, to avoid compiler warning. (md_assemble, md_estimate_size_before_relax, md_create_long_jump): Call reloc for fix_new type, or use correct enumerator, instead of always using NO_RELOC. (i386_operand): Change "ifndef I386COFF" to "ifdef OBJ_AOUT" for tests for valid section. (md_convert_frag) [BFD_ASSEMBLER]: Compensate for frag start address. (md_apply_fix_1) [BFD_ASSEMBLER]: For pc-relative reloc with symbol, compensate for location of reloc. (reloc, BFD_RELOC_32, BFD_RELOC_32_PCREL) [!BFD_ASSEMBLER]: Define to return zero.
This commit is contained in:
parent
89745e930e
commit
7b23213f31
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user