首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

通过C API获取llvm CallInst的属性

,可以使用以下步骤:

  1. 首先,需要获取到CallInst的指针。可以通过LLVM模块中的函数迭代器或基本块中的指令迭代器来获取CallInst的指针。
  2. 通过调用llvm-c的API函数llvm_get_call_inst_num_args(),可以获取CallInst的参数数量。
  3. 使用llvm-c的API函数llvm_get_call_inst_arg(),可以获取CallInst的每个参数的指针。可以使用这些指针进一步操作参数。
  4. 通过调用llvm-c的API函数llvm_get_call_inst_callee(),可以获取CallInst调用的函数的指针。
  5. 使用llvm-c的API函数llvm_get_function_name(),可以获取函数的名称。
  6. 通过调用llvm-c的API函数llvm_get_call_inst_calling_convention(),可以获取CallInst的调用约定。
  7. 使用llvm-c的API函数llvm_get_call_inst_tail_call_kind(),可以获取CallInst的尾调用类型。
  8. 通过调用llvm-c的API函数llvm_get_call_inst_called_value(),可以获取CallInst调用的函数的值。
  9. 使用llvm-c的API函数llvm_get_value_name(),可以获取函数值的名称。
  10. 最后,可以根据需要进一步处理CallInst的属性,例如获取返回值类型、获取函数的参数类型等。

这是一个基本的步骤,可以根据具体需求进行进一步的操作和处理。对于更详细的API函数和用法,可以参考腾讯云的LLVM文档(https://cloud.tencent.com/document/product/1140/38086)。

请注意,以上答案仅供参考,具体实现可能会因为不同的编译器版本和环境而有所差异。建议在实际开发中参考相关文档和资料,并根据具体情况进行调整和优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • C++反射 - 反射信息的自动生成

    在前一篇 <<C++反射 - 基于反射的Lua中间层实现>> 中, 我们介绍了如何利用c++反射的基础设施来实现一个lua中间层. 其中也有一些注册代码的示例. 当项目比较简单的时候, 手动编写相关的反射注册代码不会占用太多的时间. 但当项目达到一定规模, 手动编写并维护这些注册代码费时费力, 相关接口改个名可能会涉及到多处关联注册代码的修改, 这肯定是我们所不能接受的. 所以大部分项目在使用反射, 或者类反射的脚本中间层生成的过程中, 都会开发一些自动生成工具来减少重复性的工作, 笔者所经历的项目也是如此. 得益于llvm的流行, 我们大部分相关工具都是以libclang解析源代码头文件生成AST作为基础的. 本文将结合笔者的项目经验, 介绍如何在C#中用一种逐层处理的方式完成前文中提到的反射注册信息的自动生成的.

    02

    深度学习编译器之公共子表达式消除和死代码消除实现

    【省流】上次介绍了深度学习编译器之Layerout Transform优化 ,在这篇文章中提到还会介绍常量折叠优化Pass的实现,但在介绍常量折叠Pass之前我想再介绍一个类似的优化方法也就是公共子表达式消除实现(CSE)。仍然是以OneFlow中基于MLIR进行实现的CSE Pass为例子来讲解。在解析代码实现的过程中,我发现基于MLIR来做公共子表达式消除的时候还顺带做了死代码消除的功能。另外,在考虑公共子表达式消除的时候需要保证两个重复的操作处于同一个基本块中以及两个重复操作之间没有其它具有副作用的操作才可以消除。在OneFlow的实现中只是对OneFlow的UserOp的特殊属性即OpName和SymbolID进行了擦除,用一个魔法属性来代替,这是因为这两个属性不应该去影响公共子表达式的消除。这个优化还是比较有用的,在OneFlow的Stable Diffusion优化中发挥了不小的作用。

    05
    领券