發表文章

目前顯示的是 九月, 2013的文章

LLVM學習筆記 -- LLVM

最近因為有比較多的空閒時間所以看了一些有關Linux Kernel跟OS的書以及參加了Coscup,也寫了一些Code(有C/C++, Javascript 和Python之類的code ),後來想了一想以前學習C的時候通常不會去管編譯器到底做什麼事以及如何設計一個簡單的編譯器。

    所以我參考了Compilers Principles Techniques and Tools (2nd Edition) 這本書,但看了前面幾個章節發覺直接看書真的不容易理解編譯器是怎麼寫的還有裡面的原理,後來我想到在Coscup上有聽到LLVM,一開始還不知道LLVM再做什麼的然後在網路上找了一下資料來了解他能做什麼(http://zh.wikipedia.org/wiki/LLVM)。從Wiki的資料來看他利用虛擬技術來創造出編譯時期,鏈結時期,執行時期以及「閒置時期」的最佳化(資料來自Wiki)。

      當然這樣看還是不太容易理解,後來就找到了LLVM官方自己寫的教學(http://llvm.org/docs/tutorial/LangImpl1.html),這個教學是教我們如何用LLVM開發一個Kaleidoscope語言,所以這個語言非常的簡單,但是用來學習基本的Compiler跟如何使用LLVM是滿夠用的。

      這個教學我目前也看只看到第三章而已,看完前面三章自己是覺得LLVM也是滿有趣的東西。所以我的目標是看完第四章後,再來寫一到四章的教學文章。而另一個目標等看完所有的教學,要來寫一個專屬自己的程式語言,用想的就覺得這個Project真讓人興奮,所以寫了這一篇文章來提醒自己要動工了 XD。

在Makefile執行shell指令 -- Makefile

Reference :
http://stackoverflow.com/questions/10024279/how-to-use-shell-commands-in-makefile

如何在Makefile上執行shell的指令,只要利用$(shell command)就可以了。

範例:

FILES := $(shell ls) all: echo $(FILES)


Function call and Function point -- assemble and C

圖片
這一篇主要看C的function call 和 function point在gcc產生出來的assemble code
上是有什麼不同。

OS   : Ubuntu x86_64
GCC : 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1)

1. C Code

下面分別列出Function Call跟Function Point的C Code的例子,如果懂的話就可以
直接跳過這部份。因為真的很簡單 :D 。

-- Function Call --
#include <stdio.h>
#include <stdlib.h>

void test()
{
    printf("Hello World\n");
}

int main(int argc, const char *argv[])
{
    test();
    return 0;
}
-- Function Point --
#include <stdio.h>
#include <stdlib.h>

void test()
{
    printf("Hello World\n");
}

int main(int argc, const char *argv[])
{
    void (*pfunc)() = {test};
    pfunc();

    return 0;
}

2. Assemble


這邊Assemble code是用了gcc最佳化的參數 -O0,意思就是沒有最佳化啦。
從圖的左邊136行是Function Call從這部份來看assemble是直接用callq來呼叫test
這個function

而Function Point步驟就比較多了。從圖右邊135行開始,先將test的位址(0x40052C)
配置到pfunc變數( -0x8(%rbp) )上,然後再將pfunc變數的內容配置到rdx這個register上,
接著在用callq來呼叫rdx所指到的test這個function。



















3. 最佳化

如果你gcc的參數下了 -O3(最佳化提升到Level 3)就可以從下圖看到compiler很聰明
知道這兩個程式其實是作同一件事,所以他直接用callq來呼叫test