2015-10-28 4 views
1

Я реализую несколько проходов на LLVM, чтобы добавить исходную оптимизацию, Эти проходы основаны на FunctionPass и ModulePass. Теперь каждый Пасс вызывается соответствующей опцией команды выбора, которая равна , зарегистрированной по шаблону RegisterPass.Как запустить функцию Pass перед модулем Pass в LLVM?

В будущем я хотел бы, чтобы эти проходы были вызваны только одним опцией команды opt. Моя идея такова: - - Во-первых, функция переходит к запуску, и, наконец, модуль переходит к запуску. - Каждая функция переходит к использованию информации анализа прошлых функций. - Окончательный модуль передает конструкцию новой функции, используя результат предыдущих функций. - Все эти последовательности Passes вызывают только одну опцию команды opt, определяющую окончательный проход модуля.

Я думал, что могу сделать это с помощью метода addRequired в классе AnalysisUsage. Однако, похоже, что это не сработало: - - В проходе функции несколько проходов функций могут быть добавлены в порядке. - В пропускной способности функции может быть добавлен только один проход модуля. - В проходе функции (X) пропуск функции и прохождение модуля не могут быть добавлены одновременно. Т.е. команда команды opt с опцией X вызывает статус блокировки. - В проходе модуля может быть добавлен только один проход модуля. - В проходе модуля (Y) невозможно передать значение функции (Z). Т.е. команда opt с опцией Y выполняет только Y, а функция pass (Z) игнорируется.

Я не знаком с механизмом управления Pass. Кто-нибудь поможет мне запустить прогон функции перед прохождением модуля только с одной опцией команды команды?


Случай исполнения приведен ниже: -

$ opt -stats -load ~/samples/tryPass4.so -MPass4 hello2.ll -S -o tryPass4.ll -debug-pass=Structure 
Pass Arguments: -targetlibinfo -datalayout -notti -basictti -x86tti -MPass4 -verify -verify-di -print-module 
Target Library Information            ↑ 
Data Layout                              -FPass4 doesn't appear here 
No target information 
Target independent code generator's TTI 
X86 Target Transform Info 
    ModulePass Manager 
    Module Pass 
     Unnamed pass: implement Pass::getPassName() 
    FunctionPass Manager 
     Module Verifier 
    Debug Info Verifier 
    Print module to stderr 
Pass Arguments: -FPass4    <- here -FPass4 appears, but not executed 
    FunctionPass Manager 
    Function Pass 


***** Module Name : hello2.ll <- output from the Module pass 

Исходный код выше выглядит следующим образом: -

using namespace llvm; 
namespace{ 
class tryFPass4 : public FunctionPass { 
    public : 
    static char ID; 
    tryFPass4() : FunctionPass(ID){} 
    ~tryFPass4(){} 
    virtual bool runOnFunction(llvm::Function &F); 
    virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const; 
}; 
class tryMPass4 : public ModulePass { 
    public : 
    static char ID; 
    tryMPass4() : ModulePass(ID){} 
    ~tryMPass4(){} 
    virtual bool runOnModule(llvm::Module &M); 
    virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const; 
}; 
} 
bool tryFPass4::runOnFunction(Function &F) { 
    bool change = false; 
    .... 
    return change; 
} 
bool tryMPass4::runOnModule(Module &M) { 
    bool change = false ; 
    .... 
    return change; 
} 

void tryFPass4::getAnalysisUsage(AnalysisUsage &AU) const { 
    AU.setPreservesCFG(); 
} 

void tryMPass4::getAnalysisUsage(AnalysisUsage &AU) const { 
    AU.setPreservesCFG(); 
    AU.addRequired<tryFPass4>(); 
} 
char tryFPass4::ID = 0; 
static RegisterPass<tryFPass4> X("FPass4", "Function Pass", false, false); 

char tryMPass4::ID = 0; 
static RegisterPass<tryMPass4> Y("MPass4", "Module Pass", false, false); 

ответ

0

Я попытался смоделировать проблему here используя LLVM 3.8.1.

Я считаю, что ваш Function проход получает бежать здесь:

Module Pass 
    Unnamed pass: implement Pass::getPassName() 

Я не знаю, почему она помечена как неназванный хотя getPassName является перекрываться.

Тонкая деталь, которую вы должны смотреть в том, что для того, чтобы функции передать на самом деле выполнить его метод runOnFunction, вам нужно вызвать Function & конкретный метод getAnalysis как в:

getAnalysis<tryFPass4>(f); // where f is the current Function operating on 

Кажется, если зависимый проход работает на небольшой единице IR, чем требуемый пропуск, он должен выполняться явно. Возможно, я ошибаюсь, так как я еще не пробовал его с BasicBlockPass, требуемым FunctionPass.

Смежные вопросы