stmt.c (resolve_asm_operand_names): Rename from resolve_operand_names.

* stmt.c (resolve_asm_operand_names): Rename from
        resolve_operand_names.  No longer static.  Avoid needless copying.
        Don't build array of constraints.
        (expand_asm_operands): Build it here.
        * tree.h: Declare resolve_asm_operand_names.

        * stmt.c (expand_decl): Put artificial vars into registers even
        when not optimizing, and don't mark the regs as user vars.

From-SVN: r67556
This commit is contained in:
Jason Merrill 2003-06-06 13:03:32 -04:00 committed by Jason Merrill
parent 1c20913c70
commit 7dc8b126ce
3 changed files with 47 additions and 35 deletions

View File

@ -1,3 +1,14 @@
2003-06-06 Jason Merrill <jason@redhat.com>
* stmt.c (resolve_asm_operand_names): Rename from
resolve_operand_names. No longer static. Avoid needless copying.
Don't build array of constraints.
(expand_asm_operands): Build it here.
* tree.h: Declare resolve_asm_operand_names.
* stmt.c (expand_decl): Put artificial vars into registers even
when not optimizing, and don't mark the regs as user vars.
2003-06-06 J"orn Rennecke <joern.rennecke@superh.com>
* sh.h (FUNCTION_ARG_1): Consistently use NEW_MODE for the mode

View File

@ -404,8 +404,6 @@ static void fixup_gotos PARAMS ((struct nesting *, rtx, tree,
rtx, int));
static bool check_operand_nalternatives PARAMS ((tree, tree));
static bool check_unique_operand_names PARAMS ((tree, tree));
static tree resolve_operand_names PARAMS ((tree, tree, tree,
const char **));
static char *resolve_operand_name_1 PARAMS ((char *, tree, tree));
static void expand_null_return_1 PARAMS ((rtx));
static enum br_predictor return_prediction PARAMS ((rtx));
@ -1517,6 +1515,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
HARD_REG_SET clobbered_regs;
int clobber_conflict_found = 0;
tree tail;
tree t;
int i;
/* Vector of RTX's of evaluated output operands. */
rtx *output_rtx = (rtx *) alloca (noutputs * sizeof (rtx));
@ -1538,7 +1537,14 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
if (! check_unique_operand_names (outputs, inputs))
return;
string = resolve_operand_names (string, outputs, inputs, constraints);
string = resolve_asm_operand_names (string, outputs, inputs);
/* Collect constraints. */
i = 0;
for (t = outputs; t ; t = TREE_CHAIN (t), i++)
constraints[i] = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
for (t = inputs; t ; t = TREE_CHAIN (t), i++)
constraints[i] = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
#ifdef MD_ASM_CLOBBERS
/* Sometimes we wish to automatically clobber registers across an asm.
@ -2032,21 +2038,37 @@ check_unique_operand_names (outputs, inputs)
in *POUTPUTS and *PINPUTS to numbers, and replace the name expansions in
STRING and in the constraints to those numbers. */
static tree
resolve_operand_names (string, outputs, inputs, pconstraints)
tree string;
tree outputs, inputs;
const char **pconstraints;
tree
resolve_asm_operand_names (tree string, tree outputs, tree inputs)
{
char *buffer = xstrdup (TREE_STRING_POINTER (string));
char *buffer;
char *p;
tree t;
/* Substitute [<name>] in input constraint strings. There should be no
named operands in output constraints. */
for (t = inputs; t ; t = TREE_CHAIN (t))
{
const char *c = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
if (strchr (c, '[') != NULL)
{
p = buffer = xstrdup (c);
while ((p = strchr (p, '[')) != NULL)
p = resolve_operand_name_1 (p, outputs, inputs);
TREE_VALUE (TREE_PURPOSE (t))
= build_string (strlen (buffer), buffer);
free (buffer);
}
}
if (strchr (TREE_STRING_POINTER (string), '[') == NULL)
return string;
/* Assume that we will not need extra space to perform the substitution.
This because we get to remove '[' and ']', which means we cannot have
a problem until we have more than 999 operands. */
p = buffer;
p = buffer = xstrdup (TREE_STRING_POINTER (string));
while ((p = strchr (p, '%')) != NULL)
{
if (p[1] == '[')
@ -2065,29 +2087,6 @@ resolve_operand_names (string, outputs, inputs, pconstraints)
string = build_string (strlen (buffer), buffer);
free (buffer);
/* Collect output constraints here because it's convenient.
There should be no named operands here; this is verified
in expand_asm_operand. */
for (t = outputs; t ; t = TREE_CHAIN (t), pconstraints++)
*pconstraints = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
/* Substitute [<name>] in input constraint strings. */
for (t = inputs; t ; t = TREE_CHAIN (t), pconstraints++)
{
const char *c = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
if (strchr (c, '[') == NULL)
*pconstraints = c;
else
{
p = buffer = xstrdup (c);
while ((p = strchr (p, '[')) != NULL)
p = resolve_operand_name_1 (p, outputs, inputs);
*pconstraints = ggc_alloc_string (buffer, -1);
free (buffer);
}
}
return string;
}
@ -3940,7 +3939,7 @@ expand_decl (decl)
&& TREE_CODE (type) == REAL_TYPE)
&& ! TREE_THIS_VOLATILE (decl)
&& ! DECL_NONLOCAL (decl)
&& (DECL_REGISTER (decl) || optimize))
&& (DECL_REGISTER (decl) || DECL_ARTIFICIAL (decl) || optimize))
{
/* Automatic variable that can go in a register. */
int unsignedp = TREE_UNSIGNED (type);
@ -3949,7 +3948,8 @@ expand_decl (decl)
SET_DECL_RTL (decl, gen_reg_rtx (reg_mode));
mark_user_reg (DECL_RTL (decl));
if (!DECL_ARTIFICIAL (decl))
mark_user_reg (DECL_RTL (decl));
if (POINTER_TYPE_P (type))
mark_reg_pointer (DECL_RTL (decl),

View File

@ -2920,6 +2920,7 @@ extern bool parse_output_constraint PARAMS ((const char **,
bool *, bool *, bool *));
extern void expand_asm_operands PARAMS ((tree, tree, tree, tree, int,
const char *, int));
extern tree resolve_asm_operand_names (tree, tree, tree);
extern int any_pending_cleanups PARAMS ((int));
extern void init_stmt_for_function PARAMS ((void));
extern void expand_start_target_temps PARAMS ((void));