* config/tc-cris.c (cris_insn_first_word_frag): New.

(md_assemble): Call cris_insn_first_word_frag to get the first
	frag in an insn, not frag_more.  Don't call dwarf2_emit_insn at
	end.  Drop variable insn_size.
	(gen_bdap): Call cris_insn_first_word_frag, not frag_more.
	(cris_sym_leading_underscore): Wrap first as_bad parameter in _().
	(cris_sym_no_leading_underscore, s_cris_file, s_cris_loc): Ditto.
This commit is contained in:
Hans-Peter Nilsson 2001-04-04 04:23:20 +00:00
parent c335d39444
commit ed67db7ab9
2 changed files with 39 additions and 18 deletions

View file

@ -5,6 +5,13 @@
32-bit branch, just set fragP->fr_subtype. Set fragP->fr_var.
<all cases>: Always set fragP->fr_var using md_cris_relax_table.
Add cases to cover all relax states.
(cris_insn_first_word_frag): New.
(md_assemble): Call cris_insn_first_word_frag to get the first
frag in an insn, not frag_more. Don't call dwarf2_emit_insn at
end. Drop variable insn_size.
(gen_bdap): Call cris_insn_first_word_frag, not frag_more.
(cris_sym_leading_underscore): Wrap first as_bad parameter in _().
(cris_sym_no_leading_underscore, s_cris_file, s_cris_loc): Ditto.
* write.c (write_object_file): Reset broken word state before
calling relax_seg.

View file

@ -145,6 +145,7 @@ static void cris_force_reg_prefix PARAMS ((void));
static void cris_relax_reg_prefix PARAMS ((void));
static void cris_sym_leading_underscore PARAMS ((void));
static void cris_sym_no_leading_underscore PARAMS ((void));
static char *cris_insn_first_word_frag PARAMS ((void));
/* Handle to the opcode hash table. */
static struct hash_control *op_hash = NULL;
@ -649,6 +650,26 @@ md_create_long_jump (storep, from_addr, to_addr, fragP, to_symbol)
}
}
/* Allocate space for the first piece of an insn, and mark it as the
start of the insn for debug-format use. */
static char *
cris_insn_first_word_frag ()
{
char *insnp = frag_more (2);
/* We need to mark the start of the insn by passing dwarf2_emit_insn
the offset from the current fragment position. This must be done
after the first fragment is created but before any other fragments
(fixed or varying) are created. Note that the offset only
corresponds to the "size" of the insn for a fixed-size,
non-expanded insn. */
if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
dwarf2_emit_insn (2);
return insnp;
}
/* Port-specific assembler initialization. */
void
@ -693,7 +714,6 @@ md_assemble (str)
struct cris_prefix prefix;
char *opcodep;
char *p;
int insn_size = 0;
know (str);
@ -721,8 +741,7 @@ md_assemble (str)
case PREFIX_BDAP:
case PREFIX_BIAP:
case PREFIX_DIP:
insn_size += 2;
opcodep = frag_more (2);
opcodep = cris_insn_first_word_frag ();
/* Output the prefix opcode. */
md_number_to_chars (opcodep, (long) prefix.opcode, 2);
@ -736,7 +755,6 @@ md_assemble (str)
= (prefix.kind == PREFIX_DIP
? 4 : cris_get_pic_reloc_size (prefix.reloc));
insn_size += relocsize;
p = frag_more (relocsize);
fix_new_exp (frag_now, (p - frag_now->fr_literal), relocsize,
&prefix.expr, 0, prefix.reloc);
@ -744,8 +762,7 @@ md_assemble (str)
break;
case PREFIX_PUSH:
insn_size += 2;
opcodep = frag_more (2);
opcodep = cris_insn_first_word_frag ();
/* Output the prefix opcode. Being a "push", we add the negative
size of the register to "sp". */
@ -771,8 +788,10 @@ md_assemble (str)
return;
/* Done with the prefix. Continue with the main instruction. */
insn_size += 2;
opcodep = frag_more (2);
if (prefix.kind == PREFIX_NONE)
opcodep = cris_insn_first_word_frag ();
else
opcodep = frag_more (2);
/* Output the instruction opcode. */
md_number_to_chars (opcodep, (long) (output_instruction.opcode), 2);
@ -820,7 +839,6 @@ md_assemble (str)
branch. */
char *cond_jump = frag_more (10);
insn_size += 10;
gen_cond_branch_32 (opcodep, cond_jump, frag_now,
output_instruction.expr.X_add_symbol,
(symbolS *) NULL,
@ -861,7 +879,6 @@ md_assemble (str)
BAD_CASE (output_instruction.imm_oprnd_size);
}
insn_size += output_instruction.imm_oprnd_size;
p = frag_more (output_instruction.imm_oprnd_size);
fix_new_exp (frag_now, (p - frag_now->fr_literal),
output_instruction.imm_oprnd_size,
@ -881,9 +898,6 @@ md_assemble (str)
output_instruction.reloc);
}
}
if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
dwarf2_emit_insn (insn_size);
}
/* Low level text-to-bits assembly. */
@ -2337,7 +2351,7 @@ gen_bdap (base_regno, exprP)
/* Put out the prefix opcode; assume quick immediate mode at first. */
opcode = BDAP_QUICK_OPCODE | (base_regno << 12);
opcodep = frag_more (2);
opcodep = cris_insn_first_word_frag ();
md_number_to_chars (opcodep, opcode, 2);
if (exprP->X_op == O_constant)
@ -3100,7 +3114,7 @@ static void cris_sym_leading_underscore ()
the bfd is already created. */
if (symbols_have_leading_underscore == false)
as_bad (".syntax %s requires command-line option `--underscore'",
as_bad (_(".syntax %s requires command-line option `--underscore'"),
SYNTAX_USER_SYM_LEADING_UNDERSCORE);
}
@ -3109,7 +3123,7 @@ static void cris_sym_leading_underscore ()
static void cris_sym_no_leading_underscore ()
{
if (symbols_have_leading_underscore == true)
as_bad (".syntax %s requires command-line option `--no-underscore'",
as_bad (_(".syntax %s requires command-line option `--no-underscore'"),
SYNTAX_USER_SYM_NO_LEADING_UNDERSCORE);
}
@ -3158,7 +3172,7 @@ s_cris_file (dummy)
int dummy;
{
if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
as_bad ("Pseudodirective .file is only valid when generating ELF");
as_bad (_("Pseudodirective .file is only valid when generating ELF"));
else
dwarf2_directive_file (dummy);
}
@ -3171,7 +3185,7 @@ s_cris_loc (dummy)
int dummy;
{
if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
as_bad ("Pseudodirective .loc is only valid when generating ELF");
as_bad (_("Pseudodirective .loc is only valid when generating ELF"));
else
dwarf2_directive_loc (dummy);
}