Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Side by Side Diff: courgette/program_detector.cc

Issue 2793153003: [Courgette] Refactor: Store Label Annotation in AssemblyProgram for patch generation. (Closed)
Patch Set: Rename *_label_annotation to *_label_annotations. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « courgette/program_detector.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "courgette/program_detector.h" 5 #include "courgette/program_detector.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "courgette/assembly_program.h" 9 #include "courgette/assembly_program.h"
10 #include "courgette/disassembler.h" 10 #include "courgette/disassembler.h"
(...skipping 28 matching lines...) Expand all
39 return disassembler; 39 return disassembler;
40 } 40 }
41 if (DisassemblerElf32ARM::QuickDetect(buffer, length)) { 41 if (DisassemblerElf32ARM::QuickDetect(buffer, length)) {
42 disassembler.reset(new DisassemblerElf32ARM(buffer, length)); 42 disassembler.reset(new DisassemblerElf32ARM(buffer, length));
43 if (disassembler->ParseHeader()) 43 if (disassembler->ParseHeader())
44 return disassembler; 44 return disassembler;
45 } 45 }
46 return nullptr; 46 return nullptr;
47 } 47 }
48 48
49 Status ParseDetectedExecutableInternal(
50 const uint8_t* buffer,
51 size_t length,
52 bool annotate_labels,
53 std::unique_ptr<AssemblyProgram>* output) {
54 output->reset();
55
56 std::unique_ptr<Disassembler> disassembler(
57 DetectDisassembler(buffer, length));
58 if (!disassembler)
59 return C_INPUT_NOT_RECOGNIZED;
60
61 std::unique_ptr<AssemblyProgram> program =
62 disassembler->Disassemble(annotate_labels);
63 if (!program.get())
64 return C_DISASSEMBLY_FAILED;
65
66 *output = std::move(program);
67 return C_OK;
68 }
69
49 } // namespace 70 } // namespace
50 71
51 Status DetectExecutableType(const uint8_t* buffer, 72 Status DetectExecutableType(const uint8_t* buffer,
52 size_t length, 73 size_t length,
53 ExecutableType* type, 74 ExecutableType* type,
54 size_t* detected_length) { 75 size_t* detected_length) {
55 std::unique_ptr<Disassembler> disassembler( 76 std::unique_ptr<Disassembler> disassembler(
56 DetectDisassembler(buffer, length)); 77 DetectDisassembler(buffer, length));
57 78
58 if (!disassembler) { // We failed to detect anything. 79 if (!disassembler) { // We failed to detect anything.
59 *type = EXE_UNKNOWN; 80 *type = EXE_UNKNOWN;
60 *detected_length = 0; 81 *detected_length = 0;
61 return C_INPUT_NOT_RECOGNIZED; 82 return C_INPUT_NOT_RECOGNIZED;
62 } 83 }
63 84
64 *type = disassembler->kind(); 85 *type = disassembler->kind();
65 *detected_length = disassembler->length(); 86 *detected_length = disassembler->length();
66 return C_OK; 87 return C_OK;
67 } 88 }
68 89
69 Status ParseDetectedExecutable(const uint8_t* buffer, 90 Status ParseDetectedExecutable(const uint8_t* buffer,
70 size_t length, 91 size_t length,
71 std::unique_ptr<AssemblyProgram>* output) { 92 std::unique_ptr<AssemblyProgram>* output) {
72 output->reset(); 93 return ParseDetectedExecutableInternal(buffer, length, false, output);
94 }
73 95
74 std::unique_ptr<Disassembler> disassembler( 96 Status ParseDetectedExecutableWithAnnotation(
75 DetectDisassembler(buffer, length)); 97 const uint8_t* buffer,
76 if (!disassembler) 98 size_t length,
77 return C_INPUT_NOT_RECOGNIZED; 99 std::unique_ptr<AssemblyProgram>* output) {
78 100 return ParseDetectedExecutableInternal(buffer, length, true, output);
79 std::unique_ptr<AssemblyProgram> program = disassembler->Disassemble();
80 if (!program.get())
81 return C_DISASSEMBLY_FAILED;
82
83 *output = std::move(program);
84 return C_OK;
85 } 101 }
86 102
87 } // namespace courgette 103 } // namespace courgette
OLDNEW
« no previous file with comments | « courgette/program_detector.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698