On Mar 13, 2012, at 9:57 PM, Gary Funck wrote:
> On 03/06/12 14:09:23, Tristan Gingold wrote:
>> The patch is simple: the C front-end will now calls
>> c_build_pointer_type (instead of build_pointer_type), which in
>> turn calls build_pointer_type_for_mode using the right mode.
> [...]
>
> Joining this discussion a bit late ... I have a few questions.
> This change impacts the GUPC branch, mainly because UPC introduces
> pointers that are generally larger than conventional "C" pointers,
> and thus some changes were needed in the "build pointer" area,
> and that logic needed to be adjusted to work with this patch.
>
> Here is the new c_build_pointer_type. It a static function
> constrained to be called from within the c-decl.c file wehre
> it resides.
>
> static tree
> c_build_pointer_type (tree to_type)
> {
> addr_space_t as = to_type == error_mark_node? ADDR_SPACE_GENERIC
> : TYPE_ADDR_SPACE (to_type);
> enum machine_mode pointer_mode;
>
> if (as != ADDR_SPACE_GENERIC || c_default_pointer_mode == VOIDmode)
> pointer_mode = targetm.addr_space.pointer_mode (as);
> else
> pointer_mode = c_default_pointer_mode;
> return build_pointer_type_for_mode (to_type, pointer_mode, false);
> }
>
> Here is the old build_pointer_type() in tree.c. It is external/public
> and is called from various places.
>
> tree
> build_pointer_type (tree to_type)
> {
> addr_space_t as = to_type == error_mark_node? ADDR_SPACE_GENERIC
> : TYPE_ADDR_SPACE (to_type);
> enum machine_mode pointer_mode = targetm.addr_space.pointer_mode (as);
> return build_pointer_type_for_mode (to_type, pointer_mode, false);
> }
>
> c_build_pointer_type () introduces c_default_pointer_mode
> and uses it as long as:
> as == ADDR_SPACE_GENERIC && c_default_pointer_mode != VOIDmode
> but build_pointer_type will not use c_default_pointer_mode.
>
> My first question is: are there still contexts where build_pointer_type()
> is called to compile "C" statements/expressions for cases not
> covered by the calls within c-decl.c?
Yes. In the discussion, Joseph Myers has pointed them.
Some of them are bugs (but should be replaced by build_pointer_type_for_mode),
others aren't incorrect (e.g. for built-in functions).
Currently c_build_pointer_type is called for user declared pointer types.
> I ask, because we tried
> moving our checks for UPC pointer-to-shared types from
> build_pointer_type() into only c_build_pointer_type() and
> ran into calls to build_pointer_type() that still passed
> in UPC pointer-to-shared typed objects. What this may
> indicate is that there are situations where the new
> c_default_pointer_mode may need to be applied when
> build_pointer_type() is called. I don't recall off-hand
> when these situations came up, but it might be easy enough
> to put some assertions in build_pointer_type() and then
> run the "C" test suite and see what turns up.
I think we should discuss these cases. From my current understanding, these
direct calls that affect you are currently bugs.
Once I completed the VMS patch submission, I would add some tests to check
the handling of pointer modes.
> Thus, I wonder if it might not be best to generalize
> build_pointer_type() instead of introducing c_build_pointer_type()
> and dealing with any "C" specific checks (somehow) there?
I am almost sure that this is not correct. build_pointer_type is part of the
middle end, where the 'pragma pointer_size' doesn't apply and the ptr_mode
should be used.
Tristan.