Home | History | Annotate | Download | only in IR
      1 //===--- DIBuilder.cpp - Debug Information Builder ------------------------===//
      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 implements the DIBuilder.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "llvm/DIBuilder.h"
     15 #include "llvm/ADT/STLExtras.h"
     16 #include "llvm/DebugInfo.h"
     17 #include "llvm/IR/Constants.h"
     18 #include "llvm/IR/IntrinsicInst.h"
     19 #include "llvm/IR/Module.h"
     20 #include "llvm/Support/Debug.h"
     21 #include "llvm/Support/Dwarf.h"
     22 
     23 using namespace llvm;
     24 using namespace llvm::dwarf;
     25 
     26 static Constant *GetTagConstant(LLVMContext &VMContext, unsigned Tag) {
     27   assert((Tag & LLVMDebugVersionMask) == 0 &&
     28          "Tag too large for debug encoding!");
     29   return ConstantInt::get(Type::getInt32Ty(VMContext), Tag | LLVMDebugVersion);
     30 }
     31 
     32 DIBuilder::DIBuilder(Module &m)
     33   : M(m), VMContext(M.getContext()), TempEnumTypes(0),
     34     TempRetainTypes(0), TempSubprograms(0), TempGVs(0), DeclareFn(0),
     35     ValueFn(0)
     36 {}
     37 
     38 /// finalize - Construct any deferred debug info descriptors.
     39 void DIBuilder::finalize() {
     40   DIArray Enums = getOrCreateArray(AllEnumTypes);
     41   DIType(TempEnumTypes).replaceAllUsesWith(Enums);
     42 
     43   DIArray RetainTypes = getOrCreateArray(AllRetainTypes);
     44   DIType(TempRetainTypes).replaceAllUsesWith(RetainTypes);
     45 
     46   DIArray SPs = getOrCreateArray(AllSubprograms);
     47   DIType(TempSubprograms).replaceAllUsesWith(SPs);
     48   for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
     49     DISubprogram SP(SPs.getElement(i));
     50     SmallVector<Value *, 4> Variables;
     51     if (NamedMDNode *NMD = getFnSpecificMDNode(M, SP)) {
     52       for (unsigned ii = 0, ee = NMD->getNumOperands(); ii != ee; ++ii)
     53         Variables.push_back(NMD->getOperand(ii));
     54       NMD->eraseFromParent();
     55     }
     56     if (MDNode *Temp = SP.getVariablesNodes()) {
     57       DIArray AV = getOrCreateArray(Variables);
     58       DIType(Temp).replaceAllUsesWith(AV);
     59     }
     60   }
     61 
     62   DIArray GVs = getOrCreateArray(AllGVs);
     63   DIType(TempGVs).replaceAllUsesWith(GVs);
     64 
     65   DIArray IMs = getOrCreateArray(AllImportedModules);
     66   DIType(TempImportedModules).replaceAllUsesWith(IMs);
     67 }
     68 
     69 /// getNonCompileUnitScope - If N is compile unit return NULL otherwise return
     70 /// N.
     71 static MDNode *getNonCompileUnitScope(MDNode *N) {
     72   if (DIDescriptor(N).isCompileUnit())
     73     return NULL;
     74   return N;
     75 }
     76 
     77 static MDNode *createFilePathPair(LLVMContext &VMContext, StringRef Filename,
     78                                   StringRef Directory) {
     79   assert(!Filename.empty() && "Unable to create file without name");
     80   Value *Pair[] = {
     81     MDString::get(VMContext, Filename),
     82     MDString::get(VMContext, Directory),
     83   };
     84   return MDNode::get(VMContext, Pair);
     85 }
     86 
     87 /// createCompileUnit - A CompileUnit provides an anchor for all debugging
     88 /// information generated during this instance of compilation.
     89 DICompileUnit DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
     90                                            StringRef Directory,
     91                                            StringRef Producer, bool isOptimized,
     92                                            StringRef Flags, unsigned RunTimeVer,
     93                                            StringRef SplitName) {
     94   assert(((Lang <= dwarf::DW_LANG_Python && Lang >= dwarf::DW_LANG_C89) ||
     95           (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
     96          "Invalid Language tag");
     97   assert(!Filename.empty() &&
     98          "Unable to create compile unit without filename");
     99   Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
    100   TempEnumTypes = MDNode::getTemporary(VMContext, TElts);
    101 
    102   TempRetainTypes = MDNode::getTemporary(VMContext, TElts);
    103 
    104   TempSubprograms = MDNode::getTemporary(VMContext, TElts);
    105 
    106   TempGVs = MDNode::getTemporary(VMContext, TElts);
    107 
    108   TempImportedModules = MDNode::getTemporary(VMContext, TElts);
    109 
    110   Value *Elts[] = {
    111     GetTagConstant(VMContext, dwarf::DW_TAG_compile_unit),
    112     createFilePathPair(VMContext, Filename, Directory),
    113     ConstantInt::get(Type::getInt32Ty(VMContext), Lang),
    114     MDString::get(VMContext, Producer),
    115     ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
    116     MDString::get(VMContext, Flags),
    117     ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer),
    118     TempEnumTypes,
    119     TempRetainTypes,
    120     TempSubprograms,
    121     TempGVs,
    122     TempImportedModules,
    123     MDString::get(VMContext, SplitName)
    124   };
    125 
    126   MDNode *CUNode = MDNode::get(VMContext, Elts);
    127 
    128   // Create a named metadata so that it is easier to find cu in a module.
    129   NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
    130   NMD->addOperand(CUNode);
    131 
    132   return DICompileUnit(CUNode);
    133 }
    134 
    135 static DIImportedEntity
    136 createImportedModule(LLVMContext &C, DIScope Context, DIDescriptor NS,
    137                      unsigned Line, StringRef Name,
    138                      SmallVectorImpl<Value *> &AllImportedModules) {
    139   const MDNode *R;
    140   if (Name.empty()) {
    141     Value *Elts[] = {
    142       GetTagConstant(C, dwarf::DW_TAG_imported_module),
    143       Context,
    144       NS,
    145       ConstantInt::get(Type::getInt32Ty(C), Line),
    146     };
    147     R = MDNode::get(C, Elts);
    148   } else {
    149     Value *Elts[] = {
    150       GetTagConstant(C, dwarf::DW_TAG_imported_module),
    151       Context,
    152       NS,
    153       ConstantInt::get(Type::getInt32Ty(C), Line),
    154       MDString::get(C, Name)
    155     };
    156     R = MDNode::get(C, Elts);
    157   }
    158   DIImportedEntity M(R);
    159   assert(M.Verify() && "Imported module should be valid");
    160   AllImportedModules.push_back(M);
    161   return M;
    162 }
    163 
    164 DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
    165                                                  DINameSpace NS, unsigned Line,
    166                                                  StringRef Name) {
    167   return ::createImportedModule(VMContext, Context, NS, Line, Name,
    168                                 AllImportedModules);
    169 }
    170 
    171 DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
    172                                                  DIImportedEntity NS,
    173                                                  unsigned Line,
    174                                                  StringRef Name) {
    175   return ::createImportedModule(VMContext, Context, NS, Line, Name,
    176                                 AllImportedModules);
    177 }
    178 
    179 DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
    180                                                       DIDescriptor Decl,
    181                                                       unsigned Line) {
    182   Value *Elts[] = {
    183     GetTagConstant(VMContext, dwarf::DW_TAG_imported_declaration),
    184     Context,
    185     Decl,
    186     ConstantInt::get(Type::getInt32Ty(VMContext), Line),
    187   };
    188   DIImportedEntity M(MDNode::get(VMContext, Elts));
    189   assert(M.Verify() && "Imported module should be valid");
    190   AllImportedModules.push_back(M);
    191   return M;
    192 }
    193 
    194 /// createFile - Create a file descriptor to hold debugging information
    195 /// for a file.
    196 DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
    197   Value *Elts[] = {
    198     GetTagConstant(VMContext, dwarf::DW_TAG_file_type),
    199     createFilePathPair(VMContext, Filename, Directory)
    200   };
    201   return DIFile(MDNode::get(VMContext, Elts));
    202 }
    203 
    204 /// createEnumerator - Create a single enumerator value.
    205 DIEnumerator DIBuilder::createEnumerator(StringRef Name, int64_t Val) {
    206   assert(!Name.empty() && "Unable to create enumerator without name");
    207   Value *Elts[] = {
    208     GetTagConstant(VMContext, dwarf::DW_TAG_enumerator),
    209     MDString::get(VMContext, Name),
    210     ConstantInt::get(Type::getInt64Ty(VMContext), Val)
    211   };
    212   return DIEnumerator(MDNode::get(VMContext, Elts));
    213 }
    214 
    215 /// \brief Create a DWARF unspecified type.
    216 DIBasicType DIBuilder::createUnspecifiedType(StringRef Name) {
    217   assert(!Name.empty() && "Unable to create type without name");
    218   // Unspecified types are encoded in DIBasicType format. Line number, filename,
    219   // size, alignment, offset and flags are always empty here.
    220   Value *Elts[] = {
    221     GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_type),
    222     NULL, // Filename
    223     NULL, // Unused
    224     MDString::get(VMContext, Name),
    225     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
    226     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
    227     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
    228     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
    229     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
    230     ConstantInt::get(Type::getInt32Ty(VMContext), 0)  // Encoding
    231   };
    232   return DIBasicType(MDNode::get(VMContext, Elts));
    233 }
    234 
    235 /// \brief Create C++11 nullptr type.
    236 DIBasicType DIBuilder::createNullPtrType() {
    237   return createUnspecifiedType("decltype(nullptr)");
    238 }
    239 
    240 /// createBasicType - Create debugging information entry for a basic
    241 /// type, e.g 'char'.
    242 DIBasicType
    243 DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
    244                            uint64_t AlignInBits, unsigned Encoding) {
    245   assert(!Name.empty() && "Unable to create type without name");
    246   // Basic types are encoded in DIBasicType format. Line number, filename,
    247   // offset and flags are always empty here.
    248   Value *Elts[] = {
    249     GetTagConstant(VMContext, dwarf::DW_TAG_base_type),
    250     NULL, // File/directory name
    251     NULL, // Unused
    252     MDString::get(VMContext, Name),
    253     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
    254     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
    255     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
    256     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
    257     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
    258     ConstantInt::get(Type::getInt32Ty(VMContext), Encoding)
    259   };
    260   return DIBasicType(MDNode::get(VMContext, Elts));
    261 }
    262 
    263 /// createQualifiedType - Create debugging information entry for a qualified
    264 /// type, e.g. 'const int'.
    265 DIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
    266   // Qualified types are encoded in DIDerivedType format.
    267   Value *Elts[] = {
    268     GetTagConstant(VMContext, Tag),
    269     NULL, // Filename
    270     NULL, // Unused
    271     MDString::get(VMContext, StringRef()), // Empty name.
    272     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
    273     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
    274     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
    275     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
    276     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
    277     FromTy
    278   };
    279   return DIDerivedType(MDNode::get(VMContext, Elts));
    280 }
    281 
    282 /// createPointerType - Create debugging information entry for a pointer.
    283 DIDerivedType
    284 DIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits,
    285                              uint64_t AlignInBits, StringRef Name) {
    286   // Pointer types are encoded in DIDerivedType format.
    287   Value *Elts[] = {
    288     GetTagConstant(VMContext, dwarf::DW_TAG_pointer_type),
    289     NULL, // Filename
    290     NULL, // Unused
    291     MDString::get(VMContext, Name),
    292     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
    293     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
    294     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
    295     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
    296     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
    297     PointeeTy
    298   };
    299   return DIDerivedType(MDNode::get(VMContext, Elts));
    300 }
    301 
    302 DIDerivedType DIBuilder::createMemberPointerType(DIType PointeeTy,
    303                                                  DIType Base) {
    304   // Pointer types are encoded in DIDerivedType format.
    305   Value *Elts[] = {
    306     GetTagConstant(VMContext, dwarf::DW_TAG_ptr_to_member_type),
    307     NULL, // Filename
    308     NULL, // Unused
    309     NULL,
    310     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
    311     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
    312     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
    313     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
    314     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
    315     PointeeTy,
    316     Base
    317   };
    318   return DIDerivedType(MDNode::get(VMContext, Elts));
    319 }
    320 
    321 /// createReferenceType - Create debugging information entry for a reference
    322 /// type.
    323 DIDerivedType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) {
    324   assert(RTy.isType() && "Unable to create reference type");
    325   // References are encoded in DIDerivedType format.
    326   Value *Elts[] = {
    327     GetTagConstant(VMContext, Tag),
    328     NULL, // Filename
    329     NULL, // TheCU,
    330     NULL, // Name
    331     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
    332     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
    333     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
    334     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
    335     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
    336     RTy
    337   };
    338   return DIDerivedType(MDNode::get(VMContext, Elts));
    339 }
    340 
    341 /// createTypedef - Create debugging information entry for a typedef.
    342 DIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
    343                                        unsigned LineNo, DIDescriptor Context) {
    344   // typedefs are encoded in DIDerivedType format.
    345   assert(Ty.isType() && "Invalid typedef type!");
    346   Value *Elts[] = {
    347     GetTagConstant(VMContext, dwarf::DW_TAG_typedef),
    348     File.getFileNode(),
    349     getNonCompileUnitScope(Context),
    350     MDString::get(VMContext, Name),
    351     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
    352     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
    353     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
    354     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
    355     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
    356     Ty
    357   };
    358   return DIDerivedType(MDNode::get(VMContext, Elts));
    359 }
    360 
    361 /// createFriend - Create debugging information entry for a 'friend'.
    362 DIDerivedType DIBuilder::createFriend(DIType Ty, DIType FriendTy) {
    363   // typedefs are encoded in DIDerivedType format.
    364   assert(Ty.isType() && "Invalid type!");
    365   assert(FriendTy.isType() && "Invalid friend type!");
    366   Value *Elts[] = {
    367     GetTagConstant(VMContext, dwarf::DW_TAG_friend),
    368     NULL,
    369     Ty,
    370     NULL, // Name
    371     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
    372     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
    373     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
    374     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
    375     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
    376     FriendTy
    377   };
    378   return DIDerivedType(MDNode::get(VMContext, Elts));
    379 }
    380 
    381 /// createInheritance - Create debugging information entry to establish
    382 /// inheritance relationship between two types.
    383 DIDerivedType DIBuilder::createInheritance(
    384     DIType Ty, DIType BaseTy, uint64_t BaseOffset, unsigned Flags) {
    385   assert(Ty.isType() && "Unable to create inheritance");
    386   // TAG_inheritance is encoded in DIDerivedType format.
    387   Value *Elts[] = {
    388     GetTagConstant(VMContext, dwarf::DW_TAG_inheritance),
    389     NULL,
    390     Ty,
    391     NULL, // Name
    392     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
    393     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
    394     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
    395     ConstantInt::get(Type::getInt64Ty(VMContext), BaseOffset),
    396     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
    397     BaseTy
    398   };
    399   return DIDerivedType(MDNode::get(VMContext, Elts));
    400 }
    401 
    402 /// createMemberType - Create debugging information entry for a member.
    403 DIDerivedType DIBuilder::createMemberType(
    404     DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
    405     uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits,
    406     unsigned Flags, DIType Ty) {
    407   // TAG_member is encoded in DIDerivedType format.
    408   Value *Elts[] = {
    409     GetTagConstant(VMContext, dwarf::DW_TAG_member),
    410     File.getFileNode(),
    411     getNonCompileUnitScope(Scope),
    412     MDString::get(VMContext, Name),
    413     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
    414     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
    415     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
    416     ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
    417     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
    418     Ty
    419   };
    420   return DIDerivedType(MDNode::get(VMContext, Elts));
    421 }
    422 
    423 /// createStaticMemberType - Create debugging information entry for a
    424 /// C++ static data member.
    425 DIDerivedType
    426 DIBuilder::createStaticMemberType(DIDescriptor Scope, StringRef Name,
    427                                   DIFile File, unsigned LineNumber,
    428                                   DIType Ty, unsigned Flags,
    429                                   llvm::Value *Val) {
    430   // TAG_member is encoded in DIDerivedType format.
    431   Flags |= DIDescriptor::FlagStaticMember;
    432   Value *Elts[] = {
    433     GetTagConstant(VMContext, dwarf::DW_TAG_member),
    434     File.getFileNode(),
    435     getNonCompileUnitScope(Scope),
    436     MDString::get(VMContext, Name),
    437     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
    438     ConstantInt::get(Type::getInt64Ty(VMContext), 0/*SizeInBits*/),
    439     ConstantInt::get(Type::getInt64Ty(VMContext), 0/*AlignInBits*/),
    440     ConstantInt::get(Type::getInt64Ty(VMContext), 0/*OffsetInBits*/),
    441     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
    442     Ty,
    443     Val
    444   };
    445   return DIDerivedType(MDNode::get(VMContext, Elts));
    446 }
    447 
    448 /// createObjCIVar - Create debugging information entry for Objective-C
    449 /// instance variable.
    450 DIDerivedType
    451 DIBuilder::createObjCIVar(StringRef Name,
    452                           DIFile File, unsigned LineNumber,
    453                           uint64_t SizeInBits, uint64_t AlignInBits,
    454                           uint64_t OffsetInBits, unsigned Flags,
    455                           DIType Ty, StringRef PropertyName,
    456                           StringRef GetterName, StringRef SetterName,
    457                           unsigned PropertyAttributes) {
    458   // TAG_member is encoded in DIDerivedType format.
    459   Value *Elts[] = {
    460     GetTagConstant(VMContext, dwarf::DW_TAG_member),
    461     File.getFileNode(),
    462     getNonCompileUnitScope(File),
    463     MDString::get(VMContext, Name),
    464     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
    465     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
    466     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
    467     ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
    468     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
    469     Ty,
    470     MDString::get(VMContext, PropertyName),
    471     MDString::get(VMContext, GetterName),
    472     MDString::get(VMContext, SetterName),
    473     ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes)
    474   };
    475   return DIDerivedType(MDNode::get(VMContext, Elts));
    476 }
    477 
    478 /// createObjCIVar - Create debugging information entry for Objective-C
    479 /// instance variable.
    480 DIDerivedType
    481 DIBuilder::createObjCIVar(StringRef Name,
    482                           DIFile File, unsigned LineNumber,
    483                           uint64_t SizeInBits, uint64_t AlignInBits,
    484                           uint64_t OffsetInBits, unsigned Flags,
    485                           DIType Ty, MDNode *PropertyNode) {
    486   // TAG_member is encoded in DIDerivedType format.
    487   Value *Elts[] = {
    488     GetTagConstant(VMContext, dwarf::DW_TAG_member),
    489     File.getFileNode(),
    490     getNonCompileUnitScope(File),
    491     MDString::get(VMContext, Name),
    492     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
    493     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
    494     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
    495     ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
    496     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
    497     Ty,
    498     PropertyNode
    499   };
    500   return DIDerivedType(MDNode::get(VMContext, Elts));
    501 }
    502 
    503 /// createObjCProperty - Create debugging information entry for Objective-C
    504 /// property.
    505 DIObjCProperty DIBuilder::createObjCProperty(StringRef Name,
    506                                              DIFile File, unsigned LineNumber,
    507                                              StringRef GetterName,
    508                                              StringRef SetterName,
    509                                              unsigned PropertyAttributes,
    510                                              DIType Ty) {
    511   Value *Elts[] = {
    512     GetTagConstant(VMContext, dwarf::DW_TAG_APPLE_property),
    513     MDString::get(VMContext, Name),
    514     File,
    515     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
    516     MDString::get(VMContext, GetterName),
    517     MDString::get(VMContext, SetterName),
    518     ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes),
    519     Ty
    520   };
    521   return DIObjCProperty(MDNode::get(VMContext, Elts));
    522 }
    523 
    524 /// createTemplateTypeParameter - Create debugging information for template
    525 /// type parameter.
    526 DITemplateTypeParameter
    527 DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
    528                                        DIType Ty, MDNode *File, unsigned LineNo,
    529                                        unsigned ColumnNo) {
    530   Value *Elts[] = {
    531     GetTagConstant(VMContext, dwarf::DW_TAG_template_type_parameter),
    532     getNonCompileUnitScope(Context),
    533     MDString::get(VMContext, Name),
    534     Ty,
    535     File,
    536     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
    537     ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
    538   };
    539   return DITemplateTypeParameter(MDNode::get(VMContext, Elts));
    540 }
    541 
    542 DITemplateValueParameter
    543 DIBuilder::createTemplateValueParameter(unsigned Tag, DIDescriptor Context,
    544                                         StringRef Name, DIType Ty,
    545                                         Value *Val, MDNode *File,
    546                                         unsigned LineNo,
    547                                         unsigned ColumnNo) {
    548   Value *Elts[] = {
    549     GetTagConstant(VMContext, Tag),
    550     getNonCompileUnitScope(Context),
    551     MDString::get(VMContext, Name),
    552     Ty,
    553     Val,
    554     File,
    555     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
    556     ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
    557   };
    558   return DITemplateValueParameter(MDNode::get(VMContext, Elts));
    559 }
    560 
    561 /// createTemplateValueParameter - Create debugging information for template
    562 /// value parameter.
    563 DITemplateValueParameter
    564 DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
    565                                         DIType Ty, Value *Val,
    566                                         MDNode *File, unsigned LineNo,
    567                                         unsigned ColumnNo) {
    568   return createTemplateValueParameter(dwarf::DW_TAG_template_value_parameter,
    569                                       Context, Name, Ty, Val, File, LineNo,
    570                                       ColumnNo);
    571 }
    572 
    573 DITemplateValueParameter
    574 DIBuilder::createTemplateTemplateParameter(DIDescriptor Context, StringRef Name,
    575                                            DIType Ty, StringRef Val,
    576                                            MDNode *File, unsigned LineNo,
    577                                            unsigned ColumnNo) {
    578   return createTemplateValueParameter(
    579       dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty,
    580       MDString::get(VMContext, Val), File, LineNo, ColumnNo);
    581 }
    582 
    583 DITemplateValueParameter
    584 DIBuilder::createTemplateParameterPack(DIDescriptor Context, StringRef Name,
    585                                        DIType Ty, DIArray Val,
    586                                        MDNode *File, unsigned LineNo,
    587                                        unsigned ColumnNo) {
    588   return createTemplateValueParameter(dwarf::DW_TAG_GNU_template_parameter_pack,
    589                                       Context, Name, Ty, Val, File, LineNo,
    590                                       ColumnNo);
    591 }
    592 
    593 /// createClassType - Create debugging information entry for a class.
    594 DICompositeType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
    595                                            DIFile File, unsigned LineNumber,
    596                                            uint64_t SizeInBits,
    597                                            uint64_t AlignInBits,
    598                                            uint64_t OffsetInBits,
    599                                            unsigned Flags, DIType DerivedFrom,
    600                                            DIArray Elements,
    601                                            MDNode *VTableHolder,
    602                                            MDNode *TemplateParams) {
    603   assert((!Context || Context.isScope() || Context.isType()) &&
    604          "createClassType should be called with a valid Context");
    605   // TAG_class_type is encoded in DICompositeType format.
    606   Value *Elts[] = {
    607     GetTagConstant(VMContext, dwarf::DW_TAG_class_type),
    608     File.getFileNode(),
    609     getNonCompileUnitScope(Context),
    610     MDString::get(VMContext, Name),
    611     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
    612     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
    613     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
    614     ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits),
    615     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
    616     DerivedFrom,
    617     Elements,
    618     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    619     VTableHolder,
    620     TemplateParams
    621   };
    622   DICompositeType R(MDNode::get(VMContext, Elts));
    623   assert(R.isCompositeType() &&
    624          "createClassType should return a DICompositeType");
    625   return R;
    626 }
    627 
    628 /// createStructType - Create debugging information entry for a struct.
    629 DICompositeType DIBuilder::createStructType(DIDescriptor Context,
    630                                             StringRef Name, DIFile File,
    631                                             unsigned LineNumber,
    632                                             uint64_t SizeInBits,
    633                                             uint64_t AlignInBits,
    634                                             unsigned Flags, DIType DerivedFrom,
    635                                             DIArray Elements,
    636                                             unsigned RunTimeLang,
    637                                             MDNode *VTableHolder) {
    638  // TAG_structure_type is encoded in DICompositeType format.
    639   Value *Elts[] = {
    640     GetTagConstant(VMContext, dwarf::DW_TAG_structure_type),
    641     File.getFileNode(),
    642     getNonCompileUnitScope(Context),
    643     MDString::get(VMContext, Name),
    644     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
    645     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
    646     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
    647     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    648     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
    649     DerivedFrom,
    650     Elements,
    651     ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
    652     VTableHolder,
    653     NULL,
    654   };
    655   DICompositeType R(MDNode::get(VMContext, Elts));
    656   assert(R.isCompositeType() &&
    657          "createStructType should return a DICompositeType");
    658   return R;
    659 }
    660 
    661 /// createUnionType - Create debugging information entry for an union.
    662 DICompositeType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
    663                                            DIFile File, unsigned LineNumber,
    664                                            uint64_t SizeInBits,
    665                                            uint64_t AlignInBits, unsigned Flags,
    666                                            DIArray Elements,
    667                                            unsigned RunTimeLang) {
    668   // TAG_union_type is encoded in DICompositeType format.
    669   Value *Elts[] = {
    670     GetTagConstant(VMContext, dwarf::DW_TAG_union_type),
    671     File.getFileNode(),
    672     getNonCompileUnitScope(Scope),
    673     MDString::get(VMContext, Name),
    674     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
    675     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
    676     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
    677     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
    678     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
    679     NULL,
    680     Elements,
    681     ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
    682     Constant::getNullValue(Type::getInt32Ty(VMContext)),
    683     NULL
    684   };
    685   return DICompositeType(MDNode::get(VMContext, Elts));
    686 }
    687 
    688 /// createSubroutineType - Create subroutine type.
    689 DICompositeType
    690 DIBuilder::createSubroutineType(DIFile File, DIArray ParameterTypes) {
    691   // TAG_subroutine_type is encoded in DICompositeType format.
    692   Value *Elts[] = {
    693     GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type),
    694     Constant::getNullValue(Type::getInt32Ty(VMContext)),
    695     Constant::getNullValue(Type::getInt32Ty(VMContext)),
    696     MDString::get(VMContext, ""),
    697     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    698     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
    699     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
    700     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
    701     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    702     NULL,
    703     ParameterTypes,
    704     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    705     Constant::getNullValue(Type::getInt32Ty(VMContext))
    706   };
    707   return DICompositeType(MDNode::get(VMContext, Elts));
    708 }
    709 
    710 /// createEnumerationType - Create debugging information entry for an
    711 /// enumeration.
    712 DICompositeType DIBuilder::createEnumerationType(
    713     DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
    714     uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements,
    715     DIType UnderlyingType) {
    716   // TAG_enumeration_type is encoded in DICompositeType format.
    717   Value *Elts[] = {
    718     GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type),
    719     File.getFileNode(),
    720     getNonCompileUnitScope(Scope),
    721     MDString::get(VMContext, Name),
    722     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
    723     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
    724     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
    725     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    726     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    727     UnderlyingType,
    728     Elements,
    729     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    730     Constant::getNullValue(Type::getInt32Ty(VMContext))
    731   };
    732   MDNode *Node = MDNode::get(VMContext, Elts);
    733   AllEnumTypes.push_back(Node);
    734   return DICompositeType(Node);
    735 }
    736 
    737 /// createArrayType - Create debugging information entry for an array.
    738 DICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
    739                                            DIType Ty, DIArray Subscripts) {
    740   // TAG_array_type is encoded in DICompositeType format.
    741   Value *Elts[] = {
    742     GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
    743     NULL, // Filename/Directory,
    744     NULL, // Unused
    745     MDString::get(VMContext, ""),
    746     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    747     ConstantInt::get(Type::getInt64Ty(VMContext), Size),
    748     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
    749     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    750     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    751     Ty,
    752     Subscripts,
    753     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    754     Constant::getNullValue(Type::getInt32Ty(VMContext))
    755   };
    756   return DICompositeType(MDNode::get(VMContext, Elts));
    757 }
    758 
    759 /// createVectorType - Create debugging information entry for a vector.
    760 DICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
    761                                             DIType Ty, DIArray Subscripts) {
    762 
    763   // A vector is an array type with the FlagVector flag applied.
    764   Value *Elts[] = {
    765     GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
    766     NULL, // Filename/Directory,
    767     NULL, // Unused
    768     MDString::get(VMContext, ""),
    769     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    770     ConstantInt::get(Type::getInt64Ty(VMContext), Size),
    771     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
    772     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    773     ConstantInt::get(Type::getInt32Ty(VMContext), DIType::FlagVector),
    774     Ty,
    775     Subscripts,
    776     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    777     Constant::getNullValue(Type::getInt32Ty(VMContext))
    778   };
    779   return DICompositeType(MDNode::get(VMContext, Elts));
    780 }
    781 
    782 /// createArtificialType - Create a new DIType with "artificial" flag set.
    783 DIType DIBuilder::createArtificialType(DIType Ty) {
    784   if (Ty.isArtificial())
    785     return Ty;
    786 
    787   SmallVector<Value *, 9> Elts;
    788   MDNode *N = Ty;
    789   assert (N && "Unexpected input DIType!");
    790   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
    791     if (Value *V = N->getOperand(i))
    792       Elts.push_back(V);
    793     else
    794       Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
    795   }
    796 
    797   unsigned CurFlags = Ty.getFlags();
    798   CurFlags = CurFlags | DIType::FlagArtificial;
    799 
    800   // Flags are stored at this slot.
    801   Elts[8] =  ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
    802 
    803   return DIType(MDNode::get(VMContext, Elts));
    804 }
    805 
    806 /// createObjectPointerType - Create a new type with both the object pointer
    807 /// and artificial flags set.
    808 DIType DIBuilder::createObjectPointerType(DIType Ty) {
    809   if (Ty.isObjectPointer())
    810     return Ty;
    811 
    812   SmallVector<Value *, 9> Elts;
    813   MDNode *N = Ty;
    814   assert (N && "Unexpected input DIType!");
    815   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
    816     if (Value *V = N->getOperand(i))
    817       Elts.push_back(V);
    818     else
    819       Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
    820   }
    821 
    822   unsigned CurFlags = Ty.getFlags();
    823   CurFlags = CurFlags | (DIType::FlagObjectPointer | DIType::FlagArtificial);
    824 
    825   // Flags are stored at this slot.
    826   Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
    827 
    828   return DIType(MDNode::get(VMContext, Elts));
    829 }
    830 
    831 /// retainType - Retain DIType in a module even if it is not referenced
    832 /// through debug info anchors.
    833 void DIBuilder::retainType(DIType T) {
    834   AllRetainTypes.push_back(T);
    835 }
    836 
    837 /// createUnspecifiedParameter - Create unspeicified type descriptor
    838 /// for the subroutine type.
    839 DIDescriptor DIBuilder::createUnspecifiedParameter() {
    840   Value *Elts[] = {
    841     GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters)
    842   };
    843   return DIDescriptor(MDNode::get(VMContext, Elts));
    844 }
    845 
    846 /// createForwardDecl - Create a temporary forward-declared type that
    847 /// can be RAUW'd if the full type is seen.
    848 DIType DIBuilder::createForwardDecl(unsigned Tag, StringRef Name,
    849                                     DIDescriptor Scope, DIFile F,
    850                                     unsigned Line, unsigned RuntimeLang,
    851                                     uint64_t SizeInBits,
    852                                     uint64_t AlignInBits) {
    853   // Create a temporary MDNode.
    854   Value *Elts[] = {
    855     GetTagConstant(VMContext, Tag),
    856     F.getFileNode(),
    857     getNonCompileUnitScope(Scope),
    858     MDString::get(VMContext, Name),
    859     ConstantInt::get(Type::getInt32Ty(VMContext), Line),
    860     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
    861     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
    862     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
    863     ConstantInt::get(Type::getInt32Ty(VMContext),
    864                      DIDescriptor::FlagFwdDecl),
    865     NULL,
    866     DIArray(),
    867     ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang)
    868   };
    869   MDNode *Node = MDNode::getTemporary(VMContext, Elts);
    870   DIType RetTy(Node);
    871   assert(RetTy.isType() &&
    872          "createForwardDecl result should be a DIType");
    873   return RetTy;
    874 }
    875 
    876 /// getOrCreateArray - Get a DIArray, create one if required.
    877 DIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) {
    878   if (Elements.empty()) {
    879     Value *Null = Constant::getNullValue(Type::getInt32Ty(VMContext));
    880     return DIArray(MDNode::get(VMContext, Null));
    881   }
    882   return DIArray(MDNode::get(VMContext, Elements));
    883 }
    884 
    885 /// getOrCreateSubrange - Create a descriptor for a value range.  This
    886 /// implicitly uniques the values returned.
    887 DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
    888   Value *Elts[] = {
    889     GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type),
    890     ConstantInt::get(Type::getInt64Ty(VMContext), Lo),
    891     ConstantInt::get(Type::getInt64Ty(VMContext), Count)
    892   };
    893 
    894   return DISubrange(MDNode::get(VMContext, Elts));
    895 }
    896 
    897 /// \brief Create a new descriptor for the specified global.
    898 DIGlobalVariable DIBuilder::
    899 createGlobalVariable(StringRef Name, StringRef LinkageName, DIFile F,
    900                      unsigned LineNumber, DIType Ty, bool isLocalToUnit,
    901                      Value *Val) {
    902   Value *Elts[] = {
    903     GetTagConstant(VMContext, dwarf::DW_TAG_variable),
    904     Constant::getNullValue(Type::getInt32Ty(VMContext)),
    905     NULL, // TheCU,
    906     MDString::get(VMContext, Name),
    907     MDString::get(VMContext, Name),
    908     MDString::get(VMContext, LinkageName),
    909     F,
    910     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
    911     Ty,
    912     ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
    913     ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
    914     Val,
    915     DIDescriptor()
    916   };
    917   MDNode *Node = MDNode::get(VMContext, Elts);
    918   AllGVs.push_back(Node);
    919   return DIGlobalVariable(Node);
    920 }
    921 
    922 /// \brief Create a new descriptor for the specified global.
    923 DIGlobalVariable DIBuilder::
    924 createGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber,
    925                      DIType Ty, bool isLocalToUnit, Value *Val) {
    926   return createGlobalVariable(Name, Name, F, LineNumber, Ty, isLocalToUnit,
    927                               Val);
    928 }
    929 
    930 /// createStaticVariable - Create a new descriptor for the specified static
    931 /// variable.
    932 DIGlobalVariable DIBuilder::
    933 createStaticVariable(DIDescriptor Context, StringRef Name,
    934                      StringRef LinkageName, DIFile F, unsigned LineNumber,
    935                      DIType Ty, bool isLocalToUnit, Value *Val, MDNode *Decl) {
    936   Value *Elts[] = {
    937     GetTagConstant(VMContext, dwarf::DW_TAG_variable),
    938     Constant::getNullValue(Type::getInt32Ty(VMContext)),
    939     getNonCompileUnitScope(Context),
    940     MDString::get(VMContext, Name),
    941     MDString::get(VMContext, Name),
    942     MDString::get(VMContext, LinkageName),
    943     F,
    944     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
    945     Ty,
    946     ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
    947     ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
    948     Val,
    949     DIDescriptor(Decl)
    950   };
    951   MDNode *Node = MDNode::get(VMContext, Elts);
    952   AllGVs.push_back(Node);
    953   return DIGlobalVariable(Node);
    954 }
    955 
    956 /// createVariable - Create a new descriptor for the specified variable.
    957 DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
    958                                           StringRef Name, DIFile File,
    959                                           unsigned LineNo, DIType Ty,
    960                                           bool AlwaysPreserve, unsigned Flags,
    961                                           unsigned ArgNo) {
    962   DIDescriptor Context(getNonCompileUnitScope(Scope));
    963   assert((!Context || Context.isScope()) &&
    964          "createLocalVariable should be called with a valid Context");
    965   assert(Ty.isType() &&
    966          "createLocalVariable should be called with a valid type");
    967   Value *Elts[] = {
    968     GetTagConstant(VMContext, Tag),
    969     getNonCompileUnitScope(Scope),
    970     MDString::get(VMContext, Name),
    971     File,
    972     ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))),
    973     Ty,
    974     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
    975     Constant::getNullValue(Type::getInt32Ty(VMContext))
    976   };
    977   MDNode *Node = MDNode::get(VMContext, Elts);
    978   if (AlwaysPreserve) {
    979     // The optimizer may remove local variable. If there is an interest
    980     // to preserve variable info in such situation then stash it in a
    981     // named mdnode.
    982     DISubprogram Fn(getDISubprogram(Scope));
    983     NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn);
    984     FnLocals->addOperand(Node);
    985   }
    986   DIVariable RetVar(Node);
    987   assert(RetVar.isVariable() &&
    988          "createLocalVariable should return a valid DIVariable");
    989   return RetVar;
    990 }
    991 
    992 /// createComplexVariable - Create a new descriptor for the specified variable
    993 /// which has a complex address expression for its address.
    994 DIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope,
    995                                             StringRef Name, DIFile F,
    996                                             unsigned LineNo,
    997                                             DIType Ty, ArrayRef<Value *> Addr,
    998                                             unsigned ArgNo) {
    999   SmallVector<Value *, 15> Elts;
   1000   Elts.push_back(GetTagConstant(VMContext, Tag));
   1001   Elts.push_back(getNonCompileUnitScope(Scope)),
   1002   Elts.push_back(MDString::get(VMContext, Name));
   1003   Elts.push_back(F);
   1004   Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext),
   1005                                   (LineNo | (ArgNo << 24))));
   1006   Elts.push_back(Ty);
   1007   Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
   1008   Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
   1009   Elts.append(Addr.begin(), Addr.end());
   1010 
   1011   return DIVariable(MDNode::get(VMContext, Elts));
   1012 }
   1013 
   1014 /// createFunction - Create a new descriptor for the specified function.
   1015 DISubprogram DIBuilder::createFunction(DIDescriptor Context,
   1016                                        StringRef Name,
   1017                                        StringRef LinkageName,
   1018                                        DIFile File, unsigned LineNo,
   1019                                        DICompositeType Ty,
   1020                                        bool isLocalToUnit, bool isDefinition,
   1021                                        unsigned ScopeLine,
   1022                                        unsigned Flags, bool isOptimized,
   1023                                        Function *Fn,
   1024                                        MDNode *TParams,
   1025                                        MDNode *Decl) {
   1026   assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
   1027          "function types should be subroutines");
   1028   Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
   1029   Value *Elts[] = {
   1030     GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
   1031     File.getFileNode(),
   1032     getNonCompileUnitScope(Context),
   1033     MDString::get(VMContext, Name),
   1034     MDString::get(VMContext, Name),
   1035     MDString::get(VMContext, LinkageName),
   1036     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
   1037     Ty,
   1038     ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
   1039     ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
   1040     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
   1041     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
   1042     NULL,
   1043     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
   1044     ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
   1045     Fn,
   1046     TParams,
   1047     Decl,
   1048     MDNode::getTemporary(VMContext, TElts),
   1049     ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine)
   1050   };
   1051   MDNode *Node = MDNode::get(VMContext, Elts);
   1052 
   1053   // Create a named metadata so that we do not lose this mdnode.
   1054   if (isDefinition)
   1055     AllSubprograms.push_back(Node);
   1056   DISubprogram S(Node);
   1057   assert(S.isSubprogram() && "createFunction should return a valid DISubprogram");
   1058   return S;
   1059 }
   1060 
   1061 /// createMethod - Create a new descriptor for the specified C++ method.
   1062 DISubprogram DIBuilder::createMethod(DIDescriptor Context,
   1063                                      StringRef Name,
   1064                                      StringRef LinkageName,
   1065                                      DIFile F,
   1066                                      unsigned LineNo, DICompositeType Ty,
   1067                                      bool isLocalToUnit,
   1068                                      bool isDefinition,
   1069                                      unsigned VK, unsigned VIndex,
   1070                                      MDNode *VTableHolder,
   1071                                      unsigned Flags,
   1072                                      bool isOptimized,
   1073                                      Function *Fn,
   1074                                      MDNode *TParam) {
   1075   assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
   1076          "function types should be subroutines");
   1077   Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
   1078   Value *Elts[] = {
   1079     GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
   1080     F.getFileNode(),
   1081     getNonCompileUnitScope(Context),
   1082     MDString::get(VMContext, Name),
   1083     MDString::get(VMContext, Name),
   1084     MDString::get(VMContext, LinkageName),
   1085     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
   1086     Ty,
   1087     ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
   1088     ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
   1089     ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK),
   1090     ConstantInt::get(Type::getInt32Ty(VMContext), VIndex),
   1091     VTableHolder,
   1092     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
   1093     ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
   1094     Fn,
   1095     TParam,
   1096     Constant::getNullValue(Type::getInt32Ty(VMContext)),
   1097     MDNode::getTemporary(VMContext, TElts),
   1098     // FIXME: Do we want to use different scope/lines?
   1099     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
   1100   };
   1101   MDNode *Node = MDNode::get(VMContext, Elts);
   1102   if (isDefinition)
   1103     AllSubprograms.push_back(Node);
   1104   DISubprogram S(Node);
   1105   assert(S.isSubprogram() && "createMethod should return a valid DISubprogram");
   1106   return S;
   1107 }
   1108 
   1109 /// createNameSpace - This creates new descriptor for a namespace
   1110 /// with the specified parent scope.
   1111 DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
   1112                                        DIFile File, unsigned LineNo) {
   1113   Value *Elts[] = {
   1114     GetTagConstant(VMContext, dwarf::DW_TAG_namespace),
   1115     File.getFileNode(),
   1116     getNonCompileUnitScope(Scope),
   1117     MDString::get(VMContext, Name),
   1118     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
   1119   };
   1120   DINameSpace R(MDNode::get(VMContext, Elts));
   1121   assert(R.Verify() &&
   1122          "createNameSpace should return a verifiable DINameSpace");
   1123   return R;
   1124 }
   1125 
   1126 /// createLexicalBlockFile - This creates a new MDNode that encapsulates
   1127 /// an existing scope with a new filename.
   1128 DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
   1129                                                      DIFile File) {
   1130   Value *Elts[] = {
   1131     GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
   1132     File.getFileNode(),
   1133     Scope
   1134   };
   1135   DILexicalBlockFile R(MDNode::get(VMContext, Elts));
   1136   assert(
   1137       R.Verify() &&
   1138       "createLexicalBlockFile should return a verifiable DILexicalBlockFile");
   1139   return R;
   1140 }
   1141 
   1142 DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
   1143                                              unsigned Line, unsigned Col) {
   1144   // Defeat MDNode uniquing for lexical blocks by using unique id.
   1145   static unsigned int unique_id = 0;
   1146   Value *Elts[] = {
   1147     GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
   1148     File.getFileNode(),
   1149     getNonCompileUnitScope(Scope),
   1150     ConstantInt::get(Type::getInt32Ty(VMContext), Line),
   1151     ConstantInt::get(Type::getInt32Ty(VMContext), Col),
   1152     ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++)
   1153   };
   1154   DILexicalBlock R(MDNode::get(VMContext, Elts));
   1155   assert(R.Verify() &&
   1156          "createLexicalBlock should return a verifiable DILexicalBlock");
   1157   return R;
   1158 }
   1159 
   1160 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
   1161 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
   1162                                       Instruction *InsertBefore) {
   1163   assert(Storage && "no storage passed to dbg.declare");
   1164   assert(VarInfo.isVariable() &&
   1165          "empty or invalid DIVariable passed to dbg.declare");
   1166   if (!DeclareFn)
   1167     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
   1168 
   1169   Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
   1170   return CallInst::Create(DeclareFn, Args, "", InsertBefore);
   1171 }
   1172 
   1173 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
   1174 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
   1175                                       BasicBlock *InsertAtEnd) {
   1176   assert(Storage && "no storage passed to dbg.declare");
   1177   assert(VarInfo.isVariable() &&
   1178          "empty or invalid DIVariable passed to dbg.declare");
   1179   if (!DeclareFn)
   1180     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
   1181 
   1182   Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
   1183 
   1184   // If this block already has a terminator then insert this intrinsic
   1185   // before the terminator.
   1186   if (TerminatorInst *T = InsertAtEnd->getTerminator())
   1187     return CallInst::Create(DeclareFn, Args, "", T);
   1188   else
   1189     return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
   1190 }
   1191 
   1192 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
   1193 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
   1194                                                 DIVariable VarInfo,
   1195                                                 Instruction *InsertBefore) {
   1196   assert(V && "no value passed to dbg.value");
   1197   assert(VarInfo.isVariable() &&
   1198          "empty or invalid DIVariable passed to dbg.value");
   1199   if (!ValueFn)
   1200     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
   1201 
   1202   Value *Args[] = { MDNode::get(V->getContext(), V),
   1203                     ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
   1204                     VarInfo };
   1205   return CallInst::Create(ValueFn, Args, "", InsertBefore);
   1206 }
   1207 
   1208 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
   1209 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
   1210                                                 DIVariable VarInfo,
   1211                                                 BasicBlock *InsertAtEnd) {
   1212   assert(V && "no value passed to dbg.value");
   1213   assert(VarInfo.isVariable() &&
   1214          "empty or invalid DIVariable passed to dbg.value");
   1215   if (!ValueFn)
   1216     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
   1217 
   1218   Value *Args[] = { MDNode::get(V->getContext(), V),
   1219                     ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
   1220                     VarInfo };
   1221   return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
   1222 }
   1223