blob: e34574a180157ba2a0ac293f9d6f0baf2001c3f6 [file] [log] [blame]
[email protected]93d529ca2011-10-21 22:24:191// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "courgette/disassembler_win32_x86.h"
6
7#include <algorithm>
[email protected]93d529ca2011-10-21 22:24:198
[email protected]93d529ca2011-10-21 22:24:199#include "base/logging.h"
[email protected]93d529ca2011-10-21 22:24:1910#include "courgette/assembly_program.h"
11#include "courgette/courgette.h"
etiennep7a43c3e2016-06-07 17:40:3812#include "courgette/rel32_finder_x86.h"
[email protected]93d529ca2011-10-21 22:24:1913
huangsdda11d062016-03-14 16:35:3914#if COURGETTE_HISTOGRAM_TARGETS
15#include <iostream>
16#endif
17
[email protected]93d529ca2011-10-21 22:24:1918namespace courgette {
19
etiennep5059bca2016-07-08 17:55:2020DisassemblerWin32X86::DisassemblerWin32X86(const uint8_t* start, size_t length)
etiennep5ac34c92016-05-20 15:44:4621 : DisassemblerWin32(start, length) {}
huangsdda11d062016-03-14 16:35:3922
huangsf940a8c92016-03-23 20:40:3523RVA DisassemblerWin32X86::PointerToTargetRVA(const uint8_t* p) const {
24 return Address32ToRVA(Read32LittleEndian(p));
[email protected]423a3812011-10-26 00:50:2025}
26
huangsf940a8c92016-03-23 20:40:3527RVA DisassemblerWin32X86::Address32ToRVA(uint32_t address) const {
28 if (address < image_base() || address >= image_base() + size_of_image_)
29 return kNoRVA;
30 return static_cast<RVA>(address - image_base());
31}
32
etiennep5ac34c92016-05-20 15:44:4633CheckBool DisassemblerWin32X86::EmitAbs(Label* label,
huangs7b221a52016-11-09 22:28:2334 InstructionReceptor* receptor) const {
35 return receptor->EmitAbs32(label);
[email protected]93d529ca2011-10-21 22:24:1936}
37
38void DisassemblerWin32X86::ParseRel32RelocsFromSection(const Section* section) {
39 // TODO(sra): use characteristic.
40 bool isCode = strcmp(section->name, ".text") == 0;
41 if (!isCode)
42 return;
43
huangsdda11d062016-03-14 16:35:3944 FileOffset start_file_offset = section->file_offset_of_raw_data;
45 FileOffset end_file_offset = start_file_offset + section->size_of_raw_data;
[email protected]93d529ca2011-10-21 22:24:1946
huangsdda11d062016-03-14 16:35:3947 const uint8_t* start_pointer = FileOffsetToPointer(start_file_offset);
48 const uint8_t* end_pointer = FileOffsetToPointer(end_file_offset);
[email protected]93d529ca2011-10-21 22:24:1949
[email protected]423a3812011-10-26 00:50:2050 RVA start_rva = FileOffsetToRVA(start_file_offset);
[email protected]93d529ca2011-10-21 22:24:1951 RVA end_rva = start_rva + section->virtual_size;
52
etiennep7a43c3e2016-06-07 17:40:3853 Rel32FinderX86 finder(
huangs6d2a3032015-09-18 18:52:5654 base_relocation_table().address_,
huangsdda11d062016-03-14 16:35:3955 base_relocation_table().address_ + base_relocation_table().size_);
huangs6d2a3032015-09-18 18:52:5656 finder.Find(start_pointer, end_pointer, start_rva, end_rva, abs32_locations_);
57 finder.SwapRel32Locations(&rel32_locations_);
[email protected]93d529ca2011-10-21 22:24:1958
[email protected]93d529ca2011-10-21 22:24:1959#if COURGETTE_HISTOGRAM_TARGETS
huangs6d2a3032015-09-18 18:52:5660 DCHECK(rel32_target_rvas_.empty());
61 finder.SwapRel32TargetRVAs(&rel32_target_rvas_);
[email protected]93d529ca2011-10-21 22:24:1962#endif
[email protected]93d529ca2011-10-21 22:24:1963}
64
[email protected]93d529ca2011-10-21 22:24:1965} // namespace courgette