允许llvm生成代码以访问全局数组

时间:2015-10-07 23:08:23

标签: c clang llvm

我目前有以下代码:

int counter_array[10] = {0};

void increment_address (int*);
void increment_array ();
int main (){
  increment_array();
}

increment_address (int* ptr){
  (*ptr) ++;
}

我正在尝试使用llvm进行检测,以便为“increment_array()”函数生成代码,以便函数将“counter_array”的第二个元素的地址传递给“increment_address(int *)”函数

换句话说,生成的increment_array应该执行以下操作:

void increment_array(){
  int* array_pty = &counter_array[1];
  increment_address(array_ptr);
}

通过查看IR代码看起来它是用“getelementptr inbount”指令完成的。但是,我无法将数组分配给它。

我想知道如何在生成的函数中生成如下的IR代码?

 store i32* getelementptr inbounds ([10 x i32]* @counterarray, i32 0, i64 1), i32** %ptr, align 8

谢谢大家的帮助。

1 个答案:

答案 0 :(得分:1)

首先阅读GEP的工作原理:http://llvm.org/docs/GetElementPtr.html

然后,要创建实际指令,请使用以下API:

例如,要在您的示例中复制GEP(没有商店):

Value *counterarray = ...

Value *indices[] = {
    ConstantInt::get(Type::getInt32Ty(), 0),
    ConstantInt::get(Type::getInt64Ty(), 1)
};

GetElementPtrInst *Inst = GetElementPtrInst::CreateInBounds(counterarray, indices);

(注意:未经测试的代码)