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

本文主要是分析store_one_arg ()函数和expand_expr ()的关系来说明如何处理

函数的参数。printf("Hello, world!\n");中的"Hello, world!\n"这个字符串常量的!

expand_call () 函数中的相关代码:

if (args[i].reg == 0

&& TYPE_SIZE (TREE_TYPE (args[i].tree_value)) != 0)

{

fprintf(stderr,"before store_one_arg \n");

store_one_arg (&args[i], argblock, may_be_alloca);

fprintf(stderr,"after store_one_arg \n ");

}

下面是 store_one_arg ()函数中的相关代码:

static void

store_one_arg (arg, argblock, may_be_alloca)

struct arg_data *arg;

rtx argblock;

int may_be_alloca;

{

register tree pval = arg->tree_value;

int used = 0;

if (TREE_CODE (pval) == ERROR_MARK)

return;

fprintf(stderr,"in store_one_arg debug_tree pval \n");

debug_tree(pval);

...

else if (TYPE_MODE (TREE_TYPE (pval)) != BLKmode)

{

register int size;

rtx tem;

fprintf(stderr,"else if type_mode 1 \n");

/* Argument is a scalar, not entirely passed in registers.

(If part is passed in registers, arg->partial says how much

and emit_push_insn will take care of putting it there.)

Push it, and if its size is less than the

amount of space allocated to it,

also bump stack pointer by the additional space.

Note that in C the default argument promotions

will prevent such mismatches.  */

size = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (pval)));

/* Compute how much space the push instruction will push.

On many machines, pushing a byte will advance the stack

pointer by a halfword.  */

#ifdef PUSH_ROUNDING

size = PUSH_ROUNDING (size);

#endif

used = size;

/* Compute how much space the argument should get:

round up to a multiple of the alignment for arguments.  */

if (none != FUNCTION_ARG_PADDING (TYPE_MODE (TREE_TYPE (pval)), const0_rtx))

used = (((size + PARM_BOUNDARY / BITS_PER_UNIT - 1)

/ (PARM_BOUNDARY / BITS_PER_UNIT))

* (PARM_BOUNDARY / BITS_PER_UNIT));

tem = arg->value;

if (tem == 0)

{

fprintf(stderr,"else if type_mode 2\n");

tem = expand_expr (pval, 0, VOIDmode, 0);

/* ANSI doesn‘t require a sequence point here,

but PCC has one, so this will avoid some problems.  */

fprintf(stderr,"else if type_mode 3\n");

emit_queue ();

}

/* Don‘t allow anything left on stack from computation

of argument to alloca.  */

if (may_be_alloca)

do_pending_stack_adjust ();

fprintf(stderr,"else if type_mode 4 \n");

emit_push_insn (tem, TYPE_MODE (TREE_TYPE (pval)), 0, 0,

arg->partial, arg->reg, used - size,

argblock, ARGS_SIZE_RTX (arg->offset));

}

下面是调试结果:

before store_one_arg

in store_one_arg debug_tree pval

<nop_expr 840d8

type <pointer_type 9117c

type <integer_type 91130 char readonly permanent QI

size <integer_cst 82638 literal permanent 1

align 8 size_unit 8 sep_unit 8 symtab 0

sep <integer_cst 82608 literal permanent -128 precision 8 min <integer_cst 82608 -128>

max <integer_cst 82620 literal permanent 127

pointer_to_this <pointer_type 9117c>

permanent unsigned SI

size <integer_cst 8254c literal permanent 4

align 32 size_unit 8 sep_unit 32 symtab 0

chain <function_type 912c0>

literal

arg 0 <nop_expr 840c0

type <pointer_type 88a44 type <integer_type 825bc char>

permanent unsigned SI size <integer_cst 8254c 4>

align 32 size_unit 8 sep_unit 32 symtab 0

chain <array_type 88a90>

literal

arg 0 <addr_expr 840a8 type <pointer_type 94f58>

literal

arg 0 <string_cst 84014 type <array_type 94ef4>

static literal "Hello, world!

"

else if type_mode 1

else if type_mode 2

expand_expr code = 71

<nop_expr 840d8

type <pointer_type 9117c

type <integer_type 91130 char readonly permanent QI

size <integer_cst 82638 literal permanent 1

align 8 size_unit 8 sep_unit 8 symtab 0

sep <integer_cst 82608 literal permanent -128 precision 8 min <integer_cst 82608 -128>

max <integer_cst 82620 literal permanent 127

pointer_to_this <pointer_type 9117c>

permanent unsigned SI

size <integer_cst 8254c literal permanent 4

align 32 size_unit 8 sep_unit 32 symtab 0

chain <function_type 912c0>

literal

arg 0 <nop_expr 840c0

type <pointer_type 88a44 type <integer_type 825bc char>

permanent unsigned SI size <integer_cst 8254c 4>

align 32 size_unit 8 sep_unit 32 symtab 0

chain <array_type 88a90>

literal

arg 0 <addr_expr 840a8 type <pointer_type 94f58>

literal

arg 0 <string_cst 84014 type <array_type 94ef4>

static literal "Hello, world!

"

expand_expr code = 71

<nop_expr 840c0

type <pointer_type 88a44

type <integer_type 825bc char permanent QI

size <integer_cst 82638 literal permanent 1

align 8 size_unit 8 sep_unit 8 symtab 0

sep <integer_cst 82608 literal permanent -128 precision 8 min <integer_cst 82608 -128>

max <integer_cst 82620 literal permanent 127

pointer_to_this <pointer_type 88a44> chain <integer_type 826a8 long int>

permanent unsigned SI

size <integer_cst 8254c literal permanent 4

align 32 size_unit 8 sep_unit 32 symtab 0

chain <array_type 88a90>

literal

arg 0 <addr_expr 840a8

type <pointer_type 94f58 type <array_type 94ef4>

unsigned SI size <integer_cst 8254c 4>

align 32 size_unit 8 sep_unit 32 symtab 0

literal

arg 0 <string_cst 84014 type <array_type 94ef4>

static literal "Hello, world!

"

expand_expr code = 74

<addr_expr 840a8

type <pointer_type 94f58

type <array_type 94ef4 type <integer_type 825bc char>

BLK

size <integer_cst 94f40 literal 15

align 8 size_unit 8 sep_unit 8 symtab 0

sep <integer_cst 82638 literal permanent 1 domain <integer_type 94ea8>

pointer_to_this <pointer_type 94f58> chain <pointer_type 94f58>

unsigned SI

size <integer_cst 8254c literal permanent 4

align 32 size_unit 8 sep_unit 32 symtab 0

literal

arg 0 <string_cst 84014 type <array_type 94ef4>

static literal "Hello, world!

"

expand_expr code = 26

<string_cst 84014

type <array_type 94ef4

type <integer_type 825bc char permanent QI

size <integer_cst 82638 literal permanent 1

align 8 size_unit 8 sep_unit 8 symtab 0

sep <integer_cst 82608 literal permanent -128 precision 8 min <integer_cst 82608 -128>

max <integer_cst 82620 literal permanent 127

pointer_to_this <pointer_type 88a44> chain <integer_type 826a8 long int>

BLK

size <integer_cst 94f40 literal 15

align 8 size_unit 8 sep_unit 8 symtab 0 sep <integer_cst 82638 1>

domain <integer_type 94ea8 SI

size <integer_cst 8254c literal permanent 4

align 32 size_unit 8 sep_unit 32 symtab 0

sep <integer_cst 84048 literal 0 precision 32 min <integer_cst 84048 0>

max <integer_cst 84078 literal 14

pointer_to_this <pointer_type 94f58> chain <pointer_type 94f58>

static literal "Hello, world!

"

output_constant_def

(symbol_ref:SI ("*LC0"))

(mem:BLK (symbol_ref:SI ("*LC0")))

this this

addr_expr

force_operand 27

end addr_expr

else if type_mode 3

else if type_mode 4

begin emit_push_insn

gen_push_operand

(pre_dec:SI (reg:SI 7))

end gen_push_operand

before emit_move_insn

(mem:SI (pre_dec:SI (reg:SI 7)))

before return emit_insn icode= 14

(set (mem:SI (pre_dec:SI (reg:SI 7)))

(symbol_ref:SI ("*LC0")))

emit_insn

after emit_move_insn

after store_one_arg

时间: 2024-11-05 16:07:08

gcc源代码分析,expand_call ()函数分析第五部分,store_one_arg ()函数的相关文章

Sql Server函数全解&lt;五&gt;之系统函数

原文:Sql Server函数全解<五>之系统函数  系统信息包括当前使用的数据库名称,主机名,系统错误消息以及用户名称等内容.使用SQL SERVER中的系统函数可以在需要的时候获取这些信息.下面介绍系统函数的作用和使用方法. 1.返回表中指定字段的长度   COL_LENGTH(table,column)函数返回表中指定字段的长度值.其返回值为int类型,table为要确定其列长度信息的表的名称,是nvarchar类型的表达式.column为要确定其长度的列的名称,是nvarchar类型的

gcc源代码分析,expand_call()函数和printf(&quot;Hello, world!\n&quot;);的关系

expand_call()函数在expr.c文件中. 下面是expand_call()函数的主要调试结果,记录之. 主要是加入了debug_tree()函数和debug_rtx()函数. debug_tree()函数加入到了expand_expr()函数的开始. debug_rtx()函数加入到了gen_rtx()函数的结束处. emit_call_1()函数是何时调用的也能看出.emit_call_insn()是何时调用的也能看出. 主要的调试目的是expand_call()函数是如何生成rt

gcc源代码分析,debug_tree()函数,又一利器啊

gcc源代码分析,debug_rtx()函数,利器啊 print-tree.c #include "config.h" #include "tree.h" #include <stdio.h> /* Names of tree components. Used for printing out the tree and error messages.  */ #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,

Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析

Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /*  *Author  : DavidLin  *Date    : 2014-11-11pm  *Email   : [email protected] or [email protected]  *world   : the city of SZ, in China  *Ver     : 000

gcc 源代码分析-前端篇3

3. GCC怎样函表示一个函数 对c语言来说.函数是其核心,全部的东西都在环绕着函数在转.对于一个函数来说.它基本的一些特性例如以下: 1. 有一个返回值,在这里我们没有把返回值的函数觉得它的返回值是void; 2. 它有传入的參数.而这个參数个数不确定.可多可少,也能够没有: 3. 它有一个函数名称,这个名称具有唯一性,也就是同一个project,不能有名称一样的多个函数. 4. 它有函数运行体: 对于函数来说,还是通过struct tree_decl结构来表示: filename:函数所在文

Oracle官网JNI简介和接口函数分析

第一章 概述 本章主要介绍JNI(Java Native Interface),JNI是一种本地编程接口.它允许运行在JAVA虚拟机中的JAVA代码和用其他编程语言,诸如C语言.C++.汇编,写的应用和库之间的交互操作. JNI的最大优势在于没有强加任何限制在JAVA虚拟机的下层实现上,因此,JAVA虚拟机供应商能够提供JNI的支持而不影响虚拟机的其他部分,程序员只需写出一个版本的本地应用和库,就可使之运行在一切支持JNI的JAVA虚拟机上. 本章包含了以下的要点: ? JNI概述 ? 目标 ?

x264源代码简单分析:宏块分析(Analysis)部分-帧间宏块(Inter)

本文记录x264的 x264_slice_write()函数中调用的x264_macroblock_analyse()的源代码.x264_macroblock_analyse()对应着x264中的分析模块.分析模块主要完成了下面2个方面的功能: (1)对于帧内宏块,分析帧内预测模式(2)对于帧间宏块,进行运动估计,分析帧间预测模式 上一篇文章记录了帧内宏块预测模式的分析,本文继续记录帧间宏块预测模式的分析. 函数调用关系图 宏块分析(Analysis)部分的源代码在整个x264中的位置如下图所示

uboot移植之start_armboot()函数分析

/******************************** uboot的第二阶段就是初始化剩下的还没在第一阶段初始化的硬件.主要是SoC外部硬件(譬如 iNand 网卡芯片....... )uboot本身的一些东西(uboot的命令 环境变量等.....).然后最终初始化完必要的东西后进入到uboot的命令行准备接受命令. ***********************************/ void start_armboot (void)       //这个函数构成了uboot

page_address()函数分析--如何通过page取得虚拟地址

由于X86平台上面,内存是划分为低端内存和高端内存的,所以在两个区域内的page查找对应的虚拟地址是不一样的. 一. x86上关于page_address()函数的定义 在include/linux/mm.h里面,有对page_address()函数的三种宏定义,主要依赖于不同的平台: 首先来看看几个宏的定义:CONFIG_HIGHMEM:顾名思义,就是是否支持高端内存,可以查看config文件,一般推荐内存超过896M的时候,才配置为支持高端内存.WANT_PAGE_VIRTUAL:X86平台