[Gc] Don't use __builtin_unwind_init() with clang

Niklas Therning niklas at therning.org
Tue Apr 17 00:00:30 PDT 2012


Hi,

I've had some problems with GC allocated memory being collected even 
though it is referenced by a CPU register. I'm using clang on mac os x:

$ clang -v
Apple clang version 3.0 (tags/Apple/clang-211.12) (based on LLVM 3.0svn)
Target: x86_64-apple-darwin11.2.0
Thread model: posix

This is the clang that comes with XCode 4.2.1.

I've seen this problem when targeting both x86_64 and arm (iOS). It 
turns out that the __builtin_unwind_init() function on this clang 
version is a noop. It does nothing. I've disassembled the mach_dep.o 
generated by clang for both x86_64 and arm with and without the call to 
__builtin_unwind_init(). The assembly is identical.

Here's a patch that fixes this problem for me. It prevents 
HAVE_BUILTIN_UNWIND_INIT to be set if the compiler is clang:

diff -rupN bdwgc-20120327.orig/include/private/gcconfig.h 
bdwgc-20120327/include/private/gcconfig.h
--- bdwgc-20120327.orig/include/private/gcconfig.h      2012-03-27 
16:11:13.000000000 +0200
+++ bdwgc-20120327/include/private/gcconfig.h   2012-04-16 
13:59:27.000000000 +0200
@@ -700,7 +700,8 @@
  /* __builtin_unwind_init() to push the relevant registers onto the 
stack. */
  # if defined(__GNUC__) && ((__GNUC__ >= 3) \
                             || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)) \
- && !defined(__INTEL_COMPILER) && !defined(__PATHCC__)
+ && !defined(__INTEL_COMPILER) && !defined(__PATHCC__) \
+ && !defined(__clang__)
  #   define HAVE_BUILTIN_UNWIND_INIT
  # endif




More information about the Gc mailing list