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