#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"
static rtx cplus_expand_expr PARAMS ((tree, rtx, enum machine_mode,
enum expand_modifier));
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;
}
static rtx
cplus_expand_expr (exp, target, tmode, modifier)
tree exp;
rtx target;
enum machine_mode tmode;
enum expand_modifier 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;
}
void
init_cplus_expand ()
{
lang_expand_expr = cplus_expand_expr;
}
int
extract_init (decl, init)
tree decl ATTRIBUTE_UNUSED, init ATTRIBUTE_UNUSED;
{
return 0;
}