Home | History | Annotate | Download | only in IR
      1 //===- DIBuilder.h - Debug Information Builder ------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file defines a DIBuilder that is useful for creating debugging
     11 // information entries in LLVM IR form.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_IR_DIBUILDER_H
     16 #define LLVM_IR_DIBUILDER_H
     17 
     18 #include "llvm/ADT/ArrayRef.h"
     19 #include "llvm/ADT/StringRef.h"
     20 #include "llvm/IR/DebugInfo.h"
     21 #include "llvm/IR/TrackingMDRef.h"
     22 #include "llvm/IR/ValueHandle.h"
     23 #include "llvm/Support/DataTypes.h"
     24 
     25 namespace llvm {
     26   class BasicBlock;
     27   class Instruction;
     28   class Function;
     29   class Module;
     30   class Value;
     31   class Constant;
     32   class LLVMContext;
     33   class StringRef;
     34 
     35   class DIBuilder {
     36     Module &M;
     37     LLVMContext &VMContext;
     38 
     39     TempMDTuple TempEnumTypes;
     40     TempMDTuple TempRetainTypes;
     41     TempMDTuple TempSubprograms;
     42     TempMDTuple TempGVs;
     43     TempMDTuple TempImportedModules;
     44 
     45     Function *DeclareFn;     // llvm.dbg.declare
     46     Function *ValueFn;       // llvm.dbg.value
     47 
     48     SmallVector<Metadata *, 4> AllEnumTypes;
     49     /// Track the RetainTypes, since they can be updated later on.
     50     SmallVector<TrackingMDNodeRef, 4> AllRetainTypes;
     51     SmallVector<Metadata *, 4> AllSubprograms;
     52     SmallVector<Metadata *, 4> AllGVs;
     53     SmallVector<TrackingMDNodeRef, 4> AllImportedModules;
     54 
     55     /// \brief Track nodes that may be unresolved.
     56     SmallVector<TrackingMDNodeRef, 4> UnresolvedNodes;
     57     bool AllowUnresolvedNodes;
     58 
     59     /// Each subprogram's preserved local variables.
     60     DenseMap<MDNode *, std::vector<TrackingMDNodeRef>> PreservedVariables;
     61 
     62     DIBuilder(const DIBuilder &) = delete;
     63     void operator=(const DIBuilder &) = delete;
     64 
     65     /// \brief Create a temporary.
     66     ///
     67     /// Create an \a temporary node and track it in \a UnresolvedNodes.
     68     void trackIfUnresolved(MDNode *N);
     69 
     70   public:
     71     /// \brief Construct a builder for a module.
     72     ///
     73     /// If \c AllowUnresolved, collect unresolved nodes attached to the module
     74     /// in order to resolve cycles during \a finalize().
     75     explicit DIBuilder(Module &M, bool AllowUnresolved = true);
     76     enum DebugEmissionKind { FullDebug=1, LineTablesOnly };
     77 
     78     /// finalize - Construct any deferred debug info descriptors.
     79     void finalize();
     80 
     81     /// createCompileUnit - A CompileUnit provides an anchor for all debugging
     82     /// information generated during this instance of compilation.
     83     /// @param Lang     Source programming language, eg. dwarf::DW_LANG_C99
     84     /// @param File     File name
     85     /// @param Dir      Directory
     86     /// @param Producer Identify the producer of debugging information and code.
     87     ///                 Usually this is a compiler version string.
     88     /// @param isOptimized A boolean flag which indicates whether optimization
     89     ///                    is ON or not.
     90     /// @param Flags    This string lists command line options. This string is
     91     ///                 directly embedded in debug info output which may be used
     92     ///                 by a tool analyzing generated debugging information.
     93     /// @param RV       This indicates runtime version for languages like
     94     ///                 Objective-C.
     95     /// @param SplitName The name of the file that we'll split debug info out
     96     ///                  into.
     97     /// @param Kind     The kind of debug information to generate.
     98     /// @param EmitDebugInfo   A boolean flag which indicates whether debug
     99     ///                        information should be written to the final
    100     ///                        output or not. When this is false, debug
    101     ///                        information annotations will be present in
    102     ///                        the IL but they are not written to the final
    103     ///                        assembly or object file. This supports tracking
    104     ///                        source location information in the back end
    105     ///                        without actually changing the output (e.g.,
    106     ///                        when using optimization remarks).
    107     MDCompileUnit *createCompileUnit(unsigned Lang, StringRef File,
    108                                      StringRef Dir, StringRef Producer,
    109                                      bool isOptimized, StringRef Flags,
    110                                      unsigned RV, StringRef SplitName = "",
    111                                      DebugEmissionKind Kind = FullDebug,
    112                                      bool EmitDebugInfo = true);
    113 
    114     /// createFile - Create a file descriptor to hold debugging information
    115     /// for a file.
    116     MDFile *createFile(StringRef Filename, StringRef Directory);
    117 
    118     /// createEnumerator - Create a single enumerator value.
    119     MDEnumerator *createEnumerator(StringRef Name, int64_t Val);
    120 
    121     /// \brief Create a DWARF unspecified type.
    122     MDBasicType *createUnspecifiedType(StringRef Name);
    123 
    124     /// \brief Create C++11 nullptr type.
    125     MDBasicType *createNullPtrType();
    126 
    127     /// createBasicType - Create debugging information entry for a basic
    128     /// type.
    129     /// @param Name        Type name.
    130     /// @param SizeInBits  Size of the type.
    131     /// @param AlignInBits Type alignment.
    132     /// @param Encoding    DWARF encoding code, e.g. dwarf::DW_ATE_float.
    133     MDBasicType *createBasicType(StringRef Name, uint64_t SizeInBits,
    134                                  uint64_t AlignInBits, unsigned Encoding);
    135 
    136     /// createQualifiedType - Create debugging information entry for a qualified
    137     /// type, e.g. 'const int'.
    138     /// @param Tag         Tag identifing type, e.g. dwarf::TAG_volatile_type
    139     /// @param FromTy      Base Type.
    140     MDDerivedType *createQualifiedType(unsigned Tag, MDType *FromTy);
    141 
    142     /// createPointerType - Create debugging information entry for a pointer.
    143     /// @param PointeeTy   Type pointed by this pointer.
    144     /// @param SizeInBits  Size.
    145     /// @param AlignInBits Alignment. (optional)
    146     /// @param Name        Pointer type name. (optional)
    147     MDDerivedType *createPointerType(MDType *PointeeTy, uint64_t SizeInBits,
    148                                      uint64_t AlignInBits = 0,
    149                                      StringRef Name = "");
    150 
    151     /// \brief Create debugging information entry for a pointer to member.
    152     /// @param PointeeTy Type pointed to by this pointer.
    153     /// @param SizeInBits  Size.
    154     /// @param AlignInBits Alignment. (optional)
    155     /// @param Class Type for which this pointer points to members of.
    156     MDDerivedType *createMemberPointerType(MDType *PointeeTy, MDType *Class,
    157                                            uint64_t SizeInBits,
    158                                            uint64_t AlignInBits = 0);
    159 
    160     /// createReferenceType - Create debugging information entry for a c++
    161     /// style reference or rvalue reference type.
    162     MDDerivedType *createReferenceType(unsigned Tag, MDType *RTy);
    163 
    164     /// createTypedef - Create debugging information entry for a typedef.
    165     /// @param Ty          Original type.
    166     /// @param Name        Typedef name.
    167     /// @param File        File where this type is defined.
    168     /// @param LineNo      Line number.
    169     /// @param Context     The surrounding context for the typedef.
    170     MDDerivedType *createTypedef(MDType *Ty, StringRef Name, MDFile *File,
    171                                  unsigned LineNo, MDScope *Context);
    172 
    173     /// createFriend - Create debugging information entry for a 'friend'.
    174     MDDerivedType *createFriend(MDType *Ty, MDType *FriendTy);
    175 
    176     /// createInheritance - Create debugging information entry to establish
    177     /// inheritance relationship between two types.
    178     /// @param Ty           Original type.
    179     /// @param BaseTy       Base type. Ty is inherits from base.
    180     /// @param BaseOffset   Base offset.
    181     /// @param Flags        Flags to describe inheritance attribute,
    182     ///                     e.g. private
    183     MDDerivedType *createInheritance(MDType *Ty, MDType *BaseTy,
    184                                      uint64_t BaseOffset, unsigned Flags);
    185 
    186     /// createMemberType - Create debugging information entry for a member.
    187     /// @param Scope        Member scope.
    188     /// @param Name         Member name.
    189     /// @param File         File where this member is defined.
    190     /// @param LineNo       Line number.
    191     /// @param SizeInBits   Member size.
    192     /// @param AlignInBits  Member alignment.
    193     /// @param OffsetInBits Member offset.
    194     /// @param Flags        Flags to encode member attribute, e.g. private
    195     /// @param Ty           Parent type.
    196     MDDerivedType *createMemberType(MDScope *Scope, StringRef Name,
    197                                     MDFile *File, unsigned LineNo,
    198                                     uint64_t SizeInBits, uint64_t AlignInBits,
    199                                     uint64_t OffsetInBits, unsigned Flags,
    200                                     MDType *Ty);
    201 
    202     /// createStaticMemberType - Create debugging information entry for a
    203     /// C++ static data member.
    204     /// @param Scope      Member scope.
    205     /// @param Name       Member name.
    206     /// @param File       File where this member is declared.
    207     /// @param LineNo     Line number.
    208     /// @param Ty         Type of the static member.
    209     /// @param Flags      Flags to encode member attribute, e.g. private.
    210     /// @param Val        Const initializer of the member.
    211     MDDerivedType *createStaticMemberType(MDScope *Scope, StringRef Name,
    212                                           MDFile *File, unsigned LineNo,
    213                                           MDType *Ty, unsigned Flags,
    214                                           llvm::Constant *Val);
    215 
    216     /// createObjCIVar - Create debugging information entry for Objective-C
    217     /// instance variable.
    218     /// @param Name         Member name.
    219     /// @param File         File where this member is defined.
    220     /// @param LineNo       Line number.
    221     /// @param SizeInBits   Member size.
    222     /// @param AlignInBits  Member alignment.
    223     /// @param OffsetInBits Member offset.
    224     /// @param Flags        Flags to encode member attribute, e.g. private
    225     /// @param Ty           Parent type.
    226     /// @param PropertyNode Property associated with this ivar.
    227     MDDerivedType *createObjCIVar(StringRef Name, MDFile *File, unsigned LineNo,
    228                                   uint64_t SizeInBits, uint64_t AlignInBits,
    229                                   uint64_t OffsetInBits, unsigned Flags,
    230                                   MDType *Ty, MDNode *PropertyNode);
    231 
    232     /// createObjCProperty - Create debugging information entry for Objective-C
    233     /// property.
    234     /// @param Name         Property name.
    235     /// @param File         File where this property is defined.
    236     /// @param LineNumber   Line number.
    237     /// @param GetterName   Name of the Objective C property getter selector.
    238     /// @param SetterName   Name of the Objective C property setter selector.
    239     /// @param PropertyAttributes Objective C property attributes.
    240     /// @param Ty           Type.
    241     MDObjCProperty *createObjCProperty(StringRef Name, MDFile *File,
    242                                        unsigned LineNumber,
    243                                        StringRef GetterName,
    244                                        StringRef SetterName,
    245                                        unsigned PropertyAttributes, MDType *Ty);
    246 
    247     /// createClassType - Create debugging information entry for a class.
    248     /// @param Scope        Scope in which this class is defined.
    249     /// @param Name         class name.
    250     /// @param File         File where this member is defined.
    251     /// @param LineNumber   Line number.
    252     /// @param SizeInBits   Member size.
    253     /// @param AlignInBits  Member alignment.
    254     /// @param OffsetInBits Member offset.
    255     /// @param Flags        Flags to encode member attribute, e.g. private
    256     /// @param Elements     class members.
    257     /// @param VTableHolder Debug info of the base class that contains vtable
    258     ///                     for this type. This is used in
    259     ///                     DW_AT_containing_type. See DWARF documentation
    260     ///                     for more info.
    261     /// @param TemplateParms Template type parameters.
    262     /// @param UniqueIdentifier A unique identifier for the class.
    263     MDCompositeType *createClassType(MDScope *Scope, StringRef Name,
    264                                      MDFile *File, unsigned LineNumber,
    265                                      uint64_t SizeInBits, uint64_t AlignInBits,
    266                                      uint64_t OffsetInBits, unsigned Flags,
    267                                      MDType *DerivedFrom, DIArray Elements,
    268                                      MDType *VTableHolder = nullptr,
    269                                      MDNode *TemplateParms = nullptr,
    270                                      StringRef UniqueIdentifier = "");
    271 
    272     /// createStructType - Create debugging information entry for a struct.
    273     /// @param Scope        Scope in which this struct is defined.
    274     /// @param Name         Struct name.
    275     /// @param File         File where this member is defined.
    276     /// @param LineNumber   Line number.
    277     /// @param SizeInBits   Member size.
    278     /// @param AlignInBits  Member alignment.
    279     /// @param Flags        Flags to encode member attribute, e.g. private
    280     /// @param Elements     Struct elements.
    281     /// @param RunTimeLang  Optional parameter, Objective-C runtime version.
    282     /// @param UniqueIdentifier A unique identifier for the struct.
    283     MDCompositeType *createStructType(
    284         MDScope *Scope, StringRef Name, MDFile *File, unsigned LineNumber,
    285         uint64_t SizeInBits, uint64_t AlignInBits, unsigned Flags,
    286         MDType *DerivedFrom, DIArray Elements, unsigned RunTimeLang = 0,
    287         MDType *VTableHolder = nullptr, StringRef UniqueIdentifier = "");
    288 
    289     /// createUnionType - Create debugging information entry for an union.
    290     /// @param Scope        Scope in which this union is defined.
    291     /// @param Name         Union name.
    292     /// @param File         File where this member is defined.
    293     /// @param LineNumber   Line number.
    294     /// @param SizeInBits   Member size.
    295     /// @param AlignInBits  Member alignment.
    296     /// @param Flags        Flags to encode member attribute, e.g. private
    297     /// @param Elements     Union elements.
    298     /// @param RunTimeLang  Optional parameter, Objective-C runtime version.
    299     /// @param UniqueIdentifier A unique identifier for the union.
    300     MDCompositeType *createUnionType(MDScope *Scope, StringRef Name,
    301                                      MDFile *File, unsigned LineNumber,
    302                                      uint64_t SizeInBits, uint64_t AlignInBits,
    303                                      unsigned Flags, DIArray Elements,
    304                                      unsigned RunTimeLang = 0,
    305                                      StringRef UniqueIdentifier = "");
    306 
    307     /// createTemplateTypeParameter - Create debugging information for template
    308     /// type parameter.
    309     /// @param Scope        Scope in which this type is defined.
    310     /// @param Name         Type parameter name.
    311     /// @param Ty           Parameter type.
    312     MDTemplateTypeParameter *
    313     createTemplateTypeParameter(MDScope *Scope, StringRef Name, MDType *Ty);
    314 
    315     /// createTemplateValueParameter - Create debugging information for template
    316     /// value parameter.
    317     /// @param Scope        Scope in which this type is defined.
    318     /// @param Name         Value parameter name.
    319     /// @param Ty           Parameter type.
    320     /// @param Val          Constant parameter value.
    321     MDTemplateValueParameter *createTemplateValueParameter(MDScope *Scope,
    322                                                            StringRef Name,
    323                                                            MDType *Ty,
    324                                                            Constant *Val);
    325 
    326     /// \brief Create debugging information for a template template parameter.
    327     /// @param Scope        Scope in which this type is defined.
    328     /// @param Name         Value parameter name.
    329     /// @param Ty           Parameter type.
    330     /// @param Val          The fully qualified name of the template.
    331     MDTemplateValueParameter *createTemplateTemplateParameter(MDScope *Scope,
    332                                                               StringRef Name,
    333                                                               MDType *Ty,
    334                                                               StringRef Val);
    335 
    336     /// \brief Create debugging information for a template parameter pack.
    337     /// @param Scope        Scope in which this type is defined.
    338     /// @param Name         Value parameter name.
    339     /// @param Ty           Parameter type.
    340     /// @param Val          An array of types in the pack.
    341     MDTemplateValueParameter *createTemplateParameterPack(MDScope *Scope,
    342                                                           StringRef Name,
    343                                                           MDType *Ty,
    344                                                           DIArray Val);
    345 
    346     /// createArrayType - Create debugging information entry for an array.
    347     /// @param Size         Array size.
    348     /// @param AlignInBits  Alignment.
    349     /// @param Ty           Element type.
    350     /// @param Subscripts   Subscripts.
    351     MDCompositeType *createArrayType(uint64_t Size, uint64_t AlignInBits,
    352                                      MDType *Ty, DIArray Subscripts);
    353 
    354     /// createVectorType - Create debugging information entry for a vector type.
    355     /// @param Size         Array size.
    356     /// @param AlignInBits  Alignment.
    357     /// @param Ty           Element type.
    358     /// @param Subscripts   Subscripts.
    359     MDCompositeType *createVectorType(uint64_t Size, uint64_t AlignInBits,
    360                                       MDType *Ty, DIArray Subscripts);
    361 
    362     /// createEnumerationType - Create debugging information entry for an
    363     /// enumeration.
    364     /// @param Scope          Scope in which this enumeration is defined.
    365     /// @param Name           Union name.
    366     /// @param File           File where this member is defined.
    367     /// @param LineNumber     Line number.
    368     /// @param SizeInBits     Member size.
    369     /// @param AlignInBits    Member alignment.
    370     /// @param Elements       Enumeration elements.
    371     /// @param UnderlyingType Underlying type of a C++11/ObjC fixed enum.
    372     /// @param UniqueIdentifier A unique identifier for the enum.
    373     MDCompositeType *createEnumerationType(
    374         MDScope *Scope, StringRef Name, MDFile *File, unsigned LineNumber,
    375         uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements,
    376         MDType *UnderlyingType, StringRef UniqueIdentifier = "");
    377 
    378     /// createSubroutineType - Create subroutine type.
    379     /// @param File            File in which this subroutine is defined.
    380     /// @param ParameterTypes  An array of subroutine parameter types. This
    381     ///                        includes return type at 0th index.
    382     /// @param Flags           E.g.: LValueReference.
    383     ///                        These flags are used to emit dwarf attributes.
    384     MDSubroutineType *createSubroutineType(MDFile *File,
    385                                            DITypeArray ParameterTypes,
    386                                            unsigned Flags = 0);
    387 
    388     /// createArtificialType - Create a new MDType* with "artificial" flag set.
    389     MDType *createArtificialType(MDType *Ty);
    390 
    391     /// createObjectPointerType - Create a new MDType* with the "object pointer"
    392     /// flag set.
    393     MDType *createObjectPointerType(MDType *Ty);
    394 
    395     /// \brief Create a permanent forward-declared type.
    396     MDCompositeType *createForwardDecl(unsigned Tag, StringRef Name,
    397                                        MDScope *Scope, MDFile *F, unsigned Line,
    398                                        unsigned RuntimeLang = 0,
    399                                        uint64_t SizeInBits = 0,
    400                                        uint64_t AlignInBits = 0,
    401                                        StringRef UniqueIdentifier = "");
    402 
    403     /// \brief Create a temporary forward-declared type.
    404     MDCompositeType *createReplaceableCompositeType(
    405         unsigned Tag, StringRef Name, MDScope *Scope, MDFile *F, unsigned Line,
    406         unsigned RuntimeLang = 0, uint64_t SizeInBits = 0,
    407         uint64_t AlignInBits = 0, unsigned Flags = DebugNode::FlagFwdDecl,
    408         StringRef UniqueIdentifier = "");
    409 
    410     /// retainType - Retain MDType* in a module even if it is not referenced
    411     /// through debug info anchors.
    412     void retainType(MDType *T);
    413 
    414     /// createUnspecifiedParameter - Create unspecified parameter type
    415     /// for a subroutine type.
    416     MDBasicType *createUnspecifiedParameter();
    417 
    418     /// getOrCreateArray - Get a DIArray, create one if required.
    419     DIArray getOrCreateArray(ArrayRef<Metadata *> Elements);
    420 
    421     /// getOrCreateTypeArray - Get a DITypeArray, create one if required.
    422     DITypeArray getOrCreateTypeArray(ArrayRef<Metadata *> Elements);
    423 
    424     /// getOrCreateSubrange - Create a descriptor for a value range.  This
    425     /// implicitly uniques the values returned.
    426     MDSubrange *getOrCreateSubrange(int64_t Lo, int64_t Count);
    427 
    428     /// createGlobalVariable - Create a new descriptor for the specified
    429     /// variable.
    430     /// @param Context     Variable scope.
    431     /// @param Name        Name of the variable.
    432     /// @param LinkageName Mangled  name of the variable.
    433     /// @param File        File where this variable is defined.
    434     /// @param LineNo      Line number.
    435     /// @param Ty          Variable Type.
    436     /// @param isLocalToUnit Boolean flag indicate whether this variable is
    437     ///                      externally visible or not.
    438     /// @param Val         llvm::Value of the variable.
    439     /// @param Decl        Reference to the corresponding declaration.
    440     MDGlobalVariable *createGlobalVariable(MDScope *Context, StringRef Name,
    441                                            StringRef LinkageName, MDFile *File,
    442                                            unsigned LineNo, MDType *Ty,
    443                                            bool isLocalToUnit,
    444                                            llvm::Constant *Val,
    445                                            MDNode *Decl = nullptr);
    446 
    447     /// createTempGlobalVariableFwdDecl - Identical to createGlobalVariable
    448     /// except that the resulting DbgNode is temporary and meant to be RAUWed.
    449     MDGlobalVariable *createTempGlobalVariableFwdDecl(
    450         MDScope *Context, StringRef Name, StringRef LinkageName, MDFile *File,
    451         unsigned LineNo, MDType *Ty, bool isLocalToUnit, llvm::Constant *Val,
    452         MDNode *Decl = nullptr);
    453 
    454     /// createLocalVariable - Create a new descriptor for the specified
    455     /// local variable.
    456     /// @param Tag         Dwarf TAG. Usually DW_TAG_auto_variable or
    457     ///                    DW_TAG_arg_variable.
    458     /// @param Scope       Variable scope.
    459     /// @param Name        Variable name.
    460     /// @param File        File where this variable is defined.
    461     /// @param LineNo      Line number.
    462     /// @param Ty          Variable Type
    463     /// @param AlwaysPreserve Boolean. Set to true if debug info for this
    464     ///                       variable should be preserved in optimized build.
    465     /// @param Flags       Flags, e.g. artificial variable.
    466     /// @param ArgNo       If this variable is an argument then this argument's
    467     ///                    number. 1 indicates 1st argument.
    468     MDLocalVariable *createLocalVariable(unsigned Tag, MDScope *Scope,
    469                                          StringRef Name, MDFile *File,
    470                                          unsigned LineNo, MDType *Ty,
    471                                          bool AlwaysPreserve = false,
    472                                          unsigned Flags = 0,
    473                                          unsigned ArgNo = 0);
    474 
    475     /// createExpression - Create a new descriptor for the specified
    476     /// variable which has a complex address expression for its address.
    477     /// @param Addr        An array of complex address operations.
    478     MDExpression *createExpression(ArrayRef<uint64_t> Addr = None);
    479     MDExpression *createExpression(ArrayRef<int64_t> Addr);
    480 
    481     /// createBitPieceExpression - Create a descriptor to describe one part
    482     /// of aggregate variable that is fragmented across multiple Values.
    483     ///
    484     /// @param OffsetInBits Offset of the piece in bits.
    485     /// @param SizeInBits   Size of the piece in bits.
    486     MDExpression *createBitPieceExpression(unsigned OffsetInBits,
    487                                            unsigned SizeInBits);
    488 
    489     /// createFunction - Create a new descriptor for the specified subprogram.
    490     /// See comments in MDSubprogram* for descriptions of these fields.
    491     /// @param Scope         Function scope.
    492     /// @param Name          Function name.
    493     /// @param LinkageName   Mangled function name.
    494     /// @param File          File where this variable is defined.
    495     /// @param LineNo        Line number.
    496     /// @param Ty            Function type.
    497     /// @param isLocalToUnit True if this function is not externally visible.
    498     /// @param isDefinition  True if this is a function definition.
    499     /// @param ScopeLine     Set to the beginning of the scope this starts
    500     /// @param Flags         e.g. is this function prototyped or not.
    501     ///                      These flags are used to emit dwarf attributes.
    502     /// @param isOptimized   True if optimization is ON.
    503     /// @param Fn            llvm::Function pointer.
    504     /// @param TParam        Function template parameters.
    505     MDSubprogram *
    506     createFunction(MDScope *Scope, StringRef Name, StringRef LinkageName,
    507                    MDFile *File, unsigned LineNo, MDSubroutineType *Ty,
    508                    bool isLocalToUnit, bool isDefinition, unsigned ScopeLine,
    509                    unsigned Flags = 0, bool isOptimized = false,
    510                    Function *Fn = nullptr, MDNode *TParam = nullptr,
    511                    MDNode *Decl = nullptr);
    512 
    513     /// createTempFunctionFwdDecl - Identical to createFunction,
    514     /// except that the resulting DbgNode is meant to be RAUWed.
    515     MDSubprogram *createTempFunctionFwdDecl(
    516         MDScope *Scope, StringRef Name, StringRef LinkageName, MDFile *File,
    517         unsigned LineNo, MDSubroutineType *Ty, bool isLocalToUnit,
    518         bool isDefinition, unsigned ScopeLine, unsigned Flags = 0,
    519         bool isOptimized = false, Function *Fn = nullptr,
    520         MDNode *TParam = nullptr, MDNode *Decl = nullptr);
    521 
    522     /// FIXME: this is added for dragonegg. Once we update dragonegg
    523     /// to call resolve function, this will be removed.
    524     MDSubprogram *
    525     createFunction(DIScopeRef Scope, StringRef Name, StringRef LinkageName,
    526                    MDFile *File, unsigned LineNo, MDSubroutineType *Ty,
    527                    bool isLocalToUnit, bool isDefinition, unsigned ScopeLine,
    528                    unsigned Flags = 0, bool isOptimized = false,
    529                    Function *Fn = nullptr, MDNode *TParam = nullptr,
    530                    MDNode *Decl = nullptr);
    531 
    532     /// createMethod - Create a new descriptor for the specified C++ method.
    533     /// See comments in MDSubprogram* for descriptions of these fields.
    534     /// @param Scope         Function scope.
    535     /// @param Name          Function name.
    536     /// @param LinkageName   Mangled function name.
    537     /// @param File          File where this variable is defined.
    538     /// @param LineNo        Line number.
    539     /// @param Ty            Function type.
    540     /// @param isLocalToUnit True if this function is not externally visible..
    541     /// @param isDefinition  True if this is a function definition.
    542     /// @param Virtuality    Attributes describing virtualness. e.g. pure
    543     ///                      virtual function.
    544     /// @param VTableIndex   Index no of this method in virtual table.
    545     /// @param VTableHolder  Type that holds vtable.
    546     /// @param Flags         e.g. is this function prototyped or not.
    547     ///                      This flags are used to emit dwarf attributes.
    548     /// @param isOptimized   True if optimization is ON.
    549     /// @param Fn            llvm::Function pointer.
    550     /// @param TParam        Function template parameters.
    551     MDSubprogram *
    552     createMethod(MDScope *Scope, StringRef Name, StringRef LinkageName,
    553                  MDFile *File, unsigned LineNo, MDSubroutineType *Ty,
    554                  bool isLocalToUnit, bool isDefinition, unsigned Virtuality = 0,
    555                  unsigned VTableIndex = 0, MDType *VTableHolder = nullptr,
    556                  unsigned Flags = 0, bool isOptimized = false,
    557                  Function *Fn = nullptr, MDNode *TParam = nullptr);
    558 
    559     /// createNameSpace - This creates new descriptor for a namespace
    560     /// with the specified parent scope.
    561     /// @param Scope       Namespace scope
    562     /// @param Name        Name of this namespace
    563     /// @param File        Source file
    564     /// @param LineNo      Line number
    565     MDNamespace *createNameSpace(MDScope *Scope, StringRef Name, MDFile *File,
    566                                  unsigned LineNo);
    567 
    568     /// createLexicalBlockFile - This creates a descriptor for a lexical
    569     /// block with a new file attached. This merely extends the existing
    570     /// lexical block as it crosses a file.
    571     /// @param Scope       Lexical block.
    572     /// @param File        Source file.
    573     /// @param Discriminator DWARF path discriminator value.
    574     MDLexicalBlockFile *createLexicalBlockFile(MDScope *Scope, MDFile *File,
    575                                                unsigned Discriminator = 0);
    576 
    577     /// createLexicalBlock - This creates a descriptor for a lexical block
    578     /// with the specified parent context.
    579     /// @param Scope         Parent lexical scope.
    580     /// @param File          Source file.
    581     /// @param Line          Line number.
    582     /// @param Col           Column number.
    583     MDLexicalBlock *createLexicalBlock(MDScope *Scope, MDFile *File,
    584                                        unsigned Line, unsigned Col);
    585 
    586     /// \brief Create a descriptor for an imported module.
    587     /// @param Context The scope this module is imported into
    588     /// @param NS The namespace being imported here
    589     /// @param Line Line number
    590     MDImportedEntity *createImportedModule(MDScope *Context, MDNamespace *NS,
    591                                            unsigned Line);
    592 
    593     /// \brief Create a descriptor for an imported module.
    594     /// @param Context The scope this module is imported into
    595     /// @param NS An aliased namespace
    596     /// @param Line Line number
    597     MDImportedEntity *createImportedModule(MDScope *Context,
    598                                            MDImportedEntity *NS, unsigned Line);
    599 
    600     /// \brief Create a descriptor for an imported function.
    601     /// @param Context The scope this module is imported into
    602     /// @param Decl The declaration (or definition) of a function, type, or
    603     ///             variable
    604     /// @param Line Line number
    605     MDImportedEntity *createImportedDeclaration(MDScope *Context,
    606                                                 DebugNode *Decl, unsigned Line,
    607                                                 StringRef Name = "");
    608 
    609     /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
    610     /// @param Storage     llvm::Value of the variable
    611     /// @param VarInfo     Variable's debug info descriptor.
    612     /// @param Expr         A complex location expression.
    613     /// @param DL           Debug info location.
    614     /// @param InsertAtEnd Location for the new intrinsic.
    615     Instruction *insertDeclare(llvm::Value *Storage, MDLocalVariable *VarInfo,
    616                                MDExpression *Expr, const MDLocation *DL,
    617                                BasicBlock *InsertAtEnd);
    618 
    619     /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
    620     /// @param Storage      llvm::Value of the variable
    621     /// @param VarInfo      Variable's debug info descriptor.
    622     /// @param Expr         A complex location expression.
    623     /// @param DL           Debug info location.
    624     /// @param InsertBefore Location for the new intrinsic.
    625     Instruction *insertDeclare(llvm::Value *Storage, MDLocalVariable *VarInfo,
    626                                MDExpression *Expr, const MDLocation *DL,
    627                                Instruction *InsertBefore);
    628 
    629     /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
    630     /// @param Val          llvm::Value of the variable
    631     /// @param Offset       Offset
    632     /// @param VarInfo      Variable's debug info descriptor.
    633     /// @param Expr         A complex location expression.
    634     /// @param DL           Debug info location.
    635     /// @param InsertAtEnd Location for the new intrinsic.
    636     Instruction *insertDbgValueIntrinsic(llvm::Value *Val, uint64_t Offset,
    637                                          MDLocalVariable *VarInfo,
    638                                          MDExpression *Expr,
    639                                          const MDLocation *DL,
    640                                          BasicBlock *InsertAtEnd);
    641 
    642     /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
    643     /// @param Val          llvm::Value of the variable
    644     /// @param Offset       Offset
    645     /// @param VarInfo      Variable's debug info descriptor.
    646     /// @param Expr         A complex location expression.
    647     /// @param DL           Debug info location.
    648     /// @param InsertBefore Location for the new intrinsic.
    649     Instruction *insertDbgValueIntrinsic(llvm::Value *Val, uint64_t Offset,
    650                                          MDLocalVariable *VarInfo,
    651                                          MDExpression *Expr,
    652                                          const MDLocation *DL,
    653                                          Instruction *InsertBefore);
    654 
    655     /// \brief Replace the vtable holder in the given composite type.
    656     ///
    657     /// If this creates a self reference, it may orphan some unresolved cycles
    658     /// in the operands of \c T, so \a DIBuilder needs to track that.
    659     void replaceVTableHolder(MDCompositeType *&T,
    660                              MDCompositeType *VTableHolder);
    661 
    662     /// \brief Replace arrays on a composite type.
    663     ///
    664     /// If \c T is resolved, but the arrays aren't -- which can happen if \c T
    665     /// has a self-reference -- \a DIBuilder needs to track the array to
    666     /// resolve cycles.
    667     void replaceArrays(MDCompositeType *&T, DIArray Elements,
    668                        DIArray TParems = DIArray());
    669 
    670     /// \brief Replace a temporary node.
    671     ///
    672     /// Call \a MDNode::replaceAllUsesWith() on \c N, replacing it with \c
    673     /// Replacement.
    674     ///
    675     /// If \c Replacement is the same as \c N.get(), instead call \a
    676     /// MDNode::replaceWithUniqued().  In this case, the uniqued node could
    677     /// have a different address, so we return the final address.
    678     template <class NodeTy>
    679     NodeTy *replaceTemporary(TempMDNode &&N, NodeTy *Replacement) {
    680       if (N.get() == Replacement)
    681         return cast<NodeTy>(MDNode::replaceWithUniqued(std::move(N)));
    682 
    683       N->replaceAllUsesWith(Replacement);
    684       return Replacement;
    685     }
    686   };
    687 } // end namespace llvm
    688 
    689 #endif
    690