news 2026/5/9 21:58:13

LLVM后端入门8:Subtarget支持

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LLVM后端入门8:Subtarget支持

子目标支持用于告知代码生成过程特定芯片组的指令集差异,若需要子目标支持,你应为目标架构实现一个目标特定的 XXXSubtarget 类。该类需处理命令行选项-mcpu=-mattr=

TableGen 会利用 Target.td 和RISCVFeatures.td 文件中的定义,在RISCVGenSubtargetInfo.inc 中生成代码。如下所示,Target.td 中定义了 SubtargetFeature 接口。SubtargetFeature 接口的前四个字符串参数分别为:特性名称、由该特性设置的 XXXSubtarget 字段、XXXSubtarget 字段的值以及特性描述。(第五个参数是该特性隐含的其他特性列表,默认值为空数组。)

若字段值为字符串 “true” 或 “false”,则该字段被视为布尔值,且仅能有一个 SubtargetFeature 引用它。否则,该字段被视为整数类型,其值可为枚举常量名称。若多个特性使用同一个整数字段,则该字段的值会被设为所有启用的、共享该字段的特性对应值中的最大值。

//===----------------------------------------------------------------------===// // SubtargetFeature - A characteristic of the chip set. // class SubtargetFeature<string n, string f, string v, string d, list<SubtargetFeature> i = []> { // Name - Feature name. Used by command line (-mattr=) to determine the // appropriate target chip. // string Name = n; // FieldName - Field in XXXSubtarget to be set by feature. // string FieldName = f; // Value - Value the XXXSubtarget field to be set to by feature. // // A value of "true" or "false" implies the field is a bool. Otherwise, // it is assumed to be an integer. the integer value may be the name of an // enum constant. If multiple features use the same integer field, the // field will be set to the maximum value of all enabled features that // share the field. // string Value = v; // Desc - Feature description. Used by command line (-mattr=) to display help // information. // string Desc = d; // Implies - Features that this feature implies are present. If one of those // features isn't set, then this one shouldn't be set either. // list<SubtargetFeature> Implies = i; }

在RISCVFeaturestd文件中,有大量基于SubtargetFeature定义的特征

// Feature32Bit exists to mark CPUs that support RV32 to distinguish them from // tuning CPU names. def Feature32Bit : SubtargetFeature<"32bit", "IsRV32", "true", "Implements RV32">; def Feature64Bit : SubtargetFeature<"64bit", "IsRV64", "true", "Implements RV64">; def IsRV64 : Predicate<"Subtarget->is64Bit()">, AssemblerPredicate<(all_of Feature64Bit), "RV64I Base Instruction Set">; def IsRV32 : Predicate<"!Subtarget->is64Bit()">, AssemblerPredicate<(all_of (not Feature64Bit)), "RV32I Base Instruction Set">; defvar RV32 = DefaultMode; def RV64 : HwMode<[IsRV64]>; def FeatureRelax : SubtargetFeature<"relax", "EnableLinkerRelax", "true", "Enable Linker relaxation.">; def FeatureExactAssembly : SubtargetFeature<"exact-asm", "EnableExactAssembly", "true", "Enable Exact Assembly (Disables Compression and Relaxation)">; foreach i = {1-31} in def FeatureReserveX#i : SubtargetFeature<"reserve-x"#i, "UserReservedRegister[RISCV::X"#i#"]", "true", "Reserve X"#i>; def FeatureSaveRestore : SubtargetFeature<"save-restore", "EnableSaveRestore", "true", "Enable save/restore.">; def FeatureNoTrailingSeqCstFence : SubtargetFeature<"no-trailing-seq-cst-fence", "EnableTrailingSeqCstFence", "false", "Disable trailing fence for seq-cst store.">; def FeatureUnalignedScalarMem : SubtargetFeature<"unaligned-scalar-mem", "EnableUnalignedScalarMem", "true", "Has reasonably performant unaligned scalar " "loads and stores">;

第一个特征Feature32Bit定义了32位子处理器架构的特征:

def Feature32Bit // 1. 自定义特性名 : SubtargetFeature< // 2. 继承LLVM标准基类 "32bit", // 3. 参数1:命令行/编译标识名 "IsRV32", // 4. 参数2:C++侧的布尔成员变量名 "true", // 5. 参数3:该变量的赋值/启用值 "Implements RV32"// 6. 参数4:特性的描述字符串 >;

而第二个特征Feature64Bit定义了64位RISC-V架构特性:

def Feature64Bit : SubtargetFeature<"64bit", "IsRV64", "true", "Implements RV64">;

从Target.td和RISCVFeatures.td文件生成的 RISCVGenSubtargetinfo.inc 会指定用于标识特性的枚举值、表示 CPU 特性和 CPU 子类型的常量数组,以及解析用于设置指定子目标选项的特性字符串的 ParseSubtargetFeatures 方法。生成的 RISCVGenSubtargetinfo.inc 文件应被包含在 RiscvSubtarget.cpp 中。XXXSubtarget 方法的目标特定实现应遵循以下伪代码:

XXXSubtarget::XXXSubtarget(const Module &M, const std::string &FS) { // Set the default features // Determine default and user specified characteristics of the CPU // Call ParseSubtargetFeatures(FS, CPU) to parse the features string // Perform any additional operations }

例如,RISCV的实现如下:

RISCVSubtarget::RISCVSubtarget(const Triple &TT, StringRef CPU, StringRef TuneCPU, StringRef FS, StringRef ABIName, unsigned RVVVectorBitsMin, unsigned RVVVectorBitsMax, const TargetMachine &TM) : RISCVGenSubtargetInfo(TT, CPU, TuneCPU, FS), RVVVectorBitsMin(RVVVectorBitsMin), RVVVectorBitsMax(RVVVectorBitsMax), FrameLowering( initializeSubtargetDependencies(TT, CPU, TuneCPU, FS, ABIName)), InstrInfo(*this), TLInfo(TM, *this) { TSInfo = std::make_unique<RISCVSelectionDAGInfo>(); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 18:27:34

基于Hadoop的岗位推荐系统的设计与实现

一、选题背景与意义 在当今数字化时代&#xff0c;就业市场发生了巨大变化。一方面&#xff0c;求职者面临着海量职位信息&#xff0c;筛选难度极大。据统计&#xff0c;求职者平均需浏览超200条岗位信息&#xff0c;才能找到少数几个适配岗位&#xff0c;耗费大量时间与精力&a…

作者头像 李华
网站建设 2026/5/9 15:24:19

‌警方破获首例“AI教唆自杀案”:凶手是段开源代码‌

一、事件技术复盘&#xff1a;被操纵的对话链 漏洞根源&#xff1a;Poisoned开源数据集 涉案聊天机器人基于开源对话模型&#xff08;GPT-3.5架构&#xff09;&#xff0c;攻击者通过GitHub提交恶意训练数据&#xff1a; # 伪装成抑郁症互助语料的数据投毒样本&#xff08;简…

作者头像 李华
网站建设 2026/5/8 12:08:20

扫频信号 (Sweep/Chirp Signal) 原理与应用

目录 前言 1. 什么是扫频信号&#xff1f; 2. 直观理解&#xff1a;与普通正弦波的区别 3. 常见分类 4. 核心作用&#xff1a;为什么要用扫频信号&#xff1f; 5. 项目实战分析 (结合 FPGA/C 代码) 6. 总结 前言 本文旨在记录扫频信号&#xff08;Chirp&#xff09;的时…

作者头像 李华
网站建设 2026/5/8 7:45:13

【Java毕设全套源码+文档】基于springboot的连锁门店管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/6 14:37:15

ssm627软件测试过程管理系统vue

目录SSM627软件测试过程管理系统Vue摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM627软件测试过程管理系统Vue摘要 SSM627软件测试过程管理系统基于Vue.js前端框架与SSM&#xff08;SpringSpringMVCMyBatis&#xff0…

作者头像 李华
网站建设 2026/5/6 14:40:16

ssm628师范生说课作业提交系统vue

目录系统概述技术架构核心功能创新点应用价值开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 SSM628师范生说课作业提交系统基于Vue.js前端框架与SSM&#xff08;SpringSpring MVCMyBatis&#xff09;后端架构开发&am…

作者头像 李华