Bug 63310

Summary: x11-libs/cairo-1.12.14 fails to compile using clang+lto
Product: cairo Reporter: cmuelle8 <abendstund>
Component: generalAssignee: Chris Wilson <chris>
Status: RESOLVED MOVED QA Contact: cairo-bugs mailing list <cairo-bugs>
Severity: normal    
Priority: medium Keywords: patch
Version: 1.12.12   
Hardware: All   
OS: Linux (All)   
See Also: https://bugs.gentoo.org/show_bug.cgi?id=464982
Whiteboard:
i915 platform: i915 features:
Attachments: cairo-1.12.12-make-ac-float-endianess-test-llvm-bitcode-save.patch

Description cmuelle8 2013-04-09 12:43:48 UTC
Created attachment 77662 [details] [review]
cairo-1.12.12-make-ac-float-endianess-test-llvm-bitcode-save.patch

I've posted this to bugs.gentoo.org before
  https://bugs.gentoo.org/show_bug.cgi?id=464982

As requested there, I repost the patches here. There are two issues I encountered when compiling cairo with "clang -O4":

1) bitcode representation of object files makes float endianess test in configure break (see attached patch)

2) "automatic configuration" of pthreads does not work while explicitly --enable-pthread=yes to configure does

If "--enable-pthread=yes" configure option is not passed, the default is "auto" instead of "yes", which basically runs the first block of the following lines in
  cairo-1.12.12/build/configure.ac.pthread (around line 220)
-- >8 --
    dnl Check if we can use libc's stubs in libcairo.
    dnl Only do this if the user hasn't explicitly enabled
    dnl pthreads, but is relying on automatic configuration.
    have_pthread="no"
    if test "x$enable_pthread" != "xyes"; then
        CAIRO_CHECK_PTHREAD(
            [pthread], [-D_REENTRANT], [],
            [libcairo_pthread_program],
            [have_pthread=yes],
            [])
    fi

    dnl Default to using the real pthreads for libcairo.
    if test "x$have_pthread" != "xyes"; then
        have_pthread="$have_real_pthread";
        pthread_CFLAGS="$real_pthread_CFLAGS";
        pthread_LIBS="$real_pthread_LIBS";
    fi
-- >8 --

This automatic configuration apparently does not work if clang -O4 is used, even though libcairo_pthread_program seems to succeed.

Or in other words: using libc stubs as a pthread provider currently does not work if clang -O4 is in use, the automatically configured stubs make the compile quit with

libtool: link: clang -march=native -pipe -fomit-frame-pointer -O4 -finline-limit=1200 -march=native -pipe -fomit-frame-pointer -O4 -Wl,-O1 -Wl,--hash-style=gnu -Wl,--sort-common -Wl,-z -Wl,norelro -o .libs/cairo-analyse-trace cairo-analyse-trace.o cairo-error.o  -Wl,--as-needed ../util/cairo-script/.libs/libcairo-script-interpreter.so ../util/cairo-missing/.libs/libcairo-missing.a ./.libs/libcairoperf.a ../boilerplate/.libs/libcairoboilerplate.a /var/tmp/paludis/x11-libs-cairo-1.12.12-r1/work/cairo-1.12.12/src/.libs/libcairo.so ../src/.libs/libcairo.so -lpixman-1 -lfontconfig -lfreetype -lEGL -ldl -lpng15 -lxcb-shm -lxcb-render -lxcb -lXrender -lX11 -lXext -lz -lGL -lOpenVG -lrt -lm
/var/tmp/paludis/x11-libs-cairo-1.12.12-r1/work/cairo-1.12.12/src/.libs/libcairo.so: error: undefined reference to 'pthread_mutexattr_settype'
/var/tmp/paludis/x11-libs-cairo-1.12.12-r1/work/cairo-1.12.12/src/.libs/libcairo.so: error: undefined reference to 'pthread_mutexattr_init'
/var/tmp/paludis/x11-libs-cairo-1.12.12-r1/work/cairo-1.12.12/src/.libs/libcairo.so: error: undefined reference to 'pthread_mutexattr_destroy'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[4]: *** [cairo-analyse-trace] Error 1
make[4]: Leaving directory `/var/tmp/paludis/x11-libs-cairo-1.12.12-r1/work/cairo-1.12.12/perf'
make[3]: Leaving directory `/var/tmp/paludis/x11-libs-cairo-1.12.12-r1/work/cairo-1.12.12/perf'
make[2]: Leaving directory `/var/tmp/paludis/x11-libs-cairo-1.12.12-r1/work/cairo-1.12.12/perf'
make[3]: *** [all-recursive] Error 1
make[2]: *** [all] Error 2
make[1]: Leaving directory `/var/tmp/paludis/x11-libs-cairo-1.12.12-r1/work/cairo-1.12.12'
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2



I'm unsure about a proper fix for this, but thought about
  - patch configure.ac.pthread to use real_pthread as an automatic configuration
    i.e. throw out libc stubs, use real_pthread if libcairo_pthread_program 

Thanks
Comment 1 GitLab Migration User 2018-08-25 13:27:14 UTC
-- GitLab Migration Automatic Message --

This bug has been migrated to freedesktop.org's GitLab instance and has been closed from further activity.

You can subscribe and participate further through the new bug through this link to our GitLab instance: https://gitlab.freedesktop.org/cairo/cairo/issues/14.

Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.