LLVM
文章平均质量分 76
如果你已有自己语言的前端,想将后端交给LLVM,这一系列文章很适合你去阅读;若你的目的是想学习LLVM后端,则不会对你产生帮助。本专栏文章停更半年后,我已不再从事LLVM相关工作,有好些同学私发或评论问我一些细节问题,恕我不能帮忙,但还是很乐意交流这个系列整体相关或从事编译器相关的工作。
yelvens
我很懒,什么都没留下…
展开
-
使用llvm的alloca指令创建变量时如何巧妙避免内存泄漏
alloca指令alloca指令用来申请内存。会在你当前执行函数所在的栈中砍一块内存,内存大小为sizeof(<type>)*NumElements,等函数返回时,申请的这块内存就自动释放了。也就是说alloca指令创建的内存,函数不退栈,内存不释放。为什么会引发内存泄漏我们在做编译(codeGen)的时候,表达式不得不产生一些中间变量,如果表达式位于循环体中,循环次数又较多,很容易造成内存泄漏。while(i <= n){ sum = sum + i; i = i + 1原创 2021-02-25 15:15:22 · 1935 阅读 · 3 评论 -
IR API(六)——LLVM异常处理(Exception Handling in LLVM)
llvm 异常处理一、相关资料介绍二、学习clang编译C++异常三、工作原理四、用API写异常处理一、相关资料介绍二、学习clang编译C++异常1、 创建一个main.cpp文件来编写源码,以测试异常处理机制:class Ex1 {};void throw_exception(int a, int b) { Ex1 ex1; if (a > b) { throw ex1; }}int test_try_catch() { try { throw_exceptio原创 2020-11-10 17:59:01 · 1887 阅读 · 5 评论 -
IR API(五)——使用LLVM提供的C接口和IRBuilder来生成LLVM IR常用方法总结
一、类型定义://基本类型Type::getInt32Ty(context); //intIntegerType::get(context, 32); //int,使用IntegerType的get方法和Type的getInt32Ty方法是一样的,我一般用第一种,感觉方便Type::getInt64Ty(context); //longType::getFloatTy(context); //floatType::getDoubleTy(context); //doubleType::getI原创 2020-08-17 16:59:37 · 8666 阅读 · 4 评论 -
IR API(四)——操作IR的字符串、全局变量、全局常量及数组
对应的C代码:int sum = 0;int globa_array[4] = {1,2,3,4};int main(){ int array[4] = {5,6,7,8}; for(int i = 0; i < 4; i++) sum = sum + array[i] + globa_array[i]; return sum;}完整代码:#include "llvm/IR/LLVMContext.h"#include "llvm/IR/Module.h"#incl原创 2020-08-14 17:03:35 · 4181 阅读 · 5 评论 -
IR API(三)——将C/C++中定义的结构体作为LLVM IR中函数的实参
预期IR代码,定义一个结构体%Number,用两个结构体类型作为函数@func的形参,在执行时传入C++中与之定义相同的结构体实参:%Number = type { i32, i32, double }define double @func(%Number* %num1, %Number* %num2) { ...}C++中定义的结构体和用于实参的结构体变量://定义结构体struct Number{ int precision; int scale; double value;}原创 2020-08-13 14:58:59 · 2300 阅读 · 0 评论 -
IR API(二)——使用LLVM IR调用C的函数和全局变量
#include "llvm/IR/LLVMContext.h"#include "llvm/IR/Module.h"#include "llvm/IR/Function.h"#include "llvm/IR/BasicBlock.h"#include "llvm/IR/IRBuilder.h"#include "llvm/ExecutionEngine/MCJIT.h"#include "llvm/Support/TargetSelect.h"#include "llvm/IR/TypeB原创 2020-08-12 15:34:04 · 4923 阅读 · 2 评论 -
IR API(一)——使用LLVM提供的C接口和IRBuilder来生成LLVM IR(if 和 while 语句)
自动生成IR有以下几种方式:1、通过c++直接使用Instructions.h文件中的命令来生成IR。这个现在很少有人采用,基本都是利用2、3结合。2、使用llvm提供的c接口来生成IR,c接口官方文档3、使用IRBuilder来生成IR ,irbuilder官方文档重要类的介绍LLVMContext类:该类的实例用来保证线程环境的上下文关系,本身不提供锁定保证(locking guarantees),也就是没有锁(lock),所以每个线程都应该有一个该实例。Module类:该类的实原创 2020-08-03 20:47:02 · 8630 阅读 · 24 评论 -
LLVM IR(五)——IR指令介绍(Instruction Reference)
文章目录5.1 终端指令(Terminator Instructions)ret指令br指令switch指令indirectbr指令5.2 一元运算(Unary Operations)fneg指令5.3 二元运算(Binary Operations)add指令fadd指令sub指令fsub指令sdiv指令fdiv指令urem指令srem指令frem指令5.4 二进制位运算(Bitwise Binary Operations)shl指令lshr指令ashr指令and指令or指令xor指令5.5 向量运算(Ve原创 2020-07-26 15:10:44 · 18129 阅读 · 4 评论 -
LLVM IR(四)——IR常量(Constants)
文章目录4.1 简单常量(Simple Constants)4.2 复合常量(Complex Constants)4.3 全局变量和函数的地址(Global Variable and Function Addresses)4.4 未定义值(Undefined Values)4.5 有害值(Poison Values)4.6 基本块地址(Addresses of Basic Blocks)4.7 常量表达式(Constant Expressions)4.1 简单常量(Simple Constants)Bo原创 2020-07-25 17:10:39 · 3690 阅读 · 0 评论 -
LLVM IR(三)——IR类型体系(Type System)
3.1 Void TypeVoid类型不代表任何值,也没有大小。跟c、java中的void一样,在需要的地方起占位作用。3.2 函数类型(Function Type)Function 类型可以看做是函数的签名,它包括了函数的返回类型和形参列表。语法:<returntype> (<parameter list>)returntype函数的返回类型,必须是一个void类型或者first class类型(不包含label和metadata类型)。Parameter list原创 2020-07-15 18:06:44 · 3993 阅读 · 0 评论 -
LLVM IR(二)——IR基本语法及高级结构(High Level Structure)
可以转载,请注明出处!这一章后续会持续更新,直到这一句话没了!2.1 标识符LLVM标识符有两种基本类型:全局标识符和局部标识符。全局标识符包括函数和全局变量,以’@‘字符开头;局部标识符包括局部变量和type,以’%'字符开头。此外,为了不同的目的,标识符有三种不同的格式:1)命名的值由前缀(@或者%)加字符串表示,比如%foo等。识别变量的 正则表达式为[%@][-a-zA-Z.][−a−zA−Z._][-a-zA-Z.][−a−zA−Z._0-9]*。2)未命名的值由签注加无符号数.原创 2020-07-15 17:51:59 · 5520 阅读 · 9 评论 -
LLVM IR(一)——如何使用LLVM编译执行代码
可以转载,请注明出处!在阅读这一章节之前,需要本地安装llvm环境,没安装点这里:https://blog.csdn.net/qq_42570601/article/details/1071464071.1 LLVM IR的三种结构LLVM的代码有3种表示形式:内存编译器中的IR(用户不可知)、存于磁盘的 bitcode(二进制文件),以及用户可读的汇编码。我们接下来要介绍的就是用户可读的汇编码。1.2将C转为LLVM IR汇编码1> 首先在tpy.c文件中编写一段c源码:#inclu.原创 2020-07-15 17:44:57 · 13239 阅读 · 1 评论 -
简单了解LLVM IR基本语法
https://blog.csdn.net/wy7980/article/details/46715703原创 2020-07-07 22:04:08 · 12724 阅读 · 3 评论 -
Linux环境下LLVM 6.0 + clang安装步骤
可以转载,请注明出处!1.准备工作首先确保你的Linux系统是可以联网的,我是win10环境下的VMware 15 + centos 7,这个应该没影响,之所以说,是因为我之前用的vm12,使用centos7老是出问题,换了15之后就好了。安装总共需要三个tar包,将其全部拖入到Linux环境下。其中cfe-6.0.0.src.tar.xz是clang的源码,compiler-rt-6.0.0.src.tar.xz是动态测试工具,llvm-6.0.0.src.tar是llvm的源码,这三个包官网.原创 2020-07-05 22:55:53 · 13621 阅读 · 10 评论 -
Windows环境下Visual Studio 配置Clang步骤
一.下载安装所需要的工具1)下载安装SVN打开http://subversion.apache.org/packages.html下载TortoiseSVN像我是下载了64位的,下载好之后安装就好。到这里,SVN是可以用了,如果在Windows下cmd输入后面的svn co …无法识别,怎么办?于是需要这个http://www.visualsvn.com/downloads/。下载Apache Subversion command line tools,这是一个可以在cmd下使用的命令行工具,解压原创 2020-12-23 21:12:32 · 4171 阅读 · 0 评论