TOK_Wang 发表于 2011-01-29 10:21

Semo Compiler 析码多目标编译器(国产开源) 0.3.0 来了 ARMv7、York-Town分配器等。

本帖最后由 TOK_Wang 于 2011-02-12 13:32 编辑

析码多目标编译器是国内某开源社区发起的开源项目,三年以来先后发布了三次二进制版本,这次的0.3.0在上一版本基础上改动略小一些,主要完成了寄存器分配模块、完善了ARM汇编器等。

0.3.0 更新以下特性:

前段部分
全面支持预处理指令与宏特性。
实现了C99的变量定义、变量引用、函数定义、if-else、while、do-while,以及二元表达式等语法。

中段部分
实现了抽象语法与第0层抽象代码模块、SSA、寄存器分配器(基于YT模型)。

后段部分
实现了部分第0层抽象代码到ARMv7汇编代码转换模块、ARMv7汇编器,实现加减乘除、寻址等THUMB指令集编码。
实现了ARM-ELF动态链接器,支持多目标链接,并建立内存镜像,内存镜像可直接运行。

代码:http://semo.googlecode.com/svn/trunk/
程序:http://code.google.com/p/semo/downloads/detail?name=semo%200.3.0.rar&can=2&q=#makechanges

最新更新
2011年1月29号:
1. 修正了C语言预处理模块,宏函数替换bug。
2. 修正C语言词法分析模块,预读取FUNDEF与FUNCAL时原始状态丢失问题。

2011年1月28号:
1. 更新“内部原理”文档。
2. 更新“front-para”只要针对因为输入尚未实现的语法可能引起的异常错误。

2011年1月27号:
1. 修改生命域的干涉关系判定函数判定误差问题。
2. 修改编译后的输出信息,如总时间开销、二进制编码总量、生命域分裂次数、寄存器分配器开销等。

2011年1月26号 修改mid-para以下几处 bug:
1. a = a , a1.0 = a1 无法确定生命域编号。
2. 检测LiveScopeMonitor?中的节点时,无法确定全部节点的交涉关系,需要O(N*N)。
3. 生命域分裂时,在原始LAC中操作。否则是无效的。

2011年1月25号:
1. 添加ISA_INTEGER。
2. 汇编模块词法分析解析代码时,遇到寄存器直接返回机器码。
3. 对于ISA_INTEGER等立即数不产生SSA。

看一个寄存器分配的例子,以下是C语言代码:void gtkings(){
        int a = 10;
        int b = 100;
        int c = 0 ;
        int e = 0 ;
        int f = 0 ;
        int g = 0 ;
        int h = 0 ;
        int i = 0 ;
        int j = 0 ;
        int k = 0 ;
        int l = 0 ;
        int m = 0 ;
        int n = 0 ;
       
        int o = 0 ;
        int p = 0 ;
        int q = 0 ;
        int r = 0 ;
        int s = 0 ;
        int t = 0 ;
        int u = 0 ;
        int v = 0 ;
        int w = 0 ;
        int x = 0 ;
        int y = 0 ;
        int z = 0 ;

        a = a + a ;
        b = b + b ;
        c = a + a ;
        b = b + b ;
        e = a + c ;       
        f = c + c ;
        g = b + b ;
        h = a + a ;
        i = e + e ;
        j = f + g ;
        k = c + c ;
        l = a + e ;
        m = j + f ;
        n = n + m ;
        o = f + i ;
        p = j + m ;
        q = g + b ;
        r = c + a ;
        s = n + p ;
        t = l + o ;
        u = c + e ;
        v = k + q ;
        w = l + r ;
        x = s + v ;
        y = t + w ;
        z = x + y ;
}析码第0层抽象代码:
gtkings()
{
L25:
        %$V1.25 = a1.0+a1.0;
        a2.26 = %$V1.25 ;
L26:
        %$V2.27 = b1.1+b1.1;
        b2.28 = %$V2.27 ;
L27:
        %$V3.29 = a2.26+a2.26;
        c2.30 = %$V3.29 ;
L28:
        %$V4.31 = b2.28+b2.28;
        b3.32 = %$V4.31 ;
L29:
        %$V5.33 = a2.26+c2.30;
        e2.34 = %$V5.33 ;
L30:
        %$V6.35 = c2.30+c2.30;
        f2.36 = %$V6.35 ;
L31:
        %$V7.37 = b3.32+b3.32;
        g2.38 = %$V7.37 ;
L32:
        %$V8.39 = a2.26+a2.26;
        h2.40 = %$V8.39 ;
L33:
        %$V9.41 = e2.34+e2.34;
        i2.42 = %$V9.41 ;
L34:
        %$V10.43 = f2.36+g2.38;
        j2.44 = %$V10.43 ;
L35:
        %$V11.45 = c2.30+c2.30;
        k2.46 = %$V11.45 ;
L36:
        %$V12.47 = a2.26+e2.34;
        l2.48 = %$V12.47 ;
L37:
        %$V13.49 = j2.44+f2.36;
        m2.50 = %$V13.49 ;
L38:
        %$V14.51 = n1.12+m2.50;
        n2.52 = %$V14.51 ;
L39:
        %$V15.53 = f2.36+i2.42;
        o2.54 = %$V15.53 ;
L40:
        %$V16.55 = j2.44+m2.50;
        p2.56 = %$V16.55 ;
L41:
        %$V17.57 = g2.38+b3.32;
        q2.58 = %$V17.57 ;
L42:
        %$V18.59 = c2.30+a2.26;
        r2.60 = %$V18.59 ;
L43:
        %$V19.61 = n2.52+p2.56;
        s2.62 = %$V19.61 ;
L44:
        %$V20.63 = l2.48+o2.54;
        t2.64 = %$V20.63 ;
L45:
        %$V21.65 = c2.30+e2.34;
        u2.66 = %$V21.65 ;
L46:
        %$V22.67 = k2.46+q2.58;
        v2.68 = %$V22.67 ;
L47:
        %$V23.69 = l2.48+r2.60;
        w2.70 = %$V23.69 ;
L48:
        %$V24.71 = s2.62+v2.68;
        x2.72 = %$V24.71 ;
L49:
        %$V25.73 = t2.64+w2.70;
        y2.74 = %$V25.73 ;
L50:
        %$V26.75 = x2.72+y2.74;
        z2.76 = %$V26.75 ;
}
下图由析码基于以上代码实时生成,生命域干涉情况:
http://www.tok.cc/postpics/regocresults0.jpg
上图生命域分裂后,共分裂46次。寄存器最高同时占用5个,总分配5个,总开销 110 ms:
http://www.tok.cc/postpics/regocresults.jpg

给力 0.2.0:http://linux.chinaunix.net/bbs/thread-1169541-1-1.html

EricFisher 发表于 2011-02-11 09:00

不错,赞一下
页: [1]
查看完整版本: Semo Compiler 析码多目标编译器(国产开源) 0.3.0 来了 ARMv7、York-Town分配器等。