Llvm 我什么时候应该使用ConstantDataArray和ConstantArray?
我正在使用LLVM3.3C++-API。我的代码使用Llvm 我什么时候应该使用ConstantDataArray和ConstantArray?,llvm,llvm-3.0,llvm-c++-api,Llvm,Llvm 3.0,Llvm C++ Api,我正在使用LLVM3.3C++-API。我的代码使用ConstantArray::get创建数组,并使用递归代码创建多维数组(最内层的秩首先转换为常量*s的向量,如上所述,然后用于初始化下一个最内层的秩,依此类推) 我试图通过以下方式对此进行优化:如果数组的元素类型满足ConstantDataArray::isElementTypeCompatible谓词,那么应该使用ConstantDataArray::get初始化它 这里有一个更具体的例子来说明我的意思: 假设我要创建的数组在C++中声明如
ConstantArray::get
创建数组,并使用递归代码创建多维数组(最内层的秩首先转换为常量*s的向量,如上所述,然后用于初始化下一个最内层的秩,依此类推)
我试图通过以下方式对此进行优化:如果数组的元素类型满足ConstantDataArray::isElementTypeCompatible
谓词,那么应该使用ConstantDataArray::get
初始化它
这里有一个更具体的例子来说明我的意思:
ConstantArray
。参数是一个包含两个CDA的ArrayRef
ConstantArray
抱怨,因为初始值设定项的类型不完全正确。以下是信息:
.../llvm-3.3.src/lib/IR/Constants.cpp:754:
static llvm::Constant* llvm::ConstantArray::get(llvm::ArrayType*,
llvm::ArrayRef<llvm::Constant*>):
Assertion `V[i]->getType() == Ty->getElementType()
&& "Wrong type in array element initializer"' failed.
如果有人感兴趣,该断言源于我对数组范围的反转
int[2][3]
是一个由两个数组和三个数组组成的数组。我正在重载运算符[]
以将数组类型构建为i64[2][3]
,其中i64
是一个包含IntegerType*
的对象,并重载运算符[]
。问题是,这将构建一个由三个数组和两个数组组成的数组。您的三个步骤看起来不错,在我看来,故障可能出在您为该get
方法提供的ArrayType
中。能否显示实际调用get
的代码段,包括第一个参数的创建?@Oak谢谢。把这个例子放在一起让我想到了这个问题,99%的时候都是这样。很高兴听到这个消息。不过,最好是把问题的真实答案贴出来,而不是编辑。
// int[2][3] = {{1,2,3},{4,5,6}};
IntegerType* i64 = IntegerType::get(mod->getContext(), 64);
Constant* one = ConstantInt::get(i64, 1);
Constant* two = ConstantInt::get(i64, 2);
Constant* three = ConstantInt::get(i64, 3);
Constant* four = ConstantInt::get(i64, 4);
Constant* five = ConstantInt::get(i64, 5);
Constant* six = ConstantInt::get(i64, 6);
ArrayType* int_3 = ArrayType::get(i64, 3);
ArrayType* int_2_3 = ArrayType::get(int_3, 2);
// Constant* array123 = ConstantArray::get(int_3, std::vector<Constant*>{one,two,three});
Constant* array123 = ConstantDataArray::get(mod->getContext(), std::vector<uint64_t>{1,2,3});
// Constant* array456 = ConstantArray::get(int_3, std::vector<Constant*>{four,five,six});
Constant* array456 = ConstantDataArray::get(mod->getContext(), std::vector<uint64_t>{4,5,6});
Constant* array = ConstantArray::get(int_2_3, std::vector<Constant*>{array123, array456});