问题标签 [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.

0 投票
1 回答
3897 浏览

llvm - 如何区分 LLVM 中的有符号和无符号整数

LLVM 项目不区分有符号和无符号整数,如此所述。在某些情况下,您需要知道某个特定变量是否应该被解释为有符号或无符号,例如当它的大小扩展或在除法中使用时。我对此的解决方案是为每个变量保留一个单独的类型信息,描述它是整数还是基数类型。

但是,我想知道,有没有办法以这种方式在 LLVM 中“归因”一个类型?我一直在寻找可以添加到类型中的某种“用户数据”,但似乎什么都没有。这必须在创建类型时以某种方式发生,因为在 LLVM 中仅生成一次相同的类型。

因此,我的问题是:

有没有办法跟踪一个整数变量是否应该在 LLVM 基础设施中被解释为有符号或无符号,或者是像我一样保留单独信息的唯一方法?

谢谢

0 投票
1 回答
174 浏览

llvm-clang - 检查是否为 LLVM IR 生成 SIMD 机器

我有一个 C++ 程序,它使用 LLVM 库生成 LLVM IR 模块,并编译并执行它。

该代码使用向量类型,我想检查它是否在我的架构上正确转换为 SIMD 指令。

我怎么知道这个?有没有办法查看从这个 IR 生成的汇编代码?

0 投票
1 回答
685 浏览

c++ - clang::HeaderSearch 搜索路径被忽略

我试图clang::CompilerInstance解析一个包含包含的源文件,但我不知道如何让它真正找到包含的标头。这是我的设置:

这些路径绝对是 100% 正确的,并一遍又一遍地检查它们。这一切都有效,直到我扔给它的源代码包含类似的东西#include <foobar.h>,在这种情况下它会失败error 'foobar.h' file not found,即使 foobar.h 肯定存在。我觉得我在这里遗漏了一些非常明显的东西。任何指向正确方向的指针?

0 投票
0 回答
44 浏览

llvm - 如何在 LLVM 元数据中存储任意数据?

我想在使用 LLVM C++ API 生成的模块中存储一组键值。如果可能的话,我想将其存储为元数据。未修改的 LLVM 版本是否有可能,还是我必须修改它?

0 投票
2 回答
8777 浏览

c++ - 使用 cmake 将 LLVM 添加到项目中

我正在尝试将 LLVM 添加到 cmake 项目中,使用 cygwin 作为编译器。我从 cygwin 的安装程序下载了 LLVM(刚刚安装了所有与 llvm 相关的软件包)。这些文件在那里,但是我不能在我的项目中包含 LLVM。我尝试使用 3.5.2 的官方指南(它安装的版本),我的 CMakeLists.txt 看起来像

但是,我收到一堆这样的错误

在此处输入图像描述

难道我做错了什么?我想做的就是在我的项目中使用 LLVM。

0 投票
1 回答
192 浏览

llvm - 运行所有 LLVM Pass

我有一个 LLVM 模块,我想知道是否有一种简单的方法可以使用用于 -O3 的 C++ API 运行所有 LLVM 优化通道(无需单独注册每个通道)。

0 投票
2 回答
1408 浏览

llvm - 使用 C++ API 进行 LLVM 优化

我试图弄清楚如何在 LLVM 模块上执行所有优化(例如,所有 -O3 优化)。我尝试了以下方法,但我不确定是否正在应用所有可能的优化(例如,内联)。

我还能做些什么来提高输出 LLVM IR 的性能吗?

编辑:我试图从AddOptimizationPasses()函数中添加所有优化opt.cpp,如下所示:

另外,我在创建FunctionPassManager之前创建了一个PassManager并添加了几个通道,如下所示:

但是,性能与使用 -O1 在命令行上运行相同,而使用 -O3 在命令行上可以获得更好的性能。有什么建议么?

0 投票
1 回答
656 浏览

llvm - 更改基本块的名称/标签(在 llvm 通行证中)


有没有办法更改 llvm 中特定基本块的名称/标签?

0 投票
1 回答
796 浏览

c++ - 与 LLVM JIT 代码共享 C++ 指针

我想让我的大部分程序都是一个普通编译的 C++ 程序。所述程序使用一块连续的内存作为堆栈。栈顶由普通指针维护。

我想与通过 LLVM JIT 生成的代码共享该指针。例如,给定:

wherepointerInc()将 JIT'd 代码插入到当前BasicBlock增量top中。pointerInc()代码是:

不幸的是,这不起作用。这是错误的(较大的)身体pointerInc()。该代码实际上是从llc一个增加指针的普通 C++ 程序上生成的 LLVM C++ API 代码派生的。

运行时,程序打印:

有两个问题:

  1. 这个对吗?我什至可以做我想做的事,即与 JIT 代码共享原始 C++ 指针吗?
  2. 为什么要转储核心?

即使我将 JIT 函数设为空,代码仍会在调用该函数的行处转储核心。LLVM JIT 设置代码看起来像我见过的所有示例,所以我也看不出有什么问题。

一点帮助?


更新

如果我更改已弃用的行:

到新行:

然后func_ptr为空。

0 投票
1 回答
2013 浏览

llvm - 创建对外部函数的调用

我正在制作仪表通行证。pass 应该以特定的方式修改给定的 IR。所需的修改之一是在特定位置插入对函数的调用。这是被调用函数的签名:

该函数的原型在include/llvmfoofile.h中的一个文件中, 而函数定义在MCJIT文件夹中的文件中。并在此文件夹中运行正常,并且编译时使用,并且同一文件中的另一个函数可以按预期正常工作。不回仪表通行证。如何在给定的 IR 中向 foo 函数插入 callinst?这是插入调用的片段:foofile.cppmakefoofile.cppMCJIT.cpp

注意: Args2是一个包含 2 个指向函数和一个基本块的值指针的数组列表,bb是插入调用的基本块。

当我在给定的 IR 上使用 op 运行传递时,它会正确生成声明和调用,如下所示:

宣言:

称呼:

但是当我尝试使用 lli 运​​行生成的 .ll 文件时,一切都爆炸了!这是堆栈跟踪之前的前 2 行:

我得出的结论是,问题在于它找不到 foo 函数。如果这是问题所在,我该如何正确创建 callinst?