void Profiler::sectionEnd(const string &name){ if(name==currSection->getName()){ currSection->stop(); currSection= currSection->getParent(); } else{ throw std::runtime_error("Profile: Leaving section is not current section: "+name); } }
void BinOutput::OutputSection(Section& sect, const IntNum& origin) { BytecodeOutput* outputter; if (sect.isBSS()) { outputter = &m_no_output; } else { IntNum file_start = sect.getLMA(); file_start -= origin; if (file_start.getSign() < 0) { Diag(SourceLocation(), diag::err_section_before_origin) << sect.getName(); return; } if (!file_start.isOkSize(sizeof(unsigned long)*8, 0, 0)) { Diag(SourceLocation(), diag::err_start_too_large) << sect.getName(); return; } m_fd_os.seek(file_start.getUInt()); if (m_os.has_error()) { Diag(SourceLocation(), diag::err_file_output_seek); return; } outputter = this; } for (Section::bc_iterator i=sect.bytecodes_begin(), end=sect.bytecodes_end(); i != end; ++i) { i->Output(*outputter); } }
void Section::print(ostream *outStream, int tabLevel){ float percent = ( parent == NULL || parent->microsElapsed == 0 ) ? 100.0f : 100.0f * microsElapsed / parent->microsElapsed; string pname= parent==NULL? "": parent->getName(); for(int i=0; i<tabLevel; ++i) *outStream << "\t"; *outStream << name << ": "; if ( microsElapsed ) { *outStream << int(microsElapsed) << " us"; unsigned int milliseconds = microsElapsed / 1000; unsigned int seconds = milliseconds / 1000; unsigned int minutes = seconds / 60; if ( minutes ) { *outStream << " (" << minutes << "min " << seconds % 60 << "sec)"; } else if ( seconds ) { *outStream << " (" << seconds << "sec " << milliseconds % 1000 << "ms)"; } else if ( milliseconds ) { *outStream << " (" << milliseconds << "ms)"; } outStream->precision(1); *outStream << std::fixed << ", " << percent << "%"; } if ( calls ) { *outStream << ", " << calls << " calls"; } *outStream << "\n"; SectionContainer::iterator it; for(it= children.begin(); it!=children.end(); ++it){ it->second->print(outStream, tabLevel+1); } }