ref: cb489b71868e30f3f1d04e152be2bc106f27b060
parent: 9478b030c2bbf311afc73b119177f14cd8f8e545
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Thu Sep 21 07:32:09 EDT 2017
[as] Change the name of emit.c to symbol.c
--- a/as/Makefile
+++ b/as/Makefile
@@ -4,7 +4,7 @@
include ../config.mk
include $(LIBDIR)/libdep.mk
-OBJ = main.o emit.o ins.o parser.o expr.o
+OBJ = main.o symbol.o ins.o parser.o expr.o
HDR = ../inc/scc.h as.h
MOREFLAGS = -I../inc/$(STD) $(AS_CFLAGS)
--- a/as/as.h
+++ b/as/as.h
@@ -96,7 +96,7 @@
struct node *right;
};
-/* emit.c */
+/* symbol.c */
extern char *pack(TUINT v, int n, int inc);
extern void isections(void);
extern void writeout(char *name);
--- a/as/emit.c
+++ /dev/null
@@ -1,221 +1,0 @@
-static char sccsid[] = "@(#) ./as/emit.c";
-
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
-
-#include "../inc/scc.h"
-#include "as.h"
-
-#define HASHSIZ 64
-
-static Section abss = {
- .name = "abs",
- .flags = TABS|SREAD|SWRITE,
-};
-
-static Section bss = {
- .name = "bss",
- .flags = TBSS|SRELOC|SREAD|SWRITE,
- .next = &abss,
-};
-
-static Section data = {
- .name = "data",
- .flags = TDATA|SRELOC|SREAD|SWRITE|SFILE,
- .next = &bss,
-};
-
-static Section text = {
- .name = "text",
- .flags = TTEXT|SRELOC|SFILE,
- .next = &data,
-};
-
-Section *cursec = &text, *headp = &text;
-
-int pass;
-
-static Symbol *hashtbl[HASHSIZ];
-Symbol *linesym;
-
-Symbol *
-lookup(char *name)
-{
- unsigned h;
- Symbol *sym, **list;
- int c;
- char *t, *s;
-
- h = 0;
- for (s = name; c = *s; ++s)
- h = h*33 ^ c;
- h &= HASHSIZ-1;
-
- c = *name;
- list = &hashtbl[h];
- for (sym = *list; sym; sym = sym->next) {
- t = sym->name;
- if (c == *t && !strcmp(t, name))
- return sym;
- }
-
- sym = xmalloc(sizeof(*sym));
- sym->name = xstrdup(name);
- sym->flags = (cursec->flags & TMASK) | FLOCAL | FUNDEF;
- sym->desc = 0;
- sym->value = 0;
- sym->next = *list;
- *list = sym;
-
- return sym;
-}
-
-Symbol *
-deflabel(char *name)
-{
- static Symbol *cursym;
- Symbol *sym;
- char label[MAXSYM+1];
-
- if (*name == '.') {
- int r;
-
- if (!cursym) {
- error("local label '%s' without global label", name);
- return NULL;
- }
- r = snprintf(label, sizeof(label),
- "%s%s",
- cursym->name, name);
- if (r == sizeof(label)) {
- error("local label '%s' in '%s' produces too long symbol",
- name, cursym->name);
- return NULL;
- }
- name = label;
- }
-
- sym = lookup(name);
- if (pass == 1 && (sym->flags & FUNDEF) == 0)
- error("redefinition of label '%s'", name);
- sym->flags &= ~FUNDEF;
- sym->value = cursec->curpc;
-
- if (*name != '.')
- cursym = sym;
- return sym;
-}
-
-char *
-pack(TUINT v, int n, int inc)
-{
- static char buf[sizeof(TUINT)];
- int idx;
-
- idx = (inc < 0) ? n-1 : 0;
- while (n--) {
- buf[idx] = v;
- idx += inc;
- v >>= 8;
- }
-
- if (v)
- error("overflow in immediate value");
- return buf;
-}
-
-static void
-incpc(int siz)
-{
- TUINT pc, curpc;
- pc = cursec->pc;
- curpc = cursec->curpc;
-
- cursec->curpc += siz;
- cursec->pc += siz;
-
- if (pass == 2)
- return;
-
- if (cursec->pc > cursec->max)
- cursec->max = cursec->pc;
-
- if (pc > cursec->pc ||
- curpc > cursec->curpc ||
- cursec->curpc > maxaddr ||
- cursec->pc > maxaddr) {
- die("address overflow");
- }
-}
-
-
-static void
-isect(Section *sec)
-{
- TUINT siz;
-
- sec->curpc = sec->pc = sec->base;
- if (pass == 1 || !(sec->flags & SFILE))
- return;
-
- siz = sec->max - sec->base;
- if (siz > SIZE_MAX)
- die("out of memory");
- sec->mem = xmalloc(sec->max - sec->base);
-}
-
-Section *
-section(char *name)
-{
- Section *sec;
-
- for (sec = headp; sec; sec = sec->next) {
- if (!strcmp(sec->name, name))
- break;
- }
- if (!sec) {
- sec = xmalloc(sizeof(*sec));
- sec->name = xstrdup(name);
- sec->base = sec->max = sec->pc = sec->curpc = 0;
- sec->next = headp;
- sec->flags = SRELOC|SREAD|SWRITE|SFILE;
- }
- return cursec = sec;
-}
-
-void
-isections(void)
-{
- Section *sec;
-
- for (sec = headp; sec; sec = sec->next)
- isect(sec);
-}
-
-void
-emit(Section *sec, char *bytes, int n)
-{
- if (sec->mem)
- memcpy(&sec->mem[sec->pc - sec->base], bytes, n);
- incpc(n);
-}
-
-void
-writeout(char *name)
-{
- FILE *fp;
- Section *secp;
-
- if ((fp = fopen(name, "wb")) == NULL)
- die("error opening output file '%s'\n", name);
-
- for (secp = headp; secp; secp = secp->next) {
- if (!secp->mem)
- continue;
- fwrite(secp->mem, secp->max - secp->base, 1, fp);
- }
-
- if (fclose(fp))
- die("error writing the output file");
-}
--- /dev/null
+++ b/as/symbol.c
@@ -1,0 +1,221 @@
+static char sccsid[] = "@(#) ./as/emit.c";
+
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "../inc/scc.h"
+#include "as.h"
+
+#define HASHSIZ 64
+
+static Section abss = {
+ .name = "abs",
+ .flags = TABS|SREAD|SWRITE,
+};
+
+static Section bss = {
+ .name = "bss",
+ .flags = TBSS|SRELOC|SREAD|SWRITE,
+ .next = &abss,
+};
+
+static Section data = {
+ .name = "data",
+ .flags = TDATA|SRELOC|SREAD|SWRITE|SFILE,
+ .next = &bss,
+};
+
+static Section text = {
+ .name = "text",
+ .flags = TTEXT|SRELOC|SFILE,
+ .next = &data,
+};
+
+Section *cursec = &text, *headp = &text;
+
+int pass;
+
+static Symbol *hashtbl[HASHSIZ];
+Symbol *linesym;
+
+Symbol *
+lookup(char *name)
+{
+ unsigned h;
+ Symbol *sym, **list;
+ int c;
+ char *t, *s;
+
+ h = 0;
+ for (s = name; c = *s; ++s)
+ h = h*33 ^ c;
+ h &= HASHSIZ-1;
+
+ c = *name;
+ list = &hashtbl[h];
+ for (sym = *list; sym; sym = sym->next) {
+ t = sym->name;
+ if (c == *t && !strcmp(t, name))
+ return sym;
+ }
+
+ sym = xmalloc(sizeof(*sym));
+ sym->name = xstrdup(name);
+ sym->flags = (cursec->flags & TMASK) | FLOCAL | FUNDEF;
+ sym->desc = 0;
+ sym->value = 0;
+ sym->next = *list;
+ *list = sym;
+
+ return sym;
+}
+
+Symbol *
+deflabel(char *name)
+{
+ static Symbol *cursym;
+ Symbol *sym;
+ char label[MAXSYM+1];
+
+ if (*name == '.') {
+ int r;
+
+ if (!cursym) {
+ error("local label '%s' without global label", name);
+ return NULL;
+ }
+ r = snprintf(label, sizeof(label),
+ "%s%s",
+ cursym->name, name);
+ if (r == sizeof(label)) {
+ error("local label '%s' in '%s' produces too long symbol",
+ name, cursym->name);
+ return NULL;
+ }
+ name = label;
+ }
+
+ sym = lookup(name);
+ if (pass == 1 && (sym->flags & FUNDEF) == 0)
+ error("redefinition of label '%s'", name);
+ sym->flags &= ~FUNDEF;
+ sym->value = cursec->curpc;
+
+ if (*name != '.')
+ cursym = sym;
+ return sym;
+}
+
+char *
+pack(TUINT v, int n, int inc)
+{
+ static char buf[sizeof(TUINT)];
+ int idx;
+
+ idx = (inc < 0) ? n-1 : 0;
+ while (n--) {
+ buf[idx] = v;
+ idx += inc;
+ v >>= 8;
+ }
+
+ if (v)
+ error("overflow in immediate value");
+ return buf;
+}
+
+static void
+incpc(int siz)
+{
+ TUINT pc, curpc;
+ pc = cursec->pc;
+ curpc = cursec->curpc;
+
+ cursec->curpc += siz;
+ cursec->pc += siz;
+
+ if (pass == 2)
+ return;
+
+ if (cursec->pc > cursec->max)
+ cursec->max = cursec->pc;
+
+ if (pc > cursec->pc ||
+ curpc > cursec->curpc ||
+ cursec->curpc > maxaddr ||
+ cursec->pc > maxaddr) {
+ die("address overflow");
+ }
+}
+
+
+static void
+isect(Section *sec)
+{
+ TUINT siz;
+
+ sec->curpc = sec->pc = sec->base;
+ if (pass == 1 || !(sec->flags & SFILE))
+ return;
+
+ siz = sec->max - sec->base;
+ if (siz > SIZE_MAX)
+ die("out of memory");
+ sec->mem = xmalloc(sec->max - sec->base);
+}
+
+Section *
+section(char *name)
+{
+ Section *sec;
+
+ for (sec = headp; sec; sec = sec->next) {
+ if (!strcmp(sec->name, name))
+ break;
+ }
+ if (!sec) {
+ sec = xmalloc(sizeof(*sec));
+ sec->name = xstrdup(name);
+ sec->base = sec->max = sec->pc = sec->curpc = 0;
+ sec->next = headp;
+ sec->flags = SRELOC|SREAD|SWRITE|SFILE;
+ }
+ return cursec = sec;
+}
+
+void
+isections(void)
+{
+ Section *sec;
+
+ for (sec = headp; sec; sec = sec->next)
+ isect(sec);
+}
+
+void
+emit(Section *sec, char *bytes, int n)
+{
+ if (sec->mem)
+ memcpy(&sec->mem[sec->pc - sec->base], bytes, n);
+ incpc(n);
+}
+
+void
+writeout(char *name)
+{
+ FILE *fp;
+ Section *secp;
+
+ if ((fp = fopen(name, "wb")) == NULL)
+ die("error opening output file '%s'\n", name);
+
+ for (secp = headp; secp; secp = secp->next) {
+ if (!secp->mem)
+ continue;
+ fwrite(secp->mem, secp->max - secp->base, 1, fp);
+ }
+
+ if (fclose(fp))
+ die("error writing the output file");
+}