Llvm 我什么时候应该使用ConstantDataArray和ConstantArray?

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++中声明如

我正在使用LLVM3.3C++-API。我的代码使用
ConstantArray::get
创建数组,并使用递归代码创建多维数组(最内层的秩首先转换为常量*s的向量,如上所述,然后用于初始化下一个最内层的秩,依此类推)

我试图通过以下方式对此进行优化:如果数组的元素类型满足
ConstantDataArray::isElementTypeCompatible
谓词,那么应该使用
ConstantDataArray::get
初始化它

这里有一个更具体的例子来说明我的意思:

  • 假设我要创建的数组在C++中声明如下:

    int x[2][3]={{1,2,3},{4,5,6}

  • 最里面的秩(int[3]类型)是一个简单的数组类型,因此创建了两个CDA

  • 下一个秩是两个int[3]的数组。它不是一个简单的类型,因此创建了一个常规的
    ConstantArray
    。参数是一个包含两个CDA的
    ArrayRef

  • 在步骤3,
    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});