1*0b57cec5SDimitry Andric //===- DebugLocStream.cpp - DWARF debug_loc stream --------------*- C++ -*-===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric 
9*0b57cec5SDimitry Andric #include "DebugLocStream.h"
10*0b57cec5SDimitry Andric #include "DwarfDebug.h"
11*0b57cec5SDimitry Andric #include "llvm/CodeGen/AsmPrinter.h"
12*0b57cec5SDimitry Andric 
13*0b57cec5SDimitry Andric using namespace llvm;
14*0b57cec5SDimitry Andric 
finalizeList(AsmPrinter & Asm)15*0b57cec5SDimitry Andric bool DebugLocStream::finalizeList(AsmPrinter &Asm) {
16*0b57cec5SDimitry Andric   if (Lists.back().EntryOffset == Entries.size()) {
17*0b57cec5SDimitry Andric     // Empty list.  Delete it.
18*0b57cec5SDimitry Andric     Lists.pop_back();
19*0b57cec5SDimitry Andric     return false;
20*0b57cec5SDimitry Andric   }
21*0b57cec5SDimitry Andric 
22*0b57cec5SDimitry Andric   // Real list.  Generate a label for it.
23*0b57cec5SDimitry Andric   Lists.back().Label = Asm.createTempSymbol("debug_loc");
24*0b57cec5SDimitry Andric   return true;
25*0b57cec5SDimitry Andric }
26*0b57cec5SDimitry Andric 
finalizeEntry()27*0b57cec5SDimitry Andric void DebugLocStream::finalizeEntry() {
28*0b57cec5SDimitry Andric   if (Entries.back().ByteOffset != DWARFBytes.size())
29*0b57cec5SDimitry Andric     return;
30*0b57cec5SDimitry Andric 
31*0b57cec5SDimitry Andric   // The last entry was empty.  Delete it.
32*0b57cec5SDimitry Andric   Comments.erase(Comments.begin() + Entries.back().CommentOffset,
33*0b57cec5SDimitry Andric                  Comments.end());
34*0b57cec5SDimitry Andric   Entries.pop_back();
35*0b57cec5SDimitry Andric 
36*0b57cec5SDimitry Andric   assert(Lists.back().EntryOffset <= Entries.size() &&
37*0b57cec5SDimitry Andric          "Popped off more entries than are in the list");
38*0b57cec5SDimitry Andric }
39*0b57cec5SDimitry Andric 
~ListBuilder()40*0b57cec5SDimitry Andric DebugLocStream::ListBuilder::~ListBuilder() {
41*0b57cec5SDimitry Andric   if (!Locs.finalizeList(Asm))
42*0b57cec5SDimitry Andric     return;
43*0b57cec5SDimitry Andric   V.initializeDbgValue(&MI);
44*0b57cec5SDimitry Andric   V.setDebugLocListIndex(ListIndex);
45*0b57cec5SDimitry Andric   if (TagOffset)
46     V.setDebugLocListTagOffset(*TagOffset);
47 }
48