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 Andricbool 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 Andricvoid 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 AndricDebugLocStream::ListBuilder::~ListBuilder() { 410b57cec5SDimitry Andric if (!Locs.finalizeList(Asm)) 420b57cec5SDimitry Andric return; 43*5f757f3fSDimitry Andric V.emplace<Loc::Multi>(ListIndex, TagOffset); 440b57cec5SDimitry Andric } 45