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