我在调用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。任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
我不明白为什么你的结构应该在IR级别打包。毕竟,所有成员都是i8,并且不需要填充等(在主要架构上)。请注意,源级属性不会直接转换为IR功能。相反,前端使用LLVM IR的语义来模拟源语言所具有的语义。
每个LLVM语言参考(https://llvm.org/docs/LangRef.html#t-struct):
结构可以可选地是“打包”结构,其指示结构的对齐是一个字节,并且元素之间没有填充。在非打包的结构中,字段类型之间的填充是按照模块中的DataLayout字符串的定义插入的,这需要与底层代码生成器期望的内容相匹配。