我正在尝试了解LLVM基础架构。我已经在MinGW安装上安装了适用于Windows的LLVM二进制文件。我正在学习在LLVM网站上找到的关于所谓的Kaleidoscope语言的教程。我有一个源文件完全代码listattheendofthispage.此外,如果它有任何重要性,我将使用以下标志进行构建(提前通过llvm-config获得,因为Windowsshell没有非常舒适的替换语法):clang++-g-O3kaleido.cpp-okaleido.exe-IC:/MinGW/include-DNDEBUG-D__NO_CTYPE_INLINE-D_GNU_SOURCE-D__ST
对于由BasicBlock类表示的LLVM基本block,我如何确定哪个最近的循环(如果有)包含该block。我想在runOnModule传递中识别它。 最佳答案 您可以注册一个LoopInfo依赖项并使用getLoopFor(BasicBlock*BB):Loop*llvm::LoopInfo::getLoopFor(constBasicBlock*BB)const您可以在以下位置查看文档:http://llvm.org/doxygen/classllvm_1_1LoopInfo.html#a4abca289c73cd0948
我在RHEL6.x机器上运行,当然安装了GCC4.4。我希望在这台机器上运行LLVM。为此,我必须从源代码编译它。为了做到这一点,我需要一个更现代的GCC版本。所以,关注theinstructions,我已经构建了GCC4.8.2:[snip]%$PWD/../gcc-4.8.2/configure--prefix=$HOME/toolchains--enable-languages=c,c++%make-j$(nproc)%makeinstall我以root身份登录,所以$HOME/toolchains解析为/root/toolchains。满足LLVM的先决条件后,我就可以配置和构
在LLVMtutorials有如何编写简单的JIT编译器的说明。不幸的是,本教程中的词法分析器和解析器是手动编写的。我在想,这样的解决方案适合学习目的,但不适合编写复杂的、生产就绪的编译器。似乎GCC和其他一些“大编译器”是手写的。但我认为,所有这些解析器生成器在编写自己的编译器时都提供了很大的插入力(尤其是当您独自完成时,没有团队)。是否可以将任何现有的解析器生成器(如Bison/Antlr/Packrat/Elkhound等)与LLVM一起使用来创建JIT编译器?我希望能够不断地(不是一开始就)用表达式“喂养”解析器,并在运行时编译它们。另外,我发现了很多关于“最好的、现代的”解析
我正在尝试使用Clang构建V8Javascript引擎并输出.ll文件。我正在尝试合并信息here和here去做这个。但是,当我尝试make时,它失败了,显示“Noruletomaketarget”。我搞不清楚了。我试过只编译v8.cc,但完全失败了。我想这是因为我试图通过将它作为编译器放入来强制-emit-llvm,但我不确定。$cdv8$exportCXX="clang++-S-emit-llvm"$exportCC="clang-S-emit-llvm"$exportCPP="clang-E-S-emit-llvm"$exportLINK="clang++-S-emit-llv
我正在编写一个LLVMpass。对于一条指令(llvm::InstructionClass),如何判断一条指令是否为PHI指令? 最佳答案 我找到了解决方案。您可以像这样检查PHI节点,isa(inst). 关于c++-如何检查指令是否为LLVMIR中的PHI指令,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/9470505/
我有ConstantInt和ConstantFP值,我想使用fadd添加它们。但是,我无法将ConstantInt转换为fadd可接受的float。代码摘录如下:Value*left=ConstantInt::get(Type::getInt64Ty(getGlobalContext()),12,true);Value*right=ConstantFP::get(Type::getFloatTy(getGlobalContext()),11.6);Instruction*cast=CastInst::Create(Instruction::SIToFP,left,left->getTy
我正在玩具编译器(第一次)上取得进展,并试图了解如何分配/构造LLVM结构类型。Kaleidoscope教程没有包括甚至没有提到这一点,我不知道我在LLVM源/测试中寻找什么来找到可能的例子。所以我写了一个简单的C++示例,用clang转储了IR,试图理解它产生了什么,但老实说,我并没有完全遵循它。对我来说显而易见的是函数定义/声明和一些函数调用以及memset调用,所以我得到了它的一部分,但它还没有全部组合在一起。(P.S我对alloca指令文档的解释是它创建的任何东西在返回时都会被释放所以我不能使用那个权利,它基本上只用于局部变量?)我所做的是:alloc.cppstructAll
我已经从源代码安装了clang和llvm,并且正在尝试使用新标准的特性编译一些C++代码。我发现,例如使用forranges例如for(i:vector)工作正常,当我需要导入标题时遇到问题(找不到头文件),例如或.我是否需要使用新的libc++才能使用这些header,或者我是否需要进行简单的构建更改?目前,我刚刚将clang和llvm构建到我的主目录中的一个文件夹中,并从那里调用clang++。 最佳答案 参见http://clang.llvm.org/get_started.html.IfyouintendtoworkonCl
获取BasicBlock的前辈的最简单方法是什么?在LLVM框架中?我看过DepthFirstIterator和idf_iterator,但实际上我需要对控制流图进行广度优先搜索。我觉得这应该很容易,但从我一直在网上探索的文档或示例来看,这并不明显。 最佳答案 文档中并不清楚,但是basicblockclass支持pred迭代器,它将前身提供给基本block。在C++11风格中,可以按如下方式循环遍历block的前导:BasicBlock*B=...for(autoit=pred_begin(B),et=pred_end(B);it