Skip to content

Commit 73cfcb4

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

File tree

4 files changed

+23
-20
lines changed

4 files changed

+23
-20
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/TargetParser/Host.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -587,8 +587,8 @@ 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)) && !defined(_M_ARM64EC)
592592

593593
/// getX86CpuIDAndInfo - Execute the specified cpuid and return the 4 values in
594594
/// the specified arguments. If we can't run cpuid on the host, return true.
@@ -1853,8 +1853,8 @@ VendorSignatures getVendorSignature(unsigned *MaxLeaf) {
18531853
} // namespace llvm
18541854
#endif
18551855

1856-
#if defined(__i386__) || defined(_M_IX86) || \
1857-
defined(__x86_64__) || defined(_M_X64)
1856+
#if (defined(__i386__) || defined(_M_IX86) || \
1857+
defined(__x86_64__) || defined(_M_X64)) && !defined(_M_ARM64EC)
18581858
StringMap<bool> sys::getHostCPUFeatures() {
18591859
unsigned EAX = 0, EBX = 0, ECX = 0, EDX = 0;
18601860
unsigned MaxLevel;
@@ -2067,7 +2067,7 @@ StringMap<bool> sys::getHostCPUFeatures() {
20672067

20682068
return Features;
20692069
}
2070-
#elif defined(__linux__) && (defined(__arm__) || defined(__aarch64__))
2070+
#elif defined(__linux__) && (defined(__arm__) || defined(__aarch64__) || defined(__arm64ec__))
20712071
StringMap<bool> sys::getHostCPUFeatures() {
20722072
StringMap<bool> Features;
20732073
std::unique_ptr<llvm::MemoryBuffer> P = getProcCpuinfoContent();

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@
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)) && !defined(_M_ARM64EC)
3434
#include <immintrin.h>
3535
#include <intrin.h>
3636
#endif
37-
#if defined(_MSC_VER) && defined(_M_X64)
37+
#if defined(_MSC_VER) && defined(_M_X64) && !defined(_M_ARM64EC)
3838
#include <float.h> // For _clearfp in ~X86SavedState().
3939
#endif
4040

@@ -654,7 +654,7 @@ namespace {
654654
class X86SavedState : public ExegesisTarget::SavedState {
655655
public:
656656
X86SavedState() {
657-
#if defined(_MSC_VER) && defined(_M_X64)
657+
#if defined(_MSC_VER) && defined(_M_X64) && !defined(_M_ARM64EC)
658658
_fxsave64(FPState);
659659
Eflags = __readeflags();
660660
#elif defined(__GNUC__) && defined(__x86_64__)
@@ -668,7 +668,7 @@ class X86SavedState : public ExegesisTarget::SavedState {
668668
~X86SavedState() {
669669
// Restoring the X87 state does not flush pending exceptions, make sure
670670
// these exceptions are flushed now.
671-
#if defined(_MSC_VER) && defined(_M_X64)
671+
#if defined(_MSC_VER) && defined(_M_X64) && !defined(_M_ARM64EC)
672672
_clearfp();
673673
_fxrstor64(FPState);
674674
__writeeflags(Eflags);
@@ -682,7 +682,7 @@ class X86SavedState : public ExegesisTarget::SavedState {
682682
}
683683

684684
private:
685-
#if defined(__x86_64__) || defined(_M_X64)
685+
#if defined(__x86_64__) || defined(_M_X64) && !defined(_M_ARM64EC)
686686
alignas(16) char FPState[512];
687687
uint64_t Eflags;
688688
#endif
@@ -824,8 +824,8 @@ class ExegesisX86Target : public ExegesisTarget {
824824
// For now, only do the check if we see an Intel machine because
825825
// the counter uses some intel-specific magic and it could
826826
// 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)
827+
#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || \
828+
defined(_M_X64)) && !defined(_M_ARM64EC)
829829
using namespace sys::detail::x86;
830830

831831
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)