为什么我从tablegend生成的*得到错误.. inc文件(LLVM)

Why I am getting errors from TableGen-generated *.inc files (LLVM)?

本文关键字:inc 错误 文件 LLVM tablegend 为什么      更新时间:2023-10-16

我正在尝试编写LLVM后端,当我试图构建它时,我得到以下错误消息:

AbcGenRegisterInfo.inc: In static member function 'static const llvm::AbcFrameLowering* llvm::AbcGenRegisterInfo::getFrameLowering(const llvm::MachineFunction&)':
AbcGenRegisterInfo.inc:322:43: error: invalid static_cast from type 'const llvm::TargetFrameLowering*' to type 'const llvm::AbcFrameLowering*'
    MF.getSubtarget().getFrameLowering());
    ^

这是我的AbcRegisterInfo.td (我从这里复制的):

class AbcReg<string n> : Register<n> {
    let namespace = "Abc";
}
def DUMMY_REG : AbcReg<"R0">;
def RegI64 : RegisterClass<"Abc", [i64], 64, (add DUMMY_REG)>;

我还重写了AbcSubtarget::getFrameLowering()方法:

class AbcSubTarget : public AbcGenSubtargetInfo {
    AbcFrameLowering *frameLowering;
    // more fields and methods
    const AbcFrameLowering *getFrameLowering() const override {
        return frameLowering;
    }
};

但是错误信息没有改变。

我不明白该怎么做-我不能只是编辑AbcGenRegisterInfo.inc,因为它会重新生成每次我将构建LLVM,我不明白什么是错的在我的TableGen文件。


我也试图在编译之前从我的构建目录中删除AbcGenRegisterInfo.inc文件,但它没有效果。

AbcFrameLowering继承自TargetFrameLowering吗?看起来静态强制转换在抱怨,因为类型是不相关的。

还要确保在包含.inc文件之前包含带有abcframeowering定义的头文件,否则静态强制转换也会失败。

我也有同样的错误,虽然我不能完全回答你的问题,但我相信我可以解决问题的一部分。你说

我也试图删除AbcGenRegisterInfo。在编译之前从我的构建目录中取出Inc文件,但是没有效果。

除非你的意思是AbcGenRegisterInfo。inc.被重新生成(因此删除它没有效果),它的缺失没有效果的事实应该是由于TableGen有.inc.tmp文件作为备份。我注意到,当我使用VERBOSE=1时,有一条语句建议tablegen以这种方式使用.tmp文件。

同样,不是对您的主要问题的具体答案,但只是希望在尝试调试时帮助解决该问题。