#include "config.h"
#include "system.h"
#include "rtl.h"
#include "tree.h"
#include "flags.h"
#include "expr.h"
#include "cp-tree.h"
#include "toplev.h"
#include "except.h"
#include "tm_p.h"
tree
cplus_expand_constant (cst)
tree cst;
{
switch (TREE_CODE (cst))
{
case PTRMEM_CST:
{
tree type = TREE_TYPE (cst);
tree member;
member = PTRMEM_CST_MEMBER (cst);
if (TREE_CODE (member) == FIELD_DECL)
{
tree offset = byte_position (member);
cst = fold (build1 (NOP_EXPR, type, offset));
}
else
{
tree delta;
tree pfn;
expand_ptrmemfunc_cst (cst, &delta, &pfn);
cst = build_ptrmemfunc1 (type, delta, pfn);
}
}
break;
default:
break;
}
return cst;
}
rtx
cxx_expand_expr (exp, target, tmode, modifier)
tree exp;
rtx target;
enum machine_mode tmode;
int modifier;
{
tree type = TREE_TYPE (exp);
register enum machine_mode mode = TYPE_MODE (type);
register enum tree_code code = TREE_CODE (exp);
rtx ret;
if (mode != Pmode && modifier == EXPAND_SUM)
modifier = EXPAND_NORMAL;
switch (code)
{
case PTRMEM_CST:
return expand_expr (cplus_expand_constant (exp),
target, tmode, modifier);
case OFFSET_REF:
abort ();
return const0_rtx;
case THROW_EXPR:
expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, 0);
return NULL;
case MUST_NOT_THROW_EXPR:
expand_eh_region_start ();
ret = expand_expr (TREE_OPERAND (exp, 0), target, tmode, modifier);
expand_eh_region_end_must_not_throw (build_call (terminate_node, 0));
return ret;
case EMPTY_CLASS_EXPR:
return const0_rtx;
default:
return c_expand_expr (exp, target, tmode, modifier);
}
abort ();
return NULL;
}