首页 > 其他分享 >02_llvm的IR测试创建函数和代码块

02_llvm的IR测试创建函数和代码块

时间:2023-07-31 21:44:12浏览次数:43  
标签:02 function llvm IR test include FunctionType

如果要使用LLVM的能力,则需熟悉如何根据自己的代码生成出llvm的IR,以便提供给llvm使用。

测试创建function

测试代码如下02_test_function.cpp

#include "llvm/IR/Module.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Verifier.h"

using namespace llvm;
/*
以c语言举例,编一个c程序后,一般一个c的函数会对应生成一个llvm IR的function,
这里创建一个function就是利用llvm IR的机制手动创建LLVM IR函数的过程,
目的是以后有自己的前端时,能熟练创建输出llvm ir,然后利用llvm的中后端能力。
*/
int main() {
  LLVMContext c;
  Module *m = new Module("test module", c);

  Type *voidTy = Type::getVoidTy(c);
  /*函数在 include/llvm/IR/DerivedTypes.h:102:class FunctionType : public Type {
  /// Create a FunctionType taking no parameters.
  static FunctionType *get(Type *Result, bool isVarArg);
  */
  FunctionType *funcTy = FunctionType::get(voidTy, false);
  Function *func = Function::Create(funcTy, GlobalValue::ExternalLinkage, "test_function IR", m);

  verifyFunction(*func);
  m->print(outs(), nullptr);
  return 0;
}

编译脚本

export SDKROOT="../output/"
CLANG_PATH="../output/bin/clang++"
${CLANG_PATH} -w -o test_func_bin `llvm-config --cxxflags --ldflags --system-libs --libs core` ./02_test_function.cpp

运行结果

; ModuleID = 'test module'
source_filename = "test module"

declare void @"test_function IR"()

测试创建代码块

代码和简单介绍如下

#include "llvm/IR/Module.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Verifier.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/IRBuilder.h"

using namespace llvm;
/*
function由基本逻辑块basic block(代码块)组成,一个block仅有一个起点和一个终点,起点是起点标签,其内容是一组IR指令,终点是最后一条指令,通常jump到其他代码块。
IRBuilder:IR代码创建工具类。
*/
int main() {
  LLVMContext c;
  Module *m = new Module("test module", c);

  Type *voidTy = Type::getVoidTy(c);
  /*函数在 include/llvm/IR/DerivedTypes.h:102:class FunctionType : public Type {
  /// Create a FunctionType taking no parameters.
  static FunctionType *get(Type *Result, bool isVarArg);
  */
  FunctionType *funcTy = FunctionType::get(voidTy, false);
  Function *func = Function::Create(funcTy, GlobalValue::ExternalLinkage, "test_function IR", m);

  // 创建一个block
  IRBuilder<> builder(c);
  BasicBlock *b = BasicBlock::Create(c, "entry_block", func);
  builder.SetInsertPoint(b);

  verifyFunction(*func);
  m->print(outs(), nullptr);
  return 0;
}

编译脚本

export SDKROOT="../output/"
CLANG_PATH="../output/bin/clang++"
${CLANG_PATH} -w -o test_block_bin `llvm-config --cxxflags --ldflags --system-libs --libs core` ./03_test_block.cpp

运行结果

; ModuleID = 'test module'
source_filename = "test module"

define void @"test_function IR"() {
entry_block:
}

标签:02,function,llvm,IR,test,include,FunctionType
From: https://www.cnblogs.com/UFO-blogs/p/17594565.html

相关文章

  • 2023-07-31:用r、e、d三种字符,拼出一个回文子串数量等于x的字符串。 1 <= x <= 10^5。 来
    2023-07-31:用r、e、d三种字符,拼出一个回文子串数量等于x的字符串。1<=x<=10^5。来自百度。答案2023-07-31:大体步骤如下:1.初始化一个字符串builder,用于构建结果字符串。2.初始化一个字符变量cur,初始值为'r',用于轮流使用字符'r'、'e'和'd'构建回文串。3.进入循环,直到输入......
  • [NOI2023] 深搜
    和考试的时候思路差不多。首先考虑钦定一部分关键点是合法的根,带上容斥系数。对于一条非树边,要求其在任何一个钦定点作为根的时候都不是横叉边。具体而言,对于一个钦定点集合,我们建出钦定点集合的虚树,那么符合条件的非树边有如下几类:不妨先考虑特殊性质\(B\),没有横叉边的情......
  • leetcode集训-2023年7月
    今天我想和大家分享一下我参与LeetcodeSQL题集训一个月来的心得体会。在这段时间里,我真的深入感受到SQL语句和数据库API的魅力,也体验到了数据库世界的各种趣味与挑战。SQL语句的执行顺序主要包含以下几个步骤:FROM:指定要查询的表或视图。WHERE:对FROM子句中的表进行条件过滤,只选择满......
  • [NOI2023] 字符串
    对于给出的串\(S\),将其拓展成\(S+\)特殊字符\(+rev(S)\),求出其后缀数组。那么对于一个子串\([l,r]\),合法的必要条件是\(l\)的后缀在后缀数组的排名小于\(r\)的前缀的排名。之所以是必要条件,是因为会记入一些\([l,r]\)是回文串且\(l\)的排名小的情况。具体而言,这......
  • Apache RocketMQ 远程代码执行漏洞(CVE-2023-37582)
    ​漏洞简介ApacheRocketMQ是一款低延迟、高并发、高可用、高可靠的分布式消息中间件。CVE-2023-37582中,由于对CVE-2023-33246修复不完善,导致在ApacheRocketMQNameServer存在未授权访问的情况下,攻击者可构造恶意请求以RocketMQ运行的系统用户身份执行命令。影响版本Apac......
  • 2023-07-31 在uniapp使用canvas绘制一个圆角为50%的图片【代码来自chatGpt,稍作修改】
    <template><view><canvasid="myCanvas":style="{width:'200px',height:'200px'}"></canvas></view></template><script>exportdefault{onReady(){this.......
  • 剑指offer_20230731
    剑指Offer07.重建二叉树题目说明输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。解题思路可以通过前序遍历的数组获取每个子树的根节点,并在中序遍历的数组中找到根节点对应的位置,然后就可......
  • P9482 [NOI2023] 字符串
    P9482[NOI2023]字符串限制长的很像回文串,但是是字典序关系。定睛一看比较的是原串\(s\)的一个后缀的前缀和翻转串\(s'\)的一个后缀的前缀比字典序。直接把\(s'\)拼到\(s\)后面,中间加个分隔符,来一次后缀排序。排名小的后缀字典序比排名大的后缀小。设当前比较的是......
  • 祝贺!openGauss社区技术委员会主席李国良当选2023 IEEE FELLOW
    祝贺!openGauss社区技术委员会主席李国良当选2023IEEEFELLOW[openGauss](javascript:void(0);)2022-11-2917:56发表于广东近日,IEEE(InstituteofElectricalandElectronicEngineers)公布了2023年度Fellow名单,全球共有319位学者入选,华人学者占104位(约占总人数的31%)。其中,openGa......
  • openGauss获2022年度创新产品奖!
    openGauss获2022年度创新产品奖![openGauss](javascript:void(0);)2022-12-2920:46发表于广东喜讯openGauss企业级开源数据库获IT1682022年度创新产品奖!获奖理由开源社区是openGauss的重要创新平台,提供openGauss与开发者、用户、产业伙伴联接的桥梁。openGauss以社区为依托,联合......