问题标签 [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-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) 的字节数组)?
c++ - 使用 GNU C++ / LLVM C++ 编译时,提升并发库的行为不同
下面是一个使用线程安全无界队列的非常简单的生产者/消费者问题示例。谁能解释一下为什么这段代码在使用 GNU C++ 编译时表现正确,而消费者线程在使用 LLVM C++ 编译时会随机放弃?
llvm - LLVM 后端模块传递
我想在后端编写一个按图形顺序遍历所有 MachineBasicBlock 的通行证,并检查每 3 个连续的 MachineBasicBlock 是否实现了某些属性。
任何想法如何写这个通行证?
llvm - LLVM 保留循环分析
我正在编写一个 LLVM FunctionPass,它可以相当积极地转换某些函数。它最终会删除旧的一组块并用完全不同的块替换它们。但是,之后运行的循环展开器 (LoopUnrollPass) 无法在转换后的函数中找到循环。(转换后的版本应该有自然循环。)
重新创建一个函数后我有什么需要戳的吗?如何触发循环检测器再次运行?最后,在转换函数时是否还需要更新其他分析?
llvm - LLVM 在指令前插入操作码
我想在 BasicBlock 终止符之前插入特定的操作码,在我的情况下,在 ReturnInst 之前。
有可能的?
例子:
c++ - LLVM 转换说明
我有我想要添加的值ConstantInt
和值。但是,我无法将其转换为可以接受的浮点数。ConstantFP
fadd
ConstantInt
fadd
这是代码的摘录:
哪里currentBlock()
返回一个BasicBlock
。在尝试为此生成操作码后,LLVM 抱怨它无法添加这两个值,因为它们不一样。
我对 LLVM 比较陌生,所以如果这段代码没有意义,我会接受任何建议。
llvm - LLVM:常量变量
如何使用 const 修饰符获取所有变量(来自字节码文件或 IR 文件)或由于执行而未更改的变量?我需要列出以供进一步使用。
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();
该如何解决?
llvm - 什么时候应该使用 ConstantDataArray 和 ConstantArray?
我正在使用 LLVM 3.3 C++-API。我的代码使用ConstantArray::get
, 和使用递归代码创建多维数组(最内层首先转换为 Constant*s 的向量,如上所述,然后用于初始化下一个最内层,依此类推)。
我试图通过说如果数组的元素类型满足ConstantDataArray::isElementTypeCompatible
谓词来优化这一点,那么它应该使用ConstantDataArray::get
.
这是一个更具体的例子来说明我的意思:
假设我要创建的数组将在 C++ 中这样声明:
诠释 x[2][3] = {{1,2,3},{4,5,6}};
最内层(类型 int[3])是一个简单的数组类型,因此创建了两个 CDA。
下一个等级是两个 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[]
。问题是这构建了一个由三个数组组成的数组,每组两个。
c++ - CXXMethodDecl::getNameAsString 用于模板类构造函数或析构函数
我正在用 C++ 编写一个带有libtooling的小软件,将 C++ 头文件转换为 C++ 骨架文件。
它适用于非模板类,但我遇到了模板类的问题,尤其是模板类的构造函数或析构函数。
我CXXMethodDecl::getNameAsString
用来获取函数的名称。对于像这样的非模板类
前一个函数给了我(如我所料)C
和~C
.
但如果类是如下模板:
我得到了结果:C<TT, N>
和~C<TT, N>
,这不是我所期望的。对我来说,函数的名称不应该依赖于作为模板的类。经典函数的行为方式符合我的预期(两种情况下名称相同)。
我错过了什么吗?这是正常行为还是错误?