设置StructType的StructType的值

时间:2018-06-19 20:59:45

标签: llvm llvm-c++-api

假设我有一种StructType成分,定义为:

// volume[0] = quantity
// volume[1] = unit (e.g. mL, L, etc.)
Type *volume[2] = {Type::getFloatTy(this->context), Type::getInt8Ty(this->context)};
ArrayRef<Type*> refs(volume);
this->volumeType = StructType::create(this->context, refs, "volume", true);

Type *types[2] = {this->volumeType, ArrayType::get(Type::getInt8Ty(this->context), 100)};
refs = ArrayRef<Type*>(types);
this->ingredientType = StructType::create(this->context, refs, "ingredient", true);

=======================

假设我有以下内容:

Ingredient x();
x.volume.unit = 0; // where 0 denotes 'mL'
x.volume.quantity = 100.0;

我不完全了解如何使用LLVM C ++ API设置x.volume.unit值。

我正在阅读GetElementPtrInstrfrom here的工作原理。本质上,here声明我可以引用StructType IdxList在ArrayRef中分配的值。其中IdxList[0][n]是结构中的第n个元素。但是,我不确定并且无法正常工作的是如何在嵌套的volume结构中设置值。

我尝试发送多维ArrayRef,但是没有运气。因此,我有点想在volume StructType内部嵌套的ingredient StructType内部设置一个值。

1 个答案:

答案 0 :(得分:2)

嵌套只是getelementptr的一个附加参数。

如果使用getelementptr索引0,n访问x.volume,则可以使用索引0,n,0来访问x.volume.unit,而x.volume.quantity为0,n,1。

正如Ismail Badawi所说,您可以要求Clang向您展示如何做。如果GEP没有执行您想要的操作(或其他任何指令),您可能会发现调用x->getType()->dump()来转储对stderr的类型的描述是有益的。

我建议您尝试使用0,0,0设置单位,如果它不起作用,请转储0,0,0的类型,看看是否可以识别它。给GEP一个指针,第一个零给你一个结构(x),第二个给你另一个结构(它进入.volume),第三个可能是一个浮点数(它进入{{1 }}),最后GEP隐式地获取了该地址,因此GEP的返回类型是一个指向float的指针。您可以将该指针指向StoreInst,以将浮点数写入结构。