免费注册 查看新帖 |

Chinaunix

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

gcc的tree [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-26 17:27 |只看该作者 |倒序浏览
gcc使用yacc语法分析后,生成一棵语法树,gcc的树定义在tree.h,主要的数据结构有:
enum tree_code {
      IDENTIFIER_NODE,
      NEGATE_EXPR,
      ADDR_EXPR,
      TRUTH_NOT_EXPR,
      CONVERT_EXPR,
      REAL_CST,
      INTEGER_CST,
      LAST_AND_UNUSED_TREE_CODE
};

struct tree_common {
      union tree_node * chain;
      union tree_node * type;
      enum tree_code code;
};

struct tree_int_cst {
      char common[sizeof(struct tree_common)];
      int value;
};

struct tree_real_cst {
      char common[sizeof(struct tree_common)];
      double value;
};

struct tree_identifier {
      char common[sizeof(struct tree_common)];
      char * name;
};

struct tree_vec {
      char common[sizeof(struct tree_common)];
      int length;
      union tree_node * a[1];
};
struct tree_string {
      char common[sizeof(struct tree_common)];
      int length;
      char * pointer;
};

struct tree_complex {
      char common[sizeof(struct tree_common)];
      union tree_node * real;
      union tree_node * img;
};

struct tree_exp {
      char common[sizeof(struct tree_common)];
      int complexity;
      union tree_node * operands[1];
};

struct tree_type {
      char common[sizeof(struct tree_common)];
      union tree_node * values;
      union tree_node * size;
      union tree_node * pointer_to;
      union tree_node * reference_to;
};

struct tree_decl {
      char common[sizeof(struct tree_common)];
      char * filename;
      int linenum;
      union tree_node * size;
      union tree_node * name;
      union tree_node * context;
      union tree_node * arguments;
      union tree_node * result;
      union tree_node * initial;
      char * print_name;
};

struct tree_list {
      char common[sizeof(struct tree_common)];
      union tree_node * purpose;
      union tree_node * value;
};

union tree_node {
      struct tree_common common;
      struct tree_int_cst int_cst;
      struct tree_real_cst real_cst;
      struct tree_string string;
      struct tree_complex complexs;
      struct tree_identifier identifier;
      struct tree_decl decl;
      struct tree_type type;
      struct tree_list list;
      struct tree_vec vec;
      struct tree_exp exp;
};
typedef union tree_node * tree;
这些struct乍一看还是比较简单,但我在看那些构造语法树的函数(这些函数由yacc调用)时却很疑惑,比如构造一个表达式节点的函数build_unary_op,这个函数会调用很多其他函数,总之函数之间层层调用,我好不容易跟踪完全,但还是不清楚这个表达式节点构造完成后它对应的tree到底是什么样子。我想请教,当gcc编译程序时,有没有办法使用gdb来查看它生成的tree。

论坛徽章:
0
2 [报告]
发表于 2008-11-26 17:30 |只看该作者

回复 #1 kenby 的帖子

ps:我觉得gcc的tree结构设计得很巧秒,有点面向对象里面多态的味道,但要真正看懂好像很难。

论坛徽章:
0
3 [报告]
发表于 2008-11-26 18:00 |只看该作者

论坛徽章:
0
4 [报告]
发表于 2008-11-26 19:06 |只看该作者
看过第一篇,写得不错,但单靠看代码很难看懂,其实我想问如何调试gcc,能不能实现单步调试?

论坛徽章:
0
5 [报告]
发表于 2008-11-26 20:46 |只看该作者
构建gcc你熟不熟?能不能-g?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2008-11-26 21:02 |只看该作者
对于算法代码,调试器主要是给开发者用的,而一般不是给阅读者用的.因为靠调试它更看不懂.

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2008-11-26 21:03 |只看该作者
我是建议先看,看的大致知道一些了之后,用printf大法来跟踪算法代码。

论坛徽章:
0
8 [报告]
发表于 2008-11-26 21:23 |只看该作者

回复 #6 cjaizss 的帖子

lz是想知道gcc的代码流程,说白了就是想看懂gcc。

论坛徽章:
0
9 [报告]
发表于 2008-11-26 22:03 |只看该作者
看代码,从顶层先过一遍,再深入下去,知道什么个结构,把流程摸清了,看起来就不盲目了,把核心的代码缕出来,看的时候就有个重点。
当然gcc的编写技巧、gnu扩展、还有rtl等结构的设计、操作rtl的算法,都是比较难的部分。还有ssa转换、gimple to rtl的翻译。最核心的在于数据流分析。

论坛徽章:
0
10 [报告]
发表于 2008-11-26 22:49 |只看该作者
我想理解gcc的那些树,比如 a = 4+3对应的树如何用tree表示,因为我正在做一个编译器的作业,词法语法分析写完了,就是不知道如何设计语法树的数据结构比较好,所以想参考gcc.
下了一个gcc3.0
make STAGE1_CFLAGS="-g -O0"
然后gdb调试make出来的cc1就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP