关于llvm:C-打印生成的-LLVM-IR-以及-写入文件

如果你的指标是运行 LLVM IR, 则不倡议写入文件, 因为 LLVM 提供了 JIT 的形式间接从 C++ 运行. 后续会有相干文章链接放在此处.首先, 咱们必须有一个 LLVM Module 作为根底, 也就是生成 LLVM IR 的时候应用的 Module, 此处应用 theModule 作为例子. 查找 llvm/IR/Module.h 文件, 理解到 print 函数承受如下参数: 应用如下参数, 能够将后果输入到命令行, 即 stdout 或者 stderr. /* llvm ir -> stdout */theModule->print(llvm::outs(), nullptr);/* llvm ir -> stderr */// llvm_module -> print(llvm::errs(), nullptr);应用如下代码, 能够将后果输入到文件 output.ll 中: std::error_code EC;llvm::raw_fd_ostream output_stream( "output.ll", /* file name */ EC, llvm::sys::fs::OpenFlags::OF_None);if (EC) { std::cerr << "Can't open file output.ll; " << EC.message() << std::endl;}/* write to current_work_directory/output.ll */theModule->print(output_stream, nullptr);输入的文件关上后为人类可读代码, 能够应用 lli 工具执行, 在此咱们应用 C++ 的 system 函数: ...

February 26, 2024 · 1 min · jiezi

关于llvm:llvm-IR语法-全局变量

全局变量@.str.9 = private unnamed_addr constant [12 x i8] c"jinjingTest\00", section "__TEXT,__cstring,cstring_literals", align 1 @示意全局变量 与之绝对应的%示意局部变量,以%前缀 private 示意公有的 unnamed_addr 示意地址不重要,只有内容.被标记成这样的常量如果领有雷同的初始化器,能够合并. 比如说下面的 "jinjingTest"能够和其余的内容为"jinjingTest"的常量合并.local_unnamed_addr示意地址在模块中被认为是不重要的 constant 示意常量 [12 x i8] 示意12个1字节(i8为8位)的数组,也可示意字符串,这里包含分隔符\00 c"jinjingTest\00" 为llvm里的初始化器,示意c字符串,\00为结尾符 section 示意存储在Mach-o中的section中央 align 1 示意内存对齐为1,就是其中有余1的依照1对齐 语法如下: @<GlobalVarName> = [Linkage] [PreemptionSpecifier] [Visibility] [DLLStorageClass] [ThreadLocal] [(unnamed_addr|local_unnamed_addr)] [AddrSpace] [ExternallyInitialized] <global | constant> <Type>[<InitializerConstant>] [, section "name"] [, comdat [($name)]] [, align <Alignment>] (, !name !N)*Linkage 链接类型PreemptionSpecifier 运行抢占阐明Visibility 可见性规定DLLStorageClass DLL存储类别ThreadLocal 线程存储模型[(unnamed_addr|local_unnamed_addr)] 地址不重要或模块中地址不重要[AddrSpace] 地址空间?[ExternallyInitialized] 内部曾经初始化? <global | constant> 全局或常量Type 类型InitializerConstant 初始化器,即初始化值,section "name" 寄存的section段,后面有","和后面宰割,align <Alignment> 对齐类型, 后面有","和后面宰割 ...

June 17, 2022 · 1 min · jiezi

关于llvm:llvm-自动加载插件不用opt-load-libtestdylib-mypasses

https://llvm.liuxfe.com/post/...

April 11, 2022 · 1 min · jiezi

关于llvm:基于legacy-pass-manager的pass编写

1.在github页面下载最新的llvm工程,当初最新的版本应该对应着是llvm13 2.在llvm-project/llvm/lib/Transforms文件夹新建自定义的pass文件夹 cd llvm-project/llvm/lib/Transformsmkdir MyPass在MyPass文件夹下新建一个CMakeLists.txt 写入 add_llvm_library( MYPass MODULE MYPass.cpp DEPENDS intrinsics_gen PLUGIN_TOOL opt )3.在llvm-project/llvm/lib/Transforms/CmakeLists.txt中增加文件夹目录 add_subdirectory(MYPass) 4.编写Pass #include "llvm/ADT/Statistic.h"#include "llvm/IR/Function.h"#include "llvm/Pass.h"#include "llvm/Support/raw_ostream.h"#include "llvm/IR/LegacyPassManager.h"#include "llvm/Transforms/IPO/PassManagerBuilder.h"using namespace llvm;#define DEBUG_TYPE "hello"STATISTIC(HelloCounter, "Counts number of functions greeted");namespace { // Hello - The first implementation, without getAnalysisUsage.struct Hello : public FunctionPass { static char ID; // Pass identification, replacement for typeid Hello() : FunctionPass(ID) {} bool runOnFunction(Function &F) override { ++HelloCounter; errs() << "Hello: "; errs().write_escaped(F.getName()) << '\n'; return false; } void getAnalysisUsage(AnalysisUsage &AU) const override { AU.setPreservesAll(); } void releaseMemory() override { errs() << "releaseMemory"; }};}char Hello::ID = 0;static RegisterPass<Hello> X("hello", "Hello World Pass",false,false);static RegisterStandardPasses Y2(PassManagerBuilder::EP_EarlyAsPossible,[](const PassManagerBuilder &Builder,legacy::PassManagerBase &PM) { PM.add(new Hello()); });5.构建和编译pass ...

March 25, 2022 · 1 min · jiezi