Patches 1-2 are just rebased from the earlier version for clang 3.8, no changes in surrounding code there. Patch 3 is necessary to fix a regression in assembling standalone assembly files in 3.9. Patch 4 makes clang work in MSVC mode with the MSVC SDK for ARM (to simplify testing of the toolchain in that mode).
127 lines
4.1 KiB
Diff
127 lines
4.1 KiB
Diff
From b9f0418bc4b3f7869d549bb020271c19e69cce26 Mon Sep 17 00:00:00 2001
|
|
From: Saleem Abdulrasool <compnerd@compnerd.org>
|
|
Date: Sat, 6 Aug 2016 17:58:24 +0000
|
|
Subject: [PATCH 4/4] Headers: Add ARM support to intrin.h for MSVC
|
|
compatibility
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
This fixes compiling with headers from the Windows SDK for ARM, where the
|
|
YieldProcessor function (in winnt.h) refers to _ARM_BARRIER_ISHST.
|
|
|
|
The actual MSVC armintr.h contains a lot more definitions, but this is enough to
|
|
build code that uses the Windows SDK but doesn't use ARM intrinsics directly.
|
|
|
|
An alternative would to just keep the addition to intrin.h (to include
|
|
armintr.h), but not actually ship armintr.h, instead having clang's intrin.h
|
|
include armintr.h from MSVC's include directory. (That one works fine with
|
|
clang, at least for building code that uses the Windows SDK.)
|
|
|
|
Patch by Martin Storsjö!
|
|
|
|
Cherry-picked from SVN trunk commit 277928, git mirror commit
|
|
cfc8939a5f1.
|
|
---
|
|
lib/Headers/CMakeLists.txt | 1 +
|
|
lib/Headers/armintr.h | 45 +++++++++++++++++++++++++++++++++++++++++++++
|
|
lib/Headers/intrin.h | 4 ++++
|
|
test/Headers/ms-intrin.cpp | 4 ++++
|
|
4 files changed, 54 insertions(+)
|
|
create mode 100644 lib/Headers/armintr.h
|
|
|
|
diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt
|
|
index 657ef7e..600fece 100644
|
|
--- a/lib/Headers/CMakeLists.txt
|
|
+++ b/lib/Headers/CMakeLists.txt
|
|
@@ -3,6 +3,7 @@ set(files
|
|
altivec.h
|
|
ammintrin.h
|
|
arm_acle.h
|
|
+ armintr.h
|
|
avx2intrin.h
|
|
avx512bwintrin.h
|
|
avx512cdintrin.h
|
|
diff --git a/lib/Headers/armintr.h b/lib/Headers/armintr.h
|
|
new file mode 100644
|
|
index 0000000..933afcb
|
|
--- /dev/null
|
|
+++ b/lib/Headers/armintr.h
|
|
@@ -0,0 +1,45 @@
|
|
+/*===---- armintr.h - ARM Windows intrinsics -------------------------------===
|
|
+ *
|
|
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
+ * of this software and associated documentation files (the "Software"), to deal
|
|
+ * in the Software without restriction, including without limitation the rights
|
|
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
+ * copies of the Software, and to permit persons to whom the Software is
|
|
+ * furnished to do so, subject to the following conditions:
|
|
+ *
|
|
+ * The above copyright notice and this permission notice shall be included in
|
|
+ * all copies or substantial portions of the Software.
|
|
+ *
|
|
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
+ * THE SOFTWARE.
|
|
+ *
|
|
+ *===-----------------------------------------------------------------------===
|
|
+ */
|
|
+
|
|
+/* Only include this if we're compiling for the windows platform. */
|
|
+#ifndef _MSC_VER
|
|
+#include_next <armintr.h>
|
|
+#else
|
|
+
|
|
+#ifndef __ARMINTR_H
|
|
+#define __ARMINTR_H
|
|
+
|
|
+typedef enum
|
|
+{
|
|
+ _ARM_BARRIER_SY = 0xF,
|
|
+ _ARM_BARRIER_ST = 0xE,
|
|
+ _ARM_BARRIER_ISH = 0xB,
|
|
+ _ARM_BARRIER_ISHST = 0xA,
|
|
+ _ARM_BARRIER_NSH = 0x7,
|
|
+ _ARM_BARRIER_NSHST = 0x6,
|
|
+ _ARM_BARRIER_OSH = 0x3,
|
|
+ _ARM_BARRIER_OSHST = 0x2
|
|
+} _ARMINTR_BARRIER_TYPE;
|
|
+
|
|
+#endif /* __ARMINTR_H */
|
|
+#endif /* _MSC_VER */
|
|
diff --git a/lib/Headers/intrin.h b/lib/Headers/intrin.h
|
|
index f18711a..268ac4a 100644
|
|
--- a/lib/Headers/intrin.h
|
|
+++ b/lib/Headers/intrin.h
|
|
@@ -34,6 +34,10 @@
|
|
#include <x86intrin.h>
|
|
#endif
|
|
|
|
+#if defined(__arm__)
|
|
+#include <armintr.h>
|
|
+#endif
|
|
+
|
|
/* For the definition of jmp_buf. */
|
|
#if __STDC_HOSTED__
|
|
#include <setjmp.h>
|
|
diff --git a/test/Headers/ms-intrin.cpp b/test/Headers/ms-intrin.cpp
|
|
index c697428..25c5531 100644
|
|
--- a/test/Headers/ms-intrin.cpp
|
|
+++ b/test/Headers/ms-intrin.cpp
|
|
@@ -60,4 +60,8 @@ void f() {
|
|
__readcr3();
|
|
__writecr3(0);
|
|
#endif
|
|
+
|
|
+#ifdef _M_ARM
|
|
+ __dmb(_ARM_BARRIER_ISHST);
|
|
+#endif
|
|
}
|
|
--
|
|
2.7.4
|
|
|