问题标签 [llvm-ir]

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 回答
487 浏览

llvm - Is there a way to access environment variables in an LLVM pass

I was wondering if there was a way to access environment variables while writing an LLVM pass. In my source file, I read a certain environment variable, depending on whose value the execution is furthered. I ought to recreate that in my pass and add a few checks therein.

I would really appreciate if there was some tutorial laying out these details in form of examples.

0 投票
2 回答
229 浏览

llvm - 在编译时更改源代码(使用 LLVM)

现在,假设在编写 LLVM 通行证时,我想确保不是调用sprintf, 而是调用printf(使用相同的参数)。我怎么能这样做呢?

0 投票
1 回答
183 浏览

llvm - LLVM 使用 IR Pass 后处理二进制文件

我创建了一个检查部分二进制代码完整性的函数。

该功能是通过 llvm 通行证添加的。

它需要开始结束地址加上一个校验值

校验值是二进制代码的计算结果。

遗憾的是,IR 通道位于 llvm 的中间部分,这部分适用于 IR 而不是二进制文件。

您还不知道二进制代码以及地址如何。

现在,我用我的通行证创建了我能做的一切,我使用pyelftool进入二进制文件并像疯子一样修改十六进制值;-)

我的第一个问题是:可以提前知道这个地址。

我看到了 blockaddress,但我需要更灵活的东西(指令地址)。

我的第二个问题是:有人对修改检查值有更好的想法。我的解决方案不是很优雅,而且我依赖于平台-.-

我希望我是可以理解的。

谢谢,

0 投票
1 回答
501 浏览

llvm - 需要有关编写通行证的见解

对于我的源代码,我有以下 IR:

我打算编写一个pass,它在编译时(使用LLVM)生成位码,其中对 strcpy(dest,src) 的调用被 strncpy(dest,src,n) 替换。

到目前为止,我已经编写了以下代码:

  1. 从---1:如何将 llvm::StringRef 转换为 Value* ?
  2. 来自---2:如何将 char* 转换为 Value*
  3. Constant::getNullValue(Value)可用于获取 NULL 值吗?
0 投票
1 回答
1044 浏览

llvm - 如何在没有优化的情况下在 llvm 中获取“phi”指令

当我使用命令clang -emit-llvm -S test.c -o test.ll时,IR 文件中没有任何“phi”指令。我怎么才能得到它?

我知道我可以使用 pass "-mem2reg" 或 "-gvn" 来获取 "phi" 指令。但他们会做一些优化。我只想在没有任何优化的情况下获得“phi”。

0 投票
1 回答
144 浏览

structure - LLVM 如何为结构生成位码(IR)

我搜索了 LLVM 的源代码,但我没有找到显示 LLVM 如何为结构生成位码(IR)的确切代码片段。我搜索关键字“StructType::create”和“StructType::get”,但出现的次数太多了。谁能告诉我在哪里可以找到确切的代码片。我的目的是改变结构中元素的顺序和其他东西。谢谢你。

0 投票
1 回答
1919 浏览

clang - 如何在 LLVM IR 中调用 C++ 函数?

我是 LLVM IR 的新手,我有一个 LLVM IR 源代码,它使用了一些外部声明函数。这些函数在 C++ 文件中实现。

所以我的问题是:

如何在 LLVM IR 中调用这些 c++ 函数?

将c ++文件编译成LLVM IR并将它们链接在一起是否正确?

0 投票
1 回答
206 浏览

scala - 无法确定 SLEM 库是否可用

我想为一种玩具语言生成 LLVM IR,其编译器是用 Scala 编写的。

SLEM似乎正是我所需要的,但我不知道它在当前状态下是否可用。我试图下载源代码,但无法编译。

有人用过成功或知道它是否可用吗?

0 投票
2 回答
741 浏览

vim - Vim 的 LLVM-IR 语法折叠

我正在使用 LLVM-IR 代码,它由生成clang -emit-llvm并希望使代码折叠工作。

到目前为止,我正在使用foldmethod=exprand foldexpr=LLVMFold()。我想使用foldmethod=syntax来自 llvm 存储库的语法文件来使用基于语法的折叠(即)。在这里可用

请注意,第一个正则表达式来自标签的语法文件。

它将闭合大括号吞噬到 2 级折叠中。

还尝试了foldmethod=indent哪些折叠不够,并且foldmethod=marker对于foldmark="{,}" 这个示例不完整的 LLVM-IR 代码来说理想情况下:

我希望在每个标记的部分中折叠从 the{definethe },即从 theentry:到清晰线。

0 投票
1 回答
768 浏览

opencl - 用于 OpenCL 本地阵列访问的 LLVM-IR GEP

我通过 llvm 在我的 OpenCL 内核中创建了一个本地数组,称之为大小为 [256 x i32] 的查找表。后来我通过 llvm 插入代码以用值填充数组。我的问题是,当我尝试生成访问数组的代码时,我似乎无法正确隔离指向我希望的元素的指针。如果我使用名为 flattened 的模糊局部变量,我可能会错误地索引元素:

这将是维度扁平化的本地工作组 ID。但这无关紧要。

这就是 GEP 的创建方式(builder 是 IRBuilder 的一个实例):

在这种情况下,M 是 Module 对象。产生的 table_addr 是:

但是,如果我想通过使用 for 循环遍历 LLVM 中的索引来正确填充它(省略循环结构,其中“索引”是 i32 循环计数器):

在这种情况下 table_addr 的 dump() 是(当 index==0 时):

这意味着当我做商店时会更进一步:

我得到这个输出:

这看起来不正确,但更重要的是,当“index”> 0 时,我在断言上得到 SIGABRT:

我有点卡住了。我不明白给数组索引的显式值与在运行时计算的一些模糊值之间有什么区别。任何见解将不胜感激。

更新:我最终做的是这个(alloc 只完成一次,我只是为了视觉目的将它包含在这个代码块中,它实际上是在 for 循环之外):

发出此代码(对于索引 == 0 和 1):

现在看起来是正确的,对我来说这似乎是一种奇怪的 emi 代码方式,因为我正在存储然后立即加载,但我想这会得到优化,或者我会尝试使用那个 mem2reg。感谢@Oak 的帮助。