diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2020-04-10 10:45:51 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2020-04-10 11:54:37 +0300 |
commit | 5e1e33c826ccceb69eaddf6f1b4e222bdfc06d1b (patch) | |
tree | 7af158b8187ba5b3fbb3a0a23a5f8fdd6cc410fa /mark_rts.c | |
parent | 7b808c777e77eecb8184939b5b4158d6b5ef6baa (diff) | |
download | bdwgc-5e1e33c826ccceb69eaddf6f1b4e222bdfc06d1b.tar.gz |
Workaround clang-3.8/s390x bug when processing __builtin_frame_address
This prevents a crash in llvm::SystemZTargetLowering::LowerOperation
of libLLVM-3.8 when generating code for mark_rts.c targeting s390x.
Clang-8 does not have such a bug.
* mark_rts.c [S390 && !CPPCHECK && __clang_major__<8] (GC_approx_sp):
return address of sp local variable (instead of
__builtin_frame_address(0)); add comment.
Diffstat (limited to 'mark_rts.c')
-rw-r--r-- | mark_rts.c | 7 |
1 files changed, 5 insertions, 2 deletions
@@ -502,8 +502,11 @@ STATIC void GC_remove_tmp_roots(void) GC_INNER ptr_t GC_approx_sp(void) { volatile word sp; -# if defined(CPPCHECK) || (__GNUC__ >= 4 /* GC_GNUC_PREREQ(4, 0) */ \ - && !defined(STACK_NOT_SCANNED)) +# if defined(S390) && !defined(CPPCHECK) && (__clang_major__ < 8) + /* Workaround a crash in SystemZTargetLowering of libLLVM-3.8. */ + sp = (word)&sp; +# elif defined(CPPCHECK) || (__GNUC__ >= 4 /* GC_GNUC_PREREQ(4, 0) */ \ + && !defined(STACK_NOT_SCANNED)) /* TODO: Use GC_GNUC_PREREQ after fixing a bug in cppcheck. */ sp = (word)__builtin_frame_address(0); # else |