mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-11-25 21:19:54 +00:00
Prepare for multi-pass relaxation.
This commit is contained in:
parent
23ec5d0312
commit
93c2a809af
@ -1,3 +1,25 @@
|
|||||||
|
2001-03-30 Alan Modra <alan@linuxcare.com.au>
|
||||||
|
|
||||||
|
* config/tc-sh.c (md_estimate_size_before_relax): Add extra
|
||||||
|
do-nothing cases to switch to avoid abort on a second relaxation
|
||||||
|
pass, and tidy code a little.
|
||||||
|
* config/tc-cris.c (md_estimate_size_before_relax): Likewise.
|
||||||
|
* config/tc-h8500.c (md_estimate_size_before_relax): Likewise.
|
||||||
|
* config/tc-w65.c (md_estimate_size_before_relax): Likewise.
|
||||||
|
* config/tc-i386.c (UNCOND_JUMP, COND_JUMP, COND_JUMP86): Decrement.
|
||||||
|
(md_relax_table): Remove first four unused entries. Increment
|
||||||
|
rlx_length by one throughout table, and update comments to suit.
|
||||||
|
(md_estimate_size_before_relax): Return size of current variable
|
||||||
|
part of frag to reflect reality when relaxing more than once.
|
||||||
|
* config/tc-mcore.c (COND12, UNCD12): Rename to DISP12 throughout.
|
||||||
|
(COND32, UNCD32): Rename to DISP32 throughout.
|
||||||
|
(UNDEF_WORD_DISP): Renumber to 3.
|
||||||
|
(md_estimate_size_before_relax): Add extra do-nothing cases.
|
||||||
|
* config/tc-mn10200.c (md_estimate_size_before_relax): Rewrite.
|
||||||
|
* config/tc-mn10300.c (md_estimate_size_before_relax): Rewrite.
|
||||||
|
* config/tc-ns32k.c (md_estimate_size_before_relax): Add cases to
|
||||||
|
handle word and dword branches.
|
||||||
|
|
||||||
2001-03-29 Hans-Peter Nilsson <hp@axis.com>
|
2001-03-29 Hans-Peter Nilsson <hp@axis.com>
|
||||||
|
|
||||||
* config/tc-cris.h (tc_fix_adjustable): Allow only
|
* config/tc-cris.h (tc_fix_adjustable): Allow only
|
||||||
|
@ -445,6 +445,11 @@ md_estimate_size_before_relax (fragP, segment_type)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_DWORD):
|
||||||
|
/* When relaxing a section for the second time, we don't need to
|
||||||
|
do anything. */
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
BAD_CASE (fragP->fr_subtype);
|
BAD_CASE (fragP->fr_subtype);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/* tc-h8500.c -- Assemble code for the Hitachi H8/500
|
/* tc-h8500.c -- Assemble code for the Hitachi H8/500
|
||||||
Copyright 1993, 1994, 1995, 1998, 2000 Free Software Foundation, Inc.
|
Copyright 1993, 1994, 1995, 1998, 2000, 2001
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GAS, the GNU Assembler.
|
This file is part of GAS, the GNU Assembler.
|
||||||
|
|
||||||
@ -1447,6 +1448,7 @@ md_estimate_size_before_relax (fragP, segment_type)
|
|||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
case C (BRANCH, UNDEF_BYTE_DISP):
|
case C (BRANCH, UNDEF_BYTE_DISP):
|
||||||
case C (SCB_F, UNDEF_BYTE_DISP):
|
case C (SCB_F, UNDEF_BYTE_DISP):
|
||||||
case C (SCB_TST, UNDEF_BYTE_DISP):
|
case C (SCB_TST, UNDEF_BYTE_DISP):
|
||||||
@ -1464,8 +1466,18 @@ md_estimate_size_before_relax (fragP, segment_type)
|
|||||||
long. */
|
long. */
|
||||||
fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
|
fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
|
||||||
fragP->fr_var = md_relax_table[C (what, WORD_DISP)].rlx_length;
|
fragP->fr_var = md_relax_table[C (what, WORD_DISP)].rlx_length;
|
||||||
return md_relax_table[C (what, WORD_DISP)].rlx_length;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case C (BRANCH, BYTE_DISP):
|
||||||
|
case C (BRANCH, UNDEF_WORD_DISP):
|
||||||
|
case C (SCB_F, BYTE_DISP):
|
||||||
|
case C (SCB_F, UNDEF_WORD_DISP):
|
||||||
|
case C (SCB_TST, BYTE_DISP):
|
||||||
|
case C (SCB_TST, UNDEF_WORD_DISP):
|
||||||
|
/* When relaxing a section for the second time, we don't need to
|
||||||
|
do anything. */
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return fragP->fr_var;
|
return fragP->fr_var;
|
||||||
}
|
}
|
||||||
|
@ -284,9 +284,9 @@ static unsigned int no_cond_jump_promotion = 0;
|
|||||||
figuring out what sort of jump to choose to reach a given label. */
|
figuring out what sort of jump to choose to reach a given label. */
|
||||||
|
|
||||||
/* Types. */
|
/* Types. */
|
||||||
#define UNCOND_JUMP 1
|
#define UNCOND_JUMP 0
|
||||||
#define COND_JUMP 2
|
#define COND_JUMP 1
|
||||||
#define COND_JUMP86 3
|
#define COND_JUMP86 2
|
||||||
|
|
||||||
/* Sizes. */
|
/* Sizes. */
|
||||||
#define CODE16 1
|
#define CODE16 1
|
||||||
@ -323,42 +323,38 @@ const relax_typeS md_relax_table[] =
|
|||||||
/* The fields are:
|
/* The fields are:
|
||||||
1) most positive reach of this state,
|
1) most positive reach of this state,
|
||||||
2) most negative reach of this state,
|
2) most negative reach of this state,
|
||||||
3) how many bytes this mode will add to the size of the current frag
|
3) how many bytes this mode will have in the variable part of the frag
|
||||||
4) which index into the table to try if we can't fit into this one. */
|
4) which index into the table to try if we can't fit into this one. */
|
||||||
{1, 1, 0, 0},
|
|
||||||
{1, 1, 0, 0},
|
|
||||||
{1, 1, 0, 0},
|
|
||||||
{1, 1, 0, 0},
|
|
||||||
|
|
||||||
/* UNCOND_JUMP states. */
|
/* UNCOND_JUMP states. */
|
||||||
{127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
|
{127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
|
||||||
{127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
|
{127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
|
||||||
/* dword jmp adds 3 bytes to frag:
|
/* dword jmp adds 4 bytes to frag:
|
||||||
0 extra opcode bytes, 3 extra displacement bytes. */
|
0 extra opcode bytes, 4 displacement bytes. */
|
||||||
{0, 0, 3, 0},
|
|
||||||
/* word jmp adds 1 byte to frag:
|
|
||||||
0 extra opcode bytes, 1 extra displacement byte. */
|
|
||||||
{0, 0, 1, 0},
|
|
||||||
|
|
||||||
/* COND_JUMP states. */
|
|
||||||
{127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
|
|
||||||
{127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
|
|
||||||
/* dword conditionals adds 4 bytes to frag:
|
|
||||||
1 extra opcode byte, 3 extra displacement bytes. */
|
|
||||||
{0, 0, 4, 0},
|
{0, 0, 4, 0},
|
||||||
/* word conditionals add 2 bytes to frag:
|
/* word jmp adds 2 byte2 to frag:
|
||||||
1 extra opcode byte, 1 extra displacement byte. */
|
0 extra opcode bytes, 2 displacement bytes. */
|
||||||
{0, 0, 2, 0},
|
{0, 0, 2, 0},
|
||||||
|
|
||||||
/* COND_JUMP86 states. */
|
/* COND_JUMP states. */
|
||||||
{127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
|
{127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
|
||||||
{127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
|
{127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
|
||||||
/* dword conditionals adds 4 bytes to frag:
|
/* dword conditionals adds 5 bytes to frag:
|
||||||
1 extra opcode byte, 3 extra displacement bytes. */
|
1 extra opcode byte, 4 displacement bytes. */
|
||||||
{0, 0, 4, 0},
|
{0, 0, 5, 0},
|
||||||
/* word conditionals add 3 bytes to frag:
|
/* word conditionals add 3 bytes to frag:
|
||||||
1 extra opcode byte, 2 extra displacement bytes. */
|
1 extra opcode byte, 2 displacement bytes. */
|
||||||
{0, 0, 3, 0}
|
{0, 0, 3, 0},
|
||||||
|
|
||||||
|
/* COND_JUMP86 states. */
|
||||||
|
{127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
|
||||||
|
{127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
|
||||||
|
/* dword conditionals adds 5 bytes to frag:
|
||||||
|
1 extra opcode byte, 4 displacement bytes. */
|
||||||
|
{0, 0, 5, 0},
|
||||||
|
/* word conditionals add 4 bytes to frag:
|
||||||
|
1 displacement byte and a 3 byte long branch insn. */
|
||||||
|
{0, 0, 4, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const arch_entry cpu_arch[] = {
|
static const arch_entry cpu_arch[] = {
|
||||||
@ -3971,7 +3967,8 @@ md_estimate_size_before_relax (fragP, segment)
|
|||||||
|
|
||||||
case COND_JUMP86:
|
case COND_JUMP86:
|
||||||
if (no_cond_jump_promotion)
|
if (no_cond_jump_promotion)
|
||||||
return 1;
|
goto relax_guess;
|
||||||
|
|
||||||
if (size == 2)
|
if (size == 2)
|
||||||
{
|
{
|
||||||
/* Negate the condition, and branch past an
|
/* Negate the condition, and branch past an
|
||||||
@ -3993,7 +3990,8 @@ md_estimate_size_before_relax (fragP, segment)
|
|||||||
|
|
||||||
case COND_JUMP:
|
case COND_JUMP:
|
||||||
if (no_cond_jump_promotion)
|
if (no_cond_jump_promotion)
|
||||||
return 1;
|
goto relax_guess;
|
||||||
|
|
||||||
/* This changes the byte-displacement jump 0x7N
|
/* This changes the byte-displacement jump 0x7N
|
||||||
to the (d)word-displacement jump 0x0f,0x8N. */
|
to the (d)word-displacement jump 0x0f,0x8N. */
|
||||||
opcode[1] = opcode[0] + 0x10;
|
opcode[1] = opcode[0] + 0x10;
|
||||||
@ -4013,8 +4011,15 @@ md_estimate_size_before_relax (fragP, segment)
|
|||||||
frag_wane (fragP);
|
frag_wane (fragP);
|
||||||
return fragP->fr_fix - old_fr_fix;
|
return fragP->fr_fix - old_fr_fix;
|
||||||
}
|
}
|
||||||
/* Guess a short jump. */
|
|
||||||
return 1;
|
relax_guess:
|
||||||
|
/* Guess size depending on current relax state. Initially the relax
|
||||||
|
state will correspond to a short jump and we return 1, because
|
||||||
|
the variable part of the frag (the branch offset) is one byte
|
||||||
|
long. However, we can relax a section more than once and in that
|
||||||
|
case we must either set fr_subtype back to the unrelaxed state,
|
||||||
|
or return the value for the appropriate branch. */
|
||||||
|
return md_relax_table[fragP->fr_subtype].rlx_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called after relax() is finished.
|
/* Called after relax() is finished.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* tc-mcore.c -- Assemble code for M*Core
|
/* tc-mcore.c -- Assemble code for M*Core
|
||||||
Copyright 1999, 2000 Free Software Foundation, Inc.
|
Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GAS, the GNU Assembler.
|
This file is part of GAS, the GNU Assembler.
|
||||||
|
|
||||||
@ -92,12 +92,9 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP";
|
|||||||
#define UNCD_JUMP 2
|
#define UNCD_JUMP 2
|
||||||
|
|
||||||
#define UNDEF_DISP 0
|
#define UNDEF_DISP 0
|
||||||
#define COND12 1
|
#define DISP12 1
|
||||||
#define COND32 2
|
#define DISP32 2
|
||||||
#define UNCD12 1
|
#define UNDEF_WORD_DISP 3
|
||||||
#define UNCD32 2
|
|
||||||
#define UNDEF_WORD_DISP 4
|
|
||||||
#define END 5
|
|
||||||
|
|
||||||
#define C12_LEN 2
|
#define C12_LEN 2
|
||||||
#define C32_LEN 10 /* allow for align */
|
#define C32_LEN 10 /* allow for align */
|
||||||
@ -121,14 +118,13 @@ const relax_typeS md_relax_table[] =
|
|||||||
{ 1, 1, 0, 0 }, /* 2: unused */
|
{ 1, 1, 0, 0 }, /* 2: unused */
|
||||||
{ 1, 1, 0, 0 }, /* 3: unused */
|
{ 1, 1, 0, 0 }, /* 3: unused */
|
||||||
{ 1, 1, 0, 0 }, /* 4: unused */
|
{ 1, 1, 0, 0 }, /* 4: unused */
|
||||||
{ 2048, -2046, C12_LEN, C(COND_JUMP, COND32) }, /* 5: C(COND_JUMP, COND12) */
|
{ 2048, -2046, C12_LEN, C(COND_JUMP, DISP32) }, /* 5: C(COND_JUMP, DISP12) */
|
||||||
{ 0, 0, C32_LEN, 0 }, /* 6: C(COND_JUMP, COND32) */
|
{ 0, 0, C32_LEN, 0 }, /* 6: C(COND_JUMP, DISP32) */
|
||||||
{ 1, 1, 0, 0 }, /* 7: unused */
|
{ 1, 1, 0, 0 }, /* 7: unused */
|
||||||
{ 1, 1, 0, 0 }, /* 8: unused */
|
{ 1, 1, 0, 0 }, /* 8: unused */
|
||||||
{ 2048, -2046, U12_LEN, C(UNCD_JUMP, UNCD32) }, /* 9: C(UNCD_JUMP, UNCD12) */
|
{ 2048, -2046, U12_LEN, C(UNCD_JUMP, DISP32) }, /* 9: C(UNCD_JUMP, DISP12) */
|
||||||
{ 0, 0, U32_LEN, 0 }, /*10: C(UNCD_JUMP, UNCD32) */
|
{ 0, 0, U32_LEN, 0 }, /*10: C(UNCD_JUMP, DISP32) */
|
||||||
{ 1, 1, 0, 0 }, /*11: unused */
|
{ 1, 1, 0, 0 }, /*11: unused */
|
||||||
{ 0, 0, 0, 0 } /*12: unused */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Literal pool data structures. */
|
/* Literal pool data structures. */
|
||||||
@ -705,8 +701,8 @@ dump_literals (isforce)
|
|||||||
symbol_table_insert (brarsym);
|
symbol_table_insert (brarsym);
|
||||||
|
|
||||||
output = frag_var (rs_machine_dependent,
|
output = frag_var (rs_machine_dependent,
|
||||||
md_relax_table[C (UNCD_JUMP, UNCD32)].rlx_length,
|
md_relax_table[C (UNCD_JUMP, DISP32)].rlx_length,
|
||||||
md_relax_table[C (UNCD_JUMP, UNCD12)].rlx_length,
|
md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length,
|
||||||
C (UNCD_JUMP, 0), brarsym, 0, 0);
|
C (UNCD_JUMP, 0), brarsym, 0, 0);
|
||||||
output[0] = INST_BYTE0 (MCORE_INST_BR); /* br .+xxx */
|
output[0] = INST_BYTE0 (MCORE_INST_BR); /* br .+xxx */
|
||||||
output[1] = INST_BYTE1 (MCORE_INST_BR);
|
output[1] = INST_BYTE1 (MCORE_INST_BR);
|
||||||
@ -1558,8 +1554,8 @@ md_assemble (str)
|
|||||||
op_end = input_line_pointer;
|
op_end = input_line_pointer;
|
||||||
|
|
||||||
output = frag_var (rs_machine_dependent,
|
output = frag_var (rs_machine_dependent,
|
||||||
md_relax_table[C (COND_JUMP, COND32)].rlx_length,
|
md_relax_table[C (COND_JUMP, DISP32)].rlx_length,
|
||||||
md_relax_table[C (COND_JUMP, COND12)].rlx_length,
|
md_relax_table[C (COND_JUMP, DISP12)].rlx_length,
|
||||||
C (COND_JUMP, 0), e.X_add_symbol, e.X_add_number, 0);
|
C (COND_JUMP, 0), e.X_add_symbol, e.X_add_number, 0);
|
||||||
isize = C32_LEN;
|
isize = C32_LEN;
|
||||||
break;
|
break;
|
||||||
@ -1569,8 +1565,8 @@ md_assemble (str)
|
|||||||
op_end = input_line_pointer;
|
op_end = input_line_pointer;
|
||||||
|
|
||||||
output = frag_var (rs_machine_dependent,
|
output = frag_var (rs_machine_dependent,
|
||||||
md_relax_table[C (UNCD_JUMP, UNCD32)].rlx_length,
|
md_relax_table[C (UNCD_JUMP, DISP32)].rlx_length,
|
||||||
md_relax_table[C (UNCD_JUMP, UNCD12)].rlx_length,
|
md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length,
|
||||||
C (UNCD_JUMP, 0), e.X_add_symbol, e.X_add_number, 0);
|
C (UNCD_JUMP, 0), e.X_add_symbol, e.X_add_number, 0);
|
||||||
isize = U32_LEN;
|
isize = U32_LEN;
|
||||||
break;
|
break;
|
||||||
@ -1904,8 +1900,8 @@ md_convert_frag (abfd, sec, fragP)
|
|||||||
|
|
||||||
switch (fragP->fr_subtype)
|
switch (fragP->fr_subtype)
|
||||||
{
|
{
|
||||||
case C (COND_JUMP, COND12):
|
case C (COND_JUMP, DISP12):
|
||||||
case C (UNCD_JUMP, UNCD12):
|
case C (UNCD_JUMP, DISP12):
|
||||||
{
|
{
|
||||||
/* Get the address of the end of the instruction. */
|
/* Get the address of the end of the instruction. */
|
||||||
int next_inst = fragP->fr_fix + fragP->fr_address + 2;
|
int next_inst = fragP->fr_fix + fragP->fr_address + 2;
|
||||||
@ -1939,7 +1935,7 @@ md_convert_frag (abfd, sec, fragP)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C (COND_JUMP, COND32):
|
case C (COND_JUMP, DISP32):
|
||||||
case C (COND_JUMP, UNDEF_WORD_DISP):
|
case C (COND_JUMP, UNDEF_WORD_DISP):
|
||||||
{
|
{
|
||||||
/* A conditional branch wont fit into 12 bits so:
|
/* A conditional branch wont fit into 12 bits so:
|
||||||
@ -2031,7 +2027,7 @@ md_convert_frag (abfd, sec, fragP)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C (UNCD_JUMP, UNCD32):
|
case C (UNCD_JUMP, DISP32):
|
||||||
case C (UNCD_JUMP, UNDEF_WORD_DISP):
|
case C (UNCD_JUMP, UNDEF_WORD_DISP):
|
||||||
{
|
{
|
||||||
/* An unconditional branch will not fit in 12 bits, make code which
|
/* An unconditional branch will not fit in 12 bits, make code which
|
||||||
@ -2247,29 +2243,28 @@ md_estimate_size_before_relax (fragP, segment_type)
|
|||||||
{
|
{
|
||||||
switch (fragP->fr_subtype)
|
switch (fragP->fr_subtype)
|
||||||
{
|
{
|
||||||
|
default:
|
||||||
|
abort ();
|
||||||
|
|
||||||
case C (UNCD_JUMP, UNDEF_DISP):
|
case C (UNCD_JUMP, UNDEF_DISP):
|
||||||
/* Used to be a branch to somewhere which was unknown. */
|
/* Used to be a branch to somewhere which was unknown. */
|
||||||
if (!fragP->fr_symbol)
|
if (!fragP->fr_symbol)
|
||||||
{
|
{
|
||||||
fragP->fr_subtype = C (UNCD_JUMP, UNCD12);
|
fragP->fr_subtype = C (UNCD_JUMP, DISP12);
|
||||||
fragP->fr_var = md_relax_table[C (UNCD_JUMP, UNCD12)].rlx_length;
|
fragP->fr_var = md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length;
|
||||||
}
|
}
|
||||||
else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
|
else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
|
||||||
{
|
{
|
||||||
fragP->fr_subtype = C (UNCD_JUMP, UNCD12);
|
fragP->fr_subtype = C (UNCD_JUMP, DISP12);
|
||||||
fragP->fr_var = md_relax_table[C (UNCD_JUMP, UNCD12)].rlx_length;
|
fragP->fr_var = md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fragP->fr_subtype = C (UNCD_JUMP, UNDEF_WORD_DISP);
|
fragP->fr_subtype = C (UNCD_JUMP, UNDEF_WORD_DISP);
|
||||||
fragP->fr_var = md_relax_table[C (UNCD_JUMP, UNCD32)].rlx_length;
|
fragP->fr_var = md_relax_table[C (UNCD_JUMP, DISP32)].rlx_length;
|
||||||
return md_relax_table[C (UNCD_JUMP, UNCD32)].rlx_length;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
|
||||||
abort ();
|
|
||||||
|
|
||||||
case C (COND_JUMP, UNDEF_DISP):
|
case C (COND_JUMP, UNDEF_DISP):
|
||||||
/* Used to be a branch to somewhere which was unknown. */
|
/* Used to be a branch to somewhere which was unknown. */
|
||||||
if (fragP->fr_symbol
|
if (fragP->fr_symbol
|
||||||
@ -2277,23 +2272,29 @@ md_estimate_size_before_relax (fragP, segment_type)
|
|||||||
{
|
{
|
||||||
/* Got a symbol and it's defined in this segment, become byte
|
/* Got a symbol and it's defined in this segment, become byte
|
||||||
sized - maybe it will fix up */
|
sized - maybe it will fix up */
|
||||||
fragP->fr_subtype = C (COND_JUMP, COND12);
|
fragP->fr_subtype = C (COND_JUMP, DISP12);
|
||||||
fragP->fr_var = md_relax_table[C (COND_JUMP, COND12)].rlx_length;
|
fragP->fr_var = md_relax_table[C (COND_JUMP, DISP12)].rlx_length;
|
||||||
}
|
}
|
||||||
else if (fragP->fr_symbol)
|
else if (fragP->fr_symbol)
|
||||||
{
|
{
|
||||||
/* Its got a segment, but its not ours, so it will always be long. */
|
/* Its got a segment, but its not ours, so it will always be long. */
|
||||||
fragP->fr_subtype = C (COND_JUMP, UNDEF_WORD_DISP);
|
fragP->fr_subtype = C (COND_JUMP, UNDEF_WORD_DISP);
|
||||||
fragP->fr_var = md_relax_table[C (COND_JUMP, COND32)].rlx_length;
|
fragP->fr_var = md_relax_table[C (COND_JUMP, DISP32)].rlx_length;
|
||||||
return md_relax_table[C (COND_JUMP, COND32)].rlx_length;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* We know the abs value. */
|
/* We know the abs value. */
|
||||||
fragP->fr_subtype = C (COND_JUMP, COND12);
|
fragP->fr_subtype = C (COND_JUMP, DISP12);
|
||||||
fragP->fr_var = md_relax_table[C (COND_JUMP, COND12)].rlx_length;
|
fragP->fr_var = md_relax_table[C (COND_JUMP, DISP12)].rlx_length;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case C (UNCD_JUMP, DISP12):
|
||||||
|
case C (UNCD_JUMP, UNDEF_WORD_DISP):
|
||||||
|
case C (COND_JUMP, DISP12):
|
||||||
|
case C (COND_JUMP, UNDEF_WORD_DISP):
|
||||||
|
/* When relaxing a section for the second time, we don't need to
|
||||||
|
do anything. */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/* tc-mn10200.c -- Assembler code for the Matsushita 10200
|
/* tc-mn10200.c -- Assembler code for the Matsushita 10200
|
||||||
Copyright 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
|
Copyright 1996, 1997, 1998, 1999, 2000, 2001
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GAS, the GNU Assembler.
|
This file is part of GAS, the GNU Assembler.
|
||||||
|
|
||||||
@ -1284,29 +1285,19 @@ md_estimate_size_before_relax (fragp, seg)
|
|||||||
fragS *fragp;
|
fragS *fragp;
|
||||||
asection *seg;
|
asection *seg;
|
||||||
{
|
{
|
||||||
if (fragp->fr_subtype == 0)
|
if (fragp->fr_subtype == 6
|
||||||
return 2;
|
&& (!S_IS_DEFINED (fragp->fr_symbol)
|
||||||
if (fragp->fr_subtype == 3)
|
|| seg != S_GET_SEGMENT (fragp->fr_symbol)))
|
||||||
return 3;
|
fragp->fr_subtype = 7;
|
||||||
if (fragp->fr_subtype == 6)
|
else if (fragp->fr_subtype == 8
|
||||||
{
|
&& (!S_IS_DEFINED (fragp->fr_symbol)
|
||||||
if (!S_IS_DEFINED (fragp->fr_symbol)
|
|| seg != S_GET_SEGMENT (fragp->fr_symbol)))
|
||||||
|| seg != S_GET_SEGMENT (fragp->fr_symbol))
|
fragp->fr_subtype = 10;
|
||||||
{
|
|
||||||
fragp->fr_subtype = 7;
|
if (fragp->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
|
||||||
return 5;
|
abort ();
|
||||||
}
|
|
||||||
return 3;
|
return md_relax_table[fragp->fr_subtype].rlx_length;
|
||||||
}
|
|
||||||
if (fragp->fr_subtype == 8)
|
|
||||||
{
|
|
||||||
if (!S_IS_DEFINED (fragp->fr_symbol))
|
|
||||||
{
|
|
||||||
fragp->fr_subtype = 10;
|
|
||||||
return 5;
|
|
||||||
}
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
long
|
long
|
||||||
|
@ -1843,44 +1843,23 @@ md_estimate_size_before_relax (fragp, seg)
|
|||||||
fragS *fragp;
|
fragS *fragp;
|
||||||
asection *seg;
|
asection *seg;
|
||||||
{
|
{
|
||||||
if (fragp->fr_subtype == 0)
|
if (fragp->fr_subtype == 6
|
||||||
return 2;
|
&& (!S_IS_DEFINED (fragp->fr_symbol)
|
||||||
if (fragp->fr_subtype == 3)
|
|| seg != S_GET_SEGMENT (fragp->fr_symbol)))
|
||||||
return 3;
|
fragp->fr_subtype = 7;
|
||||||
if (fragp->fr_subtype == 6)
|
else if (fragp->fr_subtype == 8
|
||||||
{
|
&& (!S_IS_DEFINED (fragp->fr_symbol)
|
||||||
if (!S_IS_DEFINED (fragp->fr_symbol)
|
|| seg != S_GET_SEGMENT (fragp->fr_symbol)))
|
||||||
|| seg != S_GET_SEGMENT (fragp->fr_symbol))
|
fragp->fr_subtype = 9;
|
||||||
{
|
else if (fragp->fr_subtype == 10
|
||||||
fragp->fr_subtype = 7;
|
&& (!S_IS_DEFINED (fragp->fr_symbol)
|
||||||
return 7;
|
|| seg != S_GET_SEGMENT (fragp->fr_symbol)))
|
||||||
}
|
fragp->fr_subtype = 12;
|
||||||
else
|
|
||||||
return 5;
|
if (fragp->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
|
||||||
}
|
abort ();
|
||||||
if (fragp->fr_subtype == 8)
|
|
||||||
{
|
return md_relax_table[fragp->fr_subtype].rlx_length;
|
||||||
if (!S_IS_DEFINED (fragp->fr_symbol)
|
|
||||||
|| seg != S_GET_SEGMENT (fragp->fr_symbol))
|
|
||||||
{
|
|
||||||
fragp->fr_subtype = 9;
|
|
||||||
return 6;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
if (fragp->fr_subtype == 10)
|
|
||||||
{
|
|
||||||
if (!S_IS_DEFINED (fragp->fr_symbol)
|
|
||||||
|| seg != S_GET_SEGMENT (fragp->fr_symbol))
|
|
||||||
{
|
|
||||||
fragp->fr_subtype = 12;
|
|
||||||
return 5;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
abort ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
long
|
long
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/* ns32k.c -- Assemble on the National Semiconductor 32k series
|
/* ns32k.c -- Assemble on the National Semiconductor 32k series
|
||||||
Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
|
Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||||||
|
2001
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GAS, the GNU Assembler.
|
This file is part of GAS, the GNU Assembler.
|
||||||
@ -2102,9 +2103,14 @@ md_estimate_size_before_relax (fragP, segment)
|
|||||||
frag_wane (fragP);
|
frag_wane (fragP);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
/* Fall thru */
|
||||||
|
|
||||||
case IND (BRANCH, BYTE):
|
case IND (BRANCH, BYTE):
|
||||||
fragP->fr_var += 1;
|
case IND (BRANCH, WORD):
|
||||||
|
case IND (BRANCH, DOUBLE):
|
||||||
|
fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3030,6 +3030,9 @@ md_estimate_size_before_relax (fragP, segment_type)
|
|||||||
{
|
{
|
||||||
switch (fragP->fr_subtype)
|
switch (fragP->fr_subtype)
|
||||||
{
|
{
|
||||||
|
default:
|
||||||
|
abort ();
|
||||||
|
|
||||||
case C (UNCOND_JUMP, UNDEF_DISP):
|
case C (UNCOND_JUMP, UNDEF_DISP):
|
||||||
/* Used to be a branch to somewhere which was unknown. */
|
/* Used to be a branch to somewhere which was unknown. */
|
||||||
if (!fragP->fr_symbol)
|
if (!fragP->fr_symbol)
|
||||||
@ -3046,12 +3049,9 @@ md_estimate_size_before_relax (fragP, segment_type)
|
|||||||
{
|
{
|
||||||
fragP->fr_subtype = C (UNCOND_JUMP, UNDEF_WORD_DISP);
|
fragP->fr_subtype = C (UNCOND_JUMP, UNDEF_WORD_DISP);
|
||||||
fragP->fr_var = md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length;
|
fragP->fr_var = md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length;
|
||||||
return md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
|
||||||
abort ();
|
|
||||||
case C (COND_JUMP, UNDEF_DISP):
|
case C (COND_JUMP, UNDEF_DISP):
|
||||||
case C (COND_JUMP_DELAY, UNDEF_DISP):
|
case C (COND_JUMP_DELAY, UNDEF_DISP):
|
||||||
/* Used to be a branch to somewhere which was unknown. */
|
/* Used to be a branch to somewhere which was unknown. */
|
||||||
@ -3070,7 +3070,6 @@ md_estimate_size_before_relax (fragP, segment_type)
|
|||||||
/* Its got a segment, but its not ours, so it will always be long. */
|
/* Its got a segment, but its not ours, so it will always be long. */
|
||||||
fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
|
fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
|
||||||
fragP->fr_var = md_relax_table[C (what, COND32)].rlx_length;
|
fragP->fr_var = md_relax_table[C (what, COND32)].rlx_length;
|
||||||
return md_relax_table[C (what, COND32)].rlx_length;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -3079,7 +3078,16 @@ md_estimate_size_before_relax (fragP, segment_type)
|
|||||||
fragP->fr_subtype = C (what, COND8);
|
fragP->fr_subtype = C (what, COND8);
|
||||||
fragP->fr_var = md_relax_table[C (what, COND8)].rlx_length;
|
fragP->fr_var = md_relax_table[C (what, COND8)].rlx_length;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case C (UNCOND_JUMP, UNCOND12):
|
||||||
|
case C (UNCOND_JUMP, UNDEF_WORD_DISP):
|
||||||
|
case C (COND_JUMP, COND8):
|
||||||
|
case C (COND_JUMP, UNDEF_WORD_DISP):
|
||||||
|
case C (COND_JUMP_DELAY, COND8):
|
||||||
|
case C (COND_JUMP_DELAY, UNDEF_WORD_DISP):
|
||||||
|
/* When relaxing a section for the second time, we don't need to
|
||||||
|
do anything. */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return fragP->fr_var;
|
return fragP->fr_var;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* tc-w65.c -- Assemble code for the W65816
|
/* tc-w65.c -- Assemble code for the W65816
|
||||||
Copyright 1995, 1998, 2000 Free Software Foundation, Inc.
|
Copyright 1995, 1998, 2000, 2001 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GAS, the GNU Assembler.
|
This file is part of GAS, the GNU Assembler.
|
||||||
|
|
||||||
@ -1154,6 +1154,7 @@ md_estimate_size_before_relax (fragP, segment_type)
|
|||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
case C (COND_BRANCH, UNDEF_BYTE_DISP):
|
case C (COND_BRANCH, UNDEF_BYTE_DISP):
|
||||||
case C (UNCOND_BRANCH, UNDEF_BYTE_DISP):
|
case C (UNCOND_BRANCH, UNDEF_BYTE_DISP):
|
||||||
/* Used to be a branch to somewhere which was unknown. */
|
/* Used to be a branch to somewhere which was unknown. */
|
||||||
@ -1170,8 +1171,16 @@ md_estimate_size_before_relax (fragP, segment_type)
|
|||||||
long. */
|
long. */
|
||||||
fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
|
fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
|
||||||
fragP->fr_var = md_relax_table[C (what, WORD_DISP)].rlx_length;
|
fragP->fr_var = md_relax_table[C (what, WORD_DISP)].rlx_length;
|
||||||
return md_relax_table[C (what, WORD_DISP)].rlx_length;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case C (COND_BRANCH, BYTE_DISP):
|
||||||
|
case C (COND_BRANCH, WORD_DISP):
|
||||||
|
case C (UNCOND_BRANCH, BYTE_DISP):
|
||||||
|
case C (UNCOND_BRANCH, WORD_DISP):
|
||||||
|
/* When relaxing a section for the second time, we don't need to
|
||||||
|
do anything. */
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return fragP->fr_var;
|
return fragP->fr_var;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user