| Index: courgette/instruction_utils.h
|
| diff --git a/courgette/instruction_utils.h b/courgette/instruction_utils.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d7dfe97e46625d24e61cb6fffbd44c68adbea9f2
|
| --- /dev/null
|
| +++ b/courgette/instruction_utils.h
|
| @@ -0,0 +1,66 @@
|
| +// Copyright 2016 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_INSTRUCTION_UTILS_H_
|
| +#define COURGETTE_INSTRUCTION_UTILS_H_
|
| +
|
| +#include <stdint.h>
|
| +
|
| +#include "base/callback.h"
|
| +#include "base/macros.h"
|
| +#include "courgette/image_utils.h"
|
| +#include "courgette/memory_allocator.h"
|
| +
|
| +namespace courgette {
|
| +
|
| +// An interface to receive emitted instructions parsed from an executable.
|
| +class InstructionReceptor {
|
| + public:
|
| + InstructionReceptor() = default;
|
| + virtual ~InstructionReceptor() = default;
|
| +
|
| + // Generates an entire base relocation table.
|
| + virtual CheckBool EmitPeRelocs() = 0;
|
| +
|
| + // Generates an ELF style relocation table for X86.
|
| + virtual CheckBool EmitElfRelocation() = 0;
|
| +
|
| + // Generates an ELF style relocation table for ARM.
|
| + virtual CheckBool EmitElfARMRelocation() = 0;
|
| +
|
| + // Following instruction will be assembled at address 'rva'.
|
| + virtual CheckBool EmitOrigin(RVA rva) = 0;
|
| +
|
| + // Generates a single byte of data or machine instruction.
|
| + virtual CheckBool EmitSingleByte(uint8_t byte) = 0;
|
| +
|
| + // Generates multiple bytes of data or machine instructions.
|
| + virtual CheckBool EmitMultipleBytes(const uint8_t* bytes, size_t len) = 0;
|
| +
|
| + // Generates a 4-byte relative reference to address of 'label'.
|
| + virtual CheckBool EmitRel32(Label* label) = 0;
|
| +
|
| + // Generates a 4-byte relative reference to address of 'label' for ARM.
|
| + virtual CheckBool EmitRel32ARM(uint16_t op,
|
| + Label* label,
|
| + const uint8_t* arm_op,
|
| + uint16_t op_size) = 0;
|
| +
|
| + // Generates a 4-byte absolute reference to address of 'label'.
|
| + virtual CheckBool EmitAbs32(Label* label) = 0;
|
| +
|
| + // Generates an 8-byte absolute reference to address of 'label'.
|
| + virtual CheckBool EmitAbs64(Label* label) = 0;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(InstructionReceptor);
|
| +};
|
| +
|
| +// A rerunable callback that emit instructions to a provided receptor. Returns
|
| +// true on success, and false otherwise.
|
| +using InstructionGenerator = base::Callback<CheckBool(InstructionReceptor*)>;
|
| +
|
| +} // namespace courgette
|
| +
|
| +#endif // COURGETTE_INSTRUCTION_UTILS_H_
|
|
|