xref: /src/contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/DebugLocStream.cpp (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
11a82d4c0SDimitry Andric //===- DebugLocStream.cpp - DWARF debug_loc stream --------------*- C++ -*-===//
21a82d4c0SDimitry Andric //
3e6d15924SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e6d15924SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5e6d15924SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61a82d4c0SDimitry Andric //
71a82d4c0SDimitry Andric //===----------------------------------------------------------------------===//
81a82d4c0SDimitry Andric 
91a82d4c0SDimitry Andric #include "DebugLocStream.h"
101a82d4c0SDimitry Andric #include "DwarfDebug.h"
111a82d4c0SDimitry Andric #include "llvm/CodeGen/AsmPrinter.h"
121a82d4c0SDimitry Andric 
131a82d4c0SDimitry Andric using namespace llvm;
141a82d4c0SDimitry Andric 
finalizeList(AsmPrinter & Asm)151a82d4c0SDimitry Andric bool DebugLocStream::finalizeList(AsmPrinter &Asm) {
161a82d4c0SDimitry Andric   if (Lists.back().EntryOffset == Entries.size()) {
171a82d4c0SDimitry Andric     // Empty list.  Delete it.
181a82d4c0SDimitry Andric     Lists.pop_back();
191a82d4c0SDimitry Andric     return false;
201a82d4c0SDimitry Andric   }
211a82d4c0SDimitry Andric 
221a82d4c0SDimitry Andric   // Real list.  Generate a label for it.
231a82d4c0SDimitry Andric   Lists.back().Label = Asm.createTempSymbol("debug_loc");
241a82d4c0SDimitry Andric   return true;
251a82d4c0SDimitry Andric }
261a82d4c0SDimitry Andric 
finalizeEntry()271a82d4c0SDimitry Andric void DebugLocStream::finalizeEntry() {
281a82d4c0SDimitry Andric   if (Entries.back().ByteOffset != DWARFBytes.size())
291a82d4c0SDimitry Andric     return;
301a82d4c0SDimitry Andric 
311a82d4c0SDimitry Andric   // The last entry was empty.  Delete it.
321a82d4c0SDimitry Andric   Comments.erase(Comments.begin() + Entries.back().CommentOffset,
331a82d4c0SDimitry Andric                  Comments.end());
341a82d4c0SDimitry Andric   Entries.pop_back();
351a82d4c0SDimitry Andric 
361a82d4c0SDimitry Andric   assert(Lists.back().EntryOffset <= Entries.size() &&
371a82d4c0SDimitry Andric          "Popped off more entries than are in the list");
381a82d4c0SDimitry Andric }
391a82d4c0SDimitry Andric 
~ListBuilder()401a82d4c0SDimitry Andric DebugLocStream::ListBuilder::~ListBuilder() {
411a82d4c0SDimitry Andric   if (!Locs.finalizeList(Asm))
421a82d4c0SDimitry Andric     return;
43b1c73532SDimitry Andric   V.emplace<Loc::Multi>(ListIndex, TagOffset);
441a82d4c0SDimitry Andric }
45