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 不错,赞一下
页:
[1]