OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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_ENCODED_PROGRAM_H_ | 5 #ifndef COURGETTE_ENCODED_PROGRAM_H_ |
6 #define COURGETTE_ENCODED_PROGRAM_H_ | 6 #define COURGETTE_ENCODED_PROGRAM_H_ |
7 | 7 |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 public: | 25 public: |
26 EncodedProgram(); | 26 EncodedProgram(); |
27 ~EncodedProgram(); | 27 ~EncodedProgram(); |
28 | 28 |
29 // Generating an EncodedProgram: | 29 // Generating an EncodedProgram: |
30 // | 30 // |
31 // (1) The image base can be specified at any time. | 31 // (1) The image base can be specified at any time. |
32 void set_image_base(uint64 base) { image_base_ = base; } | 32 void set_image_base(uint64 base) { image_base_ = base; } |
33 | 33 |
34 // (2) Address tables and indexes defined first. | 34 // (2) Address tables and indexes defined first. |
35 void DefineRel32Label(int index, RVA address); | 35 CheckBool DefineRel32Label(int index, RVA address); |
36 void DefineAbs32Label(int index, RVA address); | 36 CheckBool DefineAbs32Label(int index, RVA address); |
37 void EndLabels(); | 37 void EndLabels(); |
38 | 38 |
39 // (3) Add instructions in the order needed to generate bytes of file. | 39 // (3) Add instructions in the order needed to generate bytes of file. |
40 void AddOrigin(RVA rva); | 40 CheckBool AddOrigin(RVA rva); |
41 void AddCopy(uint32 count, const void* bytes); | 41 CheckBool AddCopy(uint32 count, const void* bytes); |
42 void AddRel32(int label_index); | 42 CheckBool AddRel32(int label_index); |
43 void AddAbs32(int label_index); | 43 CheckBool AddAbs32(int label_index); |
44 void AddMakeRelocs(); | 44 CheckBool AddMakeRelocs(); |
45 | 45 |
46 // (3) Serialize binary assembly language tables to a set of streams. | 46 // (3) Serialize binary assembly language tables to a set of streams. |
47 void WriteTo(SinkStreamSet *streams); | 47 CheckBool WriteTo(SinkStreamSet* streams); |
48 | 48 |
49 // Using an EncodedProgram to generate a byte stream: | 49 // Using an EncodedProgram to generate a byte stream: |
50 // | 50 // |
51 // (4) Deserializes a fresh EncodedProgram from a set of streams. | 51 // (4) Deserializes a fresh EncodedProgram from a set of streams. |
52 bool ReadFrom(SourceStreamSet *streams); | 52 bool ReadFrom(SourceStreamSet* streams); |
53 | 53 |
54 // (5) Assembles the 'binary assembly language' into final file. | 54 // (5) Assembles the 'binary assembly language' into final file. |
55 bool AssembleTo(SinkStream *buffer); | 55 CheckBool AssembleTo(SinkStream* buffer); |
56 | 56 |
57 private: | 57 private: |
58 // Binary assembly language operations. | 58 // Binary assembly language operations. |
59 enum OP { | 59 enum OP { |
60 ORIGIN, // ORIGIN <rva> - set address for subsequent assembly. | 60 ORIGIN, // ORIGIN <rva> - set address for subsequent assembly. |
61 COPY, // COPY <count> <bytes> - copy bytes to output. | 61 COPY, // COPY <count> <bytes> - copy bytes to output. |
62 COPY1, // COPY1 <byte> - same as COPY 1 <byte>. | 62 COPY1, // COPY1 <byte> - same as COPY 1 <byte>. |
63 REL32, // REL32 <index> - emit rel32 encoded reference to address at | 63 REL32, // REL32 <index> - emit rel32 encoded reference to address at |
64 // address table offset <index> | 64 // address table offset <index> |
65 ABS32, // ABS32 <index> - emit abs32 encoded reference to address at | 65 ABS32, // ABS32 <index> - emit abs32 encoded reference to address at |
66 // address table offset <index> | 66 // address table offset <index> |
67 MAKE_BASE_RELOCATION_TABLE, // Emit base relocation table blocks. | 67 MAKE_BASE_RELOCATION_TABLE, // Emit base relocation table blocks. |
68 OP_LAST | 68 OP_LAST |
69 }; | 69 }; |
70 | 70 |
71 typedef std::vector<RVA, MemoryAllocator<RVA> > RvaVector; | 71 typedef std::vector<RVA, MemoryAllocator<RVA> > RvaVector; |
72 typedef std::vector<uint32, MemoryAllocator<uint32> > UInt32Vector; | 72 typedef std::vector<uint32, MemoryAllocator<uint32> > UInt32Vector; |
73 typedef std::vector<uint8, MemoryAllocator<uint8> > UInt8Vector; | 73 typedef std::vector<uint8, MemoryAllocator<uint8> > UInt8Vector; |
74 typedef std::vector<OP, MemoryAllocator<OP> > OPVector; | 74 typedef std::vector<OP, MemoryAllocator<OP> > OPVector; |
75 | 75 |
76 void DebuggingSummary(); | 76 void DebuggingSummary(); |
77 void GenerateBaseRelocations(SinkStream *buffer); | 77 CheckBool GenerateBaseRelocations(SinkStream *buffer); |
78 void DefineLabelCommon(RvaVector*, int, RVA); | 78 CheckBool DefineLabelCommon(RvaVector*, int, RVA); |
79 void FinishLabelsCommon(RvaVector* addresses); | 79 void FinishLabelsCommon(RvaVector* addresses); |
80 | 80 |
81 // Binary assembly language tables. | 81 // Binary assembly language tables. |
82 uint64 image_base_; | 82 uint64 image_base_; |
83 RvaVector rel32_rva_; | 83 RvaVector rel32_rva_; |
84 RvaVector abs32_rva_; | 84 RvaVector abs32_rva_; |
85 OPVector ops_; | 85 OPVector ops_; |
86 RvaVector origins_; | 86 RvaVector origins_; |
87 UInt32Vector copy_counts_; | 87 UInt32Vector copy_counts_; |
88 UInt8Vector copy_bytes_; | 88 UInt8Vector copy_bytes_; |
89 UInt32Vector rel32_ix_; | 89 UInt32Vector rel32_ix_; |
90 UInt32Vector abs32_ix_; | 90 UInt32Vector abs32_ix_; |
91 | 91 |
92 // Table of the addresses containing abs32 relocations; computed during | 92 // Table of the addresses containing abs32 relocations; computed during |
93 // assembly, used to generate base relocation table. | 93 // assembly, used to generate base relocation table. |
94 UInt32Vector abs32_relocs_; | 94 UInt32Vector abs32_relocs_; |
95 | 95 |
96 DISALLOW_COPY_AND_ASSIGN(EncodedProgram); | 96 DISALLOW_COPY_AND_ASSIGN(EncodedProgram); |
97 }; | 97 }; |
98 | 98 |
99 } // namespace courgette | 99 } // namespace courgette |
100 #endif // COURGETTE_ENCODED_PROGRAM_H_ | 100 #endif // COURGETTE_ENCODED_PROGRAM_H_ |
OLD | NEW |