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

GCC 和 LLVM 各自的优缺点 GCC与LLVM编译器对比 GCC和LLVM是现代编译技术的两大主流框架。GCC作为历史悠久的编译器,在平台支持广泛性、稳定性和标准兼容性方面表现突出,特别适合嵌入式系统和专有软件开发。而LLVM凭借模块化架构、活跃的开源生态和卓越的工具链集成,成为新语言开发和现代IDE的首选。两者在主流平台的代码生成质量已相当接近,选择取决于具体需求:GCC更适合传统关键系统,LLVM则在新兴技术领域占据优势。这场技术竞争最终推动了整个编译器领域的进步。 阅读详情

rtx的指令:参看rtl.def

DEF_RTL_EXPR(UNKNOWN, "UnKnown", "*", RTX_EXTRA)
DEF_RTL_EXPR(VALUE, "value", "0", RTX_OBJ)
DEF_RTL_EXPR(DEBUG_EXPR, "debug_expr", "0", RTX_OBJ)
DEF_RTL_EXPR(EXPR_LIST, "expr_list", "ee", RTX_EXTRA)
DEF_RTL_EXPR(INSN_LIST, "insn_list", "ue", RTX_EXTRA)
DEF_RTL_EXPR(INT_LIST, "int_list", "ie", RTX_EXTRA)
DEF_RTL_EXPR(SEQUENCE, "sequence", "E", RTX_EXTRA)
DEF_RTL_EXPR(ADDRESS, "address", "i", RTX_EXTRA)
DEF_RTL_EXPR(DEBUG_INSN, "debug_insn", "uuBeLie", RTX_INSN)
DEF_RTL_EXPR(INSN, "insn", "uuBeLie", RTX_INSN)
DEF_RTL_EXPR(JUMP_INSN, "jump_insn", "uuBeLie0", RTX_INSN)
DEF_RTL_EXPR(CALL_INSN, "call_insn", "uuBeLiee", RTX_INSN)
DEF_RTL_EXPR(JUMP_TABLE_DATA, "jump_table_data", "uuBe0000", RTX_INSN)
DEF_RTL_EXPR(BARRIER, "barrier", "uu00000", RTX_EXTRA)
DEF_RTL_EXPR(CODE_LABEL, "code_label", "uuB00is", RTX_EXTRA)
DEF_RTL_EXPR(NOTE, "note", "uuB0ni", RTX_EXTRA)
DEF_RTL_EXPR(COND_EXEC, "cond_exec", "ee", RTX_EXTRA)
DEF_RTL_EXPR(PARALLEL, "parallel", "E", RTX_EXTRA)
DEF_RTL_EXPR(ASM_INPUT, "asm_input", "sL", RTX_EXTRA)
DEF_RTL_EXPR(ASM_OPERANDS, "asm_operands", "ssiEEEL", RTX_EXTRA)
DEF_RTL_EXPR(UNSPEC, "unspec", "Ei", RTX_EXTRA)
DEF_RTL_EXPR(UNSPEC_VOLATILE, "unspec_volatile", "Ei", RTX_EXTRA)
DEF_RTL_EXPR(ADDR_VEC, "addr_vec", "E", RTX_EXTRA)
DEF_RTL_EXPR(ADDR_DIFF_VEC, "addr_diff_vec", "eEee0", RTX_EXTRA)
DEF_RTL_EXPR(PREFETCH, "prefetch", "eee", RTX_EXTRA)
DEF_RTL_EXPR(SET, "set", "ee", RTX_EXTRA)
DEF_RTL_EXPR(USE, "use", "e", RTX_EXTRA)
DEF_RTL_EXPR(CLOBBER, "clobber", "e", RTX_EXTRA)
DEF_RTL_EXPR(CALL, "call", "ee", RTX_EXTRA)
DEF_RTL_EXPR(RETURN, "return", "", RTX_EXTRA)
DEF_RTL_EXPR(SIMPLE_RETURN, "simple_return", "", RTX_EXTRA)
DEF_RTL_EXPR(EH_RETURN, "eh_return", "", RTX_EXTRA)
DEF_RTL_EXPR(TRAP_IF, "trap_if", "ee", RTX_EXTRA)
DEF_RTL_EXPR(CONST_INT, "const_int", "w", RTX_CONST_OBJ)
DEF_RTL_EXPR(CONST_WIDE_INT, "const_wide_int", "", RTX_CONST_OBJ)
DEF_RTL_EXPR(CONST_POLY_INT, "const_poly_int", "", RTX_CONST_OBJ)
DEF_RTL_EXPR(CONST_FIXED, "const_fixed", "www", RTX_CONST_OBJ)
DEF_RTL_EXPR(CONST_DOUBLE, "const_double", CONST_DOUBLE_FORMAT, RTX_CONST_OBJ)
DEF_RTL_EXPR(CONST_VECTOR, "const_vector", "E", RTX_CONST_OBJ)
DEF_RTL_EXPR(CONST_STRING, "const_string", "s", RTX_OBJ)
DEF_RTL_EXPR(CONST, "const", "e", RTX_CONST_OBJ)
DEF_RTL_EXPR(PC, "pc", "", RTX_OBJ)
DEF_RTL_EXPR(REG, "reg", "r", RTX_OBJ)
DEF_RTL_EXPR(SCRATCH, "scratch", "", RTX_OBJ)
DEF_RTL_EXPR(SUBREG, "subreg", "ep", RTX_EXTRA)
DEF_RTL_EXPR(STRICT_LOW_PART, "strict_low_part", "e", RTX_EXTRA)
DEF_RTL_EXPR(CONCAT, "concat", "ee", RTX_OBJ)
DEF_RTL_EXPR(CONCATN, "concatn", "E", RTX_OBJ)
DEF_RTL_EXPR(MEM, "mem", "e0", RTX_OBJ)
DEF_RTL_EXPR(LABEL_REF, "label_ref", "u", RTX_CONST_OBJ)
DEF_RTL_EXPR(SYMBOL_REF, "symbol_ref", "s0", RTX_CONST_OBJ)
DEF_RTL_EXPR(IF_THEN_ELSE, "if_then_else", "eee", RTX_TERNARY)
DEF_RTL_EXPR(COMPARE, "compare", "ee", RTX_BIN_ARITH)
DEF_RTL_EXPR(PLUS, "plus", "ee", RTX_COMM_ARITH)
DEF_RTL_EXPR(MINUS, "minus", "ee", RTX_BIN_ARITH)
DEF_RTL_EXPR(NEG, "neg", "e", RTX_UNARY)
DEF_RTL_EXPR(MULT, "mult", "ee", RTX_COMM_ARITH)
DEF_RTL_EXPR(SS_MULT, "ss_mult", "ee", RTX_COMM_ARITH)
DEF_RTL_EXPR(US_MULT, "us_mult", "ee", RTX_COMM_ARITH)
DEF_RTL_EXPR(SMUL_HIGHPART, "smul_highpart", "ee", RTX_COMM_ARITH)
DEF_RTL_EXPR(UMUL_HIGHPART, "umul_highpart", "ee", RTX_COMM_ARITH)
DEF_RTL_EXPR(DIV, "div", "ee", RTX_BIN_ARITH)
DEF_RTL_EXPR(SS_DIV, "ss_div", "ee", RTX_BIN_ARITH)
DEF_RTL_EXPR(US_DIV, "us_div", "ee", RTX_BIN_ARITH)
DEF_RTL_EXPR(MOD, "mod", "ee", RTX_BIN_ARITH)
DEF_RTL_EXPR(UDIV, "udiv", "ee", RTX_BIN_ARITH)
DEF_RTL_EXPR(UMOD, "umod", "ee", RTX_BIN_ARITH)
DEF_RTL_EXPR(AND, "and", "ee", RTX_COMM_ARITH)
DEF_RTL_EXPR(IOR, "ior", "ee", RTX_COMM_ARITH)
DEF_RTL_EXPR(XOR, "xor", "ee", RTX_COMM_ARITH)
DEF_RTL_EXPR(NOT, "not", "e", RTX_UNARY)
DEF_RTL_EXPR(ASHIFT, "ashift", "ee", RTX_BIN_ARITH) /* shift left */
DEF_RTL_EXPR(ROTATE, "rotate", "ee", RTX_BIN_ARITH) /* rotate left */
DEF_RTL_EXPR(ASHIFTRT, "ashiftrt", "ee", RTX_BIN_ARITH) /* arithmetic shift right */
DEF_RTL_EXPR(LSHIFTRT, "lshiftrt", "ee", RTX_BIN_ARITH) /* logical shift right */
DEF_RTL_EXPR(ROTATERT, "rotatert", "ee", RTX_BIN_ARITH) /* rotate right */
DEF_RTL_EXPR(SMIN, "smin", "ee", RTX_COMM_ARITH)
DEF_RTL_EXPR(SMAX, "smax", "ee", RTX_COMM_ARITH)
DEF_RTL_EXPR(UMIN, "umin", "ee", RTX_COMM_ARITH)

从零解析C语言编译器:源码结构与核心模块实现详解 编译器是连接高级编程语言与计算机硬件的关键系统软件,其核心原理是将源代码转换为机器可执行的目标代码。这一过程通常遵循经典的编译流程,包括词法分析、语法分析、语义分析、中间代码生成、优化和目标代码生成等阶段。理解编译器的实现,对于深入掌握程序运行机制、提升系统编程能力以及参与大型编译器项目开发具有重要价值。在工程实践中,通过剖析一个中等规模、功能完整的教学型编译器源码,可以将抽象的编译原理概念(如有限自动机、递归下降解析、符号表管理)与具体的C语言代码实现一一对应。本文聚焦于一个用C语言实现的简单C编译器项目 阅读详情

相关推荐

深入GCC源码:解析C++26模块与反射机制的实现原理

C++模块化编程是现代C++演进的核心方向,旨在通过模块(Modules)机制替代传统的头文件包含(#include),从根本上解决编译速度慢、宏污染和接口隔离等问题。其原理在于编译器将模块接口序列化为二进制模块接口(BMI)文件,实现一次解析、多次复用,大幅提升构建效率。这一技术价值不仅体现在编译加速上,更在于为大型工程提供了更清晰的物理架构和更强的封装性。在应用场景上,模块化特性正逐步从C++20向C++26演进,并与反射(Reflection)等新特性深度集成,为元编程和代码生成开辟了新路径。本文以G

weixin_33290540的博客 273

手动写编译器实现加减乘除运算

手动写编译器实现加减乘除运算

r643064456的博客 1618

如何阅读、学习 Tcc (Tiny C Compiler) 源代码?如何解析 Tcc 源代码?

阅读和解析 TCC(Tiny C Compiler) 的源代码需要对编译器的基本工作原理和代码结构有一定的了解。

belldeep的专栏 3029

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的博客 689

Color-Compile:GCC错误信息着色工具源码

GCC(GNU Compiler Collection)和G++都是在Unix和类Unix系统中广泛使用的开源编译器。它们是由GNU项目开发的,旨在为不同的编程语言提供支持。GCC支持包括C、C++、Objective-C、Fortran、Java、Ada等多种语言的编译工作,而G++则是GCC的C++编译器前端,专注于C++语言的编译。为开发者提供以下功能:错误高亮显示:编译错误以醒目颜色标记,便于快速定位。警告信息区分:不同类型的警告用不同颜色区分,易于识别。输出信息过滤。

weixin_42602241的博客 967

深入浅出C语言编译器源码剖析

本文还有配套的精品资源,点击获取 简介:编译器是将高级编程语言转换为机器语言的关键工具,本资源提供的“简单编译器”源码用C语言编写,涵盖编译器设计的各个主要阶段,如词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。通过学习和调试这些源码,开发者能够深入理解编译原理和编程语言的内部工作,提升C语言编程技能,掌握复杂数据结构和算法的应用。建议学习者先了解编译原...

weixin_42451850的博客 1499

GCC编译原理实战:源码到可执行程序的转变

GCC(GNU Compiler Collection,GNU编译器集合)是一个编译器的集合,它能够处理多种编程语言,包括但不限于C、C++、Objective-C、Fortran、Ada和Go等。GCC以其开源和跨平台的特性,成为自由软件运动的一个重要部分,广泛用于Linux及其他类Unix系统,以及各种嵌入式设备中。GCC的核心优势在于其强大的兼容性和优化能力。它支持广泛的编译选项,开发者可以根据不同的需求选择不同的优化级别,从简单的代码检查到复杂的性能调优。

weixin_42613018的博客 548

openeuler在线/离线安装docker服务

openeuler在线/离线安装docker服务

haixuti7的博客 1071

汉字跨越三千年的生命力与数字时代适应性

文字作为文明载体,其演变规律始终遵循实用性与适应性的平衡。汉字作为现存最古老的文字系统,凭借形义结合的六书构造原理,实现了超方言的文化统一功能。在计算机处理方面,五笔输入法与Unicode支持证明了其技术兼容性,而视觉识别效率的先天优势使其在信息时代更具传播效力。从甲骨文识别AI到现代书法设计,汉字系统持续展现强大的文化承载力与技术适应性,这种活态传承为数字人文研究提供了独特样本。

weixin_29058331的博客 352

TPC好像是这么回事儿

TPC(Transmit Power Control)发送功率控制,本觉得就是控制一下发送功率,原理很简单,但看原版协议死活每搞懂什么意思,恼羞成怒!!!! 后来又看了一些贴子和cisco的相关功能介绍,再回头看协议,好像是这么一回事: 1、所谓TPC,是AP控制STA的发送功率的一种手段。在802.11d中,已定义了使用Country Element传递区域无线通信规定的信道和最大发送功率信息: 通过获取这些信息,STA可以确定自己应该遵守什么规则,可以用什么发送功率在哪些信道上通信。 2

两只勤劳的蜜蜂 8625

MATLAB下pdf文件操作读取示例

当遇到一些需要大量数据的项目,数据的读取与储存显得尤为重要。怎样把数据从其他格式的文件中读取,并运用到程序中是很多时候我们要解决的问题。对于平常的.txt,和.xlsx文件,MATLAB有对应的函数帮助读取,但是遇到pdf文件时MATLAB很难读取内容。本文以一个操作实例提供了一个从pdf文件中读取数据的方法。

UESTC 五高考3模拟的博客 6558

【ros2】从零认识URDF:机器人模型描述的“说明书”

visual>子节点只负责机器人在RViz2中的可视化效果,不参与任何物理计算,就像给零件“穿衣服”。<origin>:定义零件的局部坐标系相对于连杆原点的位姿,参数xyz表示平移(单位:米),rpy表示旋转(单位:弧度,绕x→y→z轴旋转);<geometry>:定义零件的几何形状,支持四种基础形状+外部3D模型;<material>:定义零件的颜色,需要提前定义材质。常见几何形状示例-- 连杆名称:base_link(底座),全局唯一 --> < visual > <!

EnHengNa的博客 1609

STM32 AFIO时钟开启时机与复用功能解析

在嵌入式系统开发中,GPIO复用是微控制器外设配置的核心技术之一。通过复用功能,单个物理引脚可以动态切换不同功能模式,如USART通信或普通IO。其实现原理依赖于芯片内部的时钟树架构和寄存器配置机制。AFIO(Alternate Function I/O)模块作为STM32的特色设计,专门处理引脚重映射、外部中断配置等高级功能。正确理解复用功能与AFIO时钟的关系,能显著提升嵌入式开发效率,避免资源浪费。本文以STM32为例,结合引脚重映射和USART配置等典型场景,详解AFIO时钟的实际应用规范与优化实践

weixin_42389113的博客 578

OpenWRT软件源更换保姆级教程:从国内镜像到官方源一键切换(含常见报错解决)

本文提供OpenWRT软件源更换的详细教程,涵盖从国内镜像源到官方源的切换方法,并深度解析常见报错解决方案。针对国内网络环境,指导用户如何精准定位系统信息、备份配置、选择并配置清华等国内镜像源,以及处理签名验证失败、依赖缺失、404错误等典型问题,旨在提升软件包管理效率与稳定性。

weixin_29229261的博客 1936

深入C++学习还必须掌握的一基础知识精讲

施磊C++语言基础提高课程笔记,包括了new/delete;malloc/free;引用和指针;const,指计和引用的结合;函数重载,inline的数,参数带默认值的函数;函数模板等知识点

GeniusAng的博客 1477

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

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

上一篇: gcc 源码分析---gimple 程序流程
下一篇: gcc 源码分析:机器描述文件
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、付费专栏及课程。

余额充值