Skip to content

Commit 95fab8f

Browse files
committed
👷 Add clang-20 support
Problem: - clang-20 is stable and not yet used to compile this repo. Solution: - Add clang-20 support to CI.
1 parent f9d0f56 commit 95fab8f

File tree

4 files changed

+70
-50
lines changed

4 files changed

+70
-50
lines changed

.github/workflows/unit_tests.yml

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ env:
1313
DEBIAN_FRONTEND: noninteractive
1414
CMAKE_GENERATOR: Ninja
1515
DEFAULT_CXX_STANDARD: 20
16-
DEFAULT_LLVM_VERSION: 19
16+
DEFAULT_LLVM_VERSION: 20
1717
DEFAULT_GCC_VERSION: 13
1818

1919
concurrency:
@@ -27,7 +27,7 @@ jobs:
2727
fail-fast: false
2828
matrix:
2929
compiler: [clang, gcc]
30-
version: [12, 13, 16, 17, 18, 19]
30+
version: [12, 13, 16, 17, 18, 19, 20]
3131
cxx_standard: [20]
3232
stdlib: [libstdc++, libc++]
3333
build_type: [Debug]
@@ -36,6 +36,15 @@ jobs:
3636
cc: "clang"
3737
cxx: "clang++"
3838
cxx_flags: "-stdlib=libstdc++"
39+
- version: 20
40+
compiler: clang
41+
install: wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && sudo ./llvm.sh 20
42+
toolchain_root: "/usr/lib/llvm-20"
43+
- version: 20
44+
compiler: clang
45+
stdlib: libc++
46+
install: wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && sudo ./llvm.sh 20 && sudo apt install -y libc++-20-dev libc++abi-20-dev
47+
cxx_flags: "-stdlib=libc++"
3948
- version: 19
4049
compiler: clang
4150
install: wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && sudo ./llvm.sh 19
@@ -87,6 +96,8 @@ jobs:
8796
cxx: "g++-12"
8897
cxx_flags: ""
8998
exclude:
99+
- compiler: gcc
100+
version: 20
90101
- compiler: gcc
91102
version: 19
92103
- compiler: gcc
@@ -289,8 +300,8 @@ jobs:
289300
- compiler: clang
290301
cc: "clang"
291302
cxx: "clang++"
292-
install: wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && sudo ./llvm.sh 19
293-
toolchain_root: "/usr/lib/llvm-19"
303+
install: wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && sudo ./llvm.sh 20
304+
toolchain_root: "/usr/lib/llvm-20"
294305
- compiler: gcc
295306
cc: "gcc-13"
296307
cxx: "g++-13"

CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ else()
1414
endif()
1515

1616
add_versioned_package("gh:boostorg/mp11#boost-1.83.0")
17-
add_versioned_package("gh:intel/cpp-baremetal-concurrency#7c5b26c")
18-
add_versioned_package("gh:intel/cpp-std-extensions#5530b5d")
19-
add_versioned_package("gh:intel/cpp-baremetal-senders-and-receivers#73d95bc")
17+
add_versioned_package("gh:intel/cpp-baremetal-concurrency#0ddce52")
18+
add_versioned_package("gh:intel/cpp-std-extensions#7e1cbc7")
19+
add_versioned_package("gh:intel/cpp-baremetal-senders-and-receivers#22c8006")
2020
add_versioned_package("gh:intel/safe-arithmetic#9ea549a")
2121

2222
find_package(Python3 COMPONENTS Interpreter)

test/mmio_bus.cpp

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <catch2/catch_test_macros.hpp>
1010

11+
#include <cstddef>
1112
#include <cstdint>
1213

1314
namespace {
@@ -45,58 +46,61 @@ TEST_CASE("subword write optimization", "[mmio_bus]") {
4546
iface::num_loads = {};
4647

4748
SECTION("write the whole register") {
48-
bus::write<0xffff'ffffu, 0u, 0u>(addr32, 0xc001'd00du) |
49-
async::sync_wait();
49+
CHECK(bus::write<0xffff'ffffu, 0u, 0u>(addr32, 0xc001'd00du) |
50+
async::sync_wait());
5051

5152
CHECK(iface::num_stores == 1);
5253
CHECK(iface::num_loads == 0);
5354
CHECK(reg32 == 0xc001'd00du);
5455
}
5556

5657
SECTION("write byte 0") {
57-
bus::write<0xffu, 0u, 0u>(addr32, 0x38u) | async::sync_wait();
58+
CHECK(bus::write<0xffu, 0u, 0u>(addr32, 0x38u) | async::sync_wait());
5859

5960
CHECK(iface::num_stores == 1);
6061
CHECK(iface::num_loads == 0);
6162
CHECK(reg32 == 0x8765'4338u);
6263
}
6364

6465
SECTION("write byte 1") {
65-
bus::write<0xff00u, 0u, 0u>(addr32, 0x4200u) | async::sync_wait();
66+
CHECK(bus::write<0xff00u, 0u, 0u>(addr32, 0x4200u) |
67+
async::sync_wait());
6668

6769
CHECK(iface::num_stores == 1);
6870
CHECK(iface::num_loads == 0);
6971
CHECK(reg32 == 0x8765'4221u);
7072
}
7173

7274
SECTION("write byte 2") {
73-
bus::write<0xff'0000u, 0u, 0u>(addr32, 0x55'0000u) | async::sync_wait();
75+
CHECK(bus::write<0xff'0000u, 0u, 0u>(addr32, 0x55'0000u) |
76+
async::sync_wait());
7477

7578
CHECK(iface::num_stores == 1);
7679
CHECK(iface::num_loads == 0);
7780
CHECK(reg32 == 0x8755'4321u);
7881
}
7982

8083
SECTION("write byte 3") {
81-
bus::write<0xff00'0000u, 0u, 0u>(addr32, 0x1300'0000u) |
82-
async::sync_wait();
84+
CHECK(bus::write<0xff00'0000u, 0u, 0u>(addr32, 0x1300'0000u) |
85+
async::sync_wait());
8386

8487
CHECK(iface::num_stores == 1);
8588
CHECK(iface::num_loads == 0);
8689
CHECK(reg32 == 0x1365'4321u);
8790
}
8891

8992
SECTION("write word at offset 0") {
90-
bus::write<0xffffu, 0u, 0u>(addr32, 0xd00du) | async::sync_wait();
93+
CHECK(bus::write<0xffffu, 0u, 0u>(addr32, 0xd00du) |
94+
async::sync_wait());
9195

9296
CHECK(iface::num_stores == 1);
9397
CHECK(iface::num_loads == 0);
9498
CHECK(reg32 == 0x8765'd00du);
9599
}
96100

97101
SECTION("write word at offset 2") {
98-
bus::write<0xffff'0000u, 0u, 0u>(addr32, 0x6502'0000u) |
99-
async::sync_wait();
102+
CHECK(bus::write<0xffff'0000u, 0u, 0u>(addr32, 0x6502'0000u) |
103+
async::sync_wait());
100104

101105
CHECK(iface::num_stores == 1);
102106
CHECK(iface::num_loads == 0);
@@ -110,15 +114,16 @@ TEST_CASE("read-modify-write", "[mmio_bus]") {
110114
iface::num_loads = {};
111115

112116
SECTION("write a single bit") {
113-
bus::write<0x1u, 0u, 0u>(addr32, 0u) | async::sync_wait();
117+
CHECK(bus::write<0x1u, 0u, 0u>(addr32, 0u) | async::sync_wait());
114118

115119
CHECK(iface::num_stores == 1);
116120
CHECK(iface::num_loads == 1);
117121
CHECK(reg32 == 0xffff'fffeu);
118122
}
119123

120124
SECTION("write a nibble") {
121-
bus::write<0xf000u, 0u, 0u>(addr32, 0x7000u) | async::sync_wait();
125+
CHECK(bus::write<0xf000u, 0u, 0u>(addr32, 0x7000u) |
126+
async::sync_wait());
122127

123128
CHECK(iface::num_stores == 1);
124129
CHECK(iface::num_loads == 1);
@@ -132,89 +137,91 @@ TEST_CASE("idmask write optimization", "[mmio_bus]") {
132137
iface::num_loads = {};
133138

134139
SECTION("write bit in byte 0") {
135-
bus::write<0x1u, 0xffff'fffeu, 0xffff'fffeu>(addr32, 0u) |
136-
async::sync_wait();
140+
CHECK(bus::write<0x1u, 0xffff'fffeu, 0xffff'fffeu>(addr32, 0u) |
141+
async::sync_wait());
137142

138143
CHECK(iface::num_stores == 1);
139144
CHECK(iface::num_loads == 0);
140145
CHECK(reg32 == 0xffff'fffeu);
141146
}
142147
SECTION("write bit in byte 0 - requires subword write") {
143-
bus::write<0x1u, 0xfeu, 0xfeu>(addr32, 0u) | async::sync_wait();
148+
CHECK(bus::write<0x1u, 0xfeu, 0xfeu>(addr32, 0u) | async::sync_wait());
144149

145150
CHECK(iface::num_stores == 1);
146151
CHECK(iface::num_loads == 0);
147152
CHECK(reg32 == 0xffff'fffeu);
148153
}
149154

150155
SECTION("write nibble in byte 1") {
151-
bus::write<0x0f00u, 0xffff'f0ffu, 0xffff'f0ffu>(addr32, 0x0300u) |
152-
async::sync_wait();
156+
CHECK(bus::write<0x0f00u, 0xffff'f0ffu, 0xffff'f0ffu>(addr32, 0x0300u) |
157+
async::sync_wait());
153158

154159
CHECK(iface::num_stores == 1);
155160
CHECK(iface::num_loads == 0);
156161
CHECK(reg32 == 0xffff'f3ffu);
157162
}
158163

159164
SECTION("write nibble in byte 1 - requires subword write") {
160-
bus::write<0x0f00u, 0xf0ffu, 0xf0ffu>(addr32, 0x0300u) |
161-
async::sync_wait();
165+
CHECK(bus::write<0x0f00u, 0xf0ffu, 0xf0ffu>(addr32, 0x0300u) |
166+
async::sync_wait());
162167

163168
CHECK(iface::num_stores == 1);
164169
CHECK(iface::num_loads == 0);
165170
CHECK(reg32 == 0xffff'f3ffu);
166171
}
167172

168173
SECTION("write across two bytes - requires subword write") {
169-
bus::write<0x0ff0u, 0xf00fu, 0xf00fu>(addr32, 0x0340u) |
170-
async::sync_wait();
174+
CHECK(bus::write<0x0ff0u, 0xf00fu, 0xf00fu>(addr32, 0x0340u) |
175+
async::sync_wait());
171176

172177
CHECK(iface::num_stores == 1);
173178
CHECK(iface::num_loads == 0);
174179
CHECK(reg32 == 0xffff'f34fu);
175180
}
176181

177182
SECTION("write nibble in byte 2") {
178-
bus::write<0xf0'0000u, 0xff0f'ffffu, 0xff0f'ffffu>(addr32, 0x40'0000u) |
179-
async::sync_wait();
183+
CHECK(bus::write<0xf0'0000u, 0xff0f'ffffu, 0xff0f'ffffu>(addr32,
184+
0x40'0000u) |
185+
async::sync_wait());
180186

181187
CHECK(iface::num_stores == 1);
182188
CHECK(iface::num_loads == 0);
183189
CHECK(reg32 == 0xff4f'ffffu);
184190
}
185191

186192
SECTION("write nibble in byte 3") {
187-
bus::write<0x0f00'0000u, 0xf0ff'ffffu, 0xf0ff'ffffu>(addr32,
188-
0x1300'0000u) |
189-
async::sync_wait();
193+
CHECK(bus::write<0x0f00'0000u, 0xf0ff'ffffu, 0xf0ff'ffffu>(
194+
addr32, 0x1300'0000u) |
195+
async::sync_wait());
190196

191197
CHECK(iface::num_stores == 1);
192198
CHECK(iface::num_loads == 0);
193199
CHECK(reg32 == 0xf3ff'ffffu);
194200
}
195201

196202
SECTION("write across three bytes") {
197-
bus::write<0xff'ffffu, 0xff00'0000u, 0xff00'0000u>(addr32, 0x41'd00du) |
198-
async::sync_wait();
203+
CHECK(bus::write<0xff'ffffu, 0xff00'0000u, 0xff00'0000u>(addr32,
204+
0x41'd00du) |
205+
async::sync_wait());
199206

200207
CHECK(iface::num_stores == 1);
201208
CHECK(iface::num_loads == 0);
202209
CHECK(reg32 == 0xff41'd00du);
203210
}
204211

205212
SECTION("write across three bytes - check id bit write") {
206-
bus::write<0x00ff'ffffu, 0xff00'0000u, 0u>(addr32, 0x41'd00du) |
207-
async::sync_wait();
213+
CHECK(bus::write<0x00ff'ffffu, 0xff00'0000u, 0u>(addr32, 0x41'd00du) |
214+
async::sync_wait());
208215

209216
CHECK(iface::num_stores == 1);
210217
CHECK(iface::num_loads == 0);
211218
CHECK(reg32 == 0x0041'd00du);
212219
}
213220

214221
SECTION("write across three bytes - start at byte 1") {
215-
bus::write<0xffff'ff00u, 0x0000'00ffu, 0x0000'00ffu>(addr32,
216-
0x41d0'0d00u) |
217-
async::sync_wait();
222+
CHECK(bus::write<0xffff'ff00u, 0x0000'00ffu, 0x0000'00ffu>(
223+
addr32, 0x41d0'0d00u) |
224+
async::sync_wait());
218225

219226
CHECK(iface::num_stores == 1);
220227
CHECK(iface::num_loads == 0);

test/write.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -113,22 +113,24 @@ TEST_CASE("write mask is passed to bus", "[write]") {
113113

114114
TEST_CASE("write is pipeable", "[write]") {
115115
using namespace groov::literals;
116-
async::just(grp("reg0"_r = 0xa5a5'a5a5u)) | groov::write |
117-
async::sync_wait();
116+
auto r = async::just(grp("reg0"_r = 0xa5a5'a5a5u)) | groov::write |
117+
async::sync_wait();
118+
CHECK(r);
118119
CHECK(data0 == 0xa5a5'a5a5u);
119120
}
120121

121122
TEST_CASE("piped read-modify-write", "[write]") {
122123
using namespace groov::literals;
123124
data0 = 0xa5u;
124-
async::just(grp / "reg0"_r) //
125-
| groov::read //
126-
| async::then([](auto spec) {
127-
spec["reg0"_r] ^= 0xff;
128-
return spec;
129-
}) //
130-
| groov::write //
131-
| async::sync_wait();
125+
auto r = async::just(grp / "reg0"_r) //
126+
| groov::read //
127+
| async::then([](auto spec) {
128+
spec["reg0"_r] ^= 0xff;
129+
return spec;
130+
}) //
131+
| groov::write //
132+
| async::sync_wait();
133+
CHECK(r);
132134
CHECK(data0 == 0x5au);
133135
}
134136

0 commit comments

Comments
 (0)