亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? stmt.c

?? 這是完整的gcc源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號(hào):
/* Expands front end tree to back end RTL for GNU C-Compiler   Copyright (C) 1987, 1988, 1989 Free Software Foundation, Inc.This file is part of GNU CC.GNU CC is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 1, or (at your option)any later version.GNU CC is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU CC; see the file COPYING.  If not, write tothe Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  *//* This file handles the generation of rtl code from tree structure   above the level of expressions, using subroutines in exp*.c and emit-rtl.c.   It also creates the rtl expressions for parameters and auto variables   and has full responsibility for allocating stack slots.   The functions whose names start with `expand_' are called by the   parser to generate RTL instructions for various kinds of constructs.   Some control and binding constructs require calling several such   functions at different times.  For example, a simple if-then   is expanded by calling `expand_start_cond' (with the condition-expression   as argument) before parsing the then-clause and calling `expand_end_cond'   after parsing the then-clause.   `expand_function_start' is called at the beginning of a function,   before the function body is parsed, and `expand_function_end' is   called after parsing the body.   Call `assign_stack_local' to allocate a stack slot for a local variable.   This is usually done during the RTL generation for the function body,   but it can also be done in the reload pass when a pseudo-register does   not get a hard register.   Call `put_var_into_stack' when you learn, belatedly, that a variable   previously given a pseudo-register must in fact go in the stack.   This function changes the DECL_RTL to be a stack slot instead of a reg   then scans all the RTL instructions so far generated to correct them.  */#include "config.h"#include <stdio.h>#include "rtl.h"#include "tree.h"#include "flags.h"#include "insn-flags.h"#include "insn-config.h"#include "insn-codes.h"#include "expr.h"#include "regs.h"#include "hard-reg-set.h"#include "recog.h"#define MAX(x,y) (((x) > (y)) ? (x) : (y))#define MIN(x,y) (((x) < (y)) ? (x) : (y))/* Nonzero if function being compiled pops its args on return.   May affect compilation of return insn or of function epilogue.  */int current_function_pops_args;/* Nonzero if function being compiled needs to be given an address   where the value should be stored.  */int current_function_returns_struct;/* Nonzero if function being compiled needs to   return the address of where it has put a structure value.  */int current_function_returns_pcc_struct;/* Nonzero if function being compiled needs to be passed a static chain.  */int current_function_needs_context;/* Nonzero if function being compiled can call setjmp.  */int current_function_calls_setjmp;/* Nonzero if function being compiled can call alloca,   either as a subroutine or builtin.  */int current_function_calls_alloca;/* Nonzero if the current function returns a pointer type */int current_function_returns_pointer;/* If function's args have a fixed size, this is that size, in bytes.   Otherwise, it is -1.   May affect compilation of return insn or of function epilogue.  */int current_function_args_size;/* # bytes the prologue should push and pretend that the caller pushed them.   The prologue must do this, but only if parms can be passed in registers.  */int current_function_pretend_args_size;/* This is the offset from the arg pointer to the place where the first   anonymous arg can be found, if there is one.  */rtx current_function_arg_offset_rtx;/* Name of function now being compiled.  */char *current_function_name;/* Label that will go on parm cleanup code, if any.   Jumping to this label runs cleanup code for parameters, if   such code must be run.  Following this code is the logical return label.  */rtx cleanup_label;/* Label that will go on function epilogue.   Jumping to this label serves as a "return" instruction   on machines which require execution of the epilogue on all returns.  */rtx return_label;/* List (chain of EXPR_LISTs) of pseudo-regs of SAVE_EXPRs.   So we can mark them all live at the end of the function, if nonopt.  */rtx save_expr_regs;/* List (chain of EXPR_LISTs) of all stack slots in this function.   Made for the sake of unshare_all_rtl.  */rtx stack_slot_list;/* Filename and line number of last line-number note,   whether we actually emitted it or not.  */char *emit_filename;int emit_lineno;/* Insn after which register parms and SAVE_EXPRs are born, if nonopt.  */static rtx parm_birth_insn;/* The FUNCTION_DECL node for the function being compiled.  */static tree this_function;/* Number of binding contours started so far in this function.  */static int block_start_count;/* Offset to end of allocated area of stack frame.   If stack grows down, this is the address of the last stack slot allocated.   If stack grows up, this is the address for the next slot.  */int frame_offset;/* Nonzero if a stack slot has been generated whose address is not   actually valid.  It means that the generated rtl must all be scanned   to detect and correct the invalid addresses where they occur.  */static int invalid_stack_slot;/* Label to jump back to for tail recursion, or 0 if we have   not yet needed one for this function.  */static rtx tail_recursion_label;/* Place after which to insert the tail_recursion_label if we need one.  */static rtx tail_recursion_reentry;/* Each time we expand an expression-statement,   record the expr's type and its RTL value here.  */static tree last_expr_type;static rtx last_expr_value;/* Chain of all RTL_EXPRs that have insns in them.  */static tree rtl_expr_chain;/* Last insn of those whose job was to put parms into their nominal homes.  */static rtx last_parm_insn;/* Functions and data structures for expanding case statements.  *//* Case label structure, used to hold info on labels within case   statements.  We handle "range" labels; for a single-value label   as in C, the high and low limits are the same.  */struct case_node{  struct case_node	*left;  struct case_node	*right;  struct case_node	*parent;  tree			low;  tree			high;  tree			test_label;  tree			code_label;};typedef struct case_node case_node;typedef struct case_node *case_node_ptr;static void balance_case_nodes ();static void emit_case_nodes ();static void group_case_nodes ();static void emit_jump_if_reachable ();/* Stack of control and binding constructs we are currently inside.   These constructs begin when you call `expand_start_WHATEVER'   and end when you call `expand_end_WHATEVER'.  This stack records   info about how the construct began that tells the end-function   what to do.  It also may provide information about the construct   to alter the behavior of other constructs within the body.   For example, they may affect the behavior of C `break' and `continue'.   Each construct gets one `struct nesting' object.   All of these objects are chained through the `all' field.   `nesting_stack' points to the first object (innermost construct).   The position of an entry on `nesting_stack' is in its `depth' field.   Each type of construct has its own individual stack.   For example, loops have `loop_stack'.  Each object points to the   next object of the same type through the `next' field.   Some constructs are visible to `break' exit-statements and others   are not.  Which constructs are visible depends on the language.   Therefore, the data structure allows each construct to be visible   or not, according to the args given when the construct is started.   The construct is visible if the `exit_label' field is non-null.   In that case, the value should be a CODE_LABEL rtx.  */struct nesting{  struct nesting *all;  struct nesting *next;  int depth;  rtx exit_label;  union    {      /* For conds (if-then and if-then-else statements).  */      struct	{	  /* Label on the else-part, if any, else 0.  */	  rtx else_label;	  /* Label at the end of the whole construct.  */	  rtx after_label;	} cond;      /* For loops.  */      struct	{	  /* Label at the top of the loop; place to loop back to.  */	  rtx start_label;	  /* Label at the end of the whole construct.  */	  rtx end_label;	  /* Label for `continue' statement to jump to;	     this is in front of the stepper of the loop.  */	  rtx continue_label;	} loop;      /* For variable binding contours.  */      struct	{	  /* Sequence number of this binding contour within the function,	     in order of entry.  */	  int block_start_count;	  /* Nonzero => value to restore stack to on exit.  */	  rtx stack_level;	  /* The NOTE that starts this contour.	     Used by expand_goto to check whether the destination	     is within each contour or not.  */	  rtx first_insn;	  /* Innermost containing binding contour that has a stack level.  */	  struct nesting *innermost_stack_block;	  /* List of cleanups to be run on exit from this contour.	     This is a list of expressions to be evaluated.	     The TREE_PURPOSE of each link is the ..._DECL node	     which the cleanup pertains to.  */	  tree cleanups;	  /* List of cleanup-lists of blocks containing this block,	     as they were at the locus where this block appears.	     There is an element for each containing block,	     ordered innermost containing block first.	     The element's TREE_VALUE is the cleanup-list of that block,	     which may be null.  */	  tree outer_cleanups;	  /* Chain of labels defined inside this binding contour.	     For contours that have stack levels or cleanups.  */	  struct label_chain *label_chain;	} block;      /* For switch (C) or case (Pascal) statements,	 and also for dummies (see `expand_start_case_dummy').  */      struct	{	  /* The insn after which the case dispatch should finally	     be emitted.  Zero for a dummy.  */	  rtx start;	  /* A list of case labels, kept in ascending order by value	     as the list is built.	     During expand_end_case, this list may be rearranged into a	     nearly balanced binary tree.  */	  struct case_node *case_list;	  /* Label to jump to if no case matches.  */	  tree default_label;	  /* The expression to be dispatched on.  */	  tree index_expr;	  /* Type that INDEX_EXPR should be converted to.  */	  tree nominal_type;	  /* Number of range exprs in case statement.  */	  short num_ranges;	} case_stmt;    } data;};/* Chain of all pending binding contours.  */struct nesting *block_stack;/* Chain of all pending binding contours that restore stack levels   or have cleanups.  */struct nesting *stack_block_stack;/* Chain of all pending conditional statements.  */struct nesting *cond_stack;/* Chain of all pending loops.  */struct nesting *loop_stack;/* Chain of all pending case or switch statements.  */struct nesting *case_stack;/* Separate chain including all of the above,   chained through the `all' field.  */struct nesting *nesting_stack;/* Number of entries on nesting_stack now.  */int nesting_depth;/* Pop one of the sub-stacks, such as `loop_stack' or `cond_stack';   and pop off `nesting_stack' down to the same level.  */#define POPSTACK(STACK)					\do { int initial_depth = nesting_stack->depth;		\     do { struct nesting *this = STACK;			\	  STACK = this->next;				\	  nesting_stack = this->all;			\	  nesting_depth = this->depth;			\	  free (this); }				\     while (nesting_depth > initial_depth); } while (0)static int warn_if_unused_value ();static void expand_goto_internal ();static int expand_fixup ();static void fixup_gotos ();static void expand_cleanups ();static void fixup_cleanups ();static void expand_null_return_1 ();static int tail_recursion_args ();static void fixup_stack_slots ();static rtx fixup_stack_1 ();static rtx fixup_memory_subreg ();static rtx walk_fixup_memory_subreg ();static void fixup_var_refs ();static void fixup_var_refs_insns ();static rtx fixup_var_refs_1 ();static rtx parm_stack_loc ();static void optimize_bit_field ();static void do_jump_if_equal ();/* Emit a no-op instruction.  */rtxemit_nop (){  rtx last_insn = get_last_insn ();  if (!optimize      && (GET_CODE (last_insn) == CODE_LABEL	  || prev_real_insn (last_insn) == 0))    emit_insn (gen_nop ());}/* Return the rtx-label that corresponds to a LABEL_DECL,   creating it if necessary.  */static rtxlabel_rtx (label)     tree label;{  if (TREE_CODE (label) != LABEL_DECL)    abort ();  if (DECL_RTL (label))    return DECL_RTL (label);  return DECL_RTL (label) = gen_label_rtx ();}/* Add an unconditional jump to LABEL as the next sequential instruction.  */voidemit_jump (label)     rtx label;{  do_pending_stack_adjust ();  emit_jump_insn (gen_jump (label));  emit_barrier ();}/* Handle goto statements and the labels that they can go to.  *//* In some cases it is impossible to generate code for a forward goto    until the label definition is seen.  This happens when it may be necessary   for the goto to reset the stack pointer: we don't yet know how to do that.   So expand_goto puts an entry on this fixup list.   Each time a binding contour that resets the stack is exited,   we check each fixup.   If the target label has now been defined, we can insert the proper code.  */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久亚洲精华液精华液精华液| 日韩理论片在线| 欧美丝袜丝交足nylons图片| 成人午夜av影视| 狠狠色丁香九九婷婷综合五月| 亚洲综合一二区| 2024国产精品视频| 91精选在线观看| 欧美精品丝袜中出| 色欧美日韩亚洲| 色婷婷国产精品久久包臀| 成人免费视频app| 国产成人三级在线观看| 国产一区二区调教| 国产精品自拍在线| 国产精品小仙女| 日韩一区欧美二区| 日本视频一区二区| 日韩黄色小视频| 五月天激情综合| 日本欧美一区二区三区| 日本 国产 欧美色综合| 婷婷六月综合亚洲| 亚洲不卡av一区二区三区| 婷婷中文字幕一区三区| 亚洲大型综合色站| 日日摸夜夜添夜夜添国产精品 | 日韩一区二区视频| 91麻豆精品国产自产在线观看一区| 欧美日韩国产欧美日美国产精品| 欧美肥妇free| 欧美r级电影在线观看| 久久九九久久九九| 中国av一区二区三区| 中文字幕一区三区| 日韩av电影免费观看高清完整版| 国产又粗又猛又爽又黄91精品| av不卡免费电影| 日韩一级完整毛片| 国产精品美女久久久久久| 亚洲第一福利一区| 国产美女精品在线| 欧美色偷偷大香| 久久品道一品道久久精品| 亚洲男同1069视频| 精品伊人久久久久7777人| 99久久夜色精品国产网站| 欧美一级专区免费大片| 日韩理论片一区二区| 裸体歌舞表演一区二区| 99精品视频一区二区三区| 91精品国产色综合久久ai换脸| 国产区在线观看成人精品| 偷拍日韩校园综合在线| 成人午夜私人影院| 精品美女在线观看| 亚洲午夜激情av| 成人激情免费视频| 日韩欧美第一区| 一区二区理论电影在线观看| 国产精品一二三区在线| 欧美一区二区美女| 亚洲精品欧美二区三区中文字幕| 国产一区二区伦理片| 欧美日韩国产另类一区| 亚洲视频一区在线| 国产91精品精华液一区二区三区| 欧美另类变人与禽xxxxx| 国产精品久久久久久亚洲毛片 | 91视视频在线观看入口直接观看www | 麻豆国产精品777777在线| 91麻豆高清视频| 亚洲国产成人私人影院tom| 男女视频一区二区| 欧美亚一区二区| 成人免费在线视频| 国产精品69久久久久水密桃| 日韩一区二区精品在线观看| 一区二区激情视频| 91丨porny丨户外露出| 国产精品美女久久久久久久 | 久久综合色之久久综合| 青娱乐精品视频在线| 在线观看欧美精品| 中文字幕色av一区二区三区| 国产乱子轮精品视频| 精品日韩欧美在线| 日本va欧美va瓶| 91精品一区二区三区在线观看| 亚洲精品国产精品乱码不99| 波波电影院一区二区三区| 久久久噜噜噜久久人人看 | 一本到不卡精品视频在线观看| 久久女同性恋中文字幕| 国产一区二区美女诱惑| 久久久久久综合| 国产一区不卡视频| 久久免费的精品国产v∧| 狠狠色丁香婷综合久久| 日韩精品在线一区| 狠狠色丁香久久婷婷综合丁香| 日韩一级成人av| 久久精品国产99国产| 日韩欧美国产一区二区三区| 美女视频黄a大片欧美| 日韩欧美123| 精品亚洲免费视频| 国产亚洲精品7777| 成人在线一区二区三区| 国产精品福利一区二区三区| 不卡一区在线观看| 亚洲欧美日韩系列| 久久九九全国免费| 成人午夜视频福利| 亚洲天堂a在线| 欧美日韩一区二区三区不卡 | 成人的网站免费观看| 一区免费观看视频| 日本黄色一区二区| 亚洲国产成人精品视频| 91麻豆精品91久久久久同性| 国产在线不卡一区| 中文字幕亚洲电影| 欧美日韩在线亚洲一区蜜芽| 日韩成人精品视频| 久久色.com| jlzzjlzz亚洲女人18| 夜夜精品视频一区二区 | 亚洲国产高清不卡| 在线精品观看国产| 免费高清在线一区| 国产视频911| 日本丶国产丶欧美色综合| 天堂精品中文字幕在线| 久久男人中文字幕资源站| 色综合天天综合色综合av | 午夜久久久久久久久久一区二区| 日韩一区二区免费电影| 成人一道本在线| 一区二区激情小说| 26uuu精品一区二区三区四区在线| 成人精品国产福利| 亚洲18色成人| 久久精品一区二区三区不卡 | 久久色在线观看| 色天天综合久久久久综合片| 美女精品自拍一二三四| 国产精品视频第一区| 91麻豆精品国产91久久久久久 | 欧美午夜精品久久久久久孕妇| 奇米亚洲午夜久久精品| 中文字幕亚洲不卡| 欧美变态tickle挠乳网站| 99re这里都是精品| 青青草视频一区| 中文字幕av一区二区三区| 欧美精选一区二区| 成人性生交大片免费看中文 | 99久久精品99国产精品| 免费看日韩精品| 亚洲美女精品一区| 久久美女艺术照精彩视频福利播放 | av不卡免费在线观看| 男人的天堂亚洲一区| 亚洲精品免费看| 中文字幕免费不卡| 日韩视频在线永久播放| 欧美视频在线播放| 99久久精品99国产精品| 国产一区二区在线观看视频| 视频一区二区三区中文字幕| 中文字幕亚洲一区二区av在线| 精品久久五月天| 91精品欧美一区二区三区综合在 | 亚洲成人av中文| 欧美激情综合五月色丁香| 日韩一卡二卡三卡四卡| 欧美日韩国产另类不卡| 91福利在线导航| 不卡一区二区在线| 国产成人a级片| 精品亚洲国内自在自线福利| 日本视频一区二区| 亚洲一区在线观看网站| 亚洲日本在线视频观看| 国产精品高清亚洲| 国产日韩精品视频一区| 欧美精品一区二| 亚洲精品一区在线观看| 欧美一区三区二区| 欧美精品一卡两卡| 欧美三级电影网站| 欧美性做爰猛烈叫床潮| 在线观看免费视频综合| 在线视频亚洲一区| 色婷婷久久久综合中文字幕| 一本一本大道香蕉久在线精品| av中文字幕一区| 91丨九色porny丨蝌蚪| 91麻豆国产香蕉久久精品|