A symbol operand (constraint "s") feeds a function/global symbol whose mangled name the template emits — enabling a DIRECT `bl %[fn]` (one fewer indirection than register-indirect `blr`). Until now `"s" = fn` fell through to emit and produced an LLVM-verifier crash (param type mismatch). Reject it at lowering with a clear diagnostic instead, and lock that with examples/1656-platform-asm-symbol-operand.sx. The next commit implements it and flips the example to run (→ 42).
30 lines
948 B
Plaintext
30 lines
948 B
Plaintext
error: symbol asm operands (`"s"`) are not yet implemented
|
|
--> examples/1656-platform-asm-symbol-operand.sx:10:12
|
|
|
|
|
10 | return asm volatile {
|
|
| ^^^^^^^^^^^^^^
|
|
11 | #string ASM
|
|
| ^^^^^^^^^^^^^^^^^^^
|
|
12 | stp x29, x30, [sp, #-16]!
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
13 | mov x0, %[arg]
|
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
|
14 | bl %[fn]
|
|
| ^^^^^^^^^^^^^^^^
|
|
15 | mov %[res], x0
|
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
|
16 | ldp x29, x30, [sp], #16
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
17 | ASM,
|
|
| ^^^^
|
|
18 | [res] "=r" -> i64,
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
19 | [arg] "r" = n,
|
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
|
20 | [fn] "s" = cb, // symbol operand → direct `bl _cb`
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
21 | clobbers(.x0, .x30, .memory),
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
22 | };
|
|
| ^^^^^
|