summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/stmt.c70
-rw-r--r--gcc/tree.h1
3 files changed, 47 insertions, 35 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a41970b44c6..f6747880cf1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/stmt.c b/gcc/stmt.c
index fa87140fe48..f8942adea8a 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -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),
diff --git a/gcc/tree.h b/gcc/tree.h
index 446e42fa5a8..f40ddbe9be0 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -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));