void OprofileJITEventListener::NotifyObjectEmitted(const llvm::ObjectImage& Obj) { if (VERBOSITY() >= 1) printf("An object has been emitted:\n"); llvm::error_code code; for (llvm::object::symbol_iterator I = Obj.begin_symbols(), E = Obj.end_symbols(); I != E;) { llvm::object::SymbolRef::Type type; code = I->getType(type); assert(!code); if (type == llvm::object::SymbolRef::ST_Function) { llvm::StringRef name; uint64_t addr, size; code = I->getName(name); assert(!code); code = I->getAddress(addr); assert(!code); code = I->getSize(size); assert(!code); if (VERBOSITY() >= 1) printf("registering with oprofile: %s %p 0x%lx\n", name.data(), (void*)addr, size); int r = op_write_native_code(agent, name.data(), addr, (void*)addr, size); assert(r == 0); //} else { // llvm::StringRef name; // code = I->getName(name); // assert(!code); // printf("Skipping %s\n", name.data()); } ++I; } }
void bm_AddBlock(RuntimeBlockInfo* blk) { /* if (IsOnRam(blk->addr) && PageIsConst(blk->addr)) { blocks_page[(blk->addr&RAM_MASK)/PAGE_SIZE].push_back(blk); } */ all_blocks.push_back(blk); if (blkmap.find(blk)!=blkmap.end()) { printf("DUP: %08X %08X %08X %08X\n", (*blkmap.find(blk))->addr,(*blkmap.find(blk))->code,blk->addr,blk->code); verify(false); } blkmap.insert(blk); verify(bm_GetCode(blk->addr)==ngen_FailedToFindBlock); FPCA(blk->addr)=blk->code; #ifdef DYNA_OPROF if (oprofHandle) { char fname[512]; sprintf(fname,"sh4:%08X,c:%d,s:%d,h:%d",blk->addr,blk->guest_cycles,blk->guest_opcodes,blk->host_opcodes); if (op_write_native_code(oprofHandle, fname, (uint64_t)blk->code, (void*)blk->code, blk->host_code_size) != 0) { printf("op_write_native_code error\n"); } } #endif }
void RegisterV(const void* base_address, u32 code_size, const char* format, va_list args) { #if !(defined USE_OPROFILE && USE_OPROFILE) && !defined(USE_VTUNE) if (!s_perf_map_file.IsOpen()) return; #endif std::string symbol_name = StringFromFormatV(format, args); #if defined USE_OPROFILE && USE_OPROFILE op_write_native_code(s_agent, symbol_name.data(), (u64)base_address, base_address, code_size); #endif #ifdef USE_VTUNE iJIT_Method_Load jmethod = {0}; jmethod.method_id = iJIT_GetNewMethodID(); jmethod.method_load_address = const_cast<void*>(base_address); jmethod.method_size = code_size; jmethod.method_name = const_cast<char*>(symbol_name.data()); iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, (void*)&jmethod); #endif // Linux perf /tmp/perf-$pid.map: if (s_perf_map_file.IsOpen()) { std::string entry = StringFromFormat( "%llx %x %s\n", (u64)base_address, code_size, symbol_name.data()); s_perf_map_file.WriteBytes(entry.data(), entry.size()); } }
void JitBlockCache::FinalizeBlock(int block_num, bool block_link) { JitBlock &b = blocks_[block_num]; b.originalFirstOpcode = Memory::Read_Opcode_JIT(b.originalAddress); MIPSOpcode opcode = GetEmuHackOpForBlock(block_num); Memory::Write_Opcode_JIT(b.originalAddress, opcode); AddBlockMap(block_num); u32 latestExit = 0; if (block_link) { for (int i = 0; i < MAX_JIT_BLOCK_EXITS; i++) { if (b.exitAddress[i] != INVALID_EXIT) { links_to_.insert(std::make_pair(b.exitAddress[i], block_num)); latestExit = std::max(latestExit, b.exitAddress[i]); } } LinkBlock(block_num); LinkBlockExits(block_num); } if (Memory::IsScratchpadAddress(b.originalAddress)) { ExpandRange(blockMemRanges_[JITBLOCK_RANGE_SCRATCH], b.originalAddress, latestExit); } const u32 halfUserMemory = (PSP_GetUserMemoryEnd() - PSP_GetUserMemoryBase()) / 2; if (b.originalAddress < PSP_GetUserMemoryBase() + halfUserMemory) { ExpandRange(blockMemRanges_[JITBLOCK_RANGE_RAMBOTTOM], b.originalAddress, latestExit); } if (latestExit > PSP_GetUserMemoryBase() + halfUserMemory) { ExpandRange(blockMemRanges_[JITBLOCK_RANGE_RAMTOP], b.originalAddress, latestExit); } #if defined USE_OPROFILE && USE_OPROFILE char buf[100]; sprintf(buf, "EmuCode%x", b.originalAddress); const u8* blockStart = blocks_[block_num].checkedEntry; op_write_native_code(agent, buf, (uint64_t)blockStart, blockStart, b.normalEntry + b.codeSize - b.checkedEntry); #endif #ifdef USE_VTUNE sprintf(b.blockName, "EmuCode_0x%08x", b.originalAddress); iJIT_Method_Load jmethod = {0}; jmethod.method_id = iJIT_GetNewMethodID(); jmethod.class_file_name = ""; jmethod.source_file_name = __FILE__; jmethod.method_load_address = (void*)blocks_[block_num].checkedEntry; jmethod.method_size = b.normalEntry + b.codeSize - b.checkedEntry; jmethod.line_number_size = 0; jmethod.method_name = b.blockName; iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, (void*)&jmethod); #endif }