2014-12-01 32 views
1

下面是設置:我正在使用LLVM,並且我有一個分析過程,需要將分析的某些結果提供給以後使用。這些結果需要在我生成的最終.s文件(ARM體系結構)中可見。然後,我在.s文件上運行一些腳本,這些腳本會使用這些結果進行進一步分析,但也取決於生成的ASM的實際結構(否則,我只會使用更多的LLVM傳遞)。在LLVM中,如何反映彙編文件中的元數據?

最初我以爲元數據是我想要的,我創建了一些簡單的測試函數來爲我關心的每個指令插入一些元數據。但我不知道如何使這個元數據反映在最終的.s文件中。更糟糕的是,我無法弄清楚如何製作我真正想要的元數據字符串。您將在下面看到的「5」永遠不會輸出。相反,我在輸出中看到46或47。

void addMetadata(Instruction& I) { 
    LLVMContext& C = I.getContext(); 
    MDNode* N = MDNode::get(C, MDString::get(C, "5")); 
    I.setMetadata("alias_set", N); 

    std::cerr << "Instruction" << std::endl; 
    I.dump(); 
} 

輸出示例:

Instruction 
    %30 = load i32* %29, align 4, !dbg !67, !alias_set !46 

我也聽說了內聯彙編可能的工作,但我不知道這是否會允許我到一個特定的IR指令之前插入註釋或標籤。如果IR被重新排序,那麼標籤或評論將隨時隨地發送。基本上,我只想在.s文件中看到標籤或註釋,並帶有一些我想要的信息。有誰知道這是怎麼做到的嗎?謝謝!

回答

2

在進一步的研究中,我發現你不能輕易做我想要做的元數據。調試信息是輸出到程序集文件的元數據的特例。事實證明,對我有用的是內聯ASM。作爲LLVM元數據類的一部分,這可能是一件有用的事情;轉儲元數據的能力。我最終做的是提取任何我關心的元數據,並將它作爲內聯彙編插入到指令前面。該函數將在指令前插入彙編註釋,並且可以將@info_you_want_to_output替換爲您所關心的任何數據的字符串表示形式。注:@通常是ARM彙編註釋的開始。此函數使用ATT彙編語法,但如果您需要Intel語法,則可以用AD_Intel代替AD_ATT。

void insertInfo(Instruction& I) 
{ 
    std::vector<llvm::Type *> AsmArgTypes = {}; 

    FunctionType *AsmFTy = FunctionType::get(Type::getVoidTy(I.getContext()), AsmArgTypes, false); 
    InlineAsm *IA = InlineAsm::get(AsmFTy, std::string("@info_you_want_to_output"), "", 
          /*hasSideEffects*/ true, /*isAlignStack*/ false, InlineAsm::AD_ATT); 
    Instruction *newInst = CallInst::Create(IA, "", &I); 
} 

這是我的ARM彙編一些輸出示例(.S)文件:

ldr r2, .LCPI0_2 
mov r1, r4 
@APP 
@@info_you_want_to_output 
@NO_APP 
bl __cxa_atexit 
pop {r4, lr} 
mov pc, lr 

注意前後的內聯彙編後,將其插入@APP和@NO_APP。我不確定這是什麼表示,但很容易忽略。希望這有助於任何人在未來。

+0

感謝NerdPirate回來與您的解決方案:)在哪些類添加了這段代碼? – eternalStudent 2017-08-31 12:50:30

相關問題