为什么我从TableGen生成的* .inc文件(LLVM)中收到错误?

时间:2016-08-18 08:46:19

标签: c++ compiler-construction llvm

我正在尝试编写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我是从here 复制的):

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文件,但它没有效果。

2 个答案:

答案 0 :(得分:2)

AbcFrameLowering是否继承自TargetFrameLowering?看起来静态演员是抱怨的,因为类型是不相关的。

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

答案 1 :(得分:0)

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

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

除非你的意思是AbcGenRegisterInfo.inc被重新生成(因此删除它没有效果),它的缺席无效的事实应该是由于TableGen具有依赖的.inc.tmp文件这一事实备份。我注意到当我使用VERBOSE = 1时,有一个声明表明tablegen以这种方式使用.tmp文件。

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