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

Side by Side Diff: courgette/courgette_tool.cc

Issue 2854113002: [Courgette] Reduce AssemblyProgram to reduce Courgette-apply RAM floor and disk churn. (Closed)
Patch Set: Update courgette_fuzzer in libfuzzer. Created 3 years, 7 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/courgette_flow.cc ('k') | courgette/disassembler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 <stdarg.h> 5 #include <stdarg.h>
6 #include <stddef.h> 6 #include <stddef.h>
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <initializer_list> 9 #include <initializer_list>
10 #include <memory> 10 #include <memory>
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 } 148 }
149 149
150 printf("%s Executable\n", format.c_str()); 150 printf("%s Executable\n", format.c_str());
151 return result; 151 return result;
152 } 152 }
153 153
154 void Disassemble(const base::FilePath& input_file, 154 void Disassemble(const base::FilePath& input_file,
155 const base::FilePath& output_file) { 155 const base::FilePath& output_file) {
156 CourgetteFlow flow; 156 CourgetteFlow flow;
157 BufferedFileReader input_buffer(input_file, flow.name(flow.ONLY)); 157 BufferedFileReader input_buffer(input_file, flow.name(flow.ONLY));
158 flow.ReadAssemblyProgramFromBuffer(flow.ONLY, input_buffer, false); 158 flow.ReadDisassemblerFromBuffer(flow.ONLY, input_buffer);
159 flow.CreateEncodedProgramFromAssemblyProgram(flow.ONLY); 159 flow.CreateAssemblyProgramFromDisassembler(flow.ONLY, false);
160 flow.CreateEncodedProgramFromDisassemblerAndAssemblyProgram(flow.ONLY);
161 flow.DestroyDisassembler(flow.ONLY);
160 flow.DestroyAssemblyProgram(flow.ONLY); 162 flow.DestroyAssemblyProgram(flow.ONLY);
161 flow.WriteSinkStreamSetFromEncodedProgram(flow.ONLY); 163 flow.WriteSinkStreamSetFromEncodedProgram(flow.ONLY);
162 flow.DestroyEncodedProgram(flow.ONLY); 164 flow.DestroyEncodedProgram(flow.ONLY);
163 courgette::SinkStream sink; 165 courgette::SinkStream sink;
164 flow.WriteSinkStreamFromSinkStreamSet(flow.ONLY, &sink); 166 flow.WriteSinkStreamFromSinkStreamSet(flow.ONLY, &sink);
165 if (flow.failed()) 167 if (flow.failed())
166 Problem(flow.message().c_str()); 168 Problem(flow.message().c_str());
167 169
168 WriteSinkToFile(&sink, output_file); 170 WriteSinkToFile(&sink, output_file);
169 } 171 }
170 172
171 void DisassembleAndAdjust(const base::FilePath& old_file, 173 void DisassembleAndAdjust(const base::FilePath& old_file,
172 const base::FilePath& new_file, 174 const base::FilePath& new_file,
173 const base::FilePath& output_file) { 175 const base::FilePath& output_file) {
176 // Flow graph and process sequence (DA = Disassembler, AP = AssemblyProgram,
177 // EP = EncodedProgram, Adj = Adjusted):
178 // [1 Old DA] --> [2 Old AP] [4 New AP] <-- [3 New DA]
179 // | | |
180 // | v (move) v
181 // +---> [5 Adj New AP] --> [6 New EP]
182 // (7 Write)
174 CourgetteFlow flow; 183 CourgetteFlow flow;
175 BufferedFileReader old_buffer(old_file, flow.name(flow.OLD)); 184 BufferedFileReader old_buffer(old_file, flow.name(flow.OLD));
176 BufferedFileReader new_buffer(new_file, flow.name(flow.NEW)); 185 BufferedFileReader new_buffer(new_file, flow.name(flow.NEW));
177 flow.ReadAssemblyProgramFromBuffer(flow.OLD, old_buffer, true); 186 flow.ReadDisassemblerFromBuffer(flow.OLD, old_buffer); // 1
178 flow.ReadAssemblyProgramFromBuffer(flow.NEW, new_buffer, true); 187 flow.CreateAssemblyProgramFromDisassembler(flow.OLD, true); // 2
179 flow.AdjustNewAssemblyProgramToMatchOld(); 188 flow.DestroyDisassembler(flow.OLD);
189 flow.ReadDisassemblerFromBuffer(flow.NEW, new_buffer); // 3
190 flow.CreateAssemblyProgramFromDisassembler(flow.NEW, true); // 4
191 flow.AdjustNewAssemblyProgramToMatchOld(); // 5
180 flow.DestroyAssemblyProgram(flow.OLD); 192 flow.DestroyAssemblyProgram(flow.OLD);
181 flow.CreateEncodedProgramFromAssemblyProgram(flow.NEW); 193 flow.CreateEncodedProgramFromDisassemblerAndAssemblyProgram(flow.NEW); // 6
182 flow.DestroyAssemblyProgram(flow.NEW); 194 flow.DestroyAssemblyProgram(flow.NEW);
183 flow.WriteSinkStreamSetFromEncodedProgram(flow.NEW); 195 flow.DestroyDisassembler(flow.NEW);
196 flow.WriteSinkStreamSetFromEncodedProgram(flow.NEW); // 7
184 flow.DestroyEncodedProgram(flow.NEW); 197 flow.DestroyEncodedProgram(flow.NEW);
185 courgette::SinkStream sink; 198 courgette::SinkStream sink;
186 flow.WriteSinkStreamFromSinkStreamSet(flow.NEW, &sink); 199 flow.WriteSinkStreamFromSinkStreamSet(flow.NEW, &sink);
187 if (flow.failed()) 200 if (flow.failed())
188 Problem(flow.message().c_str()); 201 Problem(flow.message().c_str());
189 202
190 WriteSinkToFile(&sink, output_file); 203 WriteSinkToFile(&sink, output_file);
191 } 204 }
192 205
193 // Diffs two executable files, write a set of files for the diff, one file per 206 // Diffs two executable files, write a set of files for the diff, one file per
194 // stream of the EncodedProgram format. Each file is the bsdiff between the 207 // stream of the EncodedProgram format. Each file is the bsdiff between the
195 // original file's stream and the new file's stream. This is completely 208 // original file's stream and the new file's stream. This is completely
196 // uninteresting to users, but it is handy for seeing how much each which 209 // uninteresting to users, but it is handy for seeing how much each which
197 // streams are contributing to the final file size. Adjustment is optional. 210 // streams are contributing to the final file size. Adjustment is optional.
198 void DisassembleAdjustDiff(const base::FilePath& old_file, 211 void DisassembleAdjustDiff(const base::FilePath& old_file,
199 const base::FilePath& new_file, 212 const base::FilePath& new_file,
200 const base::FilePath& output_file_root, 213 const base::FilePath& output_file_root,
201 bool adjust) { 214 bool adjust) {
215 // Same as PatchGeneratorX86_32::Transform(), except Adjust is optional, and
216 // |flow|'s internal SinkStreamSet get used.
217 // Flow graph and process sequence (DA = Disassembler, AP = AssemblyProgram,
218 // EP = EncodedProgram, Adj = Adjusted):
219 // [1 Old DA] --> [2 Old AP] [6 New AP] <-- [5 New DA]
220 // | | | | |
221 // v | | v (move) v
222 // [3 Old EP] <-----+ +->[7 Adj New AP] --> [8 New EP]
223 // (4 Write) (9 Write)
202 CourgetteFlow flow; 224 CourgetteFlow flow;
203 BufferedFileReader old_buffer(old_file, flow.name(flow.OLD)); 225 BufferedFileReader old_buffer(old_file, flow.name(flow.OLD));
204 BufferedFileReader new_buffer(new_file, flow.name(flow.NEW)); 226 BufferedFileReader new_buffer(new_file, flow.name(flow.NEW));
205 flow.ReadAssemblyProgramFromBuffer(flow.OLD, old_buffer, adjust); 227 flow.ReadDisassemblerFromBuffer(flow.OLD, old_buffer); // 1
206 flow.ReadAssemblyProgramFromBuffer(flow.NEW, new_buffer, adjust); 228 flow.CreateAssemblyProgramFromDisassembler(flow.OLD, adjust); // 2
229 flow.CreateEncodedProgramFromDisassemblerAndAssemblyProgram(flow.OLD); // 3
230 flow.DestroyDisassembler(flow.OLD);
231 flow.WriteSinkStreamSetFromEncodedProgram(flow.OLD); // 4
232 flow.DestroyEncodedProgram(flow.OLD);
233 flow.ReadDisassemblerFromBuffer(flow.NEW, new_buffer); // 5
234 flow.CreateAssemblyProgramFromDisassembler(flow.NEW, adjust); // 6
207 if (adjust) 235 if (adjust)
208 flow.AdjustNewAssemblyProgramToMatchOld(); 236 flow.AdjustNewAssemblyProgramToMatchOld(); // 7, optional
209 flow.CreateEncodedProgramFromAssemblyProgram(flow.OLD);
210 flow.DestroyAssemblyProgram(flow.OLD); 237 flow.DestroyAssemblyProgram(flow.OLD);
211 flow.CreateEncodedProgramFromAssemblyProgram(flow.NEW); 238 flow.CreateEncodedProgramFromDisassemblerAndAssemblyProgram(flow.NEW); // 8
212 flow.DestroyAssemblyProgram(flow.NEW); 239 flow.DestroyAssemblyProgram(flow.NEW);
213 flow.WriteSinkStreamSetFromEncodedProgram(flow.OLD); 240 flow.DestroyDisassembler(flow.NEW);
214 flow.DestroyEncodedProgram(flow.OLD); 241 flow.WriteSinkStreamSetFromEncodedProgram(flow.NEW); // 9
215 flow.WriteSinkStreamSetFromEncodedProgram(flow.NEW);
216 flow.DestroyEncodedProgram(flow.NEW); 242 flow.DestroyEncodedProgram(flow.NEW);
217 if (flow.failed()) 243 if (flow.failed())
218 Problem(flow.message().c_str()); 244 Problem(flow.message().c_str());
219 245
220 courgette::SinkStream empty_sink; 246 courgette::SinkStream empty_sink;
221 for (int i = 0; ; ++i) { 247 for (int i = 0; ; ++i) {
222 courgette::SinkStream* old_stream = flow.data(flow.OLD)->sinks.stream(i); 248 courgette::SinkStream* old_stream = flow.data(flow.OLD)->sinks.stream(i);
223 courgette::SinkStream* new_stream = flow.data(flow.NEW)->sinks.stream(i); 249 courgette::SinkStream* new_stream = flow.data(flow.NEW)->sinks.stream(i);
224 if (old_stream == NULL && new_stream == NULL) 250 if (old_stream == NULL && new_stream == NULL)
225 break; 251 break;
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 UsageProblem(kUsageGen1); 485 UsageProblem(kUsageGen1);
460 DisassembleAdjustDiff(values[0], values[1], values[2], 486 DisassembleAdjustDiff(values[0], values[1], values[2],
461 cmd_spread_1_adjusted); 487 cmd_spread_1_adjusted);
462 } else { 488 } else {
463 UsageProblem("No operation specified"); 489 UsageProblem("No operation specified");
464 } 490 }
465 } 491 }
466 492
467 return 0; 493 return 0;
468 } 494 }
OLDNEW
« no previous file with comments | « courgette/courgette_flow.cc ('k') | courgette/disassembler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698