| Index: courgette/patch_generator_x86_32.h
|
| diff --git a/courgette/patch_generator_x86_32.h b/courgette/patch_generator_x86_32.h
|
| index 0c2f9f032d5aa622fd7b86539e3db96b46885c36..b03d7c15759468f188faad35ee3dd6c8e602d449 100644
|
| --- a/courgette/patch_generator_x86_32.h
|
| +++ b/courgette/patch_generator_x86_32.h
|
| @@ -2,9 +2,6 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -// This is the transformation and adjustment for all executables.
|
| -// The executable type is determined by ParseDetectedExecutable function.
|
| -
|
| #ifndef COURGETTE_PATCH_GENERATOR_X86_32_H_
|
| #define COURGETTE_PATCH_GENERATOR_X86_32_H_
|
|
|
| @@ -13,12 +10,16 @@
|
| #include "base/logging.h"
|
| #include "base/macros.h"
|
| #include "courgette/assembly_program.h"
|
| +#include "courgette/courgette_flow.h"
|
| #include "courgette/ensemble.h"
|
| #include "courgette/patcher_x86_32.h"
|
| #include "courgette/program_detector.h"
|
|
|
| namespace courgette {
|
|
|
| +// PatchGeneratorX86_32 is the universal patch generator for all executables,
|
| +// performing transformation and adjustment. The executable type is determined
|
| +// by the program detector.
|
| class PatchGeneratorX86_32 : public TransformationPatchGenerator {
|
| public:
|
| PatchGeneratorX86_32(Element* old_element,
|
| @@ -62,56 +63,26 @@ class PatchGeneratorX86_32 : public TransformationPatchGenerator {
|
| if (!corrected_parameters->Empty())
|
| return C_GENERAL_ERROR;
|
|
|
| - // Generate old version of program using |corrected_parameters|.
|
| - // TODO(sra): refactor to use same code from patcher_.
|
| - std::unique_ptr<AssemblyProgram> old_program;
|
| - Status old_parse_status = ParseDetectedExecutableWithAnnotation(
|
| - old_element_->region().start(), old_element_->region().length(),
|
| - &old_program);
|
| - if (old_parse_status != C_OK) {
|
| - LOG(ERROR) << "Cannot parse an executable " << old_element_->Name();
|
| - return old_parse_status;
|
| - }
|
| -
|
| - // TODO(huangs): Move the block below to right before |new_program| gets
|
| - // used, so we can reduce Courgette-gen peak memory.
|
| - std::unique_ptr<AssemblyProgram> new_program;
|
| - Status new_parse_status = ParseDetectedExecutableWithAnnotation(
|
| - new_element_->region().start(), new_element_->region().length(),
|
| - &new_program);
|
| - if (new_parse_status != C_OK) {
|
| - LOG(ERROR) << "Cannot parse an executable " << new_element_->Name();
|
| - return new_parse_status;
|
| + CourgetteFlow flow;
|
| + RegionBuffer old_buffer(old_element_->region());
|
| + RegionBuffer new_buffer(new_element_->region());
|
| + flow.ReadAssemblyProgramFromBuffer(flow.OLD, old_buffer, true);
|
| + flow.CreateEncodedProgramFromAssemblyProgram(flow.OLD);
|
| + flow.WriteSinkStreamSetFromEncodedProgram(flow.OLD,
|
| + old_transformed_element);
|
| + flow.DestroyEncodedProgram(flow.OLD);
|
| + flow.ReadAssemblyProgramFromBuffer(flow.NEW, new_buffer, true);
|
| + flow.AdjustNewAssemblyProgramToMatchOld();
|
| + flow.DestroyAssemblyProgram(flow.OLD);
|
| + flow.CreateEncodedProgramFromAssemblyProgram(flow.NEW);
|
| + flow.DestroyAssemblyProgram(flow.NEW);
|
| + flow.WriteSinkStreamSetFromEncodedProgram(flow.NEW,
|
| + new_transformed_element);
|
| + if (flow.failed()) {
|
| + LOG(ERROR) << flow.message() << " (" << old_element_->Name() << " => "
|
| + << new_element_->Name() << ")";
|
| }
|
| -
|
| - std::unique_ptr<EncodedProgram> old_encoded;
|
| - Status old_encode_status = Encode(*old_program, &old_encoded);
|
| - if (old_encode_status != C_OK)
|
| - return old_encode_status;
|
| -
|
| - Status old_write_status =
|
| - WriteEncodedProgram(old_encoded.get(), old_transformed_element);
|
| -
|
| - old_encoded.reset();
|
| -
|
| - if (old_write_status != C_OK)
|
| - return old_write_status;
|
| -
|
| - Status adjust_status = Adjust(*old_program, new_program.get());
|
| - old_program.reset();
|
| - if (adjust_status != C_OK)
|
| - return adjust_status;
|
| -
|
| - std::unique_ptr<EncodedProgram> new_encoded;
|
| - Status new_encode_status = Encode(*new_program, &new_encoded);
|
| - if (new_encode_status != C_OK)
|
| - return new_encode_status;
|
| -
|
| - new_program.reset();
|
| -
|
| - Status new_write_status =
|
| - WriteEncodedProgram(new_encoded.get(), new_transformed_element);
|
| - return new_write_status;
|
| + return flow.status();
|
| }
|
|
|
| Status Reform(SourceStreamSet* transformed_element,
|
|
|