Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "courgette/assembly_program.h" | 5 #include "courgette/assembly_program.h" |
| 6 | 6 |
| 7 #include <memory.h> | 7 #include <memory.h> |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <set> | 10 #include <set> |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 83 // Emits a single byte. | 83 // Emits a single byte. |
| 84 class ByteInstruction : public Instruction { | 84 class ByteInstruction : public Instruction { |
| 85 public: | 85 public: |
| 86 explicit ByteInstruction(uint8 value) : Instruction(DEFBYTE, value) {} | 86 explicit ByteInstruction(uint8 value) : Instruction(DEFBYTE, value) {} |
| 87 uint8 byte_value() const { return info_; } | 87 uint8 byte_value() const { return info_; } |
| 88 }; | 88 }; |
| 89 | 89 |
| 90 // Emits a single byte. | 90 // Emits a single byte. |
| 91 class BytesInstruction : public Instruction { | 91 class BytesInstruction : public Instruction { |
| 92 public: | 92 public: |
| 93 BytesInstruction(const uint8* values, uint32 len) | 93 BytesInstruction(const uint8* values, size_t len) |
|
Peter Kasting
2014/09/30 00:08:01
These changes follow from the API change to EmitBy
| |
| 94 : Instruction(DEFBYTES, 0), | 94 : Instruction(DEFBYTES, 0), |
| 95 values_(values), | 95 values_(values), |
| 96 len_(len) {} | 96 len_(len) {} |
| 97 const uint8* byte_values() const { return values_; } | 97 const uint8* byte_values() const { return values_; } |
| 98 uint32 len() const { return len_; } | 98 size_t len() const { return len_; } |
| 99 | 99 |
| 100 private: | 100 private: |
| 101 const uint8* values_; | 101 const uint8* values_; |
| 102 uint32 len_; | 102 size_t len_; |
| 103 }; | 103 }; |
| 104 | 104 |
| 105 // A ABS32 to REL32 instruction emits a reference to a label's address. | 105 // A ABS32 to REL32 instruction emits a reference to a label's address. |
| 106 class InstructionWithLabel : public Instruction { | 106 class InstructionWithLabel : public Instruction { |
| 107 public: | 107 public: |
| 108 InstructionWithLabel(OP op, Label* label) | 108 InstructionWithLabel(OP op, Label* label) |
| 109 : Instruction(op, 0), label_(label) { | 109 : Instruction(op, 0), label_(label) { |
| 110 if (label == NULL) NOTREACHED(); | 110 if (label == NULL) NOTREACHED(); |
| 111 } | 111 } |
| 112 Label* label() const { return label_; } | 112 Label* label() const { return label_; } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 172 | 172 |
| 173 CheckBool AssemblyProgram::EmitOriginInstruction(RVA rva) { | 173 CheckBool AssemblyProgram::EmitOriginInstruction(RVA rva) { |
| 174 return Emit(new(std::nothrow) OriginInstruction(rva)); | 174 return Emit(new(std::nothrow) OriginInstruction(rva)); |
| 175 } | 175 } |
| 176 | 176 |
| 177 CheckBool AssemblyProgram::EmitByteInstruction(uint8 byte) { | 177 CheckBool AssemblyProgram::EmitByteInstruction(uint8 byte) { |
| 178 return Emit(GetByteInstruction(byte)); | 178 return Emit(GetByteInstruction(byte)); |
| 179 } | 179 } |
| 180 | 180 |
| 181 CheckBool AssemblyProgram::EmitBytesInstruction(const uint8* values, | 181 CheckBool AssemblyProgram::EmitBytesInstruction(const uint8* values, |
| 182 uint32 len) { | 182 size_t len) { |
| 183 return Emit(new(std::nothrow) BytesInstruction(values, len)); | 183 return Emit(new(std::nothrow) BytesInstruction(values, len)); |
| 184 } | 184 } |
| 185 | 185 |
| 186 CheckBool AssemblyProgram::EmitRel32(Label* label) { | 186 CheckBool AssemblyProgram::EmitRel32(Label* label) { |
| 187 return Emit(new(std::nothrow) InstructionWithLabel(REL32, label)); | 187 return Emit(new(std::nothrow) InstructionWithLabel(REL32, label)); |
| 188 } | 188 } |
| 189 | 189 |
| 190 CheckBool AssemblyProgram::EmitRel32ARM(uint16 op, Label* label, | 190 CheckBool AssemblyProgram::EmitRel32ARM(uint16 op, Label* label, |
| 191 const uint8* arm_op, uint16 op_size) { | 191 const uint8* arm_op, uint16 op_size) { |
| 192 return Emit(new(std::nothrow) InstructionWithLabelARM(REL32ARM, op, label, | 192 return Emit(new(std::nothrow) InstructionWithLabelARM(REL32ARM, op, label, |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 414 } | 414 } |
| 415 case DEFBYTE: { | 415 case DEFBYTE: { |
| 416 uint8 b = static_cast<ByteInstruction*>(instruction)->byte_value(); | 416 uint8 b = static_cast<ByteInstruction*>(instruction)->byte_value(); |
| 417 if (!encoded->AddCopy(1, &b)) | 417 if (!encoded->AddCopy(1, &b)) |
| 418 return NULL; | 418 return NULL; |
| 419 break; | 419 break; |
| 420 } | 420 } |
| 421 case DEFBYTES: { | 421 case DEFBYTES: { |
| 422 const uint8* byte_values = | 422 const uint8* byte_values = |
| 423 static_cast<BytesInstruction*>(instruction)->byte_values(); | 423 static_cast<BytesInstruction*>(instruction)->byte_values(); |
| 424 uint32 len = static_cast<BytesInstruction*>(instruction)->len(); | 424 size_t len = static_cast<BytesInstruction*>(instruction)->len(); |
| 425 | 425 |
| 426 if (!encoded->AddCopy(len, byte_values)) | 426 if (!encoded->AddCopy(len, byte_values)) |
| 427 return NULL; | 427 return NULL; |
| 428 break; | 428 break; |
| 429 } | 429 } |
| 430 case REL32: { | 430 case REL32: { |
| 431 Label* label = static_cast<InstructionWithLabel*>(instruction)->label(); | 431 Label* label = static_cast<InstructionWithLabel*>(instruction)->label(); |
| 432 if (!encoded->AddRel32(label->index_)) | 432 if (!encoded->AddRel32(label->index_)) |
| 433 return NULL; | 433 return NULL; |
| 434 break; | 434 break; |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 574 EncodedProgram *encoded = program->Encode(); | 574 EncodedProgram *encoded = program->Encode(); |
| 575 if (encoded) { | 575 if (encoded) { |
| 576 *output = encoded; | 576 *output = encoded; |
| 577 return C_OK; | 577 return C_OK; |
| 578 } else { | 578 } else { |
| 579 return C_GENERAL_ERROR; | 579 return C_GENERAL_ERROR; |
| 580 } | 580 } |
| 581 } | 581 } |
| 582 | 582 |
| 583 } // namespace courgette | 583 } // namespace courgette |
| OLD | NEW |