当前位置:网站首页>LLVM系列第三章:函数Function
LLVM系列第三章:函数Function
2022-08-02 14:07:00 【飞翼剑仆】
系列文章目录
LLVM系列第一章:编译LLVM源码
LLVM系列第二章:模块Module
LLVM系列第三章:函数Function
LLVM系列第四章:逻辑代码块Block
LLVM系列第五章:全局变量Global Variable
LLVM系列第六章:函数返回值Return
LLVM系列第七章:函数参数Function Arguments
LLVM系列第八章:算术运算语句Arithmetic Statement
LLVM系列第九章:控制流语句if-else
LLVM系列第十章:控制流语句if-else-phi
LLVM系列第十一章:写一个Hello World
LLVM系列第十二章:写一个简单的词法分析器Lexer
LLVM系列第十三章:写一个简单的语法分析器Parser
LLVM系列第十四章:写一个简单的语义分析器Semantic Analyzer
LLVM系列第十五章:写一个简单的中间代码生成器IR Generator
LLVM系列第十六章:写一个简单的编译器
LLVM系列第十七章:for循环
LLVM系列第十八章:写一个简单的IR处理流程Pass
LLVM系列第十九章:写一个简单的Module Pass
LLVM系列第二十章:写一个简单的Function Pass
LLVM系列第二十一章:写一个简单的Loop Pass
LLVM系列第二十二章:写一个简单的编译时函数调用统计器(Pass)
LLVM系列第二十三章:写一个简单的运行时函数调用统计器(Pass)
LLVM系列第二十四章:用Xcode编译调试LLVM源码
LLVM系列第二十五章:简单统计一下LLVM源码行数
前言
在此记录下用LLVM生成函数(Function)的过程,以备查阅。
开发环境的配置请参考第一章 《LLVM系列第一章:编译LLVM源码》。
在上一章中,我们创建了一个模块(Module),接下来我们就在模块中加入一个函数。其实,模块也好,函数也好,都是LLVM IR代码。LLVM提供了一个叫IRBuilder的工具来帮助我们创建IR代码。
当然,如果要创建一个函数,我们还需要用到其它工具,比如llvm::Function、llvm::FunctionType等。我们知道,函数也是有类型的,而llvm::FunctionType就是用来创建函数的类型的。创建函数之前,需要先创建类型,然后才能用llvm::Function创建函数。
在这一章中,我们就用LLVM提供的这些工具来创建一个最简单的函数。
一、Hello Function
为了简单起见,我们假设这个函数没有返回值,即返回值为void,代码如下(示例):
// HelloFunction.cpp
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Verifier.h"
using namespace llvm;
int main(int argc, char* argv[])
{
LLVMContext context;
IRBuilder<> builder(context);
// Create a module
Module* module = new Module("HelloModule", context);
// Add a function
Type* voidType = Type::getVoidTy(context);
FunctionType* functionType = FunctionType::get(voidType, false);
Function* function = Function::Create(functionType, GlobalValue::ExternalLinkage, "HelloFunction", module);
// Print the IR
verifyFunction(*function);
module->print(outs(), nullptr);
return 0;
}
注意到这里用了llvm::verifyFunction, 它的作用是检查我们创建的函数是否正确,确保它是符合编程语言规范的。
二、编译
用clang++进行编译(示例):
# Set up C++ standard library and header path
export SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
# Compile
clang++ -w -o HelloFunction `llvm-config --cxxflags --ldflags --system-libs --libs core` HelloFunction.cpp
以上命令会生成一个名为HelloFunction的可执行程序。
三、运行
运行HelloFunction(示例):
./HelloFunction
输出结果如下(示例):
; ModuleID = 'HelloModule'
source_filename = "HelloModule"
declare void @HelloFunction()
四、总结
我们用LLVM提供的C++ API,创建了一个最简单的函数(Function),并打印出了它的IR代码。完整源码示例请参看:
https://github.com/wuzhanglin/llvm-IR-examples
边栏推荐
猜你喜欢
getUserProfile接口不显示用户性别和地区
St. Regis Takeaway Notes - Lecture 05 Getting Started with Redis
安装使用——百家CMS微商城说明文档(2)
Ffmpeg交叉编译
C语言日记 4 变量
二进制乘法运算
Using the cloud GPU + pycharm training model to realize automatic background run programs, save training results, the server automatically power off
C语言——断言assert的使用
Flink前期代码结构
科创知识年度盛会,中国科创者大会8月6日首场开幕!
随机推荐
C语言——断言assert的使用
LLVM系列第十九章:写一个简单的Module Pass
统计偏科最严重的前100名学生
mysql常用函数
MongoDB安装流程心得:
字符串的小知识
可以拖拽的ViewGroup,仿微信拖拽缩放关闭
LLVM系列第八章:算术运算语句Arithmetic Statement
Kubernetes介绍
getUserProfile接口不显示用户性别和地区
Win10不能启动WampServer图标呈橘黄色的解决方法
华为防火墙IPS
ThinkPHP5.0内置分页函数Paginate无法获取POST页数问题的解决办法
线性代数期末复习存档
Tornado framework routing system introduction and (IOloop.current().start()) start source code analysis
Kubernetes架构和组件
kotlin Android序列化
Redis持久化机制
C语言日记 1“Hello world“
Redis database related commands