gcc源代码分析,expand_call()函数第三部分

2024-01-02 22:58

本文主要是介绍gcc源代码分析,expand_call()函数第三部分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(insn_list 6 (nil))

(insn_list 2 (insn_list 6 (nil)))

(sequence[ ] )

(reg:SI 0)

(const_int 4)

这次是解释这5条rtx的产生过程

 

相关的代码片段:


/* Mark all register-parms as living through the call.  */

  start_sequence ();
  for (i = 0; i < num_actuals; i++)
    if (args[i].reg != 0)
      {
    if (args[i].partial > 0)
      use_regs (REGNO (args[i].reg), args[i].partial);
    else if (GET_MODE (args[i].reg) == BLKmode)
      use_regs (REGNO (args[i].reg),
            ((int_size_in_bytes (TREE_TYPE (args[i].tree_value))
              + UNITS_PER_WORD - 1)
             / UNITS_PER_WORD));
    else
      emit_insn (gen_rtx (USE, VOIDmode, args[i].reg));
      }

  if (structure_value_addr && ! structure_value_addr_parm
      && GET_CODE (struct_value_rtx) == REG)
    emit_insn (gen_rtx (USE, VOIDmode, struct_value_rtx));

  use_insns = gen_sequence ();
  end_sequence ();

  /* Figure out the register where the value, if any, will come back.  */
  valreg = 0;
  if (TYPE_MODE (TREE_TYPE (exp)) != VOIDmode
      && ! structure_value_addr)
    {
      if (pcc_struct_value)
    valreg = hard_libcall_value (Pmode);
      else
    valreg = hard_function_value (TREE_TYPE (exp), fndecl);
    }

  /* Generate the actual call instruction.  */
  /* This also has the effect of turning off any pop-inhibition
     done in expand_call.  */
  if (args_size.constant < 0)
    args_size.constant = 0;
  emit_call_1 (funexp, funtype, args_size.constant,
           FUNCTION_ARG (args_so_far, VOIDmode, void_type_node, 1),
           valreg, old_inhibit_defer_pop, use_insns);


下面是加了fprintf()的调试结果

before start_sequence

(insn_list 6 (nil))

(insn_list 2 (insn_list 6 (nil)))
after start_sequence
after for if
before gen_sequence

(sequence[ ] )
after end_sequence
before hard

(reg:SI 0)
hard_funtion_value

(const_int 4)
emit_call_1 funexp symbol_ref


逐一说明:

(insn_list 6 (nil))

(insn_list 2 (insn_list 6 (nil)))


和  start_sequence ();有关。


(sequence[ ] )和

  use_insns = gen_sequence ();

有关。


(reg:SI 0)和    valreg = hard_function_value (TREE_TYPE (exp), fndecl);  有关。


(const_int 4) 和函数  emit_call_1 ()有关


这篇关于gcc源代码分析,expand_call()函数第三部分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/563886

相关文章

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每