RFR: 8243996: Remove hardcoded field offsets from HotSpot

coleen.phillimore at oracle.com coleen.phillimore at oracle.com
Thu May 14 10:53:26 UTC 2020



On 5/14/20 5:30 AM, Erik Österlund wrote:
> Hi John,
>
> Thank you for reviewing this change and sharing your thoughts.
>
> On 2020-05-13 18:00, John Rose wrote:
>> I like this cleanup!
>>
>> There are new tricky dependencies between the interpreter and other
>> runtime bits, and class loading; they are adequately documented in new
>> comments.
>>
>> A few comments of my own:
>>
>> The whitespace on the new line in vmSymbols.hpp needs to be adjusted to
>> resemble whitespace on neighboring lines.  Hotspot is a jungle of old 
>> code,
>> and our new code needs to blend into that jungle, not make spots of new
>> color (unless of course there is a purpose to some new color).
>
> Ah, missed that. Fixed. Emacs nearly dies every time I open that file; 
> looks like I
> was too eager to get out of that file.
>
>> I don’t want to gripe needlessly about identifier choice, but… maybe I
>> do in this case:  “interpreter_init_code” and 
>> “interpreter_init_code_stub”
>> seem overly cryptic to me; they don’t help me remember what they do.
>> I suggest that“interpreter_init_stubs” and “interpreter_init_code” or
>> “interpreter_init_stub_code” and “interpreter_init_main_code” would
>> be easier on maintainers.  But if it’s just me, leave it as is. We 
>> coders eat
>> cryptic identifiers for breakfast.
>
> Ah yes. Coleen and I have already been through a few rounds of naming 
> for this.
> I started off with initialize1 and initialize2, similar to other 
> initialization functions.
> But Coleen accurately pointed out those names do not reflect what it 
> does. So I
> changed the name to initialize_code_stub and initialize_generate, but 
> Coleen
> accurately pointed out that initialize_generate is grammatically 
> incorrect. So I changed
> it to initialize_code to be grammatically correct yet still state what 
> is being initialized.
> But I agree with you that unfortunately the difference between 
> initializing a code stub
> and code is a bit unclear. I liked your first suggestion more than the 
> second suggestion,
> so let's take that for a spin and see if anyone else wants a different 
> name.
>
>> Can someone remind me (a) which platforms use the C++ interpreter,
>> and (b) how well they are tested?
>
> Unfortunately, I do not know.

Zero uses the C++ interpreter and it's tested by OpenJDK developers.  We 
*should* test it ourselves in mach5 but apparently we don't.
Coleen

>
>> I spot-checked for queries to the hard-coded offsets, and found enough
>> “guarantee(this_offset != 0…)” to make me feel secure.  If there’s a bug
>> related to this change, it’s quite possibly a zero offset being used 
>> on some
>> path in the JVM which is rarely executed.  (Such a bug could be 
>> introduced
>> in the future, right?)  Usually we avoid such bugs by encapsulating 
>> variable
>> state into C++ access functions which perform their own assertions, 
>> rather
>> than requiring users of the variable to make their own checks.
>
> Right.
>
>> Did you look into making all those public variables private, and 
>> wrapping
>> access functions around them?  I think that would make for a more 
>> complete
>> cleanup.  It would touch more places in the interpreter, including 
>> platform
>> code, which I think would be a good thing.  It would (a) allow review 
>> now
>> of dependency checks in the interpreter, and (b) force downstream 
>> porters
>> to similarly review their use of hard-coded offsets.
>
> Indeed I noted that odd old colour, but was not sure I had a strong 
> enough reason to change it to a
> new colour, given the fan out. ;)
>
> Among the public variables you suggest making private, It seems that 
> only the referent is used
> in platform specific code (interpreter), and is used in the same way 
> on all platforms. And the whole point
> of this exercise was to remove *all* dependencies from interpreter 
> code to offset initialization order.
> In other words, before the interpreter code had to explicitly know 
> exactly which offsets it could vs could
> not use, based on whether they were hardcoded or not. Now it can use 
> all offsets as it pleases, by design.
> Therefore I don't think we achieve neither (a) nor (b) by changing 
> this colour to a new one.
>
> Having said that, it certainly is nicer and good practice to make 
> these variables private and use accessor
> functions for them, for stylistic, consistency and encapsulation 
> reasons. I also noticed that half of the
> offset variables use a leading '_' and the others do not, making the 
> code quite inconsistent. I could send
> a new RFR trying to normalize the style of the various offsets in 
> JavaClasses to use a leading '_', be private
> and have an accessor function that asserts offset sanity. What do you 
> think?
>
> Not sure how I got here implementing support for compressed class 
> pointers in the absence of compressed
> oops. Oh dear...
>
> New webrev so far:
> http://cr.openjdk.java.net/~eosterlund/8243996/webrev.02/
>
> Incremental:
> http://cr.openjdk.java.net/~eosterlund/8243996/webrev.01..02/
>
> Thanks,
> /Erik
>
>> — John
>>
>>> On May 13, 2020, at 8:26 AM, Erik Österlund 
>>> <erik.osterlund at oracle.com> wrote:
>>>
>>> Hi,
>>>
>>> Let's remove hardcoded field offsets. Main trick to get this done is 
>>> to split interpreter initialization
>>> into two parts: 1. reserve the interpreter memory, 2. generate the 
>>> interpreter. This allows reserving
>>> it before loading methods (which generates i2c adapters that assert 
>>> things are "in the interpreter",
>>> requiring knowledge about its address range), and then load the 
>>> methods, and then generate the interpreter.
>>> This moving of interpreter code generation until after methods have 
>>> been loaded allows offsets to be
>>> looked up, needed by code generation. That way, we no longer need to 
>>> hardcode field offsets, which
>>> makes it less annoying to change the field layout code in the future.
>>>
>>> Thanks to Coleen for pre-reviewing this.
>>>
>>> Bug:
>>> https://bugs.openjdk.java.net/browse/JDK-8243996
>>>
>>> Webrev:
>>> http://cr.openjdk.java.net/~eosterlund/8243996/webrev.01/
>>>
>>> Thanks,
>>> /Erik
>



More information about the hotspot-dev mailing list