LLVM StructType isPacked()

时间:2018-05-24 22:50:18

标签: llvm

我在调用LLVM StructType isPacked()函数时遇到问题。我们正在使用llvm 3.9。

Under gdb:
(gdb) p *pt
$3 = {
  <llvm::CompositeType> = {
    <llvm::Type> = {
      Context = @0x7fffffffb210, 
      ID = llvm::Type::StructTyID, 
      SubclassData = 9, 
      NumContainedTys = 3, 
      ContainedTys = 0x472fed0
    }, <No data fields>}, 
  members of llvm::StructType: 
  SymbolTableEntry = 0x4731110
}
But 
(gdb) p pt->isPacked()
$5 = false

打包的struct只是一个带有typedef的简单打包结构:

typedef struct aprgb {
      unsigned char R;
      unsigned char G;
      unsigned char B;
    } __attribute__ ((packed)) RGB_t ;
   ...
   void sum(RGB_t *in. ....)
   ...

我无法弄清楚为什么isPacked返回false。任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我不明白为什么你的结构应该在IR级别打包。毕竟,所有成员都是i8,并且不需要填充等(在主要架构上)。请注意,源级属性不会直接转换为IR功能。相反,前端使用LLVM IR的语义来模拟源语言所具有的语义。

每个LLVM语言参考(https://llvm.org/docs/LangRef.html#t-struct):

  

结构可以可选地是“打包”结构,其指示结构的对齐是一个字节,并且元素之间没有填充。在非打包的结构中,字段类型之间的填充是按照模块中的DataLayout字符串的定义插入的,这需要与底层代码生成器期望的内容相匹配。