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

llvm - 在 LLVM 中向函数添加参数

我希望编写一个 LLVM 传递两个 i32 类型的参数来选择函数。我的第一次尝试(如下所示)失败了:

如果我尝试上述方法,模块验证程序会崩溃。新添加的参数类型是 junk 0xCDCDCDCD(未初始化的堆内存)。函数类型保持:

而不是被新的i32.

此外,将参数直接添加到参数列表Function::getArgumentList()失败,因为Argument构造函数将自身链接到函数,这被检测为双链接。

  • 我需要一个 ModulePass 来做到这一点,还是一个 FunctionPass 就足够了?
  • 有没有一种优雅的方式来做到这一点?

谢谢!

0 投票
1 回答
696 浏览

llvm - 如何在 LLVM 中将 CallInst 类型转换为 GlobalVariable

我编写了一个函数传递,它初始化一个全局变量,然后将一个函数插入到 IR 中。我想将函数调用的结果设置为全局变量,但不确定如何将 CallInst 类型转换为 GlobalVariable 类型。这是我为全局变量声明编写的代码:

然后我尝试在这一行设置全局变量:

当我尝试编译时,我收到此错误:

谢谢你的帮助!

0 投票
1 回答
520 浏览

c++ - 在 LLVM 模块中使用 C++ 类

基于万花筒万花筒与 MCJIT教程,我有代码来创建一个模块和函数并使用 MCJIT 调用它。该函数需要一个原型:

但是,该示例仅涵盖 Double 作为参数和返回值(上面使用了 int)。要进行任何高级操作,您需要传递类和容器之类的东西。

您如何在模块中使用现有的 C++ 类?

当然,你可以链接到任何你想要的库,但是你需要声明函数原型才能使用它们。如果库 API 有类,你如何声明它们?

我想要的是这样的:

其中 class.std::string 已从 string.h 导入。

LLVM API 只有原始类型。您可以定义结构来表示类,但这太难以手动完成(而且不可移植)。

一种方法可能是将类编译为位码并将其读入模块,但我想尽可能避免使用临时文件。另外我不确定如何从模块中提取类型,但应该是可能的。我在我的一个类的头文件上尝试了这个(我将头文件重命名为 cpp 文件,否则 clang 会变成 .gch 预编译的头文件),结果只是一个常数......也许它被优化了?我在cpp文件上试了一下,结果是36000行代码......

然后我找到了这个页面。我应该使用 Clang API 而不是使用 LLVM API,因为 Clang 作为编译器,可以将代码编译成模块。然后我可以将 LLVM API 与导入的模块一起使用。这是正确的方法吗?任何工作的源代码都会受到赞赏,因为它需要很长时间才能使函数调用工作(教程已过时且文档稀缺)。

0 投票
1 回答
4582 浏览

c++ - 从 C++ 中的嵌入式 LLVM 生成二进制代码(共享库)

我正在开发一个用 C++ 编写的高性能系统。该过程需要能够在运行时理解一些复杂的逻辑(规则),这些逻辑(规则)是用为此应用程序开发的简单语言编写的。我们有两个选择:

  1. 解释逻辑 - 运行嵌入式解释器并生成动态函数调用,当接收到数据时,根据解释的逻辑对数据进行处理

  2. 将逻辑编译成plugin.so动态共享文件,使用dlopen、dlsym加载插件并在运行时调用逻辑函数

选项 2 看起来非常有吸引力,因为它将优化机器代码,在此过程中运行速度比嵌入式解释器快得多。

我正在探索的选项是:

    • 编写编译方法 string compile( string logic, list & errors, list & warnings )
    • 这里的输入逻辑是一个字符串,包含用我们的自定义语言编码的逻辑
    • 它生成llvm ir,compile方法的返回值返回ir字符串
    • 写链接方法 bool 链接(字符串 ir,字符串文件名,列表和错误,列表和警告)
    • 对于链接方法,我搜索了 llvm 文档,但我无法确定是否有可能编写这样的方法

    如果我是正确的,LLVM IR 将转换为 LLVM 字节码或汇编代码。然后要么使用 LLVM JIT 在 JIT 模式下运行,要么使用 GNU Assembler 生成本机代码。

    是否有可能在 LLVM 中找到一个可以做到这一点的函数?如果这一切都是从代码中完成的,而不是使用 C++ 中的系统命令来调用“as”来为我的要求生成 plugin.so 文件,那就更好了。

    如果您知道我可以在运行时从我的进程生成共享库本机二进制代码的任何方法,请告诉我。

    0 投票
    1 回答
    329 浏览

    c++ - 为什么我的特征模板类查找运算符<< 为 llvm::StringRef?

    遵循问题如何检测类型是否可以流式传输到 std::ostream?我编写了一个特征类,说明是否可以将某种类型流式传输到 IO 流。直到现在我发现了一个问题,这个特性似乎运作良好。

    我在使用 LLVM 的项目中使用代码,并且正在使用他们的 StringRef 类(在精神上与建议的 std::string_view 相似)。是该类的 Doxygen 文档的链接,如果需要,您可以从中找到它的声明头文件。由于 LLVM 没有提供 operator<< 来将 StringRef 对象流式传输到 std 流(它们使用自定义的轻量级流类),因此我编写了一个。

    但是,当我使用 trait 时,如果我的自定义 operator<< 在 trait之后声明,它就不起作用(发生这种情况是因为我在一个标题中具有 trait,而在另一个标题中具有 operator<< 函数)。我曾经认为模板实例化中的查找从实例化点的角度来看是有效的,所以我认为它应该有效。实际上,正如您在下面看到的那样,使用另一个类及其自定义运算符<<,在特征之后声明,一切都按预期工作(这就是我现在才发现这个问题的原因),所以我不知道是什么让 StringRef特别的。

    这是完整的例子:

    与我的预期相反,这打印:

    如果我在特征声明之前移动 StringRef 的 operator<<的声明,它会打印为 true。那么为什么会发生这种奇怪的事情,我该如何解决这个问题呢?

    0 投票
    1 回答
    217 浏览

    c - LLVM 构建,将字符串传递给 LLVMSetValueName C API 时出现问题

    使用 MinGW 成功构建 LLVM 后,我现在尝试使用 C API 来实现该程序。

    作为查看构建是否成功的入门应用程序,我已将此处http://www.llvmpy.org/llvmpy-doc/0.9/doc/firstexample.html的 llvmpy 示例转换为(我认为是) C 等效,但是我没有从 print 函数中得到我期望的输出。

    我的 C 程序是:

    我得到的输出是:

    注意 0x1.74bb00p-1012 和 0x1.95bc40p+876 应该读为“%a”

    我只能认为这是某种内存损坏,但我不知道可能的原因。我怎样才能更改代码以使其有效?

    0 投票
    1 回答
    1224 浏览

    llvm - 通过llvm pass识别用户定义函数

    无论如何我可以确定被调用函数是否是用户定义的?例如:

    在这种情况下 foo() 是用户定义,而 printf() 是库函数。

    我目前使用的方法是遍历所有模块并检查其大小是否大于 0。IE:

    但不确定它的准确性?

    0 投票
    1 回答
    423 浏览

    llvm - LLVM 创建类型为“指令*”的函数

    我想使用Function::Create方法来创建一个输入参数类型为的函数,llvm::Instruction*但我没有找到任何直接的方法class Type来做到这一点。谁能给我一些提示?

    另外对于一个具体的比较Instruction *pi,我尝试过pi->getType()->print(errs()),它返回了我i1作为类型。int externalCall(Instruction *p)但是当我在另一个 cpp 文件中编写一个函数并编译成 IR 时。这个 IR 说类型是class.llvm::Instruction. 为什么这两个不同,我如何从 API 中获取后一个?

    0 投票
    1 回答
    4032 浏览

    llvm - LLVM 获取指令的操作数和左值名称

    对于像%cmp7 = icmp eq i32 %6 %7我想获取所有三个寄存器/符号名称的 LLVM IR 指令(即%cmp %6 and %7

    %cmp现在我可以通过命令获取字符串,pi->getName()其中 pi 是指令指针。但是,当我尝试获取 oprand 名称时,我通过键入pi->getOperand(0)->getName().

    我试图isa<Instruction>(pi->getOperand(0))检查这是否是一条指令,它返回真但pi->getOperand(0)->hasName()返回假。让我感到奇怪的是,为什么两者pi都是pi->getOperand(0)指令但只有pi名称?

    有什么想法可以通过使用 API获取操作数名称(字符串%6和 此处)?%7

    我使用的 LLVM 版本是 3.4.2

    0 投票
    1 回答
    133 浏览

    llvm - associate user data with LLVM instruction nodes

    What would be the best way to store custom data with each LLVM instruction node? Say to pass information from one pass to another? It doesn't seem like the instruction class allows users to store arbitrary data?