configure.ac |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

New commits:
commit 42f6e89d5e6458966de452af2978f206115394af
Author:     Stephan Bergmann <stephan.bergm...@allotropia.de>
AuthorDate: Tue Apr 9 10:37:09 2024 +0200
Commit:     Stephan Bergmann <stephan.bergm...@allotropia.de>
CommitDate: Tue Apr 9 23:40:49 2024 +0200

    Avoid -O2 in AC_PROG_CC/CXX, work around occasional Clang 12.0.1 SEGVs
    
    At least with one ASan/UBSan setup of mine using LODE's Clang 12.0.1,
    ./autogen.sh would occasionally detect -std=gnu11 as the required CC 
"option to
    enable C11 features" (which would in turn cause building external/firebird 
to
    fail oddly; an issue worth investigations of its own), because Clang would
    occasionally crash with a SEGV on the corresponding configure test program's
    first invocation (without -std=gnu11) when invoked with -O2 (and happen to
    succeed on second invocation with -std=gnu11, so configure thinks that's
    needed), see below for a relevant config.log excerpt.
    
    When CC/CXX are already set (as is the case in this scenario), we could 
arguably
    skip the AC_PROG_CC/CXX checks entirely (and thus avoid configure 
potentially
    adding -std=gnu11 to CC), but at least AC_PROG_CC also internally sets the 
GCC
    shell var, which we use in configure.ac.  So better be conservative and just
    avoid -O2 during AC_PROG_CC/CXX (whatever the autoconf motivation to 
include it
    in the first place).
    
    > configure:8165: checking for 
/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang 
-fsanitize=address -fsanitize=undefined -fsanitize=float-divide-by-zero 
-fsanitize=local-bounds 
-fsanitize-blacklist=/home/sberg/lo0/core/sanitize-ubsan-excludelist option to 
enable C11 features
    > configure:8180: 
/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang 
-fsanitize=address -fsanitize=undefined -fsanitize=float-divide-by-zero 
-fsanitize=local-bounds 
-fsanitize-blacklist=/home/sberg/lo0/core/sanitize-ubsan-excludelist  -c -g -O2 
 conftest.c >&5
    > PLEASE submit a bug report to https://bugs.llvm.org/ and include the 
crash backtrace, preprocessed source, and associated run script.
    > Stack dump:
    > 0.    Program arguments: 
/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang 
-fsanitize=address -fsanitize=undefined -fsanitize=float-divide-by-zero 
-fsanitize=local-bounds 
-fsanitize-blacklist=/home/sberg/lo0/core/sanitize-ubsan-excludelist -c -g -O2 
conftest.c
    > 1.    <eof> parser at end of file
    > 2.    Code generation
    >  #0 0x000055f3a890caf2 llvm::sys::PrintStackTrace(llvm::raw_ostream&, 
int) (/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x1c3eaf2)
    >  #1 0x000055f3a890a734 llvm::sys::RunSignalHandlers() 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x1c3c734)
    >  #2 0x000055f3a887b998 CrashRecoverySignalHandler(int) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x1bad998)
    >  #3 0x00007f750d24e520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
    >  #4 0x000055f3a93f9cd4 llvm::DIE::getUnitDie() const 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x272bcd4)
    >  #5 0x000055f3a9404574 llvm::DwarfDebug::finishEntityDefinitions() 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x2736574)
    >  #6 0x000055f3a941df99 llvm::DwarfDebug::finalizeModuleInfo() 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x274ff99)
    >  #7 0x000055f3a9421128 llvm::DwarfDebug::endModule() 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x2753128)
    >  #8 0x000055f3a93f1219 llvm::AsmPrinter::doFinalization(llvm::Module&) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x2723219)
    >  #9 0x000055f3a82478f5 llvm::FPPassManager::doFinalization(llvm::Module&) 
(.localalias) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x15798f5)
    > #10 0x000055f3a8253900 llvm::legacy::PassManagerImpl::run(llvm::Module&) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x1585900)
    > #11 0x000055f3a8bb57d3 (anonymous 
namespace)::EmitAssemblyHelper::EmitAssembly(clang::BackendAction, 
std::unique_ptr<llvm::raw_pwrite_stream, 
std::default_delete<llvm::raw_pwrite_stream> >) (.constprop.0) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x1ee77d3)
    > #12 0x000055f3a8bb76ea 
clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions 
const&, clang::CodeGenOptions const&, clang::TargetOptions const&, 
clang::LangOptions const&, llvm::DataLayout const&, llvm::Module*, 
clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, 
std::default_delete<llvm::raw_pwrite_stream> >) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x1ee96ea)
    > #13 0x000055f3a9825876 
clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x2b57876)
    > #14 0x000055f3aa35c549 clang::ParseAST(clang::Sema&, bool, bool) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x368e549)
    > #15 0x000055f3a91ef2d9 clang::FrontendAction::Execute() 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x25212d9)
    > #16 0x000055f3a91903a3 
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x24c23a3)
    > #17 0x000055f3a92a2fd8 
clang::ExecuteCompilerInvocation(clang::CompilerInstance*) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x25d4fd8)
    > #18 0x000055f3a7798815 cc1_main(llvm::ArrayRef<char const*>, char const*, 
void*) (/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0xaca815)
    > #19 0x000055f3a77961a7 ExecuteCC1Tool(llvm::SmallVectorImpl<char 
const*>&) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0xac81a7)
    > #20 0x000055f3a9039689 void llvm::function_ref<void 
()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>
 >, std::__cxx11::basic_string<char, std::char_traits<char>, 
std::allocator<char> >*, bool*) const::'lambda'()>(long) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x236b689)
    > #21 0x000055f3a887baa7 
llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x1badaa7)
    > #22 0x000055f3a903a802 
clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>
 >, std::__cxx11::basic_string<char, std::char_traits<char>, 
std::allocator<char> >*, bool*) const (.part.0) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x236c802)
    > #23 0x000055f3a900fbec 
clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, 
clang::driver::Command const*&) const 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x2341bec)
    > #24 0x000055f3a9010679 
clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, 
llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*> >&) const 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x2342679)
    > #25 0x000055f3a901e8f1 
clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, 
llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*> >&) 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0x23508f1)
    > #26 0x000055f3a7717e6f main 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0xa49e6f)
    > #27 0x00007f750d235d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
    > #28 0x00007f750d235e40 __libc_start_main 
(/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
    > #29 0x000055f3a7795b55 _start 
(/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang+0xac7b55)
    > clang-12: error: clang frontend command failed with exit code 139 (use -v 
to see invocation)
    > clang version 12.0.1 (https://github.com/llvm/llvm-project.git 
fed41342a82f5a3a9201819a82bf7a48313e296b)
    > Target: x86_64-unknown-linux-gnu
    > Thread model: posix
    > InstalledDir: /home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin
    > clang-12: note: diagnostic msg:
    > ********************
    >
    > PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
    > Preprocessed source(s) and associated run script(s) are located at:
    > clang-12: note: diagnostic msg: /tmp/conftest-968380.c
    > clang-12: note: diagnostic msg: /tmp/conftest-968380.sh
    > clang-12: note: diagnostic msg:
    >
    > ********************
    > configure:8180: $? = 139
    > configure: failed program was:
    > | /* confdefs.h */
    > | #define PACKAGE_NAME "LibreOffice"
    > | #define PACKAGE_TARNAME "libreoffice"
    > | #define PACKAGE_VERSION "24.8.0.0.alpha0+"
    > | #define PACKAGE_STRING "LibreOffice 24.8.0.0.alpha0+"
    > | #define PACKAGE_BUGREPORT ""
    > | #define PACKAGE_URL "http://documentfoundation.org/";
    > | #define LIBO_VERSION_MAJOR 24
    > | #define LIBO_VERSION_MINOR 8
    > | #define LIBO_VERSION_MICRO 0
    > | #define LIBO_VERSION_PATCH 0
    > | #define LIBO_THIS_YEAR 2024
    > | #define SRCDIR "/home/sberg/lo0/core"
    > | #define SRC_ROOT "/home/sberg/lo0/core"
    > | #define BUILDDIR "/home/sberg/lo0/core"
    > | #define USE_HEADLESS_CODE 1
    > | #define ENABLE_HEADLESS 1
    > | /* end confdefs.h.  */
    > |
    > | /* Does the compiler advertise C89 conformance?
    > |    Do not test the value of __STDC__, because some compilers set it to 0
    > |    while being otherwise adequately conformant. */
    > | #if !defined __STDC__
    > | # error "Compiler does not advertise C89 conformance"
    > | #endif
    > |
    > | #include <stddef.h>
    > | #include <stdarg.h>
    > | struct stat;
    > | /* Most of the following tests are stolen from RCS 5.7 src/conf.sh.  */
    > | struct buf { int x; };
    > | struct buf * (*rcsopen) (struct buf *, struct stat *, int);
    > | static char *e (p, i)
    > |      char **p;
    > |      int i;
    > | {
    > |   return p[i];
    > | }
    > | static char *f (char * (*g) (char **, int), char **p, ...)
    > | {
    > |   char *s;
    > |   va_list v;
    > |   va_start (v,p);
    > |   s = g (p, va_arg (v,int));
    > |   va_end (v);
    > |   return s;
    > | }
    > |
    > | /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
    > |    function prototypes and stuff, but not \xHH hex character constants.
    > |    These do not provoke an error unfortunately, instead are silently 
treated
    > |    as an "x".  The following induces an error, until -std is added to 
get
    > |    proper ANSI mode.  Curiously \x00 != x always comes out true, for an
    > |    array size at least.  It is necessary to write \x00 == 0 to get 
something
    > |    that is true only with -std.  */
    > | int osf4_cc_array ['\x00' == 0 ? 1 : -1];
    > |
    > | /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro 
parameters
    > |    inside strings and character constants.  */
    > | #define FOO(x) 'x'
    > | int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
    > |
    > | int test (int i, double x);
    > | struct s1 {int (*f) (int a);};
    > | struct s2 {int (*f) (double a);};
    > | int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
    > |                int, int);
    > |
    > | // Does the compiler advertise C99 conformance?
    > | #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
    > | # error "Compiler does not advertise C99 conformance"
    > | #endif
    > |
    > | #include <stdbool.h>
    > | extern int puts (const char *);
    > | extern int printf (const char *, ...);
    > | extern int dprintf (int, const char *, ...);
    > | extern void *malloc (size_t);
    > |
    > | // Check varargs macros.  These examples are taken from C99 6.10.3.5.
    > | // dprintf is used instead of fprintf to avoid needing to declare
    > | // FILE and stderr.
    > | #define debug(...) dprintf (2, __VA_ARGS__)
    > | #define showlist(...) puts (#__VA_ARGS__)
    > | #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
    > | static void
    > | test_varargs_macros (void)
    > | {
    > |   int x = 1234;
    > |   int y = 5678;
    > |   debug ("Flag");
    > |   debug ("X = %d
", x);
    > |   showlist (The first, second, and third items.);
    > |   report (x>y, "x is %d but y is %d", x, y);
    > | }
    > |
    > | // Check long long types.
    > | #define BIG64 18446744073709551615ull
    > | #define BIG32 4294967295ul
    > | #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
    > | #if !BIG_OK
    > |   #error "your preprocessor is broken"
    > | #endif
    > | #if BIG_OK
    > | #else
    > |   #error "your preprocessor is broken"
    > | #endif
    > | static long long int bignum = -9223372036854775807LL;
    > | static unsigned long long int ubignum = BIG64;
    > |
    > | struct incomplete_array
    > | {
    > |   int datasize;
    > |   double data[];
    > | };
    > |
    > | struct named_init {
    > |   int number;
    > |   const wchar_t *name;
    > |   double average;
    > | };
    > |
    > | typedef const char *ccp;
    > |
    > | static inline int
    > | test_restrict (ccp restrict text)
    > | {
    > |   // See if C++-style comments work.
    > |   // Iterate through items via the restricted pointer.
    > |   // Also check for declarations in for loops.
    > |   for (unsigned int i = 0; *(text+i) != '
    > |     continue;
    > |   return 0;
    > | }
    > |
    > | // Check varargs and va_copy.
    > | static bool
    > | test_varargs (const char *format, ...)
    > | {
    > |   va_list args;
    > |   va_start (args, format);
    > |   va_list args_copy;
    > |   va_copy (args_copy, args);
    > |
    > |   const char *str = "";
    > |   int number = 0;
    > |   float fnumber = 0;
    > |
    > |   while (*format)
    > |     {
    > |       switch (*format++)
    > |     {
    > |     case 's': // string
    > |       str = va_arg (args_copy, const char *);
    > |       break;
    > |     case 'd': // int
    > |       number = va_arg (args_copy, int);
    > |       break;
    > |     case 'f': // float
    > |       fnumber = va_arg (args_copy, double);
    > |       break;
    > |     default:
    > |       break;
    > |     }
    > |     }
    > |   va_end (args_copy);
    > |   va_end (args);
    > |
    > |   return *str && number && fnumber;
    > | }
    > |
    > |
    > | // Does the compiler advertise C11 conformance?
    > | #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
    > | # error "Compiler does not advertise C11 conformance"
    > | #endif
    > |
    > | // Check _Alignas.
    > | char _Alignas (double) aligned_as_double;
    > | char _Alignas (0) no_special_alignment;
    > | extern char aligned_as_int;
    > | char _Alignas (0) _Alignas (int) aligned_as_int;
    > |
    > | // Check _Alignof.
    > | enum
    > | {
    > |   int_alignment = _Alignof (int),
    > |   int_array_alignment = _Alignof (int[100]),
    > |   char_alignment = _Alignof (char)
    > | };
    > | _Static_assert (0 < -_Alignof (int), "_Alignof is signed");
    > |
    > | // Check _Noreturn.
    > | int _Noreturn does_not_return (void) { for (;;) continue; }
    > |
    > | // Check _Static_assert.
    > | struct test_static_assert
    > | {
    > |   int x;
    > |   _Static_assert (sizeof (int) <= sizeof (long int),
    > |                   "_Static_assert does not work in struct");
    > |   long int y;
    > | };
    > |
    > | // Check UTF-8 literals.
    > | #define u8 syntax error!
    > | char const utf8_literal[] = u8"happens to be ASCII" "another string";
    > |
    > | // Check duplicate typedefs.
    > | typedef long *long_ptr;
    > | typedef long int *long_ptr;
    > | typedef long_ptr long_ptr;
    > |
    > | // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
    > | struct anonymous
    > | {
    > |   union {
    > |     struct { int i; int j; };
    > |     struct { int k; long int l; } w;
    > |   };
    > |   int m;
    > | } v1;
    > |
    > |
    > | int
    > | main (int argc, char **argv)
    > | {
    > |   int ok = 0;
    > |
    > | ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != 
argv[1]);
    > |
    > |
    > |   // Check bool.
    > |   _Bool success = false;
    > |   success |= (argc != 0);
    > |
    > |   // Check restrict.
    > |   if (test_restrict ("String literal") == 0)
    > |     success = true;
    > |   char *restrict newvar = "Another string";
    > |
    > |   // Check varargs.
    > |   success &= test_varargs ("s, d' f .", "string", 65, 34.234);
    > |   test_varargs_macros ();
    > |
    > |   // Check flexible array members.
    > |   struct incomplete_array *ia =
    > |     malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
    > |   ia->datasize = 10;
    > |   for (int i = 0; i < ia->datasize; ++i)
    > |     ia->data[i] = i * 1.234;
    > |
    > |   // Check named initializers.
    > |   struct named_init ni = {
    > |     .number = 34,
    > |     .name = L"Test wide string",
    > |     .average = 543.34343,
    > |   };
    > |
    > |   ni.number = 58;
    > |
    > |   int dynamic_array[ni.number];
    > |   dynamic_array[0] = argv[0][0];
    > |   dynamic_array[ni.number - 1] = 543;
    > |
    > |   // work around unused variable warnings
    > |   ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 
'x'
    > |      || dynamic_array[ni.number - 1] != 543);
    > |
    > |
    > |   _Static_assert ((offsetof (struct anonymous, i)
    > |                == offsetof (struct anonymous, w.k)),
    > |               "Anonymous union alignment botch");
    > |   v1.i = 2;
    > |   v1.w.k = 5;
    > |   ok |= v1.i != 5;
    > |
    > |   return ok;
    > | }
    > |
    > configure:8180: 
/home/builder/lode/opt_private/clang-llvmorg-12.0.1/bin/clang 
-fsanitize=address -fsanitize=undefined -fsanitize=float-divide-by-zero 
-fsanitize=local-bounds 
-fsanitize-blacklist=/home/sberg/lo0/core/sanitize-ubsan-excludelist -std=gnu11 
-c -g -O2  conftest.c >&5
    > configure:8180: $? = 0
    > configure:8201: result: -std=gnu11
    
    Change-Id: I9122d0d853d0010155d57cb1d1d56f7c453d5208
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165904
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <stephan.bergm...@allotropia.de>

diff --git a/configure.ac b/configure.ac
index 799b88d39abb..4bb5ad4d97da 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1328,8 +1328,10 @@ dnl The following checks for gcc, cc and then cl (if it 
weren't guarded for win3
 dnl Needs to precede the AC_C_BIGENDIAN and AC_SEARCH_LIBS calls below, which 
apparently call
 dnl AC_PROG_CC internally.
 if test "$_os" != "WINNT"; then
-    # AC_PROG_CC sets CFLAGS to -g -O2 if not set, avoid that
+    # AC_PROG_CC sets CFLAGS to -g -O2 if not set, avoid that (and avoid -O2 
during AC_PROG_CC,
+    # Clang 12.0.1 occasionally SEGVs on some of the test invocations during 
AC_PROG_CC with -O2):
     save_CFLAGS=$CFLAGS
+    CFLAGS=-g
     AC_PROG_CC
     CFLAGS=$save_CFLAGS
     if test -z "$CC_BASE"; then
@@ -7068,8 +7070,10 @@ dnl Testing for C++ compiler and version...
 dnl ===================================================================
 
 if test "$_os" != "WINNT"; then
-    # AC_PROG_CXX sets CXXFLAGS to -g -O2 if not set, avoid that
+    # AC_PROG_CXX sets CXXFLAGS to -g -O2 if not set, avoid that (and avoid 
-O2 during AC_PROG_CXX,
+    # see AC_PROG_CC above):
     save_CXXFLAGS=$CXXFLAGS
+    CXXFLAGS=-g
     AC_PROG_CXX
     CXXFLAGS=$save_CXXFLAGS
     if test -z "$CXX_BASE"; then

Reply via email to