|  |  |  | @@ -20,6 +20,8 @@ iss::plugin::cov::cov(std::string const &filename) | 
		
	
		
			
				|  |  |  |  |     , filename(filename) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     output.open("output.trc"); | 
		
	
		
			
				|  |  |  |  |     jumped = false; | 
		
	
		
			
				|  |  |  |  |     first = true; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | iss::plugin::cov::~cov() { | 
		
	
	
		
			
				
					
					|  |  |  | @@ -79,13 +81,47 @@ bool iss::plugin::cov::registration(const char *const version, vm_if& vm) { | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | inline string formatPC(uint64_t pc) { | 
		
	
		
			
				|  |  |  |  |     stringstream stream; | 
		
	
		
			
				|  |  |  |  |     stream << "0x" << std::hex << pc; | 
		
	
		
			
				|  |  |  |  |     return stream.str(); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | void iss::plugin::cov::callback(instr_info_t iinfo, const exec_info& einfo) { | 
		
	
		
			
				|  |  |  |  | //    if((instr_if->get_next_pc() - instr_if->get_pc() != 4) ||( instr_if->get_next_pc() - instr_if->get_pc() != 2)){ | 
		
	
		
			
				|  |  |  |  | //        std::cout << "jump from " << std::hex << instr_if->get_pc() << " to " << instr_if->get_next_pc()<< " after " << std::dec << counter <<" linear instructions" <<std::endl; | 
		
	
		
			
				|  |  |  |  | //        counter = 0; | 
		
	
		
			
				|  |  |  |  | //    }else { | 
		
	
		
			
				|  |  |  |  | //        counter++; | 
		
	
		
			
				|  |  |  |  | //    auto delay = 0; | 
		
	
		
			
				|  |  |  |  | //    auto entry = delays[iinfo.instr_id]; | 
		
	
		
			
				|  |  |  |  | //    bool taken = einfo.branch_taken; | 
		
	
		
			
				|  |  |  |  | //    if (einfo.branch_taken) | 
		
	
		
			
				|  |  |  |  | //        delay = entry.taken; | 
		
	
		
			
				|  |  |  |  | //    else | 
		
	
		
			
				|  |  |  |  | //        delay = entry.not_taken; | 
		
	
		
			
				|  |  |  |  | // | 
		
	
		
			
				|  |  |  |  | //    if (first){ | 
		
	
		
			
				|  |  |  |  | //        output << formatPC(instr_if->get_pc()) << "," << delay; | 
		
	
		
			
				|  |  |  |  | //        first = false; | 
		
	
		
			
				|  |  |  |  | //    } | 
		
	
		
			
				|  |  |  |  | //    if(instr_if->get_next_pc()-instr_if->get_pc() != delays[iinfo.instr_id].size/8){ | 
		
	
		
			
				|  |  |  |  | //        //The goal is to keep the output in start-target pairs, so after a jump the target address needs to get written | 
		
	
		
			
				|  |  |  |  | //        //to the output. If the target happens to also be a start, we keep the pairing by adding a 0-delay entry. | 
		
	
		
			
				|  |  |  |  | //        if (jumped) | 
		
	
		
			
				|  |  |  |  | //            output <<"\n" <<formatPC(instr_if->get_pc()) << "," << 0; | 
		
	
		
			
				|  |  |  |  | //        output <<"\n" << formatPC(instr_if->get_pc()) << "," << delay; | 
		
	
		
			
				|  |  |  |  | //        jumped = true; | 
		
	
		
			
				|  |  |  |  | //    } | 
		
	
		
			
				|  |  |  |  | //    else{ | 
		
	
		
			
				|  |  |  |  | //        if (jumped){ | 
		
	
		
			
				|  |  |  |  | //            output <<"\n" << formatPC(instr_if->get_pc()) << "," << delay; | 
		
	
		
			
				|  |  |  |  | //            jumped = false; | 
		
	
		
			
				|  |  |  |  | //        } | 
		
	
		
			
				|  |  |  |  | //        else if(delay!=1){ | 
		
	
		
			
				|  |  |  |  | //            output <<"\n" << formatPC(instr_if->get_pc()) << "," << delay; | 
		
	
		
			
				|  |  |  |  | //            output <<"\n" << formatPC(instr_if->get_pc()) << "," << 0; | 
		
	
		
			
				|  |  |  |  | //        } | 
		
	
		
			
				|  |  |  |  | // | 
		
	
		
			
				|  |  |  |  | //    } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | //source code for the full output | 
		
	
		
			
				|  |  |  |  |     auto delay = 0; | 
		
	
		
			
				|  |  |  |  |     auto entry = delays[iinfo.instr_id]; | 
		
	
		
			
				|  |  |  |  |     bool taken = einfo.branch_taken; | 
		
	
	
		
			
				
					
					|  |  |  |   |