pass2.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 667 行 · 第 1/2 页
C
667 行
int *uid = Seq_remlo(in->v.rcc_Function.callee); callee[i] = uid2symbol(*uid); free(uid); } callee[i] = NULL; Seq_free(&in->v.rcc_Function.callee); cfunc->u.f.callee = callee; cfunc->defined = 1; /* Initialize the code list, traverse the interfaces inside the function; each call appends code list entries. */ codelist = &codehead; codelist->next = NULL; n = Seq_length(in->v.rcc_Function.codelist); for (i = 0; i < n; i++) interface(Seq_remlo(in->v.rcc_Function.codelist)); Seq_free(&in->v.rcc_Function.codelist); /* Call the back end, Wrap-up. */ exitscope(); (*IR->function)(cfunc, caller, callee, in->v.rcc_Function.ncalls); cfunc = NULL; labels = NULL;}static struct block { Code begin; struct block *prev;} *blockstack = NULL;static void doBlockbeg(rcc_interface_ty in) { struct block *b; Code cp = code(Blockbeg); enterscope(); cp->u.block.level = level; cp->u.block.locals = newarray(1, sizeof *cp->u.block.locals, FUNC); cp->u.block.locals[0] = NULL; cp->u.block.identifiers = NULL; cp->u.block.types = NULL; NEW(b, FUNC); b->begin = cp; b->prev = blockstack; blockstack = b;}static void doBlockend(rcc_interface_ty in) { assert(blockstack); code(Blockend)->u.begin = blockstack->begin; blockstack = blockstack->prev; exitscope();}static Node visit(rcc_node_ty node) { int op; Node left = NULL, right = NULL, p = NULL; Symbol sym = NULL; switch (node->kind) {#define T(x) rcc_##x##_enum case T(CSE): { Symbol q = uid2symbol(node->v.rcc_CSE.uid); assert(q->temporary); q->u.t.cse = p = visit(node->v.rcc_CSE.node); break; } case T(CNST): { Value v; v.i = node->v.rcc_CNST.value; sym = constant(btot(node->suffix, node->size), v); op = CNST; break; } case T(CNSTF): { Value v; unsigned *p = (unsigned *)&v.d; p[swap] = node->v.rcc_CNSTF.value->msb; p[1-swap] = node->v.rcc_CNSTF.value->lsb; sym = constant(btot(node->suffix, node->size), v); free(node->v.rcc_CNSTF.value); op = CNST; break; } case T(ARG): p = newnode(ARG + node->suffix + sizeop(node->size), visit(node->v.rcc_ARG.left), NULL, intconst(node->v.rcc_ARG.len)); p->syms[1] = intconst(node->v.rcc_ARG.align); break; case T(ASGN): p = newnode(ASGN + node->suffix + sizeop(node->size), visit(node->v.rcc_ASGN.left), visit(node->v.rcc_ASGN.right), intconst(node->v.rcc_ASGN.len)); p->syms[1] = intconst(node->v.rcc_ASGN.align); break; case T(CVT): op = node->v.rcc_CVT.op; left = visit(node->v.rcc_CVT.left); sym = intconst(node->v.rcc_CVT.fromsize); break; case T(CALL): op = CALL; left = visit(node->v.rcc_CALL.left); NEW0(sym, FUNC); sym->type = uid2type(node->v.rcc_CALL.type); break; case T(CALLB): op = CALL; left = visit(node->v.rcc_CALLB.left); right = visit(node->v.rcc_CALLB.right); NEW0(sym, FUNC); sym->type = uid2type(node->v.rcc_CALLB.type); break; case T(RET): op = RET; break; case T(ADDRG): op = ADDRG; sym = uid2symbol(node->v.rcc_ADDRG.uid); break; case T(ADDRL): op = ADDRL; sym = uid2symbol(node->v.rcc_ADDRG.uid); break; case T(ADDRF): op = ADDRF; sym = uid2symbol(node->v.rcc_ADDRG.uid); break; case T(Unary): op = node->v.rcc_Unary.op; left = visit(node->v.rcc_Unary.left); break; case T(Binary): op = node->v.rcc_Binary.op; left = visit(node->v.rcc_Binary.left); right = visit(node->v.rcc_Binary.right); break; case T(Compare): op = node->v.rcc_Compare.op; left = visit(node->v.rcc_Compare.left); right = visit(node->v.rcc_Compare.right); sym = findlabel(node->v.rcc_Compare.label); break; case T(LABEL): op = LABEL; sym = findlabel(node->v.rcc_LABEL.label); break; case T(BRANCH): op = JUMP; left = newnode(ADDRG+P+sizeop(voidptype->size), NULL, NULL, findlabel(node->v.rcc_BRANCH.label)); break;#undef T default: assert(0); } if (p == NULL) p = newnode(op + node->suffix + sizeop(node->size), left, right, sym); free(node); return p;}static void doForest(rcc_interface_ty in) { Node *tail = &code(Gen)->u.forest; int i, n = Seq_length(in->v.rcc_Forest.nodes); for (i = 0; i < n; i++) { *tail = visit(Seq_remlo(in->v.rcc_Forest.nodes)); assert(*tail); tail = &(*tail)->link; } *tail = NULL; Seq_free(&in->v.rcc_Forest.nodes);}int main(int argc, char *argv[]) { int i, version; float stamp = (assert(strstr(rcsid, ",v")), strtod(strstr(rcsid, ",v")+2, NULL)); char *infile = NULL, *outfile = NULL; rcc_program_ty pickle; for (i = 1; i < argc; i++) if (*argv[i] != '-' || strcmp(argv[i], "-") == 0) { if (infile == NULL) infile = argv[i]; else if (outfile == NULL) outfile = argv[i]; } if (infile != NULL && strcmp(infile, "-") != 0 && freopen(infile, "rb", stdin) == NULL) { fprint(stderr, "%s: can't read `%s'\n", argv[0], infile); exit(EXIT_FAILURE); }#if WIN32 else _setmode(_fileno(stdin), _O_BINARY);#endif if (outfile != NULL && strcmp(outfile, "-") != 0 && freopen(outfile, "w", stdout) == NULL) { fprint(stderr, "%s: can't write `%s'\n", argv[0], outfile); exit(EXIT_FAILURE); } version = read_int(stdin); assert(version/100 == (int)stamp); pickle = rcc_read_program(stdin); argc = pickle->argc; argv = newarray(argc + 1, sizeof *argv, PERM); { for (i = 0; i < argc; i++) { string_ty *arg = Seq_remlo(pickle->argv); argv[i] = (char *)arg->str; free(arg); } argv[i] = NULL; assert(i == argc); Seq_free(&pickle->argv); } for (i = argc - 1; i > 0; i--) if (strncmp(argv[i], "-target=", 8) == 0) break; if (i > 0) { int j; for (j = 0; bindings[j].name && bindings[j].ir; j++) if (strcmp(&argv[i][8], bindings[j].name) == 0) { IR = bindings[j].ir; break; } } if (!IR) { fprint(stderr, "%s: unknown target", argv[0]); if (i > 0) fprint(stderr, " `%s'", &argv[i][8]); fprint(stderr, "; must specify one of\n"); for (i = 0; bindings[i].name; i++) fprint(stderr, "\t-target=%s\n", bindings[i].name); exit(EXIT_FAILURE); } IR->wants_dag = 0; /* pickle's hold trees */ init(argc, argv); genlabel(pickle->nlabels); level = GLOBAL; { int i, count; nuids = pickle->nuids; items = newarray(nuids, sizeof *items, PERM); itemmap = newarray(nuids, sizeof *items, PERM); for (i = 0; i < nuids; i++) { itemmap[i] = NULL; items[i] = NULL; } (*IR->progbeg)(argc, argv); count = Seq_length(pickle->items); for (i = 0; i < count; i++) { rcc_item_ty item = Seq_remlo(pickle->items); int uid = item->uid; assert(uid >= 0 && uid < nuids); assert(items[uid] == NULL); items[uid] = item; } Seq_free(&pickle->items);#define xx(s) assert(rcc_##s##_enum < sizeof doX/sizeof doX[0] && doX[rcc_##s##_enum]==0); \ doX[rcc_##s##_enum] = do##s; xx(Export) xx(Import) xx(Global) xx(Local) xx(Address) xx(Segment) xx(Defaddress) xx(Deflabel) xx(Defconst) xx(Defconstf) xx(Defstring) xx(Space) xx(Function) xx(Blockbeg) xx(Blockend) xx(Forest)#undef xx count = Seq_length(pickle->interfaces); for (i = 0; i < count; i++) interface(Seq_remlo(pickle->interfaces)); Seq_free(&pickle->interfaces); free(pickle); (*IR->progend)(); } deallocate(PERM); return errcnt > 0;}/* main_init - process program arguments */void main_init(int argc, char *argv[]) { int i; static int inited; if (inited) return; inited = 1; for (i = 1; i < argc; i++) if (strcmp(argv[i], "-g") == 0 || strcmp(argv[i], "-g2") == 0) glevel = 2; else if (strcmp(argv[i], "-w") == 0) wflag++; else if (strcmp(argv[i], "-v") == 0) { fprint(stderr, "%s %s\n", argv[0], rcsid); verbose++; } else if (strncmp(argv[i], "-errout=", 8) == 0) { FILE *f = fopen(argv[i]+8, "w"); if (f == NULL) { fprint(stderr, "%s: can't write errors to `%s'\n", argv[0], argv[i]+8); exit(EXIT_FAILURE); } fclose(f); f = freopen(argv[i]+8, "w", stderr); assert(f); } else if (strncmp(argv[i], "-e", 2) == 0) { int x; if ((x = strtol(&argv[i][2], NULL, 0)) > 0) errlimit = x; }}void init(int argc, char *argv[]) { {extern void main_init(int, char *[]); main_init(argc, argv);} {extern void prof_init(int, char *[]); prof_init(argc, argv);} {extern void trace_init(int, char *[]); trace_init(argc, argv);} {extern void type_init(int, char *[]); type_init(argc, argv);} {extern void x86linux_init(int, char *[]); x86linux_init(argc, argv);}}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?