Date: prev next · Thread: first prev next last
2015 Archives by date, by thread · List index


Hi,

I saw that gcc-4.8 introduced a new optimization level -Og which enables optimizations that do not interfere with debugging.

Yesterday I floated the idea on IRC of using this with --enable-debug rather than -O0 if available, and some feedback was that it enables gcc to report extra warnings which would be a good thing.

I tried it out and can see that it does indeed break the build if --enable-werror is enabled, eg:

/home/deller/build/libo/vcl/unx/glxtest.cxx: In function ‘void glxtest()’:
/home/deller/build/libo/vcl/unx/glxtest.cxx:236:44: error: ignoring return value of ‘ssize_t write(int, const void*, size_t)’, declared with attribute warn_unused_result [-Werror=unused-result]
   write(write_end_of_the_pipe, buf, length);

So I guess this means we couldn't incorporate -Og until all these new warnings are fixed right?

Any other thoughts on whether this is a good idea to pursue? One fear was that it might slow down compilation, but it doesn't actually seem to slow down "make clean && make" much at all for me. I'll get some proper timing measurements.

(A draft patch is attached to enable -Og if available)

Regards,
Luke.
commit 46809cf5731ae9d2ccbe22b38865242779658225
Author: Luke Deller <luke@deller.id.au>
Date:   Wed Jan 14 23:48:36 2015 +1100

    enable optimization (-Og) with --enable-debug
    
    gcc-4.8 introduced a new optimization level -Og which enables
    optimizations that do not interfere with debugging.
    
    When configured with --enable-debug, use -Og rather than -O0
    if available.
    
    Change-Id: Iff3f98d736681ae34e49b96510228a14ce456b34

diff --git a/config_host.mk.in b/config_host.mk.in
index 26e38ea..131b348 100644
--- a/config_host.mk.in
+++ b/config_host.mk.in
@@ -247,6 +247,7 @@ export HAVE_GCC_FNO_DEFAULT_INLINE=@HAVE_GCC_FNO_DEFAULT_INLINE@
 export HAVE_GCC_FNO_ENFORCE_EH_SPECS=@HAVE_GCC_FNO_ENFORCE_EH_SPECS@
 export HAVE_GCC_FNO_INLINE=@HAVE_GCC_FNO_INLINE@
 export HAVE_GCC_GGDB2=@HAVE_GCC_GGDB2@
+export HAVE_GCC_OG=@HAVE_GCC_OG@
 export HAVE_GCC_PRAGMA_OPERATOR=@HAVE_GCC_PRAGMA_OPERATOR@
 export HAVE_GCC_VISIBILITY_BROKEN=@HAVE_GCC_VISIBILITY_BROKEN@
 export HAVE_GCC_VISIBILITY_FEATURE=@HAVE_GCC_VISIBILITY_FEATURE@
diff --git a/configure.ac b/configure.ac
index ac3dc4e..449ce54 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3223,6 +3223,7 @@ AC_SUBST(GCC_VERSION)
 HAVE_GCC_GGDB2=
 HAVE_GCC_FINLINE_LIMIT=
 HAVE_GCC_FNO_INLINE=
+HAVE_GCC_OG=
 if test "$GCC" = "yes"; then
     AC_MSG_CHECKING([whether $CC supports -ggdb2])
     if test -n "$CLANGVER" -a 0"$CLANGVER" -le 30100; then
@@ -3272,10 +3273,24 @@ if test "$GCC" = "yes"; then
     else
         AC_MSG_RESULT([no])
     fi
+
+    AC_MSG_CHECKING([whether $CC supports -Og])
+    # Note that clang-3.1 reports a real error for this option
+    # so we do not need a special case for clang<=3.1 as above.
+    save_CFLAGS=$CFLAGS
+    CFLAGS="$CFLAGS -Werror -Og"
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[ return 0; ]])],[ HAVE_GCC_OG=TRUE ],[])
+    CFLAGS=$save_CFLAGS
+    if test "$HAVE_GCC_OG" = "TRUE"; then
+        AC_MSG_RESULT([yes])
+    else
+        AC_MSG_RESULT([no])
+    fi
 fi
 AC_SUBST(HAVE_GCC_GGDB2)
 AC_SUBST(HAVE_GCC_FINLINE_LIMIT)
 AC_SUBST(HAVE_GCC_FNO_INLINE)
+AC_SUBST(HAVE_GCC_OG)
 
 HAVE_LD_BSYMBOLIC_FUNCTIONS=
 if test "$GCC" = "yes"; then
diff --git a/solenv/gbuild/platform/com_GCC_defs.mk b/solenv/gbuild/platform/com_GCC_defs.mk
index 7acd068..715bd54 100644
--- a/solenv/gbuild/platform/com_GCC_defs.mk
+++ b/solenv/gbuild/platform/com_GCC_defs.mk
@@ -139,7 +139,13 @@ endif
 gb_PrecompiledHeader_EXCEPTIONFLAGS := $(gb_LinkTarget_EXCEPTIONFLAGS)
 
 # optimization level
+# Use -Og if available (gcc-4.8+), which enables optimizations that do not
+# interfere with debugging.
+ifeq ($(HAVE_GCC_OG),TRUE)
+gb_COMPILERNOOPTFLAGS := -Og -fstrict-aliasing -fstrict-overflow
+else
 gb_COMPILERNOOPTFLAGS := -O0 -fstrict-aliasing -fstrict-overflow
+endif
 
 # Clang does not know -ggdb2 or some other options
 ifeq ($(HAVE_GCC_GGDB2),TRUE)

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.