问题标签 [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 投票
0 回答
148 浏览

llvm-c++-api - LLVM JIT:匹配结构成员对齐与 gcc

我在使用 gcc 编译的程序中使用 LLVM C++ API,并且我还在同一进程中使用“ExecutionEngine”JIT。我正在使用 boost::fusion 自动将 C++ 结构提升到这个 JIT 中,并且我注意到当我以这种方式生成结构定义时,LLVM 计算的结构字段的偏移量与 gcc 不同。

有谁知道我必须做些什么才能让 LLVM 的决心与 gcc 的“一致”?我将“不透明”类转换为 LLVM 结构定义中的字节数组是否是一个问题(例如:如果结构具有 std::string 我将其转换为长度为 sizeof(std::string) 的字节数组)?

0 投票
1 回答
305 浏览

c++ - 使用 GNU C++ / LLVM C++ 编译时,提升并发库的行为不同

下面是一个使用线程安全无界队列的非常简单的生产者/消费者问题示例。谁能解释一下为什么这段代码在使用 GNU C++ 编译时表现正确,而消费者线程在使用 LLVM C++ 编译时会随机放弃?

0 投票
1 回答
290 浏览

llvm - LLVM 后端模块传递

我想在后端编写一个按图形顺序遍历所有 MachineBasicBlock 的通行证,并检查每 3 个连续的 MachineBasicBlock 是否实现了某些属性。

任何想法如何写这个通行证?

0 投票
1 回答
1070 浏览

llvm - LLVM 保留循环分析

我正在编写一个 LLVM FunctionPass,它可以相当积极地转换某些函数。它最终会删除旧的一组块并用完全不同的块替换它们。但是,之后运行的循环展开器 (LoopUnrollPass) 无法在转换后的函数中找到循环。(转换后的版本应该有自然循环。)

重新创建一个函数后我有什么需要戳的吗?如何触发循环检测器再次运行?最后,在转换函数时是否还需要更新其他分析?

0 投票
2 回答
1196 浏览

llvm - LLVM 在指令前插入操作码

我想在 BasicBlock 终止符之前插入特定的操作码,在我的情况下,在 ReturnInst 之前。

有可能的?

例子:

0 投票
3 回答
9026 浏览

c++ - LLVM 转换说明

我有我想要添加的值ConstantInt和值。但是,我无法将其转换为可以接受的浮点数。ConstantFPfaddConstantIntfadd

这是代码的摘录:

哪里currentBlock()返回一个BasicBlock。在尝试为此生成操作码后,LLVM 抱怨它无法添加这两个值,因为它们不一样。

我对 LLVM 比较陌生,所以如果这段代码没有意义,我会接受任何建议。

0 投票
1 回答
1427 浏览

llvm - LLVM:常量变量

如何使用 const 修饰符获取所有变量(来自字节码文件或 IR 文件)或由于执行而未更改的变量?我需要列出以供进一步使用。

0 投票
1 回答
1497 浏览

c++ - Clang 工具:重写 ObjCMessageExpr

我想重写代码中的所有消息,我只需要替换选择器,但我需要能够替换嵌套表达式 fe :

我尝试使用它clang::Rewriter replaceText并只生成新字符串,但有一个问题:如果我更改选择器长度,它将不起作用,因为我用那些旧位置替换了嵌套消息。

所以,我认为我需要使用clang::Rewriter ReplaceStmt(originalStatement, newStatement);

RecursiveASTVisitor用来访问所有消息,我想复制这些消息对象,并替换选择器:

我怎样才能做到这一点?

我尝试使用ObjCMessageExpr::Create,但参数太多,我不知道如何从原始消息中获取ASTContext &Context and ArrayRef<SourceLocation> SeLocs和参数。Expr *Receiver

使用 clang 工具(clang 工具界面)替换嵌套消息中的选择器的正确方法是什么?

更新:

我应该使用ReplaceStmtWithStmt回调和ASTMatchFinder吗?

更新:

我正在使用以下函数重写文件中的文本:

我想用新的选择器 fe 替换代码中的所有 messageExpr:它是如何:

应该如何:

我正在使用 ReqoursiveASTVisitor:

我创建了生成新消息 expr 字符串的方法:

当我尝试替换嵌套消息时会出现问题,如下所示:

结果是:

因为 messageExpression 具有“旧”值,getLocStart();getLocEnd();该如何解决?

0 投票
0 回答
2099 浏览

llvm - 什么时候应该使用 ConstantDataArray 和 ConstantArray?

我正在使用 LLVM 3.3 C++-API。我的代码使用ConstantArray::get, 和使用递归代码创建多维数组(最内层首先转换为 Constant*s 的向量,如上所述,然后用于初始化下一个最内层,依此类推)。

我试图通过说如果数组的元素类型满足ConstantDataArray::isElementTypeCompatible谓词来优化这一点,那么它应该使用ConstantDataArray::get.

这是一个更具体的例子来说明我的意思:

  1. 假设我要创建的数组将在 C++ 中这样声明:

    诠释 x[2][3] = {{1,2,3},{4,5,6}};

  2. 最内层(类型 int[3])是一个简单的数组类型,因此创建了两个 CDA。

  3. 下一个等级是两个 int[3] 的数组。它不是一个简单的类型,所以ConstantArray创建了一个正则。参数是ArrayRef<Constant*>包含两个 CDA 的。

在第 3 步,ConstantArray因为初始化程序没有完全正确的类型而抱怨。这是消息:

我虽然ConstantDataArray是一个替代品ConstantArray是元素类型足够简单时的正确的理解方式是什么?

更新

这看起来像是我的代码中的一个错误(在 LLVM 之外)。 ConstantDataArray似乎确实是ConstantArray.

这是我用来演示问题的代码。它实际上在没有任何来自 LLVM 的投诉的情况下运行:

如果有人感兴趣,断言源于我反转数组范围。 int[2][3]是一个由两个三个数组组成的数组。我正在重载operator[]构建一个数组类型 as i64[2][3],其中i64是一个包含 anIntegerType*和重载的对象operator[]。问题是这构建了一个由三个数组组成的数组,每组两个。

0 投票
0 回答
668 浏览

c++ - CXXMethodDecl::getNameAsString 用于模板类构造函数或析构函数

我正在用 C++ 编写一个带有libtooling的小软件,将 C++ 头文件转换为 C++ 骨架文件。

它适用于非模板类,但我遇到了模板类的问题,尤其是模板类的构造函数或析构函数。

CXXMethodDecl::getNameAsString用来获取函数的名称。对于像这样的非模板类

前一个函数给了我(如我所料)C~C.

但如果类是如下模板:

我得到了结果:C<TT, N>~C<TT, N>,这不是我所期望的。对我来说,函数的名称不应该依赖于作为模板的类。经典函数的行为方式符合我的预期(两种情况下名称相同)。

我错过了什么吗?这是正常行为还是错误?