gcl-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gcl-devel] gclcvs


From: Camm Maguire
Subject: [Gcl-devel] gclcvs
Date: Fri, 06 Apr 2007 18:25:06 -0400
User-agent: SEMI/1.14.3 (Ushinoya) FLIM/1.14.3 (Unebigory ōmae) APEL/10.3 Emacs/21.2 (i386-debian-linux-gnu) MULE/5.0 (SAKAKI)

Greetings!  gcl uses a homemade address lookup table for functions it
directly writes into C sources files to be compiled and loaded into
the running image.  The code looks like this:

typedef struct {
  const char *n;
  unsigned long ad;
} Plt;

#define MY_PLT(a_) {#a_,(unsigned long)(void *)a_}

static Plt mplt[]={
        /* This is an attempt to at least capture the addresses to
           which the compiler directly refers in C code. (Some symbols
           are not explicitly mentioned in the C source but are
           generated by gcc, usually in a platform specific way). At
           the time of this writing, these symbols alone are
           sufficient for compiling maxima,acl2,and axiom on x86.
           This table is not (currently at least) consulted in
           actuality -- the mere mention of the symbols here (at
           present) ensures that the symbols are assigned values by
           the linker, which are used preferentially to these values
           in sfasli.c.  FIXME -- this should be made synchronous with
           compiler changes; sort the list automatically.  SORT THIS
           LIST BY HAND FOR THE TIME BEING. */
#ifndef _WIN32
#  include "plt.h"
#endif    
};

=============================================================================
plt.h:
=============================================================================
MY_PLT(_IO_getc),
MY_PLT(_IO_putc),
MY_PLT(_mcount),
MY_PLT(_setjmp),
MY_PLT(acos),
MY_PLT(acosh),
MY_PLT(asin),
MY_PLT(asinh),
MY_PLT(atan),
MY_PLT(atanh),
MY_PLT(bzero),
MY_PLT(cos),
MY_PLT(cosh),
MY_PLT(exp),
MY_PLT(fdopen),
MY_PLT(feof),
MY_PLT(log),
MY_PLT(logl),
MY_PLT(memset),
MY_PLT(read),
MY_PLT(sin),
MY_PLT(sinh),
MY_PLT(sqrt),
MY_PLT(tan),
MY_PLT(tanh),
MY_PLT(write)
=============================================================================

This has worked for quite a while, but with the latest gcc (4.1) on
mips, I cannot avoid having the address of the gcc builtin picked up
here, no matter if I use -fno-builtin or anything else, it seems.  And
for some other reason, relocating a loaded object address to the
address of the builtin function does not return properly -- I'm
guessing there are non-standard call sematics here.

Any idea of a workaround?  That is, short of putting in my own
trampolines for each function:

static double cos1(double x) {
  return cos(x);
}
#undef cos
#define cos cos1

static Plt mplt[]={
...

Take care,
-- 
Camm Maguire                                            address@hidden
==========================================================================
"The earth is but one country, and mankind its citizens."  --  Baha'u'llah




reply via email to

[Prev in Thread] Current Thread [Next in Thread]