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 #ifndef COURGETTE_COURGETTE_FLOW_H_ | 5 #ifndef COURGETTE_COURGETTE_FLOW_H_ |
6 #define COURGETTE_COURGETTE_FLOW_H_ | 6 #define COURGETTE_COURGETTE_FLOW_H_ |
7 | 7 |
8 #include <memory> | 8 #include <memory> |
9 #include <string> | 9 #include <string> |
10 | 10 |
11 #include "base/macros.h" | 11 #include "base/macros.h" |
12 #include "courgette/courgette.h" | 12 #include "courgette/courgette.h" |
13 #include "courgette/region.h" | 13 #include "courgette/region.h" |
14 #include "courgette/streams.h" | 14 #include "courgette/streams.h" |
15 | 15 |
16 namespace courgette { | 16 namespace courgette { |
17 | 17 |
18 class AssemblyProgram; | 18 class AssemblyProgram; |
| 19 class Disassembler; |
19 class EncodedProgram; | 20 class EncodedProgram; |
20 | 21 |
21 // An adaptor for Region as BasicBuffer. | 22 // An adaptor for Region as BasicBuffer. |
22 class RegionBuffer : public BasicBuffer { | 23 class RegionBuffer : public BasicBuffer { |
23 public: | 24 public: |
24 explicit RegionBuffer(const Region& region) : region_(region) {} | 25 explicit RegionBuffer(const Region& region) : region_(region) {} |
25 ~RegionBuffer() override {} | 26 ~RegionBuffer() override {} |
26 | 27 |
27 // BasicBuffer: | 28 // BasicBuffer: |
28 const uint8_t* data() const override { return region_.start(); } | 29 const uint8_t* data() const override { return region_.start(); } |
(...skipping 11 matching lines...) Expand all Loading... |
40 // and all subsequent commands become no-op. This allows callers to concisely | 41 // and all subsequent commands become no-op. This allows callers to concisely |
41 // specify high-level logic with minimal code for error handling. | 42 // specify high-level logic with minimal code for error handling. |
42 class CourgetteFlow { | 43 class CourgetteFlow { |
43 public: | 44 public: |
44 // A group of Courgette data, for a single executable. Takes negligible space | 45 // A group of Courgette data, for a single executable. Takes negligible space |
45 // when unused. | 46 // when unused. |
46 struct Data { | 47 struct Data { |
47 Data(); | 48 Data(); |
48 ~Data(); | 49 ~Data(); |
49 | 50 |
| 51 std::unique_ptr<Disassembler> disassembler; |
50 std::unique_ptr<AssemblyProgram> program; | 52 std::unique_ptr<AssemblyProgram> program; |
51 std::unique_ptr<EncodedProgram> encoded; | 53 std::unique_ptr<EncodedProgram> encoded; |
52 SinkStreamSet sinks; | 54 SinkStreamSet sinks; |
53 SourceStreamSet sources; | 55 SourceStreamSet sources; |
54 }; | 56 }; |
55 | 57 |
56 // Group enumeration into |data_*_| fields. | 58 // Group enumeration into |data_*_| fields. |
57 enum Group { | 59 enum Group { |
58 ONLY, // The only file processed. | 60 ONLY, // The only file processed. |
59 OLD, // The "old" file during patching. | 61 OLD, // The "old" file during patching. |
(...skipping 11 matching lines...) Expand all Loading... |
71 const std::string& message(); | 73 const std::string& message(); |
72 | 74 |
73 // Commands that perform no-op on error. This allows caller to concisely | 75 // Commands that perform no-op on error. This allows caller to concisely |
74 // specify high-level logic, and perform a single error check at the end. Care | 76 // specify high-level logic, and perform a single error check at the end. Care |
75 // must be taken w.r.t. error handling if |data()| is harvested between | 77 // must be taken w.r.t. error handling if |data()| is harvested between |
76 // commands. | 78 // commands. |
77 | 79 |
78 // Reads |buffer| to initialize |data(group)->sources|. | 80 // Reads |buffer| to initialize |data(group)->sources|. |
79 void ReadSourceStreamSetFromBuffer(Group group, const BasicBuffer& buffer); | 81 void ReadSourceStreamSetFromBuffer(Group group, const BasicBuffer& buffer); |
80 | 82 |
81 // Reads |buffer| to initialize |data(group)->program|, passing |annotate| as | 83 // Reads |buffer| to initialize |data(group)->disassembler|. |
82 // initialization parameter (true if AdjustNewAssemblyProgramToMatchOld() gets | 84 void ReadDisassemblerFromBuffer(Group group, const BasicBuffer& buffer); |
83 // called later). | |
84 void ReadAssemblyProgramFromBuffer(Group group, | |
85 const BasicBuffer& buffer, | |
86 bool annotate); | |
87 | 85 |
88 // Reads |opt_sources| if given, or else |data(group)->sources| to initialize | 86 // Reads |opt_sources| if given, or else |data(group)->sources| to initialize |
89 // |data(group).encoded|. | 87 // |data(group).encoded|. |
90 void ReadEncodedProgramFromSourceStreamSet( | 88 void ReadEncodedProgramFromSourceStreamSet( |
91 Group group, | 89 Group group, |
92 SourceStreamSet* opt_sources = nullptr); | 90 SourceStreamSet* opt_sources = nullptr); |
93 | 91 |
94 // Uses |data(group)->program| to initialize |data(group)->encoded|. | 92 // Uses |data(group)->disassembler| to initialize |data(group)->program|, |
95 void CreateEncodedProgramFromAssemblyProgram(Group group); | 93 // passing |annotate| as initialization parameter (should be true if |
| 94 // AdjustNewAssemblyProgramToMatchOld() gets called later). |
| 95 void CreateAssemblyProgramFromDisassembler(Group group, bool annotate); |
| 96 |
| 97 // Uses |data(group)->disassembler| and |data(group)->program| to initialize |
| 98 // |data(group)->encoded|. |
| 99 void CreateEncodedProgramFromDisassemblerAndAssemblyProgram(Group group); |
96 | 100 |
97 // Serializese |data(group)->sinks| to |sink|. | 101 // Serializese |data(group)->sinks| to |sink|. |
98 void WriteSinkStreamFromSinkStreamSet(Group group, SinkStream* sink); | 102 void WriteSinkStreamFromSinkStreamSet(Group group, SinkStream* sink); |
99 | 103 |
100 // Serializes |data(group)->encoded| to |opt_sinks| if given, or else to | 104 // Serializes |data(group)->encoded| to |opt_sinks| if given, or else to |
101 // |data(group)->sinks|. | 105 // |data(group)->sinks|. |
102 void WriteSinkStreamSetFromEncodedProgram(Group group, | 106 void WriteSinkStreamSetFromEncodedProgram(Group group, |
103 SinkStreamSet* opt_sinks = nullptr); | 107 SinkStreamSet* opt_sinks = nullptr); |
104 | 108 |
105 // Converts |data(group)->encoded| to an exectuable and writes the result to | 109 // Converts |data(group)->encoded| to an exectuable and writes the result to |
106 // |sink|. | 110 // |sink|. |
107 void WriteExecutableFromEncodedProgram(Group group, SinkStream* sink); | 111 void WriteExecutableFromEncodedProgram(Group group, SinkStream* sink); |
108 | 112 |
109 // Adjusts |data(NEW)->program| Labels to match |data(OLD)->program| Labels. | 113 // Adjusts |data(NEW)->program| Labels to match |data(OLD)->program| Labels. |
110 void AdjustNewAssemblyProgramToMatchOld(); | 114 void AdjustNewAssemblyProgramToMatchOld(); |
111 | 115 |
112 // Destructor commands to reduce memory usage. | 116 // Destructor commands to reduce memory usage. |
113 | 117 |
| 118 void DestroyDisassembler(Group group); |
| 119 |
114 void DestroyAssemblyProgram(Group group); | 120 void DestroyAssemblyProgram(Group group); |
115 | 121 |
116 void DestroyEncodedProgram(Group group); | 122 void DestroyEncodedProgram(Group group); |
117 | 123 |
118 private: | 124 private: |
119 // Utilities to process return values from Courgette functions, and assign | 125 // Utilities to process return values from Courgette functions, and assign |
120 // |status_| and |message_|. Usage: | 126 // |status_| and |message_|. Usage: |
121 // if (!check(some_courgette_function(param1, ...))) | 127 // if (!check(some_courgette_function(param1, ...))) |
122 // setMessage("format string %s...", value1, ...); | 128 // setMessage("format string %s...", value1, ...); |
123 | 129 |
(...skipping 11 matching lines...) Expand all Loading... |
135 Data data_only_; | 141 Data data_only_; |
136 Data data_old_; | 142 Data data_old_; |
137 Data data_new_; | 143 Data data_new_; |
138 | 144 |
139 DISALLOW_COPY_AND_ASSIGN(CourgetteFlow); | 145 DISALLOW_COPY_AND_ASSIGN(CourgetteFlow); |
140 }; | 146 }; |
141 | 147 |
142 } // namespace courgette | 148 } // namespace courgette |
143 | 149 |
144 #endif // COURGETTE_COURGETTE_FLOW_H_ | 150 #endif // COURGETTE_COURGETTE_FLOW_H_ |
OLD | NEW |