| Index: courgette/disassembler_win32.cc
|
| diff --git a/courgette/disassembler_win32.cc b/courgette/disassembler_win32.cc
|
| index e48b0f190453f506dd6e3e9d5c3e75501975312b..f677a0692417134c1dd237a75e6259ca2c30b264 100644
|
| --- a/courgette/disassembler_win32.cc
|
| +++ b/courgette/disassembler_win32.cc
|
| @@ -365,6 +365,60 @@ bool DisassemblerWin32::QuickDetect(const uint8_t* start,
|
| return true;
|
| }
|
|
|
| +bool DisassemblerWin32::ParseAbs32Relocs() {
|
| + abs32_locations_.clear();
|
| + if (!ParseRelocs(&abs32_locations_))
|
| + return false;
|
| +
|
| +#if COURGETTE_HISTOGRAM_TARGETS
|
| + for (size_t i = 0; i < abs32_locations_.size(); ++i) {
|
| + RVA rva = abs32_locations_[i];
|
| + // The 4 bytes at the relocation are a reference to some address.
|
| + ++abs32_target_rvas_[PointerToTargetRVA(RVAToPointer(rva))];
|
| + }
|
| +#endif
|
| + return true;
|
| +}
|
| +
|
| +void DisassemblerWin32::ParseRel32RelocsFromSections() {
|
| + FileOffset file_offset = 0;
|
| + while (file_offset < length()) {
|
| + const Section* section = FindNextSection(file_offset);
|
| + if (section == nullptr)
|
| + break;
|
| + if (file_offset < section->file_offset_of_raw_data)
|
| + file_offset = section->file_offset_of_raw_data;
|
| + ParseRel32RelocsFromSection(section);
|
| + file_offset += section->size_of_raw_data;
|
| + }
|
| + std::sort(rel32_locations_.begin(), rel32_locations_.end());
|
| + DCHECK(rel32_locations_.empty() || rel32_locations_.back() != kUnassignedRVA);
|
| +
|
| +#if COURGETTE_HISTOGRAM_TARGETS
|
| + VLOG(1) << "abs32_locations_ " << abs32_locations_.size()
|
| + << "\nrel32_locations_ " << rel32_locations_.size()
|
| + << "\nabs32_target_rvas_ " << abs32_target_rvas_.size()
|
| + << "\nrel32_target_rvas_ " << rel32_target_rvas_.size();
|
| +
|
| + int common = 0;
|
| + std::map<RVA, int>::iterator abs32_iter = abs32_target_rvas_.begin();
|
| + std::map<RVA, int>::iterator rel32_iter = rel32_target_rvas_.begin();
|
| + while (abs32_iter != abs32_target_rvas_.end() &&
|
| + rel32_iter != rel32_target_rvas_.end()) {
|
| + if (abs32_iter->first < rel32_iter->first) {
|
| + ++abs32_iter;
|
| + } else if (rel32_iter->first < abs32_iter->first) {
|
| + ++rel32_iter;
|
| + } else {
|
| + ++common;
|
| + ++abs32_iter;
|
| + ++rel32_iter;
|
| + }
|
| + }
|
| + VLOG(1) << "common " << common;
|
| +#endif
|
| +}
|
| +
|
| RvaVisitor* DisassemblerWin32::CreateAbs32TargetRvaVisitor() {
|
| return new RvaVisitor_Abs32(abs32_locations_, *this);
|
| }
|
| @@ -420,60 +474,6 @@ CheckBool DisassemblerWin32::ParseFile(AssemblyProgram* program,
|
| return true;
|
| }
|
|
|
| -bool DisassemblerWin32::ParseAbs32Relocs() {
|
| - abs32_locations_.clear();
|
| - if (!ParseRelocs(&abs32_locations_))
|
| - return false;
|
| -
|
| -#if COURGETTE_HISTOGRAM_TARGETS
|
| - for (size_t i = 0; i < abs32_locations_.size(); ++i) {
|
| - RVA rva = abs32_locations_[i];
|
| - // The 4 bytes at the relocation are a reference to some address.
|
| - ++abs32_target_rvas_[PointerToTargetRVA(RVAToPointer(rva))];
|
| - }
|
| -#endif
|
| - return true;
|
| -}
|
| -
|
| -void DisassemblerWin32::ParseRel32RelocsFromSections() {
|
| - FileOffset file_offset = 0;
|
| - while (file_offset < length()) {
|
| - const Section* section = FindNextSection(file_offset);
|
| - if (section == nullptr)
|
| - break;
|
| - if (file_offset < section->file_offset_of_raw_data)
|
| - file_offset = section->file_offset_of_raw_data;
|
| - ParseRel32RelocsFromSection(section);
|
| - file_offset += section->size_of_raw_data;
|
| - }
|
| - std::sort(rel32_locations_.begin(), rel32_locations_.end());
|
| - DCHECK(rel32_locations_.empty() || rel32_locations_.back() != kUnassignedRVA);
|
| -
|
| -#if COURGETTE_HISTOGRAM_TARGETS
|
| - VLOG(1) << "abs32_locations_ " << abs32_locations_.size()
|
| - << "\nrel32_locations_ " << rel32_locations_.size()
|
| - << "\nabs32_target_rvas_ " << abs32_target_rvas_.size()
|
| - << "\nrel32_target_rvas_ " << rel32_target_rvas_.size();
|
| -
|
| - int common = 0;
|
| - std::map<RVA, int>::iterator abs32_iter = abs32_target_rvas_.begin();
|
| - std::map<RVA, int>::iterator rel32_iter = rel32_target_rvas_.begin();
|
| - while (abs32_iter != abs32_target_rvas_.end() &&
|
| - rel32_iter != rel32_target_rvas_.end()) {
|
| - if (abs32_iter->first < rel32_iter->first) {
|
| - ++abs32_iter;
|
| - } else if (rel32_iter->first < abs32_iter->first) {
|
| - ++rel32_iter;
|
| - } else {
|
| - ++common;
|
| - ++abs32_iter;
|
| - ++rel32_iter;
|
| - }
|
| - }
|
| - VLOG(1) << "common " << common;
|
| -#endif
|
| -}
|
| -
|
| CheckBool DisassemblerWin32::ParseNonSectionFileRegion(
|
| FileOffset start_file_offset,
|
| FileOffset end_file_offset,
|
|
|