首页 > 其他分享 >06 llvm IR测试创建struct和Array

06 llvm IR测试创建struct和Array

时间:2023-08-09 20:00:28浏览次数:37  
标签:llvm 06 struct get builder test include

见下文代码,方式一样的

#include <vector>
#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"
#include "llvm/IR/GlobalVariable.h"
// #include "llvm/Support/Alignment.h"
#include "llvm/IR/Constants.h"

using namespace llvm;
using namespace std;

/*
llvm提供两种struct,identified struct和literal struct,对应接口分别为llvm::StructType::Create()和llvm::StructType::get()
identified struct:
对应使用struct关键定义的类型
*/
int main() {
  LLVMContext c;
  Module *m = new Module("test module", c);
  IRBuilder<> builder(c);

  StructType* structAddr = StructType::create(c, "TestStruct");
  structAddr->setBody({builder.getInt32Ty(), builder.getInt32Ty(), builder.getInt32Ty(), builder.getInt32Ty()});
  std::vector<Constant *> structInit = {builder.getInt32(1), builder.getInt32(8), builder.getInt32(8), builder.getInt32(10)};
  m->getOrInsertGlobal("test_struct_var", structAddr);
  GlobalVariable *gv = m->getNamedGlobal("test_struct_var");
  // gv->setLinkage(GlobalValue::PrivateLinkage); // 链接类型
  // If true then there is a definition within the same linkage unit and that definition cannot be runtime preempted
  gv->setDSOLocal(true);
  gv->setInitializer(ConstantStruct::get(structAddr, structInit));
  gv->setAlignment(MaybeAlign(4));
  gv->setSection("test_section"); // 指定在elf目标文件的test_section中

  /*
  IRBuilder.h :
    /// Fetch the type representing a pointer to an integer value.
    IntegerType *getIntPtrTy(const DataLayout &DL, unsigned AddrSpace = 0) {
  */
  std::vector<Constant *> ptrArrInit = {gv, gv};
  // DataLayout dl(m);
  // ArrayType* AddressTableType = ArrayType::get(builder.getIntPtrTy(dl), 2);
  Type *voidType = Type::getVoidTy(c);
  PointerType *voidPointerType = PointerType::get(voidType, 0); // 创建void *
  PointerType *ptr_type = PointerType::get(gv->getType(), 0); // 获取指向该变量的指针type
  ArrayType* AddressTableType = ArrayType::get(voidPointerType, 2);//Type::getInt8PtrTy(c), 2);
  Constant* AddressTableInit = ConstantArray::get(AddressTableType, ptrArrInit);
  Constant* AddressTable = m->getOrInsertGlobal("test_struct_init", AddressTableType);
  dyn_cast<GlobalVariable>(AddressTable)->setInitializer(AddressTableInit);


  vector<Type *> paramTys(2, builder.getInt32Ty());
  /*get函数在 include/llvm/IR/DerivedTypes.h:102:class FunctionType : public Type {
  /// This static method is the primary way of constructing a FunctionType.
  static FunctionType *get(Type *Result, ArrayRef<Type*> Params, bool isVarArg);
  */
  FunctionType *funcTy = FunctionType::get(builder.getInt32Ty(), paramTys, false);
  Function *func = Function::Create(funcTy, GlobalValue::ExternalLinkage, "test_function", m);
  // 低版本无getArg()函数
  Value *arg0 = func->getArg(0);
  arg0->setName("a");
  func->getArg(1)->setName("c");

  // 1 给函数创建主block
  BasicBlock *bEntry = BasicBlock::Create(c, "entry_block", func);



  ConstantInt *vConst5 = builder.getInt32(5);
  builder.CreateRet(vConst5);

  verifyFunction(*func);

  FunctionType *pseudo_func_type = FunctionType::get(
      builder.getInt64Ty(),
      {builder.getInt64Ty(), builder.getInt64Ty()},
      false);
  Function::Create(
      pseudo_func_type,
      GlobalValue::ExternalLinkage,
      "llvm.bpf.pseudo",
      m);

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

// 编译命令 ../clang-16/bin/clang++ -w -o test_struct_bin `llvm-config --cxxflags --ldflags --system-libs --libs core` ./10_test_struct_stm.cpp
// 运行结果
/*
; ModuleID = 'test module'
source_filename = "test module"

%TestStruct = type { i32, i32, i32, i32 }

@test_struct_var = dso_local global %TestStruct { i32 1, i32 8, i32 8, i32 10 }, section "test_section", align 4
@test_struct_init = global [2 x void*] [void* @test_struct_var, void* @test_struct_var]

define i32 @test_function(i32 %a, i32 %c) {
entry_block:
}

; Function Attrs: nounwind
declare i64 @llvm.bpf.pseudo(i64, i64) #0

attributes #0 = { nounwind }


*/


标签:llvm,06,struct,get,builder,test,include
From: https://www.cnblogs.com/UFO-blogs/p/17617879.html

相关文章

  • 前端原型和原型链constructor
     目录前言导语运行结果总结 代码部分总结前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语前......
  • 06-页面置换算法
    06-页面置换算法一、功能与目标功能:当缺页中断发生,需要调入新的页面而内存已满时,选择内存当中哪个物理页面被置换目标:尽可能地减少页面的换进换出次数(即缺页中断的次数)。具体来书,把未来不再使用的活短期内较少使用的页面换出,荣昌只能在局部性原理指导下依据过去的统计数据来......
  • 【2023-08-06】连岳摘抄
    23:59有德此有人,有人此有土,有土此有财,有财此有用。德者本也,财者末也。                                                 ——《大学》凡事要有度。最好的度就是中国......
  • 《Java编程思想第四版》学习笔记06
    为什么要把一个方法声明成final呢?正如上一章指出的那样,它能防止其他人覆盖那个方法。但也许更重要的一点是,它可有效地“关闭”动态绑定,或者告诉编译器不需要进行动态绑定。这样一来,编译器就可为final方法调用生成效率更高的代码。               ......
  • Codeforces Round 890 (Div. 2) supported by Constructor Institute A-E1
    An=50非常小所以直接暴力枚举枚举每次把某个数以下的全部减完然后看一下是否上升就行 https://codeforces.com/contest/1856/submission/217275334  B题直接贪心前面优先放最小的最后一个放最大的 然后如果重复了就到前面去看能不能调整一下 https://codeforces.......
  • more and more construction problem,what should i do ?
    一些构造CF1464FShowingOff显然原图连边会形成若干内向基环树森林,所有在同一个环上的点\(S\)是相同的,注意到原图是二分图,因此所有环都是偶环。一个重要观察是,我们可以让所有环的长度都是2,因为总可以把长度\(>2\)的环拆成若干个二元环,而且在\(S_{i,j}\geq2\)的限制......
  • Java后端06(代理模式)
    代理模式​ spring中就使用了代理模式,Java中的代理模式分为一下两种静态代理:最简单,但是每次修改都需要重新编译动态代理:分为两种(jdk动态代理--通过接口实现来进行代理&cglib动态代理--通过子类继承来实现代理)静态代理​ 静态代理致命问题:代理对象必须提前编译好,所有代......
  • MySQL问题记录Can't connect to MySQL server on 'localhost' (10061)解决方法
    登录MySQL提示Can'tconnecttoMySQLserveron'localhost'(10061)进入安装目录bin目录,执行mysqld--install,启动MySQL点击查看代码cdD:\soft\MySQL\MySQLServer5.7\binmysqld--installnetstartmysql提示启动失败最后执行mysqld--initialize--user=root--......
  • FileNotFoundError: Could not find module 'xxx.dll'. Try using the full path with
    首先看看报错信息 我的python版本是3.8版本,试了网上加各种办法后发现不行。然后怀疑是系统本身的问题,就下载了visual studio,用其中的dumpbin一查,发现果然少了一个dll文件。详细步骤:1.下载并安装visual studio 2.找到开发者命令工具,并打开 3.在打开的控制台上......
  • 636-基于FMC的Kintex XCKU060高性能PCIe载板
    一、板卡概述   板卡主控芯片采用Xilinx公司的KintexUltraScale系列FPGAXCKU060-2FFVA1156。板载2组64bit的DDR4SDRAM,每组容量2GB,可稳定运行在2400MT/s。支持PCIEGen3x8模式及一路FMCHPC接口。同时可提供Windows,Linux上位机驱动。 二、主要规格 ● 板载......