| Index: courgette/encoded_program.cc
|
| diff --git a/courgette/encoded_program.cc b/courgette/encoded_program.cc
|
| index 129728a79860b47b20f216fbeaa08505f1769eeb..5e84ec34074ae1715fc28e2286e267b9b3b9bb2d 100644
|
| --- a/courgette/encoded_program.cc
|
| +++ b/courgette/encoded_program.cc
|
| @@ -19,8 +19,8 @@
|
| #include "base/numerics/safe_math.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/string_util.h"
|
| -#include "courgette/courgette.h"
|
| #include "courgette/disassembler_elf_32_arm.h"
|
| +#include "courgette/label_manager.h"
|
| #include "courgette/streams.h"
|
|
|
| namespace courgette {
|
| @@ -370,107 +370,107 @@ bool VectorAt(const V& v, size_t index, T* output) {
|
| }
|
|
|
| CheckBool EncodedProgram::EvaluateRel32ARM(OP op,
|
| - size_t& ix_rel32_ix,
|
| - RVA& current_rva,
|
| + size_t* ix_rel32_ix,
|
| + RVA* current_rva,
|
| SinkStream* output) {
|
| switch (op & 0x0000F000) {
|
| case REL32ARM8: {
|
| uint32_t index;
|
| - if (!VectorAt(rel32_ix_, ix_rel32_ix, &index))
|
| + if (!VectorAt(rel32_ix_, *ix_rel32_ix, &index))
|
| return false;
|
| - ++ix_rel32_ix;
|
| + ++(*ix_rel32_ix);
|
| RVA rva;
|
| if (!VectorAt(rel32_rva_, index, &rva))
|
| return false;
|
| uint32_t decompressed_op;
|
| if (!DisassemblerElf32ARM::Decompress(
|
| ARM_OFF8, static_cast<uint16_t>(op),
|
| - static_cast<uint32_t>(rva - current_rva), &decompressed_op)) {
|
| + static_cast<uint32_t>(rva - *current_rva), &decompressed_op)) {
|
| return false;
|
| }
|
| uint16_t op16 = static_cast<uint16_t>(decompressed_op);
|
| if (!output->Write(&op16, 2))
|
| return false;
|
| - current_rva += 2;
|
| + *current_rva += 2;
|
| break;
|
| }
|
| case REL32ARM11: {
|
| uint32_t index;
|
| - if (!VectorAt(rel32_ix_, ix_rel32_ix, &index))
|
| + if (!VectorAt(rel32_ix_, *ix_rel32_ix, &index))
|
| return false;
|
| - ++ix_rel32_ix;
|
| + ++(*ix_rel32_ix);
|
| RVA rva;
|
| if (!VectorAt(rel32_rva_, index, &rva))
|
| return false;
|
| uint32_t decompressed_op;
|
| if (!DisassemblerElf32ARM::Decompress(ARM_OFF11, (uint16_t)op,
|
| - (uint32_t)(rva - current_rva),
|
| + (uint32_t)(rva - *current_rva),
|
| &decompressed_op)) {
|
| return false;
|
| }
|
| uint16_t op16 = static_cast<uint16_t>(decompressed_op);
|
| if (!output->Write(&op16, 2))
|
| return false;
|
| - current_rva += 2;
|
| + *current_rva += 2;
|
| break;
|
| }
|
| case REL32ARM24: {
|
| uint32_t index;
|
| - if (!VectorAt(rel32_ix_, ix_rel32_ix, &index))
|
| + if (!VectorAt(rel32_ix_, *ix_rel32_ix, &index))
|
| return false;
|
| - ++ix_rel32_ix;
|
| + ++(*ix_rel32_ix);
|
| RVA rva;
|
| if (!VectorAt(rel32_rva_, index, &rva))
|
| return false;
|
| uint32_t decompressed_op;
|
| if (!DisassemblerElf32ARM::Decompress(ARM_OFF24, (uint16_t)op,
|
| - (uint32_t)(rva - current_rva),
|
| + (uint32_t)(rva - *current_rva),
|
| &decompressed_op)) {
|
| return false;
|
| }
|
| if (!output->Write(&decompressed_op, 4))
|
| return false;
|
| - current_rva += 4;
|
| + *current_rva += 4;
|
| break;
|
| }
|
| case REL32ARM25: {
|
| uint32_t index;
|
| - if (!VectorAt(rel32_ix_, ix_rel32_ix, &index))
|
| + if (!VectorAt(rel32_ix_, *ix_rel32_ix, &index))
|
| return false;
|
| - ++ix_rel32_ix;
|
| + ++(*ix_rel32_ix);
|
| RVA rva;
|
| if (!VectorAt(rel32_rva_, index, &rva))
|
| return false;
|
| uint32_t decompressed_op;
|
| if (!DisassemblerElf32ARM::Decompress(ARM_OFF25, (uint16_t)op,
|
| - (uint32_t)(rva - current_rva),
|
| + (uint32_t)(rva - *current_rva),
|
| &decompressed_op)) {
|
| return false;
|
| }
|
| uint32_t words = (decompressed_op << 16) | (decompressed_op >> 16);
|
| if (!output->Write(&words, 4))
|
| return false;
|
| - current_rva += 4;
|
| + *current_rva += 4;
|
| break;
|
| }
|
| case REL32ARM21: {
|
| uint32_t index;
|
| - if (!VectorAt(rel32_ix_, ix_rel32_ix, &index))
|
| + if (!VectorAt(rel32_ix_, *ix_rel32_ix, &index))
|
| return false;
|
| - ++ix_rel32_ix;
|
| + ++(*ix_rel32_ix);
|
| RVA rva;
|
| if (!VectorAt(rel32_rva_, index, &rva))
|
| return false;
|
| uint32_t decompressed_op;
|
| if (!DisassemblerElf32ARM::Decompress(ARM_OFF21, (uint16_t)op,
|
| - (uint32_t)(rva - current_rva),
|
| + (uint32_t)(rva - *current_rva),
|
| &decompressed_op)) {
|
| return false;
|
| }
|
| uint32_t words = (decompressed_op << 16) | (decompressed_op >> 16);
|
| if (!output->Write(&words, 4))
|
| return false;
|
| - current_rva += 4;
|
| + *current_rva += 4;
|
| break;
|
| }
|
| default:
|
| @@ -503,7 +503,7 @@ CheckBool EncodedProgram::AssembleTo(SinkStream* final_buffer) {
|
|
|
| switch (op) {
|
| default:
|
| - if (!EvaluateRel32ARM(op, ix_rel32_ix, current_rva, output))
|
| + if (!EvaluateRel32ARM(op, &ix_rel32_ix, ¤t_rva, output))
|
| return false;
|
| break;
|
|
|
| @@ -675,7 +675,6 @@ CheckBool EncodedProgram::AssembleTo(SinkStream* final_buffer) {
|
|
|
| // RelocBlock has the layout of a block of relocations in the base relocation
|
| // table file format.
|
| -//
|
| struct RelocBlockPOD {
|
| uint32_t page_rva;
|
| uint32_t block_size;
|
|
|