On Wed, 2003-09-10 at 20:11, David Dawes wrote:
John> wrapper. So as long as we've already lost module
John> independence by virtue of linking the system function why
John> not go all the way and use the system definition of the
John> system function's argument? It seems like
David> We haven't lost module independence by doing that.
Perhaps I'm misunderstanding module independence, can you confirm or
deny some of the assumptions I've been working with:
1) System specific functions are wrapped in an xf86* wrapper so that:
a) system differences are isolated at a single point which provides
a common interface to the rest of the server
b) all system specific functions are wrapped and live in the
executable XFree86. The XFree86 executable is linked against
the system libraries and hence the XFree86 executable is not
system independent.
2) module independence derives from the following:
a) modules only link against (e.g. import) from the XFree86
executable that loaded it. In other words all system
specific elements are contained in the executable, not a
loaded module.
b) The executable and modules share the same linking,
relocation, exception, and call conventions. This makes
a module mostly system independent, but not 100%, e.g.
its possible, but not common, for different OS's on the same
architecture to have a different ABI, but less common today
as the industry is converging on standardized ABI's.
Is the above basically correct?
If so then by directly linking a reference to the system's setjmp call
in a module haven't we violated the notion that only the main
executable has dependencies on the system libraries? The module is now
making a call whose parameters and behavior is specific to the
system. Actually, more correctly, its specific to the how the main
executable was linked (which is system specific), see below for why
this is true.
David> All that matters is that the jmp_buf type be defined on
David> each architecture in such a way that it meets the
David> requirements of all the supported OSs on that architecture.
David> Newer architectures are more likely to have a
David> platform-independent ABI anyway than was necessarily true
David> in the past. If the platform's <setjmp.h> can define the
David> type with the correct alignment, then so can we. It
David> doesn't matter if the methods for doing this are
David> compiler-specific. If the 128-bit alignment is an IA64 ABI
David> requirement, then I'd expect that all complilers for IA64
David> will have a method for defining jmp_buf with the correct
David> alignment.
If I following your reasoning then you would be happy with this
definition in xf86_libc.h
/* setjmp/longjmp */
#if defined(__ia64__)
typedef int xf86jmp_buf[1024]; __attribute__ ((aligned (16))); /* guarantees 128-bit
alignment! */
#else
typedef int xf86jmp_buf[1024];
#endif
But if one is going to special case the definition of jmp_buf based on
architecture why not use the system definition and typedef xf86jmp_buf
to be jmp_buf? I suspect the answer will be that the system libraries
could change requiring a different size buffer. I'd buy that if it
weren't for the fact we are directly linking the library specfic
version of setjmp into the module.
Why a module referencing setjmp is tied to a specific system library:
---------------------------------------------------------------------
As far as I can tell we've tied the module to a specific system
library. Here is why I believe this. I'm going to simplify the
discussion by assming there is only one xf86set_jmp symbol and ignore
the type 0 and type 1 variants that select setjmp or sigsetjmp.
1) a module makes a reference to xf86set_jmp.
2) the xfree86 loader when it loads that module searches for that
symbol in its hash table of symbols, that table was populated in
part by the table in xf86sym.c which in a loadable build contains
this definition in the main executable:
#include <setjmp.h>
SYMFUNCALIAS("xf86setjmp",setjmp)
3) the above definition means when the symbol name "xf86setjmp" is
looked up by the loader it will get the address of setjmp that was
linked into the main executable. This is the function address that
the xfree86 loader will insert into module during its relocation
phase.
4) How does the address of setjmp get into the main executable? It
depends on whether the main executable was statically or
dynamically linked, but in either case the system will assure it
comes from a specific version of the library defined at the time
the main executable was linked.
5) Therefore when a module that referenced setjmp is called its
calling the system version of setjmp in the exact library when the
main executable was linked.
I don't see how the above satisfies the conception of module
independence and by extension the avoidence of using the system
specfic typedef's in force when the main executable was linked.
_______________________________________________
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel