This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Write name of address of MEM
- To: gcc-patches at gcc dot gnu dot org
- Subject: Write name of address of MEM
- From: kenner at vlsi1 dot ultra dot nyu dot edu (Richard Kenner)
- Date: Fri, 19 Oct 01 15:30:04 EDT
This expands on the previous change by checking to see if the address
of a MEM corresponds to a variable and, if so, write the name of
that variable.
Tested on alphaev56-dec-osf4.0c.
Fri Oct 19 15:24:39 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* final.c (get_decl_from_op): New function.
(output_asm_insn): Call it; write "*" when item with decl is address.
*** final.c 2001/10/18 21:34:10 1.210
--- final.c 2001/10/19 19:06:44
*************** static void notice_source_line PARAMS ((
*** 245,248 ****
--- 245,249 ----
static rtx walk_alter_subreg PARAMS ((rtx));
static void output_asm_name PARAMS ((void));
+ static tree get_decl_from_op PARAMS ((rtx, int *));
static void output_operand PARAMS ((rtx, int));
#ifdef LEAF_REGISTERS
*************** output_asm_name ()
*** 3289,3292 ****
--- 3290,3336 ----
}
+ /* If OP is a REG or MEM and we can find a decl corresponding to it or
+ its address, return that decl. Set *PADDRESSP to 1 if the decl
+ corresponds to the address of the object and 0 if to the object. */
+
+ static tree
+ get_decl_from_op (op, paddressp)
+ rtx op;
+ int *paddressp;
+ {
+ tree decl;
+ int inner_addressp;
+
+ *paddressp = 0;
+
+ if (GET_CODE (op) == REG)
+ return REGNO_DECL (ORIGINAL_REGNO (op));
+ else if (GET_CODE (op) != MEM)
+ return 0;
+
+ if (MEM_DECL (op) != 0)
+ return MEM_DECL (op);
+
+ /* Otherwise we have an address, so indicate it and look at the address. */
+ *paddressp = 1;
+ op = XEXP (op, 0);
+
+ /* First check if we have a decl for the address, then look at the right side
+ if it is a PLUS. Otherwise, strip off arithmetic and keep looking.
+ But don't allow the address to itself be indirect. */
+ if ((decl = get_decl_from_op (op, &inner_addressp)) && ! inner_addressp)
+ return decl;
+ else if (GET_CODE (op) == PLUS
+ && (decl = get_decl_from_op (XEXP (op, 1), &inner_addressp)))
+ return decl;
+
+ while (GET_RTX_CLASS (GET_CODE (op)) == '1'
+ || GET_RTX_CLASS (GET_CODE (op)) == '2')
+ op = XEXP (op, 0);
+
+ decl = get_decl_from_op (op, &inner_addressp);
+ return inner_addressp ? 0 : decl;
+ }
+
/* Output text from TEMPLATE to the assembler output file,
obeying %-directions to substitute operands taken from
*************** output_asm_insn (template, operands)
*** 3498,3509 ****
for (i = 0; i < ops; i++)
{
! rtx op = operands[oporder[i]];
! tree decl = (GET_CODE (op) == REG ? REGNO_DECL (ORIGINAL_REGNO (op))
! : GET_CODE (op) == MEM ? MEM_DECL (op)
! : 0);
if (decl && DECL_NAME (decl))
{
! fprintf (asm_out_file, "%s %s", wrote ? "," : ASM_COMMENT_START,
IDENTIFIER_POINTER (DECL_NAME (decl)));
wrote = 1;
--- 3542,3553 ----
for (i = 0; i < ops; i++)
{
! int addressp;
! tree decl = get_decl_from_op (operands[oporder[i]], &addressp);
if (decl && DECL_NAME (decl))
{
! fprintf (asm_out_file, "%s %s%s",
! wrote ? "," : ASM_COMMENT_START,
! addressp ? "*" : "",
IDENTIFIER_POINTER (DECL_NAME (decl)));
wrote = 1;