2016-04-26 71 views
0

在學習LLVM框架時,我試圖實現一個'優化'過程,該過程在調用方法時在運行時打印每個方法的名稱。LLVM:從函數傳遞訪問全局變量

,我讀了全局變量只能在模塊間傳遞創建,並且我有創造串(每功能之一),與

Constant* data = ConstantDataArray::getString(M.getContext(), F.getName()); 

GlobalVariable* gvar = 
    new GlobalVariable(M, 
        data->getType(), 
        true, 
        GlobalValue::ExternalLinkage, 
        data, 
        "fname_" + F.getName().str()); 

這工作得很好,只要該字符串奠定了正確在由'優化'位碼生成的彙編文件的內存中。

但是,我還沒有找到一種方法來插入調用來打印函數通過這些字符串。 我想用

Value* string = F.getValueSymbolTable().lookup("fname_" + F.getName().str()); 
CallInst* call = builder.CreateCall(emitPutS(string, builder, &TLI)); 

string回來爲NULL。有沒有更好的方法從函數中查找全局變量?

回答

0

想通了:

基本塊具有getModule()方法,和模塊具有getGlobalVariable(StringRef Name)方法。

或者,IRBuilder:CreateGlobalStringPtr(...)可以從函數傳遞中調用,並且返回的Value*可以直接傳遞給emitPutS(...)。模塊通行證沒有必要。

注意,CallInst* call = builder.CreateCall(emitPutS(string, builder, &TLI));是不正確的。 emitPutS(...)將在基本塊中創建呼叫。 CreateCall是錯誤的。