llvm學(xué)習(xí)日記二:創(chuàng)建一個(gè)LLVM工程-從零開始創(chuàng)建(xcode和makefile)

參考書:《Getting Started with LLVM Core Libraries》

書里邊只介紹了makefile形式愈腾,我這里介紹了兩種方式,我自己覺得Xcode要方便一點(diǎn)往史,因?yàn)榭梢灾苯诱{(diào)試(純小白可能看起來費(fèi)力一點(diǎn))增淹。

一欧引、MakeFile項(xiàng)目:

包含一個(gè)makefile文件和一個(gè)cpp文件垮媒,書中的源代碼是基于llvm3的,我自己是基于llvm9.0的贝奇,所以基于他書中給出的代碼做了修改虹菲。

  1. 書中的源代碼:


    image.png

    image.png
  2. 我貼一下我自己的代碼:

MakeFile 文件:

路徑根據(jù)自己電腦的llvm項(xiàng)目更改;

  • LLVM_CONFIG 獲取編譯參數(shù)掉瞳、鏈接參數(shù)
  • CXXINCLUDE毕源、ISYSROOT 是我自己根據(jù)電腦路徑添加的,因?yàn)槲译娔X上編譯的話會報(bào)錯(cuò)陕习,添加的C++標(biāo)準(zhǔn)庫頭文件路徑和mac上SDK的路徑霎褐,這樣才能編譯通過
  • LIB 這個(gè)LLVM的庫
  • 其余的設(shè)置參考書中就行,沒什么變化该镣,路徑需要根據(jù)自己電腦上來設(shè)置冻璃。
    (書中是只用到了幾個(gè)核心的llvm庫,我是直接用了整個(gè)庫libLLVM.dylib,因?yàn)槲腋牧它c(diǎn)代碼俱饿,為了方便)
LLVM_CONFIG ?= /Users/qinyao/LLVM/LLVM-9.0.0/build-release/bin/llvm-config

# CXX = /Users/qinyao/LLVM/LLVM-9.0.0/build-release/bin/clang++
CXXINCLUDE+=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
# CXXINCLUDE+=/Users/qinyao/LLVM/LLVM-9.0.0/build-release/include/c++/v1
ISYSROOT+=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk
LIB+=/Users/qinyao/LLVM/LLVM-9.0.0/build-release/lib

ifndef VERBOSE
QUIET:=@
endif

SRC_DIR?=$(PWD)
LDFLAGS+=$(shell $(LLVM_CONFIG) --ldflags)
COMMON_FLAGS=-Wall -Wextra -I$(CXXINCLUDE) -isysroot $(ISYSROOT) 
CXXFLAGS+=$(COMMON_FLAGS) $(shell $(LLVM_CONFIG) --cxxflags)
CPPFLAGS+=$(shell $(LLVM_CONFIG) --cppflags) -I$(SRC_DIR) 



HELLO=helloworld
HELLO_OBJECTS=hello.o


default: $(HELLO)

%.o : $(SRC_DIR)/%.cpp
    @echo Compiling $*.cpp
    $(QUIET)$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $<
$(HELLO) : $(HELLO_OBJECTS)
    @echo Linking $@
    $(QUIET)$(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) $^ -L$(LIB) -lLLVM

clean::
    $(QUIET)rm -f $(HELLO) $(HELLO_OBJECTS)

#-DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi"
#$(QUIET)$(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) $^ `$(LLVM_CONFIG) --libs bitreader core support` `$(LLVM_CONFIG) --system-libs`

hello cpp 文件:

改了一點(diǎn)寫法歌粥,解析一個(gè)bc文件,遍歷module拍埠,拿到函數(shù)列表,遍歷這個(gè)函數(shù)迭代器土居,輸出函數(shù)名和函數(shù)包含的基礎(chǔ)塊枣购。


#include "llvm/Bitcode/BitcodeReader.h"
#include "llvm/Bitcode/BitcodeWriter.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_os_ostream.h"
#include "llvm/IRReader/IRReader.h"
#include "llvm/Support/SourceMgr.h"
// #include "llvm/Support/system_error.h"
#include <iostream>

using namespace llvm;
static cl::opt<std::string> FileName("qy-file", cl::desc("input one Bitcodefile"), cl::Required);

int main(int argc, char** argv) {
    
    cl::ParseCommandLineOptions(argc, argv, "LLVM hello world\n");
    LLVMContext Context;
    SMDiagnostic Err;
    // std::cout<<FileName<<std::endl;

    std::unique_ptr<Module> M = parseIRFile(FileName, Err, Context);
    if (!M) {
        Err.print(FileName.c_str(), errs());
        return false;
    }

    for(auto &func : M->functions()){
        llvm::StringRef func_name = func.getName();
    }
    
    raw_os_ostream OUT(std::cout);
    for (Module::const_iterator i = M->getFunctionList().begin(),e = M->getFunctionList().end(); i != e; ++i) {
        if (!i->isDeclaration()) {
            OUT << i->getName() << " has " << i->size() << " basicblock(s).\n";
        }
    }

    
    std::cout<<"hello,world."<<std::endl;
    return 0;
}

  1. 上面沒問題了就直接make:
    make可能會遇到各種問題,需要注意路徑正確擦耀。


    image.png
  2. 運(yùn)行:
    需要設(shè)置一下庫搜索路徑:


    image.png
image.png

二棉圈、Xcode創(chuàng)建:

  1. 創(chuàng)建一個(gè)Xcode 命令行項(xiàng)目:
    代碼直接貼進(jìn)去,和上邊的cpp代碼一樣


    image.png
  2. 環(huán)境配置:

  • 頭文件路徑:使用llvm9.0編譯出來的debug模式的頭文件眷蜓,后面方便調(diào)試


    image.png
  • 庫搜索路徑:


    image.png
  • 編譯參數(shù):這個(gè)是解決一個(gè)鏈接問題


    image.png
  • 導(dǎo)入llvm的庫:


    image.png

    這些參數(shù)設(shè)置正確后應(yīng)該可以編譯通過分瘾。

  • 運(yùn)行參數(shù):

static cl::opt<std::string> FileName("qy-file", cl::desc("input one Bitcodefile"), cl::Required);
image.png
  • 運(yùn)行時(shí)庫搜索路徑:


    image.png

至此,可以直接編譯運(yùn)行了吁系。


image.png

總結(jié):這里僅僅是熟悉了項(xiàng)目創(chuàng)建德召,代碼的編寫還需要實(shí)踐的更多才能熟悉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汽纤,一起剝皮案震驚了整個(gè)濱河市上岗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蕴坪,老刑警劉巖肴掷,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異背传,居然都是意外死亡呆瞻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門径玖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痴脾,“玉大人,你說我怎么就攤上這事挺狰∶鞴” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵丰泊,是天一觀的道長薯定。 經(jīng)常有香客問我,道長瞳购,這世上最難降的妖魔是什么话侄? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上年堆,老公的妹妹穿的比我還像新娘吞杭。我一直安慰自己,他們只是感情好变丧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布芽狗。 她就那樣靜靜地躺著,像睡著了一般痒蓬。 火紅的嫁衣襯著肌膚如雪童擎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天攻晒,我揣著相機(jī)與錄音顾复,去河邊找鬼。 笑死鲁捏,一個(gè)胖子當(dāng)著我的面吹牛芯砸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播给梅,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼假丧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了破喻?” 一聲冷哼從身側(cè)響起虎谢,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎曹质,沒想到半個(gè)月后婴噩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羽德,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年几莽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宅静。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡章蚣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姨夹,到底是詐尸還是另有隱情纤垂,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布磷账,位于F島的核電站峭沦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逃糟。R本人自食惡果不足惜吼鱼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一蓬豁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菇肃,春花似錦地粪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笑跛,卻和暖如春付魔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背飞蹂。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翻屈,地道東北人陈哑。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像伸眶,于是被迫代替她去往敵國和親惊窖。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345