gcc源码分析(AST抽象语法树)
文章目录
- 三、AST相关
- 1、AST(抽象语法树)
- 1.1 树结点的声明
- 1.2 树结点的结构
- 1.2.1 tree_node联合体
- 1.2.2 tree_base结构体
- 1.2.3 tree_common结构体
- 1.2.4 常量结构体
- 1.2.5 **标识符节点**
- 2、符号绑定,作用域与block树节点
- 2.1 lang_identifier结构体
- 2.2 c_binding结构体
- 2.3 scope与作用域
- 3、 作用域
- 3.1 作用域的初始化
- 3.2 push_scope
- 3.3 bind
- 3.4 pop_scope
三、AST相关
抽象语法树是编译系统中最常见的一种树形的中间表示形式,用来对前端语言的源代码进行规范的抽象表示。不同的高级程序设计语言通过其相应的词法/语法分析过程,会得到不同形式的抽象语法树,这些抽象语法树与编程语言的特征紧密相关,一般都包含了部分语言相关的AST节点表示。从这个角度上来讲,AST是编程语言相关的, C语言的源代码经过C语言特定的词法/语法分析过程,将生成C语言的AST。
1、AST(抽象语法树)
在gcc中GENERIC是指规范的AST,,即GENERIC形式的AST均能在gcc/tree. h中所表示的树节点表示。引入GENERIC的目的是寻找一种与前端语言无关的AST统一表示,是一种通用的处理tree_identifier而已。AST这种树形的中间表示,主要包括:树节点的种类及其语义、树节点的存储、AST操作以及AST的生成过程等。
1.1 树结点的声明
树节点声明中最基本的4个概念:
- 标识(TREE_CODE):DEFTREECODE宏定义中的SYM参数,描述了该节点代表的是一个什么样的节点。
- 名称(NAME):DEFTREECODE宏定义中的NAME参数,表示该树节点的名称,使用字符串来描述,主要用来进行AST中间结果的显示,方便用户直观地了解该树节点的信息。
- 类型(TREE_CODE CLASS, TCC):DEFTREECODE宏定义中的TYPE参数,描述了该树节点的TREE_CODE所属的类型。
- 长度:DEFTREECODE宏定义中的LEN参数,用来描述该树节点所包含的操作数的数目。
用下面这种宏去定义:
DEFTREECODE (ERROR_MARK, "error_mark", tcc_exceptional, 0)
树节点的类型主要包括了常量节点、类型节点、声明节点、比较表达式节点、单目运算表达式节点、双目运算表达式节点等。
1.2 树结点的结构
1.2.1 tree_node联合体
tree_node联合体定义了全部树结点结构体。
## gcc/tree-core.h
union GTY ((ptr_alias (union lang_tree_node),desc ("tree_node_structure (&%h)"), variable_size)) tree_node {struct tree_base GTY ((tag ("TS_BASE"))) base;struct tree_typed GTY ((tag ("TS_TYPED"))) typed;
.......
}
1.2.2 tree_base结构体
其中最关键的是tree_base结构体:该结构体定义了所有树节点最基本的属性,是构成其他树节点存储结构的基类(类似于面向对象的概念,这个思想在gcc中大量使用)。其主要包括了code字段,用来存储TREE_CODE,并标识该树节点的语义,其取值在枚举类型enum tree_code中取值。tree_base结构体中还定义了大量的标志字段,分别描述该树节点的某些语法、语义的信息,例如常量标志、无符号标志、只读标志等。
struct GTY(()) tree_base {ENUM_BITFIELD(tree_code) code : 16;unsigned side_effects_flag : 1;unsigned constant_flag : 1;unsigned addressable_flag : 1;unsigned volatile_flag : 1;unsigned readonly_flag : 1;unsigned asm_written_flag: 1;unsigned nowarning_flag : 1;unsigned visited : 1;unsigned used_flag : 1;unsigned nothrow_flag : 1;unsigned static_flag : 1;unsigned public_flag : 1;unsigned private_flag : 1;unsigned protected_flag : 1;unsigned deprecated_flag : 1;unsigned default_def_flag : 1;.......
}
1.2.3 tree_common结构体
tree chain字段可以将多个有一定关系的树节点连接成一个链表。tree type字段的值在不同的树节点中有不同的含义。例如,在所有表达式节点中,type字段指向表达式的类型节点;在指针类型节点(其TREE_CODE为POINTER_TYPE)中,此字段指向指针所指向的类型节点;在数组引用节点(其TREE_CODE为ARRAY_TYPE)中,此字段指向数组元素的类型节点;在TREE_CODE为VECTOR_TYPE的树节点中,该字段指向向量元素的类型节点。通常使用TREE_TYPE(node)宏来访问node节点的type字段。
struct GTY(()) tree_typed {struct tree_base base;tree type;
};struct GTY(()) tree_common {struct tree_typed typed;tree chain;/**将多个有一定关系的树节点连接成一个链表/
};
1.2.4 常量结构体
gcc中定义了struct tree_int_cst、struct tree_real_cst、struct tree_fixed_cst、struct tree_vector、struct tree_string、struct tree_complex等几种结构体,分别存储整型常量、实数常量、定点数常量、向量常量、字符串常量以及复数常量。
//1、整型常量
struct GTY(()) tree_int_cst {struct tree_typed typed;HOST_WIDE_INT val[1];
};
//2、实数常量
/*结构体struct tree_real_cst用来存储实数常量*/
struct GTY(()) tree_real_cst {struct tree_typed typed;struct real_value * real_cst_ptr;
};
//3、定点数常量
struct GTY(()) tree_fixed_cst {struct tree_typed typed;struct fixed_value * fixed_cst_ptr;
};
/*
常用的宏定义:#define TREE_FIXED_CST_PTR(NODE) (FIXED_CST_CHECK (NODE)->fixed_cst.fixed_cst_ptr)#define TREE_FIXED_CST(NODE) (*TREE_FIXED_CST_PTR (NODE))
*/
//4、字符串常量
/*字符串使用struct tree_string结构体来存储*/
struct GTY(()) tree_string {struct tree_typed typed;int length;char str[1];
};
/*这部分可以分析内存信息:字符串常量节点所描述的字符串常量就存储在struct tree_string中以str成员指向的地址空间中*/
//5.复数常量
struct GTY(()) tree_complex {struct tree_typed typed;tree real;tree imag;
};
/*
下面两个宏分别用来访问该实数常量的实部(real字段)和虚部(imag字段),这两个字段均为指向树节点的指针。#define TREE_REALPART(NODE) (COMPLEX_CST_CHECK (NODE)->complex.real)#define TREE_IMAGPART(NODE) (COMPLEX_CST_CHECK (NODE)->complex.imag)
*/
//6、向量常量
struct GTY(()) tree_vector {struct tree_typed typed;tree GTY ((length ("TYPE_VECTOR_SUBPARTS (TREE_TYPE ((tree)&%h))"))) elts[1]; //用以获取节点的各个向量
};
1.2.5 标识符节点
标识符节点使用struct tree_identifier结构体存储,定义如下:
struct GTY(()) tree_identifier {struct tree_common common;/*struct tree_common common结构体字段描述了该树节点的基本属性。*/struct ht_identifier id;
};struct GTY(()) ht_identifier {const unsigned char *str;unsigned int len;unsigned int hash_value;
};
上述的struct ht_identifier在libcpp/include/symtab.h中予以定义,该结构体中的str和len字段分别描述该标识符对应的字符串名称及其长度,hash_value是该标识符名称的一个hash值,该hash值在标识符的查找、比较等操作中使用。
注:AST是源代码在GCC系统中的一种中间表示形式,该中间形式是通过GCC前端的词法/语法分析所构造的。
其他的树结点的结构不做详细介绍,有兴趣可自行查看。
2、符号绑定,作用域与block树节点
2.1 lang_identifier结构体
在前面已知gcc中通过一个tree_identifier结构体来代表一个标识符的树节点,但实际分配时会为标识符分配一个扩展的lang_identifier节点,其结构如下:
struct GTY(()) lang_identifier {struct
相关文章:
gcc源码分析(AST抽象语法树)
文章目录 三、AST相关1、AST(抽象语法树)1.1 树结点的声明1.2 树结点的结构1.2.1 tree_node联合体1.2.2 tree_base结构体1.2.3 tree_common结构体1.2.4 常量结构体1.2.5 **标识符节点**2、符号绑定,作用域与block树节点2.1 lang_identifier结构体2.2 c_binding结构体2.3 scop…...

ES基础概念
本文不介绍如何使用ES(使用ES见:) 1.ES生态圈 ES: Logstash:数据处理服务程序,解析转换加工数据; Kibana:数据展示、集群管理,数据可视化、ES管理与监控、报表等…...
断更是我的错
打算在暑假每天两个文章,大概是6月20多号开始吧。...
红队攻防渗透技术实战流程:云安全之云原生安全:云堡垒机
红队云攻防实战 1. 云原生安全-防护设备-云堡垒机1. 云原生安全-防护设备-云堡垒机 堡垒机攻防:(意义) https://mp.weixin.qq.com/s/-WcgyVoTCZuPamVtI5MrJw 堡垒机漏洞:(已知)https://avd.aliyun.com/search?q=%E5%A0%A1%E5%9E%92%E6%9C%BA 云堡垒机:(云攻防) http…...
Down with typename
1. 隐式类型名的详情 C20 之前,typename 在一些其他情况下是不必要的: • 指定继承类的基类型时 • 在构造函数中将初始值传递给基类时 • 在类声明中使用类型成员时 #include <iostream> struct Impl {Impl(){ std::cout << "Impl ctor" &…...
CSS3背景与渐变
背景与渐变 background-size background-size 属性用于设置背景图像的尺寸。您可以指定绝对或相对单位,或者使用关键词来控制背景图像在元素背景区域中的大小。 .element {background-size: [length | percentage | cover | contain] | [length | percentage] [length | per…...
线性表——链式存储
单链表(有头结点) #include<stdio.h> #include<stdlib.h> //定义 typedef struct LNode{int data; //数据域 struct LNode *next; //指针域指向下一个结点,所以是 struct LNode类型 }LNode,*LinkList; //…...

VUE3和VUE2
VUE3和VUE2 上一篇文章中,我们对VUE3进行了一个初步的认识了解,本篇文章我们来进一步学习一下,顺便看一下VUE2的写法VUE3是否能做到兼容😀。 一、新建组件 我们在components中新建一个组件,名称为Peron,…...

mysql5.5版本安装过程
mysql是关系型数据库的管理系统 将安装包放在 c盘根目录 名称为mysql 在该路径下cmd进入命令执行窗口 出现此页面说明安装成功 需要修改配置文件内容 将my-medium.ini 复制粘贴并改名为 my.ini 并添加如下内容 改好之后在mysql目录下cmd进入命令执行窗口 切换到cd bin …...

工厂生产管理系统
为应对一些国内验厂,如大疆等,他们需要客户有自己的生产管理系统的,但实际很多公司是没有引入ERP这类的系统的,从而想开发一套简单的生产管理系统。 参考了网上一个比较古老的StorageMange项目,此项目用到DevExpress的…...

Atlas 200I DK A2安装MindSpore Ascend版本
一、参考资料 mindspore快速安装 二、重要说明 经过博主多次尝试多个版本,Atlas 200I DK A2无法安装MindSpore Ascend版本。 也有其他博主测试,也未尝成功,例如:【MindSpore易点通漫游世界】在Atlas 200I DK A2 (CANN6.2.RC2)…...
Go 生成UUID唯一标识
什么是UUID 通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准,亦为自由软件基金会组织在分散式计算环境领域的一部份。 UUID的目的,是让分散式系统中的所有元素&#x…...

【知识蒸馏】deeplabv3 logit-based 知识蒸馏实战,对剪枝的模型进行蒸馏训练
本文将对【模型剪枝】基于DepGraph(依赖图)完成复杂模型的一键剪枝 文章中剪枝的模型进行蒸馏训练 一、逻辑蒸馏步骤 加载教师模型定义蒸馏loss计算蒸馏loss正常训练 二、代码 1、加载教师模型 教师模型使用未进行剪枝,并且已经训练好的原始模型。 teacher_mod…...

02.爬虫---HTTP基本原理
02.HTTP基本原理 1.URI 和 URL 的区别2.HTTP 和 HTTPS 的区别3.请求过程 1.URI 和 URL 的区别 URL(Uniform Resource Locator)即-统一资源定位符 URL是用来定位和访问互联网上资源的独特标识,它包括了资源的位置(如IP地址或域名&a…...

HTTP响应的基本概念
目录 HTTP响应中的一些信息 HTTPS HTTP响应中的一些信息 状态码:描述了这次HTTP请求是否成功,以及失败的原因。 1)200 ---OK 表示这次访问成功了。 2)404 ---Not Found 表示客户端请求的资源在服务器这边不存在。 3&a…...
链栈的存储
单向链表在栈中的存储 typedef struct StackNode {SElemType data;struct StackNode* next; }StackNode, *LinkStack; LinkStack S; //链栈初始化 void InitStack(LinkStack& S) {S NULL;return OK; } //判断链栈是否为空 Status StackEmpty(LinkStack S) {if (S NU…...
常见网络协议及端口号
https://www.cnblogs.com/Snail-yellow/p/17722411.html 常见的网络协议-腾讯云开发者社区-腾讯云 常见的网络协议知识整理_五种常用的网络协议-CSDN博客 端口 协议 常见的网络协议_计算机网络协议有哪些csdn-CSDN博客 协议 常见的网络协议知…...

几张自己绘制的UML图
全部来源于公司项目,使用建模工具 Enterprise Architect。自己做的其余文档(含绘图),因保密协议不便于公开。...

[读论文]精读Self-Attentive Sequential Recommendation
论文链接:https://arxiv.org/abs/1808.09781 其他解读文章:https://mp.weixin.qq.com/s/cRQi3FBi9OMdO7imK2Y4Ew 摘要 顺序动态是许多现代推荐系统的一个关键特征,这些系统试图根据用户最近执行的操作来捕获用户活动的“上下文”。为了捕捉…...

HTML静态网页成品作业(HTML+CSS)——动漫海绵宝宝介绍网页(5个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...