mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-23 19:50:13 +08:00
* doc/internals.texi (CPU backend): Fix typo in md_section_align
description. start-sanitize-tic80 * config/tc-tic80.h (NEED_FX_R_TYPE): Define. * config/tc-tic80.c (find_opcode): Add code to support O_symbol operands. (build_insn): Grab a frag early so we can use the address in fixups. Take one's complement of BITNUM values before insertion in opcode. Add code to support O_symbol operands. (md_apply_fix): Replace unimplemented warning with implementation. (md_pcrel_from): Ditto. (tc_coff_fix2rtype): Ditto. end-sanitize-tic80
This commit is contained in:
@ -1,3 +1,18 @@
|
|||||||
|
Sat Feb 22 20:53:01 1997 Fred Fish <fnf@cygnus.com>
|
||||||
|
* doc/internals.texi (CPU backend): Fix typo in md_section_align
|
||||||
|
description.
|
||||||
|
start-sanitize-tic80
|
||||||
|
* config/tc-tic80.h (NEED_FX_R_TYPE): Define.
|
||||||
|
* config/tc-tic80.c (find_opcode): Add code to support O_symbol
|
||||||
|
operands.
|
||||||
|
(build_insn): Grab a frag early so we can use the address in
|
||||||
|
fixups. Take one's complement of BITNUM values before insertion
|
||||||
|
in opcode. Add code to support O_symbol operands.
|
||||||
|
(md_apply_fix): Replace unimplemented warning with implementation.
|
||||||
|
(md_pcrel_from): Ditto.
|
||||||
|
(tc_coff_fix2rtype): Ditto.
|
||||||
|
end-sanitize-tic80
|
||||||
|
|
||||||
Fri Feb 21 14:34:31 1997 Martin M. Hunt <hunt@pizza.cygnus.com>
|
Fri Feb 21 14:34:31 1997 Martin M. Hunt <hunt@pizza.cygnus.com>
|
||||||
start-sanitize-d30v
|
start-sanitize-d30v
|
||||||
* config/tc-d30v.c (parallel_ok): New function.
|
* config/tc-d30v.c (parallel_ok): New function.
|
||||||
|
@ -381,9 +381,28 @@ find_opcode (opcode, myops)
|
|||||||
match = 0;
|
match = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case O_symbol:
|
||||||
|
if ((bits < 32) && (flags & TIC80_OPERAND_PCREL))
|
||||||
|
{
|
||||||
|
/* For now we only allow PC relative relocations in the
|
||||||
|
short immediate fields, like the TI assembler.
|
||||||
|
FIXME: Should be able to choose "best-fit". */
|
||||||
|
}
|
||||||
|
else if ((bits == 32) && (flags & TIC80_OPERAND_BASEREL))
|
||||||
|
{
|
||||||
|
/* For now we only allow base relative relocations in
|
||||||
|
the long immediate fields, like the TI assembler.
|
||||||
|
FIXME: Should be able to choose "best-fit". */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Symbols that don't match one of the above cases are
|
||||||
|
rejected as an operand. */
|
||||||
|
match = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case O_illegal:
|
case O_illegal:
|
||||||
case O_absent:
|
case O_absent:
|
||||||
case O_symbol:
|
|
||||||
case O_symbol_rva:
|
case O_symbol_rva:
|
||||||
case O_big:
|
case O_big:
|
||||||
case O_uminus:
|
case O_uminus:
|
||||||
@ -524,6 +543,11 @@ build_insn (opcode, opers)
|
|||||||
/* Start with the raw opcode bits from the opcode table. */
|
/* Start with the raw opcode bits from the opcode table. */
|
||||||
insn[0] = opcode -> opcode;
|
insn[0] = opcode -> opcode;
|
||||||
|
|
||||||
|
/* We are going to insert at least one 32 bit opcode so get the
|
||||||
|
frag now. */
|
||||||
|
|
||||||
|
f = frag_more (4);
|
||||||
|
|
||||||
/* For each operand expression, insert the appropriate bits into the
|
/* For each operand expression, insert the appropriate bits into the
|
||||||
instruction . */
|
instruction . */
|
||||||
for (expi = 0, opi = -1; opers[expi].X_op != O_illegal; expi++)
|
for (expi = 0, opi = -1; opers[expi].X_op != O_illegal; expi++)
|
||||||
@ -576,6 +600,11 @@ build_insn (opcode, opers)
|
|||||||
/* Endmask values of 0 and 32 give identical results */
|
/* Endmask values of 0 and 32 give identical results */
|
||||||
num = 0;
|
num = 0;
|
||||||
}
|
}
|
||||||
|
else if ((flags & TIC80_OPERAND_BITNUM))
|
||||||
|
{
|
||||||
|
/* BITNUM values are stored in one's complement form */
|
||||||
|
num = (~num & 0x1F);
|
||||||
|
}
|
||||||
/* Mask off upper bits, just it case it is signed and is negative */
|
/* Mask off upper bits, just it case it is signed and is negative */
|
||||||
if (bits < 32)
|
if (bits < 32)
|
||||||
{
|
{
|
||||||
@ -588,9 +617,33 @@ build_insn (opcode, opers)
|
|||||||
insn[1] = num;
|
insn[1] = num;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case O_symbol:
|
||||||
|
if (flags & TIC80_OPERAND_PCREL)
|
||||||
|
{
|
||||||
|
fix_new_exp (frag_now,
|
||||||
|
f - (frag_now -> fr_literal),
|
||||||
|
4, /* FIXME! how is this used? */
|
||||||
|
&opers[expi],
|
||||||
|
1,
|
||||||
|
R_MPPCR);
|
||||||
|
}
|
||||||
|
else if (flags & TIC80_OPERAND_BASEREL)
|
||||||
|
{
|
||||||
|
extended++;
|
||||||
|
fix_new_exp (frag_now,
|
||||||
|
(f + 4) - (frag_now -> fr_literal),
|
||||||
|
4,
|
||||||
|
&opers[expi],
|
||||||
|
0, /* FIXME! should allow pcrel */
|
||||||
|
R_RELLONGX); /* FIXME! should be the right reloc type */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
internal_error ("symbol reloc that is not PC or BASEREG relative");
|
||||||
|
}
|
||||||
|
break;
|
||||||
case O_illegal:
|
case O_illegal:
|
||||||
case O_absent:
|
case O_absent:
|
||||||
case O_symbol:
|
|
||||||
case O_symbol_rva:
|
case O_symbol_rva:
|
||||||
case O_big:
|
case O_big:
|
||||||
case O_uminus:
|
case O_uminus:
|
||||||
@ -624,7 +677,6 @@ build_insn (opcode, opers)
|
|||||||
|
|
||||||
/* Write out the instruction, either 4 or 8 bytes. */
|
/* Write out the instruction, either 4 or 8 bytes. */
|
||||||
|
|
||||||
f = frag_more (4);
|
|
||||||
md_number_to_chars (f, insn[0], 4);
|
md_number_to_chars (f, insn[0], 4);
|
||||||
if (extended)
|
if (extended)
|
||||||
{
|
{
|
||||||
@ -814,22 +866,38 @@ md_apply_fix (fixP, val)
|
|||||||
fixS *fixP;
|
fixS *fixP;
|
||||||
long val;
|
long val;
|
||||||
{
|
{
|
||||||
internal_error ("md_apply_fix() not implemented yet");
|
char *dest = fixP -> fx_frag -> fr_literal + fixP -> fx_where;
|
||||||
abort ();
|
|
||||||
|
switch (fixP -> fx_r_type)
|
||||||
|
{
|
||||||
|
case R_RELLONGX:
|
||||||
|
md_number_to_chars (dest, (valueT) val, 4);
|
||||||
|
break;
|
||||||
|
case R_MPPCR:
|
||||||
|
/* FIXME! - should check for overflow of the 15 bit field */
|
||||||
|
*dest++ = val >> 2;
|
||||||
|
*dest = (*dest & 0x80) | val >> 10;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
internal_error_a ("unhandled relocation type in fixup", fixP -> fx_r_type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Functions concerning relocs. */
|
/* Functions concerning relocs. */
|
||||||
|
|
||||||
/* The location from which a PC relative jump should be calculated,
|
/* The location from which a PC relative jump should be calculated,
|
||||||
given a PC relative reloc. */
|
given a PC relative reloc.
|
||||||
|
|
||||||
|
For the TIc80, this is the address of the 32 bit opcode containing
|
||||||
|
the PC relative field. */
|
||||||
|
|
||||||
long
|
long
|
||||||
md_pcrel_from (fixP)
|
md_pcrel_from (fixP)
|
||||||
fixS *fixP;
|
fixS *fixP;
|
||||||
{
|
{
|
||||||
internal_error ("md_pcrel_from() not implemented yet");
|
return (fixP -> fx_frag -> fr_address + fixP -> fx_where) ;
|
||||||
abort ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -866,8 +934,7 @@ short
|
|||||||
tc_coff_fix2rtype (fixP)
|
tc_coff_fix2rtype (fixP)
|
||||||
fixS *fixP;
|
fixS *fixP;
|
||||||
{
|
{
|
||||||
internal_error ("tc_coff_fix2rtype() not implemented yet");
|
return (fixP -> fx_r_type);
|
||||||
abort ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* OBJ_COFF */
|
#endif /* OBJ_COFF */
|
||||||
|
@ -26,6 +26,10 @@
|
|||||||
#define TARGET_FORMAT "coff-tic80"
|
#define TARGET_FORMAT "coff-tic80"
|
||||||
#define BFD_ARCH TARGET_ARCH
|
#define BFD_ARCH TARGET_ARCH
|
||||||
|
|
||||||
|
/* We need the extra field in the fixup struct to put the relocation in. */
|
||||||
|
|
||||||
|
#define NEED_FX_R_TYPE
|
||||||
|
|
||||||
/* Define md_number_to_chars as the appropriate standard big endian or
|
/* Define md_number_to_chars as the appropriate standard big endian or
|
||||||
little endian function. Should we someday support endianness as a
|
little endian function. Should we someday support endianness as a
|
||||||
runtime decision, this will need to change. */
|
runtime decision, this will need to change. */
|
||||||
|
Reference in New Issue
Block a user