【问题标题】:How to distinguish signed and unsigned integer in LLVM如何区分 LLVM 中的有符号和无符号整数
【发布时间】:2015-05-28 23:58:55
【问题描述】:

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

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

因此我的问题是:

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

谢谢

【问题讨论】:

  • 如果您正在编写编译器,这通常是您自己在前端维护的信息,独立于 LLVM。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢,不过我正在编写自己的前端,也不是为 C 编写的,所以我没有使用 Clang,但我会检查有关元数据的想法,我没有太注意到目前为止,但会阅读它以检查我是否可以那样使用它
猜你喜欢
  • 2011-08-10
  • 2012-03-06
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 2017-06-07
  • 1970-01-01
  • 2015-01-24
相关资源
最近更新 更多