[PR87013] check for .loc is_stmt support in the assembler

Message ID or4lenzcj1.fsf@lxoliva.fsfla.org
State New
Headers show
Series
  • [PR87013] check for .loc is_stmt support in the assembler
Related show

Commit Message

Alexandre Oliva Sept. 18, 2018, 3:53 a.m.
Back when we had the logic to output is_stmt but never exercised it,
it didn't matter that we didn't test for assembler support for it.
But there are still assemblers out there that do not support it, so
now that we enable the formerly latent is_stmt logic, we'd better make
sure the assembler can deal with it.

Regstrapped on x86_64-linux-gnu, tested on an affected platform by the
bug reporter.  Ok to install?  Ok for GCC 8 branch?

for  gcc/ChangeLog

	PR bootstrap/87013
	* configure.ac: Check for .loc is_stmt support.
	* configure, config.in: Rebuilt.
	* dwarf2out.c (dwarf2out_source_line): Skip is_stmt
	if not supported.
---
 gcc/config.in    |    6 ++++++
 gcc/configure    |   38 ++++++++++++++++++++++++++++++++++++++
 gcc/configure.ac |    9 +++++++++
 gcc/dwarf2out.c  |    2 ++
 4 files changed, 55 insertions(+)



-- 
Alexandre Oliva, freedom fighter   https://FSFLA.org/blogs/lxo
Be the change, be Free!         FSF Latin America board member
GNU Toolchain Engineer                Free Software Evangelist

Comments

Richard Biener Sept. 18, 2018, 5:38 a.m. | #1
On September 18, 2018 5:53:54 AM GMT+02:00, Alexandre Oliva <aoliva@redhat.com> wrote:
>Back when we had the logic to output is_stmt but never exercised it,

>it didn't matter that we didn't test for assembler support for it.

>But there are still assemblers out there that do not support it, so

>now that we enable the formerly latent is_stmt logic, we'd better make

>sure the assembler can deal with it.

>

>Regstrapped on x86_64-linux-gnu, tested on an affected platform by the

>bug reporter.  Ok to install?  Ok for GCC 8 branch?


OK. 

Thanks, 
Richard. 

>for  gcc/ChangeLog

>

>	PR bootstrap/87013

>	* configure.ac: Check for .loc is_stmt support.

>	* configure, config.in: Rebuilt.

>	* dwarf2out.c (dwarf2out_source_line): Skip is_stmt

>	if not supported.

>---

> gcc/config.in    |    6 ++++++

> gcc/configure    |   38 ++++++++++++++++++++++++++++++++++++++

> gcc/configure.ac |    9 +++++++++

> gcc/dwarf2out.c  |    2 ++

> 4 files changed, 55 insertions(+)

>

>diff --git a/gcc/config.in b/gcc/config.in

>index 2856e72d627df..775536e68e98f 100644

>--- a/gcc/config.in

>+++ b/gcc/config.in

>@@ -1297,6 +1297,12 @@

> #endif

> 

> 

>+/* Define if your assembler supports the .loc is_stmt sub-directive.

>*/

>+#ifndef USED_FOR_TARGET

>+#undef HAVE_GAS_LOC_STMT

>+#endif

>+

>+

>/* Define if your assembler supports specifying the maximum number of

>bytes to

>    skip when using the GAS .p2align command. */

> #ifndef USED_FOR_TARGET

>diff --git a/gcc/configure b/gcc/configure

>index 5ae43ec891778..b3205adc71888 100755

>--- a/gcc/configure

>+++ b/gcc/configure

>@@ -23942,6 +23942,44 @@ _ACEOF

>   ;;

> esac

> 

>+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for line

>table is_stmt support" >&5

>+$as_echo_n "checking assembler for line table is_stmt support... "

>>&6; }

>+if test "${gcc_cv_as_is_stmt+set}" = set; then :

>+  $as_echo_n "(cached) " >&6

>+else

>+  gcc_cv_as_is_stmt=no

>+    if test $in_tree_gas = yes; then

>+    if test $gcc_cv_gas_vers -ge `expr \( \( 2 \* 1000 \) + 16 \) \*

>1000 + 92`

>+  then gcc_cv_as_is_stmt=yes

>+fi

>+  elif test x$gcc_cv_as != x; then

>+    $as_echo '	.text

>+	.file 1 "conf.c"

>+	.loc 1 1 0 is_stmt 1' > conftest.s

>+    if { ac_try='$gcc_cv_as $gcc_cv_as_flags  -o conftest.o conftest.s

>>&5'

>+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5

>+  (eval $ac_try) 2>&5

>+  ac_status=$?

>+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5

>+  test $ac_status = 0; }; }

>+    then

>+	gcc_cv_as_is_stmt=yes

>+    else

>+      echo "configure: failed program was" >&5

>+      cat conftest.s >&5

>+    fi

>+    rm -f conftest.o conftest.s

>+  fi

>+fi

>+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_is_stmt"

>>&5

>+$as_echo "$gcc_cv_as_is_stmt" >&6; }

>+if test $gcc_cv_as_is_stmt = yes; then

>+

>+$as_echo "#define HAVE_GAS_LOC_STMT 1" >>confdefs.h

>+

>+fi

>+

>+

>{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for line

>table discriminator support" >&5

>$as_echo_n "checking assembler for line table discriminator support...

>" >&6; }

> if test "${gcc_cv_as_discriminator+set}" = set; then :

>diff --git a/gcc/configure.ac b/gcc/configure.ac

>index fceab2f59a98a..92cecbd763699 100644

>--- a/gcc/configure.ac

>+++ b/gcc/configure.ac

>@@ -3146,6 +3146,15 @@ case "${target}" in

>   ;;

> esac

> 

>+gcc_GAS_CHECK_FEATURE([line table is_stmt support],

>+ gcc_cv_as_is_stmt,

>+ [2,16,92],,

>+[	.text

>+	.file 1 "conf.c"

>+	.loc 1 1 0 is_stmt 1],,

>+[AC_DEFINE(HAVE_GAS_LOC_STMT, 1,

>+  [Define if your assembler supports the .loc is_stmt

>sub-directive.])])

>+

> gcc_GAS_CHECK_FEATURE([line table discriminator support],

>  gcc_cv_as_discriminator,

>  [2,19,51],,

>diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c

>index 48c5037862254..55fcb7be4afa7 100644

>--- a/gcc/dwarf2out.c

>+++ b/gcc/dwarf2out.c

>@@ -27931,8 +27931,10 @@ dwarf2out_source_line (unsigned int line,

>unsigned int column,

> 

>       if (is_stmt != table->is_stmt)

> 	{

>+#if HAVE_GAS_LOC_STMT

> 	  fputs (" is_stmt ", asm_out_file);

> 	  putc (is_stmt ? '1' : '0', asm_out_file);

>+#endif

> 	}

>       if (SUPPORTS_DISCRIMINATOR && discriminator != 0)

> 	{

Patch

diff --git a/gcc/config.in b/gcc/config.in
index 2856e72d627df..775536e68e98f 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -1297,6 +1297,12 @@ 
 #endif
 
 
+/* Define if your assembler supports the .loc is_stmt sub-directive. */
+#ifndef USED_FOR_TARGET
+#undef HAVE_GAS_LOC_STMT
+#endif
+
+
 /* Define if your assembler supports specifying the maximum number of bytes to
    skip when using the GAS .p2align command. */
 #ifndef USED_FOR_TARGET
diff --git a/gcc/configure b/gcc/configure
index 5ae43ec891778..b3205adc71888 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -23942,6 +23942,44 @@  _ACEOF
   ;;
 esac
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for line table is_stmt support" >&5
+$as_echo_n "checking assembler for line table is_stmt support... " >&6; }
+if test "${gcc_cv_as_is_stmt+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  gcc_cv_as_is_stmt=no
+    if test $in_tree_gas = yes; then
+    if test $gcc_cv_gas_vers -ge `expr \( \( 2 \* 1000 \) + 16 \) \* 1000 + 92`
+  then gcc_cv_as_is_stmt=yes
+fi
+  elif test x$gcc_cv_as != x; then
+    $as_echo '	.text
+	.file 1 "conf.c"
+	.loc 1 1 0 is_stmt 1' > conftest.s
+    if { ac_try='$gcc_cv_as $gcc_cv_as_flags  -o conftest.o conftest.s >&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+    then
+	gcc_cv_as_is_stmt=yes
+    else
+      echo "configure: failed program was" >&5
+      cat conftest.s >&5
+    fi
+    rm -f conftest.o conftest.s
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_is_stmt" >&5
+$as_echo "$gcc_cv_as_is_stmt" >&6; }
+if test $gcc_cv_as_is_stmt = yes; then
+
+$as_echo "#define HAVE_GAS_LOC_STMT 1" >>confdefs.h
+
+fi
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for line table discriminator support" >&5
 $as_echo_n "checking assembler for line table discriminator support... " >&6; }
 if test "${gcc_cv_as_discriminator+set}" = set; then :
diff --git a/gcc/configure.ac b/gcc/configure.ac
index fceab2f59a98a..92cecbd763699 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -3146,6 +3146,15 @@  case "${target}" in
   ;;
 esac
 
+gcc_GAS_CHECK_FEATURE([line table is_stmt support],
+ gcc_cv_as_is_stmt,
+ [2,16,92],,
+[	.text
+	.file 1 "conf.c"
+	.loc 1 1 0 is_stmt 1],,
+[AC_DEFINE(HAVE_GAS_LOC_STMT, 1,
+  [Define if your assembler supports the .loc is_stmt sub-directive.])])
+
 gcc_GAS_CHECK_FEATURE([line table discriminator support],
  gcc_cv_as_discriminator,
  [2,19,51],,
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 48c5037862254..55fcb7be4afa7 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -27931,8 +27931,10 @@  dwarf2out_source_line (unsigned int line, unsigned int column,
 
       if (is_stmt != table->is_stmt)
 	{
+#if HAVE_GAS_LOC_STMT
 	  fputs (" is_stmt ", asm_out_file);
 	  putc (is_stmt ? '1' : '0', asm_out_file);
+#endif
 	}
       if (SUPPORTS_DISCRIMINATOR && discriminator != 0)
 	{