5

以下のような 2 つの基本的な C++ 関数から LLVM IR コードを生成したいと考えています。

int newFun2(int x){
    int z = x + x;
    return z;
}

int newFun(int *y){
    int first = y[3]; //How to define it using the LLVM API?
    int num = newFun2(first);
    return num;
}

私の問題は、LLVM API を使用して配列パラメーターのインデックスを取得することです。何か案は ?どうもありがとう

編集済み

これは、API を使用した私のコードです。

llvm::LLVMContext &context = llvm::getGlobalContext();
llvm::Module *module = new llvm::Module("AST", context);
llvm::IRBuilder<> builder(context);

//newFun2
llvm::FunctionType *newFunc2Type = llvm::FunctionType::get(builder.getInt32Ty(), builder.getInt32Ty(), false);
llvm::Function *newFunc2 = llvm::Function::Create(newFunc2Type, llvm::Function::ExternalLinkage, "newFun2", module);

llvm::Function::arg_iterator argsFun2 = newFunc2->arg_begin();
llvm::Value* x = argsFun2++;
x->setName("x");

llvm::BasicBlock* block = llvm::BasicBlock::Create(context, "entry", newFunc2);
llvm::IRBuilder<> builder2(block);

llvm::Value* tmp = builder2.CreateBinOp(llvm::Instruction::Add,
                                 x, x, "tmp");

builder2.CreateRet(tmp);

//newFun
llvm::FunctionType *newFuncType = llvm::FunctionType::get(builder.getInt32Ty(), builder.getInt32Ty()->getPointerTo(), false);
llvm::Function *newFunc = llvm::Function::Create(newFuncType, llvm::Function::ExternalLinkage, "newFun", module);

llvm::BasicBlock* block2 = llvm::BasicBlock::Create(context, "entry", newFunc);
llvm::IRBuilder<> builder3(block2);

module->dump();

そして、これは生成される LLVM IR です:

; ModuleID = 'AST'

define i32 @newFun2(i32 %x) {
entry:
  %tmp = add i32 %x, %x
  ret i32 %tmp
}

define i32 @newFun(i32*) {
entry:
}

配列アクセスが原因で、newFun の本体に固執しています。

4

1 に答える 1