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.