static int run(int argc, char **argv, const char *filename, const char *outname, const char *type, const char *symtabpath, struct hashmap *macros, int verbose) { struct idl idl; struct sym iface; unsigned char _outname[PATH_MAX]; memset(&idl, 0, sizeof(idl)); idl.argc = argc; idl.argv = argv; idl.type = type; idl.macros = macros; idl.verbose = verbose; idl.al = NULL; if ((idl.syms = hashmap_new(hash_str, cmp_str, NULL, idl.al)) == NULL || (idl.consts = hashmap_new(hash_str, cmp_str, NULL, idl.al)) == NULL || (idl.tmp = hashmap_new(hash_str, cmp_str, NULL, idl.al)) == NULL) { AMSG(""); return -1; } if (symload(&idl, symtabpath) == -1) { if (errno != ENOENT || symload(&idl, path_filename(symtabpath)) == -1) { AMSG(""); return -1; } } /* generate parse tree in iface */ syminit(&iface, idl.al); if (idl_process_file(&idl, filename, &iface) == -1) { AMSG(""); return -1; } if (idl.verbose > 1) { print_tree(&idl, &iface, 0); /* print everything */ } else if (idl.verbose) { iter_t iter; struct sym *mem; linkedlist_iterate(&iface.mems, &iter); while ((mem = linkedlist_next(&iface.mems, &iter))) { if (IS_OPERATION(mem) == 0) { continue; } print_tree(&idl, mem, 0); /* only print operations and their params */ } } if (idl.verbose) fprintf(stderr, " No Flg Type Ptr Name OutType NdrType Siz Aln Off Attributes\n"); mkoutname(_outname, outname ? outname : filename, ""); idl.outname = dupstr(path_filename(_outname), NULL); if (strcmp(type, "jcifs") == 0) { mkoutname(_outname, outname ? outname : filename, ".java"); if (run_one(&idl, &iface, _outname, emit_stub_jcifs) == -1) { AMSG(""); return -1; } } else if (strcmp(type, "java") == 0) { mkoutname(_outname, outname ? outname : filename, ".java"); if (run_one(&idl, &iface, _outname, emit_stub_java) == -1) { AMSG(""); return -1; } } else if (*type == 's') { mkoutname(_outname, outname ? outname : filename, ".c"); if (run_one(&idl, &iface, _outname, emit_stub_samba) == -1) { AMSG(""); return -1; } } else if (*type == 'c') { mkoutname(_outname, outname ? outname : filename, ".h"); if (run_one(&idl, &iface, _outname, emit_hdr_c) == -1) { AMSG(""); return -1; } mkoutname(_outname, outname ? outname : filename, "_s.c"); if (run_one(&idl, &iface, _outname, emit_svr_stub_c) == -1) { AMSG(""); return -1; } mkoutname(_outname, outname ? outname : filename, "_c.c"); } return 0; }
void main(int argc, char *argv[]) { int fd; int32_t i, j, k, n; char *name; uint32_t *data; int64_t tbase; uint32_t sum; int32_t delta; Symbol s; Biobuf outbuf; Fhdr f; Dir *d; struct COUNTER *cp; if(argc != 3) error(0, "usage: kprof text data"); /* * Read symbol table */ fd = open(argv[1], OREAD); if(fd < 0) error(1, argv[1]); if (!crackhdr(fd, &f)) error(1, "read text header"); if (f.type == FNONE) error(0, "text file not an a.out"); if (syminit(fd, &f) < 0) error(1, "syminit"); close(fd); /* * Read timing data */ fd = open(argv[2], OREAD); if(fd < 0) error(1, argv[2]); d = dirfstat(fd); if(d == nil) error(1, "stat"); n = d->length/sizeof(data[0]); if(n < 2) error(0, "data file too short"); data = malloc(d->length); if(data == 0) error(1, "malloc"); if(read(fd, data, d->length) < 0) error(1, "text read"); close(fd); for(i=0; i<n; i++) data[i] = beswal(data[i]); delta = data[0]-data[1]; print("total: %ld in kernel text: %ld outside kernel text: %ld\n", data[0], delta, data[1]); if(data[0] == 0) exits(0); if (!textsym(&s, 0)) error(0, "no text symbols"); tbase = mach->kbase; if(tbase != s.value & ~0xFFF) print("warning: kbase %.8llux != tbase %.8llux\n", tbase, s.value&~0xFFF); print("KTZERO %.8llux PGSIZE %dKb\n", tbase, mach->pgsize/1024); /* * Accumulate counts for each function */ cp = 0; k = 0; for (i = 0, j = 2; j < n; i++) { name = s.name; /* save name */ if (!textsym(&s, i)) /* get next symbol */ break; s.value -= tbase; s.value /= PCRES; sum = 0; while (j < n && j < s.value) sum += data[j++]; if (sum) { cp = realloc(cp, (k+1)*sizeof(struct COUNTER)); if (cp == 0) error(1, "realloc"); cp[k].name = name; cp[k].time = sum; k++; } } if (!k) error(0, "no counts"); cp[k].time = 0; /* "etext" can take no time */ /* * Sort by time and print */ qsort(cp, k, sizeof(struct COUNTER), compar); Binit(&outbuf, 1, OWRITE); Bprint(&outbuf, "ms %% sym\n"); while(--k>=0) Bprint(&outbuf, "%ld\t%3lld.%lld\t%s\n", cp[k].time, 100LL*cp[k].time/delta, (1000LL*cp[k].time/delta)%10, cp[k].name); exits(0); }
int main(int argc, char *argv[]) { const char *fs = NULL; setlocale(LC_CTYPE, ""); setlocale(LC_NUMERIC, "C"); /* for parsing cmdline & prog */ cmdname = argv[0]; if (argc == 1) { fprintf(stderr, "usage: %s [-F fs] [-v var=value] [-f progfile | 'prog'] [file ...]\n", cmdname); exit(1); } signal(SIGFPE, fpecatch); yyin = NULL; symtab = makesymtab(NSYMTAB/NSYMTAB); while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { if (strcmp(argv[1],"-version") == 0 || strcmp(argv[1],"--version") == 0) { printf("awk %s\n", version); exit(0); break; } if (strncmp(argv[1], "--", 2) == 0) { /* explicit end of args */ argc--; argv++; break; } switch (argv[1][1]) { case 's': if (strcmp(argv[1], "-safe") == 0) safe = 1; break; case 'f': /* next argument is program filename */ argc--; argv++; if (argc <= 1) FATAL("no program filename"); if (npfile >= MAX_PFILE - 1) FATAL("too many -f options"); pfile[npfile++] = argv[1]; break; case 'F': /* set field separator */ if (argv[1][2] != 0) { /* arg is -Fsomething */ if (argv[1][2] == 't' && argv[1][3] == 0) /* wart: t=>\t */ fs = "\t"; else if (argv[1][2] != 0) fs = &argv[1][2]; } else { /* arg is -F something */ argc--; argv++; if (argc > 1 && argv[1][0] == 't' && argv[1][1] == 0) /* wart: t=>\t */ fs = "\t"; else if (argc > 1 && argv[1][0] != 0) fs = &argv[1][0]; } if (fs == NULL || *fs == '\0') WARNING("field separator FS is empty"); break; case 'v': /* -v a=1 to be done NOW. one -v for each */ if (argv[1][2] == '\0' && --argc > 1 && isclvar((++argv)[1])) setclvar(argv[1]); break; case 'd': dbg = atoi(&argv[1][2]); if (dbg == 0) dbg = 1; printf("awk %s\n", version); break; default: WARNING("unknown option %s ignored", argv[1]); break; } argc--; argv++; } /* argv[1] is now the first argument */ if (npfile == 0) { /* no -f; first argument is program */ if (argc <= 1) { if (dbg) exit(0); FATAL("no program given"); } dprintf( ("program = |%s|\n", argv[1]) ); lexprog = argv[1]; argc--; argv++; } recinit(recsize); syminit(); compile_time = 1; argv[0] = cmdname; /* put prog name at front of arglist */ dprintf( ("argc=%d, argv[0]=%s\n", argc, argv[0]) ); arginit(argc, argv); if (!safe) envinit(environ); yyparse(); setlocale(LC_NUMERIC, ""); /* back to whatever it is locally */ if (fs) *FS = qstring(fs, '\0'); dprintf( ("errorflag=%d\n", errorflag) ); if (errorflag == 0) { compile_time = 0; run(winner); } else bracecheck(); return(errorflag); }
void compile(BOOLEAN global) { LEXEME *lex = NULL ; SetGlobalFlag(TRUE); helpinit(); errorinit(); constoptinit(); declare_init(); init_init(); inlineinit(); lambda_init(); rtti_init(); expr_init(); libcxx_init(); statement_ini(global); syminit(); preprocini(infile, inputFile); lexini(); setglbdefs(); templateInit(); #ifndef PARSER_ONLY SSAInit(); outcodeini(); conflictini(); iexpr_init(); iinlineInit(); flow_init(); genstmtini(); #endif ParseBuiltins(); if (chosenAssembler->intrinsicInit) chosenAssembler->intrinsicInit(); if (chosenAssembler->inlineAsmInit) chosenAssembler->inlineAsmInit(); if (chosenAssembler->outcode_init) chosenAssembler->outcode_init(); if (chosenAssembler->enter_filename) chosenAssembler->enter_filename(clist->data); if (cparams.prm_debug && chosenDebugger && chosenDebugger->init) chosenDebugger->init(); if (cparams.prm_browse && chosenDebugger && chosenDebugger->init_browsedata) chosenDebugger->init_browsedata(clist->data); browse_init(); browse_startfile(infile, 0); if (cparams.prm_assemble) { lex = getsym(); if (lex) { BLOCKDATA block; memset(&block, 0, sizeof(block)); block.type = begin; while ((lex = statement_asm(lex, NULL, &block)) != NULL) ; #ifndef PARSER_ONLY genASM(block.head); #endif } } else { #ifndef PARSER_ONLY asm_header(clist->data, version); #endif lex = getsym(); if (lex) { while ((lex = declare(lex, NULL, NULL, sc_global, lk_none, NULL, TRUE, FALSE, FALSE, FALSE, ac_public)) != NULL) ; } } #ifdef PARSER_ONLY ccDumpSymbols(); #endif if (!total_errors) { dumpInlines(); dumpInitializers(); dumpInlines(); dumpStartups(); #ifndef PARSER_ONLY dumpLits(); #endif /* rewrite_icode(); */ if (chosenAssembler->gen->finalGen) chosenAssembler->gen->finalGen(); if (!cparams.prm_assemble && cparams.prm_debug) if (chosenDebugger && chosenDebugger->outputtypedef) debug_dumptypedefs(globalNameSpace); #ifndef PARSER_ONLY putexterns(); #endif if (!cparams.prm_asmfile) if (chosenAssembler->output_obj_file) chosenAssembler->output_obj_file(); } findUnusedStatics(globalNameSpace); dumperrs(stdout); if (cparams.prm_debug && chosenDebugger && chosenDebugger->rundown) chosenDebugger->rundown(); if (cparams.prm_browse && chosenDebugger && chosenDebugger->rundown_browsedata) chosenDebugger->rundown_browsedata(); #ifndef PARSER_ONLY if (!cparams.prm_assemble) asm_trailer(); #endif }
int main(int argc, char *argv[]) { char *fs = NULL, *marg; int temp; cmdname = argv[0]; if (argc == 1) { fprintf(stderr, "Usage: %s [-f programfile | 'program'] [-Ffieldsep] [-v var=value] [files]\n", cmdname); exit(1); } signal(SIGFPE, fpecatch); yyin = NULL; symtab = makesymtab(NSYMTAB); while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { if (strcmp(argv[1], "--") == 0) { /* explicit end of args */ argc--; argv++; break; } switch (argv[1][1]) { case 's': if (strcmp(argv[1], "-safe") == 0) safe = 1; break; case 'f': /* next argument is program filename */ argc--; argv++; if (argc <= 1) FATAL("no program filename"); pfile[npfile++] = argv[1]; break; case 'F': /* set field separator */ if (argv[1][2] != 0) { /* arg is -Fsomething */ if (argv[1][2] == 't' && argv[1][3] == 0) /* wart: t=>\t */ fs = "\t"; else if (argv[1][2] != 0) fs = &argv[1][2]; } else { /* arg is -F something */ argc--; argv++; if (argc > 1 && argv[1][0] == 't' && argv[1][1] == 0) /* wart: t=>\t */ fs = "\t"; else if (argc > 1 && argv[1][0] != 0) fs = &argv[1][0]; } if (fs == NULL || *fs == '\0') WARNING("field separator FS is empty"); break; case 'v': /* -v a=1 to be done NOW. one -v for each */ if (argv[1][2] == '\0' && --argc > 1 && isclvar((++argv)[1])) setclvar(argv[1]); break; case 'm': /* more memory: -mr=record, -mf=fields */ /* no longer needed */ marg = argv[1]; if (argv[1][3]) temp = atoi(&argv[1][3]); else { argv++; argc--; temp = atoi(&argv[1][0]); } switch (marg[2]) { case 'r': recsize = temp; break; case 'f': nfields = temp; break; default: FATAL("unknown option %s\n", marg); } break; case 'd': dbg = atoi(&argv[1][2]); if (dbg == 0) dbg = 1; printf("awk %s\n", version); break; case 'V': /* added for exptools "standard" */ printf("awk %s\n", version); exit(0); break; default: WARNING("unknown option %s ignored", argv[1]); break; } argc--; argv++; } /* argv[1] is now the first argument */ if (npfile == 0) { /* no -f; first argument is program */ if (argc <= 1) { if (dbg) exit(0); FATAL("no program given"); } dprintf( ("program = |%s|\n", argv[1]) ); lexprog = argv[1]; argc--; argv++; } recinit(recsize); syminit(); compile_time = 1; argv[0] = cmdname; /* put prog name at front of arglist */ dprintf( ("argc=%d, argv[0]=%s\n", argc, argv[0]) ); arginit(argc, argv); if (!safe) envinit(environ); yyparse(); if (fs) *FS = qstring(fs, '\0'); dprintf( ("errorflag=%d\n", errorflag) ); if (errorflag == 0) { compile_time = 0; run(winner); } else bracecheck(); return(errorflag); }
int main(int argc, char *argv[]) { int i; char *ppfile; ARGBEGIN{ case 'P': pprof =1; ppfile = EARGF(Usage()); pproffd = Bopen(ppfile, OWRITE); if(pproffd == nil) { fprint(2, "prof: cannot open %s: %r\n", ppfile); exit(2); } break; case 'd': delta_msec = atoi(EARGF(Usage())); break; case 't': total_sec = atoi(EARGF(Usage())); break; case 'p': pid = atoi(EARGF(Usage())); break; case 'f': functions = 1; break; case 'h': histograms = 1; break; case 'l': linenums = 1; break; case 'r': registers = 1; break; case 's': stacks++; break; default: Usage(); }ARGEND if(pid <= 0 && argc == 0) Usage(); if(functions+linenums+registers+stacks+pprof == 0) histograms = 1; if(!machbyname("amd64")) { fprint(2, "prof: no amd64 support\n", pid); exit(1); } if(argc > 0) file = argv[0]; else if(pid) { file = proctextfile(pid); if (file == NULL) { fprint(2, "prof: can't find file for pid %d: %r\n", pid); fprint(2, "prof: on Darwin, need to provide file name explicitly\n"); exit(1); } } fd = open(file, 0); if(fd < 0) { fprint(2, "prof: can't open %s: %r\n", file); exit(1); } if(crackhdr(fd, &fhdr)) { have_syms = syminit(fd, &fhdr); if(!have_syms) { fprint(2, "prof: no symbols for %s: %r\n", file); } } else { fprint(2, "prof: crack header for %s: %r\n", file); exit(1); } if(pid <= 0) pid = startprocess(argv); attachproc(pid, &fhdr); // initializes thread list if(setarch() < 0) { detach(); fprint(2, "prof: can't identify binary architecture for pid %d\n", pid); exit(1); } if(getthreads() <= 0) { detach(); fprint(2, "prof: can't find threads for pid %d\n", pid); exit(1); } for(i = 0; i < nthread; i++) ctlproc(thread[i], "start"); samples(); detach(); dumphistogram(); dumppprof(); exit(0); }
void readtext(char *s) { Dir *d; Lsym *l; Value *v; Symbol sym; ulong length; extern Machdata mipsmach; if(mtype != 0){ symmap = newmap(0, 1); if(symmap == 0) print("%s: (error) loadmap: cannot make symbol map\n", argv0); length = 1<<24; d = dirfstat(text); if(d != nil) { length = d->length; free(d); } setmap(symmap, text, 0, length, 0, "binary"); free(d); return; } machdata = &mipsmach; if(!crackhdr(text, &fhdr)) { print("can't decode file header\n"); return; } symmap = loadmap(0, text, &fhdr); if(symmap == 0) print("%s: (error) loadmap: cannot make symbol map\n", argv0); if(syminit(text, &fhdr) < 0) { print("%s: (error) syminit: %r\n", argv0); return; } print("%s:%s\n\n", s, fhdr.name); if(mach->sbreg && lookup(0, mach->sbreg, &sym)) { mach->sb = sym.value; l = enter("SB", Tid); l->v->vstore.fmt = 'X'; l->v->vstore.u0.sival = mach->sb; l->v->type = TINT; l->v->set = 1; } l = mkvar("objtype"); v = l->v; v->vstore.fmt = 's'; v->set = 1; v->vstore.u0.sstring = strnode(mach->name); v->type = TSTRING; l = mkvar("textfile"); v = l->v; v->vstore.fmt = 's'; v->set = 1; v->vstore.u0.sstring = strnode(s); v->type = TSTRING; machbytype(fhdr.type); varreg(); }
int main(int argc, char *argv[]) { int i; ARGBEGIN{ case 'd': delta_msec = atoi(EARGF(Usage())); break; case 't': total_sec = atoi(EARGF(Usage())); break; case 'p': pid = atoi(EARGF(Usage())); break; case 'f': functions = 1; break; case 'h': histograms = 1; break; case 'l': linenums = 1; break; case 'r': registers = 1; break; case 's': stacks++; break; }ARGEND if(pid <= 0 && argc == 0) Usage(); if(functions+linenums+registers+stacks == 0) histograms = 1; if(!machbyname("amd64")) { fprint(2, "prof: no amd64 support\n", pid); exit(1); } if(argc > 0) file = argv[0]; else if(pid) file = proctextfile(pid); fd = open(file, 0); if(fd < 0) { fprint(2, "prof: can't open %s: %r\n", file); exit(1); } if(crackhdr(fd, &fhdr)) { have_syms = syminit(fd, &fhdr); if(!have_syms) { fprint(2, "prof: no symbols for %s: %r\n", file); } } else { fprint(2, "prof: crack header for %s: %r\n", file); exit(1); } if(pid <= 0) pid = startprocess(argv); attachproc(pid, &fhdr); // initializes thread list if(getthreads() <= 0) { detach(); fprint(2, "prof: can't find threads for pid %d\n", pid); exit(1); } for(i = 0; i < nthread; i++) ctlproc(thread[i], "start"); samples(); detach(); dumphistogram(); exit(0); }