1 //===--- llvm/Analysis/DebugInfo.h - Debug Information Helpers --*- 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 // This file defines a bunch of datatypes that are useful for creating and
11 // walking debug info in LLVM IR form. They essentially provide wrappers around
12 // the information in the global variables that's needed when constructing the
15 //===----------------------------------------------------------------------===//
17 #ifndef LLVM_ANALYSIS_DEBUGINFO_H
18 #define LLVM_ANALYSIS_DEBUGINFO_H
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/ADT/SmallPtrSet.h"
22 #include "llvm/ADT/StringRef.h"
23 #include "llvm/Support/Dwarf.h"
35 struct DebugLocTracker;
40 /// DIDescriptor - A thin wraper around MDNode to access encoded debug info.
41 /// This should not be stored in a container, because underly MDNode may
42 /// change in certain situations.
47 /// DIDescriptor constructor. If the specified node is non-null, check
48 /// to make sure that the tag in the descriptor matches 'RequiredTag'. If
49 /// not, the debug info is corrupt and we ignore it.
50 DIDescriptor(MDNode *N, unsigned RequiredTag);
52 StringRef getStringField(unsigned Elt) const;
53 unsigned getUnsignedField(unsigned Elt) const {
54 return (unsigned)getUInt64Field(Elt);
56 uint64_t getUInt64Field(unsigned Elt) const;
57 DIDescriptor getDescriptorField(unsigned Elt) const;
59 template <typename DescTy>
60 DescTy getFieldAs(unsigned Elt) const {
61 return DescTy(getDescriptorField(Elt).getNode());
64 GlobalVariable *getGlobalVariableField(unsigned Elt) const;
67 explicit DIDescriptor() : DbgNode(0) {}
68 explicit DIDescriptor(MDNode *N) : DbgNode(N) {}
70 bool isNull() const { return DbgNode == 0; }
72 MDNode *getNode() const { return DbgNode; }
74 unsigned getVersion() const {
75 return getUnsignedField(0) & LLVMDebugVersionMask;
78 unsigned getTag() const {
79 return getUnsignedField(0) & ~LLVMDebugVersionMask;
82 /// ValidDebugInfo - Return true if N represents valid debug info value.
83 static bool ValidDebugInfo(MDNode *N, unsigned OptLevel);
85 /// dump - print descriptor.
88 bool isDerivedType() const;
89 bool isCompositeType() const;
90 bool isBasicType() const;
91 bool isVariable() const;
92 bool isSubprogram() const;
93 bool isGlobalVariable() const;
95 bool isCompileUnit() const;
96 bool isNameSpace() const;
97 bool isLexicalBlock() const;
98 bool isSubrange() const;
99 bool isEnumerator() const;
101 bool isGlobal() const;
104 /// DISubrange - This is used to represent ranges, for array bounds.
105 class DISubrange : public DIDescriptor {
107 explicit DISubrange(MDNode *N = 0)
108 : DIDescriptor(N, dwarf::DW_TAG_subrange_type) {}
110 int64_t getLo() const { return (int64_t)getUInt64Field(1); }
111 int64_t getHi() const { return (int64_t)getUInt64Field(2); }
114 /// DIArray - This descriptor holds an array of descriptors.
115 class DIArray : public DIDescriptor {
117 explicit DIArray(MDNode *N = 0)
120 unsigned getNumElements() const;
121 DIDescriptor getElement(unsigned Idx) const {
122 return getDescriptorField(Idx);
126 /// DIScope - A base class for various scopes.
127 class DIScope : public DIDescriptor {
129 explicit DIScope(MDNode *N = 0) : DIDescriptor (N) {
130 if (DbgNode && !isScope())
133 virtual ~DIScope() {}
135 StringRef getFilename() const;
136 StringRef getDirectory() const;
139 /// DICompileUnit - A wrapper for a compile unit.
140 class DICompileUnit : public DIScope {
142 explicit DICompileUnit(MDNode *N = 0) : DIScope(N) {
143 if (DbgNode && !isCompileUnit())
147 unsigned getLanguage() const { return getUnsignedField(2); }
148 StringRef getFilename() const { return getStringField(3); }
149 StringRef getDirectory() const { return getStringField(4); }
150 StringRef getProducer() const { return getStringField(5); }
152 /// isMain - Each input file is encoded as a separate compile unit in LLVM
153 /// debugging information output. However, many target specific tool chains
154 /// prefer to encode only one compile unit in an object file. In this
155 /// situation, the LLVM code generator will include debugging information
156 /// entities in the compile unit that is marked as main compile unit. The
157 /// code generator accepts maximum one main compile unit per module. If a
158 /// module does not contain any main compile unit then the code generator
159 /// will emit multiple compile units in the output object file.
161 bool isMain() const { return getUnsignedField(6); }
162 bool isOptimized() const { return getUnsignedField(7); }
163 StringRef getFlags() const { return getStringField(8); }
164 unsigned getRunTimeVersion() const { return getUnsignedField(9); }
166 /// Verify - Verify that a compile unit is well formed.
169 /// dump - print compile unit.
173 /// DIEnumerator - A wrapper for an enumerator (e.g. X and Y in 'enum {X,Y}').
174 /// FIXME: it seems strange that this doesn't have either a reference to the
175 /// type/precision or a file/line pair for location info.
176 class DIEnumerator : public DIDescriptor {
178 explicit DIEnumerator(MDNode *N = 0)
179 : DIDescriptor(N, dwarf::DW_TAG_enumerator) {}
181 StringRef getName() const { return getStringField(1); }
182 uint64_t getEnumValue() const { return getUInt64Field(2); }
185 /// DIType - This is a wrapper for a type.
186 /// FIXME: Types should be factored much better so that CV qualifiers and
187 /// others do not require a huge and empty descriptor full of zeros.
188 class DIType : public DIDescriptor {
191 FlagPrivate = 1 << 0,
192 FlagProtected = 1 << 1,
193 FlagFwdDecl = 1 << 2,
194 FlagAppleBlock = 1 << 3,
195 FlagBlockByrefStruct = 1 << 4,
196 FlagVirtual = 1 << 5,
197 FlagArtificial = 1 << 6 // To identify artificial arguments in
198 // a subroutine type. e.g. "this" in c++.
202 DIType(MDNode *N, unsigned Tag)
203 : DIDescriptor(N, Tag) {}
204 // This ctor is used when the Tag has already been validated by a derived
206 DIType(MDNode *N, bool, bool) : DIDescriptor(N) {}
210 /// Verify - Verify that a type descriptor is well formed.
213 explicit DIType(MDNode *N);
217 DIDescriptor getContext() const { return getDescriptorField(1); }
218 StringRef getName() const { return getStringField(2); }
219 DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(3); }
220 unsigned getLineNumber() const { return getUnsignedField(4); }
221 uint64_t getSizeInBits() const { return getUInt64Field(5); }
222 uint64_t getAlignInBits() const { return getUInt64Field(6); }
223 // FIXME: Offset is only used for DW_TAG_member nodes. Making every type
224 // carry this is just plain insane.
225 uint64_t getOffsetInBits() const { return getUInt64Field(7); }
226 unsigned getFlags() const { return getUnsignedField(8); }
227 bool isPrivate() const {
228 return (getFlags() & FlagPrivate) != 0;
230 bool isProtected() const {
231 return (getFlags() & FlagProtected) != 0;
233 bool isForwardDecl() const {
234 return (getFlags() & FlagFwdDecl) != 0;
236 // isAppleBlock - Return true if this is the Apple Blocks extension.
237 bool isAppleBlockExtension() const {
238 return (getFlags() & FlagAppleBlock) != 0;
240 bool isBlockByrefStruct() const {
241 return (getFlags() & FlagBlockByrefStruct) != 0;
243 bool isVirtual() const {
244 return (getFlags() & FlagVirtual) != 0;
246 bool isArtificial() const {
247 return (getFlags() & FlagArtificial) != 0;
250 /// dump - print type.
254 /// DIBasicType - A basic type, like 'int' or 'float'.
255 class DIBasicType : public DIType {
257 explicit DIBasicType(MDNode *N = 0)
258 : DIType(N, dwarf::DW_TAG_base_type) {}
260 unsigned getEncoding() const { return getUnsignedField(9); }
262 /// dump - print basic type.
266 /// DIDerivedType - A simple derived type, like a const qualified type,
267 /// a typedef, a pointer or reference, etc.
268 class DIDerivedType : public DIType {
270 explicit DIDerivedType(MDNode *N, bool, bool)
271 : DIType(N, true, true) {}
273 explicit DIDerivedType(MDNode *N = 0)
274 : DIType(N, true, true) {
275 if (DbgNode && !isDerivedType())
279 DIType getTypeDerivedFrom() const { return getFieldAs<DIType>(9); }
281 /// getOriginalTypeSize - If this type is derived from a base type then
282 /// return base type size.
283 uint64_t getOriginalTypeSize() const;
284 /// dump - print derived type.
287 /// replaceAllUsesWith - Replace all uses of debug info referenced by
288 /// this descriptor. After this completes, the current debug info value
290 void replaceAllUsesWith(DIDescriptor &D);
293 /// DICompositeType - This descriptor holds a type that can refer to multiple
294 /// other types, like a function or struct.
295 /// FIXME: Why is this a DIDerivedType??
296 class DICompositeType : public DIDerivedType {
298 explicit DICompositeType(MDNode *N = 0)
299 : DIDerivedType(N, true, true) {
300 if (N && !isCompositeType())
304 DIArray getTypeArray() const { return getFieldAs<DIArray>(10); }
305 unsigned getRunTimeLang() const { return getUnsignedField(11); }
306 DICompositeType getContainingType() const {
307 return getFieldAs<DICompositeType>(12);
310 /// Verify - Verify that a composite type descriptor is well formed.
313 /// dump - print composite type.
317 /// DIGlobal - This is a common class for global variables and subprograms.
318 class DIGlobal : public DIDescriptor {
320 explicit DIGlobal(MDNode *N, unsigned RequiredTag)
321 : DIDescriptor(N, RequiredTag) {}
324 virtual ~DIGlobal() {}
326 DIDescriptor getContext() const { return getDescriptorField(2); }
327 StringRef getName() const { return getStringField(3); }
328 StringRef getDisplayName() const { return getStringField(4); }
329 StringRef getLinkageName() const { return getStringField(5); }
330 DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(6); }
331 unsigned getLineNumber() const { return getUnsignedField(7); }
332 DIType getType() const { return getFieldAs<DIType>(8); }
334 /// isLocalToUnit - Return true if this subprogram is local to the current
335 /// compile unit, like 'static' in C.
336 unsigned isLocalToUnit() const { return getUnsignedField(9); }
337 unsigned isDefinition() const { return getUnsignedField(10); }
339 /// dump - print global.
343 /// DISubprogram - This is a wrapper for a subprogram (e.g. a function).
344 class DISubprogram : public DIScope {
346 explicit DISubprogram(MDNode *N = 0) : DIScope(N) {
347 if (DbgNode && !isSubprogram())
351 DIDescriptor getContext() const { return getDescriptorField(2); }
352 StringRef getName() const { return getStringField(3); }
353 StringRef getDisplayName() const { return getStringField(4); }
354 StringRef getLinkageName() const { return getStringField(5); }
355 DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(6); }
356 unsigned getLineNumber() const { return getUnsignedField(7); }
357 DICompositeType getType() const { return getFieldAs<DICompositeType>(8); }
359 /// getReturnTypeName - Subprogram return types are encoded either as
360 /// DIType or as DICompositeType.
361 StringRef getReturnTypeName() const {
362 DICompositeType DCT(getFieldAs<DICompositeType>(8));
364 DIArray A = DCT.getTypeArray();
365 DIType T(A.getElement(0).getNode());
368 DIType T(getFieldAs<DIType>(8));
372 /// isLocalToUnit - Return true if this subprogram is local to the current
373 /// compile unit, like 'static' in C.
374 unsigned isLocalToUnit() const { return getUnsignedField(9); }
375 unsigned isDefinition() const { return getUnsignedField(10); }
377 unsigned getVirtuality() const { return getUnsignedField(11); }
378 unsigned getVirtualIndex() const { return getUnsignedField(12); }
380 DICompositeType getContainingType() const {
381 return getFieldAs<DICompositeType>(13);
383 unsigned isArtificial() const { return getUnsignedField(14); }
385 StringRef getFilename() const { return getCompileUnit().getFilename();}
386 StringRef getDirectory() const { return getCompileUnit().getDirectory();}
388 /// Verify - Verify that a subprogram descriptor is well formed.
391 /// dump - print subprogram.
394 /// describes - Return true if this subprogram provides debugging
395 /// information for the function F.
396 bool describes(const Function *F);
399 /// DIGlobalVariable - This is a wrapper for a global variable.
400 class DIGlobalVariable : public DIGlobal {
402 explicit DIGlobalVariable(MDNode *N = 0)
403 : DIGlobal(N, dwarf::DW_TAG_variable) {}
405 GlobalVariable *getGlobal() const { return getGlobalVariableField(11); }
407 /// Verify - Verify that a global variable descriptor is well formed.
410 /// dump - print global variable.
414 /// DIVariable - This is a wrapper for a variable (e.g. parameter, local,
416 class DIVariable : public DIDescriptor {
418 explicit DIVariable(MDNode *N = 0)
420 if (DbgNode && !isVariable())
424 DIDescriptor getContext() const { return getDescriptorField(1); }
425 StringRef getName() const { return getStringField(2); }
426 DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(3); }
427 unsigned getLineNumber() const { return getUnsignedField(4); }
428 DIType getType() const { return getFieldAs<DIType>(5); }
431 /// Verify - Verify that a variable descriptor is well formed.
434 /// HasComplexAddr - Return true if the variable has a complex address.
435 bool hasComplexAddress() const {
436 return getNumAddrElements() > 0;
439 unsigned getNumAddrElements() const;
441 uint64_t getAddrElement(unsigned Idx) const {
442 return getUInt64Field(Idx+6);
445 /// isBlockByrefVariable - Return true if the variable was declared as
446 /// a "__block" variable (Apple Blocks).
447 bool isBlockByrefVariable() const {
448 return getType().isBlockByrefStruct();
451 /// dump - print variable.
455 /// DILexicalBlock - This is a wrapper for a lexical block.
456 class DILexicalBlock : public DIScope {
458 explicit DILexicalBlock(MDNode *N = 0) : DIScope(N) {
459 if (DbgNode && !isLexicalBlock())
462 DIScope getContext() const { return getFieldAs<DIScope>(1); }
463 StringRef getDirectory() const { return getContext().getDirectory(); }
464 StringRef getFilename() const { return getContext().getFilename(); }
465 unsigned getLineNumber() const { return getUnsignedField(2); }
466 unsigned getColumnNumber() const { return getUnsignedField(3); }
469 /// DINameSpace - A wrapper for a C++ style name space.
470 class DINameSpace : public DIScope {
472 explicit DINameSpace(MDNode *N = 0) : DIScope(N) {
473 if (DbgNode && !isNameSpace())
477 DIScope getContext() const { return getFieldAs<DIScope>(1); }
478 StringRef getName() const { return getStringField(2); }
479 StringRef getDirectory() const { return getContext().getDirectory(); }
480 StringRef getFilename() const { return getContext().getFilename(); }
481 DICompileUnit getCompileUnit() const { return getFieldAs<DICompileUnit>(3);}
482 unsigned getLineNumber() const { return getUnsignedField(4); }
485 /// DILocation - This object holds location information. This object
486 /// is not associated with any DWARF tag.
487 class DILocation : public DIDescriptor {
489 explicit DILocation(MDNode *N) : DIDescriptor(N) { }
491 unsigned getLineNumber() const { return getUnsignedField(0); }
492 unsigned getColumnNumber() const { return getUnsignedField(1); }
493 DIScope getScope() const { return getFieldAs<DIScope>(2); }
494 DILocation getOrigLocation() const { return getFieldAs<DILocation>(3); }
495 StringRef getFilename() const { return getScope().getFilename(); }
496 StringRef getDirectory() const { return getScope().getDirectory(); }
499 /// DIFactory - This object assists with the construction of the various
503 LLVMContext& VMContext;
505 Function *DeclareFn; // llvm.dbg.declare
506 Function *ValueFn; // llvm.dbg.value
508 DIFactory(const DIFactory &); // DO NOT IMPLEMENT
509 void operator=(const DIFactory&); // DO NOT IMPLEMENT
511 enum ComplexAddrKind { OpPlus=1, OpDeref };
513 explicit DIFactory(Module &m);
515 /// GetOrCreateArray - Create an descriptor for an array of descriptors.
516 /// This implicitly uniques the arrays created.
517 DIArray GetOrCreateArray(DIDescriptor *Tys, unsigned NumTys);
519 /// GetOrCreateSubrange - Create a descriptor for a value range. This
520 /// implicitly uniques the values returned.
521 DISubrange GetOrCreateSubrange(int64_t Lo, int64_t Hi);
523 /// CreateCompileUnit - Create a new descriptor for the specified compile
525 DICompileUnit CreateCompileUnit(unsigned LangID,
530 bool isOptimized = false,
531 StringRef Flags = "",
532 unsigned RunTimeVer = 0);
534 /// CreateEnumerator - Create a single enumerator value.
535 DIEnumerator CreateEnumerator(StringRef Name, uint64_t Val);
537 /// CreateBasicType - Create a basic type like int, float, etc.
538 DIBasicType CreateBasicType(DIDescriptor Context, StringRef Name,
539 DICompileUnit CompileUnit, unsigned LineNumber,
540 uint64_t SizeInBits, uint64_t AlignInBits,
541 uint64_t OffsetInBits, unsigned Flags,
544 /// CreateBasicType - Create a basic type like int, float, etc.
545 DIBasicType CreateBasicTypeEx(DIDescriptor Context, StringRef Name,
546 DICompileUnit CompileUnit, unsigned LineNumber,
547 Constant *SizeInBits, Constant *AlignInBits,
548 Constant *OffsetInBits, unsigned Flags,
551 /// CreateDerivedType - Create a derived type like const qualified type,
552 /// pointer, typedef, etc.
553 DIDerivedType CreateDerivedType(unsigned Tag, DIDescriptor Context,
555 DICompileUnit CompileUnit,
557 uint64_t SizeInBits, uint64_t AlignInBits,
558 uint64_t OffsetInBits, unsigned Flags,
561 /// CreateDerivedType - Create a derived type like const qualified type,
562 /// pointer, typedef, etc.
563 DIDerivedType CreateDerivedTypeEx(unsigned Tag, DIDescriptor Context,
565 DICompileUnit CompileUnit,
567 Constant *SizeInBits, Constant *AlignInBits,
568 Constant *OffsetInBits, unsigned Flags,
571 /// CreateCompositeType - Create a composite type like array, struct, etc.
572 DICompositeType CreateCompositeType(unsigned Tag, DIDescriptor Context,
574 DICompileUnit CompileUnit,
577 uint64_t AlignInBits,
578 uint64_t OffsetInBits, unsigned Flags,
581 unsigned RunTimeLang = 0,
582 MDNode *ContainingType = 0);
584 /// CreateArtificialType - Create a new DIType with "artificial" flag set.
585 DIType CreateArtificialType(DIType Ty);
587 /// CreateCompositeType - Create a composite type like array, struct, etc.
588 DICompositeType CreateCompositeTypeEx(unsigned Tag, DIDescriptor Context,
590 DICompileUnit CompileUnit,
592 Constant *SizeInBits,
593 Constant *AlignInBits,
594 Constant *OffsetInBits, unsigned Flags,
597 unsigned RunTimeLang = 0);
599 /// CreateSubprogram - Create a new descriptor for the specified subprogram.
600 /// See comments in DISubprogram for descriptions of these fields.
601 DISubprogram CreateSubprogram(DIDescriptor Context, StringRef Name,
602 StringRef DisplayName,
603 StringRef LinkageName,
604 DICompileUnit CompileUnit, unsigned LineNo,
605 DIType Ty, bool isLocalToUnit,
610 bool isArtificial = 0);
612 /// CreateSubprogramDefinition - Create new subprogram descriptor for the
613 /// given declaration.
614 DISubprogram CreateSubprogramDefinition(DISubprogram &SPDeclaration);
616 /// CreateGlobalVariable - Create a new descriptor for the specified global.
618 CreateGlobalVariable(DIDescriptor Context, StringRef Name,
619 StringRef DisplayName,
620 StringRef LinkageName,
621 DICompileUnit CompileUnit,
622 unsigned LineNo, DIType Ty, bool isLocalToUnit,
623 bool isDefinition, llvm::GlobalVariable *GV);
625 /// CreateVariable - Create a new descriptor for the specified variable.
626 DIVariable CreateVariable(unsigned Tag, DIDescriptor Context,
628 DICompileUnit CompileUnit, unsigned LineNo,
631 /// CreateComplexVariable - Create a new descriptor for the specified
632 /// variable which has a complex address expression for its address.
633 DIVariable CreateComplexVariable(unsigned Tag, DIDescriptor Context,
634 const std::string &Name,
635 DICompileUnit CompileUnit, unsigned LineNo,
637 SmallVector<Value *, 9> &addr);
639 /// CreateLexicalBlock - This creates a descriptor for a lexical block
640 /// with the specified parent context.
641 DILexicalBlock CreateLexicalBlock(DIDescriptor Context, unsigned Line = 0,
644 /// CreateNameSpace - This creates new descriptor for a namespace
645 /// with the specified parent context.
646 DINameSpace CreateNameSpace(DIDescriptor Context, StringRef Name,
647 DICompileUnit CU, unsigned LineNo);
649 /// CreateLocation - Creates a debug info location.
650 DILocation CreateLocation(unsigned LineNo, unsigned ColumnNo,
651 DIScope S, DILocation OrigLoc);
653 /// CreateLocation - Creates a debug info location.
654 DILocation CreateLocation(unsigned LineNo, unsigned ColumnNo,
655 DIScope S, MDNode *OrigLoc = 0);
657 /// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call.
658 Instruction *InsertDeclare(llvm::Value *Storage, DIVariable D,
659 BasicBlock *InsertAtEnd);
661 /// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call.
662 Instruction *InsertDeclare(llvm::Value *Storage, DIVariable D,
663 Instruction *InsertBefore);
665 /// InsertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
666 Instruction *InsertDbgValueIntrinsic(llvm::Value *V, uint64_t Offset,
667 DIVariable D, BasicBlock *InsertAtEnd);
669 /// InsertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
670 Instruction *InsertDbgValueIntrinsic(llvm::Value *V, uint64_t Offset,
671 DIVariable D, Instruction *InsertBefore);
673 Constant *GetTagConstant(unsigned TAG);
676 bool getLocationInfo(const Value *V, std::string &DisplayName,
677 std::string &Type, unsigned &LineNo, std::string &File,
680 /// ExtractDebugLocation - Extract debug location information
682 DebugLoc ExtractDebugLocation(DILocation &Loc,
683 DebugLocTracker &DebugLocInfo);
685 /// getDISubprogram - Find subprogram that is enclosing this scope.
686 DISubprogram getDISubprogram(MDNode *Scope);
688 /// getDICompositeType - Find underlying composite type.
689 DICompositeType getDICompositeType(DIType T);
691 class DebugInfoFinder {
693 /// processModule - Process entire module and collect debug info
695 void processModule(Module &M);
698 /// processType - Process DIType.
699 void processType(DIType DT);
701 /// processLexicalBlock - Process DILexicalBlock.
702 void processLexicalBlock(DILexicalBlock LB);
704 /// processSubprogram - Process DISubprogram.
705 void processSubprogram(DISubprogram SP);
707 /// processDeclare - Process DbgDeclareInst.
708 void processDeclare(DbgDeclareInst *DDI);
710 /// processLocation - Process DILocation.
711 void processLocation(DILocation Loc);
713 /// addCompileUnit - Add compile unit into CUs.
714 bool addCompileUnit(DICompileUnit CU);
716 /// addGlobalVariable - Add global variable into GVs.
717 bool addGlobalVariable(DIGlobalVariable DIG);
719 // addSubprogram - Add subprgoram into SPs.
720 bool addSubprogram(DISubprogram SP);
722 /// addType - Add type into Tys.
723 bool addType(DIType DT);
726 typedef SmallVector<MDNode *, 8>::iterator iterator;
727 iterator compile_unit_begin() { return CUs.begin(); }
728 iterator compile_unit_end() { return CUs.end(); }
729 iterator subprogram_begin() { return SPs.begin(); }
730 iterator subprogram_end() { return SPs.end(); }
731 iterator global_variable_begin() { return GVs.begin(); }
732 iterator global_variable_end() { return GVs.end(); }
733 iterator type_begin() { return TYs.begin(); }
734 iterator type_end() { return TYs.end(); }
736 unsigned compile_unit_count() { return CUs.size(); }
737 unsigned global_variable_count() { return GVs.size(); }
738 unsigned subprogram_count() { return SPs.size(); }
739 unsigned type_count() { return TYs.size(); }
742 SmallVector<MDNode *, 8> CUs; // Compile Units
743 SmallVector<MDNode *, 8> SPs; // Subprograms
744 SmallVector<MDNode *, 8> GVs; // Global Variables;
745 SmallVector<MDNode *, 8> TYs; // Types
746 SmallPtrSet<MDNode *, 64> NodesSeen;
748 } // end namespace llvm