1*3a73d9e0SDuncan P. N. Exon Smith //===- DebugLocStream.cpp - DWARF debug_loc stream --------------*- C++ -*-===// 2*3a73d9e0SDuncan P. N. Exon Smith // 3*3a73d9e0SDuncan P. N. Exon Smith // The LLVM Compiler Infrastructure 4*3a73d9e0SDuncan P. N. Exon Smith // 5*3a73d9e0SDuncan P. N. Exon Smith // This file is distributed under the University of Illinois Open Source 6*3a73d9e0SDuncan P. N. Exon Smith // License. See LICENSE.TXT for details. 7*3a73d9e0SDuncan P. N. Exon Smith // 8*3a73d9e0SDuncan P. N. Exon Smith //===----------------------------------------------------------------------===// 9*3a73d9e0SDuncan P. N. Exon Smith 10*3a73d9e0SDuncan P. N. Exon Smith #include "DebugLocStream.h" 11*3a73d9e0SDuncan P. N. Exon Smith #include "DwarfDebug.h" 12*3a73d9e0SDuncan P. N. Exon Smith #include "llvm/CodeGen/AsmPrinter.h" 13*3a73d9e0SDuncan P. N. Exon Smith 14*3a73d9e0SDuncan P. N. Exon Smith using namespace llvm; 15*3a73d9e0SDuncan P. N. Exon Smith 16*3a73d9e0SDuncan P. N. Exon Smith bool DebugLocStream::finalizeList(AsmPrinter &Asm) { 17*3a73d9e0SDuncan P. N. Exon Smith if (Lists.back().EntryOffset == Entries.size()) { 18*3a73d9e0SDuncan P. N. Exon Smith // Empty list. Delete it. 19*3a73d9e0SDuncan P. N. Exon Smith Lists.pop_back(); 20*3a73d9e0SDuncan P. N. Exon Smith return false; 21*3a73d9e0SDuncan P. N. Exon Smith } 22*3a73d9e0SDuncan P. N. Exon Smith 23*3a73d9e0SDuncan P. N. Exon Smith // Real list. Generate a label for it. 24*3a73d9e0SDuncan P. N. Exon Smith Lists.back().Label = Asm.createTempSymbol("debug_loc"); 25*3a73d9e0SDuncan P. N. Exon Smith return true; 26*3a73d9e0SDuncan P. N. Exon Smith } 27*3a73d9e0SDuncan P. N. Exon Smith 28*3a73d9e0SDuncan P. N. Exon Smith void DebugLocStream::finalizeEntry() { 29*3a73d9e0SDuncan P. N. Exon Smith if (Entries.back().ByteOffset != DWARFBytes.size()) 30*3a73d9e0SDuncan P. N. Exon Smith return; 31*3a73d9e0SDuncan P. N. Exon Smith 32*3a73d9e0SDuncan P. N. Exon Smith // The last entry was empty. Delete it. 33*3a73d9e0SDuncan P. N. Exon Smith Comments.erase(Comments.begin() + Entries.back().CommentOffset, 34*3a73d9e0SDuncan P. N. Exon Smith Comments.end()); 35*3a73d9e0SDuncan P. N. Exon Smith Entries.pop_back(); 36*3a73d9e0SDuncan P. N. Exon Smith 37*3a73d9e0SDuncan P. N. Exon Smith assert(Lists.back().EntryOffset <= Entries.size() && 38*3a73d9e0SDuncan P. N. Exon Smith "Popped off more entries than are in the list"); 39*3a73d9e0SDuncan P. N. Exon Smith } 40*3a73d9e0SDuncan P. N. Exon Smith 41*3a73d9e0SDuncan P. N. Exon Smith DebugLocStream::ListBuilder::~ListBuilder() { 42*3a73d9e0SDuncan P. N. Exon Smith if (!Locs.finalizeList(Asm)) 43*3a73d9e0SDuncan P. N. Exon Smith return; 44*3a73d9e0SDuncan P. N. Exon Smith V.initializeDbgValue(&MI); 45*3a73d9e0SDuncan P. N. Exon Smith V.setDebugLocListIndex(ListIndex); 46*3a73d9e0SDuncan P. N. Exon Smith } 47