Sunday, 31 July 2022

macOS clang trouble

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: