Den 15-02-2011 19:31, Jonas Maebe skrev:
On 15 Feb 2011, at 19:01, Jeppe Johansen wrote:

What about allowing a new keyword "weak" and let it have two forms(something 
like you suggested back in one of the mails from 12th january)? Name mangling is an issue 
of course. It would be easiest to handle if weak symbols simply weren't name 
mangled(something like cdecl and co)
weakexternal can already be combined with cdecl. weak+external could also be combined with cdecl. 
As an aside, cdecl is not the same as "no mangling". It means "mangle the same as 
the C compiler", which varies from platform to platform.

procedure TestProc; weak; // This produces a weak symbol
  begin
  end;

procedure TestProc2; weak default 'SomeDefaultFunction'; // Weak+default makes 
the declaration external by default
procedure TestProc3; weak default 'SomeDefaultFunction'; external name 
'Test_TestProc3'; // Overcome eventual name mangling problems. Symbol is called 
Test_TestProc3 and is linked to SomeDefaultFunction if not resolved at linktime
procedure TestProc4; weak; external; // Replaces/does the same as weakexternal
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. I might just formulate it in a way that make it seem so. Actually, if you go by the example in your previous mail you would have to change the meaning of "external name 'xxx'" external name 'xxx'; means that you "change" the name of an unresolved symbol into xxx so function calls to that procedure will go to xxx(and in that way make it an unresolved symbol). In your example you used external name 'NoHandler'; which of course will be resolved, and all the weak stuff will be ignored

.weak xxx
will then mark an unresolved weak
.set xxx, NoHandler
will then make a weak symbol point to NoHandler if it can't be resolved

The problem I have with the alias solution is that to practically use it you would have to change the way alias works weak symbols. Alias simply declares an extra global label, it doesn't invoke .set

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
_______________________________________________
fpc-devel maillist  -  [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to