[BC ABI] gcj-abi-2-dev-branch created
Bryce McKinlay
mckinlay@redhat.com
Tue Apr 20 14:08:00 GMT 2004
Tom Tromey wrote:
>>>>>>"Bryce" == Bryce McKinlay <mckinlay@redhat.com> writes:
>>>>>>>>>>>>>>Bryce> OK, you might be right. With the BC-ABI, the mangling isn't really all
>Bryce> that important since the symbols will be private, the compiler could
>Bryce> call them whatever it likes since the runtime can do all the
>Bryce> linking. As for the standard ABI, instead of actually changing the
>Bryce> mangling format I think it should be sufficient to add something like
>Bryce> "$$return_type" to a method name in the cases where conflicts
>Bryce> occur. This should allow us to keep generating .h files for CNI
>Bryce> without having to dramatically alter either CNI or the C++ compiler.
>>I have a few questions about how CNI is going to continue to function.
>>One question is how CNI code will contribute to the otable. That
>seems like a major problem.
>>For mangling, Andrew had the idea that we would emit static
>initializers to register CNI methods with the runtime, basically akin
>to JNI function registration. So perhaps that problem is
>solved-enough.
>>
Yeah, we will have to do something like that. One possibility I'm
considering is extending the use of the .jcr class registration
mechanism, so that it can register methods in addition to classes. We
need to find a way of registering method IPs that does not get messed up
by the PLT anyway (for the stack tracing code), so maybe this can solve
both problems.
>The point you bring up is an important one. If CNI can contribute to
>the otable, then we just need to teach g++ about our own weird
>mangling (or add an attribute or something). That might work.
>>
I don't think we need to change C++'s mangling at all. We'll just have
gcjh append something to the method names. For example:
package foo;
Object getFoo()
String getFoo()
becomes
foo::getFoo$$Object
foo::getFoo$$String
>Another idea would be to declare that CNI can't work with BC code. \
>
IMO, this is not an option.
>Bryce> As an aside, I'm not really sure that we need to keep the "covariant
>Bryce> bridge methods" at all when generating .o output. I haven't discovered
>Bryce> a situation yet where the bridge methods generated by the compiler do
>Bryce> anything more than call the real method?
>>We talked about this on irc, but I thought I'd put the answer out to a
>wider audience. The bridge methods are needed for runtime type
>safety, and if you omit them, then at runtime you can perform invalid
>unchecked casts.
>>The example:
>> class base<T> {
> public T obj;
> public void set (T x) { obj = x; }
> }
>> case der extends base<String> {
> public void set (String x) { x.something(); }
> }
>> der foo;
> base oops = foo; // this gets a compiler warning but is correct
> oops.set (new Object ()); // remember we omitted the bridge, so
> // no cast to String is performed
>>Ordinarily the compiler would generate a `der.set' that looks like:
>> public void set (Object x) { this.set((String) x); }
>>
I remain unconvinced ;-). The bridge method which adds a cast check is
certainly neccessary in this case, however I have yet to see a case
where bridge methods with __covariant return types__ are used in this
way. As far as I can tell so far, the bridge methods for co-variant
returns are only inserted for VM compatibility.
For example, given:
class Foo
{
Foo get() {return new Foo();}
}
class Bar extends Foo
{
Bar get() {return new Bar();}
}
The compiler must insert a bridge method in Bar with declared type Foo.
The reason for this is that in order for Bar.get to override Foo.get in
the JVM, the signatures must match, and in a class file the return type
is part of the method signature. So the bridge method overrides
Foo.get() and does an invokevirtual to the real Bar.get(). There are no
type safety issues because the return type of Bar.get() must _always_ be
compatible with Foo.get().
I've been wrong about such things before though, so if anyone has a
counter example, I'd like to see it ;-)
Regards
Bryce
More information about the Java
mailing list