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

相关推荐
archi-dreamer1 天前
SlotIndex机制--以AMDGPU为例
gpu·llvm·编译器与工具链
archi-dreamer1 天前
LiveInterval分析–以AMDGPU为例
gpu·llvm·编译器与工具链
archi-dreamer6 天前
AMDGPU后端RegMask使用介绍
gpu·llvm·编译器与工具链
kevinli6 天前
帮Apple修Bug
ios·llvm
archi-dreamer12 天前
AMDGPU 后端 ABI 总览
gpu·llvm·编译器与工具链
lbaihao17 天前
LLVM Cpu0 调用规则解析
开发语言·前端·python·llvm
lbaihao20 天前
LLVM Cpu 后端中具体的指令定义和模式匹配规则
llvm
weixin_421725261 个月前
C语言已逐渐落伍 什么样的语言能取代C语言?
c语言·编程语言·llvm·替代方案·go和rust
十五年专注C++开发1 个月前
浅谈LLVM
开发语言·c++·qt·clang·llvm