问题标签 [llvm-4.0]

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 投票
0 回答
664 浏览

llvm - llvm中的内存分配函数

如何通过获取 llvm 中的参数和返回类型来检测 llvm 传递中的 malloc 和 free 函数调用并用新的函数调用替换它?

即有没有办法创建新函数(Malloc 和 free),然后在检测到 Malloc 和 free 时创建函数调用?

但是,我遇到了分段错误,这是用新函数替换 malloc 和 free 函数调用的正确方法吗?

0 投票
0 回答
125 浏览

c++11 - 访问 LLVM 中函数调用的参数值

在我的 LLVM IR 中,我有许多如下所示的函数调用:

我想静态分析它们以找到最后一个参数的值,%_6. 有没有办法获得它的价值?我试图直接访问参数,但这只是给了我加载/分配参数的指令。所以这:

只是给我%1 = load i8, i8* %_5, !dbg !717,给我的加载指令

0 投票
1 回答
237 浏览

c++ - 从(非 LLVM)代码中获取 llvm::LoopInfo?

为了开发我自己的 Pass,我想编写单元测试——我有很多“纯”辅助方法,所以它们似乎是单元测试的理想候选者。但其中一些需要 llvm::LoopInfo 的实例作为参数。

在我的 (Function-)Pass 我只是使用

获取此信息对象。

在我的单元测试中,我目前llvm::Function void foo()从磁盘解析我的(我想运行我的分析),如下所示:

要完成我的测试,我必须填写以下存根:

我的第一次尝试是基于使用PassManager<Function>(in Header "llvm/IR/PassManager.h"), AnalysisManager<Function>和 class LoopInfoWrapperPass,但我在网上找不到 LLVM 4.0 的任何示例用法 - 较旧的示例似乎使用了以前的PassManager 的版本,我没有看到如何使用LegacyPassManager. 我试图调查来源,PassManager但无法充分理解 typedef 和模板参数(它们增加了我对 C++ 作为一种语言的非理性厌恶)。

我该如何填写那个存根?如何在我的纯 C++ 代码中调用此分析通行证(并获取 LoopInfo)?

PS:除了 LoopInfoWrapperPass 之外,我还需要使用更多的通行证,但我假设这种方式应该可以转移到任何分析通行证。

PPS:我使用 googletest 作为单元测试框架,使用 CMake 构建配置使单元测试成为自己的目标,并且我正在针对 LLVM 4.0.1 的二进制库(如果有)构建我的 Pass out-of-tree这在某种程度上是相关的。

0 投票
1 回答
592 浏览

llvm - LLVM JIT 支持缓存编译输出

我正在尝试查看如何避免每次都进行 LLVM JIT 编译并使用缓存副本。我看到 LLVMObjectCache支持从模块生成代码,但是要从文件或代码字符串中获取模块,需要对其进行编译并经过不同的优化过程。最好的方法是什么?

  1. 将最终图像对象缓存到某个文件并首先查找文件,然后尝试解析并尝试ExecutionEngine使用图像创建以便可以执行(获取函数指针并调用它)

  2. 保存代码编译和优化的中间输出——即将模块写入某个文件(例如,使用转储)并尝试读取它(解析 IR)。然后使用ObjectCache此模块生成代码的支持。

选项(2)似乎是两个步骤,可能比(1)更糟糕,但(1)是正确的方法吗?

0 投票
1 回答
773 浏览

docker - /usr/lib/x86_64-linux-gnu/libLLVM-4.0.so.1:找不到版本“LLVM_4.0”

我正在尝试运行一个使用 Clang 和 LLVM 的工具。工具名称是 docker 提供的 cppgrep。请从 github 存储库中找到它 - https://github.com/peter-can-talk/cppnow-2017。我曾尝试使用 Ubuntu 16.04 和 17.10,我得到了与以下相同的错误:

经过网上搜索,我发现我必须设置环境变量 LD_LIBRARY_PATH。因此,作为第一步,我在 docker 中找到了库文件的位置,请在下面找到输出:

在这一步之后,我设置 LD_LIBRARY_PATH 如下:

最后,我使用命令导出了它export LD_LIBRARY_PATH。现在,如果我尝试运行 cppgrep 工具,我仍然会遇到同样的错误。构建docker后测试工具的命令如下:(1)cd进入cppgrep目录,如code/cppgrep,(2)进入docker容器并挂载文件夹/home: (3)使用命令$ docker run -it -v $PWD:/home clang 运行cppgrep 。./cppgrep 'x' test.cpp它应该返回名称为 x 的函数和变量。

要复制错误,请在从 github 存储库下载并解压缩文件后,使用$ docker build -t clang .命令构建 docker 容器。然后按照上一段中的 1,2,3 步骤进行操作。