LLVM 后端中 Cpu 目标机器的 SelectionDAG 节点定义

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 特有的指令:

相关推荐
weixin_421725266 天前
C语言已逐渐落伍 什么样的语言能取代C语言?
c语言·编程语言·llvm·替代方案·go和rust
十五年专注C++开发8 天前
浅谈LLVM
开发语言·c++·qt·clang·llvm
Gauss松鼠会2 个月前
【GaussDB】LLVM技术在GaussDB等数据库中的应用
大数据·数据库·架构·数据库开发·gaussdb·llvm
lich42 个月前
个人OLLVM项目成果展示
llvm
穷人小水滴2 个月前
编译 LLVM: 跨平台 npm 二进制包
npm·编译器·llvm
穷人小水滴3 个月前
LLVM IR 入门: 使用 LLVM 编译到 WebAssembly
webassembly·编译器·llvm
高铭杰3 个月前
LlamaIndex实用入门案例(可执行)
agent·llvm·rag·llamaindex