免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4214 | 回复: 1
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-29 10:21 |只看该作者 |倒序浏览
本帖最后由 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/do ... &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语言代码:
  1. void gtkings(){
  2.         int a = 10;
  3.         int b = 100;
  4.         int c = 0 ;
  5.         int e = 0 ;
  6.         int f = 0 ;
  7.         int g = 0 ;
  8.         int h = 0 ;
  9.         int i = 0 ;
  10.         int j = 0 ;
  11.         int k = 0 ;
  12.         int l = 0 ;
  13.         int m = 0 ;
  14.         int n = 0 ;
  15.        
  16.         int o = 0 ;
  17.         int p = 0 ;
  18.         int q = 0 ;
  19.         int r = 0 ;
  20.         int s = 0 ;
  21.         int t = 0 ;
  22.         int u = 0 ;
  23.         int v = 0 ;
  24.         int w = 0 ;
  25.         int x = 0 ;
  26.         int y = 0 ;
  27.         int z = 0 ;

  28.         a = a + a ;
  29.         b = b + b ;
  30.         c = a + a ;
  31.         b = b + b ;
  32.         e = a + c ;       
  33.         f = c + c ;
  34.         g = b + b ;
  35.         h = a + a ;
  36.         i = e + e ;
  37.         j = f + g ;
  38.         k = c + c ;
  39.         l = a + e ;
  40.         m = j + f ;
  41.         n = n + m ;
  42.         o = f + i ;
  43.         p = j + m ;
  44.         q = g + b ;
  45.         r = c + a ;
  46.         s = n + p ;
  47.         t = l + o ;
  48.         u = c + e ;
  49.         v = k + q ;
  50.         w = l + r ;
  51.         x = s + v ;
  52.         y = t + w ;
  53.         z = x + y ;
  54. }
复制代码
析码第0层抽象代码:

  1. gtkings()
  2. {
  3. L25:
  4.         %$V1.25 = a1.0+a1.0;
  5.         a2.26 = %$V1.25 ;
  6. L26:
  7.         %$V2.27 = b1.1+b1.1;
  8.         b2.28 = %$V2.27 ;
  9. L27:
  10.         %$V3.29 = a2.26+a2.26;
  11.         c2.30 = %$V3.29 ;
  12. L28:
  13.         %$V4.31 = b2.28+b2.28;
  14.         b3.32 = %$V4.31 ;
  15. L29:
  16.         %$V5.33 = a2.26+c2.30;
  17.         e2.34 = %$V5.33 ;
  18. L30:
  19.         %$V6.35 = c2.30+c2.30;
  20.         f2.36 = %$V6.35 ;
  21. L31:
  22.         %$V7.37 = b3.32+b3.32;
  23.         g2.38 = %$V7.37 ;
  24. L32:
  25.         %$V8.39 = a2.26+a2.26;
  26.         h2.40 = %$V8.39 ;
  27. L33:
  28.         %$V9.41 = e2.34+e2.34;
  29.         i2.42 = %$V9.41 ;
  30. L34:
  31.         %$V10.43 = f2.36+g2.38;
  32.         j2.44 = %$V10.43 ;
  33. L35:
  34.         %$V11.45 = c2.30+c2.30;
  35.         k2.46 = %$V11.45 ;
  36. L36:
  37.         %$V12.47 = a2.26+e2.34;
  38.         l2.48 = %$V12.47 ;
  39. L37:
  40.         %$V13.49 = j2.44+f2.36;
  41.         m2.50 = %$V13.49 ;
  42. L38:
  43.         %$V14.51 = n1.12+m2.50;
  44.         n2.52 = %$V14.51 ;
  45. L39:
  46.         %$V15.53 = f2.36+i2.42;
  47.         o2.54 = %$V15.53 ;
  48. L40:
  49.         %$V16.55 = j2.44+m2.50;
  50.         p2.56 = %$V16.55 ;
  51. L41:
  52.         %$V17.57 = g2.38+b3.32;
  53.         q2.58 = %$V17.57 ;
  54. L42:
  55.         %$V18.59 = c2.30+a2.26;
  56.         r2.60 = %$V18.59 ;
  57. L43:
  58.         %$V19.61 = n2.52+p2.56;
  59.         s2.62 = %$V19.61 ;
  60. L44:
  61.         %$V20.63 = l2.48+o2.54;
  62.         t2.64 = %$V20.63 ;
  63. L45:
  64.         %$V21.65 = c2.30+e2.34;
  65.         u2.66 = %$V21.65 ;
  66. L46:
  67.         %$V22.67 = k2.46+q2.58;
  68.         v2.68 = %$V22.67 ;
  69. L47:
  70.         %$V23.69 = l2.48+r2.60;
  71.         w2.70 = %$V23.69 ;
  72. L48:
  73.         %$V24.71 = s2.62+v2.68;
  74.         x2.72 = %$V24.71 ;
  75. L49:
  76.         %$V25.73 = t2.64+w2.70;
  77.         y2.74 = %$V25.73 ;
  78. L50:
  79.         %$V26.75 = x2.72+y2.74;
  80.         z2.76 = %$V26.75 ;
  81. }
复制代码
下图由析码基于以上代码实时生成,生命域干涉情况:

上图生命域分裂后,共分裂46次。寄存器最高同时占用5个,总分配5个,总开销 110 ms:


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

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
2 [报告]
发表于 2011-02-11 09:00 |只看该作者
不错,赞一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP