00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "config.h"
00025 #include "system.h"
00026 #include "rtl.h"
00027 #include "tree.h"
00028 #include "flags.h"
00029 #include "expr.h"
00030 #include "cp-tree.h"
00031 #include "toplev.h"
00032 #include "except.h"
00033 #include "tm_p.h"
00034
00035
00036
00037
00038 tree
00039 cplus_expand_constant (cst)
00040 tree cst;
00041 {
00042 switch (TREE_CODE (cst))
00043 {
00044 case PTRMEM_CST:
00045 {
00046 tree type = TREE_TYPE (cst);
00047 tree member;
00048
00049
00050 member = PTRMEM_CST_MEMBER (cst);
00051
00052 if (TREE_CODE (member) == FIELD_DECL)
00053 {
00054
00055 tree offset = byte_position (member);
00056 cst = fold (build1 (NOP_EXPR, type, offset));
00057 }
00058 else
00059 {
00060 tree delta;
00061 tree pfn;
00062
00063 expand_ptrmemfunc_cst (cst, &delta, &pfn);
00064 cst = build_ptrmemfunc1 (type, delta, pfn);
00065 }
00066 }
00067 break;
00068
00069 default:
00070
00071 break;
00072 }
00073
00074 return cst;
00075 }
00076
00077
00078
00079 rtx
00080 cxx_expand_expr (exp, target, tmode, modifier)
00081 tree exp;
00082 rtx target;
00083 enum machine_mode tmode;
00084 int modifier;
00085 {
00086 tree type = TREE_TYPE (exp);
00087 register enum machine_mode mode = TYPE_MODE (type);
00088 register enum tree_code code = TREE_CODE (exp);
00089 rtx ret;
00090
00091
00092
00093
00094
00095 if (mode != Pmode && modifier == EXPAND_SUM)
00096 modifier = EXPAND_NORMAL;
00097
00098 switch (code)
00099 {
00100 case PTRMEM_CST:
00101 return expand_expr (cplus_expand_constant (exp),
00102 target, tmode, modifier);
00103
00104 case OFFSET_REF:
00105
00106 abort ();
00107 return const0_rtx;
00108
00109 case THROW_EXPR:
00110 expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, 0);
00111 return const0_rtx;
00112
00113 case MUST_NOT_THROW_EXPR:
00114 expand_eh_region_start ();
00115 ret = expand_expr (TREE_OPERAND (exp, 0), target, tmode, modifier);
00116 expand_eh_region_end_must_not_throw (build_call (terminate_node, 0));
00117 return ret;
00118
00119 case EMPTY_CLASS_EXPR:
00120
00121 return const0_rtx;
00122
00123 default:
00124 return c_expand_expr (exp, target, tmode, modifier);
00125 }
00126 abort ();
00127
00128 return NULL;
00129 }