void makelonger(int gl) {
if (pass==1) return;
for(struct longer *p=lglist;p;p=p->next) {
if (p->gline==gl) { // already fixed
p->change = 1;
return;
}
}
struct longer *p = (struct longer *)calloc(sizeof(struct longer *),1);
p->gline=gl;
p->next = lglist;
lglist = p;
}
これだけのコードなんだけど。SBC09 という MC6809 emulator の assembler の一部。
まぁ、あんまり現代的ではないが、そもそも考古学的プロジェクトだからな。
元々の github に update が入ってたので、それを merge しようってわけですが、動かない。
いや、x86 では動いていたんだよ?
short branchが届かない場合に long branch に変えるんだが、既に変更したかどうかを
list で覚えているだけ。変更したら、もう一度、pass を回すのだが、それが無限ループする。
lldb でおうと、gl が表示できない。こいつは呼び出し時に大域変数なので、inline 転換時に消えるのは
良くある。(最近のC compilerは勝手にinline展開する) なのだが、 p->gline が 0 のまま。
disassemble すると、store code が出てない。はぁ? で、-O2 なので、-O0 にすると、
動く。なんと、-O でも動く。つまり、
-O2 の時だけ、inline 展開をしくじっている
らしい。さすがに、これの work around するのはあれなので、放置かな。-O には変更しました。
FedoraのLinux Kernel でも GCC のbugにぶちあたってたし。最近あれだな。
% clang --version
Apple clang version 13.1.6 (clang-1316.0.21.2.5)
Target: arm64-apple-darwin21.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
https://github.com/shinji-kono/sbc09/tree/os9lv2
No comments:
Post a Comment