On 12 Jan 2011, at 19:16, Jeppe Johansen wrote:
> Den 12-01-2011 12:42, Jonas Maebe skrev:
>>
>> How is it normally done in C? At first sight, using the weakexternal
>> directive to /define/ symbols seems like a wrong approach.
>>
> With C it's done using compiler dependent attributes. With gcc you can do it
> using __attribute__((weak,alias("SomeFunction")));. Though often it'll just
> be done using assembler using the .weak and .set/thumb_set directives
FPC also has an "alias" procedural directive, so that one should probably be
used instead. Giving weakexternal (or anything else) a syntax that is not used
for any other procedure directive is not a good idea because it reduces
uniformity.
> The weakexternal directive already "defines" a symbol, it will exist at
> runtime, but it might be nil.
What I meant is that there is a semantic difference between referencing a
symbol that may or may not be defined somewhere else (regardless of whether a
programmer or the linker creates the referenced symbol), and defining a new
symbol. This is independent of whether a symbol is weak or not.
Defining a weak symbol also exists, but is not yet supported by FPC. In fact,
the example you gave would seem more logical to me as follows (assuming that
FPC could define "weak" symbols using the "weak" modifier):
procedure IRQHandler; weak;
begin
{ default dummy implementation, the "NoHandler" from your example }
end;
procedure MyIRQHandler; public; alias: 'IRQHandler';
begin
{ real implementation, overrides the weak definition of IRQHandler; if
there
is no such definition, the dummy one is used }
end;
(and of course, if we'd have a plain "weak" modifier, then "weakexternal;"
could be "weak; external;", although this is annoying to still change because
"weakexternal" support is already in released FPC versions)
If you have no control over the original definition and it is not weak (maybe
the reason you did that is because FPC does not yet support defining weak
symbols), then we indeed need some way to define weak symbols whose "default
value" is something else than nil, because I guess wrapping is not good enough
(although it's not that bad, since it only results in an extra call in the case
where the weak symbol is not replaced):
procedure NoHandler;
begin
{ dummy implementation }
end;
procedure MyIRQHandler; weak;
begin
{ default behaviour: one extra call }
NoHandler;
end;
{ overriding implementation }
procedure RealIRQHandler; public; alias: 'MyIRQHandler';
begin
{ real code }
end;
I can't immediately think of a good syntax to directly define MyIRQHandler as a
weak symbol with the address of NoHandler as default value. Maybe this,
although I'm not 100% happy with it either:
procedure MyIRQHandler; weak 'NoHandler';
Jonas_______________________________________________
fpc-devel maillist - [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel