| Index: third_party/courgette/assembly_program.h
|
| ===================================================================
|
| --- third_party/courgette/assembly_program.h (revision 15668)
|
| +++ third_party/courgette/assembly_program.h (working copy)
|
| @@ -1,134 +0,0 @@
|
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#ifndef COURGETTE_ASSEMBLY_PROGRAM_H_
|
| -#define COURGETTE_ASSEMBLY_PROGRAM_H_
|
| -
|
| -#include <map>
|
| -#include <set>
|
| -#include <vector>
|
| -
|
| -#include "base/basictypes.h"
|
| -
|
| -#include "third_party/courgette/image_info.h"
|
| -
|
| -namespace courgette {
|
| -
|
| -class EncodedProgram;
|
| -class Instruction;
|
| -
|
| -// A Label is a symbolic reference to an address. Unlike a conventional
|
| -// assembly language, we always know the address. The address will later be
|
| -// stored in a table and the Label will be replaced with the index into the
|
| -// table.
|
| -//
|
| -// TODO(sra): Make fields private and add setters and getters.
|
| -class Label {
|
| - public:
|
| - static const int kNoIndex = -1;
|
| - Label() : rva_(0), index_(kNoIndex) {}
|
| - explicit Label(RVA rva) : rva_(rva), index_(kNoIndex) {}
|
| -
|
| - RVA rva_; // Address refered to by the label.
|
| - int index_; // Index of address in address table, kNoIndex until assigned.
|
| -};
|
| -
|
| -typedef std::map<RVA, Label*> RVAToLabel;
|
| -
|
| -// An AssemblyProgram is the result of disassembling an executable file.
|
| -//
|
| -// * The disassembler creates labels in the AssemblyProgram and emits
|
| -// 'Instructions'.
|
| -// * The disassembler then calls DefaultAssignIndexes to assign
|
| -// addresses to positions in the address tables.
|
| -// * [Optional step]
|
| -// * At this point the AssemblyProgram can be converted into an
|
| -// EncodedProgram and serialized to an output stream.
|
| -// * Later, the EncodedProgram can be deserialized and assembled into
|
| -// the original file.
|
| -//
|
| -// The optional step is to modify the AssemblyProgram. One form of modification
|
| -// is to assign indexes in such a way as to make the EncodedProgram for this
|
| -// AssemblyProgram look more like the EncodedProgram for some other
|
| -// AssemblyProgram. The modification process should call UnassignIndexes, do
|
| -// its own assignment, and then call AssignRemainingIndexes to ensure all
|
| -// indexes are assigned.
|
| -//
|
| -class AssemblyProgram {
|
| - public:
|
| - AssemblyProgram();
|
| - ~AssemblyProgram();
|
| -
|
| - void set_image_base(uint64 image_base) { image_base_ = image_base; }
|
| -
|
| - // Instructions will be assembled in the order they are emitted.
|
| -
|
| - // Generates an entire base relocation table.
|
| - void EmitMakeRelocsInstruction();
|
| -
|
| - // Following instruction will be assembled at address 'rva'.
|
| - void EmitOriginInstruction(RVA rva);
|
| -
|
| - // Generates a single byte of data or machine instruction.
|
| - void EmitByteInstruction(uint8 byte);
|
| -
|
| - // Generates 4-byte relative reference to address of 'label'.
|
| - void EmitRel32(Label* label);
|
| -
|
| - // Generates 4-byte absolute reference to address of 'label'.
|
| - void EmitAbs32(Label* label);
|
| -
|
| - Label* FindOrMakeAbs32Label(RVA rva);
|
| - Label* FindOrMakeRel32Label(RVA rva);
|
| -
|
| - void DefaultAssignIndexes();
|
| - void UnassignIndexes();
|
| - void AssignRemainingIndexes();
|
| -
|
| - EncodedProgram* Encode() const;
|
| -
|
| - // Accessor for instruction list.
|
| - const std::vector<Instruction*>& instructions() const {
|
| - return instructions_;
|
| - }
|
| -
|
| - // Returns the label if the instruction contains and absolute address,
|
| - // otherwise returns NULL.
|
| - Label* InstructionAbs32Label(const Instruction* instruction) const;
|
| -
|
| - // Returns the label if the instruction contains and rel32 offset,
|
| - // otherwise returns NULL.
|
| - Label* InstructionRel32Label(const Instruction* instruction) const;
|
| -
|
| -
|
| - private:
|
| - void Emit(Instruction* instruction) { instructions_.push_back(instruction); }
|
| -
|
| - Label* FindLabel(RVA rva, RVAToLabel* labels);
|
| -
|
| - // Helper methods for the public versions.
|
| - static void UnassignIndexes(RVAToLabel* labels);
|
| - static void DefaultAssignIndexes(RVAToLabel* labels);
|
| - static void AssignRemainingIndexes(RVAToLabel* labels);
|
| -
|
| - // Sharing instructions that emit a single byte saves a lot of space.
|
| - Instruction* GetByteInstruction(uint8 byte);
|
| - Instruction** byte_instruction_cache_;
|
| -
|
| - uint64 image_base_; // Desired or mandated base address of image.
|
| -
|
| - std::vector<Instruction*> instructions_; // All the instructions in program.
|
| -
|
| - // These are lookup maps to find the label associated with a given address.
|
| - // We have separate label spaces for addresses referenced by rel32 labels and
|
| - // abs32 labels. This is somewhat arbitrary.
|
| - RVAToLabel rel32_labels_;
|
| - RVAToLabel abs32_labels_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(AssemblyProgram);
|
| -};
|
| -
|
| -} // namespace courgette
|
| -#endif // COURGETTE_ASSEMBLY_PROGRAM_H_
|
| -
|
|
|