xref: /freebsd-src/contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/DebugLocStream.cpp (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
10b57cec5SDimitry Andric //===- DebugLocStream.cpp - DWARF debug_loc stream --------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "DebugLocStream.h"
100b57cec5SDimitry Andric #include "DwarfDebug.h"
110b57cec5SDimitry Andric #include "llvm/CodeGen/AsmPrinter.h"
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric using namespace llvm;
140b57cec5SDimitry Andric 
finalizeList(AsmPrinter & Asm)150b57cec5SDimitry Andric bool DebugLocStream::finalizeList(AsmPrinter &Asm) {
160b57cec5SDimitry Andric   if (Lists.back().EntryOffset == Entries.size()) {
170b57cec5SDimitry Andric     // Empty list.  Delete it.
180b57cec5SDimitry Andric     Lists.pop_back();
190b57cec5SDimitry Andric     return false;
200b57cec5SDimitry Andric   }
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric   // Real list.  Generate a label for it.
230b57cec5SDimitry Andric   Lists.back().Label = Asm.createTempSymbol("debug_loc");
240b57cec5SDimitry Andric   return true;
250b57cec5SDimitry Andric }
260b57cec5SDimitry Andric 
finalizeEntry()270b57cec5SDimitry Andric void DebugLocStream::finalizeEntry() {
280b57cec5SDimitry Andric   if (Entries.back().ByteOffset != DWARFBytes.size())
290b57cec5SDimitry Andric     return;
300b57cec5SDimitry Andric 
310b57cec5SDimitry Andric   // The last entry was empty.  Delete it.
320b57cec5SDimitry Andric   Comments.erase(Comments.begin() + Entries.back().CommentOffset,
330b57cec5SDimitry Andric                  Comments.end());
340b57cec5SDimitry Andric   Entries.pop_back();
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric   assert(Lists.back().EntryOffset <= Entries.size() &&
370b57cec5SDimitry Andric          "Popped off more entries than are in the list");
380b57cec5SDimitry Andric }
390b57cec5SDimitry Andric 
~ListBuilder()400b57cec5SDimitry Andric DebugLocStream::ListBuilder::~ListBuilder() {
410b57cec5SDimitry Andric   if (!Locs.finalizeList(Asm))
420b57cec5SDimitry Andric     return;
43*5f757f3fSDimitry Andric   V.emplace<Loc::Multi>(ListIndex, TagOffset);
440b57cec5SDimitry Andric }
45