]> Cypherpunks repositories - gostls13.git/commitdiff
ffi -> dynld.
authorRuss Cox <rsc@golang.org>
Tue, 25 Aug 2009 00:27:55 +0000 (17:27 -0700)
committerRuss Cox <rsc@golang.org>
Tue, 25 Aug 2009 00:27:55 +0000 (17:27 -0700)
move out of export data into its own section

R=r
DELTA=222  (71 added, 99 deleted, 52 changed)
OCL=33801
CL=33808

src/cmd/5l/l.h
src/cmd/6c/swt.c
src/cmd/6l/asm.c
src/cmd/6l/l.h
src/cmd/8l/l.h
src/cmd/ar/ar.c
src/cmd/cc/cc.h
src/cmd/cc/dpchk.c
src/cmd/cc/lexbody
src/cmd/cc/macbody
src/cmd/ld/go.c

index 1ba95e0a2edb1d1a1082e99c0bd8c2fa6a843003..4f7ef582979c0f8e453340516179d1e7ed877cda 100644 (file)
@@ -119,7 +119,6 @@ struct      Sym
        short   frame;
        uchar   subtype;
        uchar   reachable;
-       uchar   ffitype;
        ushort  file;
        int32   value;
        int32   sig;
@@ -132,8 +131,8 @@ struct      Sym
        Prog*   text;
        Prog*   data;
        Sym*    gotype;
-       char*   ffiname;
-       char*   ffilib;
+       char*   dynldname;
+       char*   dynldlib;
 };
 
 #define SIGNINTERN     (1729*325*1729)
index 9b2381ae934718489b05555479a54cc3d3dac069..15c2a5c2c1cde389161289541178c169694b2421 100644 (file)
@@ -232,18 +232,16 @@ outcode(void)
        Binit(&b, f, OWRITE);
 
        Bprint(&b, "%s\n", thestring);
-       if(nffi > 0) {
+       if(ndynld > 0) {
                int i;
 
-               if(package == nil) {
-                       yyerror("#pragma ffi without #pragma package");
-                       package = "_ffi_";
-               }
-               Bprint(&b, "\n$$  // ffi\n", thestring);
-               Bprint(&b, "package %s\n", package);
-               for(i=0; i<nffi; i++)
-                       Bprint(&b, "//ffi %c %s %s %s\n", ffi[i].type, ffi[i].local, ffi[i].remote, ffi[i].path);
-               Bprint(&b, "$$\n\n$$\n\n");
+               Bprint(&b, "\n");
+               Bprint(&b, "$$  // exports\n\n");
+               Bprint(&b, "$$  // local types\n\n");
+               Bprint(&b, "$$  // dynld\n", thestring);
+               for(i=0; i<ndynld; i++)
+                       Bprint(&b, "dynld %s %s %s\n", dynld[i].local, dynld[i].remote, dynld[i].path);
+               Bprint(&b, "$$\n\n");
        }
        Bprint(&b, "!\n");
 
index 6232a5a9025068134b88d6ef37096a58d6f4c919..87d3b19b475ae8867ba3f3cccc6f80b18fd72852 100644 (file)
@@ -353,12 +353,12 @@ doelf(void)
                dynamic = s;
 
                /*
-                * relocation entries for extern ffi symbols
+                * relocation entries for dynld symbols
                 */
                nsym = 1;       // sym 0 is reserved
                for(h=0; h<NHASH; h++) {
                        for(s=hash[h]; s!=S; s=s->link) {
-                               if(!s->reachable || (s->type != SDATA && s->type != SBSS) || s->ffiname == nil)
+                               if(!s->reachable || (s->type != SDATA && s->type != SBSS) || s->dynldname == nil)
                                        continue;
 
                                d = lookup(".rela", 0);
@@ -368,24 +368,17 @@ doelf(void)
                                nsym++;
 
                                d = lookup(".dynsym", 0);
-                               adduint32(d, addstring(lookup(".dynstr", 0), s->ffiname));
+                               adduint32(d, addstring(lookup(".dynstr", 0), s->dynldname));
                                t = STB_GLOBAL << 4;
-                               switch(s->ffitype) {
-                               case 'T':
-                                       t |= STT_FUNC;
-                                       break;
-                               case 'D':
-                                       t |= STT_OBJECT;
-                                       break;
-                               }
+                               t |= STT_OBJECT;        // works for func too, empirically
                                adduint8(d, t);
                                adduint8(d, 0); /* reserved */
                                adduint16(d, SHN_UNDEF);        /* section where symbol is defined */
                                adduint64(d, 0);        /* value */
                                adduint64(d, 0);        /* size of object */
 
-                               if(needlib(s->ffilib))
-                                       elfwritedynent(dynamic, DT_NEEDED, addstring(dynstr, s->ffilib));
+                               if(needlib(s->dynldlib))
+                                       elfwritedynent(dynamic, DT_NEEDED, addstring(dynstr, s->dynldlib));
                        }
                }
 
index a0794a62272ec1c6d6f81c3a201bc3cd264554db..a1c2ec5272908226e7bdaed677e76443727c2b08 100644 (file)
@@ -119,7 +119,6 @@ struct      Sym
        uchar   subtype;
        uchar   dupok;
        uchar   reachable;
-       uchar   ffitype;
        vlong   value;
        vlong   size;
        int32   sig;
@@ -127,8 +126,8 @@ struct      Sym
        Prog*   text;
        Prog*   data;
        Sym*    gotype;
-       char*   ffiname;
-       char*   ffilib;
+       char*   dynldname;
+       char*   dynldlib;
 };
 struct Optab
 {
index e58c2796943a1cecea6dd4da8a479c51af155013..3fb79fb1a964a7293fe8e460dc2006f8e05a306c 100644 (file)
@@ -116,7 +116,6 @@ struct      Sym
        uchar   subtype;
        uchar   dupok;
        uchar   reachable;
-       uchar   ffitype;
        ushort  file;
        int32   value;
        int32   sig;
@@ -124,9 +123,8 @@ struct      Sym
        Prog*   text;
        Prog*   data;
        Sym*    gotype;
-       char*   ffiname;
-       char*   ffilib;
-
+       char*   dynldname;
+       char*   dynldlib;
 };
 struct Optab
 {
index 83ab51c2e37fcde9e1bef110436db5d3615e0c8d..bd8d5f9da2c6afad99d4817225676cd14e4ea88f 100644 (file)
@@ -715,7 +715,9 @@ bad:
        return;
 
 foundend:
-       if (start == 0 || end == 0)
+       if (start == 0)
+               return;
+       if (end == 0)
                goto bad;
        if (pkgstmt == nil) {
                /* this is the first package */
@@ -1550,7 +1552,6 @@ parsepkgdata(char **pp, char *ep, char **prefixp, char **namep, char **defp)
 
        // skip white space
        p = *pp;
-again:
        while(p < ep && (*p == ' ' || *p == '\t'))
                p++;
        if(p == ep)
@@ -1570,13 +1571,7 @@ again:
                p += 5;
        else if(strncmp(p, "const ", 6) == 0)
                p += 6;
-       else if(strncmp(p, "//", 2) == 0) {
-               p = memchr(p, '\n', ep - p);
-               if(p == nil)
-                       return 0;
-               p++;
-               goto again;
-       } else {
+       else {
                fprint(2, "ar: confused in pkg data near <<%.20s>>\n", p);
                errors++;
                return -1;
index 9964681f11850880e64d5b1c9f44154de36b17f1..a1168fc8b5c92b937bd24659f4c49fa5fd99f190 100644 (file)
@@ -49,7 +49,7 @@ typedef       struct  Hist    Hist;
 typedef        struct  Term    Term;
 typedef        struct  Init    Init;
 typedef        struct  Bits    Bits;
-typedef        struct  Ffi Ffi;
+typedef        struct  Dynld   Dynld;
 
 #define        NHUNK           50000L
 #define        BUFSIZ          8192
@@ -437,17 +437,15 @@ struct    Funct
        Sym*    castfr[NTYPE];
 };
 
-struct Ffi
+struct Dynld
 {
-       char    type;
        char*   local;
        char*   remote;
        char*   path;
 };
 
-EXTERN Ffi     *ffi;
-EXTERN int     nffi;
-EXTERN char*   package;
+EXTERN Dynld   *dynld;
+EXTERN int     ndynld;
 
 EXTERN struct
 {
@@ -753,8 +751,7 @@ void        pragpack(void);
 void   pragfpround(void);
 void   pragtextflag(void);
 void   pragincomplete(void);
-void   pragffi(void);
-void   pragpackage(void);
+void   pragdynld(void);
 
 /*
  * calls to machine depend part
index b1e988b87ae9aeeedcb5b15d1630ef609f9467ba..59702f06334e4e1ec4ae689d424f907ee05aa814 100644 (file)
@@ -529,15 +529,11 @@ out:
 }
 
 void
-pragffi(void)
+pragdynld(void)
 {
-       Sym *local, *remote, *type;
+       Sym *local, *remote;
        char *path;
-       Ffi *f;
-
-       type = getsym();
-       if(type == nil)
-               goto err;
+       Dynld *f;
 
        local = getsym();
        if(local == nil)
@@ -551,40 +547,18 @@ pragffi(void)
        if(path == nil)
                goto err;
 
-       if(nffi%32 == 0)
-               ffi = realloc(ffi, (nffi+32)*sizeof ffi[0]);
-       f = &ffi[nffi++];
-       f->type = type->name[0];
+       if(ndynld%32 == 0)
+               dynld = realloc(dynld, (ndynld+32)*sizeof dynld[0]);
+       f = &dynld[ndynld++];
        f->local = local->name;
        f->remote = remote->name;
        f->path = path;
        goto out;
 
 err:
-       yyerror("usage: #pragma ffi typechar local remote \"path\"");
-
-out:
-       while(getnsc() != '\n')
-               ;
-}
-
-void
-pragpackage(void)
-{
-       Sym *s;
-
-       s = getsym();
-       if(s == nil)
-               goto err;
-
-       package = s->name;
-       goto out;
-
-err:
-       yyerror("malformed #pragma package");
+       yyerror("usage: #pragma dynld local remote \"path\"");
 
 out:
        while(getnsc() != '\n')
                ;
 }
-
index 1c979a0f1a9e600c3cb6c5563f36c57f08bf0d0a..f5a250fcf7da4e157929a7217eeaace4c209cbff 100644 (file)
@@ -47,14 +47,7 @@ pragvararg(void)
 }
 
 void
-pragffi(void)
-{
-       while(getnsc() != '\n')
-               ;
-}
-
-void
-pragpackage(void)
+pragdynld(void)
 {
        while(getnsc() != '\n')
                ;
index 09ecccf5d2556b7e93b3f9acdbfe17f4d49f7e59..7b45841d48539d42ea31e88f8085f960e906b01e 100644 (file)
@@ -737,12 +737,8 @@ macprag(void)
                pragincomplete();
                return;
        }
-       if(s && strcmp(s->name, "ffi") == 0) {
-               pragffi();
-               return;
-       }
-       if(s && strcmp(s->name, "package") == 0) {
-               pragpackage();
+       if(s && strcmp(s->name, "dynld") == 0) {
+               pragdynld();
                return;
        }
        while(getnsc() != '\n')
index b4b75b19b0ef37437c5ece0458741fd6667e7eff..30d8348c7d829fd01d6b6d0b5998f889fd72dfb8 100644 (file)
@@ -63,6 +63,7 @@ ilookup(char *name)
 }
 
 static void loadpkgdata(char*, char*, int);
+static void loaddynld(char*, char*, int);
 static int parsemethod(char**, char*, char**);
 static int parsepkgdata(char*, char**, char*, char**, char**, char**);
 
@@ -99,19 +100,21 @@ ldpkg(Biobuf *f, int64 len, char *filename)
                fprint(2, "%s: cannot find end of exports in %s\n", argv0, filename);
                return;
        }
-       while(*p0 == ' ' || *p0 == '\t' || *p0 == '\n')
-               p0++;
-       if(strncmp(p0, "package ", 8) != 0) {
-               fprint(2, "%s: bad package section in %s - %s\n", argv0, filename, p0);
-               return;
-       }
-       p0 += 8;
-       while(*p0 == ' ' || *p0 == '\t' || *p0 == '\n')
-               p0++;
-       while(*p0 != ' ' && *p0 != '\t' && *p0 != '\n')
+       while(p0 < p1 && (*p0 == ' ' || *p0 == '\t' || *p0 == '\n'))
                p0++;
+       if(p0 < p1) {
+               if(strncmp(p0, "package ", 8) != 0) {
+                       fprint(2, "%s: bad package section in %s - %s\n", argv0, filename, p0);
+                       return;
+               }
+               p0 += 8;
+               while(*p0 == ' ' || *p0 == '\t' || *p0 == '\n')
+                       p0++;
+               while(*p0 != ' ' && *p0 != '\t' && *p0 != '\n')
+                       p0++;
 
-       loadpkgdata(filename, p0, p1 - p0);
+               loadpkgdata(filename, p0, p1 - p0);
+       }
 
        // local types begin where exports end.
        // skip rest of line after $$ we found above
@@ -127,6 +130,24 @@ ldpkg(Biobuf *f, int64 len, char *filename)
        }
 
        loadpkgdata(filename, p0, p1 - p0);
+
+       // look for dynld section
+       p0 = strstr(p1, "\n$$  // dynld");
+       if(p0 != nil) {
+               p0 = strchr(p0+1, '\n');
+               if(p0 == nil) {
+                       fprint(2, "%s: found $$ // dynld but no newline in %s\n", argv0, filename);
+                       return;
+               }
+               p1 = strstr(p0, "\n$$");
+               if(p1 == nil)
+                       p1 = strstr(p0, "\n!\n");
+               if(p1 == nil) {
+                       fprint(2, "%s: cannot find end of // dynld section in %s\n", argv0, filename);
+                       return;
+               }
+               loaddynld(filename, p0 + 1, p1 - p0);
+       }
 }
 
 /*
@@ -190,7 +211,6 @@ parsepkgdata(char *file, char **pp, char *ep, char **prefixp, char **namep, char
        char *p, *prefix, *name, *def, *edef, *meth;
        int n;
 
-again:
        // skip white space
        p = *pp;
        while(p < ep && (*p == ' ' || *p == '\t' || *p == '\n'))
@@ -210,45 +230,7 @@ again:
                p += 5;
        else if(strncmp(p, "const ", 6) == 0)
                p += 6;
-       else if(strncmp(p, "//ffi ", 6) == 0) {
-               Sym *s;
-               char type, *lib;
-
-               p += 6;
-               if(*p == 0 || *(p+1) != ' ')
-                       goto err;
-               type = *p;
-               p += 2;
-               name = p;
-               p = strchr(name, ' ');
-               if(p == nil)
-                       goto err;
-               while(*p == ' ')
-                       p++;
-               def = p;
-               p = strchr(def, ' ');
-               if(p == nil)
-                       goto err;
-               while(*p == ' ')
-                       p++;
-               lib = p;
-               p = strchr(lib, '\n');
-               if(p == nil)
-                       goto err;
-
-               // successful parse: now can edit the line
-               *strchr(name, ' ') = 0;
-               *strchr(def, ' ') = 0;
-               *strchr(lib, '\n') = 0;
-               *pp = p+1;
-
-               s = lookup(name, 0);
-               s->ffitype = type;
-               s->ffilib = lib;
-               s->ffiname = def;
-               goto again;
-       } else {
-       err:
+       else {
                fprint(2, "%s: confused in pkg data near <<%.40s>>\n", argv0, prefix);
                nerrors++;
                return -1;
@@ -331,6 +313,54 @@ parsemethod(char **pp, char *ep, char **methp)
        return 1;
 }
 
+static void
+loaddynld(char *file, char *p, int n)
+{
+       char *next, *name, *def, *p0, *lib;
+       Sym *s;
+
+       p[n] = '\0';
+
+       p0 = p;
+       for(; *p; p=next) {
+               next = strchr(p, '\n');
+               if(next == nil)
+                       next = "";
+               else
+                       *next++ = '\0';
+               p0 = p;
+               if(strncmp(p, "dynld ", 6) != 0)
+                       goto err;
+               p += 6;
+               name = p;
+               p = strchr(name, ' ');
+               if(p == nil)
+                       goto err;
+               while(*p == ' ')
+                       p++;
+               def = p;
+               p = strchr(def, ' ');
+               if(p == nil)
+                       goto err;
+               while(*p == ' ')
+                       p++;
+               lib = p;
+
+               // successful parse: now can edit the line
+               *strchr(name, ' ') = 0;
+               *strchr(def, ' ') = 0;
+
+               s = lookup(name, 0);
+               s->dynldlib = lib;
+               s->dynldname = def;
+       }
+       return;
+
+err:
+       fprint(2, "%s: invalid dynld line: %s\n", argv0, p0);
+       nerrors++;
+}
+
 static void mark(Sym*);
 static int markdepth;