Den 14-02-2011 15:06, Jonas Maebe skrev:
On 14 Feb 2011, at 14:36, Jeppe Johansen wrote:
Sure, the weak declaration as a procedure directive could be added, and it would indeed be something different from a weakexternal procedure. Weakexternal should stay as it is, a procedure declaration directive. I can see how a "weak" directive could be useful, but I don't need that. I need a linker directive that points to one of two external functions

The reason weakexternal makes sense is because it's a weak undefined symbol reference to some external symbol,

A "weakexternal" declaration by itself is not a reference (weak/undefined or not), neither at the Pascal, C nor at the assembler/object file level. It only says that *if* there is a reference to that symbol, then this reference should be treated as a weak reference.
We mean the same here
which - if it doesn't exist - points to some other external reference. A weak procedure would be almost the same, you just add the default reference as code explicitly

It's the same as the difference between these two declarations in C:

int SayHello(void) __attribute__((weak))
{
  ...
}

and

extern int SayHello() __attribute__((weak));
or
extern int SayHello() __attribute__((weak,alias 'OtherSayHello'));

(this second "alias" form is not supported by all object formats though -- e.g. gcc on Mac OS X warns that it's ignored --, but at the Pascal level it can be emulated by the compiler just like for non-weak alias definitions)
I think you're right. But aliasing weak external references isn't the same as initializing them
The problem with weak is that it's tagged onto a piece of code. So in a case like the one that originally provoked the proposal

 procedure EmptyFunc;
   begin // Empty function
   end;

procedure Func1; weakexternal name 'Func1' default 'EmptyFunc';
procedure Func2; weakexternal name 'Func2' default 'EmptyFunc';

using weak you would need two procedures.

No, because you would be able to combine "weak" and "external" to get the same result as with "weakexternal". Furthermore, there's also the "alias" modifier to add symbol aliases to a definition.

I'm also not sure why you made this remark, because at no point I suggested removing the functionality currently offered by "weakexternal". I only proposed to make the syntax more orthogonal, and to extend the semantics of "weakexternal;"/"weak; external;" so that the "default 'xxx'" specifier is not required while still getting the same effect.
Okay, I understand what you mean. But then something more than "weak" functionality should be added. Aliasing isn't the same, that's what the "default" part does

  procedure EmptyFunc; [public, alias: 'EmptyFunc'];
    begin // Empty function
    end;

procedure Func1; weak; external name 'Func1'; default 'EmptyFunc';
procedure Func2; weak; external name 'Func2'; default 'EmptyFunc';

But I think this way it doesn't make sense. Basically it's just a way to specify a .set assembler directive(which to my knowledge only works for weak external symbols). So there's really no point in having an extra directive. It would be the same as having an extra directive for the import number for windows dll exports in my opinion
_______________________________________________
fpc-devel maillist  -  [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to