Thursday, 12 October 2023

llvm / clang CbC fixed

なおったっぽい。

setjmp が二回出てるのはご愛嬌ですぐになおったんですが、問題は

  __code carg4(struct arg args0,struct arg args1,int i, int j,int k,int l)
  {
    goto carg5(args1,args0,j,k,l,i);
  }

この構造体の入れ替えね。

!  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %byval-temp, ptr align 4 %args0, i64 20, i1 false)
!  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %byval-temp14, ptr align 4 %args1, i64 20, i1 false)

ばっちり memcopy で壊されてる。tail call でなければ問題ないわけ。でも tail call を強制しているからな。

で、なぜか、x86_64 ではこうならない。Aarch64 で問題になる。なんで。なんと clang CodeGen  に、こんなコードが。

  clang/lib/CodeGen/CGCall.cpp
    case ABIArgInfo::InAlloca: {
     assert(getTarget().getTriple().getArch() == llvm::Triple::x86);

ちょっと。これひどすぎないですか? clang level で Triple 見てチート?

そういうことなら、こっちも

  #ifndef noCbC
      if (this->FnRetTy.getTypePtr()->is__CodeType() && CallInfo.getReturnType().getTypePtr()->is__CodeType()) {
        NeedCopy = false;
      }
  

No comments: