| Index: src/assembler.cpp
|
| diff --git a/src/assembler.cpp b/src/assembler.cpp
|
| index d4f566ba3ee093e5f4f7177cc7cda2765c4765a3..8a21a5162c46291e0d0b262719fb0246ea292be0 100644
|
| --- a/src/assembler.cpp
|
| +++ b/src/assembler.cpp
|
| @@ -29,6 +29,17 @@ static uintptr_t NewContents(Assembler &assembler, intptr_t capacity) {
|
| return result;
|
| }
|
|
|
| +AssemblerFixup *AssemblerBuffer::createFixup(FixupKind Kind,
|
| + const Constant *Value) {
|
| + AssemblerFixup *F =
|
| + new (assembler_.Allocate<AssemblerFixup>()) AssemblerFixup();
|
| + F->set_position(0);
|
| + F->set_kind(Kind);
|
| + F->set_value(Value);
|
| + fixups_.push_back(F);
|
| + return F;
|
| +}
|
| +
|
| #ifndef NDEBUG
|
| AssemblerBuffer::EnsureCapacity::EnsureCapacity(AssemblerBuffer *buffer) {
|
| if (buffer->cursor() >= buffer->limit())
|
| @@ -65,7 +76,6 @@ AssemblerBuffer::AssemblerBuffer(Assembler &assembler) : assembler_(assembler) {
|
| limit_ = ComputeLimit(contents_, kInitialBufferCapacity);
|
| #ifndef NDEBUG
|
| has_ensured_capacity_ = false;
|
| - fixups_processed_ = false;
|
| #endif // !NDEBUG
|
|
|
| // Verify internal state.
|
| @@ -81,8 +91,8 @@ void AssemblerBuffer::ExtendCapacity() {
|
| const intptr_t OneMB = 1 << 20;
|
| intptr_t new_capacity = std::min(old_capacity * 2, old_capacity + OneMB);
|
| if (new_capacity < old_capacity) {
|
| - // FATAL
|
| - llvm_unreachable("Unexpected overflow in AssemblerBuffer::ExtendCapacity");
|
| + llvm::report_fatal_error(
|
| + "Unexpected overflow in AssemblerBuffer::ExtendCapacity");
|
| }
|
|
|
| // Allocate the new data area and copy contents of the old one to it.
|
| @@ -113,10 +123,7 @@ void Assembler::emitIASBytes(GlobalContext *Ctx) const {
|
| intptr_t EndPosition = buffer_.Size();
|
| intptr_t CurPosition = 0;
|
| const intptr_t FixupSize = 4;
|
| - for (AssemblerBuffer::FixupList::const_iterator
|
| - FixupI = buffer_.fixups_begin(),
|
| - FixupE = buffer_.fixups_end(); FixupI != FixupE; ++FixupI) {
|
| - AssemblerFixup *NextFixup = *FixupI;
|
| + for (const AssemblerFixup *NextFixup : fixups()) {
|
| intptr_t NextFixupLoc = NextFixup->position();
|
| for (intptr_t i = CurPosition; i < NextFixupLoc; ++i) {
|
| Str << "\t.byte 0x";
|
| @@ -125,8 +132,7 @@ void Assembler::emitIASBytes(GlobalContext *Ctx) const {
|
| }
|
| Str << "\t.long ";
|
| NextFixup->emit(Ctx);
|
| - bool IsPCRel = NextFixup->kind() == FK_PcRel_4;
|
| - if (IsPCRel)
|
| + if (fixupIsPCRel(NextFixup->kind()))
|
| Str << " - (. + " << FixupSize << ")";
|
| Str << "\n";
|
| CurPosition = NextFixupLoc + FixupSize;
|
| @@ -140,34 +146,4 @@ void Assembler::emitIASBytes(GlobalContext *Ctx) const {
|
| }
|
| }
|
|
|
| -RelocOffsetT AssemblerFixup::offset() const {
|
| - if (const auto CR = llvm::dyn_cast<ConstantRelocatable>(value_))
|
| - return CR->getOffset();
|
| - return 0;
|
| -}
|
| -
|
| -IceString AssemblerFixup::symbol(GlobalContext *Ctx) const {
|
| - std::string Buffer;
|
| - llvm::raw_string_ostream Str(Buffer);
|
| - const Constant *C = value_;
|
| - if (const auto CR = llvm::dyn_cast<ConstantRelocatable>(C)) {
|
| - if (CR->getSuppressMangling())
|
| - Str << CR->getName();
|
| - else
|
| - Str << Ctx->mangleName(CR->getName());
|
| - } else {
|
| - assert(llvm::isa<ConstantFloat>(C) || llvm::isa<ConstantDouble>(C));
|
| - C->emitPoolLabel(Str);
|
| - }
|
| - return Str.str();
|
| -}
|
| -
|
| -void AssemblerFixup::emit(GlobalContext *Ctx) const {
|
| - Ostream &Str = Ctx->getStrEmit();
|
| - Str << symbol(Ctx);
|
| - RelocOffsetT Offset = offset();
|
| - if (Offset)
|
| - Str << " + " << Offset;
|
| -}
|
| -
|
| } // end of namespace Ice
|
|
|