OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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/courgette_flow.h" | 5 #include "courgette/courgette_flow.h" |
6 | 6 |
7 #include <stdarg.h> | 7 #include <stdarg.h> |
8 | 8 |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
12 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
13 #include "courgette/assembly_program.h" | 13 #include "courgette/assembly_program.h" |
| 14 #include "courgette/disassembler.h" |
14 #include "courgette/encoded_program.h" | 15 #include "courgette/encoded_program.h" |
15 #include "courgette/program_detector.h" | 16 #include "courgette/program_detector.h" |
16 | 17 |
17 namespace courgette { | 18 namespace courgette { |
18 | 19 |
19 /******** CourgetteFlow::Data ********/ | 20 /******** CourgetteFlow::Data ********/ |
20 | 21 |
21 CourgetteFlow::Data::Data() = default; | 22 CourgetteFlow::Data::Data() = default; |
22 | 23 |
23 CourgetteFlow::Data::~Data() = default; | 24 CourgetteFlow::Data::~Data() = default; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 const BasicBuffer& buffer) { | 80 const BasicBuffer& buffer) { |
80 if (failed()) | 81 if (failed()) |
81 return; | 82 return; |
82 Data* d = data(group); | 83 Data* d = data(group); |
83 if (!check(d->sources.Init(buffer.data(), buffer.length()), | 84 if (!check(d->sources.Init(buffer.data(), buffer.length()), |
84 C_GENERAL_ERROR)) { | 85 C_GENERAL_ERROR)) { |
85 setMessage("Cannot read %s as SourceStreamSet.", name(group)); | 86 setMessage("Cannot read %s as SourceStreamSet.", name(group)); |
86 } | 87 } |
87 } | 88 } |
88 | 89 |
89 void CourgetteFlow::ReadAssemblyProgramFromBuffer(Group group, | 90 void CourgetteFlow::ReadDisassemblerFromBuffer(Group group, |
90 const BasicBuffer& buffer, | 91 const BasicBuffer& buffer) { |
91 bool annotate) { | |
92 if (failed()) | 92 if (failed()) |
93 return; | 93 return; |
94 Data* d = data(group); | 94 Data* d = data(group); |
95 auto parser = annotate ? ParseDetectedExecutableWithAnnotation | 95 d->disassembler = DetectDisassembler(buffer.data(), buffer.length()); |
96 : ParseDetectedExecutable; | 96 if (!check(d->disassembler.get() != nullptr, C_INPUT_NOT_RECOGNIZED)) |
97 if (!check(parser(buffer.data(), buffer.length(), &d->program))) | 97 setMessage("Cannot detect program for %s.", name(group)); |
98 setMessage("Cannot parse %s (code = %d).", name(group), status_); | |
99 } | 98 } |
100 | 99 |
101 void CourgetteFlow::ReadEncodedProgramFromSourceStreamSet( | 100 void CourgetteFlow::ReadEncodedProgramFromSourceStreamSet( |
102 Group group, | 101 Group group, |
103 SourceStreamSet* opt_sources /* nullptr */) { | 102 SourceStreamSet* opt_sources /* nullptr */) { |
104 if (failed()) | 103 if (failed()) |
105 return; | 104 return; |
106 Data* d = data(group); | 105 Data* d = data(group); |
107 SourceStreamSet* sources = opt_sources ? opt_sources : &d->sources; | 106 SourceStreamSet* sources = opt_sources ? opt_sources : &d->sources; |
108 if (!check(ReadEncodedProgram(sources, &d->encoded))) | 107 if (!check(ReadEncodedProgram(sources, &d->encoded))) |
109 setMessage("Cannot read %s as encoded program.", name(group)); | 108 setMessage("Cannot read %s as encoded program.", name(group)); |
110 } | 109 } |
111 | 110 |
112 void CourgetteFlow::CreateEncodedProgramFromAssemblyProgram(Group group) { | 111 void CourgetteFlow::CreateAssemblyProgramFromDisassembler(Group group, |
| 112 bool annotate) { |
113 if (failed()) | 113 if (failed()) |
114 return; | 114 return; |
115 Data* d = data(group); | 115 Data* d = data(group); |
116 if (!check(Encode(*d->program, &d->encoded))) | 116 d->program = d->disassembler->CreateProgram(annotate); |
117 setMessage("Cannot encode %s (code = %d).", name(group), status_); | 117 if (!check(d->program.get() != nullptr, C_DISASSEMBLY_FAILED)) |
| 118 setMessage("Cannot create AssemblyProgram for %s.", name(group)); |
| 119 } |
| 120 |
| 121 void CourgetteFlow::CreateEncodedProgramFromDisassemblerAndAssemblyProgram( |
| 122 Group group) { |
| 123 if (failed()) |
| 124 return; |
| 125 Data* d = data(group); |
| 126 d->encoded.reset(new EncodedProgram()); |
| 127 if (!check(d->disassembler->DisassembleAndEncode(d->program.get(), |
| 128 d->encoded.get()))) { |
| 129 setMessage("Cannot disassemble to form EncodedProgram for %s.", |
| 130 name(group)); |
| 131 } |
118 } | 132 } |
119 | 133 |
120 void CourgetteFlow::WriteSinkStreamFromSinkStreamSet(Group group, | 134 void CourgetteFlow::WriteSinkStreamFromSinkStreamSet(Group group, |
121 SinkStream* sink) { | 135 SinkStream* sink) { |
122 DCHECK(sink); | 136 DCHECK(sink); |
123 if (failed()) | 137 if (failed()) |
124 return; | 138 return; |
125 if (!check(data(group)->sinks.CopyTo(sink), C_GENERAL_ERROR)) | 139 if (!check(data(group)->sinks.CopyTo(sink), C_GENERAL_ERROR)) |
126 setMessage("Cannnot combine serialized streams for %s.", name(group)); | 140 setMessage("Cannnot combine serialized streams for %s.", name(group)); |
127 } | 141 } |
(...skipping 18 matching lines...) Expand all Loading... |
146 setMessage("Cannot assemble %s.", name(group)); | 160 setMessage("Cannot assemble %s.", name(group)); |
147 } | 161 } |
148 | 162 |
149 void CourgetteFlow::AdjustNewAssemblyProgramToMatchOld() { | 163 void CourgetteFlow::AdjustNewAssemblyProgramToMatchOld() { |
150 if (failed()) | 164 if (failed()) |
151 return; | 165 return; |
152 if (!check(Adjust(*data_old_.program, data_new_.program.get()))) | 166 if (!check(Adjust(*data_old_.program, data_new_.program.get()))) |
153 setMessage("Cannot adjust %s to match %s.", name(OLD), name(NEW)); | 167 setMessage("Cannot adjust %s to match %s.", name(OLD), name(NEW)); |
154 } | 168 } |
155 | 169 |
| 170 void CourgetteFlow::DestroyDisassembler(Group group) { |
| 171 if (failed()) |
| 172 return; |
| 173 data(group)->disassembler.reset(); |
| 174 } |
| 175 |
156 void CourgetteFlow::DestroyAssemblyProgram(Group group) { | 176 void CourgetteFlow::DestroyAssemblyProgram(Group group) { |
157 if (failed()) | 177 if (failed()) |
158 return; | 178 return; |
159 data(group)->program.reset(); | 179 data(group)->program.reset(); |
160 } | 180 } |
161 | 181 |
162 void CourgetteFlow::DestroyEncodedProgram(Group group) { | 182 void CourgetteFlow::DestroyEncodedProgram(Group group) { |
163 if (failed()) | 183 if (failed()) |
164 return; | 184 return; |
165 data(group)->encoded.reset(); | 185 data(group)->encoded.reset(); |
(...skipping 14 matching lines...) Expand all Loading... |
180 } | 200 } |
181 | 201 |
182 void CourgetteFlow::setMessage(const char* format, ...) { | 202 void CourgetteFlow::setMessage(const char* format, ...) { |
183 va_list args; | 203 va_list args; |
184 va_start(args, format); | 204 va_start(args, format); |
185 message_ = base::StringPrintV(format, args); | 205 message_ = base::StringPrintV(format, args); |
186 va_end(args); | 206 va_end(args); |
187 } | 207 } |
188 | 208 |
189 } // namespace courgette | 209 } // namespace courgette |
OLD | NEW |