TargetMachine及其子類:
前文介紹了TargetMachine類,我們這篇文章簡單分析下TargetMachine類及其子類。TargetMachine類位於include/llvm/Target/TargetMachine.h 文件之中。
TargetMachine類作爲獲取目標機器相關信息的入口,作爲目標機器類的父類,並不是直接被具體平臺的TargetMachine類所繼承的,而是首先被LLVMTargetMachine類繼承:
class LLVMTargetMachine : public TargetMachine {
然後具體平臺的TargetMachine類再繼承LLVMTargetMachine類.(以X86平臺爲例)
lib/Target/X86/X86TargetMachine.h
class X86TargetMachine final : public LLVMTargetMachine {
所以,TargetMachine、LLVMTargetMachine和具體的目標平臺的XXXTargetMachine類的關係如圖所示:
圖來自於:llvm::TargetMachine Class Reference
TargetMachine Virtual Methods:
基於前文我們已經提到的LLVM後端文檔跟不上代碼的變化,實際上現在除了TargetMachine類,Target description classes 中其他的類已經都不在include/llvm/Target目錄之下。與此同時,在TargetMachine類中也不存在獲取其他類包含的信息的接口,目前TargetMachine僅存的獲取Target description classes中的類所包含信息的接口如下(其他的接口多是獲取具體信息):
/// Create a DataLayout.
const DataLayout createDataLayout() const { return DL; }
創建DataLayout.
virtual const TargetSubtargetInfo *getSubtargetImpl(const Function &) const {
return nullptr;
}
獲取TargetSubtargetInfo。
其他的Target description classes(除TargetMachine和DataLayout之外):
以TargetLowering爲例:TargetLowering(include/llvm/Codegen/TargetLowering.h)
TargetLoweringBase和TargetLowering都在include/llvm/Codegen/TargetLowering.h之中。而具體目標平臺的XXXTargetLowering類則是在lib/Target下具體的目標平臺目錄之中。以X86平臺爲例,其則是在lib/Target/X86/X86ISelLowering.h 之中:
// X86 Implementation of the TargetLowering interface
class X86TargetLowering final : public TargetLowering {
這個文件的註釋也描述的很清晰:
// This file defines the interfaces that X86 uses to lower LLVM code into a
// selection DAG.
其他幾個類的情況雖然有細微差別,但是情況都差不多。
所以,本文的分析,其實是結合Target description classes和Implementations of the abstract description interfaces for particular targets進行的代碼分析,後端文檔中六大部分的1和5.
相關內容: