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中間語言轉換成最終的匯編語言。?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72581.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第十五屆藍橋杯Scratch12月stema選拔賽真題—消失的水母

消失的水母 編程實現&#xff1a; 消失的水母。&#xff08;角色、背景非源素材&#xff09; 具體要求&#xff1a; 1、每次點擊綠旗&#xff0c;水母說“請輸入 2&#xff5e;10 的整數”&#xff0c;同時在舞臺下方顯示輸入框&#xff0c;如圖所示; 完整題目可點擊下方鏈…

Redis設計與實現-數據結構

Redis數據結構 1、RedisObject對象2、簡單動態字符串2.1 SDS定義2.2 SDS與C語言的區別2.3 SDS的空間分配策略2.3.1 空間預分配2.3.2 惰性空間釋放 2.4 SDS的API 3、鏈表3.1 鏈表的定義3.2 鏈表的API 4、字典4.1 字典的定義4.2 哈希算法4.3 哈希表的擴縮4.3.1 哈希表擴縮的判斷依…

由麻省理工學院計算機科學與人工智能實驗室等機構創建低成本、高效率的物理驅動數據生成框架,助力接觸豐富的機器人操作任務

2025-02-28&#xff0c;由麻省理工學院計算機科學與人工智能實驗室&#xff08;CSAIL&#xff09;和機器人與人工智能研究所的研究團隊創建了一種低成本的數據生成框架&#xff0c;通過結合物理模擬、人類演示和基于模型的規劃&#xff0c;高效生成大規模、高質量的接觸豐富型機…

RK3588開發筆記-fiq_debugger: cpu 0 not responding, reverting to cpu 3問題解決

目錄 前言 一、FIQ Debugger介紹 二、rockchip平臺配置方法 三、問題分析定位 IRQF_NOBALANCING 的含義 總結 前言 在進行 RK3588 開發的過程中,我們可能會遇到各種棘手的問題。其中,“fiq_debugger: cpu 0 not responding, reverting to cpu 3” 這個錯誤出現在RK3588的…

計算機視覺|ViT詳解:打破視覺與語言界限

一、ViT 的誕生背景 在計算機視覺領域的發展中&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;一直占據重要地位。自 2012 年 AlexNet 在 ImageNet 大賽中取得優異成績后&#xff0c;CNN 在圖像分類任務中顯示出強大能力。隨后&#xff0c;VGG、ResNet 等深度網絡架構不…

SpringTask 引起的錯誤

SpringTask 引起的錯誤 1. 場景 在使用 SpringBoot 編寫后臺程序時&#xff0c;當在瀏覽器頁面中發起請求時&#xff0c;MP 自動填充來完成一些字段的填充&#xff0c;例如創建時間、創建人、更新時間、更新人等。但是當編寫微信小程序時&#xff0c;由于一些字段無法進行自動…

FPGA學習篇——Verilog學習4

1.1 結構語句 結構語句主要是initial語句和always語句&#xff0c;initial 語句它在模塊中只執行一次&#xff0c;而always語句則不斷重復執行&#xff0c;以下是一個比較好解釋的圖: (圖片來源于知乎博主羅成&#xff0c;畫的很好很直觀&#xff01;) 1.1.1 initial語句 ini…

【Linux】【網絡】UDP打洞-->不同子網下的客戶端和服務器通信(未成功版)

【Linux】【網絡】UDP打洞–>不同子網下的客戶端和服務器通信&#xff08;未成功版&#xff09; 上次說基于UDP的打洞程序改了五版一直沒有成功&#xff0c;要寫一下問題所在&#xff0c;但是我后續又查詢了一些資料&#xff0c;成功實現了&#xff0c;這次先寫一下未成功的…

【Python編程】高性能Python Web服務部署架構解析

一、FastAPI 與 Uvicorn/Gunicorn 的協同 1. 開發環境&#xff1a;Uvicorn 直接驅動 作用&#xff1a;Uvicorn 作為 ASGI 服務器&#xff0c;原生支持 FastAPI 的異步特性&#xff0c;提供熱重載&#xff08;--reload&#xff09;和高效異步請求處理。 啟動命令&#xff1a; u…

前端權限流程(基于rbac實現思想)

1. 權限控制 1.1. 實現思想 基于rbac權限控制思想實現&#xff0c;給用戶分配角色&#xff0c;給角色分配權限 給用戶分配角色業務 注意&#xff1a;上方圖片是個示例圖&#xff0c;代表給用戶分配職位(角色)&#xff0c;頁面中使用了Element-plus的el- checkbox組件…

軟件高級架構師 - 軟件工程

補充中 測試 測試類型 靜態測試 動態測試 測試階段 單元測試中&#xff0c;包含性能測試&#xff0c;如下&#xff1a; 集成測試中&#xff0c;包含以下&#xff1a; 維護 遺留系統處置 高水平低價值&#xff1a;采取集成 對于這類系統&#xff0c;采取 集成 的方式&…

python3.13安裝教程【2025】python3.13超詳細圖文教程(包含安裝包)

文章目錄 前言一、python3.13安裝包下載二、Python 3.13安裝步驟三、Python3.13驗證 前言 本教程將為你詳細介紹 Python 3.13 python3.13安裝教程&#xff0c;幫助你順利搭建起 Python 3.13 開發環境&#xff0c;快速投身于 Python 編程的精彩實踐中。 一、python3.13安裝包下…

【極客時間】瀏覽器工作原理與實踐-2 宏觀視角下的瀏覽器 (6講) - 2.5 渲染流程(上):HTML、CSS和JavaScript,是如何變成頁面的?

https://time.geekbang.org/column/article/118205 2.5 渲染流程&#xff08;上&#xff09;&#xff1a;HTML、CSS和JavaScript&#xff0c;是如何變成頁面的&#xff1f; 2.4講了導航相關的流程&#xff0c;那導航被提交后又會怎么樣呢&#xff1f; 就進入了渲染階段。 這…

小模型和小數據可以實現AGI嗎

小模型和小數據很難實現真正的 通用人工智能&#xff08;AGI, Artificial General Intelligence&#xff09;&#xff0c;但在特定任務或受限環境下&#xff0c;可以通過高效的算法和優化方法實現“近似 AGI” 的能力。 1. 為什么小模型小數據難以實現 AGI&#xff1f; AGI 需…

Android14 OTA差分包升級報kPayloadTimestampError (51)

由于VF 架構&#xff0c; 所以鏡像的打包時間可能存在偏差&#xff0c; 如 boot.img 和 客制化的一些鏡像打包 可能會在 vendor 側進行打包。 而 與system 側進行merge 時&#xff0c;時間戳比較亂&#xff0c;為了解決這個問題&#xff0c;讓時間戳進行統一。 使用adb方式驗證…

CMake學習筆記(一):工程的新建和如何將源文件生成二進制文件

cmake是我們在工作過程中比較常見的一個工具&#xff0c;該系列文章是自己用來學習的筆記。目前只是記錄下自己學習cmake的過程中的一些重要的知識點&#xff0c;其是以項目需求為導向并非完整的cmake的學習路線和系統&#xff0c;同樣也并非適合所有的人。 1.生成一個可執行文…

重定位(1)

一、重定位 1、對于有強大ROM的板子&#xff0c;他們會將上電后的程序放到指定RAM內存 2、無強大片內ROM的板子&#xff0c;自己編程序讓他知道RAM內存指定位置 指定位置&#xff1a;就是鏈接地址&#xff0c;指定哪里&#xff0c;哪里就被編譯好一塊內存用來存放上電的程序 …

自由學習記錄(41)

代理服務器的核心功能是在客戶端&#xff08;用戶設備&#xff09;和目標服務器&#xff08;網站/資源服務器&#xff09;之間充當“中介”&#xff0c;具體過程如下&#xff1a; 代理服務器的工作流程 當客戶端希望訪問某個網站&#xff08;比如 example.com&#xff09;時&…

Jadx Gui 的詳細介紹、安裝指南、使用方法及配置說明

Jadx Gui&#xff1a;安卓應用逆向分析神器 一、Jadx Gui 簡介 Jadx 是一款開源的 Android 反編譯工具&#xff0c;支持將 .apk、.aab、.dex 等文件反編譯為可讀的 Java/Kotlin 源代碼和資源文件&#xff08;如 XML、PNG&#xff09;。其特點包括&#xff1a; 圖形化界面&am…

Linux+apache之 瀏覽器訪問云服務器磁盤的圖片,通過tomcat

https://javab.blog.csdn.net/article/details/80580520 安裝tomcact 修改添加 <Context docBase"/home/wyp/images" path"/img" debug"0" reloadable"true" />修改完成后保存重啟tomcat服務。 測試訪問方式&#xff1a;http…