当前位置: 首页 > news >正文

GCC RISCV 后端 -- C语言语法分析过程

        在 GCC 编译一个 C 源代码时,先会通过宏处理,形成 一个叫转译单元(translation_unit),接着进行语法分析,C 的语法分析入口是

static void c_parser_translation_unit(c_parser *parser);

        接着就通过类似递归下降解析器(Recursive descent parser)的方式进行语法解析。当完成一个函数的解析后,会将该函数加入到符号表(Symbol Table)中的调用图(Call Graph)的节点集(nodes)中。通过下面 gdb 的 backtrace 可以看到:

#0  cgraph_node::get_create (decl=0x7ffff79b2700) at <gcc-project>/gcc/cgraph.cc:537
#1  0x00000000012d06d4 in c_genericize (fndecl=0x7ffff79b2700) at <gcc-project>/gcc/c-family/c-gimplify.cc:796
#2  0x00000000011587ec in finish_function (end_loc=33408) at <gcc-project>/gcc/c/c-decl.cc:11501
#3  0x00000000011d9734 in c_parser_declaration_or_fndef at <gcc-project>/gcc/c/c-parser.cc:3010
#4  0x00000000011d680e in c_parser_external_declaration (parser=0x7ffff7fbc5b0) at <gcc-project>/gcc/c/c-parser.cc:2088
#5  0x00000000011d6254 in c_parser_translation_unit (parser=0x7ffff7fbc5b0) at <gcc-project>/gcc/c/c-parser.cc:1952
#6  0x000000000123cf9e in c_parse_file () at <gcc-project>/gcc/c/c-parser.cc:29613
#7  0x00000000012f68c8 in c_common_parse_file () at <gcc-project>/gcc/c-family/c-opts.cc:1379
#8  0x0000000001bd64d3 in compile_file () at <gcc-project>/gcc/toplev.cc:452
#9  0x0000000001bd9b1e in do_compile () at <gcc-project>/gcc/toplev.cc:2200
#10 0x0000000001bd9fb9 in toplev::main (this=0x7fffffffd3d2, argc=19, argv=0x7fffffffd518) at <gcc-project>/gcc/toplev.cc:2354
#11 0x0000000004482a35 in main (argc=19, argv=0x7fffffffd518) at <gcc-project>/gcc/main.cc:39

        cgraph_node::get_create 就是对于一个解析后的函数所构建的调用图中的节点,调用节点(cgraph_node)。

        由此可见,符号表(Symbol Table)会包含整个转译单元中的符号,对于函数的话,会形成对应的调用节点(cgraph_node:symtab_node)。

        此时,加入以调用节点加入到符号表中的函数是已经解析好,以GENERIC 中间语言所表示的。

        加入后,cc1 调用 cgraph_node::finalize_function 进一步处理。如下图所描述的。

        这里,关键是说明 C 源代码在解析(Parse)后,所存在的形式,如何提供到后面基于过程(Pass)机制的处理。

        那么此时,在compile_file函数中,如下图:

        经过 lang_hooks.parse_file (); 后,gcc 已经将C的源代码解析完毕(Parsed)并以调用图的方式存放符号表(Symbol Table)中。

        在接着的 symtab->finalize_compilation_unit (); 就开始通过以处理过程(Passes)的方式,将GENERIC中间语言转换成最终的汇编语言。 

 

相关文章:

GCC RISCV 后端 -- C语言语法分析过程

在 GCC 编译一个 C 源代码时&#xff0c;先会通过宏处理&#xff0c;形成 一个叫转译单元&#xff08;translation_unit&#xff09;&#xff0c;接着进行语法分析&#xff0c;C 的语法分析入口是 static void c_parser_translation_unit(c_parser *parser); 接着就通过类似递…...

UI组件库及antd

什么是UI组件库及antd安装 随着商业化的趋势&#xff0c;企业级产品中需求多且功能复杂&#xff0c;且变动和并发频繁&#xff0c;常常需要设计者与开发者快速做出响应&#xff0c;同时这类产品中有很多类似的页面及组件&#xff0c;可以通过抽象得到一些稳定且高复用性的内容…...

Windows下使用ShiftMediaProject方法编译FFmpeg

Windows SDK 8.1版本不支持dxva vp9! 需要10.0.17134.0&#xff01;或者把config编译选项去掉 1.下载源码 https://github.com/ShiftMediaProject 2.创建ShiftMediaProject文件夹 把下载好的源码放入source 3.进入SMP执行 project_get_dependencies.bat 自动下载ffmepg依赖项…...

【计算机网络入门】TCP拥塞控制

目录 1. TCP拥塞控制和TCP流量控制的区别 2. 检测到拥塞该怎么办 2.1 如何判断网络拥塞&#xff1f; 3. 慢开始算法 拥塞避免算法 4.快重传事件->快恢复算法 5. 总结 1. TCP拥塞控制和TCP流量控制的区别 TCP流量控制是控制端对端的数据发送量。是局部的概念。 TCP拥…...

无人机遥控器无线传输技术解析!

一、主流无线传输方式 无线电遥控系统&#xff08;2.4GHz/5.8GHz频段&#xff09; 频段特性&#xff1a;2.4GHz频段穿透力强、覆盖距离远&#xff08;可达2公里以上&#xff09;&#xff0c;适合控制信号传输&#xff1b;5.8GHz频段带宽更高&#xff0c;适用于高清视频流&…...

修改hosts文件,修改安全属性,建立自己的DNS

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

MySQL零基础教程16—表连接进阶

复习表别名 之前已经学习过&#xff0c;查询的时候可以使用as来对检索的列进行重命名&#xff0c;这样可以让sql更加简介&#xff0c;增强易读性&#xff08;as可以省略&#xff09; 此外&#xff0c;使用表别名还可以支持在一条select语句中&#xff0c;一个表是被多次使用 …...

【软件系统架构】系列三:数据库系统之三

1.数据故障与备份 1.1 安全措施 措施说明用户标识和鉴定最外层的安全保护措施&#xff0c;可以使用用户帐户、口令及随机数检验等方式存取控制对用户进行授权&#xff0c;包括操作类型&#xff08;如查找、插入、删除、修改等动作&#xff09;和数据对象&#xff08;主要是数…...

lamp平台介绍

一、lamp介绍 网站&#xff1a; 静态 动态 php语言 .php 作用&#xff1a;运行php语言编写动态网站应用 lamp Linux Apache MySQL PHP PHP是作为httpd的一个功能模块存在的 二、部署lamp平台 1、测试httpd是否可正常返回PHP的响应 2、测试PHP代码是否可正常连接数据…...

826考研

初试总分第一的hh佬小红书&#xff1a;https://www.xiaohongshu.com/user/profile/64e106aa000000000100fe33 深研院巨佬经验贴&#xff1a;https://zhuanlan.zhihu.com/p/690464528 本部羊神经验贴&#xff1a;https://zhuanlan.zhihu.com/p/689494655 本部学硕佬经验贴&#…...

局域网自动识别机器名和MAC并生成文件的命令

更新版本&#xff1a;添加了MAC 地址 确定了设备唯一性 V1.1 局域网自动识别机器名和MAC并生成文件的批处理命令 echo off setlocal enabledelayedexpansionREM 设置输出文件 set outputFilenetwork_info.txtREM 清空或创建输出文件 echo Scanning network from 192.168.20.1…...

todo: 使用融云imserve做登录(android)

使用融云做登录注册思路 注册界面需要name, email, password考虑到融云注册用户的post格式 POST http://api.rong-api.com/user/getToken.json?userId1690544550qqcom&nameIronman这里的userId可以使用用户的email&#xff0c;但是要截断和 . 符号&#xff0c;即1690544…...

Mac OS升级后变慢了,如何恢复老系统?

我的一台Mac Air闲置很久了&#xff0c;原因是某次系统升级后用着会卡&#xff0c;有差不多10年没用了。今天想试着恢复一下出厂系统&#xff0c;目前看这条路可以走通。记录如下&#xff1a; 1、去哪里下载旧版系统&#xff1f; https://support.apple.com/zh-cn/102662 2、…...

cursor使用经验分享(java后端服务开发向)

前言 cursor是一款基于vscode&#xff0c;并集成AI能力的代码编辑器&#xff0c;其功能包括但不限于代码生成及补全、AI对话&#xff08;能够直接将代码环境作为上下文&#xff09;、即时应用建议等等&#xff0c;是一款面向未来的代码编辑器。 对于vscode&#xff0c;最先想…...

初次使用 IDE 搭配 Lombok 注解的配置

前言 在 Java 开发的漫漫征程中&#xff0c;我们总会遇到各种提升效率的工具。Lombok 便是其中一款能让代码编写变得更加简洁高效的神奇库。它通过注解的方式&#xff0c;巧妙地在编译阶段为我们生成那些繁琐的样板代码&#xff0c;比如 getter、setter、构造函数等。然而&…...

vue 安装依赖npm install过程中报错npm ERR! cb() never called!

解决办法&#xff1a; 步骤 1&#xff1a;清理 npm 缓存 npm cache clean --force rm -rf node_modules package-lock.json 步骤 2&#xff1a;一个第三方 npm 工具包&#xff0c;功能是 自动重试失败的 npm install 操作&#xff0c;适用于网络不稳定或依赖源不可靠的场景 …...

android接入rocketmq

一 前言 RocketMQ 作为一个功能强大的消息队列系统&#xff0c;不仅支持基本的消息发布与订阅&#xff0c;还提供了顺序消息、延时消息、事务消息等高级功能&#xff0c;适应了复杂的分布式系统需求。其高可用性架构、多副本机制、完善的运维管理工具&#xff0c;以及安全控制…...

libilibi项目优化(1)使用Redis实现缓存

第一版 获取视频信息使用旁路缓存 当视频信息存在缓存中时&#xff08;命中&#xff09;&#xff0c;直接从缓存中获取。不存在缓存中时&#xff0c;先从数据库中查出对应的信息&#xff0c;写入缓存后再放回数据。 //获取视频详细信息RequestMapping("/getVideoInfo&q…...

The Rust Programming Language 学习 (二)

通用编程概念 变量和可变性 默认情况下变量是不可变的&#xff08;immutable&#xff09;,不过你也可以选择让变量是可变的&#xff08;mutable&#xff09;. 变量的遮蔽 你可以声明和前面变量具有相同名称的新变量,说这个是第一个变量被第二个变量遮蔽&#xff08;shadow&…...

http链接转成https的链接的几种方法

以下是一个将HTTP链接转换为HTTPS的JavaScript函数&#xff0c;处理了多种常见输入情况&#xff1a; function convertToHttps(url) {if (typeof url ! string) return url;// 移除首尾空格并处理空字符串const trimmedUrl url.trim();if (!trimmedUrl) return https://;// 替…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

拟合问题处理

在机器学习中&#xff0c;核心任务通常围绕模型训练和性能提升展开&#xff0c;但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正&#xff1a; 一、机器学习的核心任务框架 机…...