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

时间:2015-05-28 23:58:56

标签: llvm llvm-ir llvm-c++-api

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

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

因此我的问题是:

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

由于

1 个答案:

答案 0 :(得分:4)

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

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

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

<强>更新 如果您的目标是直接在LLVM IR上实现静态分析。本文可以提供深入的讨论。

  

Navas,J.A.,Schachte,P.,Søndergaard,H.,Stuckey,P.J。:   与签名无关的程序分析:低级代码的精确整数边界。在:Jhala,R.,Igarashi,A。(编辑)APLAS 2012. LNCS,   第一卷。 7705,第115-130页。 Springer,Heidelberg(2012)