[v2] Fix build with -march=486 -Os -DNDEBUG (Bug 25240)

Message ID 7f4d3a93-e140-5125-5247-52b86dcb6247@redhat.com
State New
Headers show
  • [v2] Fix build with -march=486 -Os -DNDEBUG (Bug 25240)
Related show

Commit Message

Carlos O'Donell Dec. 3, 2019, 10:01 p.m.
On 12/3/19 4:41 PM, Florian Weimer wrote:
> * Carlos O'Donell:


>> While reviewing bug 25240 I found that -march=486 -Os doesn't build

>> with gcc 9.2.1 because of this problem. Fixing is straight forward,

>> but I'm not sure if undefining NDEBUG like this is the best solution.

>> I wonder if there isn't a pragma we might use here? Thoughts?


> -march=i486?

Sorry, yes.

> Where does this NDEBUG come from, exactly?

Sorry this is confusing, let me rewrite the commit message since I see
what I wrote was confusing.

In this case it comes directly from CFLAGS, and CXXFLAGS, and CPPFLAGS
used to build glibc for as small a size as possible.

Neither the compiler nor the headers inject it for -Os, rather I do
in order to get as small a glibc as possible. I wrote the commit message
rather vaguely and in the abstract sense that anything might inject a
-DNDEBUG, but let me be concrete here.

Since we don't build Fedora with -DNDEBUG anymore we don't see these
issues, but -marhc=i486 -Os -DNDEBUG builds do (small size).

How is this v2 with a better commit message?

8< --- 8< --- 8<
In a -march=486 -Os build gcc 9.2.1 issues the following error:
tst-assert-c++.cc: In function ‘int do_test()’:
tst-assert-c++.cc:66:12: error: unused variable ‘value’ [-Werror=unused-variable]
   66 |     no_int value;
      |            ^~~~~
tst-assert-c++.cc:71:18: error: unused variable ‘value’ [-Werror=unused-variable]
   71 |     bool_and_int value;
      |                  ^~~~~

The assert has been disabled by building glibc with CFLAGS, CXXFLAGS,
and CPPFLAGS with -DNDEBUG which removes the assert (minimum size)
and leaves the value unused.

We never want the assert disabled because that's the point of the
test, so we undefine NDEBUG before including assert.h to ensure that
we get assert defined correctly.
 assert/tst-assert-c++.cc | 3 +++
 1 file changed, 3 insertions(+)



Florian Weimer Dec. 4, 2019, 7:31 a.m. | #1
* Carlos O'Donell:

> How is this v2 with a better commit message?

Sorry, why has -DNDEBUG got anything with -march=i486 (sic) or -Os?
I think you should mention -DNDEBUG only.

The comment should probably mention CFLAGS and -DNDEBUG, because that's
the common case.



diff --git a/assert/tst-assert-c++.cc b/assert/tst-assert-c++.cc
index 41cb487512..a175f5e961 100644
--- a/assert/tst-assert-c++.cc
+++ b/assert/tst-assert-c++.cc
@@ -16,6 +16,9 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
+/* We do not want the compiler or any other pre-included header from
+   removing the assert we want to test, so undefine NDEBUG right now.  */
+#undef NDEBUG
 #include <assert.h>
 /* The C++ standard requires that if the assert argument is a constant