llvm學(xué)習(xí)日記十三:PassManager 注冊(cè)pass

參考:http://www.alonemonkey.com/2016/12/21/learning-llvm/

一芋绸、目的:

寫入opt和clang的命令參數(shù),可以直接參數(shù)指定調(diào)用

二脾猛、使用pass

把上一小節(jié)的pass稍加修改

  • 創(chuàng)建頭文件:include/llvm/Transforms/CountOpcode/CountOpcode.h
#include "llvm/IR/Function.h"
#include "llvm/Pass.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Instructions.h"
#include "llvm/InitializePasses.h"

#define DEBUG_TYPE "opcodecounter"

namespace llvm {
    FunctionPass *createCountOpcodePass();
//    void initializeCountOpcodePass(PassRegistry &Registry);
}
  • cpp文件:lib/Transforms/CountOpcode/CountOpcode.cpp
#include "llvm/Transforms/CountOpcode/CountOpcode.h"

using namespace llvm;

static cl::opt<bool> EnableCountOpcode("opcodeCounter2", cl::init(false),
                                 cl::desc("Count opcode number"));

namespace llvm {
    struct CountOpcode : public FunctionPass {
        std::map<std::string,int> opcodeCounter;
        static char ID;
        CountOpcode() : FunctionPass(ID){}
        virtual bool runOnFunction(Function &F) {
            if(!EnableCountOpcode){
                return false;
            }
            errs()<<"FunctionName:"<<F.getName()<<"\n";
            for(Function::iterator bb = F.begin(),e = F.end();bb!=e;++bb){
                for(BasicBlock::iterator i = bb->begin(),ie = bb->end();i!=ie;++i){
                    if(opcodeCounter.find(i->getOpcodeName()) == opcodeCounter.end()){
                        opcodeCounter[i->getOpcodeName()] =1;
                    }else{
                        opcodeCounter[i->getOpcodeName()] +=1;
                    }
                }
            }
            std::map<std::string,int>::iterator ib = opcodeCounter.begin();
            std::map<std::string,int>::iterator ie = opcodeCounter.end();
            while (ib != ie) {
                errs() << ib->first << " : " << ib->second << "\n";
                ib++;
            }
            errs()<<"\n";
            opcodeCounter.clear();
            return false;
        }
        
    };
    FunctionPass * createCountOpcodePass(){
        return new CountOpcode();
    }

}

char CountOpcode::ID = 0;
//static RegisterPass<CountOpcode> X("opcodeCounter", "Count opcode number", false, false);
INITIALIZE_PASS(CountOpcode, "opcodeCounter", "Count opcode number", false, false)

  • 創(chuàng)建LLVMBuild.txt : lib/Transforms/CountOpcode/LLVMBuild.txt
[component_0]
type = Library
name = CountOpcode
parent = Transforms
library_name = CountOpcode
  • 創(chuàng)建CMakeLists.txt : lib/Transforms/CountOpcode/CMakeLists.txt

add_llvm_library( LLVMCountOpcode
  CountOpcode.cpp

  DEPENDS
  intrinsics_gen
  )

  • lib/Transforms/CMakeLists.txt
add_subdirectory(CountOpcode)
  • lib/Transforms/LLVMBuild.txt 加上我們的pass
[common]
subdirectories = AggressiveInstCombine Coroutines IPO InstCombine Instrumentation Scalar Utils Vectorize ObjCARC CountOpcode
  • PassManager 注冊(cè)
  • lib/Transforms/IPO/PassManagerBuilder.cpp 添加頭文件:
#include "llvm/Transforms/CountOpcode/CountOpcode.h"
  • lib/Transforms/IPO/PassManagerBuilder.cpp 函數(shù) populateModulePassManager 添加:
MPM.add(createCountOpcode());
  • lib/Transforms/IPO/LLVMBuild.txt 添加:
required_libraries = AggressiveInstCombine Analysis BitReader BitWriter Core InstCombine IRReader Linker Object ProfileData Scalar Support TransformUtils Vectorize Instrumentation CountOpcode
  • 相關(guān)頭文件修改:
    llvm/LinkAllPasses.h 頭文件添加:
    #include "llvm/Transforms/CountOpcode/CountOpcode.h"
    (void) llvm::createCountOpcodePass();
    llvm/InitializePasses.h 頭文件添加:
    void initializeCountOpcodePass(PassRegistry&);
  • opt命令參數(shù)添加:
    initializeCountOpcodePass(Registry);

最后分別編譯opt和clang勺爱。

  • 編譯可能的問題:
  1. 最終鏈接找不到新pass的符號(hào)笙以,需要在鏈接flag配置新創(chuàng)建pass庫(kù)的路徑:
    ld: symbol(s) not found for architecture x86_64
    如下配置鏈接庫(kù):
    image.png

四饱苟、opt 和 clang執(zhí)行:

  • opt 參數(shù)與運(yùn)行結(jié)果:


    image.png
image.png
  • clang 參數(shù)與運(yùn)行結(jié)果:


    image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末频鉴,一起剝皮案震驚了整個(gè)濱河市弄匕,隨后出現(xiàn)的幾起案子督函,更是在濱河造成了極大的恐慌恨豁,老刑警劉巖嚣镜,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異橘蜜,居然都是意外死亡菊匿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門计福,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跌捆,“玉大人,你說我怎么就攤上這事象颖∨搴瘢” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵力麸,是天一觀的道長(zhǎng)可款。 經(jīng)常有香客問我育韩,道長(zhǎng),這世上最難降的妖魔是什么闺鲸? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任筋讨,我火速辦了婚禮,結(jié)果婚禮上摸恍,老公的妹妹穿的比我還像新娘悉罕。我一直安慰自己,他們只是感情好立镶,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布壁袄。 她就那樣靜靜地躺著,像睡著了一般媚媒。 火紅的嫁衣襯著肌膚如雪嗜逻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天缭召,我揣著相機(jī)與錄音栈顷,去河邊找鬼。 笑死嵌巷,一個(gè)胖子當(dāng)著我的面吹牛萄凤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搪哪,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼靡努,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了晓折?” 一聲冷哼從身側(cè)響起惑朦,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎已维,沒想到半個(gè)月后行嗤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡垛耳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了飘千。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堂鲜。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖护奈,靈堂內(nèi)的尸體忽然破棺而出缔莲,到底是詐尸還是另有隱情,我是刑警寧澤霉旗,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布痴奏,位于F島的核電站蛀骇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏读拆。R本人自食惡果不足惜擅憔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望檐晕。 院中可真熱鬧暑诸,春花似錦、人聲如沸辟灰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芥喇。三九已至西采,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間继控,已是汗流浹背苛让。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留湿诊,地道東北人狱杰。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像厅须,于是被迫代替她去往敵國(guó)和親仿畸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,701評(píng)論 0 3
  • 近來朗和,ollvm在國(guó)內(nèi)移動(dòng)安全错沽,尤其是安全加固上的使用越來越廣泛,ollvm的混淆和反混淆也被視為比較高等的知識(shí)之...
    that_is_this閱讀 2,981評(píng)論 4 0
  • Swift介紹 Swift是一種高性能的語言眶拉,擁有整潔現(xiàn)代的語法千埃。swift可以和C、OC的代碼和框架無縫銜接忆植,并...
    sea_biscute閱讀 6,184評(píng)論 2 22
  • http://www.starming.com/index.php?v=index&view=107 http:/...
    111浪子111閱讀 3,153評(píng)論 0 11
  • PS: Clang為L(zhǎng)LVM提供的C語言編譯器放可,默認(rèn)參數(shù)可以生成本機(jī)可執(zhí)行的二進(jìn)制程序。-S和-c參數(shù)與GCC一樣...
    HAPPYers閱讀 4,623評(píng)論 0 2