2015-05-28 85 views
7

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

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

我的问题是:

有没有办法跟踪是否为LLVM基础架构内签订或者无符号整型变量应解释,或者确实是唯一的方式,让独立的信息像我这样做?

感谢

+4

如果你正在编写一个编译器,这通常是你自己维护在前端的信息,与LLVM无关。 –

回答

4

首先,你必须确保,因为锵已经处理了使用sdivsrem而不是udevurem适当符号的整数运算,例如,你需要插入额外的类型元数据。

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

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

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

纳瓦斯,J.A.,沙克特,P.,森德,H.,斯塔基,P.J。: 符号性无关的程序分析:精确整数范围为低级别的代码。在:Jhala,R.,Igarashi,A.(编辑)APLAS 2012. LNCS, vol。 7705,第115-130页。 Springer,Heidelberg(2012)

+1

谢谢,虽然我正在编写自己的Frontent,但不是为了C,所以我没有使用Clang,但我会检查关于元数据的想法,到目前为止我没有太注意它,但会阅读它来检查我是否可以这样使用它 –

相关问题