问题标签 [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 回答
987 浏览

llvm - 使用 libclang 和 LLVM C 进行即时编译

我有一个能够生成我想在即时编译上下文中使用的 C 代码的软件。据我了解,LLVM/Clang 是要走的路,为了项目的可维护性,我想使用 llvm 和 Clang (libclang) 的 C API。

我开始使用创建 libclang 上下文clang_createIndex和使用翻译单元createTranslationUnitFromSourceFile(如果能够避免通过文件系统并将源代码作为字符串传递,那就太好了)。但我几乎被困在那里。如何从 libclang 翻译单元转到 JIT 似乎需要的 LLVM“执行引擎”?或者这甚至不可能使用 C API?

0 投票
1 回答
929 浏览

c++ - 所有 LLVM 层的用途是什么?

我正在玩 LLVM3.7并想使用新的 ORC 东西。但是我已经做了几个小时了,但仍然不知道每一层的用途,何时使用它们,如何组合它们,或者至少我需要的最少的东西。

阅读了本Kaleidoscope教程,但这些并没有解释组成部分是什么,只是说把这个放在这里和这个放在这里(加上解析等分散了核心 LLVM 位的注意力)。虽然这很好上手,但它留下了很多空白。LLVM 中有很多关于各种事物的文档,但实际上它几乎是压倒性的。像http://llvm.org/releases/3.7.0/docs/ProgrammersManual.html这样的东西,但我找不到任何可以解释所有部分如何组合在一起的东西。MCJIT更令人困惑的是,考虑到更新的 API ,似乎有多个 API 用于做同样的事情ORC。我看到Lang Hames 发布了解释,自从他在该链接中发布的补丁以来,似乎有一些事情发生了变化。

所以对于一个特定的问题,所有这些层是如何组合在一起的?当我以前使用 LLVM 时,我可以相当容易地链接到 C 函数,使用“如何使用 JIT ”示例作为基础,我尝试链接到外部函数extern "C" double doIt,但最终以LLVM ERROR: Tried to execute an unknown external function: doIt.

看一下这个 ORC示例,我似乎需要配置它搜索符号的位置。但是 TBH 虽然我还在犹豫不决,但它在很大程度上是猜测工作。这是我得到的:

doIt在中声明std.hpp

0 投票
1 回答
1100 浏览

llvm - 如何轻松地向 LLVM 模块添加声明?

我正在用 LLVM 编写自己的语言,并且正在使用来自 std 和 custom 的外部 C 函数。我现在正在为 LLVM IR 添加使用 C++ 类的声明。像这样:

我要定义数十个外部函数,有没有一些简单的方法来定义它们,以及如何定义它们?

我考虑将 C 标头(或 LLVM IR 文件 .ll)“包含”到模块中。但我找不到任何例子如何做到这一点......

0 投票
2 回答
362 浏览

c++ - 从 LLVM 添加到 C++ lambda 的映射

我有一组包装 C++ 方法调用的 lambda,我想用 LLVM 调用它们。我的尝试似乎遗漏了一些东西,即使在声明了类型并将全局映射添加到 lambda 之后,我也收到了 LLVM 错误。重现我尝试过的最小代码是:

这导致输出:

我究竟做错了什么?使用 LLVM 3.7.0(标签不存在)

0 投票
0 回答
137 浏览

c++ - LLVM/Clang:将复合语句简化为子集

我有一个复合语句代表以下代码块

我想创建另一个复合语句,其中包含原始语句的前 2 个语句,如下所示:

然后是另一个包含以下 2 个语句的语句:

我有电话foo(a)as clang::CallExpr

到目前为止,我唯一的想法是迭代原始复合语句并填充另一个复合语句,直到foo(a)找到为止。但是 API 似乎没有比较语句的可能性。有更好的想法吗?

0 投票
0 回答
56 浏览

c++ - MSVC IDE 中 llvm 基本类型的行为

我遇到了内置 MSVC 调试器的一些无法解释的行为。看起来正在调试的程序和调试器本身正在对不同的变量集进行操作。此变量 (arg) 的类型为 llvm::StringRef。此类有两个数据成员 - char* 数据和 size_t 长度。

它来自 std::string 的隐式转换构造函数是微不足道的:

然而,这种转换的结果在调试器的局部变量选项卡中看起来像一团糟。当我尝试对该对象进行迷你转储并添加 watch (long long*)(&arg) 时,它看起来几乎相同。但是这部分的执行结果是好的,如控制台窗口所示。

调试会话 - loval 变量 调试会话 - 手表

0 投票
1 回答
462 浏览

llvm - 在 MCJIT 中使用全局变量

我正在尝试在运行时在现有的 C/C++ 程序中 JIT 编译一些函数,但是我在全局变量初始化方面遇到了一些麻烦。具体来说,我采用的方法是使用 Clang 将程序预编译为 IR 位码模块以及可执行文件。在运行时,程序加载模块,转换它们(程序专业化),编译并执行它们。事实证明,我有一些全局变量在“主机”程序执行期间被初始化和修改。目前,这些全局变量也在 JIT 编译代码中被初始化,而我希望它们被映射到主机全局变量。有人可以帮我弄这个吗?

下面摘录了一个小复制品。完整的源代码在这里。文件 somefunc.cpp 在构建期间被预编译,并在 testCompile.cpp 的 main() 函数中加载。全局变量 xyz 在 somefunc.cpp 中被初始化为指向 25,但我希望它像在 main() 中那样指向 10。换句话说,main() 中的断言应该成功。

我尝试了几种不同的方法来解决这个问题。ChangeGlobal() 函数尝试(未成功)实现此 updateGlobalMapping()。第二种更老套的方法使用适当初始化的新全局变量。我可以让后一种方法适用于某些类型的全局变量,但是还有比这更优雅的方法吗?

0 投票
0 回答
468 浏览

compiler-construction - 在 LLVM 中查找外部函数

我正在尝试编写一个 LLVM 传递,它将找到直接或间接调用外部函数(即当前编译单元中未定义的函数)的函数

例如,在 C 上运行以下代码时:

void a(string s) {print(s)}; int b(int x) {return 1} void c(void) {a("hello);b}

它应该标记 a 和 c。

我需要某种方式来判断给定的调用 inst 是否对应于对外部函数的直接调用。我的第一种方法是从调用 inst 中提取函数对象,然后使用从 GlobalValue 类继承的 isDeclaration() 方法。这最终在每个函数调用上都返回 true,这显然是不可取的。

处理这个问题的正确方法是什么?

0 投票
1 回答
397 浏览

c++ - LLVM比较两个函数的参数

假设我有:

我将如何检查参数ainbar是否与llvm IR(*.ll 文件) 中的参数相同我得到以下信息afoo

test.ll

0 投票
0 回答
731 浏览

c++ - 如何在不使用 llvm::IRBuilder 的情况下声明全局字符串指针

这是打印hello worldLLVM IR 的代码:

我正在尝试丢弃llvm::IRBuilder<>并用一些 Module/Function/BasicBlock 指定的函数替换它:

builder.CreateCall->llvm::CallInst::llvm::CallInst::Create(pPrintfFunc, pHelloWorldStr, "callPrintf", pEntryBB)

builder.CreateRetVoid()->llvm::ReturnInst::Create(Context, pConsIntZero, pEntryBB);

builder.getInt32Ty()->llvm::Type::getInt32Ty(Context)

现在的问题是我找不到替代方法CreateGlobalStringPtr

llvm::Value *pHelloWorldStr = builder.CreateGlobalStringPtr("hello world!\n");

那么,如何在不使用构建器的情况下声明全局字符串指针呢?

我想llvm::IRBuilder在每种情况下都没有必要。有没有一种简单的方法可以找到这种替代功能?