问题标签 [llvm-c++-api]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
llvm - 如何区分 LLVM 中的有符号和无符号整数
LLVM 项目不区分有符号和无符号整数,如此处所述。在某些情况下,您需要知道某个特定变量是否应该被解释为有符号或无符号,例如当它的大小扩展或在除法中使用时。我对此的解决方案是为每个变量保留一个单独的类型信息,描述它是整数还是基数类型。
但是,我想知道,有没有办法以这种方式在 LLVM 中“归因”一个类型?我一直在寻找可以添加到类型中的某种“用户数据”,但似乎什么都没有。这必须在创建类型时以某种方式发生,因为在 LLVM 中仅生成一次相同的类型。
因此,我的问题是:
有没有办法跟踪一个整数变量是否应该在 LLVM 基础设施中被解释为有符号或无符号,或者是像我一样保留单独信息的唯一方法?
谢谢
llvm-clang - 检查是否为 LLVM IR 生成 SIMD 机器
我有一个 C++ 程序,它使用 LLVM 库生成 LLVM IR 模块,并编译并执行它。
该代码使用向量类型,我想检查它是否在我的架构上正确转换为 SIMD 指令。
我怎么知道这个?有没有办法查看从这个 IR 生成的汇编代码?
c++ - clang::HeaderSearch 搜索路径被忽略
我试图clang::CompilerInstance
解析一个包含包含的源文件,但我不知道如何让它真正找到包含的标头。这是我的设置:
这些路径绝对是 100% 正确的,并一遍又一遍地检查它们。这一切都有效,直到我扔给它的源代码包含类似的东西#include <foobar.h>
,在这种情况下它会失败error 'foobar.h' file not found
,即使 foobar.h 肯定存在。我觉得我在这里遗漏了一些非常明显的东西。任何指向正确方向的指针?
llvm - 如何在 LLVM 元数据中存储任意数据?
我想在使用 LLVM C++ API 生成的模块中存储一组键值。如果可能的话,我想将其存储为元数据。未修改的 LLVM 版本是否有可能,还是我必须修改它?
c++ - 使用 cmake 将 LLVM 添加到项目中
我正在尝试将 LLVM 添加到 cmake 项目中,使用 cygwin 作为编译器。我从 cygwin 的安装程序下载了 LLVM(刚刚安装了所有与 llvm 相关的软件包)。这些文件在那里,但是我不能在我的项目中包含 LLVM。我尝试使用 3.5.2 的官方指南(它安装的版本),我的 CMakeLists.txt 看起来像
但是,我收到一堆这样的错误
难道我做错了什么?我想做的就是在我的项目中使用 LLVM。
llvm - 运行所有 LLVM Pass
我有一个 LLVM 模块,我想知道是否有一种简单的方法可以使用用于 -O3 的 C++ API 运行所有 LLVM 优化通道(无需单独注册每个通道)。
llvm - 使用 C++ API 进行 LLVM 优化
我试图弄清楚如何在 LLVM 模块上执行所有优化(例如,所有 -O3 优化)。我尝试了以下方法,但我不确定是否正在应用所有可能的优化(例如,内联)。
我还能做些什么来提高输出 LLVM IR 的性能吗?
编辑:我试图从AddOptimizationPasses()
函数中添加所有优化opt.cpp
,如下所示:
另外,我在创建FunctionPassManager
之前创建了一个PassManager
并添加了几个通道,如下所示:
但是,性能与使用 -O1 在命令行上运行相同,而使用 -O3 在命令行上可以获得更好的性能。有什么建议么?
llvm - 更改基本块的名称/标签(在 llvm 通行证中)
有没有办法更改 llvm 中特定基本块的名称/标签?
c++ - 与 LLVM JIT 代码共享 C++ 指针
我想让我的大部分程序都是一个普通编译的 C++ 程序。所述程序使用一块连续的内存作为堆栈。栈顶由普通指针维护。
我想与通过 LLVM JIT 生成的代码共享该指针。例如,给定:
wherepointerInc()
将 JIT'd 代码插入到当前BasicBlock
增量top
中。pointerInc()
代码是:
不幸的是,这不起作用。这是错误的(较大的)身体pointerInc()
。该代码实际上是从llc
一个增加指针的普通 C++ 程序上生成的 LLVM C++ API 代码派生的。
运行时,程序打印:
有两个问题:
- 这个对吗?我什至可以做我想做的事,即与 JIT 代码共享原始 C++ 指针吗?
- 为什么要转储核心?
即使我将 JIT 函数设为空,代码仍会在调用该函数的行处转储核心。LLVM JIT 设置代码看起来像我见过的所有示例,所以我也看不出有什么问题。
一点帮助?
更新
如果我更改已弃用的行:
到新行:
然后func_ptr
为空。
llvm - 创建对外部函数的调用
我正在制作仪表通行证。pass 应该以特定的方式修改给定的 IR。所需的修改之一是在特定位置插入对函数的调用。这是被调用函数的签名:
该函数的原型在include/llvmfoofile.h
中的一个文件中,
而函数定义在MCJIT文件夹中的文件中。并在此文件夹中运行正常,并且编译时使用,并且同一文件中的另一个函数可以按预期正常工作。不回仪表通行证。如何在给定的 IR 中向 foo 函数插入 callinst?这是插入调用的片段:foofile.cpp
make
foofile.cpp
MCJIT.cpp
注意: Args2
是一个包含 2 个指向函数和一个基本块的值指针的数组列表,bb
是插入调用的基本块。
当我在给定的 IR 上使用 op 运行传递时,它会正确生成声明和调用,如下所示:
宣言:
称呼:
但是当我尝试使用 lli 运行生成的 .ll 文件时,一切都爆炸了!这是堆栈跟踪之前的前 2 行:
我得出的结论是,问题在于它找不到 foo 函数。如果这是问题所在,我该如何正确创建 callinst?