From f2334e1986b4b52c05321457378e1ad588896add Mon Sep 17 00:00:00 2001 From: Olivier Hainque Date: Mon, 17 Jan 2011 12:36:55 +0000 Subject: [PATCH] re PR target/46655 (invalid '.line 0' directive emitted with -g) PR target/46655 * xcoffout.c (ASM_OUTPUT_LINE): Output line only if positive, and only if <= USHRT_MAX in 32-bit mode. Co-Authored-By: Eric Botcazou Co-Authored-By: Michael Haubenwallner From-SVN: r168898 --- gcc/ChangeLog | 8 ++++++++ gcc/xcoffout.c | 9 ++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3d4c6eb7b99b..df24a14bcbe8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2011-01-17 Olivier Hainque + Michael Haubenwallner + Eric Botcazou + + PR target/46655 + * xcoffout.c (ASM_OUTPUT_LINE): Output line only if positive, and only + if <= USHRT_MAX in 32-bit mode. + 2011-01-17 Richard Guenther Backport from mainline diff --git a/gcc/xcoffout.c b/gcc/xcoffout.c index f00aee00e5ec..6ecd3039feb5 100644 --- a/gcc/xcoffout.c +++ b/gcc/xcoffout.c @@ -81,8 +81,15 @@ const char *xcoff_lastfile; #define ASM_OUTPUT_LINE(FILE,LINENUM) \ do \ { \ + /* Make sure we're in a function and prevent output of .line 0, as \ + line # 0 is meant for symbol addresses in xcoff. Additionally, \ + line numbers are 'unsigned short' in 32-bit mode. */ \ if (xcoff_begin_function_line >= 0) \ - fprintf (FILE, "\t.line\t%d\n", ABS_OR_RELATIVE_LINENO (LINENUM)); \ + { \ + int lno = ABS_OR_RELATIVE_LINENO (LINENUM); \ + if (lno > 0 && (TARGET_64BIT || lno <= (int)USHRT_MAX)) \ + fprintf (FILE, "\t.line\t%d\n", lno); \ + } \ } \ while (0) -- 2.47.2