On Mon, Feb 1, 2021 at 5:20 PM Martin Sebor <mse...@gmail.com> wrote:
>
> I have pushed the tree.h comments in g:6a2053773b8.  I will wait
> for an approval of the changes to the manual.

Sorry for not looking earlier.

+/* The scope enclosing the scope NODE, or FUNCTION_DECL for the "outermost"
+   function scope.  Inlined functions are chained by this so that given
+   expression E and its TREE_BLOCK(E) B, BLOCK_SUPERCONTEXT(B) is the scope
+   in which E has been made or into which E has been inlined.   */

I can't really understand what you are trying to say with the second
sentence.  There's
nothing really special about BLOCK_SUPERCONTEXT and inlines so I believe this
sentence only adds confusion.

 #define BLOCK_SUPERCONTEXT(NODE) (BLOCK_CHECK (NODE)->block.supercontext)
+/* Points to the next scope at the same level of nesting as scope NODE.  */
 #define BLOCK_CHAIN(NODE) (BLOCK_CHECK (NODE)->block.chain)
+/* A BLOCK, or FUNCTION_DECL of the function from which a block has been
+   inlined.

... from which a block has been ultimatively copied for example by inlining.

[clones also will have abstract origins]

  In a scope immediately enclosing an inlined leaf expression,
+   points to the outermost scope into which it has been inlined (thus
+   bypassing all intermediate BLOCK_SUPERCONTEXTs). */

?

Maybe:  An inlined function is represented by a scope with
BLOCK_ABSTRACT_ORIGIN being the FUNCTION_DECL of the inlined function
containing the inlined functions scope tree as children.  All abstract origins
are ultimate, that is BLOCK_ABSTRACT_ORIGIN(NODE)
== BLOCK_ABSTRACT_ORIGIN(BLOCK_ABSTRACT_ORIGIN (NODE)).

 #define BLOCK_ABSTRACT_ORIGIN(NODE) (BLOCK_CHECK (NODE)->block.abstract_origin)


> On 1/27/21 5:54 PM, Martin Sebor wrote:
> > Attached is an updated patch for both tree.h and the internals manual
> > documenting the most important BLOCK_ macros and what they represent.
> >
> > On 1/21/21 2:52 PM, Martin Sebor wrote:
> >> On 1/18/21 6:25 AM, Richard Biener wrote:
> >>>> PS Here are my notes on the macros and the two related functions:
> >>>>
> >>>> BLOCK: Denotes a lexical scope.  Contains BLOCK_VARS of variables
> >>>> declared in it, BLOCK_SUBBLOCKS of scopes nested in it, and
> >>>> BLOCK_CHAIN pointing to the next BLOCK.  Its BLOCK_SUPERCONTEXT
> >>>> point to the BLOCK of the enclosing scope.  May have
> >>>> a BLOCK_ABSTRACT_ORIGIN and a BLOCK_SOURCE_LOCATION.
> >>>>
> >>>> BLOCK_SUPERCONTEXT: The scope of the enclosing block, or FUNCTION_DECL
> >>>> for the "outermost" function scope.  Inlined functions are chained by
> >>>> this so that given expression E and its TREE_BLOCK(E) B,
> >>>> BLOCK_SUPERCONTEXT(B) is the scope (BLOCK) in which E has been made
> >>>> or into which E has been inlined.  In the latter case,
> >>>>
> >>>> BLOCK_ORIGIN(B) evaluates either to the enclosing BLOCK or to
> >>>> the enclosing function DECL.  It's never null.
> >>>>
> >>>> BLOCK_ABSTRACT_ORIGIN(B) is the FUNCTION_DECL of the function into
> >>>> which it has been inlined, or null if B is not inlined.
> >>>
> >>> It's the BLOCK or FUNCTION it was inlined _from_, not were it was
> >>> inlined to.
> >>> It's the "ultimate" source, thus the abstract copy of the block or
> >>> function decl
> >>> (for the outermost scope, aka inlined_function_outer_scope_p).  It
> >>> corresponds
> >>> to what you'd expect for the DWARF abstract origin.
> >>
> >> Thanks for the correction!  It's just the "innermost" block that
> >> points to the "ultimate" destination into which it's been inlined.
> >>
> >>>
> >>> BLOCK_ABSTRACT_ORIGIN can be NULL (in case it isn't an inline instance).
> >>>
> >>>> BLOCK_ABSTRACT_ORIGIN: A BLOCK, or FUNCTION_DECL of the function
> >>>> into which a block has been inlined.  In a BLOCK immediately enclosing
> >>>> an inlined leaf expression points to the outermost BLOCK into which it
> >>>> has been inlined (thus bypassing all intermediate BLOCK_SUPERCONTEXTs).
> >>>>
> >>>> BLOCK_FRAGMENT_ORIGIN: ???
> >>>> BLOCK_FRAGMENT_CHAIN: ???
> >>>
> >>> that's for scope blocks split by hot/cold partitioning and only
> >>> temporarily
> >>> populated.
> >>
> >> Thanks, I now see these documented in detail in tree.h.
> >>
> >>>
> >>>> bool inlined_function_outer_scope_p(BLOCK)   [tree.h]
> >>>>     Returns true if a BLOCK has a source location.
> >>>>     True for all but the innermost (no SUBBLOCKs?) and outermost blocks
> >>>>     into which an expression has been inlined. (Is this always true?)
> >>>>
> >>>> tree block_ultimate_origin(BLOCK)   [tree.c]
> >>>>     Returns BLOCK_ABSTRACT_ORIGIN(BLOCK), AO, after asserting that
> >>>>     (DECL_P(AO) && DECL_ORIGIN(AO) == AO) || BLOCK_ORIGIN(AO) == AO).
> >>
> >> The attached diff adds the comments above to tree.h.
> >>
> >> I looked for a good place in the manual to add the same text but I'm
> >> not sure.  Would the Blocks @subsection in generic.texi be appropriate?
> >>
> >> Martin
> >
> >
>

Reply via email to