1 //===--- lib/CodeGen/DIE.h - DWARF Info Entries -----------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Data structures for DWARF info entries.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DIE_H
15 #define LLVM_LIB_CODEGEN_ASMPRINTER_DIE_H
17 #include "llvm/ADT/FoldingSet.h"
18 #include "llvm/ADT/PointerIntPair.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/CodeGen/DwarfStringPoolEntry.h"
22 #include "llvm/Support/Dwarf.h"
32 // AsmStreamerBase - A base abstract interface class defines methods that
33 // can be implemented to stream objects or can be implemented to
34 // calculate the size of the streamed objects.
35 // The derived classes will use an AsmPrinter to implement the methods.
37 // TODO: complete this interface and use it to merge EmitValue and SizeOf
38 // methods in the DIE classes below.
39 class AsmStreamerBase {
42 AsmStreamerBase(const AsmPrinter *AP) : AP(AP) {}
45 virtual ~AsmStreamerBase() {}
46 virtual unsigned emitULEB128(uint64_t Value, const char *Desc = nullptr,
47 unsigned PadTo = 0) = 0;
48 virtual unsigned emitInt8(unsigned char Value) = 0;
49 virtual unsigned emitBytes(StringRef Data) = 0;
52 /// EmittingAsmStreamer - Implements AbstractAsmStreamer to stream objects.
53 /// Notice that the return value is not the actual size of the streamed object.
54 /// For size calculation use SizeReporterAsmStreamer.
55 class EmittingAsmStreamer : public AsmStreamerBase {
57 EmittingAsmStreamer(const AsmPrinter *AP) : AsmStreamerBase(AP) {}
58 unsigned emitULEB128(uint64_t Value, const char *Desc = nullptr,
59 unsigned PadTo = 0) override;
60 unsigned emitInt8(unsigned char Value) override;
61 unsigned emitBytes(StringRef Data) override;
64 /// SizeReporterAsmStreamer - Only reports the size of the streamed objects.
65 class SizeReporterAsmStreamer : public AsmStreamerBase {
67 SizeReporterAsmStreamer(const AsmPrinter *AP) : AsmStreamerBase(AP) {}
68 unsigned emitULEB128(uint64_t Value, const char *Desc = nullptr,
69 unsigned PadTo = 0) override;
70 unsigned emitInt8(unsigned char Value) override;
71 unsigned emitBytes(StringRef Data) override;
74 //===--------------------------------------------------------------------===//
75 /// DIEAbbrevData - Dwarf abbreviation data, describes one attribute of a
76 /// Dwarf abbreviation.
78 /// Attribute - Dwarf attribute code.
80 dwarf::Attribute Attribute;
82 /// Form - Dwarf form code.
87 DIEAbbrevData(dwarf::Attribute A, dwarf::Form F) : Attribute(A), Form(F) {}
90 dwarf::Attribute getAttribute() const { return Attribute; }
91 dwarf::Form getForm() const { return Form; }
93 /// Profile - Used to gather unique data for the abbreviation folding set.
95 void Profile(FoldingSetNodeID &ID) const;
98 //===--------------------------------------------------------------------===//
99 /// DIEAbbrev - Dwarf abbreviation, describes the organization of a debug
100 /// information object.
101 class DIEAbbrev : public FoldingSetNode {
102 /// Unique number for node.
106 /// Tag - Dwarf tag code.
110 /// Children - Whether or not this node has children.
112 // This cheats a bit in all of the uses since the values in the standard
113 // are 0 and 1 for no children and children respectively.
116 /// Data - Raw data bytes for abbreviation.
118 SmallVector<DIEAbbrevData, 12> Data;
121 DIEAbbrev(dwarf::Tag T, bool C) : Tag(T), Children(C), Data() {}
124 dwarf::Tag getTag() const { return Tag; }
125 unsigned getNumber() const { return Number; }
126 bool hasChildren() const { return Children; }
127 const SmallVectorImpl<DIEAbbrevData> &getData() const { return Data; }
128 void setChildrenFlag(bool hasChild) { Children = hasChild; }
129 void setNumber(unsigned N) { Number = N; }
131 /// AddAttribute - Adds another set of attribute information to the
133 void AddAttribute(dwarf::Attribute Attribute, dwarf::Form Form) {
134 Data.push_back(DIEAbbrevData(Attribute, Form));
137 /// Profile - Used to gather unique data for the abbreviation folding set.
139 void Profile(FoldingSetNodeID &ID) const;
141 /// Emit - Print the abbreviation using the specified asm printer.
143 void Emit(const AsmPrinter *AP) const;
145 void print(raw_ostream &O);
149 //===--------------------------------------------------------------------===//
150 /// DIEInteger - An integer value DIE.
156 explicit DIEInteger(uint64_t I) : Integer(I) {}
158 /// BestForm - Choose the best form for integer.
160 static dwarf::Form BestForm(bool IsSigned, uint64_t Int) {
162 const int64_t SignedInt = Int;
163 if ((char)Int == SignedInt)
164 return dwarf::DW_FORM_data1;
165 if ((short)Int == SignedInt)
166 return dwarf::DW_FORM_data2;
167 if ((int)Int == SignedInt)
168 return dwarf::DW_FORM_data4;
170 if ((unsigned char)Int == Int)
171 return dwarf::DW_FORM_data1;
172 if ((unsigned short)Int == Int)
173 return dwarf::DW_FORM_data2;
174 if ((unsigned int)Int == Int)
175 return dwarf::DW_FORM_data4;
177 return dwarf::DW_FORM_data8;
180 uint64_t getValue() const { return Integer; }
181 void setValue(uint64_t Val) { Integer = Val; }
183 void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
184 unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
186 void print(raw_ostream &O) const;
189 //===--------------------------------------------------------------------===//
190 /// DIEExpr - An expression DIE.
196 explicit DIEExpr(const MCExpr *E) : Expr(E) {}
198 /// getValue - Get MCExpr.
200 const MCExpr *getValue() const { return Expr; }
202 void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
203 unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
205 void print(raw_ostream &O) const;
208 //===--------------------------------------------------------------------===//
209 /// DIELabel - A label DIE.
212 const MCSymbol *Label;
215 explicit DIELabel(const MCSymbol *L) : Label(L) {}
217 /// getValue - Get MCSymbol.
219 const MCSymbol *getValue() const { return Label; }
221 void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
222 unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
224 void print(raw_ostream &O) const;
227 //===--------------------------------------------------------------------===//
228 /// DIEDelta - A simple label difference DIE.
231 const MCSymbol *LabelHi;
232 const MCSymbol *LabelLo;
235 DIEDelta(const MCSymbol *Hi, const MCSymbol *Lo) : LabelHi(Hi), LabelLo(Lo) {}
237 void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
238 unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
240 void print(raw_ostream &O) const;
243 //===--------------------------------------------------------------------===//
244 /// DIEString - A container for string values.
247 DwarfStringPoolEntryRef S;
250 DIEString(DwarfStringPoolEntryRef S) : S(S) {}
252 /// getString - Grab the string out of the object.
253 StringRef getString() const { return S.getString(); }
255 void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
256 unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
258 void print(raw_ostream &O) const;
261 //===--------------------------------------------------------------------===//
262 /// DIEEntry - A pointer to another debug information entry. An instance of
263 /// this class can also be used as a proxy for a debug information entry not
264 /// yet defined (ie. types.)
272 explicit DIEEntry(DIE &E) : Entry(&E) {}
274 DIE &getEntry() const { return *Entry; }
276 /// Returns size of a ref_addr entry.
277 static unsigned getRefAddrSize(const AsmPrinter *AP);
279 void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
280 unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
281 return Form == dwarf::DW_FORM_ref_addr ? getRefAddrSize(AP)
285 void print(raw_ostream &O) const;
288 //===--------------------------------------------------------------------===//
289 /// \brief A signature reference to a type unit.
290 class DIETypeSignature {
291 const DwarfTypeUnit *Unit;
293 DIETypeSignature() = delete;
296 explicit DIETypeSignature(const DwarfTypeUnit &Unit) : Unit(&Unit) {}
298 void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
299 unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
300 assert(Form == dwarf::DW_FORM_ref_sig8);
304 void print(raw_ostream &O) const;
307 //===--------------------------------------------------------------------===//
308 /// DIELocList - Represents a pointer to a location list in the debug_loc
312 // Index into the .debug_loc vector.
316 DIELocList(size_t I) : Index(I) {}
318 /// getValue - Grab the current index out.
319 size_t getValue() const { return Index; }
321 void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
322 unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
324 void print(raw_ostream &O) const;
327 //===--------------------------------------------------------------------===//
328 /// DIEValue - A debug information entry value. Some of these roughly correlate
329 /// to DWARF attribute classes.
337 #define HANDLE_DIEVALUE(T) is##T,
338 #include "llvm/CodeGen/DIEValue.def"
342 /// Ty - Type of data stored in the value.
345 dwarf::Attribute Attribute = (dwarf::Attribute)0;
346 dwarf::Form Form = (dwarf::Form)0;
348 /// Storage for the value.
350 /// All values that aren't standard layout (or are larger than 8 bytes)
351 /// should be stored by reference instead of by value.
352 typedef AlignedCharArrayUnion<DIEInteger, DIEString, DIEExpr, DIELabel,
353 DIEDelta *, DIEEntry, DIETypeSignature,
354 DIEBlock *, DIELoc *, DIELocList> ValTy;
355 static_assert(sizeof(ValTy) <= sizeof(uint64_t) ||
356 sizeof(ValTy) <= sizeof(void *),
357 "Expected all large types to be stored via pointer");
359 /// Underlying stored value.
362 template <class T> void construct(T V) {
363 static_assert(std::is_standard_layout<T>::value ||
364 std::is_pointer<T>::value,
365 "Expected standard layout or pointer");
366 new (reinterpret_cast<void *>(Val.buffer)) T(V);
369 template <class T> T *get() { return reinterpret_cast<T *>(Val.buffer); }
370 template <class T> const T *get() const {
371 return reinterpret_cast<const T *>(Val.buffer);
373 template <class T> void destruct() { get<T>()->~T(); }
375 /// Destroy the underlying value.
377 /// This should get optimized down to a no-op. We could skip it if we could
378 /// add a static assert on \a std::is_trivially_copyable(), but we currently
379 /// support versions of GCC that don't understand that.
384 #define HANDLE_DIEVALUE_SMALL(T) \
388 #define HANDLE_DIEVALUE_LARGE(T) \
390 destruct<const DIE##T *>();
392 #include "llvm/CodeGen/DIEValue.def"
396 /// Copy the underlying value.
398 /// This should get optimized down to a simple copy. We need to actually
399 /// construct the value, rather than calling memcpy, to satisfy strict
401 void copyVal(const DIEValue &X) {
405 #define HANDLE_DIEVALUE_SMALL(T) \
407 construct<DIE##T>(*X.get<DIE##T>()); \
409 #define HANDLE_DIEVALUE_LARGE(T) \
411 construct<const DIE##T *>(*X.get<const DIE##T *>()); \
413 #include "llvm/CodeGen/DIEValue.def"
418 DIEValue() = default;
419 DIEValue(const DIEValue &X) : Ty(X.Ty), Attribute(X.Attribute), Form(X.Form) {
422 DIEValue &operator=(const DIEValue &X) {
425 Attribute = X.Attribute;
430 ~DIEValue() { destroyVal(); }
432 #define HANDLE_DIEVALUE_SMALL(T) \
433 DIEValue(dwarf::Attribute Attribute, dwarf::Form Form, const DIE##T &V) \
434 : Ty(is##T), Attribute(Attribute), Form(Form) { \
435 construct<DIE##T>(V); \
437 #define HANDLE_DIEVALUE_LARGE(T) \
438 DIEValue(dwarf::Attribute Attribute, dwarf::Form Form, const DIE##T *V) \
439 : Ty(is##T), Attribute(Attribute), Form(Form) { \
440 assert(V && "Expected valid value"); \
441 construct<const DIE##T *>(V); \
443 #include "llvm/CodeGen/DIEValue.def"
446 Type getType() const { return Ty; }
447 dwarf::Attribute getAttribute() const { return Attribute; }
448 dwarf::Form getForm() const { return Form; }
449 explicit operator bool() const { return Ty; }
451 #define HANDLE_DIEVALUE_SMALL(T) \
452 const DIE##T &getDIE##T() const { \
453 assert(getType() == is##T && "Expected " #T); \
454 return *get<DIE##T>(); \
456 #define HANDLE_DIEVALUE_LARGE(T) \
457 const DIE##T &getDIE##T() const { \
458 assert(getType() == is##T && "Expected " #T); \
459 return **get<const DIE##T *>(); \
461 #include "llvm/CodeGen/DIEValue.def"
463 /// EmitValue - Emit value via the Dwarf writer.
465 void EmitValue(const AsmPrinter *AP) const;
467 /// SizeOf - Return the size of a value in bytes.
469 unsigned SizeOf(const AsmPrinter *AP) const;
471 void print(raw_ostream &O) const;
475 struct IntrusiveBackListNode {
476 PointerIntPair<IntrusiveBackListNode *, 1> Next;
477 IntrusiveBackListNode() : Next(this, true) {}
479 IntrusiveBackListNode *getNext() const {
480 return Next.getInt() ? nullptr : Next.getPointer();
484 struct IntrusiveBackListBase {
485 typedef IntrusiveBackListNode Node;
486 Node *Last = nullptr;
488 bool empty() const { return !Last; }
489 void push_back(Node &N) {
490 assert(N.Next.getPointer() == &N && "Expected unlinked node");
491 assert(N.Next.getInt() == true && "Expected unlinked node");
495 Last->Next.setPointerAndInt(&N, false);
501 template <class T> class IntrusiveBackList : IntrusiveBackListBase {
503 using IntrusiveBackListBase::empty;
504 void push_back(T &N) { IntrusiveBackListBase::push_back(N); }
505 T &back() { return *static_cast<T *>(Last); }
506 const T &back() const { return *static_cast<T *>(Last); }
508 class const_iterator;
510 : public iterator_facade_base<iterator, std::forward_iterator_tag, T> {
511 friend class const_iterator;
515 iterator() = default;
516 explicit iterator(T *N) : N(N) {}
518 iterator &operator++() {
523 explicit operator bool() const { return N; }
524 T &operator*() const { return *static_cast<T *>(N); }
526 bool operator==(const iterator &X) const { return N == X.N; }
527 bool operator!=(const iterator &X) const { return N != X.N; }
531 : public iterator_facade_base<const_iterator, std::forward_iterator_tag,
533 const Node *N = nullptr;
536 const_iterator() = default;
537 // Placate MSVC by explicitly scoping 'iterator'.
538 const_iterator(typename IntrusiveBackList<T>::iterator X) : N(X.N) {}
539 explicit const_iterator(const T *N) : N(N) {}
541 const_iterator &operator++() {
546 explicit operator bool() const { return N; }
547 const T &operator*() const { return *static_cast<const T *>(N); }
549 bool operator==(const const_iterator &X) const { return N == X.N; }
550 bool operator!=(const const_iterator &X) const { return N != X.N; }
554 return Last ? iterator(static_cast<T *>(Last->Next.getPointer())) : end();
556 const_iterator begin() const {
557 return const_cast<IntrusiveBackList *>(this)->begin();
559 iterator end() { return iterator(); }
560 const_iterator end() const { return const_iterator(); }
562 static iterator toIterator(T &N) { return iterator(&N); }
563 static const_iterator toIterator(const T &N) { return const_iterator(&N); }
566 /// A list of DIE values.
568 /// This is a singly-linked list, but instead of reversing the order of
569 /// insertion, we keep a pointer to the back of the list so we can push in
572 /// There are two main reasons to choose a linked list over a customized
573 /// vector-like data structure.
575 /// 1. For teardown efficiency, we want DIEs to be BumpPtrAllocated. Using a
576 /// linked list here makes this way easier to accomplish.
577 /// 2. Carrying an extra pointer per \a DIEValue isn't expensive. 45% of DIEs
578 /// have 2 or fewer values, and 90% have 5 or fewer. A vector would be
579 /// over-allocated by 50% on average anyway, the same cost as the
580 /// linked-list node.
582 struct Node : IntrusiveBackListNode {
584 explicit Node(DIEValue V) : V(V) {}
587 typedef IntrusiveBackList<Node> ListTy;
591 class const_value_iterator;
593 : public iterator_adaptor_base<value_iterator, ListTy::iterator,
594 std::forward_iterator_tag, DIEValue> {
595 friend class const_value_iterator;
596 typedef iterator_adaptor_base<value_iterator, ListTy::iterator,
597 std::forward_iterator_tag,
598 DIEValue> iterator_adaptor;
601 value_iterator() = default;
602 explicit value_iterator(ListTy::iterator X) : iterator_adaptor(X) {}
604 explicit operator bool() const { return bool(wrapped()); }
605 DIEValue &operator*() const { return wrapped()->V; }
608 class const_value_iterator : public iterator_adaptor_base<
609 const_value_iterator, ListTy::const_iterator,
610 std::forward_iterator_tag, const DIEValue> {
611 typedef iterator_adaptor_base<const_value_iterator, ListTy::const_iterator,
612 std::forward_iterator_tag,
613 const DIEValue> iterator_adaptor;
616 const_value_iterator() = default;
617 const_value_iterator(DIEValueList::value_iterator X)
618 : iterator_adaptor(X.wrapped()) {}
619 explicit const_value_iterator(ListTy::const_iterator X)
620 : iterator_adaptor(X) {}
622 explicit operator bool() const { return bool(wrapped()); }
623 const DIEValue &operator*() const { return wrapped()->V; }
626 typedef iterator_range<value_iterator> value_range;
627 typedef iterator_range<const_value_iterator> const_value_range;
629 value_iterator addValue(BumpPtrAllocator &Alloc, DIEValue V) {
630 List.push_back(*new (Alloc) Node(V));
631 return value_iterator(ListTy::toIterator(List.back()));
634 value_iterator addValue(BumpPtrAllocator &Alloc, dwarf::Attribute Attribute,
635 dwarf::Form Form, T &&Value) {
636 return addValue(Alloc, DIEValue(Attribute, Form, std::forward<T>(Value)));
639 value_range values() {
640 return llvm::make_range(value_iterator(List.begin()),
641 value_iterator(List.end()));
643 const_value_range values() const {
644 return llvm::make_range(const_value_iterator(List.begin()),
645 const_value_iterator(List.end()));
649 //===--------------------------------------------------------------------===//
650 /// DIE - A structured debug information entry. Has an abbreviation which
651 /// describes its organization.
652 class DIE : IntrusiveBackListNode, public DIEValueList {
653 friend class IntrusiveBackList<DIE>;
655 /// Offset - Offset in debug info section.
659 /// Size - Size of instance + children.
663 unsigned AbbrevNumber = ~0u;
665 /// Tag - Dwarf tag code.
667 dwarf::Tag Tag = (dwarf::Tag)0;
670 IntrusiveBackList<DIE> Children;
672 DIE *Parent = nullptr;
675 explicit DIE(dwarf::Tag Tag) : Offset(0), Size(0), Tag(Tag) {}
678 static DIE *get(BumpPtrAllocator &Alloc, dwarf::Tag Tag) {
679 return new (Alloc) DIE(Tag);
683 unsigned getAbbrevNumber() const { return AbbrevNumber; }
684 dwarf::Tag getTag() const { return Tag; }
685 unsigned getOffset() const { return Offset; }
686 unsigned getSize() const { return Size; }
687 bool hasChildren() const { return !Children.empty(); }
689 typedef IntrusiveBackList<DIE>::iterator child_iterator;
690 typedef IntrusiveBackList<DIE>::const_iterator const_child_iterator;
691 typedef iterator_range<child_iterator> child_range;
692 typedef iterator_range<const_child_iterator> const_child_range;
694 child_range children() {
695 return llvm::make_range(Children.begin(), Children.end());
697 const_child_range children() const {
698 return llvm::make_range(Children.begin(), Children.end());
701 DIE *getParent() const { return Parent; }
703 /// Generate the abbreviation for this DIE.
705 /// Calculate the abbreviation for this, which should be uniqued and
706 /// eventually used to call \a setAbbrevNumber().
707 DIEAbbrev generateAbbrev() const;
709 /// Set the abbreviation number for this DIE.
710 void setAbbrevNumber(unsigned I) { AbbrevNumber = I; }
712 /// Climb up the parent chain to get the compile or type unit DIE this DIE
714 const DIE *getUnit() const;
715 /// Similar to getUnit, returns null when DIE is not added to an
717 const DIE *getUnitOrNull() const;
718 void setOffset(unsigned O) { Offset = O; }
719 void setSize(unsigned S) { Size = S; }
721 /// Add a child to the DIE.
722 DIE &addChild(DIE *Child) {
723 assert(!Child->getParent() && "Child should be orphaned");
724 Child->Parent = this;
725 Children.push_back(*Child);
726 return Children.back();
729 /// Find a value in the DIE with the attribute given.
731 /// Returns a default-constructed DIEValue (where \a DIEValue::getType()
732 /// gives \a DIEValue::isNone) if no such attribute exists.
733 DIEValue findAttribute(dwarf::Attribute Attribute) const;
735 void print(raw_ostream &O, unsigned IndentCount = 0) const;
739 //===--------------------------------------------------------------------===//
740 /// DIELoc - Represents an expression location.
742 class DIELoc : public DIEValueList {
743 mutable unsigned Size; // Size in bytes excluding size header.
746 DIELoc() : Size(0) {}
748 /// ComputeSize - Calculate the size of the location expression.
750 unsigned ComputeSize(const AsmPrinter *AP) const;
752 /// BestForm - Choose the best form for data.
754 dwarf::Form BestForm(unsigned DwarfVersion) const {
755 if (DwarfVersion > 3)
756 return dwarf::DW_FORM_exprloc;
757 // Pre-DWARF4 location expressions were blocks and not exprloc.
758 if ((unsigned char)Size == Size)
759 return dwarf::DW_FORM_block1;
760 if ((unsigned short)Size == Size)
761 return dwarf::DW_FORM_block2;
762 if ((unsigned int)Size == Size)
763 return dwarf::DW_FORM_block4;
764 return dwarf::DW_FORM_block;
767 void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
768 unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
770 void print(raw_ostream &O) const;
773 //===--------------------------------------------------------------------===//
774 /// DIEBlock - Represents a block of values.
776 class DIEBlock : public DIEValueList {
777 mutable unsigned Size; // Size in bytes excluding size header.
780 DIEBlock() : Size(0) {}
782 /// ComputeSize - Calculate the size of the location expression.
784 unsigned ComputeSize(const AsmPrinter *AP) const;
786 /// BestForm - Choose the best form for data.
788 dwarf::Form BestForm() const {
789 if ((unsigned char)Size == Size)
790 return dwarf::DW_FORM_block1;
791 if ((unsigned short)Size == Size)
792 return dwarf::DW_FORM_block2;
793 if ((unsigned int)Size == Size)
794 return dwarf::DW_FORM_block4;
795 return dwarf::DW_FORM_block;
798 void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
799 unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
801 void print(raw_ostream &O) const;
804 } // end llvm namespace