diff options
author | Alan Modra <amodra@gmail.com> | 2001-04-05 04:21:36 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2001-04-05 04:21:36 +0000 |
commit | e66457fbf3726420435dc962c190c8ab9933a78b (patch) | |
tree | 92ccaae4770d3076aeb5aa781ac93a0f8f34ff59 /gas/config | |
parent | 608506ed674285b7c6dc61e0bdbe9e8c473c0e7b (diff) | |
download | gdb-e66457fbf3726420435dc962c190c8ab9933a78b.zip gdb-e66457fbf3726420435dc962c190c8ab9933a78b.tar.gz gdb-e66457fbf3726420435dc962c190c8ab9933a78b.tar.bz2 |
Fix more breakages from the multiple relax pass patch.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-h8500.c | 73 | ||||
-rw-r--r-- | gas/config/tc-mcore.c | 43 | ||||
-rw-r--r-- | gas/config/tc-sh.c | 36 | ||||
-rw-r--r-- | gas/config/tc-w65.c | 55 |
4 files changed, 102 insertions, 105 deletions
diff --git a/gas/config/tc-h8500.c b/gas/config/tc-h8500.c index 7fe556e..d0f6192 100644 --- a/gas/config/tc-h8500.c +++ b/gas/config/tc-h8500.c @@ -86,7 +86,31 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP"; #define WORD_F 32767 #define WORD_B 32768 -relax_typeS md_relax_table[C (END, 0)]; +relax_typeS md_relax_table[C (END, 0)] = { + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + + /* BRANCH */ + { 0, 0, 0, 0 }, + { BYTE_F, BYTE_B, 2, C (BRANCH, WORD_DISP) }, + { WORD_F, WORD_B, 3, 0 }, + { 0, 0, 3, 0 }, + + /* SCB_F */ + { 0, 0, 0, 0 }, + { BYTE_F, BYTE_B, 3, C (SCB_F, WORD_DISP) }, + { WORD_F, WORD_B, 8, 0 }, + { 0, 0, 8, 0 }, + + /* SCB_TST */ + { 0, 0, 0, 0 }, + { BYTE_F, BYTE_B, 3, C (SCB_TST, WORD_DISP) }, + { WORD_F, WORD_B, 10, 0 }, + { 0, 0, 10, 0 } + +}; static struct hash_control *opcode_hash_control; /* Opcode mnemonics */ @@ -101,7 +125,6 @@ md_begin () h8500_opcode_info *opcode; char prev_buffer[100]; int idx = 0; - register relax_typeS *table; opcode_hash_control = hash_new (); prev_buffer[0] = 0; @@ -115,40 +138,6 @@ md_begin () idx++; } } - - /* Initialize the relax table. We use a local variable to avoid - warnings about modifying a supposedly const data structure. */ - table = (relax_typeS *) md_relax_table; - table[C (BRANCH, BYTE_DISP)].rlx_forward = BYTE_F; - table[C (BRANCH, BYTE_DISP)].rlx_backward = BYTE_B; - table[C (BRANCH, BYTE_DISP)].rlx_length = 2; - table[C (BRANCH, BYTE_DISP)].rlx_more = C (BRANCH, WORD_DISP); - - table[C (BRANCH, WORD_DISP)].rlx_forward = WORD_F; - table[C (BRANCH, WORD_DISP)].rlx_backward = WORD_B; - table[C (BRANCH, WORD_DISP)].rlx_length = 3; - table[C (BRANCH, WORD_DISP)].rlx_more = 0; - - table[C (SCB_F, BYTE_DISP)].rlx_forward = BYTE_F; - table[C (SCB_F, BYTE_DISP)].rlx_backward = BYTE_B; - table[C (SCB_F, BYTE_DISP)].rlx_length = 3; - table[C (SCB_F, BYTE_DISP)].rlx_more = C (SCB_F, WORD_DISP); - - table[C (SCB_F, WORD_DISP)].rlx_forward = WORD_F; - table[C (SCB_F, WORD_DISP)].rlx_backward = WORD_B; - table[C (SCB_F, WORD_DISP)].rlx_length = 8; - table[C (SCB_F, WORD_DISP)].rlx_more = 0; - - table[C (SCB_TST, BYTE_DISP)].rlx_forward = BYTE_F; - table[C (SCB_TST, BYTE_DISP)].rlx_backward = BYTE_B; - table[C (SCB_TST, BYTE_DISP)].rlx_length = 3; - table[C (SCB_TST, BYTE_DISP)].rlx_more = C (SCB_TST, WORD_DISP); - - table[C (SCB_TST, WORD_DISP)].rlx_forward = WORD_F; - table[C (SCB_TST, WORD_DISP)].rlx_backward = WORD_B; - table[C (SCB_TST, WORD_DISP)].rlx_length = 10; - table[C (SCB_TST, WORD_DISP)].rlx_more = 0; - } static int rn; /* register number used by RN */ @@ -1442,7 +1431,7 @@ md_estimate_size_before_relax (fragP, segment_type) register fragS *fragP; register segT segment_type; { - int what = GET_WHAT (fragP->fr_subtype); + int what; switch (fragP->fr_subtype) { @@ -1452,33 +1441,37 @@ md_estimate_size_before_relax (fragP, segment_type) case C (BRANCH, UNDEF_BYTE_DISP): case C (SCB_F, UNDEF_BYTE_DISP): case C (SCB_TST, UNDEF_BYTE_DISP): + what = GET_WHAT (fragP->fr_subtype); /* used to be a branch to somewhere which was unknown */ if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type) { /* Got a symbol and it's defined in this segment, become byte sized - maybe it will fix up. */ fragP->fr_subtype = C (what, BYTE_DISP); - fragP->fr_var = md_relax_table[C (what, BYTE_DISP)].rlx_length; } else { /* Its got a segment, but its not ours, so it will always be long. */ fragP->fr_subtype = C (what, UNDEF_WORD_DISP); - fragP->fr_var = md_relax_table[C (what, WORD_DISP)].rlx_length; } break; case C (BRANCH, BYTE_DISP): + case C (BRANCH, WORD_DISP): case C (BRANCH, UNDEF_WORD_DISP): case C (SCB_F, BYTE_DISP): + case C (SCB_F, WORD_DISP): case C (SCB_F, UNDEF_WORD_DISP): case C (SCB_TST, BYTE_DISP): + case C (SCB_TST, WORD_DISP): case C (SCB_TST, UNDEF_WORD_DISP): /* When relaxing a section for the second time, we don't need to - do anything. */ + do anything besides return the current size. */ break; } + + fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length; return fragP->fr_var; } diff --git a/gas/config/tc-mcore.c b/gas/config/tc-mcore.c index 3238e66..15c9ce6 100644 --- a/gas/config/tc-mcore.c +++ b/gas/config/tc-mcore.c @@ -111,20 +111,24 @@ cpu_type; cpu_type cpu = M340; /* Initialize the relax table. */ -const relax_typeS md_relax_table[] = -{ -{ 1, 1, 0, 0 }, /* 0: unused */ -{ 1, 1, 0, 0 }, /* 1: unused */ -{ 1, 1, 0, 0 }, /* 2: unused */ -{ 1, 1, 0, 0 }, /* 3: unused */ -{ 1, 1, 0, 0 }, /* 4: unused */ -{ 2048, -2046, C12_LEN, C(COND_JUMP, DISP32) }, /* 5: C(COND_JUMP, DISP12) */ -{ 0, 0, C32_LEN, 0 }, /* 6: C(COND_JUMP, DISP32) */ -{ 1, 1, 0, 0 }, /* 7: unused */ -{ 1, 1, 0, 0 }, /* 8: unused */ -{ 2048, -2046, U12_LEN, C(UNCD_JUMP, DISP32) }, /* 9: C(UNCD_JUMP, DISP12) */ -{ 0, 0, U32_LEN, 0 }, /*10: C(UNCD_JUMP, DISP32) */ -{ 1, 1, 0, 0 }, /*11: unused */ +const relax_typeS md_relax_table[] = { + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + + /* COND_JUMP */ + { 0, 0, 0, 0 }, /* UNDEF_DISP */ + { 2048, -2046, C12_LEN, C(COND_JUMP, DISP32) }, /* DISP12 */ + { 0, 0, C32_LEN, 0 }, /* DISP32 */ + { 0, 0, C32_LEN, 0 }, /* UNDEF_WORD_DISP */ + + /* UNCD_JUMP */ + { 0, 0, 0, 0 }, /* UNDEF_DISP */ + { 2048, -2046, U12_LEN, C(UNCD_JUMP, DISP32) }, /* DISP12 */ + { 0, 0, U32_LEN, 0 }, /* DISP32 */ + { 0, 0, U32_LEN, 0 } /* UNDEF_WORD_DISP */ + }; /* Literal pool data structures. */ @@ -2251,17 +2255,14 @@ md_estimate_size_before_relax (fragP, segment_type) if (!fragP->fr_symbol) { fragP->fr_subtype = C (UNCD_JUMP, DISP12); - fragP->fr_var = md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length; } else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type) { fragP->fr_subtype = C (UNCD_JUMP, DISP12); - fragP->fr_var = md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length; } else { fragP->fr_subtype = C (UNCD_JUMP, UNDEF_WORD_DISP); - fragP->fr_var = md_relax_table[C (UNCD_JUMP, DISP32)].rlx_length; } break; @@ -2273,31 +2274,31 @@ md_estimate_size_before_relax (fragP, segment_type) /* Got a symbol and it's defined in this segment, become byte sized - maybe it will fix up */ fragP->fr_subtype = C (COND_JUMP, DISP12); - fragP->fr_var = md_relax_table[C (COND_JUMP, DISP12)].rlx_length; } else if (fragP->fr_symbol) { /* 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_var = md_relax_table[C (COND_JUMP, DISP32)].rlx_length; } else { /* We know the abs value. */ fragP->fr_subtype = C (COND_JUMP, DISP12); - fragP->fr_var = md_relax_table[C (COND_JUMP, DISP12)].rlx_length; } break; case C (UNCD_JUMP, DISP12): + case C (UNCD_JUMP, DISP32): case C (UNCD_JUMP, UNDEF_WORD_DISP): case C (COND_JUMP, DISP12): + case C (COND_JUMP, DISP32): case C (COND_JUMP, UNDEF_WORD_DISP): /* When relaxing a section for the second time, we don't need to - do anything. */ + do anything besides return the current size. */ break; } + fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length; return fragP->fr_var; } diff --git a/gas/config/tc-sh.c b/gas/config/tc-sh.c index 4ae801f..0bc1d5c 100644 --- a/gas/config/tc-sh.c +++ b/gas/config/tc-sh.c @@ -140,8 +140,6 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP"; #define COND8 1 #define COND12 2 #define COND32 3 -#define UNCOND12 1 -#define UNCOND32 2 #define UNDEF_WORD_DISP 4 #define UNCOND12 1 @@ -190,7 +188,9 @@ const relax_typeS md_relax_table[C (END, 0)] = { { COND12_F, COND12_M, COND12_LENGTH, C (COND_JUMP, COND32), }, /* C (COND_JUMP, COND32) */ { COND32_F, COND32_M, COND32_LENGTH, 0, }, - EMPTY, EMPTY, EMPTY, EMPTY, + /* C (COND_JUMP, UNDEF_WORD_DISP) */ + { 0, 0, COND32_LENGTH, 0, }, + EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, @@ -200,7 +200,9 @@ const relax_typeS md_relax_table[C (END, 0)] = { { COND12_F, COND12_M, COND12_DELAY_LENGTH, C (COND_JUMP_DELAY, COND32), }, /* C (COND_JUMP_DELAY, COND32) */ { COND32_F, COND32_M, COND32_LENGTH, 0, }, - EMPTY, EMPTY, EMPTY, EMPTY, + /* C (COND_JUMP_DELAY, UNDEF_WORD_DISP) */ + { 0, 0, COND32_LENGTH, 0, }, + EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, @@ -208,7 +210,10 @@ const relax_typeS md_relax_table[C (END, 0)] = { { UNCOND12_F, UNCOND12_M, UNCOND12_LENGTH, C (UNCOND_JUMP, UNCOND32), }, /* C (UNCOND_JUMP, UNCOND32) */ { UNCOND32_F, UNCOND32_M, UNCOND32_LENGTH, 0, }, - EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, + EMPTY, + /* C (UNCOND_JUMP, UNDEF_WORD_DISP) */ + { 0, 0, UNCOND32_LENGTH, 0, }, + EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, }; @@ -3028,6 +3033,8 @@ md_estimate_size_before_relax (fragP, segment_type) register fragS *fragP; register segT segment_type; { + int what; + switch (fragP->fr_subtype) { default: @@ -3038,58 +3045,57 @@ md_estimate_size_before_relax (fragP, segment_type) if (!fragP->fr_symbol) { fragP->fr_subtype = C (UNCOND_JUMP, UNCOND12); - fragP->fr_var = md_relax_table[C (UNCOND_JUMP, UNCOND12)].rlx_length; } else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type) { fragP->fr_subtype = C (UNCOND_JUMP, UNCOND12); - fragP->fr_var = md_relax_table[C (UNCOND_JUMP, UNCOND12)].rlx_length; } else { fragP->fr_subtype = C (UNCOND_JUMP, UNDEF_WORD_DISP); - fragP->fr_var = md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length; } break; case C (COND_JUMP, UNDEF_DISP): case C (COND_JUMP_DELAY, UNDEF_DISP): + what = GET_WHAT (fragP->fr_subtype); /* Used to be a branch to somewhere which was unknown. */ if (fragP->fr_symbol && S_GET_SEGMENT (fragP->fr_symbol) == segment_type) { - int what = GET_WHAT (fragP->fr_subtype); /* Got a symbol and it's defined in this segment, become byte sized - maybe it will fix up. */ fragP->fr_subtype = C (what, COND8); - fragP->fr_var = md_relax_table[C (what, COND8)].rlx_length; } else if (fragP->fr_symbol) { - int what = GET_WHAT (fragP->fr_subtype); /* Its got a segment, but its not ours, so it will always be long. */ fragP->fr_subtype = C (what, UNDEF_WORD_DISP); - fragP->fr_var = md_relax_table[C (what, COND32)].rlx_length; } else { - int what = GET_WHAT (fragP->fr_subtype); /* We know the abs value. */ fragP->fr_subtype = C (what, COND8); - fragP->fr_var = md_relax_table[C (what, COND8)].rlx_length; } break; case C (UNCOND_JUMP, UNCOND12): + case C (UNCOND_JUMP, UNCOND32): case C (UNCOND_JUMP, UNDEF_WORD_DISP): case C (COND_JUMP, COND8): + case C (COND_JUMP, COND12): + case C (COND_JUMP, COND32): case C (COND_JUMP, UNDEF_WORD_DISP): case C (COND_JUMP_DELAY, COND8): + case C (COND_JUMP_DELAY, COND12): + case C (COND_JUMP_DELAY, COND32): case C (COND_JUMP_DELAY, UNDEF_WORD_DISP): /* When relaxing a section for the second time, we don't need to - do anything. */ + do anything besides return the current size. */ break; } + + fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length; return fragP->fr_var; } diff --git a/gas/config/tc-w65.c b/gas/config/tc-w65.c index eaa6504..24247ae 100644 --- a/gas/config/tc-w65.c +++ b/gas/config/tc-w65.c @@ -101,7 +101,25 @@ int X; /* X flag */ #define WORD_F 32767 #define WORD_B 32768 -relax_typeS md_relax_table[C (END, 0)]; +relax_typeS md_relax_table[C (END, 0)] = { + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + + /* COND_BRANCH */ + { 0, 0, 0, 0 }, /* UNDEF_BYTE_DISP */ + { BYTE_F, BYTE_B, 2, C (COND_BRANCH, WORD_DISP) }, /* BYTE_DISP */ + { WORD_F, WORD_B, 5, 0 }, /* WORD_DISP */ + { 0, 0, 5, 0 }, /* UNDEF_WORD_DISP */ + + /* UNCOND_BRANCH */ + { 0, 0, 0, 0 }, /* UNDEF_BYTE_DISP */ + { BYTE_F, BYTE_B, 2, C (UNCOND_BRANCH, WORD_DISP) }, /* BYTE_DISP */ + { WORD_F, WORD_B, 3, 0 }, /* WORD_DISP */ + { 0, 0, 3, 0 } /* UNDEF_WORD_DISP */ + +}; /* This function is called once, at assembler startup time. This should set up all the tables, etc that the MD part of the assembler @@ -131,7 +149,6 @@ s_longa (xmode) void md_begin () { - relax_typeS *table; struct opinfo *opcode; char *prev_name = ""; @@ -153,29 +170,6 @@ md_begin () } } - /* Initialize the relax table. We use a local variable to avoid - warnings about modifying a supposedly const data structure. */ - table = (relax_typeS *) md_relax_table; - table[C (COND_BRANCH, BYTE_DISP)].rlx_forward = BYTE_F; - table[C (COND_BRANCH, BYTE_DISP)].rlx_backward = BYTE_B; - table[C (COND_BRANCH, BYTE_DISP)].rlx_length = 2; - table[C (COND_BRANCH, BYTE_DISP)].rlx_more = C (COND_BRANCH, WORD_DISP); - - table[C (COND_BRANCH, WORD_DISP)].rlx_forward = WORD_F; - table[C (COND_BRANCH, WORD_DISP)].rlx_backward = WORD_B; - table[C (COND_BRANCH, WORD_DISP)].rlx_length = 5; - table[C (COND_BRANCH, WORD_DISP)].rlx_more = 0; - - table[C (UNCOND_BRANCH, BYTE_DISP)].rlx_forward = BYTE_F; - table[C (UNCOND_BRANCH, BYTE_DISP)].rlx_backward = BYTE_B; - table[C (UNCOND_BRANCH, BYTE_DISP)].rlx_length = 2; - table[C (UNCOND_BRANCH, BYTE_DISP)].rlx_more = C (UNCOND_BRANCH, WORD_DISP); - - table[C (UNCOND_BRANCH, WORD_DISP)].rlx_forward = WORD_F; - table[C (UNCOND_BRANCH, WORD_DISP)].rlx_backward = WORD_B; - table[C (UNCOND_BRANCH, WORD_DISP)].rlx_length = 3; - table[C (UNCOND_BRANCH, WORD_DISP)].rlx_more = 0; - flag_signed_overflow_ok = 1; } @@ -1148,7 +1142,7 @@ md_estimate_size_before_relax (fragP, segment_type) register fragS *fragP; register segT segment_type; { - int what = GET_WHAT (fragP->fr_subtype); + int what; switch (fragP->fr_subtype) { @@ -1157,31 +1151,34 @@ md_estimate_size_before_relax (fragP, segment_type) case C (COND_BRANCH, UNDEF_BYTE_DISP): case C (UNCOND_BRANCH, UNDEF_BYTE_DISP): + what = GET_WHAT (fragP->fr_subtype); /* Used to be a branch to somewhere which was unknown. */ if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type) { /* Got a symbol and it's defined in this segment, become byte sized - maybe it will fix up. */ fragP->fr_subtype = C (what, BYTE_DISP); - fragP->fr_var = md_relax_table[C (what, BYTE_DISP)].rlx_length; } else { /* Its got a segment, but its not ours, so it will always be long. */ fragP->fr_subtype = C (what, UNDEF_WORD_DISP); - fragP->fr_var = md_relax_table[C (what, WORD_DISP)].rlx_length; } break; case C (COND_BRANCH, BYTE_DISP): case C (COND_BRANCH, WORD_DISP): + case C (COND_BRANCH, UNDEF_WORD_DISP): case C (UNCOND_BRANCH, BYTE_DISP): case C (UNCOND_BRANCH, WORD_DISP): + case C (UNCOND_BRANCH, UNDEF_WORD_DISP): /* When relaxing a section for the second time, we don't need to - do anything. */ + do anything besides return the current size. */ break; } + + fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length; return fragP->fr_var; } |