On 16 Feb 2011, at 00:42, Jeppe Johansen wrote:

I don't know what you mean about the high level semantics.

Defining the syntax according to high level semantics (which is what GCC does, and what I also want to do in FPC):

 extern int test(void) __attribute__((weak, alias ("xxx")));
and
 function test: cint; cdecl; weak; external name 'xxx';

Both mean "references to the C/Pascal symbol 'test' should be translated into weak references to the symbol 'xxx'". When removing "weak", the semantics stay identical except that the reference is no longer weak. In other words, the syntax is orthogonal. It's high level because this syntax completely ignores what happens at the assembler level with the different high level constructs.


Defining the syntax according to low level semantics, which is what you propose: * the consequence at the assembler level on ELF platforms of calling "test" as declared above but *without* "weak", is a reference to an assembler symbol with the name 'xxx' (so the reference goes to the symbol whose name matches whatever comes after 'name') * when adding "weak", references to the language symbol must keep going to a symbol with name 'xxx' at the assembler level, because that's what happens at the low level if "weak" is not specified * therefore, in the case "weak" is specified, the 'xxx' can no longer be used to specify the external function that is (weakly) referenced by this declaration. Instead, it must specify the name of the assembler level symbol defined by the ".set" directive that's generated for this weak declaration (since that's where references to this weak symbol will go to) * as a result, we need some extra modifier (default in your proposal) to define the external function that is weakly referenced by this declaration

And since simply removing "weak" from a declaration does not turn it into an equivalent normal external declaration (since those don't have a "default" modifier), it is not orthogonal. It's low level because it's completely based on how things work at the assembler level.

I don't think forcing cdecl is a good idea. I think the optimal case would be that weak procedures should just be called by their real name in the default calling convention. I know this is a bit hard to implement(I still haven't found out where that magic happens)


It is not that hard to implement, but that will definitely not be done. Adding special cases like that is simply not how programming languages can be designed. It makes both the compiler more complex (special cases to implement the exceptions) and learning the language harder (special cases that are not explicit in the syntax and which the compiler therefore cannot check, and which you just have to "know"). A small typing convenience (not having to add "cdecl") is no reason to change the normal behaviour of the compiler for a particular feature.


Jonas
_______________________________________________
fpc-devel maillist  -  [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to