as: Reuse symbol and section from libmach - scc - simple c99 compiler
 (HTM) git clone git://git.simple-cc.org/scc
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 6a6fc18fa4b061ae0389c370d7c416f17a883761
 (DIR) parent 7b484ddf2a8546ce55949d81cb177bbef416dcff
 (HTM) Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
       Date:   Mon, 12 Feb 2024 08:46:53 +0100
       
       as: Reuse symbol and section from libmach
       
       This is the next step in the migration to use the types
       defined in libmach instead of using custom ones that
       are almost identical to the one used in libmach.
       
       A mem pointer was added to the type in libmach but it is
       expected to be removed soon.
       
       Diffstat:
         M include/scc/scc/mach.h              |      53 ++++++++++++++++++-------------
         M src/cmd/as/as.h                     |      39 -------------------------------
         M src/cmd/as/binfmt.c                 |       1 +
         M src/cmd/as/expr.c                   |       2 ++
         M src/cmd/as/ins.c                    |       2 ++
         M src/cmd/as/main.c                   |       4 +++-
         M src/cmd/as/mktbl.awk                |       3 ++-
         M src/cmd/as/parser.c                 |       2 ++
         M src/cmd/as/symbol.c                 |      16 +++++++++-------
         M src/cmd/as/target/powerpc/ins.c     |       1 +
         M src/cmd/as/target/powerpc/powerpc.c |       1 +
         M src/cmd/as/target/powerpc/powerpc6… |       1 +
         M src/cmd/as/target/x80/ins.c         |       1 +
         M src/cmd/as/target/x80/z80.c         |       1 +
         M src/cmd/as/target/x86/amd64.c       |       1 +
         M src/cmd/as/target/x86/i286.c        |       1 +
         M src/cmd/as/target/x86/i386.c        |       1 +
         M src/cmd/as/target/x86/ins.c         |       1 +
       
       18 files changed, 61 insertions(+), 70 deletions(-)
       ---
 (DIR) diff --git a/include/scc/scc/mach.h b/include/scc/scc/mach.h
       @@ -68,6 +68,9 @@ struct section {
                int align;
                int fill;
                char type;
       +
       +        /* TODO: Remove it once as if fixed */
       +        char *mem;
        };
        
        /**
       @@ -87,32 +90,38 @@ struct symbol {
                unsigned flags;
        };
        
       -extern int archive(FILE *fp);
       -extern long armember(FILE *fp, char *member);
       -
       -extern int objtype(FILE *fp, char **name);
       -extern Obj *newobj(int type);
       -extern void delobj(Obj *obj);
       +#ifdef stdin
       +extern int archive(FILE *);
       +extern long armember(FILE *, char *);
        
       -extern int readobj(Obj *obj, FILE *fp);
       -extern int writeobj(Obj *obj, Map *map, FILE *fp);
       +extern int objtype(FILE *, char **);
        
       -extern int strip(Obj *obj);
       -extern int pc2line(Obj *obj, unsigned long long pc, char *fname, int *ln);
       -extern int rebase(Obj *obj, int index, unsigned long long offset);
       +extern int readobj(Obj *, FILE *);
       +extern int writeobj(Obj *, Map *, FILE *);
        
       -extern Map *loadmap(Obj *obj, FILE *fp);
       -extern Map *newmap(int n, FILE *fp);
       -extern int findsec(Map *map, char *name);
       -extern int setmap(Map *map,
       -                  char *name,
       -                  FILE *fp,
       -                  unsigned long long begin,
       -                  unsigned long long end,
       -                  long off);
       +extern Map *loadmap(Obj *, FILE *);
       +extern Map *newmap(int , FILE *);
        
       -extern Symbol *getsym(Obj *obj, int *index, Symbol *sym);
       -extern Section *getsec(Obj *obj, int *index, Section *sec);
       +extern int setmap(Map *,
       +                  char *,
       +                  FILE *,
       +                  unsigned long long,
       +                  unsigned long long,
       +                  long);
        
        extern int setindex(int, long, char **, long *, FILE *);
        extern int getindex(int, long *, char ***, long **, FILE *);
       +
       +#endif
       +
       +extern Obj *newobj(int);
       +extern void delobj(Obj *);
       +
       +extern int strip(Obj *);
       +extern int pc2line(Obj *, unsigned long long, char *, int *);
       +extern int rebase(Obj *, int, unsigned long long);
       +
       +extern int findsec(Map *, char *);
       +
       +extern Symbol *getsym(Obj *, int *, Symbol *);
       +extern Section *getsec(Obj *, int *, Section *);
 (DIR) diff --git a/src/cmd/as/as.h b/src/cmd/as/as.h
       @@ -13,15 +13,6 @@ enum symflags {
                FABS    = 1 << 7,
        };
        
       -enum secflags {
       -        SREAD  = 1 << 0,
       -        SWRITE = 1 << 1,
       -        SEXEC  = 1 << 2,
       -        SLOAD  = 1 << 3,
       -        SFILE  = 1 << 4,
       -        SABS   = 1 << 5,
       -};
       -
        /*
         * some systems polute the namespace defining BIG_ENDIAN and
         * LITTLE_ENDIAN
       @@ -74,8 +65,6 @@ enum tokens {
        typedef struct reloc Reloc;
        typedef struct ins Ins;
        typedef struct op Op;
       -typedef struct section Section;
       -typedef struct symbol Symbol;
        typedef struct node Node;
        typedef void Format(Op *, Node **);
        
       @@ -107,34 +96,6 @@ struct op {
                unsigned char *args;
        };
        
       -struct section {
       -        char *name;
       -        unsigned long long base;
       -        unsigned long long size;
       -        unsigned long long curpc;
       -        unsigned long long  pc;
       -
       -        unsigned flags;
       -        int index;
       -        int align;
       -        int fill;
       -        char type;
       -
       -        char *mem;
       -};
       -
       -struct symbol {
       -        char *name;
       -        unsigned long long size;
       -        unsigned long long value;
       -        int index;
       -        int section;
       -        char type;
       -        int stype;
       -        int dtype;
       -        unsigned flags;
       -};
       -
        struct node {
                unsigned char op;
                unsigned char addr;
 (DIR) diff --git a/src/cmd/as/binfmt.c b/src/cmd/as/binfmt.c
       @@ -3,6 +3,7 @@
        #include <stdlib.h>
        #include <string.h>
        
       +#include <scc/mach.h>
        #include <scc/scc.h>
        
        #include "as.h"
 (DIR) diff --git a/src/cmd/as/expr.c b/src/cmd/as/expr.c
       @@ -2,7 +2,9 @@
        #include <stdlib.h>
        #include <string.h>
        
       +#include <scc/mach.h>
        #include <scc/scc.h>
       +
        #include "as.h"
        
        #define NNODES   10
 (DIR) diff --git a/src/cmd/as/ins.c b/src/cmd/as/ins.c
       @@ -1,6 +1,8 @@
        #include <string.h>
        
       +#include <scc/mach.h>
        #include <scc/scc.h>
       +
        #include "as.h"
        
        extern Section *sabs, *sbss, *sdata, *stext;
 (DIR) diff --git a/src/cmd/as/main.c b/src/cmd/as/main.c
       @@ -5,8 +5,10 @@
        #include <stdlib.h>
        #include <string.h>
        
       -#include <scc/scc.h>
        #include <scc/arg.h>
       +#include <scc/mach.h>
       +#include <scc/scc.h>
       +
        #include "as.h"
        
        char *argv0;
 (DIR) diff --git a/src/cmd/as/mktbl.awk b/src/cmd/as/mktbl.awk
       @@ -1,7 +1,8 @@
        
        BEGIN                {
                        nvar=0
       -                printf "#include <scc/scc.h>\n"\
       +                printf "#include <scc/mach.h>\n"\
       +                       "#include <scc/scc.h>\n"\
                               "#include \"../../as.h\"\n"\
                               "#include \"../" family "/proc.h\"\n"
        
 (DIR) diff --git a/src/cmd/as/parser.c b/src/cmd/as/parser.c
       @@ -9,7 +9,9 @@
        #include <string.h>
        
        #include <scc/cstd.h>
       +#include <scc/mach.h>
        #include <scc/scc.h>
       +
        #include "as.h"
        
        #define NARGS 20
 (DIR) diff --git a/src/cmd/as/symbol.c b/src/cmd/as/symbol.c
       @@ -5,7 +5,9 @@
        #include <string.h>
        
        #include <scc/cstd.h>
       +#include <scc/mach.h>
        #include <scc/scc.h>
       +
        #include "as.h"
        
        #define HASHSIZ 64
       @@ -217,8 +219,8 @@ secflags(char *attr)
                        case 'x':
                                flags |= SEXEC;
                                break;
       -                case 'f':
       -                        flags |= SFILE;
       +                case 'c':
       +                        flags |= SALLOC;
                                break;
                        case 'l':
                                flags |= SLOAD;
       @@ -291,10 +293,10 @@ setsec(char *name, char *attr)
        void
        isecs(void)
        {
       -        sabs = setsec(".abs", "rwx");
       -        sbss = setsec(".bss", "rwf");
       -        sdata = setsec(".data", "rw");
       -        stext = setsec(".text", "rx");
       +        sabs = setsec(".abs", "rwxa");
       +        sbss = setsec(".bss", "rw");
       +        sdata = setsec(".data", "rwc");
       +        stext = setsec(".text", "rxc");
        }
        
        void
       @@ -306,7 +308,7 @@ cleansecs(void)
                for (lp = seclist; lp; lp = lp->next) {
                        sec = &lp->s;
                        sec->curpc = sec->pc = sec->base;
       -                if (pass == 1 || sec->flags & SFILE)
       +                if (pass == 1 || (sec->flags & SALLOC) == 0)
                                continue;
        
                        if (sec->size > SIZE_MAX)
 (DIR) diff --git a/src/cmd/as/target/powerpc/ins.c b/src/cmd/as/target/powerpc/ins.c
       @@ -1,5 +1,6 @@
        #include <stdlib.h>
        
       +#include <scc/mach.h>
        #include <scc/scc.h>
        
        #include "../../as.h"
 (DIR) diff --git a/src/cmd/as/target/powerpc/powerpc.c b/src/cmd/as/target/powerpc/powerpc.c
       @@ -1,5 +1,6 @@
        #include <stdlib.h>
        
       +#include <scc/mach.h>
        #include <scc/scc.h>
        
        #include "../../as.h"
 (DIR) diff --git a/src/cmd/as/target/powerpc/powerpc64.c b/src/cmd/as/target/powerpc/powerpc64.c
       @@ -1,5 +1,6 @@
        #include <stdlib.h>
        
       +#include <scc/mach.h>
        #include <scc/scc.h>
        
        #include "../../as.h"
 (DIR) diff --git a/src/cmd/as/target/x80/ins.c b/src/cmd/as/target/x80/ins.c
       @@ -1,6 +1,7 @@
        #include <stdlib.h>
        #include <string.h>
        
       +#include <scc/mach.h>
        #include <scc/scc.h>
        
        #include "../../as.h"
 (DIR) diff --git a/src/cmd/as/target/x80/z80.c b/src/cmd/as/target/x80/z80.c
       @@ -1,5 +1,6 @@
        #include <stdlib.h>
        
       +#include <scc/mach.h>
        #include <scc/scc.h>
        
        #include "../../as.h"
 (DIR) diff --git a/src/cmd/as/target/x86/amd64.c b/src/cmd/as/target/x86/amd64.c
       @@ -1,3 +1,4 @@
       +#include <scc/mach.h>
        #include <scc/scc.h>
        
        #include "../../as.h"
 (DIR) diff --git a/src/cmd/as/target/x86/i286.c b/src/cmd/as/target/x86/i286.c
       @@ -1,3 +1,4 @@
       +#include <scc/mach.h>
        #include <scc/scc.h>
        
        #include "../../as.h"
 (DIR) diff --git a/src/cmd/as/target/x86/i386.c b/src/cmd/as/target/x86/i386.c
       @@ -1,3 +1,4 @@
       +#include <scc/mach.h>
        #include <scc/scc.h>
        
        #include "../../as.h"
 (DIR) diff --git a/src/cmd/as/target/x86/ins.c b/src/cmd/as/target/x86/ins.c
       @@ -1,6 +1,7 @@
        #include <stdlib.h>
        #include <string.h>
        
       +#include <scc/mach.h>
        #include <scc/scc.h>
        
        #include "../../as.h"