Compiler construction 访问llvm ir pass中的用户变量名

Compiler construction 访问llvm ir pass中的用户变量名,compiler-construction,llvm,Compiler Construction,Llvm,我对llvm完全是新手。我想通过编写llvm传递来计算访问用户定义变量的次数 我需要知道如何获取源文件中的所有变量,这些变量不是llvm ir生成的临时变量。我知道我可以遍历所有的指令,看看它是不是一条加载存储指令[或者一条可以从内存中写入或读取的指令]。但是,我如何知道哪些变量是用户定义的,哪些是临时变量?实现这一点的关键是使用嵌入在模块中的变量 如果您想解决未优化代码的问题,您可能应该检查所有alloca指令,并且对于与变量关联的每个指令(通过llvm.dbg.declare),跟踪所有存储

我对llvm完全是新手。我想通过编写llvm传递来计算访问用户定义变量的次数


我需要知道如何获取源文件中的所有变量,这些变量不是llvm ir生成的临时变量。我知道我可以遍历所有的指令,看看它是不是一条加载存储指令[或者一条可以从内存中写入或读取的指令]。但是,我如何知道哪些变量是用户定义的,哪些是临时变量?

实现这一点的关键是使用嵌入在模块中的变量

如果您想解决未优化代码的问题,您可能应该检查所有
alloca
指令,并且对于与变量关联的每个指令(通过
llvm.dbg.declare
),跟踪所有存储和加载到该内存的内容


优化后的代码会变得越来越混乱,这不仅仅是因为现在需要考虑
llvm.dbg.value
,还因为对该变量的访问大多是间接的,所以您需要做的不仅仅是检查值的使用位置。

谢谢您的回复!因为我使用的是未优化的代码,所以我可以简单地迭代所有alloca指令并存储变量名。。。但这不是只适用于局部变量吗?据我所知,全局变量没有关联的allca指令@killx正确,全局变量的工作方式不同。只需检查所有这些值,然后检查这些值的存储和加载。顺便说一下,您可以在中找到一个关于如何迭代这些(和其他调试结构)的示例实现。