void print(std::ostream& ostream, const IRInstruction* inst, const RegAllocInfo* regs, const LifetimeInfo* lifetime) { if (inst->op() == Marker) { auto* marker = inst->extra<Marker>(); ostream << color(ANSI_COLOR_BLUE) << marker->show() << color(ANSI_COLOR_END); return; } if (!inst->isTransient()) { ostream << color(ANSI_COLOR_YELLOW); if (!lifetime || !lifetime->linear[inst]) { ostream << folly::format("({:02d}) ", inst->id()); } else { ostream << folly::format("({:02d}@{:02d}) ", inst->id(), lifetime->linear[inst]); } ostream << color(ANSI_COLOR_END); } printDst(ostream, inst, regs, lifetime); printOpcode(ostream, inst); printSrcs(ostream, inst, regs, lifetime); if (Block* taken = inst->taken()) { ostream << punc(" -> "); printLabel(ostream, taken); } }
void printInstr(std::ostream& ostream, const IRInstruction* inst, const RegAllocInfo* regs, const GuardConstraints* guards) { printDsts(ostream, inst, regs); if (inst->numDsts()) ostream << punc(" = "); printOpcode(ostream, inst, guards); printSrcs(ostream, inst, regs); }
void print(std::ostream& ostream, const IRInstruction* inst, const RegAllocInfo* regs, const LifetimeInfo* lifetime) { if (inst->op() == Marker) { auto* marker = inst->getExtra<Marker>(); ostream << color(ANSI_COLOR_BLUE) << folly::format("--- bc {}, spOff {} ({})", marker->bcOff, marker->stackOff, marker->func->fullName()->data()) << color(ANSI_COLOR_END); return; } if (!inst->isTransient()) { ostream << color(ANSI_COLOR_YELLOW); if (!lifetime || !lifetime->linear[inst]) { ostream << folly::format("({:02d}) ", inst->getId()); } else { ostream << folly::format("({:02d}@{:02d}) ", inst->getId(), lifetime->linear[inst]); } ostream << color(ANSI_COLOR_END); } printDst(ostream, inst, regs, lifetime); printOpcode(ostream, inst); printSrcs(ostream, inst, regs, lifetime); if (Block* taken = inst->getTaken()) { ostream << punc(" -> "); printLabel(ostream, taken); } if (TCA tca = inst->getTCA()) { ostream << punc(", "); if (tca == kIRDirectJccJmpActive) { ostream << "JccJmp_Exit "; } else if (tca == kIRDirectJccActive) { ostream << "Jcc_Exit "; } else if (tca == kIRDirectGuardActive) { ostream << "Guard_Exit "; } else { ostream << (void*)tca; } } }
/* translate each instruction in his assembler symbolic representation */ void translateCodeSegment(t_program_infos *program, FILE *fp) { t_list *current_element; t_axe_instruction *current_instruction; int _error; /* preconditions */ if (fp == NULL) notifyError(AXE_INVALID_INPUT_FILE); if (program == NULL) { _error = fclose(fp); if (_error == EOF) notifyError(AXE_FCLOSE_ERROR); notifyError(AXE_PROGRAM_NOT_INITIALIZED); } /* initialize the current_element */ current_element = program->instructions; /* write the .text directive */ if (current_element != NULL) { if (fprintf(fp, "\t.text\n") < 0) { _error = fclose(fp); if (_error == EOF) notifyError(AXE_FCLOSE_ERROR); notifyError(AXE_FWRITE_ERROR); } } while (current_element != NULL) { /* retrieve the current instruction */ current_instruction = (t_axe_instruction *) LDATA(current_element); assert(current_instruction != NULL); assert(current_instruction->opcode != INVALID_OPCODE); if (current_instruction->labelID != NULL) { /* create a string identifier for the label */ if ( fprintf(fp, "L%d : \t" , (current_instruction->labelID)->labelID ) < 0) { _error = fclose(fp); if (_error == EOF) notifyError(AXE_FCLOSE_ERROR); notifyError(AXE_FWRITE_ERROR); } } else { /* create a string identifier for the label */ if (fprintf(fp, "\t") < 0) { _error = fclose(fp); if (_error == EOF) notifyError(AXE_FCLOSE_ERROR); notifyError(AXE_FWRITE_ERROR); } } /* print the opcode */ printOpcode(current_instruction->opcode, fp); if ( (current_instruction->opcode == HALT) || (current_instruction->opcode == NOP) ) { if (fprintf(fp, "\n") < 0) { _error = fclose(fp); if (_error == EOF) notifyError(AXE_FCLOSE_ERROR); notifyError(AXE_FWRITE_ERROR); } /* update the current_element */ current_element = LNEXT(current_element); continue; } if (fputc(' ', fp) == EOF) { _error = fclose(fp); if (_error == EOF) notifyError(AXE_FCLOSE_ERROR); notifyError(AXE_FWRITE_ERROR); } if (current_instruction->reg_1 != NULL) { printRegister(current_instruction->reg_1, fp); if (fputc(' ', fp) == EOF) { _error = fclose(fp); if (_error == EOF) notifyError(AXE_FCLOSE_ERROR); notifyError(AXE_FWRITE_ERROR); } } if (current_instruction->reg_2 != NULL) { printRegister(current_instruction->reg_2, fp); if (errorcode != AXE_OK) return; if (fputc(' ', fp) == EOF) { _error = fclose(fp); if (_error == EOF) notifyError(AXE_FCLOSE_ERROR); notifyError(AXE_FWRITE_ERROR); } } if (current_instruction->reg_3 != NULL) { printRegister(current_instruction->reg_3, fp); if (fprintf(fp, "\n") < 0) { _error = fclose(fp); if (_error == EOF) notifyError(AXE_FCLOSE_ERROR); notifyError(AXE_FWRITE_ERROR); } /* update the current_element */ current_element = LNEXT(current_element); continue; } if (current_instruction->address != NULL) { if ((current_instruction->address)->type == ADDRESS_TYPE) { if (fprintf(fp, "%d", (current_instruction->address)->addr) < 0) { _error = fclose(fp); if (_error == EOF) notifyError(AXE_FCLOSE_ERROR); notifyError(AXE_FWRITE_ERROR); } } else { assert((current_instruction->address)->type == LABEL_TYPE); if ( fprintf(fp, "L%d" , ((current_instruction->address)->labelID) ->labelID) < 0) { _error = fclose(fp); if (_error == EOF) notifyError(AXE_FCLOSE_ERROR); notifyError(AXE_FWRITE_ERROR); } } if (fprintf(fp, "\n") < 0) { _error = fclose(fp); if (_error == EOF) notifyError(AXE_FCLOSE_ERROR); notifyError(AXE_FWRITE_ERROR); } /* update the current_element */ current_element = LNEXT(current_element); continue; } if (fprintf(fp, "#%d", current_instruction->immediate) < 0) { _error = fclose(fp); if (_error == EOF) notifyError(AXE_FCLOSE_ERROR); notifyError(AXE_FWRITE_ERROR); } if (fprintf(fp, "\n") < 0) { _error = fclose(fp); if (_error == EOF) notifyError(AXE_FCLOSE_ERROR); notifyError(AXE_FWRITE_ERROR); } /* loop termination condition */ current_element = LNEXT(current_element); } }