aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog7
-rw-r--r--gas/config/tc-cris.c50
2 files changed, 39 insertions, 18 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index bb24ea8..fdae672 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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.
diff --git a/gas/config/tc-cris.c b/gas/config/tc-cris.c
index 0b11f38..19ae971 100644
--- a/gas/config/tc-cris.c
+++ b/gas/config/tc-cris.c
@@ -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);
}