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 Smithbool 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 Smithvoid 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 SmithDebugLocStream::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