我正在研究用C++编写的高性能系统.该过程需要能够在运行时理解一些使用为此应用程序开发的简单语言编写的复杂逻辑(规则).我们有两种选择:
解释逻辑 - 运行嵌入式解释器并生成动态函数调用,当接收数据时,基于解释逻辑处理数据
将逻辑编译成plugin.so动态共享文件,使用dlopen,dlsym加载插件并在运行时调用逻辑函数
选项2看起来非常有吸引力,因为它将是优化的机器代码,在运行过程中运行速度比嵌入式解释器快得多.
我正在探索的选项是:
如果我是正确的,LLVM IR将转换为LLVM字节代码或汇编代码.然后使用LLVM JIT在JIT模式下运行或使用GNU Assembler用于生成本机代码.
是否有可能在LLVM中找到这样做的功能?如果它是从代码中完成的,而不是使用来自C++的系统命令来调用"as"来生成我的需求的plugin.so文件,那将会更好.
如果您知道我可以在运行时从我的进程生成共享库本机二进制代码的任何方法,请通知我.
我正在尝试为我最近设计的自定义处理器编写LLVM后端.
我试着按照http://llvm.org/docs/WritingAnLLVMBackend.html上的官方教程进行操作
但它是如此模糊,如此不完整和模糊,我没有遵循它.
然后我开始在线搜索其他教程,所有这些教程都遇到了与原始教程相同的症状.作者似乎在没有必要的初步解释的情况下假设了许多预读并编写了他们的教程.
我怎样才能找到一个教程或任何可以让我在LLVM中编写功能后端的东西?
- 更新:我看到两张投票和两张投票.低票说我的问题与编程无关.我想知道主持人如何得出结论编写编译器与编程无关.
我通过扩展FunctionPass类在LLVM中编写了标准的Analysis传递.一切似乎都有意义.
现在我要做的是编写几个模块间通道,即允许我一次分析多个模块的通道.一个这样的传递的目的是构建整个应用程序的调用图.另一个这样的传递的目的是我有一个关于函数调用及其参数的优化的想法.
我知道LLVM中的过程间通过,通过扩展ModulePass类,但只允许在单个模块中进行分析.
我知道LLVM中的链接时间优化(LTO),但是(a)我不太清楚这是否是我想要的,(b)我没有找到关于如何实际编写 LTO传递的示例或文档.
如何在LLVM中编写一个模块间传递,即一个可以访问应用程序中所有模块的传递?
我是LLVM的新手,经过检查Value
和Instruction
上课.我看到这两个类都有方法uses
和user
.它们之间有什么区别?另外,关于这篇文章,我可以使用这些方法来确定一条指令是否产生一个值吗?
TNX.
如何让货物为我的项目发出LLVM-IR而不是二进制文件?我知道你可以使用这个--emit=llvm-ir
标志rustc
,但是我已经阅读了一些Github问题,这些问题表明不可能将任意编译器标志传递给货物.
有什么方法可以让货物直接发射LLVM-IR吗?
对于编写编译器,使用LLVM IR vs C作为目标语言有哪些优缺点?我知道两者都被使用了,我想如果我使用clang来编译C,那么最终的机器代码会是相似的.那么还有什么需要考虑的事情呢?
我有一个使用opt工具的ModulePass,但是我无法弄清楚如何在命令行中使用它.我目前使用my pass的工作流程是:
我希望将我的pass与clang命令行集成,以便可以作为现有软件(例如c ++标准库)构建的一部分调用它,而不必为我编译的每个东西重新构建整个构建系统.我已经看到了关于如何做到这一点的提示,但我无法将各个部分组合到一个正常工作的设置中.
使用Clang自动运行LLVM Pass会自动描述我想要的内容,但LLVM 3.4中似乎不推荐使用该方法(PassManagerBuilder已移至旧版命名空间).
LLVM - 使用clang自动运行自己的通行证似乎解决了基本问题,但我希望我能做到这一点,而不必修改clang(这似乎是那里的建议).
使用LLVM 3.4从clang获得新传递的最佳方法是什么?
从这个简单的C程序开始:
void nothing(void) {}
int main() {
int i;
for (i = 0; i < 10; ++i) {
nothing();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的传递输出如下:
注意:IR语句为绿色.
; Function Attrs: nounwind readnone ssp uwtable
define void @nothing() #0 {
entry:
ret void
}
; Function Attrs: nounwind readnone ssp uwtable
define i32 @main() #0 {
entry:
ret i32 0
}
Run Code Online (Sandbox Code Playgroud)
问:使用O3
其认为是最高级别的优化,为什么没有nothing
功能尚未消除的死代码?
我正在尝试将LLVM IR中的方法调用回C++代码.我正在使用64位Visual C++,或者正如LLVM所描述的那样:
Machine CPU: skylake
Machine info: x86_64-pc-windows-msvc
Run Code Online (Sandbox Code Playgroud)
对于整数类型和指针类型,我的代码工作正常.但是,浮点数似乎有点奇怪.
基本上这个电话看起来像这样:
struct SomeStruct
{
static void Breakpoint( return; } // used to set a breakpoint
static void Set(uint8_t* ptr, double foo) { return foo * 2; }
};
Run Code Online (Sandbox Code Playgroud)
和LLVM IR看起来像这样:
define i32 @main(i32, i8**) {
varinit:
// omitted here: initialize %ptr from i8**.
%5 = load i8*, i8** %instance0
// call to some method. This works - I use it to set a breakpoint
call void @"Helper::Breakpoint"(i8* %5)
// this …
Run Code Online (Sandbox Code Playgroud) clang++ -S -emit-llvm main.cpp && lli main.ll
在Linux上运行以下代码(Debian)
#include <future>
int main () {
return std::async([]{return 1;}).get();
}
Run Code Online (Sandbox Code Playgroud)
由于以下错误,无法在lli上运行:
LLVM ERROR: Cannot select: 0xd012e0:
i64 = X86ISD::WrapperRIP TargetGlobalTLSAddress:i64<i8** @_ZSt15__once_callable> 0 [TF=10]
0xd020c0: i64 = TargetGlobalTLSAddress<i8** @_ZSt15__once_callable> 0 [TF=10]
In function: _ZSt9call_onceIMNSt13__future_base13_State_baseV2EFvPSt8functionIFSt10unique_ptrINS0_12_Result_baseENS4_8_DeleterEEvEEPbEJPS1_S9_SA_EEvRSt9once_flagOT_DpOT0_
Run Code Online (Sandbox Code Playgroud)
问题:
这是什么意思?
是否有任何编译器标志可以解决此问题?
使用-stdlib=libc++
编译并成功运行*; libstdc ++使用哪些特定功能会导致此问题?
编辑:
这个问题背后的动机是理解libc ++和libstdc ++之间的差异,这些差异导致llvm的orcjit中的这个特定错误消息(在Linux上).
在OSX上,gcc已被弃用,默认情况下使用clang libc++
.要在OSX上重现此错误,您可能需要安装gcc和use -stdlib=libstdc++
.
这是llvm-ir(遗憾的是直接将它嵌入到这里)
llvm-ir ×10
llvm ×7
clang ×3
c++ ×2
llvm-c++-api ×2
llvm-clang ×2
c ×1
c++11 ×1
g++ ×1
lli ×1
llvm-3.0 ×1
llvm-codegen ×1
lto ×1
rust ×1
rust-cargo ×1