- 博客(27)
- 资源 (13)
- 收藏
- 关注
原创 gcc 源码分析:从IR-RTL 到汇编输出
该代码片段展示了GCC编译器后端在RTL优化和寄存器分配完成后生成汇编代码的过程。主要内容包括: 定义了pass_final类来执行最终汇编输出阶段,调用rest_of_handle_final函数处理汇编生成。 rest_of_handle_final函数负责: 处理调试标记 调用assemble_start_function开始函数汇编 通过final_1函数遍历RTL指令并生成汇编 处理函数结尾和异常表输出 final_1函数: 初始化指令识别器 遍历RTL指令链 处理基本块和调试信息 调用final
2025-07-18 13:57:09
436
原创 gcc 源码分析--从gimple 到IR-RTL
GCC编译器将GIMPLE中间表示转换为RTL中间表示的过程分为两部分:一部分是与目标架构无关的通用转换(如标签生成等),另一部分则依赖于目标架构描述文件。转换过程中会进行参数类型检查,并且一条GIMPLE语句可能对应多条RTL指令。该转换由pass_expand类实现,主要处理SSA形式转换、变量扩展、指令生成等工作,最终生成完整的RTL代码。
2025-07-18 13:12:56
398
原创 gcc 源码分析:机器描述文件
GCC后端机器描述文件位于gcc/config目录中,各硬件平台有独立子目录,如xtensa平台包含xtensa.md(机器描述)、xtensa.h和xtensa.c三个核心文件。其中.h/.c文件定义目标机器的存储布局、调用规范等结构体targetm;.md文件则通过指令模板、属性定义等将机器特性引入编译器,指导IR-RTL到汇编的转换。关键转换过程分为两个阶段:GIMPLE到SPN的机器无关映射,以及SPN到IR-RTL的机器相关转换(通过匹配.md文件中命名的define_insn模板)。optabs
2025-07-18 12:21:47
343
原创 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
2025-07-18 11:26:13
406
原创 gcc 源码分析---gimple 程序流程
这段代码展示了GCC编译器前端中从AST到GIMPLE中间表示的转换过程。主要功能包括: 编译流程控制:通过do_compile()和compile_file()函数启动编译过程,调用finalize_compilation_unit()完成编译单元处理。 符号分析:analyze_functions()函数负责分析函数符号,处理函数属性、别名对、可达性分析等,构建调用图。 函数转换:cgraph_node::analyze()将函数转换为GIMPLE表示,包括处理thunk函数、多版本函数调度器等。 GI
2025-07-15 13:58:10
882
原创 gcc 源码分析--gimple 关键数据结构
摘要:本文介绍了GIMPLE中间表示(IR)的操作码定义及其基础结构。GIMPLE作为GCC编译器的重要中间语言,包含了多种操作指令类型,如控制流(GIMPLE_COND、GIMPLE_GOTO)、赋值(GIMPLE_ASSIGN)、函数调用(GIMPLE_CALL)以及OpenMP并行化指令(GIMPLE_OMP系列)等。其基础结构struct gimple通过位字段标识语句类型、警告状态、修改标志等属性,并包含操作数数量、位置信息和基本块指针。此外,GIMPLE通过继承体系(如gimple_statem
2025-07-15 13:15:58
635
原创 gcc源码阅读--gimple 介绍
摘要:GENERIC是一种规范化的AST表示形式,旨在建立与前端语言无关的统一AST标准。在GCC编译器中,前端语言通常会将AST/GENERIC转换为GIMPLE中间表示。GIMPLE是一种三地址码形式的语言无关中间表示,相比树形结构的AST/GENERIC,它具有线性序列的特点,更利于后续编译优化。从AST到GIMPLE的转换包含高级GIMPLE和低级GIMPLE两个阶段,最终会消除作用域等相关语句,形成更简洁的中间表示形式。这一转换过程实现了从语言相关到语言无关的过渡,为编译器后端处理提供了统一基础。
2025-07-14 15:24:21
418
原创 gcc 源码阅读---语法树
GCC语法树节点类型定义摘要 GCC编译器在tree.def文件中定义了丰富的语法树节点类型,涵盖编译器前端到后端处理的各类语法结构。主要分类包括: 基础节点类:ERROR_MARK、IDENTIFIER_NODE等异常标记节点 类型节点:INTEGER_TYPE、POINTER_TYPE等30+种数据类型 常量节点:INTEGER_CST、REAL_CST等10+种常量类型 声明节点:FUNCTION_DECL、VAR_DECL等20+种声明类型 表达式节点:包含算术运算(PLUS_EXPR)、比较运算(
2025-07-14 14:46:31
588
原创 gcc 源码阅读--全局符号表管理
摘要: 本文分析了GCC编译器中的符号表管理机制,重点研究了symtab_node、cgraph_node和varpool_node三个核心类的定义及其作用。symtab_node是所有符号表条目的基类,cgraph_node用于管理函数调用图,varpool_node处理静态变量。文章详细描述了这些类的成员变量和方法,包括符号注册、引用管理、别名处理等功能,并梳理了全局符号和函数注册到全局符号表的过程。通过分析可以看出,GCC采用分层架构管理符号信息,symtab_node提供基础功能,而cgraph_n
2025-07-14 14:23:02
433
原创 gcc源码阅读--语法解析
这篇文章分析了GCC编译器前端语法解析的核心流程,主要包含以下内容: 语法解析入口函数c_common_parse_file,负责初始化预处理并循环处理每个输入文件 解析单个源文件的c_parse_file函数,处理PCH预编译头文件并初始化异常处理 解析翻译单元(translation unit)的c_parser_translation_unit函数,处理外部声明和GNU扩展语法 解析外部声明(declaration/definition)的c_parser_external_declaration函数
2025-07-14 14:00:01
574
原创 gcc 源码阅读--C语言预处理
此hash桶是自动扩展的,在ht搜索函数ht_lookup_with_hash中,若发现整个hash table超过3/4都满了,就会主动扩展此hash table(重新分配,复制,释放原有的)。alloc_node函数是用来分配节点内存的,分配后hashnode[]数组中的指针,也就指向这个内存中的元素,在ht搜索过程中(ht_lookup_with_hash),若发现需要新。/* 当前正在处理的语法符号c_token的地址,这里除了初始化时,应该指向 tokens_buf[0] */
2025-07-13 16:28:04
455
原创 gcc 源码阅读---程序入口
gcc 是个驱动型程序,完成c/c++转为汇编程,调用汇编程序转为.o文件,再调用link程序生成elf执行程序。在gcc 默认编译中,会编译出gcc/g++,cc1这几个程序,cc1程序是真正的将c编译为汇篇程序,这是整个编译的核 心。最后调用 toplev.cc。
2025-07-13 15:03:27
762
原创 MFC 中创建并显示二维码
/ 位图显示过程中重要的颜色数,0表示所有的颜色都重要。// 位图数据的起始位,位图文件头+位图信息头+调色板的大小。// 位图的高度,以像素为单位。// 位图压缩格式,必须是0,不压缩。// 位图的宽度,以像素为单位。// 位图的大小,以字节为单位。// 位图文件保留字,必须为0。// 位图文件保留字,必须为0。
2023-11-21 14:42:16
769
1
原创 Flex & bison 学习好代码
但是要会用flex &bison的话,容易理解一些。可以生成make ,这样就可以做实验了。计算机的重要课程编译原理很难学吧,在cygwin 下面或者linux。有些好的项目可以帮助我们,比如。可以帮我们,下载 下来。
2023-11-09 16:57:40
191
1
原创 VS2019 编译Postgrsql 的windows平台代码和调试
另外说明,需要提前安装ACtivePertl 与Openssl 的windows 版本。这里可以下载openssl,将openssl 目录加进系统目录。3.打开目录中生成的 pgsql.sln。这里可以下载active perl。2.在postgrsql 的目录中执行。
2023-11-08 09:16:04
375
1
原创 嵌入式,系统开发,从bootload 到嵌入式OS
嵌入式开发关于软件 的部分,首先第一层是bootloader,可能大家会认为一开始是嵌入式OS.嵌入式bootloader相当于PC上的bios 程 序, 这个软件是用来初始化硬件,并加载OS的。但是嵌入式设备上的bootloader没有pc的那么复杂,同时功能上也有所不同。基本上,bootloader会做下面几个事情:(1) 初始化RAM(必需):bootloader必须能够初始
2008-03-11 16:12:00
1129
原创 SPDIF
SPDIF 是sony & philips确定的数字音频通信接口标准,一般也叫 IEC958.音频格式:一般是16位数据,也可以支持到24位支持的音频抽样:44.1KHZ48KHZ32KHZ单方式传输从发送方发给接受方包括控制信息V(validity )bitU(user) bitC(channel status)bitP(parity) bit编码格式biphase mark 带宽100KHZ
2007-11-19 17:33:00
482
原创 IIS (I2S)介绍
随着消费市场的发展,很多数字技术被引入进来,出现了,A/D 与D/A转换器数字信号处理数字纠错数字滤波数字输入输出因此出现了对数字音频传输的需求,交互音频通信(I2S)便出现了IIS上传输的音频信号的PCM数字,一般包括3根传输线Continuous serial clock(SCK) 时钟Word select (WS)声道选择serial data(SD) 数据分为主从式,主式需要提供时钟从式
2007-11-19 17:32:00
1043
原创 c/c++ struct 结构体
定义结构体时要注意对类型和大小进行排序.在c/c++编译器中,有一个特性很少被注意到就是编译器的字节对齐,例如:struct xa{char a;char b;INT c;char xb;char de; }如果编译器使用四字节对齐,那么上面结构的大小就是12字节。正确写法应该是struct xa{char a;char b
2006-03-01 11:50:00
864
原创 c/c++中的struct
定义结构体时要注意对类型和大小进行排序.在c/c++编译器中,有一个特性很少被注意到就是编译器的字节对齐,例如:struct xa{char a;char b;INT c;char xb;char de; }如果编译器使用四字节对齐,那么上面结构的大小就是12字节。正确写法应该是struct xa{char a;char b
2006-03-01 11:48:00
708
原创 C # 受控C++
这几天看了新的vc.net 和c#,觉得语言是不难,就是.net架构相对比较大。 搞不懂的是,为什么ms不将这么好的库给加到c++中去,这样不是很好。反正ms不做多平台。 ms的帮助是真全,基本上不用看书,看帮助就会了。这一点是比java要好。
2004-07-13 22:16:00
756
原创 ACM g7221
几天的努力,终天将G7221的ACM接口的编码驱动写了出来。事情都是这样子,会了其实很简单,不会想半天。台上10分钟,台下10年功啊。
2004-07-13 22:12:00
752
可变目标C编译器 设计与实现 源代码
2025-06-21
MFi Accessory Firmware Specification R46.pdf
2020-01-20
QR 二维码生成程序,支持多种语言 c/c++/java/python/rust
2023-11-22
条形码、二维码解码库 c++ 源代码
2023-11-22
条形码生产程序库与执行程序,包括源代码
2023-11-22
ARM System Developer's Guide
2009-04-01
声音降噪处理(效果非常好,支持8K语音输入)
2013-06-06
统计信号处理:非高斯信号处理及其应用
2011-04-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人