草庐IT

llvm-codegen

全部标签

c++ - LLVM 编译器优化错误还是什么?

我偶然发现了一个我无法理解的有趣问题。背景是:XCode上的LLVM4.2编译器编译时支持c++11用-Os编译为armv7/armv7s架构编译现在我意识到在启用优化的情况下编译时出现的一些代码存在问题。代码是,逐字:staticintfoo(inttx,intsx,intw){intvs=60;if(sxw-vs*2)return(sx+w-tx);elseif(sx>w-vs*2&&tx现在,通过使用LLDB,我逐步跟踪了一个奇怪的错误,这让我意识到if的第一个分支是带输入的sx=648tx=649w=768vs=60(这些值直接取自XCode中的locals表,我无法查询lld

c++ - 如何将 llvm::outs() 重定向到文件?

我正在使用一些LLVM工具(如llvm-nm)作为静态库。IE。我复制了源代码llvm-nm.cpp,将main(..)重命名为llvm_nm(..)并将其编译为静态库。我想将标准输出转发到我的文件。我尝试使用下一种方法:intout_fd,err_fd;fpos_tout_pos,err_pos;//redirectoutfflush(stdout);fgetpos(stdout,&out_pos);out_fd=dup(fileno(stdout));freopen(outFilename,"w",stdout);//executeintret=llvm_nm(argc_,argv

c++ - LLVM 自动 C++ 链接

在一些LLVM教程中,我看到可以相当容易地将C函数绑定(bind)到基于LLVM的自定义语言中。LLVM为程序员提供了一个指向函数的指针,然后可以将其与LLVM生成的代码混合。使用C++库执行此操作的最佳方法是什么。假设我有一个相当复杂的库,如Qt或Boost,我想将其绑定(bind)到我的自定义语言。我是否需要创建stub库(如Python或Lua需要),或者LLVM是否提供某种外部函数接口(interface)(FFI)? 最佳答案 在我的LLVM代码中,我为此创建了extern"C"包装函数,并将LLVM函数声明插入到模块中以

c++ - llvm-ld 仍然存在于 clang 3.4 吗?

我上次检查clang时它的版本是3.1/3.2,现在我在Ubuntu13.0464位下,我从官方apt存储库安装了clang和llvm(加上工具),但没有任何痕迹llvm-ld-3.4、llvm-ld-3.0和llvm-ld-3.1是我的网站上可用的此工具的仅有的2个版native器,我的问题是:我应该用什么来替换llvm-ld并生成库或机器可执行文件? 最佳答案 llvm-ld不再存在。来自LLVM3.2releasenotes:llvm-ldandllvm-stubhavebeenremoved,llvm-ldfunctiona

c++ - "Live"代码和使用 C++ 和 LLVM JIT 的快速原型(prototype)制作?

您可能已经看过BretVictor's"live"JSIDE,或一些alternativeimplementations它激发了灵感,扩展到其他语言,但仍然保留基于VM的语言。但是昨天,我偶然发现了thesameconcept,appliedingoodoldC++,感谢LLVM。仍然是一个非常早期和不成熟的实现,但具有很大的潜力。我真的很好奇这个实现,但是作者已经并且可能不会公开发布它。所以我的问题是,如果有人知道如何实现类似功能的资源,我的意思是几乎瞬时编译和两个连接,提供代码的实时反馈,允许视觉部分更改甚至生成和预览附加代码? 最佳答案

c++ - LLVM 字符串值对象 : How can I retrieve the String from a Value?

当从现有的AST构建IR时,我的AST有一些字符串值(在编译时它们是从std::string构建的)并且我想将它们安全地设置为llvm::Value用作表达式的一部分。在这种情况下,我不需要在运行时绑定(bind)字符串,因为字符串值仅用于在编译时将内容解析为变量、函数或类(该语言不支持native字符串类型)。什么是将我的字符串内容保持为llvm::Value并且仍然能够在编译的后期阶段检索它的最佳方法(当构建嵌套表达式时)?更具体地说,如果我将llvm::Value设置为:llvm::Value*v=llvm::ConstantArray::get(llvmContext,mySt

使用 Apple 的 LLVM 编译器编译 -O 时出现 C++ 代码段错误,但使用 g++ -7.2.0 时则不会

更新:我创建了一个更多的M,但仍然是重现崩溃的CVE。摘要:删除了Base类中对Bool*bools_字段的所有使用(但它仍然必须定义,否则不会发生崩溃)。还从Base及其后代中删除了Base::Initialize()和虚方法Rule。附上新的MCVE。我已经设法为此代码创建了一个MCVE并将其发布在下方。一些描述性细节:代码使用虚基类和派生类,某些实例化的派生类具有调用从“基”类继承的非虚方法的构造函数(实际上是派生类,但在继承层次结构比我所说的“派生”类)来初始化“基”类数据。该方法调用在派生类中重写的虚方法。我意识到这是一件危险的事情,但根据我对C++的(可能有限的)理解,它似

c++ - 将编译器从 x86 汇编移植到 LLVM

最近,为了磨练我的汇编技能,我用C++为玩具语言编写了一个非常简单的编译器。它运行单channel,并在解析阶段直接将代码发送到多个字符串流,每个字符串流代表一段代码(即一个代表section.bss,而其他代表.data和.text)。然后,将这些字符串流写入一个文件,我使用NASM和gcc来组装和链接它们。我知道这种单遍方法效率极低,但同样,这更像是一种理解代码生成阶段的练习,而不是其他任何东西。无论如何,我想修改我的代码以直接发出LLVMIL而不是原始汇编,再次作为学习练习。是否有任何关于LLVMIL的入门级指南?或者,更好的是,一个工具来确定一行汇编的等效IL代码?我看了看,只

c++ - 是否可以将 LLVM 位码文件读入 llvm::Module?

我正在使用LLVM编写编译器。每个源文件都被编译成一个LLVM位码文件。最终,链接器将所有位码文件链接并优化为一个最终的二进制文件。我需要一种方法来读取编译器中的位码文件,以便访问类型信息。LLVM文档显示了一个名为BitcodeReader的类,但它似乎是LLVM的内部类。是否有任何可公开访问的方式将位码文件读入llvm::Module? 最佳答案 我查看了llvm-dis工具的源代码,找到了我要找的功能:Module*ParseBitcodeFile(MemoryBuffer*Buffer,LLVMContext&Context

windows - 如何从 LLVM ir 创建可执行文件?

我目前正在使用llc使用命令行将.ll文件转换为.s。然后我想拿这个文件然后使用nasm从中创建可执行文件。虽然第一步似乎工作正常,但我无法让第二步工作。原始文件名为code.ll,包含以下代码:definei32@main(){reti320}现在我使用cmd通过键入以下内容来构建.s文件:llccode.ll这工作正常并创建一个包含以下代码的code.s文件:.def@feat.00;.scl3;.type0;.endef.globl@feat.00@feat.00=1.def_main;.scl2;.type32;.endef.text.globl_main.align16,0x