(md_create_short_jump, md_create_long_jump,
md_number_to_chars, md_section_align): Adjusted for new interface.
This commit is contained in:
parent
6e3785155d
commit
3c8df4ba76
1 changed files with 66 additions and 60 deletions
|
@ -34,7 +34,7 @@
|
|||
/* 'md_assemble ()' gathers together information and puts it into a
|
||||
i386_insn. */
|
||||
|
||||
typedef struct
|
||||
struct _i386_insn
|
||||
{
|
||||
/* TM holds the template for the insn were currently assembling. */
|
||||
template tm;
|
||||
|
@ -85,9 +85,9 @@ typedef struct
|
|||
|
||||
modrm_byte rm;
|
||||
base_index_byte bi;
|
||||
}
|
||||
};
|
||||
|
||||
i386_insn;
|
||||
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 */
|
||||
|
@ -135,8 +135,7 @@ static char digit_chars[256];
|
|||
/* put here all non-digit non-letter charcters that may occur in an operand */
|
||||
static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:";
|
||||
|
||||
static char *ordinal_names[] =
|
||||
{"first", "second", "third"}; /* for printfs */
|
||||
static char *ordinal_names[] = {"first", "second", "third"}; /* for printfs */
|
||||
|
||||
/* md_assemble() always leaves the strings it's passed unaltered. To
|
||||
effect this we maintain a stack of saved characters that we've smashed
|
||||
|
@ -158,12 +157,11 @@ static reg_entry *ebp, *esp;
|
|||
|
||||
static int this_operand; /* current operand we are working on */
|
||||
|
||||
/*
|
||||
Interface to relax_segment.
|
||||
There are 2 relax states for 386 jump insns: one for conditional & one
|
||||
for unconditional jumps. This is because the these two types of jumps
|
||||
add different sizes to frags when we're figuring out what sort of jump
|
||||
to choose to reach a given label. */
|
||||
/* Interface to relax_segment.
|
||||
There are 2 relax states for 386 jump insns: one for conditional &
|
||||
one for unconditional jumps. This is because the these two types
|
||||
of jumps add different sizes to frags when we're figuring out what
|
||||
sort of jump to choose to reach a given label. */
|
||||
|
||||
/* types */
|
||||
#define COND_JUMP 1 /* conditional jump */
|
||||
|
@ -174,6 +172,14 @@ static int this_operand; /* current operand we are working on */
|
|||
#define DWORD 2
|
||||
#define UNKNOWN_SIZE 3
|
||||
|
||||
#ifndef INLINE
|
||||
#ifdef __GNUC__
|
||||
#define INLINE __inline__
|
||||
#else
|
||||
#define INLINE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define ENCODE_RELAX_STATE(type,size) ((type<<2) | (size))
|
||||
#define SIZE_FROM_RELAX_STATE(s) \
|
||||
( (((s) & 0x3) == BYTE ? 1 : (((s) & 0x3) == WORD ? 2 : 4)) )
|
||||
|
@ -191,23 +197,23 @@ const relax_typeS md_relax_table[] =
|
|||
{1, 1, 0, 0},
|
||||
{1, 1, 0, 0},
|
||||
|
||||
/* For now we don't use word displacement jumps: they may be
|
||||
untrustworthy. */
|
||||
/* For now we don't use word displacement jumps; they may be
|
||||
untrustworthy. */
|
||||
{127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (COND_JUMP, DWORD)},
|
||||
/* word conditionals add 3 bytes to frag:
|
||||
2 opcode prefix; 1 displacement bytes */
|
||||
/* word conditionals add 3 bytes to frag:
|
||||
2 opcode prefix; 1 displacement bytes */
|
||||
{32767 + 2, -32768 + 2, 3, ENCODE_RELAX_STATE (COND_JUMP, DWORD)},
|
||||
/* dword conditionals adds 4 bytes to frag:
|
||||
1 opcode prefix; 3 displacement bytes */
|
||||
/* dword conditionals adds 4 bytes to frag:
|
||||
1 opcode prefix; 3 displacement bytes */
|
||||
{0, 0, 4, 0},
|
||||
{1, 1, 0, 0},
|
||||
|
||||
{127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (UNCOND_JUMP, DWORD)},
|
||||
/* word jmp adds 2 bytes to frag:
|
||||
1 opcode prefix; 1 displacement bytes */
|
||||
/* word jmp adds 2 bytes to frag:
|
||||
1 opcode prefix; 1 displacement bytes */
|
||||
{32767 + 2, -32768 + 2, 2, ENCODE_RELAX_STATE (UNCOND_JUMP, DWORD)},
|
||||
/* dword jmp adds 3 bytes to frag:
|
||||
0 opcode prefix; 3 displacement bytes */
|
||||
/* dword jmp adds 3 bytes to frag:
|
||||
0 opcode prefix; 3 displacement bytes */
|
||||
{0, 0, 3, 0},
|
||||
{1, 1, 0, 0},
|
||||
|
||||
|
@ -220,18 +226,16 @@ static reg_entry *parse_register PARAMS ((char *reg_string));
|
|||
static void s_bss PARAMS ((void));
|
||||
#endif
|
||||
|
||||
static unsigned long
|
||||
static INLINE unsigned long
|
||||
mode_from_disp_size (t)
|
||||
unsigned long t;
|
||||
{
|
||||
return ((t & (Disp8))
|
||||
? 1
|
||||
: ((t & (Disp32)) ? 2 : 0));
|
||||
} /* mode_from_disp_size() */
|
||||
return (t & Disp8) ? 1 : (t & Disp32) ? 2 : 0;
|
||||
}
|
||||
|
||||
/* convert opcode suffix ('b' 'w' 'l' typically) into type specifyer */
|
||||
/* convert opcode suffix ('b' 'w' 'l' typically) into type specifier */
|
||||
|
||||
static unsigned long
|
||||
static INLINE unsigned long
|
||||
opcode_suffix_to_type (s)
|
||||
unsigned long s;
|
||||
{
|
||||
|
@ -240,32 +244,32 @@ opcode_suffix_to_type (s)
|
|||
? Word : DWord));
|
||||
} /* opcode_suffix_to_type() */
|
||||
|
||||
static int
|
||||
static INLINE int
|
||||
fits_in_signed_byte (num)
|
||||
long num;
|
||||
{
|
||||
return ((num >= -128) && (num <= 127));
|
||||
return (num >= -128) && (num <= 127);
|
||||
} /* fits_in_signed_byte() */
|
||||
|
||||
static int
|
||||
static INLINE int
|
||||
fits_in_unsigned_byte (num)
|
||||
long num;
|
||||
{
|
||||
return ((num & 0xff) == num);
|
||||
return (num & 0xff) == num;
|
||||
} /* fits_in_unsigned_byte() */
|
||||
|
||||
static int
|
||||
static INLINE int
|
||||
fits_in_unsigned_word (num)
|
||||
long num;
|
||||
{
|
||||
return ((num & 0xffff) == num);
|
||||
return (num & 0xffff) == num;
|
||||
} /* fits_in_unsigned_word() */
|
||||
|
||||
static int
|
||||
static INLINE int
|
||||
fits_in_signed_word (num)
|
||||
long num;
|
||||
{
|
||||
return ((-32768 <= num) && (num <= 32767));
|
||||
return (-32768 <= num) && (num <= 32767);
|
||||
} /* fits_in_signed_word() */
|
||||
|
||||
static int
|
||||
|
@ -274,13 +278,13 @@ smallest_imm_type (num)
|
|||
{
|
||||
return ((num == 1)
|
||||
? (Imm1 | Imm8 | Imm8S | Imm16 | Imm32)
|
||||
: (fits_in_signed_byte (num)
|
||||
? (Imm8S | Imm8 | Imm16 | Imm32)
|
||||
: (fits_in_unsigned_byte (num)
|
||||
? (Imm8 | Imm16 | Imm32)
|
||||
: ((fits_in_signed_word (num) || fits_in_unsigned_word (num))
|
||||
? (Imm16 | Imm32)
|
||||
: (Imm32)))));
|
||||
: fits_in_signed_byte (num)
|
||||
? (Imm8S | Imm8 | Imm16 | Imm32)
|
||||
: fits_in_unsigned_byte (num)
|
||||
? (Imm8 | Imm16 | Imm32)
|
||||
: (fits_in_signed_word (num) || fits_in_unsigned_word (num))
|
||||
? (Imm16 | Imm32)
|
||||
: (Imm32));
|
||||
} /* smallest_imm_type() */
|
||||
|
||||
/* Ignore certain directives generated by gcc. This probably should
|
||||
|
@ -297,7 +301,7 @@ const pseudo_typeS md_pseudo_table[] =
|
|||
#ifndef I386COFF
|
||||
{"bss", s_bss, 0},
|
||||
#endif
|
||||
#if !defined (TE_LINUX) && !defined (TE_386BSD)
|
||||
#ifndef OBJ_AOUT
|
||||
{"align", s_align_bytes, 0},
|
||||
#else
|
||||
{"align", s_align_ptwo, 0},
|
||||
|
@ -364,7 +368,8 @@ md_begin ()
|
|||
if (hash_err && *hash_err)
|
||||
{
|
||||
hash_error:
|
||||
as_fatal ("Internal Error: Can't hash %s: %s", prev_name, hash_err);
|
||||
as_fatal ("Internal Error: Can't hash %s: %s", prev_name,
|
||||
hash_err);
|
||||
}
|
||||
prev_name = optab->name;
|
||||
core_optab = (templates *) xmalloc (sizeof (templates));
|
||||
|
@ -629,7 +634,7 @@ reloc (size, pcrel)
|
|||
#endif
|
||||
|
||||
/* This is the guts of the machine-dependent assembler. LINE points to a
|
||||
machine dependent instruction. This funciton is supposed to emit
|
||||
machine dependent instruction. This function is supposed to emit
|
||||
the frags/bytes it assembles to. */
|
||||
void
|
||||
md_assemble (line)
|
||||
|
@ -1611,7 +1616,7 @@ i386_operand (operand_string)
|
|||
char *displacement_string_end = NULL;
|
||||
|
||||
/* We check for an absolute prefix (differentiating,
|
||||
for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
|
||||
for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
|
||||
if (*op_string == ABSOLUTE_PREFIX)
|
||||
{
|
||||
op_string++;
|
||||
|
@ -1628,7 +1633,7 @@ i386_operand (operand_string)
|
|||
return 0;
|
||||
}
|
||||
/* Check for segment override, rather than segment register by
|
||||
searching for ':' after %<x>s where <x> = s, c, d, e, f, g. */
|
||||
searching for ':' after %<x>s where <x> = s, c, d, e, f, g. */
|
||||
if ((r->reg_type & (SReg2 | SReg3)) && op_string[3] == ':')
|
||||
{
|
||||
switch (r->reg_num)
|
||||
|
@ -2156,7 +2161,7 @@ const int md_reloc_size = 8; /* Size of relocation record */
|
|||
void
|
||||
md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
|
||||
char *ptr;
|
||||
long from_addr, to_addr;
|
||||
valueT from_addr, to_addr;
|
||||
fragS *frag;
|
||||
symbolS *to_symbol;
|
||||
{
|
||||
|
@ -2170,7 +2175,7 @@ md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
|
|||
void
|
||||
md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
|
||||
char *ptr;
|
||||
long from_addr, to_addr;
|
||||
valueT from_addr, to_addr;
|
||||
fragS *frag;
|
||||
symbolS *to_symbol;
|
||||
{
|
||||
|
@ -2204,7 +2209,7 @@ md_parse_option (argP, cntP, vecP)
|
|||
void /* Knows about order of bytes in address. */
|
||||
md_number_to_chars (con, value, nbytes)
|
||||
char con[]; /* Return 'nbytes' of chars here. */
|
||||
long value; /* The value of the bits. */
|
||||
valueT value; /* The value of the bits. */
|
||||
int nbytes; /* Number of bytes in the output. */
|
||||
{
|
||||
register char *p = con;
|
||||
|
@ -2303,8 +2308,7 @@ md_chars_to_number (con, nbytes)
|
|||
|
||||
/* Turn the string pointed to by litP into a floating point constant of type
|
||||
type, and emit the appropriate bytes. The number of LITTLENUMS emitted
|
||||
is stored in *sizeP . An error message is returned, or NULL on OK.
|
||||
*/
|
||||
is stored in *sizeP . An error message is returned, or NULL on OK. */
|
||||
char *
|
||||
md_atof (type, litP, sizeP)
|
||||
char type;
|
||||
|
@ -2342,8 +2346,8 @@ md_atof (type, litP, sizeP)
|
|||
input_line_pointer = t;
|
||||
|
||||
*sizeP = prec * sizeof (LITTLENUM_TYPE);
|
||||
/* this loops outputs the LITTLENUMs in REVERSE order; in accord with
|
||||
the bigendian 386 */
|
||||
/* This loops outputs the LITTLENUMs in REVERSE order; in accord with
|
||||
the bigendian 386. */
|
||||
for (wordP = words + prec - 1; prec--;)
|
||||
{
|
||||
md_number_to_chars (litP, (long) (*wordP--), sizeof (LITTLENUM_TYPE));
|
||||
|
@ -2367,7 +2371,8 @@ output_invalid (c)
|
|||
|
||||
static reg_entry *
|
||||
parse_register (reg_string)
|
||||
char *reg_string; /* reg_string starts *before* REGISTER_PREFIX */
|
||||
/* reg_string starts *before* REGISTER_PREFIX */
|
||||
char *reg_string;
|
||||
{
|
||||
register char *s = reg_string;
|
||||
register char *p;
|
||||
|
@ -2407,10 +2412,10 @@ md_operand (expressionP)
|
|||
}
|
||||
|
||||
/* Round up a section size to the appropriate boundary. */
|
||||
long
|
||||
valueT
|
||||
md_section_align (segment, size)
|
||||
segT segment;
|
||||
long size;
|
||||
valueT size;
|
||||
{
|
||||
return size; /* Byte alignment is fine */
|
||||
}
|
||||
|
@ -2467,6 +2472,8 @@ tc_gen_reloc (section, fixp)
|
|||
default:
|
||||
abort ();
|
||||
}
|
||||
#undef MAP
|
||||
#undef F
|
||||
|
||||
reloc = (arelent *) bfd_alloc_by_size_t (stdoutput, sizeof (arelent));
|
||||
assert (reloc != 0);
|
||||
|
@ -2497,8 +2504,7 @@ tc_aout_fix_to_chars (where, fixP, segment_address_in_file)
|
|||
* Out: GNU LD relocation length code: 0, 1, or 2.
|
||||
*/
|
||||
|
||||
static unsigned char nbytes_r_length[] =
|
||||
{42, 0, 1, 42, 2};
|
||||
static const unsigned char nbytes_r_length[] = {42, 0, 1, 42, 2};
|
||||
long r_symbolnum;
|
||||
|
||||
know (fixP->fx_addsy != NULL);
|
||||
|
|
Loading…
Reference in a new issue