Add comments to struct cgraph_thunk_info

This commit adds comments to fields in the cgraph_thunk_info structure
declaration from cgraph.h.  They will hopefully answer questions that
people like myself can ask while discovering the thunk machinery.  I
also made an assertion stricter in cgraph_node::create_thunk.

Bootsrapped and regtested on x86_64-linux.

gcc/

	* cgraph.h (cgraph_thunk_info): Add comments.
	* cgraph.c (cgraph_node::create_thunk): Adjust comment, make
	assert for VIRTUAL_* arguments stricter.

From-SVN: r252828
This commit is contained in:
Pierre-Marie de Rodat 2017-09-15 16:20:21 +00:00 committed by Pierre-Marie de Rodat
parent ed17cb57b8
commit a3e61d61ba
3 changed files with 50 additions and 9 deletions

View File

@ -1,3 +1,9 @@
2017-09-15 Pierre-Marie de Rodat <derodat@adacore.com>
* cgraph.h (cgraph_thunk_info): Add comments.
* cgraph.c (cgraph_node::create_thunk): Adjust comment, make
assert for VIRTUAL_* arguments stricter.
2017-09-15 Jackson Woodruff <jackson.woodruff@arm.com>
PR tree-optimization/71026

View File

@ -603,7 +603,7 @@ cgraph_node::create_same_body_alias (tree alias, tree decl)
/* Add thunk alias into callgraph. The alias declaration is ALIAS and it
aliases DECL with an adjustments made into the first parameter.
See comments in thunk_adjust for detail on the parameters. */
See comments in struct cgraph_thunk_info for detail on the parameters. */
cgraph_node *
cgraph_node::create_thunk (tree alias, tree, bool this_adjusting,
@ -619,13 +619,17 @@ cgraph_node::create_thunk (tree alias, tree, bool this_adjusting,
node->reset ();
else
node = cgraph_node::create (alias);
gcc_checking_assert (!virtual_offset
|| wi::eq_p (virtual_offset, virtual_value));
/* Make sure that if VIRTUAL_OFFSET is in sync with VIRTUAL_VALUE. */
gcc_checking_assert (virtual_offset
? wi::eq_p (virtual_offset, virtual_value)
: virtual_value == 0);
node->thunk.fixed_offset = fixed_offset;
node->thunk.this_adjusting = this_adjusting;
node->thunk.virtual_value = virtual_value;
node->thunk.virtual_offset_p = virtual_offset != NULL;
node->thunk.alias = real_alias;
node->thunk.this_adjusting = this_adjusting;
node->thunk.virtual_offset_p = virtual_offset != NULL;
node->thunk.thunk_p = true;
node->definition = true;

View File

@ -629,17 +629,48 @@ extern const char * const cgraph_availability_names[];
extern const char * const ld_plugin_symbol_resolution_names[];
extern const char * const tls_model_names[];
/* Information about thunk, used only for same body aliases. */
/* Sub-structure of cgraph_node. Holds information about thunk, used only for
same body aliases.
Thunks are basically wrappers around methods which are introduced in case
of multiple inheritance in order to adjust the value of the "this" pointer
or of the returned value.
In the case of this-adjusting thunks, each back-end can override the
can_output_mi_thunk/output_mi_thunk target hooks to generate a minimal thunk
(with a tail call for instance) directly as assembly. For the default hook
or for the case where the can_output_mi_thunk hooks return false, the thunk
is gimplified and lowered using the regular machinery. */
struct GTY(()) cgraph_thunk_info {
/* Information about the thunk. */
/* Offset used to adjust "this". */
HOST_WIDE_INT fixed_offset;
/* Offset in the virtual table to get the offset to adjust "this". Valid iff
VIRTUAL_OFFSET_P is true. */
HOST_WIDE_INT virtual_value;
/* Thunk target, i.e. the method that this thunk wraps. Depending on the
TARGET_USE_LOCAL_THUNK_ALIAS_P macro, this may have to be a new alias. */
tree alias;
/* Nonzero for a "this" adjusting thunk and zero for a result adjusting
thunk. */
bool this_adjusting;
/* If true, this thunk is what we call a virtual thunk. In this case:
* for this-adjusting thunks, after the FIXED_OFFSET based adjustment is
done, add to the result the offset found in the vtable at:
vptr + VIRTUAL_VALUE
* for result-adjusting thinks, the FIXED_OFFSET adjustment is done after
the virtual one. */
bool virtual_offset_p;
/* ??? True for special kind of thunks, seems related to instrumentation. */
bool add_pointer_bounds_args;
/* Set to true when alias node is thunk. */
/* Set to true when alias node (the cgraph_node to which this struct belong)
is a thunk. Access to any other fields is invalid if this is false. */
bool thunk_p;
};
@ -983,7 +1014,7 @@ public:
/* Add thunk alias into callgraph. The alias declaration is ALIAS and it
aliases DECL with an adjustments made into the first parameter.
See comments in thunk_adjust for detail on the parameters. */
See comments in struct cgraph_thunk_info for detail on the parameters. */
cgraph_node * create_thunk (tree alias, tree, bool this_adjusting,
HOST_WIDE_INT fixed_offset,
HOST_WIDE_INT virtual_value,