尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

LLVM IR基础一扫而光:mapping-high-level-constructs-to-llvm-ir中全局变量、局部变量与常量表示完全指南

LLVM IR基础一扫而光:mapping-high-level-constructs-to-llvm-ir中全局变量、局部变量与常量表示完全指南 LLVM IR基础一扫而光mapping-high-level-constructs-to-llvm-ir中全局变量、局部变量与常量表示完全指南【免费下载链接】mapping-high-level-constructs-to-llvm-irA guide that explains how high level programming language constructs are mapped to the LLVM intermediate language.项目地址: https://gitcode.com/gh_mirrors/ma/mapping-high-level-constructs-to-llvm-ir学习LLVM IR最大的障碍往往是看不懂编译器把一行 C 代码变成了什么。开源项目mapping-high-level-constructs-to-llvm-ir就是一本专门讲高级语言构造如何映射到 LLVM 中间表示的指南书本文带你快速扫清其中最基础的三块内容全局变量、局部变量与常量看完即可读懂大部分简单函数的 LLVM IR 输出。 先建立直觉 管全局% 管局部在 LLVM IR 里符号前缀就是身份标识记住两个字符就够了前缀含义例子全局符号全局变量、函数variable、main%局部符号寄存器、栈变量%1、%tmp更完整的前置知识强类型、补码整型、不区分有符号/无符号等可以在 a-quick-primer/index.rst 对应的Quick Primer章节中查阅那里还附有一张常用 LLVM 工具速查表clang、opt、llvm-dis、llc。下面这张图展示了一段带分支的函数被 LLVM IR 拆分后的基本块结构帮你建立IR 由基本块组成的整体印象全局变量如何读懂 变量的 load 与 storeC 语言里一句最简单的全局变量声明int variable 21;映射到 LLVM IR 后是这样示例见basic-constructs/listings/listing_0.cpp与basic-constructs/listings/listing_1.llvariable global i32 21 %1 load i32, ptr variable新手最常踩的坑LLVM 把全局变量看作一个指针。它更接近汇编而不是 C所以读值必须显式load写值必须显式store函数本身如main也是一种全局符号。也就是说取全局变量和解引用指针在 IR 层面是同一件事。这个心智模型一旦建立后面看指针、数组、结构体时就不会再困惑。相关详解位于basic-constructs/global-variables.rst。局部变量完全指南两种形态与 SSA 铁律LLVM IR 的局部变量只有两种形态二选一1. 临时变量寄存器——大多数指令的结果都落在它身上%reg add i32 4, 22. 栈分配变量——需要地址或跨基本块存活的变量%stack alloca i32注意alloca得到的是指向类型的指针读写同样要走load/store。⚠️ SSA 铁律一个 % 只能赋值一次LLVM IR 采用 SSA静态单赋值形式同一个%tmp不能出现两次赋值。你会看到编译器给符号加数字后缀来区分版本%tmp.0 add i32 4, 2 %tmp.1 add i32 4, 1这也是为什么真实生成的 IR 里充斥着%0、%1、%2这样的编号变量。对代码生成器作者来说还有个实用技巧把所有可变量都alloca到栈上然后在优化阶段运行memory to register promotionmem2regpass让 LLVM 自己把它们提升回寄存器——这样你就不用操心 SSA 了。详见basic-constructs/local-variables.rst。常量表示内联常量 vs 占内存的常量常量分两类处理方式完全不同① 不占内存的常量IR 里没有独立表示编译器直接内联到使用处%1 add i32 %0, 17 ; 17 就是内联常量② 占内存的常量用constant关键字定义本质是一个只读的全局变量可用private/internal限制可见性hello internal constant [6 x i8] chello\00这个写法正是 C 语言const数组、字符串字面量在 IR 里的归宿。小技巧用常量表达式让 LLVM 替你算 sizeof编译器有时想问 LLVM这个结构体到底多大可以借getelementptr的常量表达式来求计算零号元素中第二个成员不存在的偏移就等价于结构体大小。这套技巧在basic-constructs/constants.rst中有完整示例。 项目文件导航按图索骥想动手验证的话这些是最值得翻的文件路径相对项目根目录文件内容basic-constructs/global-variables.rst全局变量章节正文basic-constructs/local-variables.rst局部变量与 SSA 详解basic-constructs/constants.rst常量与常量表达式basic-constructs/listings/listing_0.cpp全局变量 C 示例源码basic-constructs/listings/listing_1.ll对应的 LLVM IR 输出a-quick-primer/index.rst前置知识与 LLVM 工具速查表本地编译示例代码可以用各listings/目录下的 Makefile整个书籍文档则通过根目录的Makefile执行make html生成。下一步从变量到控制流掌握全局变量、局部变量和常量之后建议按书籍目录index.rst的顺序继续控制结构if/else 与 phi 节点对应control-structures/章节、面向对象构造、异常处理直到附录中如何在 LLVM 里实现字符串类型。这条路线能让你从零开始具备阅读 clang 生成的 IR 的能力。【免费下载链接】mapping-high-level-constructs-to-llvm-irA guide that explains how high level programming language constructs are mapped to the LLVM intermediate language.项目地址: https://gitcode.com/gh_mirrors/ma/mapping-high-level-constructs-to-llvm-ir创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表