为什么我从 TableGen 生成的 *.inc 文件 (LLVM) 中收到错误?
Why I am getting errors from TableGen-generated *.inc files (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
文件,但没有效果。
我也有同样的错误,虽然我无法完整回答您的问题,但我相信我可以解决问题的一部分。你说
我也试过在编译前从我的构建目录中删除 AbcGenRegisterInfo.inc 文件,但没有效果。
除非你的意思是 AbcGenRegisterInfo.inc 被重新生成(因此删除它没有效果),它的缺失没有效果的事实应该是因为 TableGen 有 .inc.tmp作为备份依赖的文件。我注意到当我使用 VERBOSE=1 时,有一条声明建议 tablegen 以这种方式使用 .tmp 文件。
同样,这不是对您的主要问题的具体回答,只是希望在尝试调试时帮助解决该问题。
AbcFrameLowering 是否继承自 TargetFrameLowering?看起来静态转换在抱怨,因为类型不相关。
还要确保在包含 .inc 文件之前包含具有 AbcFrameLowering 定义的 header,否则静态转换也会失败。
我正在尝试编写 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
文件,但没有效果。
我也有同样的错误,虽然我无法完整回答您的问题,但我相信我可以解决问题的一部分。你说
我也试过在编译前从我的构建目录中删除 AbcGenRegisterInfo.inc 文件,但没有效果。
除非你的意思是 AbcGenRegisterInfo.inc 被重新生成(因此删除它没有效果),它的缺失没有效果的事实应该是因为 TableGen 有 .inc.tmp作为备份依赖的文件。我注意到当我使用 VERBOSE=1 时,有一条声明建议 tablegen 以这种方式使用 .tmp 文件。
同样,这不是对您的主要问题的具体回答,只是希望在尝试调试时帮助解决该问题。
AbcFrameLowering 是否继承自 TargetFrameLowering?看起来静态转换在抱怨,因为类型不相关。
还要确保在包含 .inc 文件之前包含具有 AbcFrameLowering 定义的 header,否则静态转换也会失败。