2012-03-09 55 views
7

我想要開始使用LLVM,以便爲我的代碼添加實時編譯,但發現它非常困難找到有關如何在LLVM中執行所需操作的參考,儘管有通過萬花筒教程,語言參考手冊,程序員手冊和doxygen文檔進行檢查。是否有更多的LLVM的C++ API比這些更引用?訪問LLVM數組中的元素

現在爲具體問題。我已分配的數組對象,具有兩個元素(我用C假設對應於double[2] ++):

const llvm::Type* double_t = llvm::Type::getDoubleTy(llvm::getGlobalContext()); 
const llvm::Type* array_t = llvm::ArrayType::get(double_t,2) 

在代碼後來我創建一個函數,其中,該陣列是其中一個參數。然後,在我的功能我提取的第一個元素數組中,並返回給用戶:

llvm::Function::arg_iterator AI = jit_function_->arg_begin(); 
llvm::Value *x = AI; 
llvm::Value *x0 = Builder.CreateExtractValue(x,0); 
Builder.CreateRet(x0); 

代碼即時編譯器很好,但是當我嘗試運行它,它不工作。例如:

typedef double (*GenType)(double[2]); 
GenType FP = GenType(intptr_t(TheExecutionEngine->getPointerToFunction(jit_function_))); 
double y[2] = {10,20}; 
double r = FP(y); 
printf("r = %g\n", r); 

返回值只是無稽之談,我看不出我做錯了什麼。如果我將數組中的值(10和20)作爲標量參數傳遞給函數,那麼它工作正常。

回答

8

我想我能回答我自己的問題。對於問題的第一部分,對LLVM的一個很好的參考(除了上面提到的那個)之外,是用普通的C編寫你想要的東西,然後用Clang編譯並查看LLVM輸出:clang -S -emit-llvm test.c -o -

對於具體的問題,我的問題是,我認爲我將兩個雙打數組傳遞給jitted函數,而實際上我將一個指針傳遞給具有兩個值的數組。因此,解決辦法是改變:

const llvm::Type* array_t = llvm::ArrayType::get(double_t,2); 

const llvm::Type* array_t = llvm::PointerType::getUnqual(llvm::ArrayType::get(double_t,2)); 

而且通過改變

llvm::Value *x0 = Builder.CreateExtractValue(x,0); 

增加一個額外的解引用到

llvm::Value *x0 = Builder.CreateExtractValue(Builder.CreateLoad(x),0); 
0

如果您使用的是LLVM 3.0或3.1,CreateExtractValue需要帶索引的ArrayRef。

+0

是的,我知道(它用於上面的代碼中)。但它並沒有真正回答這個問題。 – Joel 2012-03-11 12:12:54