diff options
Diffstat (limited to 'gas/read.c')
-rw-r--r-- | gas/read.c | 260 |
1 files changed, 13 insertions, 247 deletions
diff --git a/gas/read.c b/gas/read.c index 4ff33132f8..445caa1489 100644 --- a/gas/read.c +++ b/gas/read.c @@ -1,7 +1,7 @@ /* read.c - read a source file - Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, - 2010, 2011, 2012 Free Software Foundation, Inc. + 2010, 2011 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -209,31 +209,6 @@ static int dwarf_file_string; #endif #endif -/* If the target defines the md_frag_max_var hook then we know - enough to implement the .bundle_align_mode features. */ -#ifdef md_frag_max_var -# define HANDLE_BUNDLE -#endif - -#ifdef HANDLE_BUNDLE -/* .bundle_align_mode sets this. Normally it's zero. When nonzero, - it's the exponent of the bundle size, and aligned instruction bundle - mode is in effect. */ -static unsigned int bundle_align_p2; - -/* These are set by .bundle_lock and .bundle_unlock. .bundle_lock sets - bundle_lock_frag to frag_now and then starts a new frag with - frag_align_code. At the same time, bundle_lock_frain gets frchain_now, - so that .bundle_unlock can verify that we didn't change segments. - .bundle_unlock resets both to NULL. If we detect a bundling violation, - then we reset bundle_lock_frchain to NULL as an indicator that we've - already diagnosed the error with as_bad and don't need a cascade of - redundant errors, but bundle_lock_frag remains set to indicate that - we are expecting to see .bundle_unlock. */ -static fragS *bundle_lock_frag; -static frchainS *bundle_lock_frchain; -#endif - static void do_s_func (int end_p, const char *default_prefix); static void do_align (int, char *, int, int); static void s_align (int, int); @@ -302,11 +277,6 @@ static const pseudo_typeS potable[] = { {"balignw", s_align_bytes, -2}, {"balignl", s_align_bytes, -4}, /* block */ -#ifdef HANDLE_BUNDLE - {"bundle_align_mode", s_bundle_align_mode, 0}, - {"bundle_lock", s_bundle_lock, 0}, - {"bundle_unlock", s_bundle_unlock, 0}, -#endif {"byte", cons, 1}, {"comm", s_comm, 0}, {"common", s_mri_common, 0}, @@ -613,128 +583,6 @@ try_macro (char term, const char *line) return 0; } -#ifdef HANDLE_BUNDLE -/* Start a new instruction bundle. Returns the rs_align_code frag that - will be used to align the new bundle. */ -static fragS * -start_bundle (void) -{ - fragS *frag = frag_now; - - frag_align_code (0, 0); - - while (frag->fr_type != rs_align_code) - frag = frag->fr_next; - - gas_assert (frag != frag_now); - - return frag; -} - -/* Calculate the maximum size after relaxation of the region starting - at the given frag and extending through frag_now (which is unfinished). */ -static unsigned int -pending_bundle_size (fragS *frag) -{ - unsigned int offset = frag->fr_fix; - unsigned int size = 0; - - gas_assert (frag != frag_now); - gas_assert (frag->fr_type == rs_align_code); - - while (frag != frag_now) - { - /* This should only happen in what will later become an error case. */ - if (frag == NULL) - return 0; - - size += frag->fr_fix; - if (frag->fr_type == rs_machine_dependent) - size += md_frag_max_var (frag); - - frag = frag->fr_next; - } - - gas_assert (frag == frag_now); - size += frag_now_fix (); - if (frag->fr_type == rs_machine_dependent) - size += md_frag_max_var (frag); - - gas_assert (size >= offset); - - return size - offset; -} - -/* Finish off the frag created to ensure bundle alignment. */ -static void -finish_bundle (fragS *frag, unsigned int size) -{ - gas_assert (bundle_align_p2 > 0); - gas_assert (frag->fr_type == rs_align_code); - - if (size > 1) - { - /* If there is more than a single byte, then we need to set up the - alignment frag. Otherwise we leave it at its initial state from - calling frag_align_code (0, 0), so that it does nothing. */ - frag->fr_offset = bundle_align_p2; - frag->fr_subtype = size - 1; - } - - /* We do this every time rather than just in s_bundle_align_mode - so that we catch any affected section without needing hooks all - over for all paths that do section changes. It's cheap enough. */ - record_alignment (now_seg, bundle_align_p2 - OCTETS_PER_BYTE_POWER); -} - -/* Assemble one instruction. This takes care of the bundle features - around calling md_assemble. */ -static void -assemble_one (char *line) -{ - fragS *insn_start_frag = NULL; - - if (bundle_lock_frchain != NULL && bundle_lock_frchain != frchain_now) - { - as_bad (_("cannot change section or subsection inside .bundle_lock")); - /* Clearing this serves as a marker that we have already complained. */ - bundle_lock_frchain = NULL; - } - - if (bundle_lock_frchain == NULL && bundle_align_p2 > 0) - insn_start_frag = start_bundle (); - - md_assemble (line); - - if (bundle_lock_frchain != NULL) - { - /* Make sure this hasn't pushed the locked sequence - past the bundle size. */ - unsigned int bundle_size = pending_bundle_size (bundle_lock_frag); - if (bundle_size > (1U << bundle_align_p2)) - as_bad (_("\ -.bundle_lock sequence at %u bytes but .bundle_align_mode limit is %u bytes"), - bundle_size, 1U << bundle_align_p2); - } - else if (bundle_align_p2 > 0) - { - unsigned int insn_size = pending_bundle_size (insn_start_frag); - - if (insn_size > (1U << bundle_align_p2)) - as_bad (_("\ -single instruction is %u bytes long but .bundle_align_mode limit is %u"), - (unsigned int) insn_size, 1U << bundle_align_p2); - - finish_bundle (insn_start_frag, insn_size); - } -} - -#else /* !HANDLE_BUNDLE */ - -# define assemble_one(line) md_assemble(line) - -#endif /* HANDLE_BUNDLE */ - /* We read the file, putting things into a web that represents what we have been reading. */ void @@ -947,7 +795,7 @@ read_a_source_file (char *name) /* Input_line_pointer->after ':'. */ SKIP_WHITESPACE (); } - else if ((c == '=' && input_line_pointer[1] == '=') + else if ((c == '=' && input_line_pointer[1] == '=') || ((c == ' ' || c == '\t') && input_line_pointer[1] == '=' && input_line_pointer[2] == '=')) @@ -955,13 +803,13 @@ read_a_source_file (char *name) equals (s, -1); demand_empty_rest_of_line (); } - else if ((c == '=' - || ((c == ' ' || c == '\t') - && input_line_pointer[1] == '=')) + else if ((c == '=' + || ((c == ' ' || c == '\t') + && input_line_pointer[1] == '=')) #ifdef TC_EQUAL_IN_INSN - && !TC_EQUAL_IN_INSN (c, s) + && !TC_EQUAL_IN_INSN (c, s) #endif - ) + ) { equals (s, 1); demand_empty_rest_of_line (); @@ -1099,7 +947,7 @@ read_a_source_file (char *name) } } - assemble_one (s); /* Assemble 1 instruction. */ + md_assemble (s); /* Assemble 1 instruction. */ *input_line_pointer++ = c; @@ -1280,16 +1128,6 @@ read_a_source_file (char *name) quit: symbol_set_value_now (&dot_symbol); -#ifdef HANDLE_BUNDLE - if (bundle_lock_frag != NULL) - { - as_bad_where (bundle_lock_frag->fr_file, bundle_lock_frag->fr_line, - _(".bundle_lock with no matching .bundle_unlock")); - bundle_lock_frag = NULL; - bundle_lock_frchain = NULL; - } -#endif - #ifdef md_cleanup md_cleanup (); #endif @@ -1896,7 +1734,7 @@ s_app_line (int appline) Besides, it's silly. GCC however will generate a line number of zero when it is pre-processing builtins for assembler-with-cpp files: - # 0 "<built-in>" + # 0 "<built-in>" We do not want to barf on this, especially since such files are used in the GCC and GDB testsuites. So we check for negative line numbers @@ -1925,7 +1763,7 @@ s_app_line (int appline) /* From GCC's cpp documentation: 1: start of a new file. 2: returning to a file after having included - another file. + another file. 3: following text comes from a system header file. 4: following text should be treated as extern "C". @@ -3768,7 +3606,7 @@ demand_empty_rest_of_line (void) *input_line_pointer); ignore_rest_of_line (); } - + /* Return pointing just after end-of-line. */ know (is_end_of_line[(unsigned char) input_line_pointer[-1]]); } @@ -4014,7 +3852,7 @@ cons_worker (int nbytes, /* 1=.byte, 2=.word, 4=.long. */ parse_mri_cons (&exp, (unsigned int) nbytes); else #endif - { + { if (*input_line_pointer == '"') { as_bad (_("unexpected `\"' in expression")); @@ -5853,7 +5691,7 @@ s_include (int arg ATTRIBUTE_UNUSED) demand_empty_rest_of_line (); path = (char *) xmalloc ((unsigned long) i - + include_dir_maxlen + 5 /* slop */ ); + + include_dir_maxlen + 5 /* slop */ ); for (i = 0; i < include_dir_count; i++) { @@ -6029,78 +5867,6 @@ do_s_func (int end_p, const char *default_prefix) demand_empty_rest_of_line (); } -#ifdef HANDLE_BUNDLE - -void -s_bundle_align_mode (int arg ATTRIBUTE_UNUSED) -{ - unsigned int align = get_absolute_expression (); - SKIP_WHITESPACE (); - demand_empty_rest_of_line (); - - if (align > (unsigned int) TC_ALIGN_LIMIT) - as_fatal (_(".bundle_align_mode alignment too large (maximum %u)"), - (unsigned int) TC_ALIGN_LIMIT); - - if (bundle_lock_frag != NULL) - { - as_bad (_("cannot change .bundle_align_mode inside .bundle_lock")); - return; - } - - bundle_align_p2 = align; -} - -void -s_bundle_lock (int arg ATTRIBUTE_UNUSED) -{ - demand_empty_rest_of_line (); - - if (bundle_align_p2 == 0) - { - as_bad (_(".bundle_lock is meaningless without .bundle_align_mode")); - return; - } - - if (bundle_lock_frag != NULL) - { - as_bad (_("second .bundle_lock without .bundle_unlock")); - return; - } - - bundle_lock_frchain = frchain_now; - bundle_lock_frag = start_bundle (); -} - -void -s_bundle_unlock (int arg ATTRIBUTE_UNUSED) -{ - unsigned int size; - - demand_empty_rest_of_line (); - - if (bundle_lock_frag == NULL) - { - as_bad (_(".bundle_unlock without preceding .bundle_lock")); - return; - } - - gas_assert (bundle_align_p2 > 0); - - size = pending_bundle_size (bundle_lock_frag); - - if (size > (1U << bundle_align_p2)) - as_bad (_(".bundle_lock sequence is %u bytes, but bundle size only %u"), - size, 1 << bundle_align_p2); - else - finish_bundle (bundle_lock_frag, size); - - bundle_lock_frag = NULL; - bundle_lock_frchain = NULL; -} - -#endif /* HANDLE_BUNDLE */ - void s_ignore (int arg ATTRIBUTE_UNUSED) { |