U0 LexPutToken(CCmpCtrl *cc) {//Print cur token to StdOut. (Crude) '"'; if (cc->token==TK_IDENT || cc->token==TK_STR) "%s",cc->cur_str; else if (cc->token==TK_I64) "INT:%X",cc->cur_i64; else if (cc->token==TK_CHAR_CONST) "U8:%X",cc->cur_i64; else if (cc->token==TK_F64) "FLOAT:%e",cc->cur_f64; else if (cc->token=='\n') "<NEW_LINE>"; else if (Bt(char_bmp_displayable,cc->token)) '' cc->token; else { "T:%X",cc->token; } "\" "; } U8 *LexPutLine(CCmpCtrl *cc,U8 *start) {//Print cur pos to end of line to StdOut. I64 ch; U8 *ptr; if (!start) return NULL; if (cc->lex_include_stk->flags&LFSF_DOC) return DocPutLine(cc->lex_include_stk->doc,start); else { ptr=start; while (ch=*ptr++) { if (ch=='\n') { if (*ptr=='\r') ptr++; break; } else if (ch=='\r') { if (*ptr=='\n') ptr++; break; } '' ch; } if (!ch) ptr--; '\n'; return ptr; } return NULL; } U0 LexPutPos(CCmpCtrl *cc) {//Print token, line link and, then, LexPutLine(). LexPutToken(cc); FixSet(cc->lex_include_stk->full_name,cc->lex_include_stk->line_num); if (IsRaw) "%s,%d ",cc->lex_include_stk->full_name,cc->lex_include_stk->line_num; else { PutFileLink(cc->lex_include_stk->full_name,,cc->lex_include_stk->line_num); AdamErr("%s,%d\n", cc->lex_include_stk->full_name,cc->lex_include_stk->line_num); '' CH_SPACE; } LexPutLine(cc,cc->lex_include_stk->line_start); } U0 LexWarn(CCmpCtrl *cc,U8 *str=NULL, U8 *suffix=NULL) {//Print warn msg, then, LexPutPos(). if (str) PrintWarn(str); if (cc->htc.fun) { if (suffix && StrLen(suffix)) "in fun '%s' %s.\n",cc->htc.fun->str,suffix; else "in fun '%s'.\n",cc->htc.fun->str; if (IsRaw) "%s\n",cc->htc.fun->src_link; else { "$LK,\"%s\"$\n",cc->htc.fun->src_link; AdamErr("%s\n",cc->htc.fun->src_link); } } else LexPutPos(cc); cc->warning_cnt++; } U0 LexExcept(CCmpCtrl *cc,U8 *str=NULL) {//Print err msg, LexPutPos() and throw exception. if (!Bt(&sys_run_level,RLf_ADAM_SERVER)) { Raw(ON); "Note: Still in boot phase.\n\n"; } if (str) PrintErr(str); if (!IsRaw) AdamErr("Task:%08X %s\n",Fs,str); LexPutPos(cc); cc->error_cnt++; FlushMsgs; if (!Bt(&sys_run_level,RLf_ADAM_SERVER)) Dbg("Type \"Fix;\""); throw('Compiler'); } U0 UndefinedExtern() { PrintErr("Undefined Extern\nat %P\n",Caller); throw('UndefExt'); } U0 UnusedExternWarning(CCmpCtrl *cc,CHashClass *tmpc) { if (GetOption(OPTf_WARN_UNUSED_EXTERN)) { PrintWarn("Unused extern '%s'\n",tmpc->str); cc->warning_cnt++; } } U0 ParenWarning(CCmpCtrl *cc) { U8 *str=MStrPrint("near '%s' on line %d",cc->cur_str,cc->last_line_num); if (Bt(&cc->opts,OPTf_WARN_PAREN) && !(cc->lex_include_stk->flags&LFSF_DEFINE)) { LexWarn(cc,"Unnecessary parenthesis: ",str); PutFileLink(cc->lex_include_stk->full_name,,cc->lex_include_stk->line_num); } Free(str); } U0 ICClassPut(CHashClass *c) { I64 i; if (!c) return; if (c->ptr_stars_cnt>4) { PrintErr("put_class ptrcnt=%d\n",c->ptr_stars_cnt); while (TRUE) //TODO: Yield; } for (i=0; i<c->ptr_stars_cnt; i++) '*'; c-=c->ptr_stars_cnt; if (c->str) "%s",c->str; else { PrintErr("put_class str=NULL\n"); while (TRUE) //TODO: Yield; } '' CH_SPACE; } U0 ICArgPut(CICArg *a,I64 type_pointed_to) { if (type_pointed_to) "[%Z](%Z) %Z ",a->type.raw_type,"ST_RAW_TYPES", type_pointed_to,"ST_RAW_TYPES",Bsr(a->type>>8)+1,"ST_TY_TYPES"; else "%Z %Z ",a->type.raw_type,"ST_RAW_TYPES", Bsr(a->type>>8)+1,"ST_TY_TYPES"; switch (Bsr(a->type)) { case MDf_STK: "STK" ; break; case MDf_IMM: "#%X" ,a->disp; break; case MDf_REG: "%Z" ,a->reg,"ST_U64_REGS"; break; case MDf_DISP: "%X[%Z]" ,a->disp,a->reg,"ST_U64_REGS"; break; case MDf_RIP_DISP32: "[%X]" ,a->disp; break; case MDf_SIB: if (a->disp) "%X",a->disp; if (a->reg==REG_RIP) '['; else "[%Z+",a->reg&15,"ST_U64_REGS"; "%Z" ,a->reg>>8&15,"ST_U64_REGS"; switch (a->reg>>14) { case 0: "]" ; break; case 1: "*2]" ; break; case 2: "*4]" ; break; case 3: "*8]" ; break; } break; } '' CH_SPACE; } U0 ICPut(CCmpCtrl *cc,CIntermediateCode *tmpi) { I64 opcode=tmpi->ic_code,i; if (opcode>=IC_END_EXP && opcode!=IC_NOP2) { "%15ts %016X ",intermediate_code_table[opcode].name,tmpi->ic_data; if (cc->pass) { if (tmpi->res.type.mode) { "$PURPLE$RES:$FG$"; ICArgPut(&tmpi->res,0); } if (tmpi->arg1.type.mode) { "$PURPLE$ARG1:$FG$"; if (intermediate_code_table[tmpi->ic_code].type==IST_DEREF || intermediate_code_table[tmpi->ic_code].type==IST_ASSIGN) ICArgPut(&tmpi->arg1,tmpi->arg1_type_pointed_to); else ICArgPut(&tmpi->arg1,0); } if (tmpi->arg2.type.mode) { "$PURPLE$ARG2:$FG$"; ICArgPut(&tmpi->arg2,0); } "$PURPLE$:$FG$"; } ICClassPut(tmpi->ic_class); if (tmpi->ic_flags & ICF_LOCK) "$BROWN$lock$FG$ "; if (tmpi->ic_flags & ICF_ARG2_TO_F64) "$LTBLUE$a2d$FG$ "; if (tmpi->ic_flags & ICF_ARG2_TO_INT) "$GREEN$a2i$FG$ "; if (tmpi->ic_flags & ICF_ARG1_TO_F64) "$LTBLUE$a1d$FG$ "; if (tmpi->ic_flags & ICF_ARG1_TO_INT) "$GREEN$a1i$FG$ "; if (tmpi->ic_flags & ICF_RES_TO_F64) "$LTBLUE$rd$FG$ "; if (tmpi->ic_flags & ICF_RES_TO_INT) "$GREEN$ri$FG$ "; if (tmpi->ic_flags & ICF_USE_F64) "[F64] "; if (tmpi->ic_flags & ICF_USE_UNSIGNED) "[unsigned] "; if (tmpi->ic_flags & ICF_USE_INT) "[int] "; if (tmpi->ic_flags & ICF_RES_NOT_USED) "NO_RES "; if (tmpi->ic_flags & ICF_BY_VAL) "BY_VAL "; if (tmpi->ic_flags & ICF_PUSH_RES) "PUSH "; if (tmpi->ic_flags & ICF_PUSH_CMP) "PUSH_CMP "; if (tmpi->ic_flags & ICF_POP_CMP) "POP_CMP "; if (tmpi->ic_flags & ICF_DEL_PREV_INS) "DEL_PREV "; if (tmpi->ic_flags & ICF_PREV_DELETED) "PREV_DEL "; for (i=0; i<3; i++) { if (Bt(&tmpi->ic_flags,ICf_DONT_PUSH_FLOAT0+i)) "DONT_PUSH#%d ",i; if (Bt(&tmpi->ic_flags,ICf_DONT_POP_FLOAT0+i)) "DONT_POP#%d ",i; } if (tmpi->ic_flags & ICF_ALT_TEMPLATE) "ALT_TMP "; '\n'; } }