Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- subzero/src/assembler.cpp - Assembler base class -------------------===// | 1 //===- subzero/src/assembler.cpp - Assembler base class -------------------===// |
| 2 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 2 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 3 // for details. All rights reserved. Use of this source code is governed by a | 3 // for details. All rights reserved. Use of this source code is governed by a |
| 4 // BSD-style license that can be found in the LICENSE file. | 4 // BSD-style license that can be found in the LICENSE file. |
| 5 // | 5 // |
| 6 // Modified by the Subzero authors. | 6 // Modified by the Subzero authors. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // The Subzero Code Generator | 10 // The Subzero Code Generator |
| 11 // | 11 // |
| 12 // This file is distributed under the University of Illinois Open Source | 12 // This file is distributed under the University of Illinois Open Source |
| 13 // License. See LICENSE.TXT for details. | 13 // License. See LICENSE.TXT for details. |
| 14 // | 14 // |
| 15 //===----------------------------------------------------------------------===// | 15 //===----------------------------------------------------------------------===// |
| 16 // | 16 // |
| 17 // This file implements the Assembler class. | 17 // This file implements the Assembler class. |
| 18 // | 18 // |
| 19 //===----------------------------------------------------------------------===// | 19 //===----------------------------------------------------------------------===// |
| 20 | 20 |
| 21 #include "assembler.h" | 21 #include "assembler.h" |
| 22 #include "IceGlobalContext.h" | |
| 22 #include "IceMemoryRegion.h" | 23 #include "IceMemoryRegion.h" |
| 24 #include "IceOperand.h" | |
| 23 | 25 |
| 24 namespace Ice { | 26 namespace Ice { |
| 25 | 27 |
| 26 static uintptr_t NewContents(Assembler &assembler, intptr_t capacity) { | 28 static uintptr_t NewContents(Assembler &assembler, intptr_t capacity) { |
| 27 uintptr_t result = assembler.AllocateBytes(capacity); | 29 uintptr_t result = assembler.AllocateBytes(capacity); |
| 28 return result; | 30 return result; |
| 29 } | 31 } |
| 30 | 32 |
| 31 #ifndef NDEBUG | 33 #ifndef NDEBUG |
| 32 AssemblerBuffer::EnsureCapacity::EnsureCapacity(AssemblerBuffer *buffer) { | 34 AssemblerBuffer::EnsureCapacity::EnsureCapacity(AssemblerBuffer *buffer) { |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 126 | 128 |
| 127 // Update the cursor and recompute the limit. | 129 // Update the cursor and recompute the limit. |
| 128 cursor_ += delta; | 130 cursor_ += delta; |
| 129 limit_ = ComputeLimit(new_contents, new_capacity); | 131 limit_ = ComputeLimit(new_contents, new_capacity); |
| 130 | 132 |
| 131 // Verify internal state. | 133 // Verify internal state. |
| 132 assert(Capacity() == new_capacity); | 134 assert(Capacity() == new_capacity); |
| 133 assert(Size() == old_size); | 135 assert(Size() == old_size); |
| 134 } | 136 } |
| 135 | 137 |
| 138 void Assembler::emitIASBytes(GlobalContext *Ctx) const { | |
| 139 Ostream &Str = Ctx->getStrEmit(); | |
| 140 intptr_t EndPosition = buffer_.Size(); | |
| 141 intptr_t StartPosition = 0; | |
| 142 const intptr_t FixupSize = 4; | |
| 143 while (StartPosition < EndPosition) { | |
| 144 AssemblerFixup *LastFixup = buffer_.GetLatestFixup(StartPosition); | |
|
Jim Stichnoth
2014/11/06 00:02:13
The total work done in all the calls to GetLatestF
jvoung (off chromium)
2014/11/06 00:47:13
Ah right, I wasn't looking at how GetLatestFixup()
| |
| 145 intptr_t LastFixupLoc = LastFixup ? LastFixup->position() : EndPosition; | |
| 146 for (intptr_t i = StartPosition; i < LastFixupLoc; ++i) { | |
| 147 Str << "\t.byte 0x"; | |
| 148 Str.write_hex(buffer_.Load<uint8_t>(i)); | |
| 149 Str << "\n"; | |
| 150 } | |
| 151 if (LastFixup) { | |
| 152 Str << "\t.long "; | |
| 153 const ConstantRelocatable *Reloc = LastFixup->value(); | |
| 154 bool IsPCRel = LastFixup->kind() == FK_PcRel_4; | |
| 155 if (Reloc->getSuppressMangling()) | |
| 156 Str << Reloc->getName(); | |
| 157 else | |
| 158 Str << Ctx->mangleName(Reloc->getName()); | |
| 159 if (Reloc->getOffset()) { | |
| 160 Str << " + " << Reloc->getOffset(); | |
| 161 } | |
| 162 if (IsPCRel) | |
| 163 Str << " - (. + " << FixupSize << ")"; | |
| 164 Str << "\n"; | |
| 165 LastFixupLoc += FixupSize; | |
| 166 assert(LastFixupLoc <= EndPosition); | |
| 167 } | |
| 168 // Continue another round, after the latest fixup. | |
| 169 StartPosition = LastFixupLoc; | |
| 170 } | |
| 171 } | |
| 172 | |
| 136 } // end of namespace Ice | 173 } // end of namespace Ice |
| OLD | NEW |