Skip to content

Commit 8e6ec9a

Browse files
committed
Fixes to unblock building LLVM and Clang as Arm64EC
1 parent aa1b416 commit 8e6ec9a

File tree

5 files changed

+30
-21
lines changed

5 files changed

+30
-21
lines changed

clang/tools/clang-repl/CMakeLists.txt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ if(MSVC)
1919
set_target_properties(clang-repl PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS 1)
2020

2121
# RTTI/C++ symbols
22-
set(clang_repl_exports ${clang_repl_exports} ??_7type_info@@6B@
23-
?__type_info_root_node@@3U__type_info_node@@A
24-
?nothrow@std@@3Unothrow_t@1@B
22+
set(clang_repl_exports ${clang_repl_exports} ??_7type_info@@6B@,DATA
23+
?__type_info_root_node@@3U__type_info_node@@A,DATA
24+
?nothrow@std@@3Unothrow_t@1@B,DATA
2525
)
2626

2727
# Compiler added symbols for static variables. NOT for VStudio < 2015
28-
set(clang_repl_exports ${clang_repl_exports} _Init_thread_abort _Init_thread_epoch
29-
_Init_thread_footer _Init_thread_header _tls_index
28+
set(clang_repl_exports ${clang_repl_exports} _Init_thread_abort _Init_thread_epoch,DATA
29+
_Init_thread_footer _Init_thread_header _tls_index,DATA
3030
)
3131

3232
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
@@ -50,7 +50,10 @@ if(MSVC)
5050
endif()
5151

5252
# List to '/EXPORT:sym0 /EXPORT:sym1 /EXPORT:sym2 ...'
53-
list(TRANSFORM clang_repl_exports PREPEND "LINKER:/EXPORT:")
53+
# The 'SHELL' prefix tells CMake to use a space instead of comma as the
54+
# separator between the driver and linker options, which we need since MSVC's
55+
# linker uses `,DATA` as a suffix to indicate that data is being exported.
56+
list(TRANSFORM clang_repl_exports PREPEND "LINKER:SHELL:/EXPORT:")
5457

5558
set_property(TARGET clang-repl APPEND PROPERTY LINK_OPTIONS ${clang_repl_exports})
5659

llvm/lib/Support/BLAKE3/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ endmacro()
2626
if (CAN_USE_ASSEMBLER)
2727
if (MSVC)
2828
check_symbol_exists(_M_X64 "" IS_X64)
29-
if (IS_X64)
29+
check_symbol_exists(_M_ARM64EC "" IS_ARM64EC)
30+
if (IS_X64 AND NOT IS_ARM64EC)
3031
enable_language(ASM_MASM)
3132
set(LLVM_BLAKE3_ASM_FILES
3233
blake3_sse2_x86-64_windows_msvc.asm

llvm/lib/TargetParser/Host.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -587,8 +587,9 @@ StringRef sys::detail::getHostCPUNameForBPF() {
587587
#endif
588588
}
589589

590-
#if defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || \
591-
defined(_M_X64)
590+
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || \
591+
defined(_M_X64)) && \
592+
!defined(_M_ARM64EC)
592593

593594
/// getX86CpuIDAndInfo - Execute the specified cpuid and return the 4 values in
594595
/// the specified arguments. If we can't run cpuid on the host, return true.
@@ -1853,8 +1854,9 @@ VendorSignatures getVendorSignature(unsigned *MaxLeaf) {
18531854
} // namespace llvm
18541855
#endif
18551856

1856-
#if defined(__i386__) || defined(_M_IX86) || \
1857-
defined(__x86_64__) || defined(_M_X64)
1857+
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || \
1858+
defined(_M_X64)) && \
1859+
!defined(_M_ARM64EC)
18581860
StringMap<bool> sys::getHostCPUFeatures() {
18591861
unsigned EAX = 0, EBX = 0, ECX = 0, EDX = 0;
18601862
unsigned MaxLevel;
@@ -2147,7 +2149,8 @@ StringMap<bool> sys::getHostCPUFeatures() {
21472149

21482150
return Features;
21492151
}
2150-
#elif defined(_WIN32) && (defined(__aarch64__) || defined(_M_ARM64))
2152+
#elif defined(_WIN32) && (defined(__aarch64__) || defined(_M_ARM64) || \
2153+
defined(__arm64ec__) || defined(_M_ARM64EC))
21512154
StringMap<bool> sys::getHostCPUFeatures() {
21522155
StringMap<bool> Features;
21532156

llvm/tools/llvm-exegesis/lib/X86/Target.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,12 @@
3030
#include <memory>
3131
#include <string>
3232
#include <vector>
33-
#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
33+
#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) && \
34+
!defined(_M_ARM64EC)
3435
#include <immintrin.h>
3536
#include <intrin.h>
3637
#endif
37-
#if defined(_MSC_VER) && defined(_M_X64)
38+
#if defined(_MSC_VER) && defined(_M_X64) && !defined(_M_ARM64EC)
3839
#include <float.h> // For _clearfp in ~X86SavedState().
3940
#endif
4041

@@ -654,7 +655,7 @@ namespace {
654655
class X86SavedState : public ExegesisTarget::SavedState {
655656
public:
656657
X86SavedState() {
657-
#if defined(_MSC_VER) && defined(_M_X64)
658+
#if defined(_MSC_VER) && defined(_M_X64) && !defined(_M_ARM64EC)
658659
_fxsave64(FPState);
659660
Eflags = __readeflags();
660661
#elif defined(__GNUC__) && defined(__x86_64__)
@@ -668,7 +669,7 @@ class X86SavedState : public ExegesisTarget::SavedState {
668669
~X86SavedState() {
669670
// Restoring the X87 state does not flush pending exceptions, make sure
670671
// these exceptions are flushed now.
671-
#if defined(_MSC_VER) && defined(_M_X64)
672+
#if defined(_MSC_VER) && defined(_M_X64) && !defined(_M_ARM64EC)
672673
_clearfp();
673674
_fxrstor64(FPState);
674675
__writeeflags(Eflags);
@@ -682,7 +683,7 @@ class X86SavedState : public ExegesisTarget::SavedState {
682683
}
683684

684685
private:
685-
#if defined(__x86_64__) || defined(_M_X64)
686+
#if defined(__x86_64__) || defined(_M_X64) && !defined(_M_ARM64EC)
686687
alignas(16) char FPState[512];
687688
uint64_t Eflags;
688689
#endif
@@ -824,8 +825,9 @@ class ExegesisX86Target : public ExegesisTarget {
824825
// For now, only do the check if we see an Intel machine because
825826
// the counter uses some intel-specific magic and it could
826827
// be confuse and think an AMD machine actually has LBR support.
827-
#if defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || \
828-
defined(_M_X64)
828+
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || \
829+
defined(_M_X64)) && \
830+
!defined(_M_ARM64EC)
829831
using namespace sys::detail::x86;
830832

831833
if (getVendorSignature() == VendorSignatures::GENUINE_INTEL)

third-party/benchmark/src/cycleclock.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ inline BENCHMARK_ALWAYS_INLINE int64_t Now() {
7979
int64_t ret;
8080
__asm__ volatile("rdtsc" : "=A"(ret));
8181
return ret;
82-
#elif defined(__x86_64__) || defined(__amd64__)
82+
#elif (defined(__x86_64__) || defined(__amd64__)) && !defined(__arm64ec__)
8383
uint64_t low, high;
8484
__asm__ volatile("rdtsc" : "=a"(low), "=d"(high));
8585
return (high << 32) | low;
@@ -139,7 +139,7 @@ inline BENCHMARK_ALWAYS_INLINE int64_t Now() {
139139
struct timespec ts = {0, 0};
140140
clock_gettime(CLOCK_MONOTONIC, &ts);
141141
return static_cast<int64_t>(ts.tv_sec) * 1000000000 + ts.tv_nsec;
142-
#elif defined(__aarch64__)
142+
#elif defined(__aarch64__) || defined(__arm64ec__)
143143
// System timer of ARMv8 runs at a different frequency than the CPU's.
144144
// The frequency is fixed, typically in the range 1-50MHz. It can be
145145
// read at CNTFRQ special register. We assume the OS has set up

0 commit comments

Comments
 (0)