X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-fr30.c;h=98f5729fe97894bf2363315bca2760a6e160aed8;hb=ac62c3468da474862067776e9cda6fb291aa53cf;hp=aca5880bb7d06773060c6ead2a3b3f2c7451822e;hpb=7dcc9865504dca99a950c4d11d54c3a3a5f0b8c9;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-fr30.c b/gas/config/tc-fr30.c index aca5880bb7..98f5729fe9 100644 --- a/gas/config/tc-fr30.c +++ b/gas/config/tc-fr30.c @@ -1,5 +1,5 @@ /* tc-fr30.c -- Assembler for the Fujitsu FR30. - Copyright (C) 1998, 1999 Free Software Foundation. + Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -21,7 +21,7 @@ #include #include #include "as.h" -#include "subsegs.h" +#include "subsegs.h" #include "symcat.h" #include "opcodes/fr30-desc.h" #include "opcodes/fr30-opc.h" @@ -82,7 +82,7 @@ md_show_usage (stream) FILE * stream; { fprintf (stream, _(" FR30 specific command line options:\n")); -} +} /* The target specific pseudo-ops which we support. */ const pseudo_typeS md_pseudo_table[] = @@ -100,7 +100,7 @@ md_begin () subsegT subseg; /* Initialize the `cgen' interface. */ - + /* Set the machine number and endian. */ gas_cgen_cpu_desc = fr30_cgen_cpu_open (CGEN_CPU_OPEN_MACHS, 0, CGEN_CPU_OPEN_ENDIAN, @@ -126,7 +126,7 @@ md_assemble (str) insn.insn = fr30_cgen_assemble_insn (gas_cgen_cpu_desc, str, & insn.fields, insn.buffer, & errmsg); - + if (!insn.insn) { as_bad (errmsg); @@ -150,7 +150,7 @@ md_assemble (str) /* The syntax in the manual says constants begin with '#'. We just ignore it. */ -void +void md_operand (expressionP) expressionS * expressionP; { @@ -208,7 +208,8 @@ const relax_typeS md_relax_table[] = }; long -fr30_relax_frag (fragP, stretch) +fr30_relax_frag (segment, fragP, stretch) + segT segment; fragS * fragP; long stretch; { @@ -235,7 +236,7 @@ fr30_relax_frag (fragP, stretch) } else { - growth = relax_frag (fragP, stretch); + growth = relax_frag (segment, fragP, stretch); /* Long jump on odd halfword boundary? */ if (fragP->fr_subtype == 2 && (address & 3) != 0) @@ -264,8 +265,6 @@ md_estimate_size_before_relax (fragP, segment) fragS * fragP; segT segment; { - int old_fr_fix = fragP->fr_fix; - /* The only thing we have to handle here are symbols outside of the current segment. They may be undefined or in a different segment in which case linker scripts may place them anywhere. @@ -274,12 +273,14 @@ md_estimate_size_before_relax (fragP, segment) if (S_GET_SEGMENT (fragP->fr_symbol) != segment) { + int old_fr_fix = fragP->fr_fix; + /* The symbol is undefined in this segment. Change the relaxation subtype to the max allowable and leave all further handling to md_convert_frag. */ fragP->fr_subtype = 2; -#if 0 /* Can't use this, but leave in for illustration. */ +#if 0 /* Can't use this, but leave in for illustration. */ /* Change 16 bit insn to 32 bit insn. */ fragP->fr_opcode[0] |= 0x80; @@ -296,6 +297,7 @@ md_estimate_size_before_relax (fragP, segment) /* Mark this fragment as finished. */ frag_wane (fragP); + return fragP->fr_fix - old_fr_fix; #else { const CGEN_INSN * insn; @@ -322,8 +324,9 @@ md_estimate_size_before_relax (fragP, segment) #endif } - return (fragP->fr_var + fragP->fr_fix - old_fr_fix); -} + /* Return the size of the variable part of the frag. */ + return md_relax_table[fragP->fr_subtype].rlx_length; +} /* *fragP has been relaxed to its final size, and now needs to have the bytes inside it modified to conform to the new size. @@ -384,7 +387,6 @@ md_convert_frag (abfd, sec, fragP) { /* Address we want to reach in file space. */ target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset; - target_address += symbol_get_frag (fragP->fr_symbol)->fr_address; addend = (target_address - (opcode_address & -4)) >> 2; } @@ -549,7 +551,7 @@ md_atof (type, litP, sizeP) sizeof (LITTLENUM_TYPE)); litP += sizeof (LITTLENUM_TYPE); } - + return 0; } @@ -559,14 +561,14 @@ restore_colon (advance_i_l_p_by) int advance_i_l_p_by; { char c; - + /* Restore the colon, and advance input_line_pointer to the end of the new symbol. */ * input_line_pointer = ':'; input_line_pointer += advance_i_l_p_by; c = * input_line_pointer; * input_line_pointer = 0; - + return c; } @@ -610,11 +612,11 @@ fr30_is_colon_insn (start) if (start [len] != 0) continue; - + while (len --) if (tolower (start [len]) != insn [len]) break; - + if (len == -1) return restore_colon (1); } @@ -645,16 +647,16 @@ fr30_fix_adjustable (fixP) { if (fixP->fx_addsy == NULL) return 1; - -#if 0 - /* Prevent all adjustments to global symbols. */ + +#if 0 + /* Prevent all adjustments to global symbols. */ if (S_IS_EXTERN (fixP->fx_addsy)) return 0; - + if (S_IS_WEAK (fixP->fx_addsy)) return 0; #endif - + /* We need the symbol name for the VTABLE entries */ if ( fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)