arch.c - 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
       ---
       arch.c (1982B)
       ---
            1 #include <string.h>
            2 #include <stdio.h>
            3 #include <stdlib.h>
            4 
            5 #include <scc/scc.h>
            6 #include "cc1.h"
            7 
            8 Type *voidtype, *pvoidtype, *booltype,
            9      *uchartype, *chartype, *schartype,
           10      *uinttype, *inttype,
           11      *sizettype, *pdifftype,
           12      *ushorttype, *shorttype,
           13      *longtype, *ulongtype,
           14      *ullongtype, *llongtype,
           15      *floattype, *doubletype, *ldoubletype,
           16      *ellipsistype, *va_list_type, *va_type,
           17      *wchartype;
           18 
           19 Symbol *one, *zero;
           20 char *architecture = "amd64-sysv";
           21 
           22 static Arch *arch;
           23 static Symbol zerodata = {.u.i = 0};
           24 static Symbol onedata = {.u.i = 1};
           25 
           26 static Arch *
           27 getarch(void)
           28 {
           29         static struct archdef {
           30                 char *arch;
           31                 Arch *(*fun)(void);
           32         } *bp, defs[] = {
           33                 "amd64-sysv", amd64_sysv,
           34                 "arm64-sysv", arm64_sysv,
           35                 "riscv64-sysv", riscv64_sysv,
           36                 "i386-sysv", i386_sysv,
           37                 "z80-scc", z80_scc,
           38                 NULL, NULL,
           39         };
           40 
           41         for (bp = defs; bp->arch; ++bp) {
           42                 if (strcmp(bp->arch, architecture) == 0)
           43                         return (*bp->fun)();
           44         }
           45 
           46         return NULL;
           47 }
           48 
           49 int
           50 valid_va_list(Type *tp)
           51 {
           52         return (*arch->valid_va_list)(tp);
           53 }
           54 
           55 void
           56 iarch(void)
           57 {
           58         if ((arch = getarch()) == NULL) {
           59                 fprintf(stderr, "cc1: wrong architecture '%s'\n", architecture);
           60                 exit(EXIT_FAILURE);
           61         }
           62 
           63         voidtype = &arch->voidtype;
           64         pvoidtype = &arch->pvoidtype;
           65         booltype = &arch->booltype;
           66         uchartype = &arch->uchartype;
           67         chartype = &arch->chartype;
           68         schartype = &arch->schartype;
           69         uinttype = &arch->uinttype;
           70         inttype = &arch->inttype;
           71         sizettype = &arch->sizettype;
           72         pdifftype = &arch->pdifftype;
           73         ushorttype = &arch->ushorttype;
           74         shorttype = &arch->shorttype;
           75         longtype = &arch->longtype;
           76         ulongtype = &arch->ulongtype;
           77         ullongtype = &arch->ullongtype;
           78         llongtype = &arch->llongtype;
           79         floattype = &arch->floattype;
           80         doubletype = &arch->doubletype;
           81         ldoubletype = &arch->ldoubletype;
           82         ellipsistype = &arch->ellipsistype;
           83         va_list_type = &arch->va_list_type;
           84         va_type = &arch->va_type;
           85         wchartype = &arch->wchartype;
           86         zero = &zerodata;
           87         one = &onedata;
           88 
           89         zero->type = inttype;
           90         one->type = inttype;
           91 }