如何将IR保存为一个文件并将其建立为可执行文件?
现在,我将clang构建我的.c文件用于.s文件.我已经使用了LLVM API修改IR.但是,现在我无法将修改后的IR保存到文件中.我想使用" llvmwritebitcodetofile",但找不到" llvmopaquemodule"的构造;我想使用" writebitcodetofile",它总是向我展示"类型不匹配".我也想知道如何将IR文件构建到可执行文件. 接下来是我用来保存模块的两种方法: 1,首先使用writebitcodetofile bool unbuffered = false; llvm::raw_ostream ro(unbuffered); WriteBitcodeToFile(m, ro); 2,第二次使用llvmwritebitcodetofile const char *Path = "hello2.s"; int ans = LLVMWriteBitcodeToFile(m, Path); 注意:m是模块实例的
10 2024-04-05
编程技术问答社区
什么是装配中的功能?
我正在尝试研究组装,编译器(LLVM)和LIPTER. 我可以按NASM编写汇编代码. >) 以下是我的装配代码. section .data hello_string db "Hello World!", 0x0d, 0x0a hello_string_len equ $ - hello_string section .text global _start _start: mov eax, 4 ; eax
12 2024-03-17
编程技术问答社区
LLVM和编译器的命名方法
我正在研究LLVM系统,并且已经阅读了入门文档.但是,某些命名法(以及叮当示例中的措辞)仍然有些混乱.以下术语和命令都是汇编过程的一部分,我想知道某人是否可以对我解释更好: clang -S vs. clang -c(我知道-c有什么,但是结果有何不同?) * (编辑) llvm比特代码与llvm ir(有什么区别?) .ll文件与.bc文件(它们是什么,它们有什么不同?) llvm汇编代码 vs. 本机汇编代码(是否有区别?) 在更高的层面上,我了解整体汇编过程,并且可以通过 进行跟踪,我只是陷入了某些时候,例如,我希望看到" IR" ",而是看到"比特码"或" llvm组装",这使我认为我几乎不理解它们! 解决方案 clang用法 通常,Clang接受与GCC相同的命令行选项. -c选项(仅编译和组装,不链接)和-S选项(仅编译,不组装或链接)在这两个中表示相同的内容. llvm关于中间表示的条款 从我的另一个网站上的答案: llvm
10 2024-03-17
编程技术问答社区
Abi的生锈用于通过结构
在x86_64系统上,当返回值小于或等于16个字节时,它通过寄存器rax和rdx传递,当返回值大于16个字节时,它将通过第一个SRET参数传递.但是,Rust似乎不遵守此规则. 在c profram示例中: struct test_struct { int a; int b; int c; }; struct test_struct foo() { struct test_struct a = {1,2,3}; return a; } LLVM IR中的此功能如下: define dso_local { i64, i32 } @foo() 我们可以看到返回值通过寄存器传递. 在Rust Profram中示例: pub struct test_struct { a: i32, b: i32, c: i32, } pub fn foo() -> test_struct { let data =
20 2024-03-17
编程技术问答社区
有可能从汇编文件中获得LLVM-IR吗?
我使用命令编译了.S文件: clang-8 -c funcs.s -o funcs.o -emit-llvm 我发现,该.o文件是以ELF格式生成的. 期望我看到LLVM-IR格式(在结果文件的开头中带有" BC"字符). 似乎,clang忽略了" -emit-llvm"标志. 解决方案 您的问题与可以将汇编语言转换为llvm ir,对其进行优化,然后将其重新编译为其他体系结构?. ASM源和二进制可执行文件/对象文件基本上等于此问题.您仍在尝试将LLVM-IR反复编译.这很难,我不知道是否存在分解器. 似乎,clang忽略了" -emit-llvm"标志. 不,它并没有影响您要求其执行操作的任何步骤. 您要求编译器编译为.o,因此这样做. 如果输入是.c并且输出a .s,它将能够发射llvm-ir,但是在这种情况下,llvm-ir并不是组装.s的过程的一部分.到.o. 因此,在运行clang时,该程序的LLVM-ir表示不存在
12 2024-03-17
编程技术问答社区
创建LLVM IR的方法
我正在创建Clang工具,我想从Clang AST生成LLVM IR.我知道可以使用 *.ll文件的-emit-llvm选项,但是是否可以生成IR内部代码的方法?我可以称之为clang ast或ast上下文并返回llvm::Module的某种方法?我找不到任何显示这一点的示例. 编辑: 因此,我尝试为此使用CodeGenaction,但我无法正常工作.我最终遇到了未解决的外部符号错误.我想念什么吗? #include #include #include #include #include #include
28 2024-01-09
编程技术问答社区
Vim的LLVM-IR语法折叠
我正在使用clang -emit-llvm生成的LLVM-IR代码,并希望获得代码折叠工作. 到目前为止,我正在使用foldmethod=expr和foldexpr=LLVMFold(). 我想使用LLVM存储库中的语法文件使用基于语法的折叠(即foldmethod=syntax). 在此处提供. 请注意,第一个正则是标签的语法文件. function! LLVMFolds() let thisline = getline(v:lnum) if match(thisline, '^[-a-zA-Z$._][-a-zA-Z$._0-9]*:') >= 0 return ">2" elseif match(thisline, '^\}$') >= 0 return "= 0 return ">1" else
86 2023-11-19
编程技术问答社区
在llvm ir中将bool的向量转换为整数
我正在编写涉及向量操作的LLVM-IR代码.我对" ICMP"指令进行了整数矢量比较,该指令导致bool的向量说,我的问题是我要将这8位转换为其相应的整数值,而遍历向量(从矢量中提取元素),我尝试了"位 i8",似乎将向量的第一位转换为i8,如果错了,请纠正我.有人可以建议我做到这一点吗? define i8 @main() #0 { entry: %A = alloca [8 x i32], align 16 %B = alloca [8 x i32], align 16 %arrayidx = getelementptr inbounds [8 x i32], [8 x i32]* %A, i64 0, i64 0 store i32 90, i32* %arrayidx, align 4 %arrayidx1 = getelementptr inbounds [8 x i32], [8 x i32]* %A, i64 0
16 2023-11-17
编程技术问答社区
使用LLVM通道添加内含物
我使用LLVM通行证为输入代码添加了固有的固有.我可以看到固有的调用,但是我不知道如何将代码编译到目标体系结构(x86_64).我正在运行以下命令: clang++ $(llvm-config --ldflags --libs all) ff.s -o foo ,但链接器抱怨不确定的参考: /tmp/ff-2ada42.o: In function `fact(unsigned int)': /home/rubens/Desktop/ff.cpp:9: undefined reference to `llvm.x86.sse3.mwait.i32.i32' /tmp/ff-2ada42.o: In function `fib(unsigned int)': /home/rubens/Desktop/ff.cpp:16: undefined reference to `llvm.x86.sse3.mwait.i32.i32' /home/rubens/Desktop/ff.
20 2023-11-06
编程技术问答社区
LLVM尾部调用优化
这是我对事物的理解: 函数" f"是尾巴递归的,当自我调用是其最后一个动作. 可以通过形成循环而不是再次调用函数来显着优化尾部回归;该函数的参数已更新到位,并且身体再次运行.这称为递归尾部调用优化. LLVM使用FastCC,GHC或Hipe呼叫约定时实现递归尾巴调用优化. http://llvm.org/docs/codegenerator.html#tml#tail-call-optimization http://llvm.org/docs/codegenerator.http://llvm.org/docs/codegenerator. 我有一些问题: 让我们考虑一下愚蠢的例子: int h(int x){ if (x
26 2023-10-14
编程技术问答社区
在使用llvm库构建时,我如何进行链接?
我正在尝试解析llvm-ir文件(.ll)并进行静态分析. 我在下面找到了此示例代码,我尝试构建它,但我不知道要链接哪个库. #include #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IRReader/IRReader.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; int main(int argc, char** argv) { if (argc
24 2023-09-29
编程技术问答社区
如何在LLVM中编写自定义的联运通行证?
我已经在LLVM上写了一份标准分析通行>课.一切似乎都有意义. 现在,我想做的是写几个跨模型通行证,也就是说,可以让我一次分析多个模块.这样一个通行证的目的是构建整个应用程序的调用图.另一个通过的目的是,我有一个涉及函数调用及其参数的优化的想法. 我通过扩展 modulefrer"> clastepass clast,但这仅允许在单个模块中进行分析. 我知道 link Time Optimization(lto)在LLVM中m还不清楚这是否是我想要的,(b)我没有发现有关如何实际写 lto Pass的示例或文档. 如何编写一个载体通行证,即可以访问应用程序中所有模块的通行证,llvm? 解决方案 我找到了一种实现目标的方法:编写一个简单的程序,该程序使用llvm::parseBitcodeFile()在比特码文件中读取并创建可以穿越和分析的对象.这不是理想的,因为它不是可以在LLVM框架内运行的通行证.但是,它是实现我一次分析多个模块的目标的一种方法.
32 2023-09-29
编程技术问答社区
LLVM JIT编译的程序无法找到外部函数
我的程序jit汇总了llvm ir模块并调用在运行时定义的函数foo如果foo使用外部定义的函数,则在运行时失败: LLVM ERROR: Program used external function 'glutInit' which could not be resolved! 我的程序: // foo1.cpp #include extern "C" void foo() { glutInit(0,0); } // foo2.cpp #include #include #include #include #include #include #include #incl
22 2023-08-31
编程技术问答社区
如何在LLVM IR中使用RISC-V Vector(RVV)指令?
在 Kruppe and Espasa give an overview of the RISC-V Vector extension (RVV) and on 幻灯片16 它们显示了通过固有函数使用矢量说明的LLVM IR样品,例如: %vl = call i32 @llvm.riscv.vsetvl(i32 8) 在谈话时(2019年4月)在但是,当我拉动当前主并构建它并尝试使用llc编译示例代码(用--mtriple=riscv32-unkown-none-rv32imv指定目标)时,我会得到以下错误: error: ../llvm-project/build/bin/llc: test.ll:4:18: error: use of undefined value '@llvm.riscv.vsetvl' 看来V扩展名可用,因为llc -march=riscv32 -mattr=help列出了它: Available features for this t
16 2023-08-11
编程技术问答社区
如何使用llvm的内在因素@llvm.read_register?
我注意到llvm.read_register()可以读取堆栈指针的值,以及llvm.write_register()可以设置堆栈指针的值.我将主要功能添加到stackpointer.ll中,该功能可以在LLVM SRC中找到: ;stackpointer.ll define i32 @get_stack() nounwind { %sp = call i32 @llvm.read_register.i32(metadata !0) ret i32 %sp } declare i32 @llvm.read_register.i32(metadata) nounwind !0 = metadata !{metadata !"sp\00"} define i32 @main() { %1 = call i32 @get_stack() ret i32 %1 } 我在运行Ubuntu的ARMV7板上测试了11.04: lli st
116 2023-06-20
编程技术问答社区
LLVM: 通过OCaml绑定定义一个新类型
我正在使用LLVM OCAML绑定来构建一种非型语言的编译器.不幸的是,我唯一的参考是llvm.mli来自源头. 所以,我尝试声明value_t如下: let llar = [| i64_type; array_type i8_type 10; vector_type i64_type 10 |] in let value_t = struct_type llar in declare_global value_t "value_t" the_module 在我生成函数之前.发射的是: @value_t = external global { i64, [10 x i8], } 稍后引用它,我尝试使用type_by_name,但没有任何匹配.如果使用lookup_global,我会得到llvalue而不是lltype(我该怎么办?).我想我真正想要的是: @value_t = t
24 2023-06-20
编程技术问答社区
找到指向LLVM中赋值的指令的指针
假设我有一个指向LLVM中某个值* val的指针.我想将指示指示指示,该指令将值分配给Val指向的变量.我该怎么做? 这是代码 的示例 %add = add nsw i32 %aa, %bb %div = sdiv i32 %add, %cc 我有一个指向变量add的指针,我想获取指向分配给变量添加的指令的指针,这是指向%add = add nsw i32 %aa, %bb指令的指针 到目前为止,我唯一发现的是该变量属于基本块的指针.这就是我的做法 Instruction * tmpI = dyn_cast(val); BasicBlock * b = tmpI->getParent(); 解决方案 正确答案是提供在 jmmartinez "> jmmartinez 的评论中 LLVM-IR是一种静态单式分配中间表示.指示指示的指针是指向分配的指针.添加指令和对添加寄存器的分配具有一对一的匹配,因为只能分配一次寄存器,并且指令只
24 2023-06-20
编程技术问答社区
如何使用LLVM API动态分配和访问一个数组?
我想为这样的C ++代码生成LLVM IR: T *arr = (T*) malloc(sizeof(T) * 100); arr[0] = somevalue; 这是我的代码: llvm::Type* element_type = /... some T type .../; llvm::Type* int32type = llvm::Type::getInt32Ty(context); auto element_size = llvm::ConstantInt::get(int32type, data_layout.getTypeAllocSize(element_type)); auto array_size = llvm::ConstantInt::get(int32type, 100); // malloc: auto malloc_inst = llvm::CallInst::CreateMalloc( ir_builder.GetInsertBl
26 2023-06-20
编程技术问答社区
LLVM插入从另一个文件定义的函数调用
我想在某个指令之前插入一个函数,但是在另一个文件中定义了函数调用.我尝试了 IRBuilder Builder(pi); CallInst *callOne = Builder.CreateCall(func_ins, "foo"); 其中func_ins是Function*(或Value*更一般),而foo是分配了调用函数的变量名称前缀. 由于此函数是在另一个文件中定义的,因此我不知道指针func_ins应该指向的位置,因此我将其设置为 null ,但它不起作用. 谁能给我一些有关如何解决此问题的提示? 另一个问题是,我可以使用WriteBitcodeToFile丢弃具有外部功能调用文件的仪器代码,因为我想知道它可以在执行模块检查时报告Referencing function in another module或Broken Module? 解决方案 您只能调用来自同一Module的函数,并且您不得将NULL用作callee. 如果该函数是在另一
32 2023-06-20
编程技术问答社区