2. 对ID及保留字的处理

   在c语言中,系统预留了非常多keyword。也被称为保留字,比方表示数据类型的int,short,char,控制分支运行的if,then等。

不论什么keyword,本质上也是一个ID,比方它也有长度,对int就是3。对short就是5,也有内容,比方int,short。但比起一般id,

   它还有其它一些属性,比方表示数据类型的int,它有一个数值范围,它的值范围是-xxx到xxx之间。

   因为这种关系,gcc把ID和keyword都保存在一张表中,这张表定义例如以下:

                                         #define MAX_HASH_TABLE 1009

                                          tree hash_table[MAX_HASH_TABLE];    /* id hash buckets */

   同一时候定义了一个函数get_identifier (text) 来操纵这一张表:

       

       函数详细实现就是通过传入的字串查找该id,假设没有则创建这个ID,这里new了一个tree_identifier, 同一时候把它保存在hash_table表中,为了加快查找,这里用到了hash算法。在这里我们见到了struct tree_common结构体chain成员的使用方法,对于hash算法来说,非常难避免冲突,对于传入的不同字串,有可能它算出的hash值是一样的,这时候。我们就把相冲突的ID放在chain成员变量中;

      函数的最后给tree_identifier的成员length,pointer附值。



   gcc 在运行之初,便開始创建这些表示数据类型的keyword。比方int,short,char,void,这个在函数init_lex依次创建,并把创建的相相应的

   tree 结点附给:

        ridpointers[(int) RID_INT]

        ridpointers[(int) RID_CHAR]

        ridpointers[(int) RID_VOID]

        ridpointers[(int) RID_SHORT]



   keyword的ID生成了,还有附一些其它參数,这个过程是在init_decl_processing完毕;在GCC中要表示一个数据类型,要用到以下的结构:



struct tree_type

{

  char common[sizeof (struct tree_common)];

  union tree_node *values;

  union tree_node *sep;

  union tree_node *size;



  enum machine_mode mode : 8;

  unsigned char size_unit;

  unsigned char align;

  unsigned char sep_unit;



  union tree_node *pointer_to;

  union tree_node *reference_to;

  int parse_info;

  int symtab_address;

  union tree_node *name;

  union tree_node *max;

  union tree_node *next_variant;

  union tree_node *main_variant;

  union tree_node *basetypes;

  union tree_node *noncopied_parts;

  /* Points to a structure whose details depend on the language in use.  */

  struct lang_type *lang_specific;

};

   在表示int型的数据类型中,它的两个成员变量sep。max比較重要; sep表示它的最小值。而max表示它的最大值;



   在函数make_signed_type中创建了一个 INTEGER_TYPE 类型的tree 节点;它实际上是一个 struct tree_type 类型的节点,

   在该函数中,创建的节点的sep,max成员被赋予INTEGER_CST 节点,它实际上是一个struct tree_int_cst类型节点:

struct tree_int_cst

{

  char common[sizeof (struct tree_common)];

  long int_cst_low;

  long int_cst_high;

};



  能够看出。它有两个成员特殊成员:int_cst_low,int_cst_high

  对于最小值。它给出的值是: int_cst_low=0x80000000,int_cst_high=0xffffffff

  对于最大值,它给出的值是:int_cst_low=0x7fffffff,int_cst_high=0x0



  它们均是在build_int_2 函数中创建;

  在函数make_signed_type的最后layout_type中,设定int 型数据节点的size成员。它也是一个struct tree_int_cst类型节点,仅仅是它的

   int_cst_low值是4,而int_cst_high为0。



   这样int型节点生成了,这个节点数据和它的ID。最后被封装成一个声明类型节点,它用struct tree_decl结构体表示:

  1. struct tree_decl
  2. {
  3. char common[sizeof (struct tree_common)];
  4. char *filename;
  5. int linenum;
  6. union tree_node *size;
  7. enum machine_mode mode : 8;
  8. unsigned char size_unit;
  9. unsigned char align;
  10. unsigned char voffset_unit;
  11. union tree_node *name;
  12. union tree_node *context;
  13. int offset;
  14. union tree_node *voffset;
  15. union tree_node *arguments;
  16. union tree_node *result;
  17. union tree_node *initial;
  18. char *print_name;
  19. char *assembler_name;
  20. struct rtx_def *rtl; /* acts as link to register transfer language
  21. (rtl) info */
  22. int frame_size; /* For FUNCTION_DECLs: size of stack frame */
  23. struct rtx_def *saved_insns; /* For FUNCTION_DECLs: points to insn that
  24. constitutes its definition on the
  25. permanent obstack. */
  26. int block_symtab_address;
  27. /* Points to a structure whose details depend on the language in use. */
  28. struct lang_decl *lang_specific;
  29. };

能够看出,这是一个巨复杂的结构,int 类型节点转变成一个int 声明节点过程中。它将生成一个struct tree_decl节点,它的

  成员变量name将是int 的ID节点值,它的type 就是刚刚生成的int 节点,这个int 声明节点最后会被放入到记录全局节点的

  global_binding_level中。

  global_binding_level->name 指向刚刚创建的int 声明节点;



  在init_decl_processing函数接下来将创建char 类型节点,unsigned int 类型。short 类型。这些值都回放入global_binding_level->name

  然后通过chain连接起来;   



  总结一下。gcc 用hash表来储存全部的ID,包含保留字;gcc 对于内建的数据类型(int,short,char)在初始化时会生成tree_decl 结构的结点,

  并把它记录在global_binding_level的name变量中。这个name始终指向最后一个声明的结点。并通过节点的chain串接起来。

gcc 源代码分析-前端篇2的更多相关文章

  1. gcc 源代码分析-前端篇3

    3. GCC怎样函表示一个函数   对c语言来说.函数是其核心,全部的东西都在环绕着函数在转.对于一个函数来说.它基本的一些特性例如以下:    1. 有一个返回值,在这里我们没有把返回值的函数觉得它 ...

  2. Android系统进程Zygote启动过程的源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6768304 在Android系统中,所有的应用 ...

  3. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  4. Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6633311 在上一篇文章中,我 们分析了And ...

  5. 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视GCC编译全过程 | 百篇博客分析OpenHarmony源码| v57.01

    百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  6. JAVA随笔篇一(Timer源代码分析和scheduleAtFixedRate的使用)

    写完了基础篇,想了非常久要不要去写进阶篇.去写JSP等等的用法.最后决定先不去写.由于自己并非JAVA方面的大牛.眼下也在边做边学,所以决定先将自己不懂的拿出来学并记下来. Timer是Java自带的 ...

  7. Monkey源代码分析番外篇之Android注入事件的三种方法比較

    原文:http://www.pocketmagic.net/2012/04/injecting-events-programatically-on-android/#.VEoIoIuUcaV 往下分析 ...

  8. 【原】让H5页面适配移动设备全家 - 前端篇 - PPT

    7月份在部门内给设计中心的同事们带来<让H5页面适配移动设备全家 - 设计师篇 - PPT>的分享,在视觉和交互稿上提出页面适配的建议及提升页面体验的好处,促进前端和设计双方更好的合作,同 ...

  9. android-plugmgr源代码分析

    android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...

随机推荐

  1. 在iOS开发中,我们会遇到十六进制和字符串之间相互转换,话不多说,直接上代码:

    //将十六进制的字符串转换成NSString则可使用如下方式: + (NSString *)convertHexStrToString:(NSString *)str { if (!str || [s ...

  2. javascript必须知道的知识要点(一)

    该文章不详细叙述各知识要点的具体内容,仅把要点列出来,供大家学习的时候参照,或者检测自己是否熟练掌握了javascript,清楚各个部分的内容. 语句 注释 输出 字面量 变量 数据类型 typeof ...

  3. BZOJ 4259 FFT

    思路: 为什么好多字符串的题都可以用FFT啊.... 我们其实是要判断$\Sigma (a[i]-b[i])^2*a[i]*b[i]==0$ 那就把a串翻转过来 把 上式展开 大力做几遍FFT就好啦~ ...

  4. POJ 2752 KMP中next数组的应用

    题意: 让你从小到大输出给的字符串中既是前缀又是后缀的子串的长度. 思路: 先要了解这个东西: KMP中next数组表示的含义:记录着字符串匹配过程中失配情况下可以向前多跳几个字符,它描述的也是子串的 ...

  5. 让break跳出外层循环的方法

    demo //在里层循环里面,想办法让外层循环的条件不成立,就可以控制外层循环结束. for(var i = 0 ; i < 10; i++){ alert(i) for(var j = 0 ; ...

  6. MobX入门

    MobX入门 本文尝试解释MobX是如何运作的.我们将用MobX创建一个小案例.如果你正在找靠谱的MobX文档,可以去看官方文档. 什么是MobX 官方文档的解释:简洁,易扩展的状态管理.简单来说,M ...

  7. css3实现动画滚动条

    先给大家一张效果图,看似简单,其实实现起来....那也是非常简单的~简单又实用 黑框里面的字体会自动滚动,形成滚动条,可以用于展示和提示,首先我们先要在body里面写上自己想要的文字,比如我想写:感觉 ...

  8. 【WebApp】IOS兼容问题

    最近,主要是基于Framework7 + RequireJs框架,移动端团队开发Webview框架,内嵌Web的模式进行WebApp开发. 在开发过程中不得不遇到一些 兼容性问题. 1.现象:IOS环 ...

  9. 如何处理CSS3属性前缀(转载)总结

    今天闲来无聊,重新来说说CSS3前缀的问题.在春节前和@一丝姐姐说起Sass中有关于gradient的mixins.姐姐说: 为什么还要用mixin呢?为什么不使用Autoprefixer?使用Aut ...

  10. zabbix监控超详细搭建过程(转)

    监控及zabbix 目录: 1       监控分类... 1 1.1        硬件监控... 1 1.2        系统监控... 2 1.3        网络监控... 3 1.4   ...