Den 15-02-2011 21:40, Jonas Maebe skrev:
On 15 Feb 2011, at 20:13, Jeppe Johansen wrote:

Den 15-02-2011 19:31, Jonas Maebe skrev:
I don't understand why you again propose to change the meaning of "external name 'xxx'" 
for weak symbols. As I mentioned in my previous mail, for consistency reasons something like that 
will not be done. I also don't see the advantage of inventing a new syntax ("weak 
default") when existing modifiers can already express the required semantics.
I don't propose changes.
"external name 'xxx'" means more or less the same as "__attribute__((alias "xxx"))" in 
gcc (it's slightly different, because in gcc the "xxx" must be a symbol known to the compiler at compile 
time):

1) aliased external declaration
in gcc:
   extern int test(void) __attribute__((alias ("xxx")));
in fpc:
   function test: cint; cdecl; external name 'xxx';

2) regular weak external declaration
in gcc:
   extern int test(void) __attribute__((weak));
in fpc:
   function test: cint; cdecl; weak; external;

3) aliased weak external declaration
in gcc:
   extern int test(void) __attribute__((weak, alias ("xxx")));
in fpc:
   function test: cint; cdecl; weak; external name 'xxx';
I suppose you mean weakexternal in those examples, or are they just examples of an ideal future case?
While keeping the first two points the same, you propose to make this third 
case in fpc, :

   function test: cint; cdecl; weak default 'xxx';
or
   function test: cint; weak default 'xxx'; external name 'test'; // not 
entirely correct, on several platforms this should be '_test' instead
That is precisely what I propose. I think that in the low-level cases where I think this feature is beneficial, it's enough to have control over names with the "external name" directive
This changes the meaning of "external" when combined with "weak", since it no 
longer specifies the external symbol to which this particular declaration refers. Please look at it 
from the standpoint of high level language semantics, not based on the assembler level 
implementation on ELF platforms.
Nothing is changed. Absolutely nothing is changed in the way external works

function testimpl: cint; [public, alias: 'test'];
  begin
  end;

function xxx: cint; [public, alias: 'xxx'];
  begin
  end;


function test1: cint; external name 'test';
function test2: cint; weak default 'xxx'; external name 'test';
function test3: cint; weak default 'xxx'; external name 'notest';

test1 and test2 call testimpl, and test3 call xxx

I don't know what you mean about the high level semantics.
You might also note the problem in the example
   //  a) on Linux
   //   .weak P$TestProc
   //   .set  P$TestProc, NoHandler
   //   .weak TestProc
   //   .set  TestProc, NoHandler

If you then somewhere else defines TestProc, then yes, calls to the assembler 
symbol TestProc will resolve to TestProcHandler. But if you call TestProc 
directly, in the pascal sense, then it would call P$TestProc which hasn't been 
overriden and thus points to NoHandler
That's correct, so allowing "alias" in combination with "weak; external;" is probably not a good 
idea. Requiring cdecl is probably the best way, although I'm not sure yet what to do with non-external weak definitions 
then, because the symbol names of non-external cdecl routines are normally not mangled C-style by the compiler (after 
all, nothing prevents you from having overloaded routines that all use the cdecl calling convention). If 
"public" or "export" is added to a cdecl declaration, then the C-style mangled name is added as an 
alias, but that's not good enough here because it suffers from the same problem (Pascal-level calls to the routine will 
use the Pascal-mangled name rather than the C-style mangled one).

Only setting the C-style mangled name in case of "cdecl; weak;" non-external 
definitions is a possibility, but it's not very nice because it's inconsistent with 
normal operation.
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)
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to