LLVM API Documentation

DIE.cpp
Go to the documentation of this file.
00001 //===--- lib/CodeGen/DIE.cpp - DWARF Info Entries -------------------------===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // Data structures for DWARF info entries.
00011 //
00012 //===----------------------------------------------------------------------===//
00013 
00014 #include "DIE.h"
00015 #include "DwarfDebug.h"
00016 #include "DwarfUnit.h"
00017 #include "llvm/ADT/Twine.h"
00018 #include "llvm/CodeGen/AsmPrinter.h"
00019 #include "llvm/IR/DataLayout.h"
00020 #include "llvm/MC/MCAsmInfo.h"
00021 #include "llvm/MC/MCStreamer.h"
00022 #include "llvm/MC/MCSymbol.h"
00023 #include "llvm/Support/Debug.h"
00024 #include "llvm/Support/ErrorHandling.h"
00025 #include "llvm/Support/Format.h"
00026 #include "llvm/Support/FormattedStream.h"
00027 #include "llvm/Support/LEB128.h"
00028 #include "llvm/Support/MD5.h"
00029 using namespace llvm;
00030 
00031 //===----------------------------------------------------------------------===//
00032 // DIEAbbrevData Implementation
00033 //===----------------------------------------------------------------------===//
00034 
00035 /// Profile - Used to gather unique data for the abbreviation folding set.
00036 ///
00037 void DIEAbbrevData::Profile(FoldingSetNodeID &ID) const {
00038   // Explicitly cast to an integer type for which FoldingSetNodeID has
00039   // overloads.  Otherwise MSVC 2010 thinks this call is ambiguous.
00040   ID.AddInteger(unsigned(Attribute));
00041   ID.AddInteger(unsigned(Form));
00042 }
00043 
00044 //===----------------------------------------------------------------------===//
00045 // DIEAbbrev Implementation
00046 //===----------------------------------------------------------------------===//
00047 
00048 /// Profile - Used to gather unique data for the abbreviation folding set.
00049 ///
00050 void DIEAbbrev::Profile(FoldingSetNodeID &ID) const {
00051   ID.AddInteger(unsigned(Tag));
00052   ID.AddInteger(unsigned(Children));
00053 
00054   // For each attribute description.
00055   for (unsigned i = 0, N = Data.size(); i < N; ++i)
00056     Data[i].Profile(ID);
00057 }
00058 
00059 /// Emit - Print the abbreviation using the specified asm printer.
00060 ///
00061 void DIEAbbrev::Emit(AsmPrinter *AP) const {
00062   // Emit its Dwarf tag type.
00063   AP->EmitULEB128(Tag, dwarf::TagString(Tag));
00064 
00065   // Emit whether it has children DIEs.
00066   AP->EmitULEB128((unsigned)Children, dwarf::ChildrenString(Children));
00067 
00068   // For each attribute description.
00069   for (unsigned i = 0, N = Data.size(); i < N; ++i) {
00070     const DIEAbbrevData &AttrData = Data[i];
00071 
00072     // Emit attribute type.
00073     AP->EmitULEB128(AttrData.getAttribute(),
00074                     dwarf::AttributeString(AttrData.getAttribute()));
00075 
00076     // Emit form type.
00077     AP->EmitULEB128(AttrData.getForm(),
00078                     dwarf::FormEncodingString(AttrData.getForm()));
00079   }
00080 
00081   // Mark end of abbreviation.
00082   AP->EmitULEB128(0, "EOM(1)");
00083   AP->EmitULEB128(0, "EOM(2)");
00084 }
00085 
00086 #ifndef NDEBUG
00087 void DIEAbbrev::print(raw_ostream &O) {
00088   O << "Abbreviation @"
00089     << format("0x%lx", (long)(intptr_t)this)
00090     << "  "
00091     << dwarf::TagString(Tag)
00092     << " "
00093     << dwarf::ChildrenString(Children)
00094     << '\n';
00095 
00096   for (unsigned i = 0, N = Data.size(); i < N; ++i) {
00097     O << "  "
00098       << dwarf::AttributeString(Data[i].getAttribute())
00099       << "  "
00100       << dwarf::FormEncodingString(Data[i].getForm())
00101       << '\n';
00102   }
00103 }
00104 void DIEAbbrev::dump() { print(dbgs()); }
00105 #endif
00106 
00107 /// Climb up the parent chain to get the unit DIE to which this DIE
00108 /// belongs.
00109 const DIE *DIE::getUnit() const {
00110   const DIE *Cu = getUnitOrNull();
00111   assert(Cu && "We should not have orphaned DIEs.");
00112   return Cu;
00113 }
00114 
00115 /// Climb up the parent chain to get the unit DIE this DIE belongs
00116 /// to. Return NULL if DIE is not added to an owner yet.
00117 const DIE *DIE::getUnitOrNull() const {
00118   const DIE *p = this;
00119   while (p) {
00120     if (p->getTag() == dwarf::DW_TAG_compile_unit ||
00121         p->getTag() == dwarf::DW_TAG_type_unit)
00122       return p;
00123     p = p->getParent();
00124   }
00125   return nullptr;
00126 }
00127 
00128 DIEValue *DIE::findAttribute(dwarf::Attribute Attribute) const {
00129   const SmallVectorImpl<DIEValue *> &Values = getValues();
00130   const DIEAbbrev &Abbrevs = getAbbrev();
00131 
00132   // Iterate through all the attributes until we find the one we're
00133   // looking for, if we can't find it return NULL.
00134   for (size_t i = 0; i < Values.size(); ++i)
00135     if (Abbrevs.getData()[i].getAttribute() == Attribute)
00136       return Values[i];
00137   return nullptr;
00138 }
00139 
00140 #ifndef NDEBUG
00141 void DIE::print(raw_ostream &O, unsigned IndentCount) const {
00142   const std::string Indent(IndentCount, ' ');
00143   bool isBlock = Abbrev.getTag() == 0;
00144 
00145   if (!isBlock) {
00146     O << Indent
00147       << "Die: "
00148       << format("0x%lx", (long)(intptr_t)this)
00149       << ", Offset: " << Offset
00150       << ", Size: " << Size << "\n";
00151 
00152     O << Indent
00153       << dwarf::TagString(Abbrev.getTag())
00154       << " "
00155       << dwarf::ChildrenString(Abbrev.hasChildren()) << "\n";
00156   } else {
00157     O << "Size: " << Size << "\n";
00158   }
00159 
00160   const SmallVectorImpl<DIEAbbrevData> &Data = Abbrev.getData();
00161 
00162   IndentCount += 2;
00163   for (unsigned i = 0, N = Data.size(); i < N; ++i) {
00164     O << Indent;
00165 
00166     if (!isBlock)
00167       O << dwarf::AttributeString(Data[i].getAttribute());
00168     else
00169       O << "Blk[" << i << "]";
00170 
00171     O <<  "  "
00172       << dwarf::FormEncodingString(Data[i].getForm())
00173       << " ";
00174     Values[i]->print(O);
00175     O << "\n";
00176   }
00177   IndentCount -= 2;
00178 
00179   for (unsigned j = 0, M = Children.size(); j < M; ++j) {
00180     Children[j]->print(O, IndentCount+4);
00181   }
00182 
00183   if (!isBlock) O << "\n";
00184 }
00185 
00186 void DIE::dump() {
00187   print(dbgs());
00188 }
00189 #endif
00190 
00191 void DIEValue::anchor() { }
00192 
00193 #ifndef NDEBUG
00194 void DIEValue::dump() const {
00195   print(dbgs());
00196 }
00197 #endif
00198 
00199 //===----------------------------------------------------------------------===//
00200 // DIEInteger Implementation
00201 //===----------------------------------------------------------------------===//
00202 
00203 /// EmitValue - Emit integer of appropriate size.
00204 ///
00205 void DIEInteger::EmitValue(AsmPrinter *Asm, dwarf::Form Form) const {
00206   unsigned Size = ~0U;
00207   switch (Form) {
00208   case dwarf::DW_FORM_flag_present:
00209     // Emit something to keep the lines and comments in sync.
00210     // FIXME: Is there a better way to do this?
00211     Asm->OutStreamer.AddBlankLine();
00212     return;
00213   case dwarf::DW_FORM_flag:  // Fall thru
00214   case dwarf::DW_FORM_ref1:  // Fall thru
00215   case dwarf::DW_FORM_data1: Size = 1; break;
00216   case dwarf::DW_FORM_ref2:  // Fall thru
00217   case dwarf::DW_FORM_data2: Size = 2; break;
00218   case dwarf::DW_FORM_sec_offset: // Fall thru
00219   case dwarf::DW_FORM_ref4:  // Fall thru
00220   case dwarf::DW_FORM_data4: Size = 4; break;
00221   case dwarf::DW_FORM_ref8:  // Fall thru
00222   case dwarf::DW_FORM_ref_sig8:  // Fall thru
00223   case dwarf::DW_FORM_data8: Size = 8; break;
00224   case dwarf::DW_FORM_GNU_str_index: Asm->EmitULEB128(Integer); return;
00225   case dwarf::DW_FORM_GNU_addr_index: Asm->EmitULEB128(Integer); return;
00226   case dwarf::DW_FORM_udata: Asm->EmitULEB128(Integer); return;
00227   case dwarf::DW_FORM_sdata: Asm->EmitSLEB128(Integer); return;
00228   case dwarf::DW_FORM_addr:
00229     Size = Asm->getDataLayout().getPointerSize(); break;
00230   default: llvm_unreachable("DIE Value form not supported yet");
00231   }
00232   Asm->OutStreamer.EmitIntValue(Integer, Size);
00233 }
00234 
00235 /// SizeOf - Determine size of integer value in bytes.
00236 ///
00237 unsigned DIEInteger::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
00238   switch (Form) {
00239   case dwarf::DW_FORM_flag_present: return 0;
00240   case dwarf::DW_FORM_flag:  // Fall thru
00241   case dwarf::DW_FORM_ref1:  // Fall thru
00242   case dwarf::DW_FORM_data1: return sizeof(int8_t);
00243   case dwarf::DW_FORM_ref2:  // Fall thru
00244   case dwarf::DW_FORM_data2: return sizeof(int16_t);
00245   case dwarf::DW_FORM_sec_offset: // Fall thru
00246   case dwarf::DW_FORM_ref4:  // Fall thru
00247   case dwarf::DW_FORM_data4: return sizeof(int32_t);
00248   case dwarf::DW_FORM_ref8:  // Fall thru
00249   case dwarf::DW_FORM_ref_sig8:  // Fall thru
00250   case dwarf::DW_FORM_data8: return sizeof(int64_t);
00251   case dwarf::DW_FORM_GNU_str_index: return getULEB128Size(Integer);
00252   case dwarf::DW_FORM_GNU_addr_index: return getULEB128Size(Integer);
00253   case dwarf::DW_FORM_udata: return getULEB128Size(Integer);
00254   case dwarf::DW_FORM_sdata: return getSLEB128Size(Integer);
00255   case dwarf::DW_FORM_addr:  return AP->getDataLayout().getPointerSize();
00256   default: llvm_unreachable("DIE Value form not supported yet");
00257   }
00258 }
00259 
00260 #ifndef NDEBUG
00261 void DIEInteger::print(raw_ostream &O) const {
00262   O << "Int: " << (int64_t)Integer << "  0x";
00263   O.write_hex(Integer);
00264 }
00265 #endif
00266 
00267 //===----------------------------------------------------------------------===//
00268 // DIEExpr Implementation
00269 //===----------------------------------------------------------------------===//
00270 
00271 /// EmitValue - Emit expression value.
00272 ///
00273 void DIEExpr::EmitValue(AsmPrinter *AP, dwarf::Form Form) const {
00274   AP->OutStreamer.EmitValue(Expr, SizeOf(AP, Form));
00275 }
00276 
00277 /// SizeOf - Determine size of expression value in bytes.
00278 ///
00279 unsigned DIEExpr::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
00280   if (Form == dwarf::DW_FORM_data4) return 4;
00281   if (Form == dwarf::DW_FORM_sec_offset) return 4;
00282   if (Form == dwarf::DW_FORM_strp) return 4;
00283   return AP->getDataLayout().getPointerSize();
00284 }
00285 
00286 #ifndef NDEBUG
00287 void DIEExpr::print(raw_ostream &O) const {
00288   O << "Expr: ";
00289   Expr->print(O);
00290 }
00291 #endif
00292 
00293 //===----------------------------------------------------------------------===//
00294 // DIELabel Implementation
00295 //===----------------------------------------------------------------------===//
00296 
00297 /// EmitValue - Emit label value.
00298 ///
00299 void DIELabel::EmitValue(AsmPrinter *AP, dwarf::Form Form) const {
00300   AP->EmitLabelReference(Label, SizeOf(AP, Form),
00301                          Form == dwarf::DW_FORM_strp ||
00302                              Form == dwarf::DW_FORM_sec_offset ||
00303                              Form == dwarf::DW_FORM_ref_addr);
00304 }
00305 
00306 /// SizeOf - Determine size of label value in bytes.
00307 ///
00308 unsigned DIELabel::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
00309   if (Form == dwarf::DW_FORM_data4) return 4;
00310   if (Form == dwarf::DW_FORM_sec_offset) return 4;
00311   if (Form == dwarf::DW_FORM_strp) return 4;
00312   return AP->getDataLayout().getPointerSize();
00313 }
00314 
00315 #ifndef NDEBUG
00316 void DIELabel::print(raw_ostream &O) const {
00317   O << "Lbl: " << Label->getName();
00318 }
00319 #endif
00320 
00321 //===----------------------------------------------------------------------===//
00322 // DIEDelta Implementation
00323 //===----------------------------------------------------------------------===//
00324 
00325 /// EmitValue - Emit delta value.
00326 ///
00327 void DIEDelta::EmitValue(AsmPrinter *AP, dwarf::Form Form) const {
00328   AP->EmitLabelDifference(LabelHi, LabelLo, SizeOf(AP, Form));
00329 }
00330 
00331 /// SizeOf - Determine size of delta value in bytes.
00332 ///
00333 unsigned DIEDelta::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
00334   if (Form == dwarf::DW_FORM_data4) return 4;
00335   if (Form == dwarf::DW_FORM_sec_offset) return 4;
00336   if (Form == dwarf::DW_FORM_strp) return 4;
00337   return AP->getDataLayout().getPointerSize();
00338 }
00339 
00340 #ifndef NDEBUG
00341 void DIEDelta::print(raw_ostream &O) const {
00342   O << "Del: " << LabelHi->getName() << "-" << LabelLo->getName();
00343 }
00344 #endif
00345 
00346 //===----------------------------------------------------------------------===//
00347 // DIEString Implementation
00348 //===----------------------------------------------------------------------===//
00349 
00350 /// EmitValue - Emit string value.
00351 ///
00352 void DIEString::EmitValue(AsmPrinter *AP, dwarf::Form Form) const {
00353   Access->EmitValue(AP, Form);
00354 }
00355 
00356 /// SizeOf - Determine size of delta value in bytes.
00357 ///
00358 unsigned DIEString::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
00359   return Access->SizeOf(AP, Form);
00360 }
00361 
00362 #ifndef NDEBUG
00363 void DIEString::print(raw_ostream &O) const {
00364   O << "String: " << Str << "\tSymbol: ";
00365   Access->print(O);
00366 }
00367 #endif
00368 
00369 //===----------------------------------------------------------------------===//
00370 // DIEEntry Implementation
00371 //===----------------------------------------------------------------------===//
00372 
00373 /// EmitValue - Emit debug information entry offset.
00374 ///
00375 void DIEEntry::EmitValue(AsmPrinter *AP, dwarf::Form Form) const {
00376 
00377   if (Form == dwarf::DW_FORM_ref_addr) {
00378     const DwarfDebug *DD = AP->getDwarfDebug();
00379     unsigned Addr = Entry.getOffset();
00380     assert(!DD->useSplitDwarf() && "TODO: dwo files can't have relocations.");
00381     // For DW_FORM_ref_addr, output the offset from beginning of debug info
00382     // section. Entry->getOffset() returns the offset from start of the
00383     // compile unit.
00384     DwarfCompileUnit *CU = DD->lookupUnit(Entry.getUnit());
00385     assert(CU && "CUDie should belong to a CU.");
00386     Addr += CU->getDebugInfoOffset();
00387     if (AP->MAI->doesDwarfUseRelocationsAcrossSections())
00388       AP->EmitLabelPlusOffset(CU->getSectionSym(), Addr,
00389                               DIEEntry::getRefAddrSize(AP));
00390     else
00391       AP->EmitLabelOffsetDifference(CU->getSectionSym(), Addr,
00392                                     CU->getSectionSym(),
00393                                     DIEEntry::getRefAddrSize(AP));
00394   } else
00395     AP->EmitInt32(Entry.getOffset());
00396 }
00397 
00398 unsigned DIEEntry::getRefAddrSize(AsmPrinter *AP) {
00399   // DWARF4: References that use the attribute form DW_FORM_ref_addr are
00400   // specified to be four bytes in the DWARF 32-bit format and eight bytes
00401   // in the DWARF 64-bit format, while DWARF Version 2 specifies that such
00402   // references have the same size as an address on the target system.
00403   const DwarfDebug *DD = AP->getDwarfDebug();
00404   assert(DD && "Expected Dwarf Debug info to be available");
00405   if (DD->getDwarfVersion() == 2)
00406     return AP->getDataLayout().getPointerSize();
00407   return sizeof(int32_t);
00408 }
00409 
00410 #ifndef NDEBUG
00411 void DIEEntry::print(raw_ostream &O) const {
00412   O << format("Die: 0x%lx", (long)(intptr_t)&Entry);
00413 }
00414 #endif
00415 
00416 //===----------------------------------------------------------------------===//
00417 // DIETypeSignature Implementation
00418 //===----------------------------------------------------------------------===//
00419 void DIETypeSignature::EmitValue(AsmPrinter *Asm, dwarf::Form Form) const {
00420   assert(Form == dwarf::DW_FORM_ref_sig8);
00421   Asm->OutStreamer.EmitIntValue(Unit.getTypeSignature(), 8);
00422 }
00423 
00424 #ifndef NDEBUG
00425 void DIETypeSignature::print(raw_ostream &O) const {
00426   O << format("Type Unit: 0x%lx", Unit.getTypeSignature());
00427 }
00428 
00429 void DIETypeSignature::dump() const { print(dbgs()); }
00430 #endif
00431 
00432 //===----------------------------------------------------------------------===//
00433 // DIELoc Implementation
00434 //===----------------------------------------------------------------------===//
00435 
00436 /// ComputeSize - calculate the size of the location expression.
00437 ///
00438 unsigned DIELoc::ComputeSize(AsmPrinter *AP) const {
00439   if (!Size) {
00440     const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
00441     for (unsigned i = 0, N = Values.size(); i < N; ++i)
00442       Size += Values[i]->SizeOf(AP, AbbrevData[i].getForm());
00443   }
00444 
00445   return Size;
00446 }
00447 
00448 /// EmitValue - Emit location data.
00449 ///
00450 void DIELoc::EmitValue(AsmPrinter *Asm, dwarf::Form Form) const {
00451   switch (Form) {
00452   default: llvm_unreachable("Improper form for block");
00453   case dwarf::DW_FORM_block1: Asm->EmitInt8(Size);    break;
00454   case dwarf::DW_FORM_block2: Asm->EmitInt16(Size);   break;
00455   case dwarf::DW_FORM_block4: Asm->EmitInt32(Size);   break;
00456   case dwarf::DW_FORM_block:
00457   case dwarf::DW_FORM_exprloc:
00458     Asm->EmitULEB128(Size); break;
00459   }
00460 
00461   const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
00462   for (unsigned i = 0, N = Values.size(); i < N; ++i)
00463     Values[i]->EmitValue(Asm, AbbrevData[i].getForm());
00464 }
00465 
00466 /// SizeOf - Determine size of location data in bytes.
00467 ///
00468 unsigned DIELoc::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
00469   switch (Form) {
00470   case dwarf::DW_FORM_block1: return Size + sizeof(int8_t);
00471   case dwarf::DW_FORM_block2: return Size + sizeof(int16_t);
00472   case dwarf::DW_FORM_block4: return Size + sizeof(int32_t);
00473   case dwarf::DW_FORM_block:
00474   case dwarf::DW_FORM_exprloc:
00475     return Size + getULEB128Size(Size);
00476   default: llvm_unreachable("Improper form for block");
00477   }
00478 }
00479 
00480 #ifndef NDEBUG
00481 void DIELoc::print(raw_ostream &O) const {
00482   O << "ExprLoc: ";
00483   DIE::print(O, 5);
00484 }
00485 #endif
00486 
00487 //===----------------------------------------------------------------------===//
00488 // DIEBlock Implementation
00489 //===----------------------------------------------------------------------===//
00490 
00491 /// ComputeSize - calculate the size of the block.
00492 ///
00493 unsigned DIEBlock::ComputeSize(AsmPrinter *AP) const {
00494   if (!Size) {
00495     const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
00496     for (unsigned i = 0, N = Values.size(); i < N; ++i)
00497       Size += Values[i]->SizeOf(AP, AbbrevData[i].getForm());
00498   }
00499 
00500   return Size;
00501 }
00502 
00503 /// EmitValue - Emit block data.
00504 ///
00505 void DIEBlock::EmitValue(AsmPrinter *Asm, dwarf::Form Form) const {
00506   switch (Form) {
00507   default: llvm_unreachable("Improper form for block");
00508   case dwarf::DW_FORM_block1: Asm->EmitInt8(Size);    break;
00509   case dwarf::DW_FORM_block2: Asm->EmitInt16(Size);   break;
00510   case dwarf::DW_FORM_block4: Asm->EmitInt32(Size);   break;
00511   case dwarf::DW_FORM_block:  Asm->EmitULEB128(Size); break;
00512   }
00513 
00514   const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
00515   for (unsigned i = 0, N = Values.size(); i < N; ++i)
00516     Values[i]->EmitValue(Asm, AbbrevData[i].getForm());
00517 }
00518 
00519 /// SizeOf - Determine size of block data in bytes.
00520 ///
00521 unsigned DIEBlock::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
00522   switch (Form) {
00523   case dwarf::DW_FORM_block1: return Size + sizeof(int8_t);
00524   case dwarf::DW_FORM_block2: return Size + sizeof(int16_t);
00525   case dwarf::DW_FORM_block4: return Size + sizeof(int32_t);
00526   case dwarf::DW_FORM_block:  return Size + getULEB128Size(Size);
00527   default: llvm_unreachable("Improper form for block");
00528   }
00529 }
00530 
00531 #ifndef NDEBUG
00532 void DIEBlock::print(raw_ostream &O) const {
00533   O << "Blk: ";
00534   DIE::print(O, 5);
00535 }
00536 #endif
00537 
00538 //===----------------------------------------------------------------------===//
00539 // DIELocList Implementation
00540 //===----------------------------------------------------------------------===//
00541 
00542 unsigned DIELocList::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
00543   if (Form == dwarf::DW_FORM_data4)
00544     return 4;
00545   if (Form == dwarf::DW_FORM_sec_offset)
00546     return 4;
00547   return AP->getDataLayout().getPointerSize();
00548 }
00549 
00550 /// EmitValue - Emit label value.
00551 ///
00552 void DIELocList::EmitValue(AsmPrinter *AP, dwarf::Form Form) const {
00553   DwarfDebug *DD = AP->getDwarfDebug();
00554   MCSymbol *Label = DD->getDebugLocEntries()[Index].Label;
00555 
00556   if (AP->MAI->doesDwarfUseRelocationsAcrossSections() && !DD->useSplitDwarf())
00557     AP->EmitSectionOffset(Label, DD->getDebugLocSym());
00558   else
00559     AP->EmitLabelDifference(Label, DD->getDebugLocSym(), 4);
00560 }
00561 
00562 #ifndef NDEBUG
00563 void DIELocList::print(raw_ostream &O) const {
00564   O << "LocList: " << Index;
00565 
00566 }
00567 #endif