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

Side by Side Diff: courgette/courgette_flow.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.h ('k') | courgette/courgette_tool.cc » ('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 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
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
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
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
OLDNEW
« no previous file with comments | « courgette/courgette_flow.h ('k') | courgette/courgette_tool.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698