about non-compatible optimization (was: Re: patch to bring java vtables closer to g++ abi conformance)

Andrew Haley aph@cambridge.redhat.com
Tue Jan 29 03:56:00 GMT 2002


Tuomas Leikola writes:
 > 
 > ----- Original Message -----
 > From: "Bryce McKinlay" <bryce@waitaki.otago.ac.nz>
 > To: "Tuomas Leikola" <tuomas.leikola@digia.com>
 > Cc: <java@gcc.gnu.org>; <shudo@computer.org>
 > Sent: Tuesday, January 29, 2002 2:25 AM
 > Subject: Re: about non-compatible optimization (was: Re: patch to bring java
 > vtables closer to g++ abi conformance)
 > 
 > 
 > > However the real reason static is so
 > > much slower here is due to GCJ adding a class initialization check to
 > > the start of every static method. I think we can do better by putting
 > > this check at the call site rather than in the method.
 > 
 > ouch. is there a way to avoid this? -finitialize-all-classes-at-startup or
 > something
No, because it's vital that classes are initialized in correct
dependency order. This avoids the nasty C++ problem with dependency
order between static initializers.
The Right Way to solve this problem, IMO, is to have two entry points
to each method, like this:
bar.foo:
 call InitializeClass (bar)
bar.foo.alreadyinitialzed:
 ... the rest
And the single level of indirection that we already have for calls
into shared objects suffices here: we just rewrite the entry in the
PLT. For statically linked programs we'd need to add the indirection,
or maybe we could rewrite the actuall calling instruction itself
(eek!)
However, I don't think that gcc has any general-purpose means to do
this. There are mechanisms to allow multiple entry points which are
back-end specific, for example to optimize stack alignment. We could
use the same technique in a machine dependent way. 
However, I'd much prefer to solve the problem in a way that is useful
for all target architectures.
Andrew.


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /