scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

commit 6a6fc18fa4b061ae0389c370d7c416f17a883761
parent 7b484ddf2a8546ce55949d81cb177bbef416dcff
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:
Minclude/scc/scc/mach.h | 53+++++++++++++++++++++++++++++++----------------------
Msrc/cmd/as/as.h | 39---------------------------------------
Msrc/cmd/as/binfmt.c | 1+
Msrc/cmd/as/expr.c | 2++
Msrc/cmd/as/ins.c | 2++
Msrc/cmd/as/main.c | 4+++-
Msrc/cmd/as/mktbl.awk | 3++-
Msrc/cmd/as/parser.c | 2++
Msrc/cmd/as/symbol.c | 16+++++++++-------
Msrc/cmd/as/target/powerpc/ins.c | 1+
Msrc/cmd/as/target/powerpc/powerpc.c | 1+
Msrc/cmd/as/target/powerpc/powerpc64.c | 1+
Msrc/cmd/as/target/x80/ins.c | 1+
Msrc/cmd/as/target/x80/z80.c | 1+
Msrc/cmd/as/target/x86/amd64.c | 1+
Msrc/cmd/as/target/x86/i286.c | 1+
Msrc/cmd/as/target/x86/i386.c | 1+
Msrc/cmd/as/target/x86/ins.c | 1+
18 files changed, 61 insertions(+), 70 deletions(-)

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 *); 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; 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" 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 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; 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; 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" 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 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) 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" 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" 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" 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" 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" 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" 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" 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" 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"