From 09b935accc9deb1b914b33090205574cee66b158 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 2 Jul 2004 06:40:19 +0000 Subject: * frags.h (struct frag): Add has_code and insn_addr fields. * write.c (cvt_frag_to_fill): Invoke md_frag_check. * config/tc-ppc.c (md_assemble): Check and set insn_addr. * config/tc-ppc.h (md_frag_check): Define. --- gas/config/tc-ppc.c | 6 ++++++ gas/config/tc-ppc.h | 9 +++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) (limited to 'gas/config') diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c index fe66d2b..d4893e7 100644 --- a/gas/config/tc-ppc.c +++ b/gas/config/tc-ppc.c @@ -2091,6 +2091,7 @@ md_assemble (str) struct ppc_fixup fixups[MAX_INSN_FIXUPS]; int fc; char *f; + int addr_mod; int i; #ifdef OBJ_ELF bfd_reloc_code_real_type reloc; @@ -2618,6 +2619,11 @@ md_assemble (str) /* Write out the instruction. */ f = frag_more (4); + addr_mod = frag_now_fix () & 3; + if (frag_now->has_code && frag_now->insn_addr != addr_mod) + as_bad (_("instruction address is not a multiple of 4")); + frag_now->insn_addr = addr_mod; + frag_now->has_code = 1; md_number_to_chars (f, insn, 4); #ifdef OBJ_ELF diff --git a/gas/config/tc-ppc.h b/gas/config/tc-ppc.h index 0844f84..e08b12d 100644 --- a/gas/config/tc-ppc.h +++ b/gas/config/tc-ppc.h @@ -1,6 +1,6 @@ /* tc-ppc.h -- Header file for tc-ppc.c. - Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 - Free Software Foundation, Inc. + Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, + 2004 Free Software Foundation, Inc. Written by Ian Lance Taylor, Cygnus Support. This file is part of GAS, the GNU Assembler. @@ -110,6 +110,11 @@ extern char *ppc_target_format PARAMS ((void)); } \ } +#define md_frag_check(FRAGP) \ + if ((FRAGP)->has_code \ + && (((FRAGP)->fr_address + (FRAGP)->insn_addr) & 3) != 0) \ + as_bad_where ((FRAGP)->fr_file, (FRAGP)->fr_line, \ + _("instruction address is not a multiple of 4")); #ifdef TE_PE -- cgit v1.1