Skip to content

Commit d525775

Browse files
Test windows arm in CI (#318)
1 parent e161778 commit d525775

File tree

5 files changed

+91
-11
lines changed

5 files changed

+91
-11
lines changed

.github/workflows/ci.yml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,25 @@ jobs:
164164
- name: build and test
165165
run: |
166166
python3 ci/test-all-configs.py --${{matrix.compiler}} --default-config ${{matrix.shared}}
167+
test-windows-arm:
168+
runs-on: windows-11-arm
169+
strategy:
170+
fail-fast: false
171+
matrix:
172+
compiler: [msvc, clang]
173+
shared: [--shared, ""]
174+
steps:
175+
- uses: actions/checkout@v4
176+
- name: Enable Developer Command Prompt
177+
uses: ilammy/msvc-dev-cmd@v1.13.0
178+
with:
179+
arch: arm64
180+
- name: dependencies
181+
run: |
182+
pip3 install colorama
183+
- name: build and test
184+
run: |
185+
python3 ci/test-all-configs.py --${{matrix.compiler}} --default-config ${{matrix.shared}}
167186
test-windows-old:
168187
runs-on: windows-2022
169188
strategy:
@@ -811,6 +830,32 @@ jobs:
811830
cmake --build . --config ${{matrix.build_type}}
812831
./${{matrix.build_type}}/unittest
813832
# TODO: Macos, mingw
833+
unittest-windows-arm:
834+
runs-on: windows-11-arm
835+
strategy:
836+
fail-fast: false
837+
matrix:
838+
compiler: [cl, clang++]
839+
shared: [OFF]
840+
build_type: [Debug, RelWithDebInfo]
841+
steps:
842+
- uses: actions/checkout@v4
843+
- name: Enable Developer Command Prompt
844+
uses: ilammy/msvc-dev-cmd@v1.13.0
845+
with:
846+
arch: arm64
847+
- name: build and test
848+
run: |
849+
mkdir build
850+
cd build
851+
cmake .. `
852+
-DCMAKE_CXX_COMPILER=${{matrix.compiler}} `
853+
-DCMAKE_C_COMPILER=${{matrix.compiler == 'clang++' && 'clang' || matrix.compiler}} `
854+
-DBUILD_SHARED_LIBS=${{matrix.shared}} `
855+
-DCPPTRACE_WERROR_BUILD=On `
856+
-DCPPTRACE_BUILD_TESTING=On
857+
cmake --build . --config ${{matrix.build_type}}
858+
./${{matrix.build_type}}/unittest
814859
815860
unittest-linux-modules:
816861
runs-on: ubuntu-24.04

cmake/Autoconfig.cmake

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,10 @@ if(
105105
message(FATAL_ERROR "Cpptrace auto config: No unwinding back-end seems to be supported, stack tracing will not work. To compile anyway set CPPTRACE_UNWIND_WITH_NOTHING.")
106106
endif()
107107
elseif(MINGW OR WIN32)
108-
if(HAS_STACKWALK)
108+
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(ARM64|AARCH64|aarch64)$")
109+
set(CPPTRACE_UNWIND_WITH_RTLVIRTUALUNWIND On)
110+
message(STATUS "Cpptrace auto config: Using RtlVirtualUnwind for unwinding")
111+
elseif(HAS_STACKWALK)
109112
set(CPPTRACE_UNWIND_WITH_DBGHELP On)
110113
message(STATUS "Cpptrace auto config: Using dbghelp for unwinding")
111114
else()

cmake/has_stackwalk.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ int main() {
7474
frame.AddrFrame.Mode = AddrModeFlat;
7575
frame.AddrStack.Offset = context.Rsp;
7676
frame.AddrStack.Mode = AddrModeFlat;
77-
#elif defined(_M_IA64) || defined(__aarch64__)
77+
#elif defined(_M_IA64)
7878
machine_type = IMAGE_FILE_MACHINE_IA64;
7979
frame.AddrPC.Offset = context.StIIP;
8080
frame.AddrPC.Mode = AddrModeFlat;
@@ -84,6 +84,22 @@ int main() {
8484
frame.AddrBStore.Mode = AddrModeFlat;
8585
frame.AddrStack.Offset = context.IntSp;
8686
frame.AddrStack.Mode = AddrModeFlat;
87+
#elif defined(_M_ARM) || defined(__arm__)
88+
machine_type = IMAGE_FILE_MACHINE_ARM;
89+
frame.AddrPC.Offset = context.Pc;
90+
frame.AddrPC.Mode = AddrModeFlat;
91+
frame.AddrFrame.Offset = context.R11;
92+
frame.AddrFrame.Mode = AddrModeFlat;
93+
frame.AddrStack.Offset = context.Sp;
94+
frame.AddrStack.Mode = AddrModeFlat;
95+
#elif defined(_M_ARM64) || defined(__aarch64__)
96+
machine_type = IMAGE_FILE_MACHINE_ARM64;
97+
frame.AddrPC.Offset = context.Pc;
98+
frame.AddrPC.Mode = AddrModeFlat;
99+
frame.AddrFrame.Offset = context.Fp;
100+
frame.AddrFrame.Mode = AddrModeFlat;
101+
frame.AddrStack.Offset = context.Sp;
102+
frame.AddrStack.Mode = AddrModeFlat;
87103
#else
88104
#error "Cpptrace: StackWalk64 not supported for this platform yet"
89105
#endif

test/unit/tracing/raw_trace.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,20 @@ import cpptrace;
2222

2323
#ifndef CPPTRACE_SANITIZER_BUILD
2424

25+
#if defined(_WIN32) && (defined(_M_ARM64) || defined(_M_ARM))
26+
static constexpr int raw_trace_fudge = 200;
27+
#else
28+
static constexpr int raw_trace_fudge = 100;
29+
#endif
30+
2531
// NOTE: MSVC likes creating trampoline-like entries for non-static functions
2632
CPPTRACE_FORCE_NO_INLINE static void raw_trace_basic() {
2733
static volatile int lto_guard; lto_guard = lto_guard + 1;
2834
auto raw_trace = cpptrace::generate_raw_trace();
2935
// look for within 90 bytes of the start of the function
3036
ASSERT_GE(raw_trace.frames.size(), 1);
3137
EXPECT_GE(raw_trace.frames[0], reinterpret_cast<uintptr_t>(raw_trace_basic));
32-
EXPECT_LE(raw_trace.frames[0], reinterpret_cast<uintptr_t>(raw_trace_basic) + 90);
38+
EXPECT_LE(raw_trace.frames[0], reinterpret_cast<uintptr_t>(raw_trace_basic) + raw_trace_fudge);
3339
}
3440

3541
#ifndef _MSC_VER
@@ -71,18 +77,18 @@ CPPTRACE_FORCE_NO_INLINE static void raw_trace_multi_2(
7177
auto raw_trace = cpptrace::generate_raw_trace();
7278
ASSERT_GE(raw_trace.frames.size(), 2);
7379
EXPECT_GE(raw_trace.frames[0], reinterpret_cast<uintptr_t>(raw_trace_multi_2));
74-
EXPECT_LE(raw_trace.frames[0], reinterpret_cast<uintptr_t>(raw_trace_multi_2) + 100);
80+
EXPECT_LE(raw_trace.frames[0], reinterpret_cast<uintptr_t>(raw_trace_multi_2) + raw_trace_fudge);
7581
EXPECT_GE(raw_trace.frames[1], parent_low_bound);
7682
EXPECT_LE(raw_trace.frames[1], parent_high_bound);
7783
}
7884

7985
CPPTRACE_FORCE_NO_INLINE static void raw_trace_multi_1() {
8086
static volatile int lto_guard; lto_guard = lto_guard + 1;
8187
auto raw_trace = cpptrace::generate_raw_trace();
82-
raw_trace_multi_2(reinterpret_cast<uintptr_t>(raw_trace_multi_1), reinterpret_cast<uintptr_t>(raw_trace_multi_1) + 300);
88+
raw_trace_multi_2(reinterpret_cast<uintptr_t>(raw_trace_multi_1), reinterpret_cast<uintptr_t>(raw_trace_multi_1) + raw_trace_fudge * 3);
8389
ASSERT_GE(raw_trace.frames.size(), 1);
8490
EXPECT_GE(raw_trace.frames[0], reinterpret_cast<uintptr_t>(raw_trace_multi_1));
85-
EXPECT_LE(raw_trace.frames[0], reinterpret_cast<uintptr_t>(raw_trace_multi_1) + 90);
91+
EXPECT_LE(raw_trace.frames[0], reinterpret_cast<uintptr_t>(raw_trace_multi_1) + raw_trace_fudge);
8692
}
8793

8894
std::vector<std::pair<cpptrace::frame_ptr, cpptrace::frame_ptr>> parents;

test/unit/tracing/try_catch.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,9 @@ TEST(TryCatch, Basic) {
7979
[&] (const std::runtime_error& e) {
8080
did_catch = true;
8181
EXPECT_EQ(e.what(), std::string("foobar"));
82-
check_trace(cpptrace::from_current_exception(), "try_catch.cpp", line);
82+
#if !(defined(_WIN32) && (defined(_M_ARM64) || defined(_M_ARM)))
83+
check_trace(cpptrace::from_current_exception(), "try_catch.cpp", line);
84+
#endif
8385
check_trace(cpptrace::from_current_exception(), test_name);
8486
}
8587
);
@@ -111,7 +113,9 @@ TEST(TryCatch, Upcast) {
111113
[&] (const std::exception& e) {
112114
did_catch = true;
113115
EXPECT_EQ(e.what(), std::string("foobar"));
114-
check_trace(cpptrace::from_current_exception(), "try_catch.cpp", line);
116+
#if !(defined(_WIN32) && (defined(_M_ARM64) || defined(_M_ARM)))
117+
check_trace(cpptrace::from_current_exception(), "try_catch.cpp", line);
118+
#endif
115119
check_trace(cpptrace::from_current_exception(), test_name);
116120
}
117121
);
@@ -173,7 +177,9 @@ TEST(TryCatch, CorrectHandler) {
173177
[&] (const std::runtime_error& e) {
174178
did_catch = true;
175179
EXPECT_EQ(e.what(), std::string("foobar"));
176-
check_trace(cpptrace::from_current_exception(), "try_catch.cpp", line);
180+
#if !(defined(_WIN32) && (defined(_M_ARM64) || defined(_M_ARM)))
181+
check_trace(cpptrace::from_current_exception(), "try_catch.cpp", line);
182+
#endif
177183
check_trace(cpptrace::from_current_exception(), test_name);
178184
},
179185
[&] (const std::exception&) {
@@ -203,7 +209,9 @@ TEST(TryCatch, BlanketHandler) {
203209
},
204210
[&] () {
205211
did_catch = true;
206-
check_trace(cpptrace::from_current_exception(), "try_catch.cpp", line);
212+
#if !(defined(_WIN32) && (defined(_M_ARM64) || defined(_M_ARM)))
213+
check_trace(cpptrace::from_current_exception(), "try_catch.cpp", line);
214+
#endif
207215
check_trace(cpptrace::from_current_exception(), test_name);
208216
}
209217
);
@@ -227,7 +235,9 @@ TEST(TryCatch, CatchOrdering) {
227235
},
228236
[&] () {
229237
did_catch = true;
230-
check_trace(cpptrace::from_current_exception(), "try_catch.cpp", line);
238+
#if !(defined(_WIN32) && (defined(_M_ARM64) || defined(_M_ARM)))
239+
check_trace(cpptrace::from_current_exception(), "try_catch.cpp", line);
240+
#endif
231241
check_trace(cpptrace::from_current_exception(), test_name);
232242
},
233243
[&] (const std::runtime_error&) {

0 commit comments

Comments
 (0)