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

如何在LLVM中区分有符号整数和无符号整数,llvm,llvm-ir,llvm-c++-api,Llvm,Llvm Ir,Llvm C++ Api,LLVM项目不区分所述的有符号整数和无符号整数。在某些情况下,您需要知道某个特定变量应该被解释为有符号变量还是无符号变量,例如,当它被扩展或在除法中使用时。我的解决方案是为每个描述是整数还是基数类型的变量保留单独的类型信息 然而,我想知道,是否有一种方法可以用这种方式在LLVM中“属性化”类型?我在寻找某种可以添加到类型中的“用户数据”,但似乎什么都没有。由于在LLVM中只生成一次相同的类型,因此在创建类型时必须以某种方式发生这种情况 因此,我的问题是: 有没有一种方法可以跟踪整数变量在LLVM

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

然而,我想知道,是否有一种方法可以用这种方式在LLVM中“属性化”类型?我在寻找某种可以添加到类型中的“用户数据”,但似乎什么都没有。由于在LLVM中只生成一次相同的类型,因此在创建类型时必须以某种方式发生这种情况

因此,我的问题是:

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


感谢

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

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

否则,我认为最好的方法是修改前端(Clang),添加一些自定义的DWARF调试信息。这是一个可能会让你开始的方法

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

Navas,J.A.,Schachte,p.,Søndergaard,H.,Stuckey,p.J.: 符号不可知程序分析:低级代码的精确整数界限。摘自:Jhala,R.,Igarashi,A.(编辑)APLAS 2012。LNCS, 第7705卷,第115-130页。斯普林格,海德堡(2012)


如果您正在编写编译器,这通常是您在前端维护的信息,独立于LLVM。谢谢,我正在编写自己的frontent,但也不是为C编写的,所以我不使用Clang,但我将检查有关元数据的想法,到目前为止我没有太多注意它,但我会仔细阅读,看看我是否可以这样使用它