nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1From a11d1cc41c725ec6dee58f75e4a852a658dd7543 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Thu, 10 Mar 2022 19:30:00 -0800
4Subject: [PATCH] [builtins] Use mcr for dmb instruction on armv6
5
6At present compiler-rt cross compiles for armv6 ( -march=armv6 ) but includes
7dmb instructions which are only available in armv7+ this causes SIGILL on
8clang+compiler-rt compiled components on rpi0w platforms.
9
10Reviewed By: MaskRay
11
12Differential Revision: https://reviews.llvm.org/D99282
13---
14 compiler-rt/lib/builtins/arm/sync-ops.h | 8 ++++----
15 compiler-rt/lib/builtins/assembly.h | 8 ++++++++
16 2 files changed, 12 insertions(+), 4 deletions(-)
17
18diff --git a/lib/builtins/arm/sync-ops.h b/lib/builtins/arm/sync-ops.h
19index c9623249e5d20..7a26170741ad2 100644
20--- a/lib/builtins/arm/sync-ops.h
21+++ b/lib/builtins/arm/sync-ops.h
22@@ -19,14 +19,14 @@
23 .thumb; \
24 .syntax unified; \
25 DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_##op) \
26- dmb; \
27+ DMB; \
28 mov r12, r0; \
29 LOCAL_LABEL(tryatomic_##op) : ldrex r0, [r12]; \
30 op(r2, r0, r1); \
31 strex r3, r2, [r12]; \
32 cmp r3, #0; \
33 bne LOCAL_LABEL(tryatomic_##op); \
34- dmb; \
35+ DMB; \
36 bx lr
37
38 #define SYNC_OP_8(op) \
39@@ -35,14 +35,14 @@
40 .syntax unified; \
41 DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_##op) \
42 push {r4, r5, r6, lr}; \
43- dmb; \
44+ DMB; \
45 mov r12, r0; \
46 LOCAL_LABEL(tryatomic_##op) : ldrexd r0, r1, [r12]; \
47 op(r4, r5, r0, r1, r2, r3); \
48 strexd r6, r4, r5, [r12]; \
49 cmp r6, #0; \
50 bne LOCAL_LABEL(tryatomic_##op); \
51- dmb; \
52+ DMB; \
53 pop { r4, r5, r6, pc }
54
55 #define MINMAX_4(rD, rN, rM, cmp_kind) \
56diff --git a/lib/builtins/assembly.h b/lib/builtins/assembly.h
57index 69a3d8620f924..06aa18162e3b4 100644
58--- a/lib/builtins/assembly.h
59+++ b/lib/builtins/assembly.h
60@@ -189,6 +189,14 @@
61 JMP(ip)
62 #endif
63
64+#if __ARM_ARCH >= 7
65+#define DMB dmb
66+#elif __ARM_ARCH >= 6
67+#define DMB mcr p15, #0, r0, c7, c10, #5
68+#else
69+#error only supported on ARMv6+
70+#endif
71+
72 #if defined(USE_THUMB_2)
73 #define WIDE(op) op.w
74 #else
75