1. SDTypeProfile 定义(类型签名)
tablegen
def SDT_Cpu0Ret : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
-
返回值数量:0
-
参数数量:1
-
约束:第0个参数必须是整数类型
tablegen
def SDT_Cpu0DivRem : SDTypeProfile<0, 2, [SDTCisInt<0>, SDTCisSameAs<0, 1>]>;
- 除法/求余操作:2个整数参数,类型相同
tablegen
def SDT_Cpu0JmpLink : SDTypeProfile<0, 1, [SDTCisVT<0, iPTR>]>;
- 跳转链接:参数必须是指针类型(iPTR)
2. 调用序列定义
tablegen
def SDT_Cpu0CallSeqStart : SDCallSeqStart<[SDTCisVT<0, i32>]>;
def SDT_Cpu0CallSeqEnd : SDCallSeqEnd<[SDTCisVT<0, i32>, SDTCisVT<1, i32>]>;
-
标记函数调用序列的开始和结束
-
用于栈帧的调整
3. 全局地址处理节点
tablegen
def Cpu0Hi : SDNode<"Cpu0ISD::Hi", SDTIntUnaryOp>;
def Cpu0Lo : SDNode<"Cpu0ISD::Lo", SDTIntUnaryOp>;
def Cpu0GPRel : SDNode<"Cpu0ISD::GPRel", SDTIntUnaryOp>;
-
Hi/Lo:处理全局地址的高/低部分(与CPU的Hi/Lo寄存器无关)
-
GPRel:GP相对寻址
-
用于静态模型下的 GlobalAddress、ExternalSymbol lowering
4. 函数调用节点
tablegen
def Cpu0JmpLink : SDNode<"Cpu0ISD::JmpLink", SDT_Cpu0JmpLink,
[SDNPHasChain, SDNPOutGlue, SDNPOptInGlue,
SDNPVariadic]>;
-
跳转并链接(函数调用)
-
属性:
-
SDNPHasChain:有链式依赖(顺序) -
SDNPOutGlue:产生粘合值(传递状态) -
SDNPOptInGlue:可选接收粘合值 -
SDNPVariadic:可变参数
-
tablegen
def Cpu0TailCall : SDNode<"Cpu0ISD::TailCall", SDT_Cpu0JmpLink,
[SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
- 尾调用优化版本,不需要输出粘合值
实际用途
这些定义允许 LLVM 的 SelectionDAG 表示 Cpu0 特有的指令: