summaryrefslogtreecommitdiff
path: root/mark_rts.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2020-04-10 10:45:51 +0300
committerIvan Maidanski <ivmai@mail.ru>2020-04-10 11:54:37 +0300
commit5e1e33c826ccceb69eaddf6f1b4e222bdfc06d1b (patch)
tree7af158b8187ba5b3fbb3a0a23a5f8fdd6cc410fa /mark_rts.c
parent7b808c777e77eecb8184939b5b4158d6b5ef6baa (diff)
downloadbdwgc-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.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/mark_rts.c b/mark_rts.c
index 90b04803..a3fd4181 100644
--- a/mark_rts.c
+++ b/mark_rts.c
@@ -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