authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-09-03 04:37:07+02:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-09-20 02:29:04+02:00
log5a142dfa5651ec21792de211a6e9341c31ab4dbb
tree97f0cd1f7e4ade5cf4f14617a3cf57eed88c1532
parente4ac063297fc9210ae3a97fa370ea8c6c216ec43

Address Spaces: LLVM F segment address space test


1 files changed, 50 insertions(+), 0 deletions(-)

test/stage2/llvm.zig+50
...@@ -372,4 +372,54 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -372,4 +372,54 @@ pub fn addCases(ctx: *TestContext) !void {
372 \\pub export fn main() void { _ = entry; }372 \\pub export fn main() void { _ = entry; }
373 );373 );
374 }374 }
375
376 {
377 var case = ctx.exeUsingLlvmBackend("f segment address space reading and writing", linux_x64);
378 case.addCompareOutput(
379 \\fn assert(ok: bool) void {
380 \\ if (!ok) unreachable;
381 \\}
382 \\
383 \\fn setFs(value: c_ulong) void {
384 \\ asm volatile (
385 \\ \\syscall
386 \\ :
387 \\ : [number] "{rax}" (158),
388 \\ [code] "{rdi}" (0x1002),
389 \\ [val] "{rsi}" (value),
390 \\ : "rcx", "r11", "memory"
391 \\ );
392 \\}
393 \\
394 \\fn getFs() c_ulong {
395 \\ var result: c_ulong = undefined;
396 \\ asm volatile (
397 \\ \\syscall
398 \\ :
399 \\ : [number] "{rax}" (158),
400 \\ [code] "{rdi}" (0x1003),
401 \\ [ptr] "{rsi}" (@ptrToInt(&result)),
402 \\ : "rcx", "r11", "memory"
403 \\ );
404 \\ return result;
405 \\}
406 \\
407 \\var test_value: u64 = 12345;
408 \\
409 \\pub export fn main() c_int {
410 \\ const orig_fs = getFs();
411 \\
412 \\ setFs(@ptrToInt(&test_value));
413 \\ assert(getFs() == @ptrToInt(&test_value));
414 \\
415 \\ var test_ptr = @intToPtr(*allowzero addrspace(.fs) u64, 0);
416 \\ assert(test_ptr.* == 12345);
417 \\ test_ptr.* = 98765;
418 \\ assert(test_value == 98765);
419 \\
420 \\ setFs(orig_fs);
421 \\ return 0;
422 \\}
423 , "");
424 }
375}425}