gcc源码阅读--gimple 介绍

(二) GNU GCC 编译器及其编译流程概述_gcc 的编译过程分为那几个阶段,每个阶段都做了些什么 (2) 这三种中间语言都是与前端语言无关的,其中 GENERIC 树是将前端语言直接翻译过来后形成的中间树,而GIMPLE 则是简化了的 GENERIC 树的集合,在将 GENERIC 转化为 GIMPLE 的过程中将 GENERIC 树中比较复杂的语句都转化为了多个比较简单的语句,其中的计算结果用临时变量来保存RTL是通过低级GIMPLE转化而来的,将低级GIMPLE 树转化为 RTL 树的主要目的是进行优化。RTL 是一种接近机器指令的语言,既有指令序列组成的内部形式,又有机器描述和调试信息组成的文本形式。 阅读详情

那么,GENERIC是什么呢?简单的讲,GENERIC就是规范的AST。一般来说,如
果一种前端语言的AST树均可以使用gcc/tree.h中所表示的树节点表示,那么该AST 就是
GENERIC AST。可以看出,GENERIC是一种规范的AST表示形式,引入GENERIC的目
的就是力求寻找一种与前端语言无关的AST统一表示,便于对各种语言的AST进行一种通
用的处理而已。从这个角度上,本书把AST和GENERIC合起来称为AST/GENERIC。实际
上,在GCC中,很多语言的前端处理并不包含AST到GENERIC的转换,而是直接将AST
转换成与语言无关的另外一种中间表示,即GIMPLE。
为了处理不同的前端语言及其相应的AST/GENERIC,GCC引入了一种与前端语言无关
的中间表示一GIMPLE。每种语言的前端处理系统都应该将该语言对应的AST/GENERIC
转换成GIMPLE,从而便于GCC在GIMPLE的基础上进行统一的中间处理和系统优化。
GIMPLE 这个词语很奇怪,笔者认为GIMPLE可以理解为GNU SIMPLE或者GCC SIMPLE。
GIMPLE是一种三地址码的中间表示形式,是McGill University McCAT编译工程中SIMPLE
中间语言的一种变化形式。GIMPLE与SIMPLE非常接近,但二者又有所不同,例如 SIMPLE
不支持 goto 语句,但GIMPLE 支持。

GIMPLE 中间形式由AST/GENERIC表达式转换而来,它们之间最主要的区别包括:
(1)AST形式与前端的编程语言是相关的,每种前端语言词法语法分析后形成的
AST是异构的,缺乏一种规范的、适合于各种语言的通用表示方法。而GIMPLE 中间表
示形式则是语言无关的,任何语言的前端处理均应按照GIMPLE的规范,将该语言前端
生成的AST/GENERIC形式转换成GIMPLE形式,从而提供给GCC进行后续语言无关的
处理。
(2)AST/GENERIC是树形结构,而GIMPLE形式从本质上讲是线性的中间表示序列,
可以更方便、更有效地进行后续的编译优化。需要注意的

gcc源码分析与应用系列教程(1) 因为工作的原因,接触到gcc源码,经过两个多月的分析和学习之后,对它有了一个初步的认识,打算写一篇文章来分享下自己的工作经验。 本系列采用gcc-9.2.0的源码,源码阅读工具为vscode,下面我们来看具体的内容。 gcc编译器分为三部分,分别是前端,中端,和后端。 前端主要实现词法分析,语法分析,语义分析等相关的功能,并将其转换为一种中间语言,我们把这种中间语言,我们把它称之为gimple。 ... 阅读详情

相关推荐

gcc 源码阅读---编译器后端实现的关键数据结构

摘要: 本文介绍了RTL(Register Transfer Language)的核心数据结构及其在编译器中的关键作用。RTL是GCC编译器中间表示的重要组成部分,用于描述机器指令和操作。文章详细解析了rtx_def结构体,包括其类型分类(RTX_COMPARE、RTX_COMM_ARITH等)、标志位(jump、call、volatil等)以及联合体字段(如insn_uid、symbol_ref_flags)。此外,还说明了从GIMPLE到RTL的转换过程,以及最终生成汇编代码的关键数据结构insn_da

999

GCC是什么?

GCC(GNU Compiler Collection)是一个模块化设计的开源编译器系统,采用"前端-中端-后端"架构支持多种编程语言和目标平台。其编译流程包括预处理、中间代码生成(GIMPLE/RTL)、优化和代码生成等阶段,提供向量化、LTO、PGO等高级优化功能。GCC支持交叉编译、插件扩展,并包含丰富的诊断和安全特性,广泛应用于嵌入式开发、高性能计算等领域。作为自由软件运动的重要成果,GCC凭借其强大的优化能力和广泛的硬件支持,在编译器领域保持重要地位。

guigenyi的专栏 1817

Linux GCC-4.4.7编译器源码解析与实战学习

GCC(GNU Compiler Collection)是GNU项目的核心组件之一,最初由Richard Stallman于1987年发起,旨在提供一个自由、开放、支持多种编程语言和目标平台的编译器套件。它不仅支持C和C++,还涵盖Fortran、Java、Objective-C等多种语言。GCC的开源特性使其在操作系统开发、嵌入式系统、高性能计算等领域广泛应用。return t;这段代码构建了一个函数类型节点,用于表示函数的返回类型和参数类型列表。make_node:创建一个树节点;

weixin_33431149的博客 688

GCC 9.3.0源码编译实战:从解压到安装避坑指南

编译工具链是软件工程的基础设施,而GCC作为最核心的开源编译器集合,其源码编译与安装是许多开发者在Linux环境下绕不开的实操场景。当系统仓库自带的GCC版本无法满足项目要求时,通过源码包自行构建指定版本成为必然选择。本文从tar.gz源码包的解压与校验讲起,阐述configure配置、依赖三件套(GMP/MPFR/MPC)及make install的完整流程,并结合GIMPLE中间表示与运行时库揭示编译器背后的组成原理。掌握这些方法,不仅能完成GCC 9.3.0的源码编译与版本切换,还能在遭遇undefi

weixin_42526166的博客 218

GCC 14.1源码编译实战:从解压到C++23支持全链路指南

GCC 是 GNU 编译器集合,本质是可定制的底层工具链而非即装即用软件。其编译原理涉及前端语法解析、中端 GIMPLE 优化、后端指令生成及运行时库(libgcc/libstdc++)协同;技术价值在于精准控制语言支持、交叉编译能力与深度性能调优,广泛应用于信创系统(如银河麒麟Kylin V10)、国产芯片(龙芯/申威)嵌入式开发及 C++23 新特性验证场景。本文聚焦 GCC 14.1.0 源码级构建,详解 download_prerequisites 依赖准备、--enable-languages 参

weixin_26749245的博客 295

GCC 9.3.0 源码构建全指南:依赖闭环、离线部署与嵌入式适配

GCC 是 GNU 编译器集合,其源码构建远非简单解压编译,而涉及严格的依赖管理、静态链接约束与目标平台适配。理解 GMP/MPFR/MPC 的版本锁死与 PIC 编译要求,是突破 configure 失败的关键;掌握 DESTDIR 机制和 --program-suffix 参数,则是实现 linux离线安装gcc 和多版本共存的工程基础。该过程不仅支撑 RISC-V、Corex R5F 等嵌入式功能安全认证场景,也服务于 GLIBC 兼容性复现与编译原理深度学习。本文围绕 gcc-9.3.0.tar.g

weixin_42527654的博客 203

GCC 9.3.0源码编译安装全指南:从解压到动态库配置

在Linux开发中,构建一套可用的编译器工具链是工程实践的起点。GCC作为最核心的开源编译器,其源码编译安装涉及依赖库准备、configure参数配置、make编译优化以及动态库和PATH环境变量的协同调整。理解configure的检查机制与libstdc++动态库的加载原理,能有效避免“编译成功但运行报错”的典型问题。无论是CentOS还是Ubuntu,掌握从源码构建GCC的方法,都能让你在需要特定版本工具链时游刃有余。本文以gcc-9.3.0为例,完整梳理从tar.gz解压到验证C++17程序运行的每一

weixin_28832121的博客 161

GCC 13.2.0源码编译指南:从configure到交叉编译与调试

编译器工具链是软件开发的基础设施,其源码构建涉及前端、后端和运行时库的协同。通过configure脚本配置参数,可定制语言支持和目标架构,实现交叉编译或源码级调试。掌握GCC源码编译能提升工程能力,应用于嵌入式开发、金融计算等场景。本文以gcc-13.2.0.tar.gz为例,详解从依赖检查到make install的完整流程,并分享避坑经验。

weixin_42557803的博客 306

Windows 11 RDP Wrapper 配置教程与常见问题解决方法

解锁家庭版RDP主机功能(Windows 11家庭版原生不支持作为RDP服务器)突破单用户连接限制,实现多用户同时远程登录(类似服务器版功能)它不修改系统核心文件,通过注入方式工作,相对安全可靠。RDP Wrapper是Windows 11家庭版用户启用远程桌面、突破单用户限制的高效工具。遵循本文步骤可快速完成配置,遇到问题时按常见问题排查方案逐一解决,多数问题可通过更新配置文件或重启服务解决。若长期使用,建议关注官方GitHub仓库的更新,确保兼容性和安全性。

weixin_41521681的博客 1356

突发E层(Es层):短波通信中的“意外惊喜”与“隐形杀手”全解析

本文深入解析了突发E层(Es层)在短波通信中的双重作用,既可能带来超远距离通信的“意外惊喜”,也可能成为通信链路的“隐形杀手”。通过分析Es层的形成机制、时空分布规律及实战应用技巧,帮助通信爱好者与专业人员更好地利用或应对这一电离层现象,提升短波通信的可靠性与效率。

weixin_30443813的博客 822

RocketMQ5.3.0-control-多 Master 多 Salve-异步复制-集群搭建

RocketMQ5.3.0-control-多 Master 多 Salve-异步复制-集群搭建(详细文档)

m0_52369979的博客 729

别再搞混了!MATLAB通信仿真中EbN0转SNR的保姆级公式推导与避坑指南

本文深入解析MATLAB通信仿真中EbN0与SNR转换的核心公式,揭示数字仿真与理论系统的关键差异。通过真实案例展示错误参数设置导致的隐蔽问题,并提供完整的参数自查清单和正确实现代码,帮助工程师和学生避免常见错误,确保仿真结果准确可靠。

weixin_28746223的博客 348

UE4-(蓝图)第五十五课图片九宫格拉伸的使用

一、为什么使用九宫格拉伸 在UI布局的时候,有时候使用的图片与我们要制作的UI大小有差距,如果图片是普通方式直接拉伸很可能造成图片四个角上的效果与原图片差距太大甚至是变形,这时候使用九宫格模式拉伸,可以保持图片四个角上的样式不发生改变,只对中间区域拉伸。 原始 正常拉伸: 九宫格拉伸: 二、图片参数设置 1.新建一个UI 控件蓝图,在CanvasPanel下拖入一个Image,选择一张...

Stone的博客 7885

【Docker】掌握 Docker魔法:Windows 11 平台上的完美容器部署终极指南

【Docker】掌握 Docker魔法:Windows 11 平台上的完美容器部署终极指南 一文搞懂什么是 Docker?分析容器的工作原理、容器的架构、Docker的优势、使用 Docker的原因。 全程手把手教你Docker的安装与使用,配置阿里云镜像加速、容器常用命令!

寸铁的博客 10万+

RT-Thread Studio 使用笔记(七)| 配合STM32CubeMX添加裸机驱动(以ADC为例)

1. 配置STM32CubeMX 2. 复制stm32xxxx_hal_msp.c文件 将 CubeMx 生成的代码 stm32f7xx_hal_msp.c 函数复制到 RT-Thread Studio 生成的工程中,并参与工程编译: 由于我们并没有使用 CubeMx 生成的工程,所以这里需要将 stm32f7xx_hal_msp.c 文件中 #include “main.h” 替换为 #i...

Mculover666的博客(嵌入式) 9624

超详细!Linux 服务器 6 大核心性能测试(附自动脚本 + 结果分析秘籍)---Linux 服务器性能测试文档

本文档旨在提供 Linux 服务器的 CPU、内存和磁盘性能测试方案,包括详细的测试大纲、操作步骤以及一键化测试脚本,帮助管理员快速评估服务器性能状况。通过以上测试方案,可以全面评估 Linux 服务器的 CPU、内存和磁盘性能,为系统优化、容量规划和问题排查提供重要参考依据。使用 sysbench 进行 CPU 基准测试。使用 sysbench 测试内存读写性能。使用 fio 工具进行更全面的磁盘测试。使用 dd 命令测试磁盘顺序读写性能。使用 dd 命令测试内存读写速度。记录磁盘 IO 性能。

jundao1997的专栏 380

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: gcc 源码阅读---语法树
下一篇: gcc 源码分析--gimple 关键数据结构
GoldKey
博客等级 码龄25年 82粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoldKey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值