当前位置:网站首页>LLVM系列第七章:函数参数Function Arguments
LLVM系列第七章:函数参数Function Arguments
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)添加参数(Arguments)的过程,以备查阅。
开发环境的配置请参考第一章 《LLVM系列第一章:编译LLVM源码》。
我们知道,函数是可以接收参数的。每个参数都可以有自己的类型,比如整数、字符串、指针等等。本章,我们就来创建一个带有参数的函数。
一、Hello Function Arguments
为简单起见,假定这个函数带有两个参数,它们的名称为a和b,类型均为32位整数型。代码如下(示例):
// HelloFunctionArguments.cpp
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Verifier.h"
#include <vector>
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 global variable
module->getOrInsertGlobal("helloGlobalVariable", builder.getInt32Ty());
GlobalVariable* globalVariable = module->getNamedGlobal("helloGlobalVariable");
globalVariable->setLinkage(GlobalValue::CommonLinkage);
globalVariable->setAlignment(MaybeAlign(4));
// Add a function
std::vector<Type*> parameters(2, builder.getInt32Ty());
FunctionType* functionType = FunctionType::get(builder.getInt32Ty(), parameters, false);
Function* function = Function::Create(functionType, GlobalValue::ExternalLinkage, "HelloFunction", module);
// Set arguments for the function
function->getArg(0)->setName("a");
function->getArg(1)->setName("b");
// Create a block
BasicBlock* block = BasicBlock::Create(context, "entry", function);
builder.SetInsertPoint(block);
// Add a return
ConstantInt* zero = builder.getInt32(0);
builder.CreateRet(zero);
// Print the IR
verifyFunction(*function);
module->print(outs(), nullptr);
return 0;
}
二、编译
用clang++进行编译(示例):
# Set up C++ standard library and header path
export SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
# Compile
clang++ -w -o HelloFunctionArguments `llvm-config --cxxflags --ldflags --system-libs --libs core` HelloFunctionArguments.cpp
以上命令会生成一个名为HelloFunctionArguments的可执行程序。
三、运行
运行HelloFunctionArguments(示例):
./HelloFunctionArguments
输出结果如下(示例):
; ModuleID = 'HelloModule'
source_filename = "HelloModule"
@helloGlobalVariable = common global i32, align 4
define i32 @HelloFunction(i32 %a, i32 %b) {
entry:
ret i32 0
}
四、总结
我们用LLVM提供的C++ API,创建了一个带有参数(Arguments)的函数(Function),并打印出了它的IR代码。完整源码示例请参看:
https://github.com/wuzhanglin/llvm-IR-examples
边栏推荐
猜你喜欢
随机推荐
PHP版本切换:5.x到7.3
拥抱Jetpack之印象篇
Redis database related commands
执行npm install有错误error
VS Code远程开发及免密配置
IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but
什么是闭包?闭包的作用?闭包的应用?有什么缺点?
OpenCart迁移到其他服务器
二级指针,数组指针,指针数组和函数指针
Enhanced Apktool reverse artifact
spark on yarn
字符串的小知识
1. What is RecyclerView
C语言日记 1“Hello world“
两个surfaceview的重叠效果类似直播效果中的视频和讲义实践
无人驾驶综述:等级划分
Kubernetes资源编排系列之三: Kustomize篇
Handler你真的搞懂了吗?
Visual studio代码中有红色波浪线解决办法
Eslint规则大全









