[PATCH] pch: Add support for PCH for relocatable executables
Jakub Jelinek
jakub@redhat.com
Tue Nov 9 14:58:47 GMT 2021
On Tue, Nov 09, 2021 at 09:41:08AM -0500, Andrew MacLeod wrote:
> Yeah, Im not particular about how we do this... I think thats perfectly
> reasonable. Would something like the following solve this issue?
Yes, but see below.
> commit 17a5b03c95549b5488bc8dd2af4f6e2cc9ddf098
> Author: Andrew MacLeod <amacleod@redhat.com>
> Date: Tue Nov 9 09:29:23 2021 -0500
>
> Keep x_range_query NULL for global ranges.
>
> Instead of x_range_query alwasy pointing to an object, have it default to
> NULL and return a pointer to the global query in that case.
>
> * function.c (allocate_struct_function): Set x_range_query to NULL.
> * function.h (get_range_query): Return context query or global.
> * gimple-range.cc (enable_ranger): Check current query is NULL.
> (disable_ranger): Clear function current query field.
> * value_query.cc (global_range_query_ptr): New.
> * value-query.h (global_ranges): Remove.
>
> diff --git a/gcc/function.c b/gcc/function.c
> index af3d57b32a3..8768c5fcf22 100644
> --- a/gcc/function.c
> +++ b/gcc/function.c
> @@ -4874,7 +4874,7 @@ allocate_struct_function (tree fndecl, bool abstract_p)
> cfun->debug_nonbind_markers = lang_hooks.emits_begin_stmt
> && MAY_HAVE_DEBUG_MARKER_STMTS;
>
> - cfun->x_range_query = &global_ranges;
> + cfun->x_range_query = NULL;
This isn't needed, at the start of function we do
cfun = ggc_cleared_alloc<function> ();
which already zero initializes the whole structure, including x_range_query.
So instead this can be removed.
> --- a/gcc/function.h
> +++ b/gcc/function.h
> @@ -725,7 +725,9 @@ extern void used_types_insert (tree);
> ATTRIBUTE_RETURNS_NONNULL inline range_query *
> get_range_query (const struct function *fun)
> {
> - return fun->x_range_query;
> + // From value-query.h
> + extern range_query *global_range_query_ptr;
> + return fun->x_range_query ? fun->x_range_query : global_range_query_ptr;
Wouldn't it be better to do:
extern range_query global_ranges;
return fun->x_range_query ? fun->x_range_query : &global_ranges;
I think declaring a variable extern can be done with incomplete type
and &var is cheaper than ptr, because for the latter you need to
read the pointer value from memory, while for &var you can just
compute the address of the var which you need to compute for reading
ptr from memory too.
Jakub
More information about the Gcc-patches
mailing list