なおったっぽい。
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:
Post a Comment