Index: courgette/encoded_program.cc |
=================================================================== |
--- courgette/encoded_program.cc (revision 21002) |
+++ courgette/encoded_program.cc (working copy) |
@@ -30,20 +30,6 @@ |
const int kStreamLimit = 9; |
-// Binary assembly language operations. |
-enum EncodedProgram::OP { |
- ORIGIN, // ORIGIN <rva> - set address for subsequent assembly. |
- COPY, // COPY <count> <bytes> - copy bytes to output. |
- COPY1, // COPY1 <byte> - same as COPY 1 <byte>. |
- REL32, // REL32 <index> - emit rel32 encoded reference to address at |
- // address table offset <index> |
- ABS32, // ABS32 <index> - emit abs32 encoded reference to address at |
- // address table offset <index> |
- MAKE_BASE_RELOCATION_TABLE, // Emit base relocation table blocks. |
- OP_LAST |
-}; |
- |
- |
// Constructor is here rather than in the header. Although the constructor |
// appears to do nothing it is fact quite large because of the implict calls to |
// field constructors. Ditto for the destructor. |
@@ -499,32 +485,38 @@ |
// RelocBlock has the layout of a block of relocations in the base relocation |
// table file format. |
// |
-class RelocBlock { |
- public: |
+struct RelocBlockPOD { |
uint32 page_rva; |
uint32 block_size; |
uint16 relocs[4096]; // Allow up to one relocation per byte of a 4k page. |
+}; |
- RelocBlock() : page_rva(~0), block_size(8) {} |
+COMPILE_ASSERT(offsetof(RelocBlockPOD, relocs) == 8, reloc_block_header_size); |
+class RelocBlock { |
+ public: |
+ RelocBlock() { |
+ pod.page_rva = ~0; |
+ pod.block_size = 8; |
+ } |
+ |
void Add(uint16 item) { |
- relocs[(block_size-8)/2] = item; |
- block_size += 2; |
+ pod.relocs[(pod.block_size-8)/2] = item; |
+ pod.block_size += 2; |
} |
void Flush(SinkStream* buffer) { |
- if (block_size != 8) { |
- if (block_size % 4 != 0) { // Pad to make size multiple of 4 bytes. |
+ if (pod.block_size != 8) { |
+ if (pod.block_size % 4 != 0) { // Pad to make size multiple of 4 bytes. |
Add(0); |
} |
- buffer->Write(this, block_size); |
- block_size = 8; |
+ buffer->Write(&pod, pod.block_size); |
+ pod.block_size = 8; |
} |
} |
+ RelocBlockPOD pod; |
}; |
-COMPILE_ASSERT(offsetof(RelocBlock, relocs) == 8, reloc_block_header_size); |
- |
void EncodedProgram::GenerateBaseRelocations(SinkStream* buffer) { |
std::sort(abs32_relocs_.begin(), abs32_relocs_.end()); |
@@ -533,9 +525,9 @@ |
for (size_t i = 0; i < abs32_relocs_.size(); ++i) { |
uint32 rva = abs32_relocs_[i]; |
uint32 page_rva = rva & ~0xFFF; |
- if (page_rva != block.page_rva) { |
+ if (page_rva != block.pod.page_rva) { |
block.Flush(buffer); |
- block.page_rva = page_rva; |
+ block.pod.page_rva = page_rva; |
} |
block.Add(0x3000 | (rva & 0xFFF)); |
} |
Property changes on: courgette/encoded_program.cc |
___________________________________________________________________ |
Name: svn:eol-style |
+ LF |