RFR(L) 8026054: New type profiling points: type of return values at calls

Roland Westrelin roland.westrelin at oracle.com
Fri Oct 11 01:32:06 PDT 2013


Hi Chris,

>>> +           ciTypeEntriesAtCall* args_and_ret = data->is_CallTypeData() ? ((ciCallTypeData*)data)->args_and_ret() : ((ciVirtualCallTypeData*)data)->args_and_ret();
>>> 
>>> !   const TypeEntriesAtCall* args_and_ret() const { return &_args_and_ret; }
>>> 
>>> I should've mentioned this in the previous review but can't we make args_and_ret() a virtual method?
>> 
>> In what class? ProfileData?
> 
> I don't know; I've lost track of the class hierarchy.  If the class hierarchy is sane there must be a super class that's suitable.
> 
>> Wouldn't that expose some implementation details at a level where they don't make much sense. Also on ci* side, there's no common root class and we probably don't want ci* stuff to leak in methodData.hpp.
> 
> Why isn't there a common super class in ci?

The common class in ci is ProfileData. 

There are places where I test:
data->is_CallTypeData() || data->is_VirtualCallTypeData()
to find out whether type profiling is on. This one I could replace with a virtual method in ProfileData. is_profiling_types_at_call() maybe.

Other candidates are:
has_return()
number_of_arguments()
args_data_offset()

What would they become if they were virtual methods in ProfileData? at_call_and_has_return()? has_return() doesn't make any sense in ProfileData because it is the common class for all profiling. There is no common class for calls.

And then what about these:
args() which returns a ciTypeStackSlotEntries*
ret() which returns a ciReturnTypeEntry*

They would need to be virtual in ProfileData but return objects from ci? That doesn't seem right.

Or we could add static methods to TypeEntriesAtCall and hide the tests there:

static bool has_return(ProfileData* data) {
  assert(data->is_profiling_types_at_call(), "");
  return data->is_CallTypeData() ? ((ciCallTypeData*)data)->has_return() : ((ciVirtualCallTypeData*)data)->has_return();
}

has_return() makes sense in the context of TypeEntriesAtCall. I don't think it does in ProfileData.

Roland.


More information about the hotspot-compiler-dev mailing list