如何编写发出特定于体系结构的系统调用指令所需的LLVM位码?更具体地说,clang支持内联汇编,并且明确支持发出系统调用(否则无法编译libc和vdso)。翻译是如何为此工作的,我怎样才能让它重现这种行为?我理解LLVM本身可能无法理解各种体系结构使用的调用接口(interface)和寄存器调度,这些调用接口(interface)和寄存器调度以足够高的方式在LLVM字节码中表达(例如,可能在其他地方填写)。但是,显然有一个可以添加此信息的阶段。我该怎么做,从“带有内联汇编的C源代码”之后的任何阶段开始?一个令人满意的答案将包括一个如何调用五参数int0x80系统调用的示例。我选择了五个
我目前正在使用LLVM'sObjectFile(记录为here)来表示可执行文件。我已成功读取ObjectFile的可执行文件,并想确定我的可执行文件中的哪些调用目标地址对应于通过调用begin_dynamic_symbols()函数。遍历symbol_iterator中的每个符号会得到每个符号的名称及其地址,但由于符号是动态的,因此每个符号的地址为-1;这表明ObjectFile没有将符号名称直接与其对应的调用目标地址相关联。有什么方法可以确定ObjectFile中哪些调用目标地址映射到哪些动态符号?如果可以避免这样做,我宁愿不手动计算通过PLT和GOT的所有跳转。
我正在开发一个用C++编写的高性能系统。该过程需要能够在运行时理解一些复杂的逻辑(规则),这些逻辑(规则)是用为此应用程序开发的简单语言编写的。我们有两种选择:解释逻辑-运行嵌入式解释器并生成动态函数调用,当接收到数据时,根据解释的逻辑对数据进行处理将逻辑编译成plugin.so动态共享文件,使用dlopen、dlsym加载插件并在运行时调用逻辑函数选项2看起来非常有吸引力,因为它将优化机器代码,在此过程中运行速度比嵌入式解释器快得多。我正在探索的选项是:编写一个编译方法stringcompile(stringlogic,list&errors,list&warnings)这里的输入逻
我想在一个模块中执行函数,这个模块将在其他模块中解决依赖关系。模块可能会改变(动态编译环境),所以我不希望在单个单体模块中链接所有依赖项,也就是说,如果可以避免的话我希望使用Linker::linkModules但这总是对源模块具有破坏性。这对于一个依赖于一个模块的模块来说是可以的,因为如果那个模块发生了变化,这没什么大不了的,但是重建和重新链接N-1个模块不是因为一个模块发生了变化而没有变化的过度吗?我想知道是否有可以用于JIT执行的非破坏性版本的linkModules。 最佳答案 试试这个:Linker::LinkModules
在llvm的编译器实现教程(例如here)中使用了llvm::make_unique。他们不使用std::make_unique的原因是什么?我找不到任何明确的文档。 最佳答案 TL;DR;LLVM是使用符合C++11的代码编写的,而std::make_unique是一个C++14特性。所以如果他们想要make_unique他们需要实现它。详情如果我们转到LLVMCodingStandardsC++StandardVersionssection说:LLVM,Clang,andLLDarecurrentlywrittenusingC+
我创建了一个基本函数Foo1调用另一个Bar2通过调用。unwindcleanup基本block中的第一条指令必须是着陆台:voidbar2(){throw;}llvm::Function*Bar2Fn=llvm::Function::Create(voidSig,&bar2);engine->addGlobalMapping(Bar2Fn,(void*)&bar2);llvm::InvokeInst*inv=builder.CreateInvoke(Bar2Fn,continueBlock,unwindBlock,llvmArgValues,"invoke");builder.Cre
我有一个简单的C++应用程序,它应该从POSIX命名管道中读取行:#include#include#includeintmain(){std::ifstreampipe;pipe.open("in");std::stringline;while(true){std::getline(pipe,line);if(pipe.eof()){break;}std::cout步骤:我创建了一个命名管道:mkfifoin。我使用g++-std=c++11test.cpp&&./a.out编译和运行C++代码。我将数据输入到in管道:sleepinfinity>inkeeppipeopen,av
llvm::SmallVector的实现分为多种类型:llvm::SmallVectorBase持有3void*s表示开始、结束和容量。llvm::SmallVectorTemplateCommon保存小型存储的第一个元素,作为一个适当对齐和大小的char数组。llvm::SmallVector持有下一个N-1小型存储的元素,作为适当对齐和大小的数组char数组。为什么在两个类模板之间进行存储拆分,而不是让派生最多的类(SmallVector)简单地存储所有N元素并将指向此存储的指针传递给基类?也就是说,当前默认构造函数的作用是:SmallVector():SmallVectorImp
LLVM核心项目包括:编译器-将源代码转换为LLVMIRVM-执行编译后的IR代码如何将VM嵌入到C++应用程序中? 最佳答案 LLVM确实是您可以链接到的库集合,因此它很容易嵌入。更常见的是,LLVM获取您生成的IR并将其直接编译为机器代码。还有一个库可用于为不支持JIT编译的平台解释和执行IR。这里的LLVM网站上有一个很好的教程:http://llvm.org/docs/tutorial/.我建议您先检查一遍,然后再问更具体的问题(如果有的话)。 关于c++-如何嵌入LLVM?,我
我正在尝试在创建共享库的CMake项目上使用LLVM应用链接时间优化。我的问题和这个问题差不多:SwitchingbetweenGCCandClang/LLVMusingCMake.但是,答案似乎不再适用,因为新版本中不存在llvm-ld。在命令行上,我运行以下命令来获取LTO(假设只有2个.cpp文件):编译成字节码:clang++-cFirstClass.cpp-O3-flto-oFirstClass.bcclang++-cSecondClass.cpp-O3-flto-oSecondClass.bc链接字节码:llvm-linkFirstClass.bcSecondClass.b