aboutsummaryrefslogtreecommitdiff
path: root/gas/config
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2000-05-23 04:48:21 +0000
committerAlan Modra <amodra@gmail.com>2000-05-23 04:48:21 +0000
commitee7fcc42b119854f718a2a11e086203c3542a6eb (patch)
treefa4922347f751abb91024c6c88b50d4152b88c28 /gas/config
parentb08dff7bbef92725d8cf96b9b7e0b2fb8bc6357a (diff)
downloadgdb-ee7fcc42b119854f718a2a11e086203c3542a6eb.zip
gdb-ee7fcc42b119854f718a2a11e086203c3542a6eb.tar.gz
gdb-ee7fcc42b119854f718a2a11e086203c3542a6eb.tar.bz2
Pass jump reloc in fr_var so it can be used in
md_estimate_size_before_relax, replacing old kludge.
Diffstat (limited to 'gas/config')
-rw-r--r--gas/config/tc-i386.c57
1 files changed, 27 insertions, 30 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 64a2797..bd7f5c2 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -2264,10 +2264,11 @@ md_assemble (line)
if (prefix)
*p++ = DATA_PREFIX_OPCODE;
*p = i.tm.base_opcode;
- /* 1 possible extra opcode + displacement go in fr_var. */
+ /* 1 possible extra opcode + displacement go in var part.
+ Pass reloc in fr_var. */
frag_var (rs_machine_dependent,
1 + size,
- 1,
+ i.disp_reloc[0],
((unsigned char) *p == JUMP_PC_RELATIVE
? ENCODE_RELAX_STATE (UNCOND_JUMP, SMALL) | code16
: ENCODE_RELAX_STATE (COND_JUMP, SMALL) | code16),
@@ -3741,28 +3742,24 @@ i386_operand (operand_string)
return 1; /* normal return */
}
-/*
- * md_estimate_size_before_relax()
- *
- * Called just before relax().
- * Any symbol that is now undefined will not become defined.
- * Return the correct fr_subtype in the frag.
- * Return the initial "guess for fr_var" to caller.
- * The guess for fr_var is ACTUALLY the growth beyond fr_fix.
- * Whatever we do to grow fr_fix or fr_var contributes to our returned value.
- * Although it may not be explicit in the frag, pretend fr_var starts with a
- * 0 value.
- */
+/* md_estimate_size_before_relax()
+
+ Called just before relax() for rs_machine_dependent frags. The x86
+ assembler uses these frags to handle variable size jump
+ instructions.
+
+ Any symbol that is now undefined will not become defined.
+ Return the correct fr_subtype in the frag.
+ Return the initial "guess for variable size of frag" to caller.
+ The guess is actually the growth beyond the fixed part. Whatever
+ we do to grow the fixed or variable part contributes to our
+ returned value. */
+
int
md_estimate_size_before_relax (fragP, segment)
register fragS *fragP;
register segT segment;
{
- register unsigned char *opcode;
- register int old_fr_fix;
-
- old_fr_fix = fragP->fr_fix;
- opcode = (unsigned char *) fragP->fr_opcode;
/* We've already got fragP->fr_subtype right; all we have to do is
check for un-relaxable symbols. On an ELF system, we can't relax
an externally visible symbol, because it may be overridden by a
@@ -3782,20 +3779,19 @@ md_estimate_size_before_relax (fragP, segment)
#else
int reloc_type;
#endif
+ unsigned char *opcode;
+ int old_fr_fix;
- if (GOT_symbol /* Not quite right - we should switch on presence of
- @PLT, but I cannot see how to get to that from
- here. We should have done this in md_assemble to
- really get it right all of the time, but I think it
- does not matter that much, as this will be right
- most of the time. ERY */
- && S_GET_SEGMENT(fragP->fr_symbol) == undefined_section)
- reloc_type = BFD_RELOC_386_PLT32;
+ if (fragP->fr_var != NO_RELOC)
+ reloc_type = fragP->fr_var;
else if (size == 2)
reloc_type = BFD_RELOC_16_PCREL;
else
reloc_type = BFD_RELOC_32_PCREL;
+ old_fr_fix = fragP->fr_fix;
+ opcode = (unsigned char *) fragP->fr_opcode;
+
switch (opcode[0])
{
case JUMP_PC_RELATIVE: /* make jmp (0xeb) a dword displacement jump */
@@ -3820,10 +3816,11 @@ md_estimate_size_before_relax (fragP, segment)
break;
}
frag_wane (fragP);
+ return fragP->fr_fix - old_fr_fix;
}
- return (fragP->fr_var + fragP->fr_fix - old_fr_fix);
-} /* md_estimate_size_before_relax() */
-
+ return 1; /* Guess a short jump. */
+}
+
/*
* md_convert_frag();
*