Workaround for Rust having different system for templating constants to GNU as.

Having a separate file is ugly, but it allows for a single source of truth for constants
Works for C, asm, zig and rust.

https://stackoverflow.com/questions/79840723/shared-assembly-between-rust-and-c-using-preprocessor
This commit is contained in:
Toby Jaffey 2025-12-08 10:13:53 +00:00
parent 2ccd3ac7f4
commit a88f3a1690
5 changed files with 9 additions and 4 deletions

View file

@ -6,7 +6,11 @@ _start:
# sp is already setup by vm
sw ra,12(sp)
jal ra, main
li a7, 0x138 #IOREQ_HALT (Rust assembler doesn't pick up def...)
#if 1
#include "non-rust-crt0-hack.s"
#else
li a7, {IOREQ_HALT}
#endif
ecall
.section .data

View file

@ -0,0 +1 @@
li a7,IOREQ_HALT

View file

@ -9,7 +9,7 @@ use core::panic::PanicInfo;
include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
// startup code
global_asm!(include_str!("../../crt0.S")/*, IOREQ_HALT = const IOREQ_HALT*/);
global_asm!(include_str!("../../crt0.S"), IOREQ_HALT = const IOREQ_HALT);
fn syscall(id: u32, n: u32) -> u32 {
let mut value;

View file

@ -37,7 +37,7 @@ pub fn build(b: *std.Build) void {
b.installArtifact(exe);
exe.addAssemblyFile(b.path("../crt0.s"));
exe.addAssemblyFile(b.path("../crt0.S"));
exe.setLinkerScript(b.path("../linker.ld"));
exe.addIncludePath(b.path("../../common"));

View file

@ -52,7 +52,7 @@ pub fn build(b: *std.Build) void {
b.installArtifact(exe);
exe.addAssemblyFile(b.path("../crt0.s"));
exe.addAssemblyFile(b.path("../crt0.S"));
exe.setLinkerScript(b.path("../linker.ld"));
exe.addIncludePath(b.path("../../common"));