void c_typecheck_baset::typecheck_array_type(array_typet &type) { exprt &size=type.size(); source_locationt source_location=size.find_source_location(); // check subtype typecheck_type(type.subtype()); // we don't allow void as subtype if(follow(type.subtype()).id()==ID_empty) { error().source_location=type.source_location(); error() << "array of voids" << eom; throw 0; } // check size, if any if(size.is_not_nil()) { typecheck_expr(size); make_index_type(size); // The size need not be a constant! // We simplify it, for the benefit of array initialisation. exprt tmp_size=size; add_rounding_mode(tmp_size); simplify(tmp_size, *this); if(tmp_size.is_constant()) { mp_integer s; if(to_integer(tmp_size, s)) { error().source_location=source_location; error() << "failed to convert constant: " << tmp_size.pretty() << eom; throw 0; } if(s<0) { error().source_location=source_location; error() << "array size must not be negative, " "but got " << s << eom; throw 0; } size=tmp_size; } else if(tmp_size.id()==ID_infinity) { size=tmp_size; } else if(tmp_size.id()==ID_symbol && tmp_size.type().get_bool(ID_C_constant)) { // We allow a constant variable as array size, assuming // it won't change. // This criterion can be tricked: // Of course we can modify a 'const' symbol, e.g., // using a pointer type cast. Interestingly, // at least gcc 4.2.1 makes the very same mistake! size=tmp_size; } else { // not a constant and not infinity assert(current_symbol_id!=irep_idt()); const symbolt &base_symbol=lookup(current_symbol_id); // Need to pull out! We insert new symbol. source_locationt source_location=size.find_source_location(); unsigned count=0; irep_idt temp_identifier; std::string suffix; do { suffix="$array_size"+std::to_string(count); temp_identifier=id2string(base_symbol.name)+suffix; count++; } while(symbol_table.symbols.find(temp_identifier)!= symbol_table.symbols.end()); // add the symbol to symbol table auxiliary_symbolt new_symbol; new_symbol.name=temp_identifier; new_symbol.pretty_name=id2string(base_symbol.pretty_name)+suffix; new_symbol.base_name=id2string(base_symbol.base_name)+suffix; new_symbol.type=size.type(); new_symbol.type.set(ID_C_constant, true); new_symbol.is_type=false; new_symbol.is_static_lifetime=false; new_symbol.value.make_nil(); new_symbol.location=source_location; symbol_table.add(new_symbol); // produce the code that declares and initializes the symbol symbol_exprt symbol_expr; symbol_expr.set_identifier(temp_identifier); symbol_expr.type()=new_symbol.type; code_declt declaration(symbol_expr); declaration.add_source_location()=source_location; code_assignt assignment; assignment.lhs()=symbol_expr; assignment.rhs()=size; assignment.add_source_location()=source_location; // store the code clean_code.push_back(declaration); clean_code.push_back(assignment); // fix type size=symbol_expr; } } }
int fsck_main(int argc, char **argv) { int i, status = 0; int interactive = 0; const char *fstab; struct fs_info *fs; setvbuf(stdout, NULL, _IONBF, BUFSIZ); setvbuf(stderr, NULL, _IONBF, BUFSIZ); blkid_get_cache(&cache, NULL); PRS(argc, argv); if (!notitle) printf("fsck %s (%s)\n", E2FSPROGS_VERSION, E2FSPROGS_DATE); fstab = getenv("FSTAB_FILE"); if (!fstab) fstab = _PATH_MNTTAB; load_fs_info(fstab); fsck_path = e2fs_set_sbin_path(); if ((num_devices == 1) || (serialize)) interactive = 1; /* If -A was specified ("check all"), do that! */ if (doall) return check_all(); if (num_devices == 0) { serialize++; interactive++; return check_all(); } for (i = 0; i < num_devices; i++) { if (cancel_requested) { if (!kill_sent) { kill_all(SIGTERM); kill_sent++; } break; } fs = lookup(devices[i]); if (!fs) { fs = create_fs_device(devices[i], 0, "auto", 0, -1, -1); if (!fs) continue; } fsck_device(fs, interactive); if (serialize || (max_running && (num_running >= max_running))) { struct fsck_instance *inst; inst = wait_one(0); if (inst) { status |= inst->exit_status; free_instance(inst); } if (verbose > 1) printf("----------------------------------\n"); } } status |= wait_many(FLAG_WAIT_ALL); blkid_put_cache(cache); return status; }
/* known -- test if a symbol has been entered */ boolean known(const char *name) { symbol s = lookup(name, FALSE); return (s != NULL); }
Symbol* SymbolTable::lookup(SharedState* shared, const std::string& str) { return lookup(str.data(), str.size(), Encoding::eAscii, shared->hash_seed); }
Symbol* SymbolTable::lookup(STATE, const char* str, size_t length) { return lookup(str, length, Encoding::eAscii, state->hash_seed()); }
void asmsym(void) { Prog *p; Auto *a; Sym *s; int h; s = lookup("etext", 0); if(s->type == STEXT) putsymb(s->name, 'T', s->value, s->version); for(h=0; h<NHASH; h++) for(s=hash[h]; s!=S; s=s->link) switch(s->type) { case SCONST: putsymb(s->name, 'D', s->value, s->version); continue; case SDATA: putsymb(s->name, 'D', s->value+INITDAT, s->version); continue; case SBSS: putsymb(s->name, 'B', s->value+INITDAT, s->version); continue; case SFILE: putsymb(s->name, 'f', s->value, s->version); continue; } for(p=textp; p!=P; p=p->pcond) { s = p->from.sym; if(s->type != STEXT) continue; /* filenames first */ for(a=p->to.autom; a; a=a->link) if(a->type == D_FILE) putsymb(a->asym->name, 'z', a->aoffset, 0); else if(a->type == D_FILE1) putsymb(a->asym->name, 'Z', a->aoffset, 0); putsymb(s->name, 'T', s->value, s->version); /* frame, auto and param after */ putsymb(".frame", 'm', p->to.offset+4, 0); for(a=p->to.autom; a; a=a->link) if(a->type == D_AUTO) putsymb(a->asym->name, 'a', -a->aoffset, 0); else if(a->type == D_PARAM) putsymb(a->asym->name, 'p', a->aoffset, 0); } if(debug['v'] || debug['n']) Bprint(&bso, "symsize = %lud\n", symsize); Bflush(&bso); }
void dostkoff(void) { Prog *p, *q, *q1; int32 autoffset, deltasp; int a, pcsize; uint32 moreconst1, moreconst2, i; for(i=0; i<nelem(morename); i++) { symmorestack[i] = lookup(morename[i], 0); if(symmorestack[i]->type != STEXT) diag("morestack trampoline not defined - %s", morename[i]); pmorestack[i] = symmorestack[i]->text; } for(cursym = textp; cursym != nil; cursym = cursym->next) { if(cursym->text == nil || cursym->text->link == nil) continue; p = cursym->text; parsetextconst(p->to.offset); autoffset = textstksiz; if(autoffset < 0) autoffset = 0; q = P; if((p->from.scale & NOSPLIT) && autoffset >= StackSmall) diag("nosplit func likely to overflow stack"); if(!(p->from.scale & NOSPLIT)) { p = appendp(p); // load g into CX p->as = AMOVQ; if(HEADTYPE == Hlinux || HEADTYPE == Hfreebsd || HEADTYPE == Hopenbsd || HEADTYPE == Hnetbsd) // ELF uses FS p->from.type = D_INDIR+D_FS; else p->from.type = D_INDIR+D_GS; p->from.offset = tlsoffset+0; p->to.type = D_CX; if(HEADTYPE == Hwindows) { // movq %gs:0x28, %rcx // movq (%rcx), %rcx p->as = AMOVQ; p->from.type = D_INDIR+D_GS; p->from.offset = 0x28; p->to.type = D_CX; p = appendp(p); p->as = AMOVQ; p->from.type = D_INDIR+D_CX; p->from.offset = 0; p->to.type = D_CX; } if(debug['K']) { // 6l -K means check not only for stack // overflow but stack underflow. // On underflow, INT 3 (breakpoint). // Underflow itself is rare but this also // catches out-of-sync stack guard info p = appendp(p); p->as = ACMPQ; p->from.type = D_INDIR+D_CX; p->from.offset = 8; p->to.type = D_SP; p = appendp(p); p->as = AJHI; p->to.type = D_BRANCH; p->to.offset = 4; q1 = p; p = appendp(p); p->as = AINT; p->from.type = D_CONST; p->from.offset = 3; p = appendp(p); p->as = ANOP; q1->pcond = p; } if(autoffset < StackBig) { // do we need to call morestack? if(autoffset <= StackSmall) { // small stack p = appendp(p); p->as = ACMPQ; p->from.type = D_SP; p->to.type = D_INDIR+D_CX; } else { // large stack p = appendp(p); p->as = ALEAQ; p->from.type = D_INDIR+D_SP; p->from.offset = -(autoffset-StackSmall); p->to.type = D_AX; p = appendp(p); p->as = ACMPQ; p->from.type = D_AX; p->to.type = D_INDIR+D_CX; } // common p = appendp(p); p->as = AJHI; p->to.type = D_BRANCH; p->to.offset = 4; q = p; } // If we ask for more stack, we'll get a minimum of StackMin bytes. // We need a stack frame large enough to hold the top-of-stack data, // the function arguments+results, our caller's PC, our frame, // a word for the return PC of the next call, and then the StackLimit bytes // that must be available on entry to any function called from a function // that did a stack check. If StackMin is enough, don't ask for a specific // amount: then we can use the custom functions and save a few // instructions. moreconst1 = 0; if(StackTop + textarg + PtrSize + autoffset + PtrSize + StackLimit >= StackMin) moreconst1 = autoffset; moreconst2 = textarg; // 4 varieties varieties (const1==0 cross const2==0) // and 6 subvarieties of (const1==0 and const2!=0) p = appendp(p); if(moreconst1 == 0 && moreconst2 == 0) { p->as = ACALL; p->to.type = D_BRANCH; p->pcond = pmorestack[0]; p->to.sym = symmorestack[0]; } else if(moreconst1 != 0 && moreconst2 == 0) { p->as = AMOVL; p->from.type = D_CONST; p->from.offset = moreconst1; p->to.type = D_AX; p = appendp(p); p->as = ACALL; p->to.type = D_BRANCH; p->pcond = pmorestack[1]; p->to.sym = symmorestack[1]; } else if(moreconst1 == 0 && moreconst2 <= 48 && moreconst2%8 == 0) { i = moreconst2/8 + 3; p->as = ACALL; p->to.type = D_BRANCH; p->pcond = pmorestack[i]; p->to.sym = symmorestack[i]; } else if(moreconst1 == 0 && moreconst2 != 0) { p->as = AMOVL; p->from.type = D_CONST; p->from.offset = moreconst2; p->to.type = D_AX; p = appendp(p); p->as = ACALL; p->to.type = D_BRANCH; p->pcond = pmorestack[2]; p->to.sym = symmorestack[2]; } else { p->as = AMOVQ; p->from.type = D_CONST; p->from.offset = (uint64)moreconst2 << 32; p->from.offset |= moreconst1; p->to.type = D_AX; p = appendp(p); p->as = ACALL; p->to.type = D_BRANCH; p->pcond = pmorestack[3]; p->to.sym = symmorestack[3]; } } if(q != P) q->pcond = p->link; if(autoffset) { p = appendp(p); p->as = AADJSP; p->from.type = D_CONST; p->from.offset = autoffset; p->spadj = autoffset; if(q != P) q->pcond = p; } deltasp = autoffset; if(debug['K'] > 1 && autoffset) { // 6l -KK means double-check for stack overflow // even after calling morestack and even if the // function is marked as nosplit. p = appendp(p); p->as = AMOVQ; p->from.type = D_INDIR+D_CX; p->from.offset = 0; p->to.type = D_BX; p = appendp(p); p->as = ASUBQ; p->from.type = D_CONST; p->from.offset = StackSmall+32; p->to.type = D_BX; p = appendp(p); p->as = ACMPQ; p->from.type = D_SP; p->to.type = D_BX; p = appendp(p); p->as = AJHI; p->to.type = D_BRANCH; q1 = p; p = appendp(p); p->as = AINT; p->from.type = D_CONST; p->from.offset = 3; p = appendp(p); p->as = ANOP; q1->pcond = p; } for(; p != P; p = p->link) { pcsize = p->mode/8; a = p->from.type; if(a == D_AUTO) p->from.offset += deltasp; if(a == D_PARAM) p->from.offset += deltasp + pcsize; a = p->to.type; if(a == D_AUTO) p->to.offset += deltasp; if(a == D_PARAM) p->to.offset += deltasp + pcsize; switch(p->as) { default: continue; case APUSHL: case APUSHFL: deltasp += 4; p->spadj = 4; continue; case APUSHQ: case APUSHFQ: deltasp += 8; p->spadj = 8; continue; case APUSHW: case APUSHFW: deltasp += 2; p->spadj = 2; continue; case APOPL: case APOPFL: deltasp -= 4; p->spadj = -4; continue; case APOPQ: case APOPFQ: deltasp -= 8; p->spadj = -8; continue; case APOPW: case APOPFW: deltasp -= 2; p->spadj = -2; continue; case ARET: break; } if(autoffset != deltasp) diag("unbalanced PUSH/POP"); if(autoffset) { p->as = AADJSP; p->from.type = D_CONST; p->from.offset = -autoffset; p->spadj = -autoffset; p = appendp(p); p->as = ARET; // If there are instructions following // this ARET, they come from a branch // with the same stackframe, so undo // the cleanup. p->spadj = +autoffset; } } } }
/* Searches for the element with the given name in the given directory. Returns the sector of the given element, or -1 if the element was not found in dir. */ int dir_lookup (struct file *dir, const char *name) { ASSERT (file_is_dir (dir)); return lookup (dir, name, NULL, NULL); }
void main(int argc, char **argv) { char *mntpt, *srvpost, srvfile[64]; int backwards = 0, fd, mntflags, oldserver; quotefmtinstall(); srvpost = nil; oldserver = 0; mntflags = MREPL; ARGBEGIN{ case 'A': doauth = 0; break; case 'a': mntflags = MAFTER; break; case 'b': mntflags = MBEFORE; break; case 'c': mntflags |= MCREATE; break; case 'C': mntflags |= MCACHE; break; case 'd': debug++; break; case 'f': /* ignored but allowed for compatibility */ break; case 'O': case 'o': oldserver = 1; break; case 'E': if ((encproto = lookup(EARGF(usage()), encprotos)) < 0) usage(); break; case 'e': ealgs = EARGF(usage()); if(*ealgs == 0 || strcmp(ealgs, "clear") == 0) ealgs = nil; break; case 'k': keyspec = EARGF(usage()); break; case 'p': filterp = aan; break; case 's': srvpost = EARGF(usage()); break; case 'B': backwards = 1; break; default: usage(); }ARGEND; mntpt = 0; /* to shut up compiler */ if(backwards){ switch(argc) { default: mntpt = argv[0]; break; case 0: usage(); } } else { switch(argc) { case 2: mntpt = argv[1]; break; case 3: mntpt = argv[2]; break; default: usage(); } } if (encproto == Enctls) sysfatal("%s: tls has not yet been implemented", argv[0]); notify(catcher); alarm(60*1000); if(backwards) fd = passive(); else fd = connect(argv[0], argv[1], oldserver); if (!oldserver) fprint(fd, "impo %s %s\n", filterp? "aan": "nofilter", encprotos[encproto]); if (encproto != Encnone && ealgs && ai) { uchar key[16]; uchar digest[SHA1dlen]; char fromclientsecret[21]; char fromserversecret[21]; int i; memmove(key+4, ai->secret, ai->nsecret); /* exchange random numbers */ srand(truerand()); for(i = 0; i < 4; i++) key[i] = rand(); if(write(fd, key, 4) != 4) sysfatal("can't write key part: %r"); if(readn(fd, key+12, 4) != 4) sysfatal("can't read key part: %r"); /* scramble into two secrets */ sha1(key, sizeof(key), digest, nil); mksecret(fromclientsecret, digest); mksecret(fromserversecret, digest+10); if (filterp) fd = filter(fd, filterp, argv[0]); /* set up encryption */ procsetname("pushssl"); fd = pushssl(fd, ealgs, fromclientsecret, fromserversecret, nil); if(fd < 0) sysfatal("can't establish ssl connection: %r"); } else if (filterp) fd = filter(fd, filterp, argv[0]); if(srvpost){ sprint(srvfile, "/srv/%s", srvpost); remove(srvfile); post(srvfile, srvpost, fd); } procsetname("mount on %s", mntpt); if(mount(fd, -1, mntpt, mntflags, "") < 0) sysfatal("can't mount %s: %r", argv[1]); alarm(0); if(backwards && argc > 1){ exec(argv[1], &argv[1]); sysfatal("exec: %r"); } exits(0); }
void callback(const MQTT::Publish& pub) { yield(); if (millis() - MQTTtick > MQTTlimit) { MQTTtick = millis(); int commandLoc; String command = ""; String deviceName = ""; String endPoint = ""; topic = pub.topic(); payload = pub.payload_string(); // -- topic parser // syntax: // global: / global / path / command / function // device setup: / deviceInfo / command / name // normal: path / command / name / endpoint // check item 1 in getValue String firstItem = getValue(topic, '/', 1); if (firstItem == "global") { // -- do nothing until I change to $ prefix before command types } else if (firstItem == "deviceInfo") { // get name and command deviceName = getValue(topic, '/', 3); command = getValue(topic, '/', 2); if ((deviceName == thisDeviceName) && (command == "control")) { if (payload == "no states") { // -- do something to send the default states, but now that this is managed by persistence so this shouldn't be necessary // -- maybe it just resets all the states to 0 or whatever was originally programmed into the sketch //sendJSON = true; } else if (payload == "blink on") { Serial.end(); pinMode(BUILTIN_LED, OUTPUT); ticker.attach(0.6, tick_fnc); } else if (payload == "blink off") { ticker.detach(); digitalWrite(BUILTIN_LED, HIGH); pinMode(BUILTIN_LED, INPUT); Serial.begin(115200); } else { // -- persistence will no longer send the default object, if it's an arduino based esp chip, it will just send the control messages to /[device_path]/control/[device_name]/[endpoint_key] } } } else { int i; int maxitems; // count number of items for (i=1; i<topic.length(); i++) { String chunk = getValue(topic, '/', i); if (chunk == NULL) { break; } } // get topic variables maxitems = i; for (i=1; i<maxitems; i++) { String chunk = getValue(topic, '/', i); if (chunk == "control") { commandLoc = i; command = chunk; deviceName = getValue(topic, '/', i + 1); endPoint = getValue(topic, '/', i + 2); break; } } //Serial.println("device and endpoint incoming..."); //Serial.println(deviceName); //Serial.println(endPoint); // send endpoint_key to function stored in namepins.h at compile time // function returns static_endpoint_id associated with that endpoint String lookup_val = lookup(endPoint); //Serial.println("looking value incoming..."); //Serial.println(lookup_val); // sketch acts on that value as it normally would, using the static_endpoint_id to know for sure what it should do (turn output pin on/off, adjust RGB light, etc) if (lookup_val == "RGB") { // deserialize payload, get valueKey // or just look for value or red,green,blue String findKey = getValue(payload, '"', 1); String findValue = getValue(payload, ':', 1); findValue.remove(findValue.length() - 1); if (findKey == "red") { redValue = findValue.toInt(); } else if (findKey == "green") { greenValue = findValue.toInt(); } else if (findKey == "blue") { blueValue = findValue.toInt(); } //neoPixelChange = true; } /* else if (lookup_val == "SECOND STATIC ENDPOINT ID") { } else if (lookup_val == "THIRD STATIC ENDPOINT ID") { } */ // sketch confirms the value by sending it back on /[path]/[confirm]/[device_name]/[endpoint_key] confirmPath = ""; confirmPath = thisDevicePath; confirmPath += "/confirm/"; confirmPath += thisDeviceName; confirmPath += "/"; confirmPath += endPoint; confirmPayload = payload; //sendConfirm = true; client.publish(MQTT::Publish(confirmPath, confirmPayload).set_qos(2)); } } }
void patch(void) { int32 c, vexit; Prog *p, *q; Sym *s; int a; if(debug['v']) Bprint(&bso, "%5.2f patch\n", cputime()); Bflush(&bso); mkfwd(); s = lookup("exit", 0); vexit = s->value; for(cursym = textp; cursym != nil; cursym = cursym->next) { for(p = cursym->text; p != P; p = p->link) { setarch(p); a = p->as; if(seenthumb && a == ABL){ // if((s = p->to.sym) != S && (s1 = curtext->from.sym) != S) // print("%s calls %s\n", s1->name, s->name); if((s = p->to.sym) != S && s->thumb != cursym->thumb) s->foreign = 1; } if((a == ABL || a == ABX || a == AB || a == ARET) && p->to.type != D_BRANCH && p->to.sym != S) { s = p->to.sym; switch(s->type) { default: diag("undefined: %s", s->name); s->type = STEXT; s->value = vexit; continue; // avoid more error messages case STEXT: p->to.offset = s->value; p->to.type = D_BRANCH; break; } } if(p->to.type != D_BRANCH) continue; c = p->to.offset; for(q = textp->text; q != P;) { if(c == q->pc) break; if(q->forwd != P && c >= q->forwd->pc) q = q->forwd; else q = q->link; } if(q == P) { diag("branch out of range %d\n%P", c, p); p->to.type = D_NONE; } p->cond = q; } } for(cursym = textp; cursym != nil; cursym = cursym->next) { for(p = cursym->text; p != P; p = p->link) { setarch(p); a = p->as; if(seenthumb && a == ABL) { #ifdef CALLEEBX if(0) {} #else if((s = p->to.sym) != S && (s->foreign || s->fnptr)) p->as = ABX; #endif else if(p->to.type == D_OREG) p->as = ABX; } if(p->cond != P) { p->cond = brloop(p->cond); if(p->cond != P) if(p->to.type == D_BRANCH) p->to.offset = p->cond->pc; } } } }
void asmb(void) { int32 t; int a, dynsym; uint32 va, fo, w, startva; int strtabsize; ElfEhdr *eh; ElfPhdr *ph, *pph; ElfShdr *sh; Section *sect; strtabsize = 0; if(debug['v']) Bprint(&bso, "%5.2f asmb\n", cputime()); Bflush(&bso); sect = segtext.sect; seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0); codeblk(sect->vaddr, sect->len); /* output read-only data in text segment */ sect = segtext.sect->next; seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0); datblk(sect->vaddr, sect->len); if(debug['v']) Bprint(&bso, "%5.2f datblk\n", cputime()); Bflush(&bso); seek(cout, segdata.fileoff, 0); datblk(segdata.vaddr, segdata.filelen); /* output read-only data in text segment */ sect = segtext.sect->next; seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0); datblk(sect->vaddr, sect->len); /* output symbol table */ symsize = 0; lcsize = 0; if(!debug['s']) { // TODO: rationalize if(debug['v']) Bprint(&bso, "%5.2f sym\n", cputime()); Bflush(&bso); switch(HEADTYPE) { case Hnoheader: case Hrisc: case Hixp1200: case Hipaq: debug['s'] = 1; break; case Hplan9x32: OFFSET = HEADR+textsize+segdata.filelen; seek(cout, OFFSET, 0); break; case Hnetbsd: OFFSET += rnd(segdata.filelen, 4096); seek(cout, OFFSET, 0); break; case Hlinux: OFFSET += segdata.filelen; seek(cout, rnd(OFFSET, INITRND), 0); break; } if(!debug['s']) asmthumbmap(); cflush(); } cursym = nil; if(debug['v']) Bprint(&bso, "%5.2f header\n", cputime()); Bflush(&bso); OFFSET = 0; seek(cout, OFFSET, 0); switch(HEADTYPE) { case Hnoheader: /* no header */ break; case Hrisc: /* aif for risc os */ lputl(0xe1a00000); /* NOP - decompress code */ lputl(0xe1a00000); /* NOP - relocation code */ lputl(0xeb000000 + 12); /* BL - zero init code */ lputl(0xeb000000 + (entryvalue() - INITTEXT + HEADR - 12 - 8) / 4); /* BL - entry code */ lputl(0xef000011); /* SWI - exit code */ lputl(textsize+HEADR); /* text size */ lputl(segdata.filelen); /* data size */ lputl(0); /* sym size */ lputl(segdata.len - segdata.filelen); /* bss size */ lputl(0); /* sym type */ lputl(INITTEXT-HEADR); /* text addr */ lputl(0); /* workspace - ignored */ lputl(32); /* addr mode / data addr flag */ lputl(0); /* data addr */ for(t=0; t<2; t++) lputl(0); /* reserved */ for(t=0; t<15; t++) lputl(0xe1a00000); /* NOP - zero init code */ lputl(0xe1a0f00e); /* B (R14) - zero init return */ break; case Hplan9x32: /* plan 9 */ lput(0x647); /* magic */ lput(textsize); /* sizes */ lput(segdata.filelen); lput(segdata.len - segdata.filelen); lput(symsize); /* nsyms */ lput(entryvalue()); /* va of entry */ lput(0L); lput(lcsize); break; case Hnetbsd: /* boot for NetBSD */ lput((143<<16)|0413); /* magic */ lputl(rnd(HEADR+textsize, 4096)); lputl(rnd(segdata.filelen, 4096)); lputl(segdata.len - segdata.filelen); lputl(symsize); /* nsyms */ lputl(entryvalue()); /* va of entry */ lputl(0L); lputl(0L); break; case Hixp1200: /* boot for IXP1200 */ break; case Hipaq: /* boot for ipaq */ lputl(0xe3300000); /* nop */ lputl(0xe3300000); /* nop */ lputl(0xe3300000); /* nop */ lputl(0xe3300000); /* nop */ break; case Hlinux: /* elf arm */ eh = getElfEhdr(); fo = HEADR; va = INITTEXT; startva = INITTEXT - fo; /* va of byte 0 of file */ w = textsize; /* This null SHdr must appear before all others */ sh = newElfShdr(elfstr[ElfStrEmpty]); /* program header info */ pph = newElfPhdr(); pph->type = PT_PHDR; pph->flags = PF_R + PF_X; pph->off = eh->ehsize; pph->vaddr = INITTEXT - HEADR + pph->off; pph->paddr = INITTEXT - HEADR + pph->off; pph->align = INITRND; if(!debug['d']) { /* interpreter for dynamic linking */ sh = newElfShdr(elfstr[ElfStrInterp]); sh->type = SHT_PROGBITS; sh->flags = SHF_ALLOC; sh->addralign = 1; if(interpreter == nil) interpreter = linuxdynld; elfinterp(sh, startva, interpreter); ph = newElfPhdr(); ph->type = PT_INTERP; ph->flags = PF_R; phsh(ph, sh); } elfphload(&segtext); elfphload(&segdata); /* Dynamic linking sections */ if (!debug['d']) { /* -d suppresses dynamic loader format */ /* S headers for dynamic linking */ sh = newElfShdr(elfstr[ElfStrGot]); sh->type = SHT_PROGBITS; sh->flags = SHF_ALLOC+SHF_WRITE; sh->entsize = 4; sh->addralign = 4; shsym(sh, lookup(".got", 0)); sh = newElfShdr(elfstr[ElfStrGotPlt]); sh->type = SHT_PROGBITS; sh->flags = SHF_ALLOC+SHF_WRITE; sh->entsize = 4; sh->addralign = 4; shsym(sh, lookup(".got.plt", 0)); dynsym = eh->shnum; sh = newElfShdr(elfstr[ElfStrDynsym]); sh->type = SHT_DYNSYM; sh->flags = SHF_ALLOC; sh->entsize = ELF32SYMSIZE; sh->addralign = 4; sh->link = dynsym+1; // dynstr // sh->info = index of first non-local symbol (number of local symbols) shsym(sh, lookup(".dynsym", 0)); sh = newElfShdr(elfstr[ElfStrDynstr]); sh->type = SHT_STRTAB; sh->flags = SHF_ALLOC; sh->addralign = 1; shsym(sh, lookup(".dynstr", 0)); sh = newElfShdr(elfstr[ElfStrHash]); sh->type = SHT_HASH; sh->flags = SHF_ALLOC; sh->entsize = 4; sh->addralign = 4; sh->link = dynsym; shsym(sh, lookup(".hash", 0)); sh = newElfShdr(elfstr[ElfStrRel]); sh->type = SHT_REL; sh->flags = SHF_ALLOC; sh->entsize = ELF32RELSIZE; sh->addralign = 4; sh->link = dynsym; shsym(sh, lookup(".rel", 0)); /* sh and PT_DYNAMIC for .dynamic section */ sh = newElfShdr(elfstr[ElfStrDynamic]); sh->type = SHT_DYNAMIC; sh->flags = SHF_ALLOC+SHF_WRITE; sh->entsize = 8; sh->addralign = 4; sh->link = dynsym+1; // dynstr shsym(sh, lookup(".dynamic", 0)); ph = newElfPhdr(); ph->type = PT_DYNAMIC; ph->flags = PF_R + PF_W; phsh(ph, sh); /* * Thread-local storage segment (really just size). if(tlsoffset != 0) { ph = newElfPhdr(); ph->type = PT_TLS; ph->flags = PF_R; ph->memsz = -tlsoffset; ph->align = 4; } */ } ph = newElfPhdr(); ph->type = PT_GNU_STACK; ph->flags = PF_W+PF_R; ph->align = 4; for(sect=segtext.sect; sect!=nil; sect=sect->next) elfshbits(sect); for(sect=segdata.sect; sect!=nil; sect=sect->next) elfshbits(sect); if (!debug['s']) { sh = newElfShdr(elfstr[ElfStrGosymtab]); sh->type = SHT_PROGBITS; sh->flags = SHF_ALLOC; sh->addralign = 1; shsym(sh, lookup("symtab", 0)); sh = newElfShdr(elfstr[ElfStrGopclntab]); sh->type = SHT_PROGBITS; sh->flags = SHF_ALLOC; sh->addralign = 1; shsym(sh, lookup("pclntab", 0)); } sh = newElfShstrtab(elfstr[ElfStrShstrtab]); sh->type = SHT_STRTAB; sh->addralign = 1; shsym(sh, lookup(".shstrtab", 0)); /* Main header */ eh->ident[EI_MAG0] = '\177'; eh->ident[EI_MAG1] = 'E'; eh->ident[EI_MAG2] = 'L'; eh->ident[EI_MAG3] = 'F'; eh->ident[EI_CLASS] = ELFCLASS32; eh->ident[EI_DATA] = ELFDATA2LSB; eh->ident[EI_VERSION] = EV_CURRENT; eh->type = ET_EXEC; eh->machine = EM_ARM; eh->version = EV_CURRENT; eh->entry = entryvalue(); if(pph != nil) { pph->filesz = eh->phnum * eh->phentsize; pph->memsz = pph->filesz; } seek(cout, 0, 0); a = 0; a += elfwritehdr(); a += elfwritephdrs(); a += elfwriteshdrs(); cflush(); if(a+elfwriteinterp() > ELFRESERVE) diag("ELFRESERVE too small: %d > %d", a, ELFRESERVE); break; } cflush(); if(debug['c']){ print("textsize=%d\n", textsize); print("datsize=%d\n", segdata.filelen); print("bsssize=%d\n", segdata.len - segdata.filelen); print("symsize=%d\n", symsize); print("lcsize=%d\n", lcsize); print("total=%d\n", textsize+segdata.len+symsize+lcsize); } }
void doelf(void) { Sym *s, *shstrtab, *dynstr; if(!iself) return; /* predefine strings we need for section headers */ shstrtab = lookup(".shstrtab", 0); shstrtab->type = SELFDATA; shstrtab->reachable = 1; elfstr[ElfStrEmpty] = addstring(shstrtab, ""); elfstr[ElfStrText] = addstring(shstrtab, ".text"); elfstr[ElfStrData] = addstring(shstrtab, ".data"); addstring(shstrtab, ".rodata"); elfstr[ElfStrBss] = addstring(shstrtab, ".bss"); if(!debug['s']) { elfstr[ElfStrGosymcounts] = addstring(shstrtab, ".gosymcounts"); elfstr[ElfStrGosymtab] = addstring(shstrtab, ".gosymtab"); elfstr[ElfStrGopclntab] = addstring(shstrtab, ".gopclntab"); } elfstr[ElfStrShstrtab] = addstring(shstrtab, ".shstrtab"); if(!debug['d']) { /* -d suppresses dynamic loader format */ elfstr[ElfStrInterp] = addstring(shstrtab, ".interp"); elfstr[ElfStrHash] = addstring(shstrtab, ".hash"); elfstr[ElfStrGot] = addstring(shstrtab, ".got"); elfstr[ElfStrGotPlt] = addstring(shstrtab, ".got.plt"); elfstr[ElfStrDynamic] = addstring(shstrtab, ".dynamic"); elfstr[ElfStrDynsym] = addstring(shstrtab, ".dynsym"); elfstr[ElfStrDynstr] = addstring(shstrtab, ".dynstr"); elfstr[ElfStrRel] = addstring(shstrtab, ".rel"); elfstr[ElfStrRelPlt] = addstring(shstrtab, ".rel.plt"); elfstr[ElfStrPlt] = addstring(shstrtab, ".plt"); /* interpreter string */ s = lookup(".interp", 0); s->reachable = 1; s->type = SELFDATA; // TODO: rodata /* dynamic symbol table - first entry all zeros */ s = lookup(".dynsym", 0); s->type = SELFDATA; s->reachable = 1; s->value += ELF32SYMSIZE; /* dynamic string table */ s = lookup(".dynstr", 0); s->type = SELFDATA; s->reachable = 1; if(s->size == 0) addstring(s, ""); dynstr = s; /* relocation table */ s = lookup(".rel", 0); s->reachable = 1; s->type = SELFDATA; /* global offset table */ s = lookup(".got", 0); s->reachable = 1; s->type = SELFDATA; /* hash */ s = lookup(".hash", 0); s->reachable = 1; s->type = SELFDATA; /* got.plt */ s = lookup(".got.plt", 0); s->reachable = 1; s->type = SDATA; // writable, so not SELFDATA s = lookup(".plt", 0); s->reachable = 1; s->type = SELFDATA; s = lookup(".rel.plt", 0); s->reachable = 1; s->type = SELFDATA; elfsetupplt(); /* define dynamic elf table */ s = lookup(".dynamic", 0); s->reachable = 1; s->type = SELFDATA; /* * .dynamic table */ elfwritedynentsym(s, DT_HASH, lookup(".hash", 0)); elfwritedynentsym(s, DT_SYMTAB, lookup(".dynsym", 0)); elfwritedynent(s, DT_SYMENT, ELF32SYMSIZE); elfwritedynentsym(s, DT_STRTAB, lookup(".dynstr", 0)); elfwritedynentsymsize(s, DT_STRSZ, lookup(".dynstr", 0)); elfwritedynentsym(s, DT_REL, lookup(".rel", 0)); elfwritedynentsymsize(s, DT_RELSZ, lookup(".rel", 0)); elfwritedynent(s, DT_RELENT, ELF32RELSIZE); if(rpath) elfwritedynent(s, DT_RUNPATH, addstring(dynstr, rpath)); elfwritedynentsym(s, DT_PLTGOT, lookup(".got.plt", 0)); elfwritedynent(s, DT_PLTREL, DT_REL); elfwritedynentsymsize(s, DT_PLTRELSZ, lookup(".rel.plt", 0)); elfwritedynentsym(s, DT_JMPREL, lookup(".rel.plt", 0)); elfwritedynent(s, DT_NULL, 0); } }
// When an error has occurred, pop elements off the stack until the top // state has an error-item. If none is found, the default recovery // mode (which is to abort) is activated. // // If EOF is encountered without being appropriate for the current state, // then the error recovery will fall back to the default recovery mode. // (i.e., parsing terminates) void HTTPTokenizer::errorRecovery() try { if (d_acceptedTokens__ >= d_requiredTokens__)// only generate an error- { // message if enough tokens ++d_nErrors__; // were accepted. Otherwise error("Syntax error"); // simply skip input } // get the error state while (not (s_state[top__()][0].d_type & ERR_ITEM)) { pop__(); } // In the error state, lookup a token allowing us to proceed. // Continuation may be possible following multiple reductions, // but eventuall a shift will be used, requiring the retrieval of // a terminal token. If a retrieved token doesn't match, the catch below // will ensure the next token is requested in the while(true) block // implemented below: int lastToken = d_token__; // give the unexpected token a // chance to be processed // again. pushToken__(_error_); // specify _error_ as next token push__(lookup(true)); // push the error state d_token__ = lastToken; // reactivate the unexpected // token (we're now in an // ERROR state). bool gotToken = true; // the next token is a terminal while (true) { try { if (s_state[d_state__]->d_type & REQ_TOKEN) { gotToken = d_token__ == _UNDETERMINED_; nextToken(); // obtain next token } int action = lookup(true); if (action > 0) // push a new state { push__(action); popToken__(); if (gotToken) { d_acceptedTokens__ = 0; return; } } else if (action < 0) { // no actions executed on recovery but save an already // available token: if (d_token__ != _UNDETERMINED_) pushToken__(d_token__); // next token is the rule's LHS reduce__(s_productionInfo[-action]); } else ABORT(); // abort when accepting during // error recovery } catch (...) { if (d_token__ == _EOF_) ABORT(); // saw inappropriate _EOF_ popToken__(); // failing token now skipped } } } catch (ErrorRecovery__) // This is: DEFAULT_RECOVERY_MODE { ABORT(); }
const struct sensors_input_cache_entry_t *sensors_input_cache_get( const char *name) { int rc; int fd; DIR *dir; struct dirent * item; struct list_node *member; struct input_dev_list *temp; pthread_t id[MAX_EVENT_DRIVERS]; unsigned int i = 0; unsigned int threads = 0; const struct sensors_input_cache_entry_t *found = NULL; pthread_mutex_lock(&util_mutex); if (!list_initialized) { node_init(&head); list_initialized = 1; } temp = lookup(name, NULL); if (temp) { found = &temp->entry; goto exit; } dir = opendir(INPUT_EVENT_DIR); if (!dir) { ALOGE("%s: error opening '%s'\n", __func__, INPUT_EVENT_DIR); goto exit; } while ((item = readdir(dir)) != NULL) { if (strncmp(item->d_name, INPUT_EVENT_BASENAME, sizeof(INPUT_EVENT_BASENAME) - 1) != 0) { continue; } temp = (temp ? temp : malloc(sizeof(*temp))); if (temp == NULL) { ALOGE("%s: malloc error!\n", __func__); break; } /* skip already cached entries */ snprintf(temp->entry.event_path, sizeof(temp->entry.event_path), "%s%s", INPUT_EVENT_DIR, item->d_name); if (lookup(NULL, temp->entry.event_path)) continue; /* make sure we have access */ fd = open(temp->entry.event_path, O_RDONLY); if (fd < 0) { ALOGE("%s: cant open %s", __func__, item->d_name); continue; } rc = ioctl(fd, EVIOCGNAME(sizeof(temp->entry.dev_name)), temp->entry.dev_name); /* close in parallell to optimize boot time */ pthread_create(&id[threads++], NULL, close_input_dev_fd, (void*) fd); if (rc < 0) { ALOGE("%s: cant get name from %s", __func__, item->d_name); continue; } temp->entry.nr = atoi(item->d_name + sizeof(INPUT_EVENT_BASENAME) - 1); node_add(&head, &temp->node); if (!found && !strncmp(temp->entry.dev_name, name, sizeof(temp->entry.dev_name) - 1)) found = &temp->entry; temp = NULL; } closedir(dir); for(i = 0; i < threads; ++i) pthread_join(id[i], NULL); exit: pthread_mutex_unlock(&util_mutex); return found; }
/* * do a macro definition. tp points to the name being defined in the line */ void dodefine(Tokenrow* trp) { Token* tp; Nlist* np; Tokenrow* def, *args; tp = trp->tp + 1; if (tp >= trp->lp || tp->type != NAME) { error(ERROR, "#defined token is not a name"); return; } np = lookup(tp, 1); if (np->flag & ISUNCHANGE) { error(ERROR, "#defined token %t can't be redefined", tp); return; } /* collect arguments */ tp += 1; args = NULL; if (tp < trp->lp && tp->type == LP && tp->wslen == 0) { /* macro with args */ int narg = 0; tp += 1; args = new(Tokenrow); maketokenrow(2, args); if (tp->type != RP) { int err = 0; for (;;) { Token* atp; if (tp->type != NAME) { err++; break; } if (narg >= args->max) growtokenrow(args); for (atp = args->bp; atp < args->lp; atp++) if (atp->len == tp->len && strncmp((char*)atp->t, (char*)tp->t, tp->len) == 0) error(ERROR, "Duplicate macro argument"); *args->lp++ = *tp; narg++; tp += 1; if (tp->type == RP) break; if (tp->type != COMMA) { err++; break; } tp += 1; } if (err) { error(ERROR, "Syntax error in macro parameters"); return; } } tp += 1; } trp->tp = tp; if (((trp->lp) - 1)->type == NL) trp->lp -= 1; def = normtokenrow(trp); if (np->flag & ISDEFINED) { if (comparetokens(def, np->vp) || (np->ap == NULL) != (args == NULL) || (np->ap && comparetokens(args, np->ap))) error(ERROR, "Macro redefinition of %t", trp->bp + 2); } if (args) { Tokenrow* tap; tap = normtokenrow(args); dofree(args->bp); args = tap; } np->ap = args; np->vp = def; np->flag |= ISDEFINED; }
static bool type_access(pass_opt_t* opt, ast_t** astp) { ast_t* ast = *astp; // Left is a typeref, right is an id. ast_t* left = ast_child(ast); ast_t* right = ast_sibling(left); ast_t* type = ast_type(left); if(is_typecheck_error(type)) return false; assert(ast_id(left) == TK_TYPEREF); assert(ast_id(right) == TK_ID); ast_t* find = lookup(opt, ast, type, ast_name(right)); if(find == NULL) return false; bool ret = true; switch(ast_id(find)) { case TK_TYPEPARAM: ast_error(right, "can't look up a typeparam on a type"); ret = false; break; case TK_NEW: ret = method_access(ast, find); break; case TK_FVAR: case TK_FLET: case TK_EMBED: case TK_BE: case TK_FUN: { // Make this a lookup on a default constructed object. ast_free_unattached(find); if(!strcmp(ast_name(right), "create")) { ast_error(right, "create is not a constructor on this type"); return false; } ast_t* dot = ast_from(ast, TK_DOT); ast_add(dot, ast_from_string(ast, "create")); ast_swap(left, dot); ast_add(dot, left); ast_t* call = ast_from(ast, TK_CALL); ast_swap(dot, call); ast_add(call, dot); // the LHS goes at the end, not the beginning ast_add(call, ast_from(ast, TK_NONE)); // named ast_add(call, ast_from(ast, TK_NONE)); // positional if(!expr_dot(opt, &dot)) return false; if(!expr_call(opt, &call)) return false; return expr_dot(opt, astp); } default: assert(0); ret = false; break; } ast_free_unattached(find); return ret; }
Foam::displacementLaplacianFvMotionSolver::displacementLaplacianFvMotionSolver ( const polyMesh& mesh, Istream& is ) : displacementFvMotionSolver(mesh, is), pointDisplacement_ ( IOobject ( "pointDisplacement", fvMesh_.time().timeName(), fvMesh_, IOobject::MUST_READ, IOobject::AUTO_WRITE ), pointMesh::New(fvMesh_) ), cellDisplacement_ ( IOobject ( "cellDisplacement", mesh.time().timeName(), mesh, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE ), fvMesh_, dimensionedVector ( "cellDisplacement", pointDisplacement_.dimensions(), vector::zero ), cellMotionBoundaryTypes<vector>(pointDisplacement_.boundaryField()) ), pointLocation_(NULL), diffusivityPtr_ ( motionDiffusivity::New(*this, lookup("diffusivity")) ), frozenPointsZone_ ( found("frozenPointsZone") ? fvMesh_.pointZones().findZoneID(lookup("frozenPointsZone")) : -1 ) { IOobject io ( "pointLocation", fvMesh_.time().timeName(), fvMesh_, IOobject::MUST_READ, IOobject::AUTO_WRITE ); if (debug) { Info<< "displacementLaplacianFvMotionSolver:" << nl << " diffusivity : " << diffusivityPtr_().type() << nl << " frozenPoints zone : " << frozenPointsZone_ << endl; } if (io.headerOk()) { pointLocation_.reset ( new pointVectorField ( io, pointMesh::New(fvMesh_) ) ); if (debug) { Info<< "displacementLaplacianFvMotionSolver :" << " Read pointVectorField " << io.name() << " to be used for boundary conditions on points." << nl << "Boundary conditions:" << pointLocation_().boundaryField().types() << endl; } } }
void patch(void) { int32 c; Prog *p, *q; Sym *s; int32 vexit; if(debug['v']) Bprint(&bso, "%5.2f mkfwd\n", cputime()); Bflush(&bso); mkfwd(); if(debug['v']) Bprint(&bso, "%5.2f patch\n", cputime()); Bflush(&bso); s = lookup("exit", 0); vexit = s->value; for(cursym = textp; cursym != nil; cursym = cursym->next) for(p = cursym->text; p != P; p = p->link) { if(HEADTYPE == Hwindows) { // Windows // Convert // op n(GS), reg // to // MOVL 0x28(GS), reg // op n(reg), reg // The purpose of this patch is to fix some accesses // to extern register variables (TLS) on Windows, as // a different method is used to access them. if(p->from.type == D_INDIR+D_GS && p->to.type >= D_AX && p->to.type <= D_DI && p->from.offset <= 8) { q = appendp(p); q->from = p->from; q->from.type = D_INDIR + p->to.type; q->to = p->to; q->as = p->as; p->as = AMOVQ; p->from.type = D_INDIR+D_GS; p->from.offset = 0x28; } } if(HEADTYPE == Hlinux || HEADTYPE == Hfreebsd || HEADTYPE == Hopenbsd || HEADTYPE == Hnetbsd) { // ELF uses FS instead of GS. if(p->from.type == D_INDIR+D_GS) p->from.type = D_INDIR+D_FS; if(p->to.type == D_INDIR+D_GS) p->to.type = D_INDIR+D_FS; } if(p->as == ACALL || (p->as == AJMP && p->to.type != D_BRANCH)) { s = p->to.sym; if(s) { if(debug['c']) Bprint(&bso, "%s calls %s\n", TNAME, s->name); if((s->type&~SSUB) != STEXT) { /* diag prints TNAME first */ diag("undefined: %s", s->name); s->type = STEXT; s->value = vexit; continue; // avoid more error messages } if(s->text == nil) continue; p->to.type = D_BRANCH; p->to.offset = s->text->pc; p->pcond = s->text; continue; } } if(p->to.type != D_BRANCH) continue; c = p->to.offset; for(q = cursym->text; q != P;) { if(c == q->pc) break; if(q->forwd != P && c >= q->forwd->pc) q = q->forwd; else q = q->link; } if(q == P) { diag("branch out of range in %s (%#ux)\n%P [%s]", TNAME, c, p, p->to.sym ? p->to.sym->name : "<nil>"); p->to.type = D_NONE; } p->pcond = q; } for(cursym = textp; cursym != nil; cursym = cursym->next) for(p = cursym->text; p != P; p = p->link) { p->mark = 0; /* initialization for follow */ if(p->pcond != P) { p->pcond = brloop(p->pcond); if(p->pcond != P) if(p->to.type == D_BRANCH) p->to.offset = p->pcond->pc; } } }
void ldobj1(Biobuf *f, char *pkg, int64 len, char *pn) { int32 ipc; Prog *p; Sym *h[NSYM], *s; int v, o, r, skip; uint32 sig; char *name; int ntext; int32 eof; char src[1024], *x; Prog *lastp; lastp = nil; ntext = 0; eof = Boffset(f) + len; src[0] = 0; pn = estrdup(pn); // we keep it in Sym* references newloop: memset(h, 0, sizeof(h)); version++; histfrogp = 0; ipc = pc; skip = 0; loop: if(f->state == Bracteof || Boffset(f) >= eof) goto eof; o = BGETC(f); if(o == Beof) goto eof; if(o <= AXXX || o >= ALAST) { diag("%s:#%lld: opcode out of range: %#ux", pn, Boffset(f), o); print(" probably not a .5 file\n"); errorexit(); } if(o == ANAME || o == ASIGNAME) { sig = 0; if(o == ASIGNAME) sig = Bget4(f); v = BGETC(f); /* type */ o = BGETC(f); /* sym */ r = 0; if(v == D_STATIC) r = version; name = Brdline(f, '\0'); if(name == nil) { if(Blinelen(f) > 0) { fprint(2, "%s: name too long\n", pn); errorexit(); } goto eof; } x = expandpkg(name, pkg); s = lookup(x, r); if(x != name) free(x); if(sig != 0){ if(s->sig != 0 && s->sig != sig) diag("incompatible type signatures %ux(%s) and %ux(%s) for %s", s->sig, s->file, sig, pn, s->name); s->sig = sig; s->file = pn; } if(debug['W']) print(" ANAME %s\n", s->name); if(o < 0 || o >= nelem(h)) { fprint(2, "%s: mangled input file\n", pn); errorexit(); } h[o] = s; if((v == D_EXTERN || v == D_STATIC) && s->type == 0) s->type = SXREF; if(v == D_FILE) { if(s->type != SFILE) { histgen++; s->type = SFILE; s->value = histgen; } if(histfrogp < MAXHIST) { histfrog[histfrogp] = s; histfrogp++; } else collapsefrog(s); dwarfaddfrag(s->value, s->name); } goto loop; } p = mal(sizeof(Prog)); p->as = o; p->scond = BGETC(f); p->reg = BGETC(f); p->line = Bget4(f); zaddr(pn, f, &p->from, h); fromgotype = adrgotype; zaddr(pn, f, &p->to, h); if(p->as != ATEXT && p->as != AGLOBL && p->reg > NREG) diag("register out of range %A %d", p->as, p->reg); p->link = P; p->cond = P; if(debug['W']) print("%P\n", p); switch(o) { case AHISTORY: if(p->to.offset == -1) { addlib(src, pn); histfrogp = 0; goto loop; } if(src[0] == '\0') copyhistfrog(src, sizeof src); addhist(p->line, D_FILE); /* 'z' */ if(p->to.offset) addhist(p->to.offset, D_FILE1); /* 'Z' */ histfrogp = 0; goto loop; case AEND: histtoauto(); if(cursym != nil && cursym->text) cursym->autom = curauto; curauto = 0; cursym = nil; if(Boffset(f) == eof) return; goto newloop; case AGLOBL: s = p->from.sym; if(s == S) { diag("GLOBL must have a name\n%P", p); errorexit(); } if(s->type == 0 || s->type == SXREF) { s->type = SBSS; s->value = 0; } if(s->type != SBSS && s->type != SNOPTRBSS && !s->dupok) { diag("redefinition: %s\n%P", s->name, p); s->type = SBSS; s->value = 0; } if(p->to.offset > s->size) s->size = p->to.offset; if(p->reg & DUPOK) s->dupok = 1; if(p->reg & RODATA) s->type = SRODATA; else if(p->reg & NOPTR) s->type = SNOPTRBSS; break; case ADATA: // Assume that AGLOBL comes after ADATA. // If we've seen an AGLOBL that said this sym was DUPOK, // ignore any more ADATA we see, which must be // redefinitions. s = p->from.sym; if(s->dupok) { // if(debug['v']) // Bprint(&bso, "skipping %s in %s: dupok\n", s->name, pn); goto loop; } if(s->file == nil) s->file = pn; else if(s->file != pn) { diag("multiple initialization for %s: in both %s and %s", s->name, s->file, pn); errorexit(); } savedata(s, p, pn); unmal(p, sizeof *p); break; case AGOK: diag("unknown opcode\n%P", p); p->pc = pc; pc++; break; case ALOCALS: cursym->locals = p->to.offset; pc++; break; case ATYPE: pc++; goto loop; case ATEXT: if(cursym != nil && cursym->text) { histtoauto(); cursym->autom = curauto; curauto = 0; } s = p->from.sym; if(s == S) { diag("TEXT must have a name\n%P", p); errorexit(); } cursym = s; if(s->type != 0 && s->type != SXREF && (p->reg & DUPOK)) { skip = 1; goto casedef; } if(ntext++ == 0 && s->type != 0 && s->type != SXREF) { /* redefinition, so file has probably been seen before */ if(debug['v']) Bprint(&bso, "skipping: %s: redefinition: %s", pn, s->name); return; } skip = 0; if(s->type != 0 && s->type != SXREF) diag("redefinition: %s\n%P", s->name, p); if(etextp) etextp->next = s; else textp = s; if(fromgotype) { if(s->gotype && s->gotype != fromgotype) diag("%s: type mismatch for %s", pn, s->name); s->gotype = fromgotype; } etextp = s; p->align = 4; autosize = (p->to.offset+3L) & ~3L; p->to.offset = autosize; autosize += 4; s->type = STEXT; s->text = p; s->value = pc; s->args = p->to.offset2; lastp = p; p->pc = pc; pc++; break; case ASUB: if(p->from.type == D_CONST) if(p->from.name == D_NONE) if(p->from.offset < 0) { p->from.offset = -p->from.offset; p->as = AADD; } goto casedef; case AADD: if(p->from.type == D_CONST) if(p->from.name == D_NONE) if(p->from.offset < 0) { p->from.offset = -p->from.offset; p->as = ASUB; } goto casedef; case AMOVWD: case AMOVWF: case AMOVDW: case AMOVFW: case AMOVFD: case AMOVDF: // case AMOVF: // case AMOVD: case ACMPF: case ACMPD: case AADDF: case AADDD: case ASUBF: case ASUBD: case AMULF: case AMULD: case ADIVF: case ADIVD: goto casedef; case AMOVF: if(skip) goto casedef; if(p->from.type == D_FCONST && chipfloat(&p->from.ieee) < 0 && (chipzero(&p->from.ieee) < 0 || (p->scond & C_SCOND) != C_SCOND_NONE)) { /* size sb 9 max */ sprint(literal, "$%ux", ieeedtof(&p->from.ieee)); s = lookup(literal, 0); if(s->type == 0) { s->type = SRODATA; adduint32(s, ieeedtof(&p->from.ieee)); s->reachable = 0; } p->from.type = D_OREG; p->from.sym = s; p->from.name = D_EXTERN; p->from.offset = 0; } goto casedef; case AMOVD: if(skip) goto casedef; if(p->from.type == D_FCONST && chipfloat(&p->from.ieee) < 0 && (chipzero(&p->from.ieee) < 0 || (p->scond & C_SCOND) != C_SCOND_NONE)) { /* size sb 18 max */ sprint(literal, "$%ux.%ux", p->from.ieee.l, p->from.ieee.h); s = lookup(literal, 0); if(s->type == 0) { s->type = SRODATA; adduint32(s, p->from.ieee.l); adduint32(s, p->from.ieee.h); s->reachable = 0; } p->from.type = D_OREG; p->from.sym = s; p->from.name = D_EXTERN; p->from.offset = 0; } goto casedef; default: casedef: if(skip) nopout(p); p->pc = pc; pc++; if(p->to.type == D_BRANCH) p->to.offset += ipc; if(lastp == nil) { if(p->as != ANOP) diag("unexpected instruction: %P", p); break; } lastp->link = p; lastp = p; break; } goto loop; eof: diag("truncated object file: %s", pn); }
char *string_subst(char *value, string_subst_lookup_t lookup, void *arg) { char *subvalue, *newvalue; char *dollar, *ldelim, *rdelim; char oldrdelim; int length; while(1) { dollar = strchr(value, '$'); if(!dollar) return value; while(dollar > value) { if(*(dollar - 1) == '\\') { dollar = strchr(dollar + 1, '$'); } else if(*(dollar + 1) == '$') { *dollar = ' '; dollar = strchr(dollar + 2, '$'); } else { break; } if(!dollar) return value; } ldelim = dollar + 1; if(*ldelim == '(') { rdelim = ldelim + 1; while(*rdelim != ')') rdelim++; } else if(*ldelim == '{') { rdelim = ldelim + 1; while(*rdelim != '}') rdelim++; } else { ldelim--; rdelim = ldelim + 1; while(isalnum((int) *rdelim) || *rdelim == '_') rdelim++; } oldrdelim = *rdelim; *rdelim = 0; subvalue = lookup(ldelim + 1, arg); if(!subvalue) subvalue = strdup(""); *rdelim = oldrdelim; length = strlen(value) - (rdelim - dollar) + strlen(subvalue) + 1; newvalue = malloc(length); if(!newvalue) { free(subvalue); free(value); return 0; } if(ldelim != dollar) rdelim++; *dollar = 0; strcpy(newvalue, value); strcat(newvalue, subvalue); strcat(newvalue, rdelim); free(subvalue); free(value); value = newvalue; } }
void main(int argc, char *argv[]) { char *p; Sym *s; Binit(&bso, 1, OWRITE); listinit(); nerrors = 0; outfile = "5.out"; HEADTYPE = -1; INITTEXT = -1; INITDAT = -1; INITRND = -1; INITENTRY = 0; LIBINITENTRY = 0; linkmode = LinkInternal; // TODO: LinkAuto once everything works. nuxiinit(); p = getgoarm(); if(p != nil) goarm = atoi(p); else goarm = 6; if(goarm == 5) debug['F'] = 1; flagcount("1", "use alternate profiling code", &debug['1']); flagfn1("B", "info: define ELF NT_GNU_BUILD_ID note", addbuildinfo); flagstr("E", "sym: entry symbol", &INITENTRY); flagint32("D", "addr: data address", &INITDAT); flagcount("G", "debug pseudo-ops", &debug['G']); flagfn1("I", "interp: set ELF interp", setinterp); flagfn1("L", "dir: add dir to library path", Lflag); flagfn1("H", "head: header type", setheadtype); flagcount("K", "add stack underflow checks", &debug['K']); flagcount("M", "disable software div/mod", &debug['M']); flagcount("O", "print pc-line tables", &debug['O']); flagcount("P", "debug code generation", &debug['P']); flagint32("R", "rnd: address rounding", &INITRND); flagint32("T", "addr: text address", &INITTEXT); flagfn0("V", "print version and exit", doversion); flagcount("W", "disassemble input", &debug['W']); flagfn2("X", "name value: define string data", addstrdata); flagcount("Z", "clear stack frame on entry", &debug['Z']); flagcount("a", "disassemble output", &debug['a']); flagcount("c", "dump call graph", &debug['c']); flagcount("d", "disable dynamic executable", &debug['d']); flagcount("f", "ignore version mismatch", &debug['f']); flagcount("g", "disable go package data checks", &debug['g']); flagstr("k", "sym: set field tracking symbol", &tracksym); flagfn1("linkmode", "mode: set link mode (internal, external, auto)", setlinkmode); flagcount("n", "dump symbol table", &debug['n']); flagstr("o", "outfile: set output file", &outfile); flagcount("p", "insert profiling code", &debug['p']); flagstr("r", "dir1:dir2:...: set ELF dynamic linker search path", &rpath); flagcount("race", "enable race detector", &flag_race); flagcount("s", "disable symbol table", &debug['s']); flagstr("tmpdir", "leave temporary files in this directory", &tmpdir); flagcount("u", "reject unsafe packages", &debug['u']); flagcount("v", "print link trace", &debug['v']); flagcount("w", "disable DWARF generation", &debug['w']); flagcount("shared", "generate shared object", &flag_shared); // TODO: link mode flag flagparse(&argc, &argv, usage); if(argc != 1) usage(); if(linkmode != LinkInternal) { diag("only -linkmode=internal is supported"); errorexit(); } libinit(); if(HEADTYPE == -1) HEADTYPE = headtype(goos); switch(HEADTYPE) { default: diag("unknown -H option"); errorexit(); case Hnoheader: /* no header */ HEADR = 0L; if(INITTEXT == -1) INITTEXT = 0; if(INITDAT == -1) INITDAT = 0; if(INITRND == -1) INITRND = 4; break; case Hrisc: /* aif for risc os */ HEADR = 128L; if(INITTEXT == -1) INITTEXT = 0x10005000 + HEADR; if(INITDAT == -1) INITDAT = 0; if(INITRND == -1) INITRND = 4; break; case Hplan9x32: /* plan 9 */ HEADR = 32L; if(INITTEXT == -1) INITTEXT = 4128; if(INITDAT == -1) INITDAT = 0; if(INITRND == -1) INITRND = 4096; break; case Hixp1200: /* boot for IXP1200 */ HEADR = 0L; if(INITTEXT == -1) INITTEXT = 0x0; if(INITDAT == -1) INITDAT = 0; if(INITRND == -1) INITRND = 4; break; case Hipaq: /* boot for ipaq */ HEADR = 16L; if(INITTEXT == -1) INITTEXT = 0xC0008010; if(INITDAT == -1) INITDAT = 0; if(INITRND == -1) INITRND = 1024; break; case Hlinux: /* arm elf */ case Hfreebsd: case Hnetbsd: debug['d'] = 0; // with dynamic linking tlsoffset = -8; // hardcoded number, first 4-byte word for g, and then 4-byte word for m // this number is known to ../../pkg/runtime/cgo/gcc_linux_arm.c elfinit(); HEADR = ELFRESERVE; if(INITTEXT == -1) INITTEXT = 0x10000 + HEADR; if(INITDAT == -1) INITDAT = 0; if(INITRND == -1) INITRND = 4096; break; } if(INITDAT != 0 && INITRND != 0) print("warning: -D0x%ux is ignored because of -R0x%ux\n", INITDAT, INITRND); if(debug['v']) Bprint(&bso, "HEADER = -H0x%d -T0x%ux -D0x%ux -R0x%ux\n", HEADTYPE, INITTEXT, INITDAT, INITRND); Bflush(&bso); zprg.as = AGOK; zprg.scond = 14; zprg.reg = NREG; zprg.from.name = D_NONE; zprg.from.type = D_NONE; zprg.from.reg = NREG; zprg.to = zprg.from; buildop(); histgen = 0; pc = 0; dtype = 4; version = 0; cbp = buf.cbuf; cbc = sizeof(buf.cbuf); // embed goarm to runtime.goarm s = lookup("runtime.goarm", 0); s->dupok = 1; adduint8(s, goarm); addlibpath("command line", "command line", argv[0], "main"); loadlib(); // mark some functions that are only referenced after linker code editing if(debug['F']) mark(rlookup("_sfloat", 0)); deadcode(); if(textp == nil) { diag("no code"); errorexit(); } patch(); if(debug['p']) if(debug['1']) doprof1(); else doprof2(); doelf(); follow(); softfloat(); // 5l -Z means zero the stack frame on entry. // This slows down function calls but can help avoid // false positives in garbage collection. if(debug['Z']) dozerostk(); noops(); // generate stack split prolog, handle div/mod, etc. dostkcheck(); span(); addexport(); // textaddress() functionality is handled in span() pclntab(); symtab(); dodata(); address(); doweak(); reloc(); asmb(); undef(); hostlink(); if(debug['c']) print("ARM size = %d\n", armsize); if(debug['v']) { Bprint(&bso, "%5.2f cpu time\n", cputime()); Bprint(&bso, "%d sizeof adr\n", sizeof(Adr)); Bprint(&bso, "%d sizeof prog\n", sizeof(Prog)); } Bflush(&bso); errorexit(); }
Symbol* SymbolTable::lookup(STATE, const std::string& str) { return lookup(str.data(), str.size(), Encoding::eAscii, state->hash_seed()); }
symbol *symbol_table::lookup(const location_ptr &location, std::uint16_t offset) { return lookup(name_for_location(location), offset); }
/*! \brief * Wrapper to lookup(location) */ static int w_lookup(struct sip_msg* _m, char* _d, char* _p2) { return lookup(_m, (udomain_t*) _d); }
Symbol* SymTab::lookup( const char * name ) { return lookup( m_cur_scope, name ); }
/* find_symbol -- find a global symbol, or create one if necessary */ symbol find_symbol(const char *name) { return lookup(name, TRUE); }
/* * whereis name * look for source, documentation and binaries */ int main(int argc, char **argv) { setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); atexit(close_stdout); argc--, argv++; if (argc == 0) usage(stderr); do if (argv[0][0] == '-') { register char *cp = argv[0] + 1; while (*cp) switch (*cp++) { case 'f': break; case 'S': getlist(&argc, &argv, &Sflag, &Scnt); break; case 'B': getlist(&argc, &argv, &Bflag, &Bcnt); break; case 'M': getlist(&argc, &argv, &Mflag, &Mcnt); break; case 's': zerof(); sflag++; continue; case 'u': uflag++; continue; case 'b': zerof(); bflag++; continue; case 'm': zerof(); mflag++; continue; case 'V': printf(_("%s from %s\n"), program_invocation_short_name, PACKAGE_STRING); return EXIT_SUCCESS; case 'h': usage(stdout); default: usage(stderr); } argv++; } else { if (Bcnt == 0 && pathdir == NULL) fillpath(); lookup(*argv++); } while (--argc > 0); freepath(); return EXIT_SUCCESS; }
void control(Tokenrow *trp) { Nlist *np; Token *tp; tp = trp->tp; if (tp->type!=NAME) { if (tp->type==NUMBER) goto kline; if (tp->type != NL) error(ERROR, "Unidentifiable control line"); return; /* else empty line */ } if ((np = lookup(tp, 0))==NULL || (np->flag&ISKW)==0 && !skipping) { error(WARNING, "Unknown preprocessor control %t", tp); return; } if (skipping) { if ((np->flag&ISKW)==0) return; switch (np->val) { case KENDIF: if (--ifdepth<skipping) skipping = 0; --cursource->ifdepth; setempty(trp); return; case KIFDEF: case KIFNDEF: case KIF: if (++ifdepth >= NIF) error(FATAL, "#if too deeply nested"); ++cursource->ifdepth; return; case KELIF: case KELSE: if (ifdepth<=skipping) break; return; default: return; } } switch (np->val) { case KDEFINE: dodefine(trp); break; case KUNDEF: tp += 1; if (tp->type!=NAME || trp->lp - trp->bp != 4) { error(ERROR, "Syntax error in #undef"); break; } if ((np = lookup(tp, 0))) { if (np->flag&ISUNCHANGE) { error(ERROR, "#defined token %t can't be undefined", tp); return; } np->flag &= ~ISDEFINED; } break; case KPRAGMA: return; case KIFDEF: case KIFNDEF: case KIF: if (++ifdepth >= NIF) error(FATAL, "#if too deeply nested"); ++cursource->ifdepth; ifsatisfied[ifdepth] = 0; if (eval(trp, np->val)) ifsatisfied[ifdepth] = 1; else skipping = ifdepth; break; case KELIF: if (ifdepth==0) { error(ERROR, "#elif with no #if"); return; } if (ifsatisfied[ifdepth]==2) error(ERROR, "#elif after #else"); if (eval(trp, np->val)) { if (ifsatisfied[ifdepth]) skipping = ifdepth; else { skipping = 0; ifsatisfied[ifdepth] = 1; } } else skipping = ifdepth; break; case KELSE: if (ifdepth==0 || cursource->ifdepth==0) { error(ERROR, "#else with no #if"); return; } if (ifsatisfied[ifdepth]==2) error(ERROR, "#else after #else"); if (trp->lp - trp->bp != 3) error(ERROR, "Syntax error in #else"); skipping = ifsatisfied[ifdepth]? ifdepth: 0; ifsatisfied[ifdepth] = 2; break; case KENDIF: if (ifdepth==0 || cursource->ifdepth==0) { error(ERROR, "#endif with no #if"); return; } --ifdepth; --cursource->ifdepth; if (trp->lp - trp->bp != 3) error(WARNING, "Syntax error in #endif"); break; case KERROR: trp->tp = tp+1; error(ERROR, "#error directive: %r", trp); break; case KWARNING: trp->tp = tp+1; error(WARNING, "#warning directive: %r", trp); break; case KLINE: trp->tp = tp+1; expandrow(trp, "<line>", Notinmacro); tp = trp->bp+2; kline: if (tp+1>=trp->lp || tp->type!=NUMBER || tp+3<trp->lp || (tp+3==trp->lp && ((tp+1)->type!=STRING)||*(tp+1)->t=='L')){ error(ERROR, "Syntax error in #line"); return; } cursource->line = atol((char*)tp->t)-1; if (cursource->line<0 || cursource->line>=32768) error(WARNING, "#line specifies number out of range"); tp = tp+1; if (tp+1<trp->lp) cursource->filename=(char*)newstring(tp->t+1,tp->len-2,0); return; case KDEFINED: error(ERROR, "Bad syntax for control line"); break; case KINCLUDE: doinclude(trp); trp->lp = trp->bp; return; case KEVAL: eval(trp, np->val); break; default: error(ERROR, "Preprocessor control `%t' not yet implemented", tp); break; } setempty(trp); return; }
__cilkrts_worker* cilkred_map::merge(__cilkrts_worker *w, cilkred_map *other_map, enum merge_kind kind) { // Disable Cilkscreen while the we merge the maps. The destructor for // the guard class will re-enable Cilkscreen when it goes out of scope. // This will prevent Cilkscreen from reporting apparent races in between // the reduce function and the reducer operations. The Cilk runtime // guarantees that a pair of reducer maps will only be merged when no // other strand will access them. DisableCilkscreen guard; #if REDPAR_DEBUG >= 2 fprintf(stderr, "[W=%d, desc=merge, this_map=%p, other_map=%p]\n", w->self, this, other_map); #endif // Remember the current stack frame. __cilkrts_stack_frame *current_sf = w->current_stack_frame; merging = true; other_map->merging = true; // Merging to the leftmost view is a special case because every leftmost // element must be initialized before the merge. CILK_ASSERT(!other_map->is_leftmost /* || kind == MERGE_UNORDERED */); bool merge_to_leftmost = (this->is_leftmost /* && !other_map->is_leftmost */); DBG check(/*allow_null_view=*/false); DBG other_map->check(/*allow_null_view=*/false); for (size_t i = 0; i < other_map->nbuckets; ++i) { bucket *b = other_map->buckets[i]; if (b) { for (elem *other_el = b->el; other_el->key; ++other_el) { /* Steal the value from the other map, which will be destroyed at the end of this operation. */ void *other_view = other_el->view; CILK_ASSERT(other_view); void *key = other_el->key; __cilkrts_hyperobject_base *hb = other_el->hb; elem *this_el = lookup(key); if (this_el == 0 && merge_to_leftmost) { /* Initialize leftmost view before merging. */ void* leftmost = get_leftmost_view(key); // leftmost == other_view can be true if the initial view // was created in other than the leftmost strand of the // spawn tree, but then made visible to subsequent strands // (E.g., the reducer was allocated on the heap and the // pointer was returned to the caller.) In such cases, // parallel semantics says that syncing with earlier // strands will always result in 'this_el' being null, // thus propagating the initial view up the spawn tree // until it reaches the leftmost strand. When synching // with the leftmost strand, leftmost == other_view will be // true and we must avoid reducing the initial view with // itself. if (leftmost != other_view) this_el = rehash_and_insert(w, key, hb, leftmost); } if (this_el == 0) { /* move object from other map into this one */ rehash_and_insert(w, key, hb, other_view); other_el->view = 0; continue; /* No element-level merge necessary */ } /* The same key is present in both maps with values A and B. Three choices: fail, A OP B, B OP A. */ switch (kind) { case MERGE_UNORDERED: __cilkrts_bug("TLS Reducer race"); break; case MERGE_INTO_RIGHT: /* Swap elements in order to preserve object identity */ other_el->view = this_el->view; this_el->view = other_view; /* FALL THROUGH */ case MERGE_INTO_LEFT: { /* Stealing should be disabled during reduce (even if force-reduce is enabled). */ #if DISABLE_PARALLEL_REDUCERS __cilkrts_stack_frame * volatile *saved_protected_tail; saved_protected_tail = __cilkrts_disallow_stealing(w, NULL); #endif { CILK_ASSERT(current_sf->worker == w); CILK_ASSERT(w->current_stack_frame == current_sf); /* TBD: if reduce throws an exception we need to stop it here. */ hb->__c_monoid.reduce_fn((void*)hb, this_el->view, other_el->view); w = current_sf->worker; #if REDPAR_DEBUG >= 2 verify_current_wkr(w); CILK_ASSERT(w->current_stack_frame == current_sf); #endif } #if DISABLE_PARALLEL_REDUCERS /* Restore stealing */ __cilkrts_restore_stealing(w, saved_protected_tail); #endif } break; } } } } this->is_leftmost = this->is_leftmost || other_map->is_leftmost; merging = false; other_map->merging = false; verify_current_wkr(w); __cilkrts_destroy_reducer_map(w, other_map); return w; }