如何区分LLVM中的有符号和无符号整数

Her*_*tor 8 llvm llvm-ir llvm-c++-api

LLVM项目不区分此处描述的有符号和无符号整数.在某些情况下,您需要知道特定变量是应该被解释为有符号还是无符号变量,例如,当它是大小扩展时或在分区中使用时.我的解决方案是为每个变量保留一个单独的类型信息,描述它是整数还是基数类型.

但是,我想知道,是不是有办法在LLVM中"归属"这种类型?我正在寻找可以添加到某种类型的某种"用户数据",但似乎什么都没有.在创建类型时必须以某种方式发生这种情况,因为在LLVM中只生成一次相同的类型.

因此,我的问题是:

有没有办法跟踪整数变量是否应该在LLVM基础结构中被解释为有符号或无符号,或者确实是像我一样保留单独信息的唯一方法?

谢谢

Cod*_*oka 5

首先,您必须确保您需要插入额外的类型元数据,因为 Clang 已经适当地处理了有符号整数运算,例如使用sdivandsrem而不是udevand urem

此外,可以利用它来实现一些基于在 IR 中访问变量的方式的轻量级类型推断。请注意,像这样的操作add不需要符号信息,因为它基于两个补码表示。

否则,我认为最好的方法是修改前端 (Clang) 以添加一些自定义 DWARF 调试信息。这是一个可以帮助您入门的链接

更新: 如果您的目标是直接在 LLVM IR 上实施静态分析。这篇论文可以提供一个彻底的讨论。

Navas, JA, Schachte, P., Søndergaard, H., Stuckey, PJ:与 符号无关的程序分析:低级代码的精确整数边界。在:Jhala, R., Igarashi, A. (eds.) APLAS 2012. LNCS, vol. 7705,第 115-130 页。海德堡斯普林格 (2012)