gcc 源码分析---gimple 程序流程

GCC源码分析(五)——指令生成 一、前言   又有好久没写了,的确很忙。前篇介绍了GCC的pass格局,它是GCC中间语言部分的核心架构,也是贯穿整个编译流程的核心。在完成优化处理之后,GCC必须做的最后一步就是生成最后的编译结果,通常情况下就是汇编文件(文本或者二进制并不重要)。   前面也讲到了,GCC中间语言的核心数据结构是GENERIC、GIMPLE和RTL。其中的RTL就是和指令紧密相关的一种结构,它是指令生成的起 阅读详情

static void
do_compile ()
{

  .....

compile_file()

....

}

static void
compile_file (void)

{

        ...

      /* Run the actual compilation process.  */
  if (!in_lto_p)
    {
      timevar_start (TV_PHASE_OPT_GEN);
      symtab->finalize_compilation_unit ();
      timevar_stop (TV_PHASE_OPT_GEN);
    }

.....

}

void
symbol_table::finalize_compilation_unit (void)

{

        .....

/* Gimplify and lower all functions, compute reachability and
     remove unreachable nodes.  */
  analyze_functions (/*first_time=*/true);

  /* Mark alias targets necessary and emit diagnostics.  */
  handle_alias_pairs ();

  /* Gimplify and lower thunks.  */
  analyze_functions (/*first_time=*/false);

.....

}

static void
analyze_functions (bool first_time)

{
  /* Keep track of already processed nodes when called multiple times for
     intermodule optimization.  */
  cgraph_node *first_handled = first_analyzed;
  varpool_node *first_handled_var = first_analyzed_var;
  hash_set<void *> reachable_call_targets;

  symtab_node *node;
  symtab_node *next;
  int i;
  ipa_ref *ref;
  bool changed = true;
  location_t saved_loc = input_location;

  bitmap_obstack_initialize (NULL);
  symtab->state = CONSTRUCTION;
  input_location = UNKNOWN_LOCATION;

  thunk_info::process_early_thunks ();

  /* Ugly, but the fixup cannot happen at a time same body alias is created;
     C++ FE is confused about the COMDAT groups being right.  */
  if (symtab->cpp_implicit_aliases_done)
    FOR_EACH_SYMBOL (node)
      if (node->cpp_implicit_alias)
      node->fixup_same_cpp_alias_visibility (node->get_alias_target ());
  build_type_inheritance_graph ();

  if (flag_openmp && first_time)
    omp_discover_implicit_declare_target ();

  /* Analysis adds static variables that in turn adds references to new functions.
     So we need to iterate the process until it stabilize.  */
  while (changed)
    {
      changed = false;
      process_function_and_variable_attributes (first_analyzed,
                        first_analyzed_var);

      /* First identify the trivially needed symbols.  */
      for (node = symtab->first_symbol ();
       node != first_analyzed
       && node != first_analyzed_var; node = node->next)
    {
      /* Convert COMDAT group designators to IDENTIFIER_NODEs.  */
      node->get_comdat_group_id ();
      if (node->needed_p ())
        {
          enqueue_node (node);
          if (!changed && symtab->dump_file)
        fprintf (symtab->dump_file, "Trivially needed symbols:");
          changed = true;
          if (symtab->dump_file)
        fprintf (symtab->dump_file, " %s", node->dump_asm_name ());
        }
      if (node == first_analyzed
          || node == first_analyzed_var)
        break;
    }
      symtab->process_new_functions ();
      first_analyzed_var = symtab->first_variable ();
      first_analyzed = symtab->first_function ();

      if (changed && symtab->dump_file)
    fprintf (symtab->dump_file, "\n");

      /* Lower representation, build callgraph edges and references for all trivially
         needed symbols and all symbols referred by them.  */
      while (queued_nodes != &symtab_terminator)
    {
      changed = true;
      node = queued_nodes;
      queued_nodes = (symtab_node *)queued_nodes->aux;
      cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
      if (cnode && cnode->definition)
        {
          cgraph_edge *edge;
          tree decl = cnode->decl;

          /* ??? It is possible to create extern inline function
          and later using weak alias attribute to kill its body.
          See gcc.c-torture/compile/20011119-1.c  */
          if (!DECL_STRUCT_FUNCTION (decl)
          && !cnode->alias
          && !cnode->thunk
          && !cnode->dispatcher_function)
        {
          cnode->reset ();
          cnode->redefined_extern_inline = true;
          continue;
        }

          if (!cnode->analyzed)
        cnode->analyze ();

          for (edge = cnode->callees; edge; edge = edge->next_callee)
        if (edge->callee->definition
            && (!DECL_EXTERNAL (edge->callee->decl)
            /* When not optimizing, do not try to analyze extern
               inline functions.  Doing so is pointless.  */
            || opt_for_fn (edge

gcc 源码分析--gimple 关键数据结构 摘要:本文介绍了GIMPLE中间表示(IR)的操作码定义及其基础结构。GIMPLE作为GCC编译器的重要中间语言,包含了多种操作指令类型,如控制流(GIMPLE_COND、GIMPLE_GOTO)、赋值(GIMPLE_ASSIGN)、函数调用(GIMPLE_CALL)以及OpenMP并行化指令(GIMPLE_OMP系列)等。其基础结构struct gimple通过位字段标识语句类型、警告状态、修改标志等属性,并包含操作数数量、位置信息和基本块指针。此外,GIMPLE通过继承体系(如gimple_statem 阅读详情

相关推荐

GCC源码分析(四)——优化

一、前言 本篇只介绍一下框架,就不具体介绍每个步骤了。 二、Pass框架 上一篇已经讲了gcc的中间语言的表现形式。gcc 对中间语言的每一步处理叫做一个pass。从一个函数的GENERIC树刚被转换为GIMPLE之后,接下来的工作就由一连串的pass来完成。这些pass环环相扣,最终完成整个程序的优化工作,为目标代码生成做最后的准备。 GCC的pass结构定义在gcc/tree-

SonicLing的专栏 9734

gcc 源码分析--从gimple 到IR-RTL

GCC编译器将GIMPLE中间表示转换为RTL中间表示的过程分为两部分:一部分是与目标架构无关的通用转换(如标签生成等),另一部分则依赖于目标架构描述文件。转换过程中会进行参数类型检查,并且一条GIMPLE语句可能对应多条RTL指令。该转换由pass_expand类实现,主要处理SSA形式转换、变量扩展、指令生成等工作,最终生成完整的RTL代码。

782

gcc源码分析 GIMPLIFY相关

GCC通过前端的词法/语法分析后,将高级编程语言转换成抽象的AST中间表示。为了对AST中间表示进行语言无关的处理和优化,GCC引入了GIMPLE。GENERIC就是规范的AST。一般来说,如果一种前端语言的AST树均可以使用树节点表示,那么该AST就是GENERIC/AST,GIMPLE为是了处理不同的前端语言及其相应的AST/GENERIC, GCC引入的一种与前端语言无关的中间表示。GIMPLE是一种三地址码的中间表示形式。在从AST向GIMPLE转换的过程中,GIMPLE的生成先后经历了两个阶段,分

swh547的博客 1152

从GCC源码剖析C语言编译流程——深入理解GIMPLE中间表示

本文深入解析GCC编译流程中的GIMPLE中间表示,从源码层面剖析C语言代码如何通过预处理、编译、汇编和链接四个阶段转换为可执行文件。重点探讨GIMPLE的三地址码特性、核心数据结构及其在编译优化中的关键作用,帮助开发者理解GCC内部工作机制与优化策略。

weixin_28672681的博客 305

gcc源码分析与应用系列教程(1)

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

m0_46338137的博客 1201

GCC源码分析(二)——前端

从这一篇开始,我们将从源代码的角度来分析GCC如何完成对C语言源文件的处理。GCC的内部构架在GCC Internals(搜“gccint.pdf”,或者见[1])里已经讲述得很详细了,但是如果你只看了gccint就来看代码,还是觉得一头雾水,无法下手,因为你很难把gccint所讲的概念同gcc代码里真实的数据结构联系起来。那么这也是我把我这半年的分析经理写下来的原因,大家可以参照gccint来看

SonicLing的专栏 1万+

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

642

别再死磕U-Net了!用PyTorch手把手教你搭建ResUnet,搞定医学图像分割(附完整代码)

本文详细介绍了如何利用PyTorch搭建ResUnet模型,通过引入残差连接解决医学图像分割中的梯度消失、特征退化和细节丢失问题。与传统U-Net相比,ResUnet在Dice系数和收敛速度上均有显著提升,特别适合处理脑部MRI等复杂医学图像。文章还提供了完整的代码实现和关键训练技巧,帮助开发者快速掌握这一先进技术。

weixin_42552637的博客 326

看不懂分子动力学模拟的结果?一文读懂RMSD曲线

随后,将每一帧结构与初始模板进行叠合,计算对应原子的平均偏移量,即RMSD。总之,掌握 RMSD 的解读方法,就等于抓住了评估分子动力学模拟成败与质量的“总开关”。①在模拟初始阶段,RMSD会从0迅速上升,这是蛋白质从静态晶体或模型结构释放到溶液环境中并逐渐适应的正常过程。②经过一段时间后,曲线不再系统性上升或下降,而是围绕一个平均值,小幅度地上下波动,形成一个稳定的“平台”。这种情况下,RMSD 在初始快速上升后,并未进入平台,而是持续甚至加速上升,始终未见收敛。🔍 如何解读不同趋势的RMSD曲线。

weixin_46587777的博客 4886

我从华为身上学到的项目管理经验 -- 需求篇

记录这三年,关于项目管理上的一些心得体会 – 需求篇对于需求,我们可以根据不同的角色、理解拆分成三个过程:简单来说就是:需求分析原始需求、 需求拆分为系统需求、 需求实现为功能需求**需求分析**: 将客户需求 输出成 需求描述。 需求经理需要把 需求 转换成 客户能够接受的 初始需求 IR(Initial Requirement) 对于用户来说,我只管提 我的原始需求是

minminzhe520的博客 3万+

Dell R730安装Windows Server 2008 R2

一、RAID驱动准备  在安装Windows server2008 R2操作系统时,如果没有发现硬盘,请将下面的阵列卡驱动先解压(在下载的.exe文件,双击点下一步会自动解压),解压后把那文件夹复制到U盘中。阵列卡 PERC9 H330 - H730 - H730P - H830 Controllers for Windows Server 2008 R2二、系统安装方法方法一:光盘安装  ①请您...

MarshLin 2万+

MFRC522防冲突机制详解:当两张IC卡同时靠近读写器,会发生什么?

本文深入解析了MFRC522芯片在多张IC卡同时靠近RFID读写器时的防冲突机制,重点介绍了二叉树搜索算法在比特级的实现原理。通过详细的寄存器配置优化和实际工程案例,展示了如何有效解决信号碰撞问题,提升多卡场景下的读写性能。

weixin_29191669的博客 426

PCB激光直接成像(LDI)设备技术解析与优化方案

激光直接成像(LDI)是PCB制造中的关键数字化工艺,通过激光束直接在基板上形成电路图案。其核心技术在于高精度光学系统与智能控制算法的结合,工作精度可达微米级。在HDI板、柔性电路等高端PCB制造中,LDI技术能显著提升线宽精度和层间对位准确性。当前行业面临材料适配性、热变形控制等挑战,动态能量补偿、多波长曝光等创新方案正在突破这些瓶颈。随着模块化设计、预测性维护等工程实践的普及,LDI设备综合效率持续提升,为5G、汽车电子等领域的精密电路生产提供关键技术支撑。

weixin_29168393的博客 390

AI大模型API中转站选型指南:12项关键指标与实战评估

随着AI大模型技术的快速迭代,企业面临着一个核心挑战:如何在基础模型频繁更新的背景下,为业务系统选择稳定可靠的API中转服务?本文基于真实生产环境测试数据,从12个关键维度系统评估主流API中转站平台,帮助技术团队在模型快速演进的生态中做出科学选型决策。 1. API中转站的核心价值与业务场景 1.1 什么是API中转站 API中转站(API Gateway/Aggregator)是连接业务系统与多个大模型厂商的中间层服务。它通过统一的接口封装了不同厂商的API协议差异,为企业提供标准化的模型调用能力。在实

weixin_29056101的博客 442

YOLOv8改进 | 主干篇 | 利用MobileNetV1替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是MobileNetV1,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者。

Snu77的博客 3966

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: 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、付费专栏及课程。

余额充值