2013-05-29 2 views
4

Я хочу сгенерировать LLVM IR-код из двух основных функций 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; 
} 

Моя проблема - получить индекс параметра массива с помощью API LLVM. Есть идеи ? Спасибо большое

Editted

Это мой код, используя 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 из-за доступа к массиву.

+0

Не мог бы вы уточнить, что вы пытаетесь достичь? Вы не знаете, как должен выглядеть сгенерированный IR? Или вы понимаете, как это должно выглядеть, но нужна помощь в вызовах API для его создания? Или вы используете интерфейс Clang и не можете найти индекс массива в AST? Или, может быть, это совсем другое ... – Oak

+0

привет, я только что обновил свой пост тем, что у меня есть до сих пор. Я застрял на теле newFun. Я не знаю вызова API для создания части доступа к массиву для меня. Спасибо – kayhan

ответ

4

Я думаю, вам сначала нужно понять, как должен выглядеть ИК. Это можно сделать, вглядываясь в the language specification или на using Clang to compile the C code into IR и взглянув на результат.

В любом случае способ доступа к элементу массива при заданном индексе либо с extractvalue (который принимает только постоянные индексы), либо с помощью gep. Оба из них имеют соответствующие конструктор/фабричные методы и IRBuilder методы их построения, например

builder.CreateExtractValue(y, 3); 

Создание GEP является немного более сложным; Я рекомендую взглянуть на the gep guide.

Однако хороший способ увидеть, как вызвать LLVM API для создания желаемого ИК-адреса, - использовать llc (один из инструментов командной строки LLVM) для генерации исходного файла с этими вызовами из IR-файла, увидеть эти две смежных вопросы:

+0

Большое вам спасибо, вот что я искал. llc - действительно отличный способ понять api, как вы предложили. – kayhan