13a73d9e0SDuncan P. N. Exon Smith //===- DebugLocStream.cpp - DWARF debug_loc stream --------------*- C++ -*-===//
23a73d9e0SDuncan P. N. Exon Smith //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63a73d9e0SDuncan P. N. Exon Smith //
73a73d9e0SDuncan P. N. Exon Smith //===----------------------------------------------------------------------===//
83a73d9e0SDuncan P. N. Exon Smith 
93a73d9e0SDuncan P. N. Exon Smith #include "DebugLocStream.h"
103a73d9e0SDuncan P. N. Exon Smith #include "DwarfDebug.h"
113a73d9e0SDuncan P. N. Exon Smith #include "llvm/CodeGen/AsmPrinter.h"
123a73d9e0SDuncan P. N. Exon Smith 
133a73d9e0SDuncan P. N. Exon Smith using namespace llvm;
143a73d9e0SDuncan P. N. Exon Smith 
finalizeList(AsmPrinter & Asm)153a73d9e0SDuncan P. N. Exon Smith bool DebugLocStream::finalizeList(AsmPrinter &Asm) {
163a73d9e0SDuncan P. N. Exon Smith   if (Lists.back().EntryOffset == Entries.size()) {
173a73d9e0SDuncan P. N. Exon Smith     // Empty list.  Delete it.
183a73d9e0SDuncan P. N. Exon Smith     Lists.pop_back();
193a73d9e0SDuncan P. N. Exon Smith     return false;
203a73d9e0SDuncan P. N. Exon Smith   }
213a73d9e0SDuncan P. N. Exon Smith 
223a73d9e0SDuncan P. N. Exon Smith   // Real list.  Generate a label for it.
233a73d9e0SDuncan P. N. Exon Smith   Lists.back().Label = Asm.createTempSymbol("debug_loc");
243a73d9e0SDuncan P. N. Exon Smith   return true;
253a73d9e0SDuncan P. N. Exon Smith }
263a73d9e0SDuncan P. N. Exon Smith 
finalizeEntry()273a73d9e0SDuncan P. N. Exon Smith void DebugLocStream::finalizeEntry() {
283a73d9e0SDuncan P. N. Exon Smith   if (Entries.back().ByteOffset != DWARFBytes.size())
293a73d9e0SDuncan P. N. Exon Smith     return;
303a73d9e0SDuncan P. N. Exon Smith 
313a73d9e0SDuncan P. N. Exon Smith   // The last entry was empty.  Delete it.
323a73d9e0SDuncan P. N. Exon Smith   Comments.erase(Comments.begin() + Entries.back().CommentOffset,
333a73d9e0SDuncan P. N. Exon Smith                  Comments.end());
343a73d9e0SDuncan P. N. Exon Smith   Entries.pop_back();
353a73d9e0SDuncan P. N. Exon Smith 
363a73d9e0SDuncan P. N. Exon Smith   assert(Lists.back().EntryOffset <= Entries.size() &&
373a73d9e0SDuncan P. N. Exon Smith          "Popped off more entries than are in the list");
383a73d9e0SDuncan P. N. Exon Smith }
393a73d9e0SDuncan P. N. Exon Smith 
~ListBuilder()403a73d9e0SDuncan P. N. Exon Smith DebugLocStream::ListBuilder::~ListBuilder() {
413a73d9e0SDuncan P. N. Exon Smith   if (!Locs.finalizeList(Asm))
423a73d9e0SDuncan P. N. Exon Smith     return;
433a73d9e0SDuncan P. N. Exon Smith   V.initializeDbgValue(&MI);
443a73d9e0SDuncan P. N. Exon Smith   V.setDebugLocListIndex(ListIndex);
45*dabd2622SEvgenii Stepanov   if (TagOffset)
46*dabd2622SEvgenii Stepanov     V.setDebugLocListTagOffset(*TagOffset);
473a73d9e0SDuncan P. N. Exon Smith }
48