LLVM系列第七章:函数参数Function Arguments

2023-11-09

系列文章目录

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系列第二十六章:理解LLVMContext
LLVM系列第二十七章:理解IRBuilder
LLVM系列第二十八章:写一个JIT Hello World
LLVM系列第二十九章:写一个简单的常量加法“消除”工具(Pass)

flex&bison系列



前言

在此记录下用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 with parameters
    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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LLVM系列第七章:函数参数Function Arguments 的相关文章

随机推荐

  • 12款很赞的web前端移动开发框架

    原生移动应用程序运行更快 更顺畅 有更好的用户体验 而同时 前端开发人员总是寻找新的 Web 技术来获得这种性能 利用现有的高质量移动框架来构建移动 Web 应用程序已成为非常容易 但是如何选择合适的框架是比较纠结的 因此在本文中 我们整理
  • 刷简单的题也很吃力怎么办?

    文章目录 一 分享自己相关的经历 1 1 刷简单题目感到吃力的原因 1 2 解决该问题的重要性和目的 二 分析可能存在的问题 三 根据问题进行分解或建立思维导图 四 分享好用的刷题网站并进行介绍 明明自觉学会了不少知识 可真正开始做题时 却
  • POI操作ppt,合并,转图片

    引入POI compile group org apache poi name poi ooxml version 4 1 0 compile group batik name batik bridge version 1 6 1 comp
  • python中if错误-python中的异常处理

    异常 异常就是程序运行时发生错误的信号 在python中 错误触发的异常如下 异常种类 在python中不同的异常可以用不同的类型 python中统一了类与类型 类型即类 去标识 不同的类对象标识不同的异常 一个异常标识一种错误 常见异常
  • Simon ILETS —— Listening

    content I want to say ahead Listening Know the test basic information Four sections Section 1 Key technique Section 2 Se
  • 小程序:调用手机的相册

    1 需求 点击按钮 调用手机相册选择图片上传 2 解决方案 Button 上加 openType chooseAvatar onChooseAvatar 写方法 必须用button 按钮 更改下样式看不出来就行 3 代码 解决方案 1 Bu
  • Linux——文件系统:目录组织结构、文件类型、文件权限等

    在Linux中 所有的设备都是文件 文件的类型是根据文件头字段来判断 而非文件的后缀名 Linux的文件系统 EXT4 索引式的文件系统 以EXT4文件系统格式化磁盘时 将磁盘分成三个区 1 superblock 记录文件系统的整体信息 包
  • 微信小程序 短信验证 功能的实现(附案例代码/前后端/直接用)

    模块效果展示 小程序界面 实现的功能 小程序端 请求获取短信验证码 两次请求之间间隔至少一分钟 填写必填内容后 才能提交表单 手机号合法性检验 后台 接前台请求后 通过阿里云发送短信 生成随机数字验证码 默认6位 收到提交的表单后 对验证码
  • 如何实现IM即时通信系统(一)

    在企业数字化建设过程中 如何与客户保持线上链接是重要的组成部分 而IM通信系统就属于数字化建设的基础设施 那么 如何实现一个符合企业需求的IM系统呢 采购当然是其中需要考虑的方式之一 但就我个人的经验来看 市面上好的IM厂商很稀少 因为IM
  • 哈希表(散列表)——C++数据结构详解

    目录 1 哈希表原理精讲 2 哈希链表算法实现 2 1哈希表数据结构定义 2 2哈希函数 2 3哈希链表初始化 2 4哈希链表查找函数 2 5哈希链表插入函数 2 6哈希链表删除元素 3 哈希表完整代码 哈希表 散列表 它是基于快速存取的角
  • [运放滤波器]4_积分微分电路

    动态系统的建模与分析 15 伯德图 bode图 为什么是20logM 分贝又是什么 动态系统的建模与分析 9 一阶系统的频率响应 低通滤波器 动态系统的建模与分析 8 频率响应 详细数学推导 G jw 滤波器 运放滤波器 3 反相同相比例放
  • java ssh连接_PuTTY 0.71 发布,开源的 SSH 和 Telnet 客户端

    PuTTY 最新版本 0 71 已发布 PuTTY 是一款集成虚拟终端 系统控制台和网络文件传输为一体的自由开源程序 它支持多种网络协议 包括 SCP SSH Telnet rlogin 和原始的套接字连接 它也可以连接到串行端口 其软件名
  • mysql 外连接总结

    原文 http blog sina com cn s blog 3d48dbb70100hyz4 html 了点时间总结了一下mysql中的内 外连接 转载注明 首先my sql 不支持oracle的 内连接 只连接匹配的行 左外连接 包含
  • 关于智能合约开发的真相

    就像 区块链 AI 和 云 这样的词语一样 智能合约 也是那些得到大量炒作的短语之一 毕竟 没有什么比不通过司法系统而让人们能够相信发生了什么更有意思的了 智能合约的承诺包括 自动 无须信任和公正地执行合约 在合约构建 合约执行和合约执行环
  • 狂神说 Docker笔记

    Docker概述 Docker为什么出现 Docker的思想来自于集装箱 JRE 多个应用 端口冲突 原来都是交叉的 隔离 Docker核心思想 打包装箱 每个箱子是互相隔离的 Docker通过隔离机制 可以将服务器利用到极致 Docker
  • ShardingSphere分库分表2-ShardingJDBC实战

    文章目录 一 ShardingSphere 二 ShardingJDBC实战 1 核心概念 2 测试项目介绍 3 快速实战 4 ShardingJDBC的分片算法 5 ShardingSphere的SQL使用限制 6 分库分表带来的问题 7
  • JAVA四大特征(抽象,封装,继承,多态)

    1 私有属性必须通过一个成员方法去控制和访问私有属性 2 访问控制修饰符 访问级别 访问控制修饰符 同类 同包 子类 不同包 公开 public 受保护 protected 默认 无 私有 private 3 继承 当多个类具有相同的属性
  • Oracle常见错误总结

    最近多次用到Oracle 主要就是导入dmp文件 然后将文件读出来并写进csv文件 在这过程中出现了一系列的问题 每次都几乎让我崩溃 一方面觉得Oracle用起来真麻烦 但是回过头想想 另一方面说明Oracle机制做的好 各种错误都能考虑到
  • MySQL学习笔记--菜鸟开始上路了!

    开篇话 用MySQL有一段时间了 但是发现自己没有系统的对SQL进行过深入学习 从这篇笔记开始对SQL进行系统学习 也希望和我情况一样的伙伴能够一起进步 学习前症状 状态适用 虽然顺利的把数据从库表中取出 但并不清楚它具体是怎样执行的 也不
  • LLVM系列第七章:函数参数Function Arguments

    系列文章目录 LLVM系列第一章 编译LLVM源码 LLVM系列第二章 模块Module LLVM系列第三章 函数Function LLVM系列第四章 逻辑代码块Block LLVM系列第五章 全局变量Global Variable LLV