diff --git a/gcc_component_ref.patch b/gcc_component_ref.patch index 7ac44f1..0b0704f 100644 --- a/gcc_component_ref.patch +++ b/gcc_component_ref.patch @@ -1,7 +1,45 @@ From ab8884cbf3712f939556fc7789bbf32132c7ff1a Mon Sep 17 00:00:00 2001 From: York Jasper Niebuhr Date: Fri, 17 Oct 2025 22:04:41 +0200 -Subject: [PATCH] PLUGIN_BUILD_COMPONENT_REF callback +Subject: [PATCH] Add PLUGIN_BUILD_COMPONENT_REF callback + +This patch adds the PLUGIN_BUILD_COMPONENT_REF callback, which is invoked +by the C front end when a COMPONENT_REF node is built. The callback +receives a pointer to the COMPONENT_REF tree (of type 'tree *'). Plugins +may replace the node by assigning through the pointer, but any +replacement must be type-compatible with the original node. + +The callback allows plugins to observe or instrument struct member +accesses that would otherwise be lost due to folding before the earliest +possible plugin pass or hook. In particular, the fold_offsetof +functionality removes all traces of type and member information in +offsetof-like trees, leaving only an integer constant for plugins to +inspect. + +A considered alternative was to disable fold_offsetof altogether. +However, that prevents offsetof expressions from qualifying as +constant-expressions; for example, static assertions can no longer be +evaluated if they contain non-folded offsetof expressions. The callback +provides fine-grained control over individual COMPONENT_REFs instead of +universally changing folding behavior. + +A typical use case would be to replace a select set of COMPONENT_REF +nodes with type-compatible expressions calling a placeholder function, +e.g. __deferred_offsetof(type, member). These calls cannot be folded +away and thus remain available for plugin analysis in later passes. +Offsets not of interest can be left untouched, preserving their const +qualification and use in static assertions. + +Allowing PLUGIN_BUILD_COMPONENT_REF to alter COMPONENT_REF nodes required +minor adjustments to fold_offsetof, which assumes a specific input +format. Code paths that cannot guarantee that format should now use +fold_offsetof_maybe(), which attempts to fold normally but, on failure, +casts the unfolded expression to the desired output type. + +If the callback is not used to alter COMPONENT_REF trees, there is **no +change** in GCC’s behavior. + +Signed-off-by: York Jasper Niebuhr --- gcc/c-family/c-common.cc | 48 +++++++++++++++++++++++++++++++---------