On 01/11/16 16:48, Jason Merrill wrote:
On Tue, Nov 1, 2016 at 11:59 AM, Jiong Wang <jiong.w...@foss.arm.com> wrote:
On 01/11/16 15:24, Jason Merrill wrote:
On Tue, Nov 1, 2016 at 11:12 AM, Jiong Wang <jiong.w...@foss.arm.com> wrote:
On 31/10/16 19:50, Jason Merrill wrote:
On 10/21/2016 04:30 AM, Jiong Wang wrote:
All DW_OP_* of the expression are grouped together inside the PARALLEL,
and those operations which don't have RTL mapping are wrapped by
UNSPEC.  The parsing algorithm is simply something like:

    foreach elem inside PARALLEL
      if (UNSPEC)
        {
          dw_op_code = INTVAL (XVECEXP (elem, 0, 0));
          oprnd1 = INTVAL (XVECEXP (elem, 0, 1));
          oprnd2 = INTVAL (XVECEXP (elem, 0, 2));
        }
      else
        call standard RTL parser.

Any comments on the approach?
If you're going to use UNSPEC, why not put the DWARF operator in the
second operand?
    Thanks for the review, but I still don't understand your meaning.

    Do you mean I should simply put the DWARF operator at XVECEXP
(UNSPEC_RTX, 0, 2) instead of at XVECEXP (UNSPEC_RTX, 0, 0)
No, at XINT (UNSPEC_RTX, 1).  The documentation of UNSPEC says,

/* A machine-specific operation.
     1st operand is a vector of operands being used by the operation so
that any needed reloads can be done.
     2nd operand is a unique value saying which of a number of
machine-specific operations is to be performed.
Aha, understood now, thanks for the clarification.

You mean we simply reuse the UNSPEC number field, so the RTX will be

       (UNSPEC
          [((reg) (reg)]
        DW_OP_XXX)

Yeah, I do have tried to do that, but later give up, one reason I remember is 
suppose we
want to push two value on the stack, the second value is an address, which we 
want a
follow up DW_OP_deref to operate on that. then the value expression will be

    (set (reg A)
     (parallel
       [(reg A)

         (UNSPEC
           [DW_OP_deref, const0_rtx, const0_rtx]
         UNSPEC_PRIVATE_DW);

        (UNSPEC
          [DW_OP_XXX (const0_rtx) (const0_rtx)]
         UNSPEC_PRIVATE_DW))

And there might be some other expressions we need some complex RAW encoding,
Why can't you do this putting the OP in the number field of both UNSPECs?

I was demoing the RTX based on my current approach, and simplfy want to say we only need to define one unspec number (UNSPEC_PRIVATE_DW), while if we putting the OP in the number field of both UNSPECs, we need two unspec number, and we might need more for other similar expressions.

If we don't need to worry about the conflicts, then your suggestion is definitely better. I will do more tests
on this.

Besides this issue, do you think the PARALLEL + UNSPEC based approach to represent DWARF RAW expression is acceptable?

Thanks.

Regards,
Jiong


so it seems to me if we want to offer user the most general way to do this, 
then it's
better to encode the DWARF operation inside UNSPEC as reuse the UNSPEC number 
then you need to make
sure there is no overlap with other backend UNSPEC enumeration number.
It seems to me that a CFA_*expression note would never use target
UNSPEC codes, and a DWARF UNSPEC would never appear outside of such a
note, so we don't need to worry about conflicts.

Jason

Reply via email to