diff options
Diffstat (limited to 'binutils-2.25/gas/macro.c')
-rw-r--r-- | binutils-2.25/gas/macro.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/binutils-2.25/gas/macro.c b/binutils-2.25/gas/macro.c index 75b9b7ef..d3b4e47c 100644 --- a/binutils-2.25/gas/macro.c +++ b/binutils-2.25/gas/macro.c @@ -1,6 +1,5 @@ /* macro.c - macro support for gas - Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006, 2007, 2008, 2011, 2012, 2013 Free Software Foundation, Inc. + Copyright (C) 1994-2014 Free Software Foundation, Inc. Written by Steve and Judy Chamberlain of Cygnus Support, sac@cygnus.com @@ -212,6 +211,28 @@ buffer_and_nest (const char *from, const char *to, sb *ptr, break; } } + + /* PR gas/16908 + Apply and discard .linefile directives that appear within + the macro. For long macros, one might want to report the + line number information associated with the lines within + the macro definition, but we would need more infrastructure + to make that happen correctly (e.g. resetting the line + number when expanding the macro), and since for short + macros we clearly prefer reporting the point of expansion + anyway, there's not an obviously better fix here. */ + if (strncasecmp (ptr->ptr + i, "linefile", 8) == 0) + { + char *saved_input_line_pointer = input_line_pointer; + char saved_eol_char = ptr->ptr[ptr->len]; + + ptr->ptr[ptr->len] = '\0'; + input_line_pointer = ptr->ptr + i + 8; + s_app_line (0); + ptr->ptr[ptr->len] = saved_eol_char; + input_line_pointer = saved_input_line_pointer; + ptr->len = line_start; + } } /* Add the original end-of-line char to the end and keep running. */ |