expr.c revision 132718
1/* Convert language-specific tree expression to rtl instructions, 2 for GNU compiler. 3 Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 4 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. 5 6This file is part of GCC. 7 8GCC is free software; you can redistribute it and/or modify 9it under the terms of the GNU General Public License as published by 10the Free Software Foundation; either version 2, or (at your option) 11any later version. 12 13GCC is distributed in the hope that it will be useful, 14but WITHOUT ANY WARRANTY; without even the implied warranty of 15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16GNU General Public License for more details. 17 18You should have received a copy of the GNU General Public License 19along with GCC; see the file COPYING. If not, write to 20the Free Software Foundation, 59 Temple Place - Suite 330, 21Boston, MA 02111-1307, USA. */ 22 23 24#include "config.h" 25#include "system.h" 26#include "coretypes.h" 27#include "tm.h" 28#include "rtl.h" 29#include "tree.h" 30#include "flags.h" 31#include "expr.h" 32#include "cp-tree.h" 33#include "toplev.h" 34#include "except.h" 35#include "tm_p.h" 36 37/* Hook used by output_constant to expand language-specific 38 constants. */ 39 40tree 41cplus_expand_constant (tree cst) 42{ 43 switch (TREE_CODE (cst)) 44 { 45 case PTRMEM_CST: 46 { 47 tree type = TREE_TYPE (cst); 48 tree member; 49 50 /* Find the member. */ 51 member = PTRMEM_CST_MEMBER (cst); 52 53 if (TREE_CODE (member) == FIELD_DECL) 54 { 55 /* Find the offset for the field. */ 56 cst = byte_position (member); 57 while (!same_type_p (DECL_CONTEXT (member), 58 TYPE_PTRMEM_CLASS_TYPE (type))) 59 { 60 /* The MEMBER must have been nestled within an 61 anonymous aggregate contained in TYPE. Find the 62 anonymous aggregate. */ 63 member = lookup_anon_field (TYPE_PTRMEM_CLASS_TYPE (type), 64 DECL_CONTEXT (member)); 65 cst = size_binop (PLUS_EXPR, cst, byte_position (member)); 66 } 67 cst = fold (build_nop (type, cst)); 68 } 69 else 70 { 71 tree delta; 72 tree pfn; 73 74 expand_ptrmemfunc_cst (cst, &delta, &pfn); 75 cst = build_ptrmemfunc1 (type, delta, pfn); 76 } 77 } 78 break; 79 80 default: 81 /* There's nothing to do. */ 82 break; 83 } 84 85 return cst; 86} 87 88/* Hook used by expand_expr to expand language-specific tree codes. */ 89 90rtx 91cxx_expand_expr (tree exp, rtx target, enum machine_mode tmode, int modifier, 92 rtx *alt_rtl) 93{ 94 tree type = TREE_TYPE (exp); 95 enum machine_mode mode = TYPE_MODE (type); 96 enum tree_code code = TREE_CODE (exp); 97 rtx ret; 98 99 /* No sense saving up arithmetic to be done 100 if it's all in the wrong mode to form part of an address. 101 And force_operand won't know whether to sign-extend or zero-extend. */ 102 103 if (mode != Pmode && modifier == EXPAND_SUM) 104 modifier = EXPAND_NORMAL; 105 106 switch (code) 107 { 108 case PTRMEM_CST: 109 return expand_expr (cplus_expand_constant (exp), 110 target, tmode, modifier); 111 112 case OFFSET_REF: 113 /* Offset refs should not make it through to here. */ 114 abort (); 115 return const0_rtx; 116 117 case THROW_EXPR: 118 expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, 0); 119 return const0_rtx; 120 121 case MUST_NOT_THROW_EXPR: 122 expand_eh_region_start (); 123 ret = expand_expr (TREE_OPERAND (exp, 0), target, tmode, modifier); 124 expand_eh_region_end_must_not_throw (build_call (terminate_node, 0)); 125 return ret; 126 127 case EMPTY_CLASS_EXPR: 128 /* We don't need to generate any code for an empty class. */ 129 return const0_rtx; 130 131 case BASELINK: 132 return expand_expr (BASELINK_FUNCTIONS (exp), target, tmode, 133 modifier); 134 135 default: 136 return c_expand_expr (exp, target, tmode, modifier, alt_rtl); 137 } 138 abort (); 139 /* NOTREACHED */ 140 return NULL; 141} 142