最終的に SVC 呼び出しで実装される一連の関数があります。例えば:
void func(int arg) {
asm volatile ("svc #123");
}
ご想像のとおり、SVC はおそらくレジスターにある「arg」で動作します。「noinline」属性を明示的に定義に追加すると、すべてが期待どおりに機能します。
しかし、関数がより高い最適化レベルでインライン展開された場合、'arg' をレジスタにロードするコードは省略されます。
「arg」自体の宣言に「used」属性を追加しようとしましたが、この場合、gcc は明らかに警告を生成します。
また、次のような「ダミー」の asm ステートメントを追加してみました
asm ("" : "=r"(arg));
しかし、これは一般的に機能しているようには見えませんでした。(ここでも揮発性と言う必要があるかもしれません???)
いずれにせよ、基本的に本体が 1 つの asm ステートメントで構成されるルーチンに対して、明示的な関数呼び出しがあるのは残念です。