问题标签 [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 - 使用 libclang 和 LLVM C 进行即时编译
我有一个能够生成我想在即时编译上下文中使用的 C 代码的软件。据我了解,LLVM/Clang 是要走的路,为了项目的可维护性,我想使用 llvm 和 Clang (libclang) 的 C API。
我开始使用创建 libclang 上下文clang_createIndex
和使用翻译单元createTranslationUnitFromSourceFile
(如果能够避免通过文件系统并将源代码作为字符串传递,那就太好了)。但我几乎被困在那里。如何从 libclang 翻译单元转到 JIT 似乎需要的 LLVM“执行引擎”?或者这甚至不可能使用 C API?
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
。
llvm - 如何轻松地向 LLVM 模块添加声明?
我正在用 LLVM 编写自己的语言,并且正在使用来自 std 和 custom 的外部 C 函数。我现在正在为 LLVM IR 添加使用 C++ 类的声明。像这样:
我要定义数十个外部函数,有没有一些简单的方法来定义它们,以及如何定义它们?
我考虑将 C 标头(或 LLVM IR 文件 .ll)“包含”到模块中。但我找不到任何例子如何做到这一点......
c++ - 从 LLVM 添加到 C++ lambda 的映射
我有一组包装 C++ 方法调用的 lambda,我想用 LLVM 调用它们。我的尝试似乎遗漏了一些东西,即使在声明了类型并将全局映射添加到 lambda 之后,我也收到了 LLVM 错误。重现我尝试过的最小代码是:
这导致输出:
我究竟做错了什么?使用 LLVM 3.7.0
(标签不存在)
c++ - LLVM/Clang:将复合语句简化为子集
我有一个复合语句代表以下代码块
我想创建另一个复合语句,其中包含原始语句的前 2 个语句,如下所示:
然后是另一个包含以下 2 个语句的语句:
我有电话foo(a)
as clang::CallExpr
。
到目前为止,我唯一的想法是迭代原始复合语句并填充另一个复合语句,直到foo(a)
找到为止。但是 API 似乎没有比较语句的可能性。有更好的想法吗?
llvm - 在 MCJIT 中使用全局变量
我正在尝试在运行时在现有的 C/C++ 程序中 JIT 编译一些函数,但是我在全局变量初始化方面遇到了一些麻烦。具体来说,我采用的方法是使用 Clang 将程序预编译为 IR 位码模块以及可执行文件。在运行时,程序加载模块,转换它们(程序专业化),编译并执行它们。事实证明,我有一些全局变量在“主机”程序执行期间被初始化和修改。目前,这些全局变量也在 JIT 编译代码中被初始化,而我希望它们被映射到主机全局变量。有人可以帮我弄这个吗?
下面摘录了一个小复制品。完整的源代码在这里。文件 somefunc.cpp 在构建期间被预编译,并在 testCompile.cpp 的 main() 函数中加载。全局变量 xyz 在 somefunc.cpp 中被初始化为指向 25,但我希望它像在 main() 中那样指向 10。换句话说,main() 中的断言应该成功。
我尝试了几种不同的方法来解决这个问题。ChangeGlobal() 函数尝试(未成功)实现此 updateGlobalMapping()。第二种更老套的方法使用适当初始化的新全局变量。我可以让后一种方法适用于某些类型的全局变量,但是还有比这更优雅的方法吗?
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,这显然是不可取的。
处理这个问题的正确方法是什么?
c++ - LLVM比较两个函数的参数
假设我有:
我将如何检查参数a
inbar
是否与llvm IR(*.ll 文件) 中的参数相同我得到以下信息a
:foo
test.ll
:
c++ - 如何在不使用 llvm::IRBuilder 的情况下声明全局字符串指针
这是打印hello world
LLVM 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
在每种情况下都没有必要。有没有一种简单的方法可以找到这种替代功能?