X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-sh.c;h=a1cb874743d4a0d35b901c7835c9e688c4a74758;hb=f333765ffdd8e9928ff398b02dd04c8938f507cb;hp=b1a51e66ef413f357741a7809287aa18cddb1c04;hpb=19c0258a7f4097f2e855b3cf1a8f5cf36416803a;p=binutils-gdb.git diff --git a/gas/config/tc-sh.c b/gas/config/tc-sh.c index b1a51e66ef4..a1cb874743d 100644 --- a/gas/config/tc-sh.c +++ b/gas/config/tc-sh.c @@ -97,8 +97,10 @@ const pseudo_typeS md_pseudo_table[] = {"2byte", s_uacons, 2}, {"4byte", s_uacons, 4}, {"8byte", s_uacons, 8}, +#ifdef BFD_ASSEMBLER {"file", dwarf2_directive_file, 0 }, {"loc", dwarf2_directive_loc, 0 }, +#endif {0, 0, 0} }; @@ -140,8 +142,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 +190,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 +202,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 +212,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, }; @@ -1940,7 +1947,9 @@ md_assemble (str) } } +#ifdef BFD_ASSEMBLER dwarf2_emit_insn (size); +#endif } /* This routine is called each time a label definition is seen. It @@ -2331,8 +2340,8 @@ sh_frob_section (abfd, sec, ignore) We have already adjusted the value of sym to include the fragment address, so we undo that adjustment here. */ subseg_change (sec, 0); - fix_new (symbol_get_frag (sym), - S_GET_VALUE (sym) - symbol_get_frag (sym)->fr_address, + fix_new (fscan->fx_frag, + S_GET_VALUE (sym) - fscan->fx_frag->fr_address, 4, &abs_symbol, info.count, 0, BFD_RELOC_SH_COUNT); } } @@ -3028,60 +3037,69 @@ md_estimate_size_before_relax (fragP, segment_type) register fragS *fragP; register segT segment_type; { + int what; + switch (fragP->fr_subtype) { + default: + abort (); + case C (UNCOND_JUMP, UNDEF_DISP): /* Used to be a branch to somewhere which was unknown. */ 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; - return md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length; } break; - default: - abort (); 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; - return 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 besides return the current size. */ break; } + + fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length; return fragP->fr_var; }