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/Constants.h" 16 #include "llvm/DebugInfo.h" 17 #include "llvm/IntrinsicInst.h" 18 #include "llvm/Module.h" 19 #include "llvm/ADT/STLExtras.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()), TheCU(0), 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 66 /// getNonCompileUnitScope - If N is compile unit return NULL otherwise return 67 /// N. 68 static MDNode *getNonCompileUnitScope(MDNode *N) { 69 if (DIDescriptor(N).isCompileUnit()) 70 return NULL; 71 return N; 72 } 73 74 /// createCompileUnit - A CompileUnit provides an anchor for all debugging 75 /// information generated during this instance of compilation. 76 void DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename, 77 StringRef Directory, StringRef Producer, 78 bool isOptimized, StringRef Flags, 79 unsigned RunTimeVer) { 80 assert(((Lang <= dwarf::DW_LANG_Python && Lang >= dwarf::DW_LANG_C89) || 81 (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) && 82 "Invalid Language tag"); 83 assert(!Filename.empty() && 84 "Unable to create compile unit without filename"); 85 Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 86 TempEnumTypes = MDNode::getTemporary(VMContext, TElts); 87 Value *THElts[] = { TempEnumTypes }; 88 MDNode *EnumHolder = MDNode::get(VMContext, THElts); 89 90 TempRetainTypes = MDNode::getTemporary(VMContext, TElts); 91 Value *TRElts[] = { TempRetainTypes }; 92 MDNode *RetainHolder = MDNode::get(VMContext, TRElts); 93 94 TempSubprograms = MDNode::getTemporary(VMContext, TElts); 95 Value *TSElts[] = { TempSubprograms }; 96 MDNode *SPHolder = MDNode::get(VMContext, TSElts); 97 98 TempGVs = MDNode::getTemporary(VMContext, TElts); 99 Value *TVElts[] = { TempGVs }; 100 MDNode *GVHolder = MDNode::get(VMContext, TVElts); 101 102 Value *Elts[] = { 103 GetTagConstant(VMContext, dwarf::DW_TAG_compile_unit), 104 Constant::getNullValue(Type::getInt32Ty(VMContext)), 105 ConstantInt::get(Type::getInt32Ty(VMContext), Lang), 106 MDString::get(VMContext, Filename), 107 MDString::get(VMContext, Directory), 108 MDString::get(VMContext, Producer), 109 // Deprecate isMain field. 110 ConstantInt::get(Type::getInt1Ty(VMContext), true), // isMain 111 ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 112 MDString::get(VMContext, Flags), 113 ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer), 114 EnumHolder, 115 RetainHolder, 116 SPHolder, 117 GVHolder 118 }; 119 TheCU = DICompileUnit(MDNode::get(VMContext, Elts)); 120 121 // Create a named metadata so that it is easier to find cu in a module. 122 NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu"); 123 NMD->addOperand(TheCU); 124 } 125 126 /// createFile - Create a file descriptor to hold debugging information 127 /// for a file. 128 DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) { 129 assert(TheCU && "Unable to create DW_TAG_file_type without CompileUnit"); 130 assert(!Filename.empty() && "Unable to create file without name"); 131 Value *Elts[] = { 132 GetTagConstant(VMContext, dwarf::DW_TAG_file_type), 133 MDString::get(VMContext, Filename), 134 MDString::get(VMContext, Directory), 135 NULL // TheCU 136 }; 137 return DIFile(MDNode::get(VMContext, Elts)); 138 } 139 140 /// createEnumerator - Create a single enumerator value. 141 DIEnumerator DIBuilder::createEnumerator(StringRef Name, uint64_t Val) { 142 assert(!Name.empty() && "Unable to create enumerator without name"); 143 Value *Elts[] = { 144 GetTagConstant(VMContext, dwarf::DW_TAG_enumerator), 145 MDString::get(VMContext, Name), 146 ConstantInt::get(Type::getInt64Ty(VMContext), Val) 147 }; 148 return DIEnumerator(MDNode::get(VMContext, Elts)); 149 } 150 151 /// createNullPtrType - Create C++0x nullptr type. 152 DIType DIBuilder::createNullPtrType(StringRef Name) { 153 assert(!Name.empty() && "Unable to create type without name"); 154 // nullptr is encoded in DIBasicType format. Line number, filename, 155 // ,size, alignment, offset and flags are always empty here. 156 Value *Elts[] = { 157 GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_type), 158 NULL, //TheCU, 159 MDString::get(VMContext, Name), 160 NULL, // Filename 161 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 162 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 163 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 164 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 165 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags; 166 ConstantInt::get(Type::getInt32Ty(VMContext), 0) // Encoding 167 }; 168 return DIType(MDNode::get(VMContext, Elts)); 169 } 170 171 /// createBasicType - Create debugging information entry for a basic 172 /// type, e.g 'char'. 173 DIType DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits, 174 uint64_t AlignInBits, 175 unsigned Encoding) { 176 assert(!Name.empty() && "Unable to create type without name"); 177 // Basic types are encoded in DIBasicType format. Line number, filename, 178 // offset and flags are always empty here. 179 Value *Elts[] = { 180 GetTagConstant(VMContext, dwarf::DW_TAG_base_type), 181 NULL, //TheCU, 182 MDString::get(VMContext, Name), 183 NULL, // Filename 184 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 185 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 186 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 187 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 188 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags; 189 ConstantInt::get(Type::getInt32Ty(VMContext), Encoding) 190 }; 191 return DIType(MDNode::get(VMContext, Elts)); 192 } 193 194 /// createQualifiedType - Create debugging information entry for a qualified 195 /// type, e.g. 'const int'. 196 DIType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) { 197 // Qualified types are encoded in DIDerivedType format. 198 Value *Elts[] = { 199 GetTagConstant(VMContext, Tag), 200 NULL, //TheCU, 201 MDString::get(VMContext, StringRef()), // Empty name. 202 NULL, // Filename 203 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 204 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 205 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 206 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 207 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 208 FromTy 209 }; 210 return DIType(MDNode::get(VMContext, Elts)); 211 } 212 213 /// createPointerType - Create debugging information entry for a pointer. 214 DIType DIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits, 215 uint64_t AlignInBits, StringRef Name) { 216 // Pointer types are encoded in DIDerivedType format. 217 Value *Elts[] = { 218 GetTagConstant(VMContext, dwarf::DW_TAG_pointer_type), 219 NULL, //TheCU, 220 MDString::get(VMContext, Name), 221 NULL, // Filename 222 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 223 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 224 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 225 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 226 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 227 PointeeTy 228 }; 229 return DIType(MDNode::get(VMContext, Elts)); 230 } 231 232 /// createReferenceType - Create debugging information entry for a reference 233 /// type. 234 DIType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) { 235 assert(RTy.Verify() && "Unable to create reference type"); 236 // References are encoded in DIDerivedType format. 237 Value *Elts[] = { 238 GetTagConstant(VMContext, Tag), 239 NULL, // TheCU, 240 NULL, // Name 241 NULL, // Filename 242 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 243 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 244 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 245 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 246 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 247 RTy 248 }; 249 return DIType(MDNode::get(VMContext, Elts)); 250 } 251 252 /// createTypedef - Create debugging information entry for a typedef. 253 DIType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File, 254 unsigned LineNo, DIDescriptor Context) { 255 // typedefs are encoded in DIDerivedType format. 256 assert(Ty.Verify() && "Invalid typedef type!"); 257 Value *Elts[] = { 258 GetTagConstant(VMContext, dwarf::DW_TAG_typedef), 259 getNonCompileUnitScope(Context), 260 MDString::get(VMContext, Name), 261 File, 262 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 263 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 264 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 265 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 266 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 267 Ty 268 }; 269 return DIType(MDNode::get(VMContext, Elts)); 270 } 271 272 /// createFriend - Create debugging information entry for a 'friend'. 273 DIType DIBuilder::createFriend(DIType Ty, DIType FriendTy) { 274 // typedefs are encoded in DIDerivedType format. 275 assert(Ty.Verify() && "Invalid type!"); 276 assert(FriendTy.Verify() && "Invalid friend type!"); 277 Value *Elts[] = { 278 GetTagConstant(VMContext, dwarf::DW_TAG_friend), 279 Ty, 280 NULL, // Name 281 Ty.getFile(), 282 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 283 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 284 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 285 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 286 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 287 FriendTy 288 }; 289 return DIType(MDNode::get(VMContext, Elts)); 290 } 291 292 /// createInheritance - Create debugging information entry to establish 293 /// inheritance relationship between two types. 294 DIType DIBuilder::createInheritance(DIType Ty, DIType BaseTy, 295 uint64_t BaseOffset, unsigned Flags) { 296 assert(Ty.Verify() && "Unable to create inheritance"); 297 // TAG_inheritance is encoded in DIDerivedType format. 298 Value *Elts[] = { 299 GetTagConstant(VMContext, dwarf::DW_TAG_inheritance), 300 Ty, 301 NULL, // Name 302 Ty.getFile(), 303 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 304 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 305 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 306 ConstantInt::get(Type::getInt64Ty(VMContext), BaseOffset), 307 ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 308 BaseTy 309 }; 310 return DIType(MDNode::get(VMContext, Elts)); 311 } 312 313 /// createMemberType - Create debugging information entry for a member. 314 DIType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name, 315 DIFile File, unsigned LineNumber, 316 uint64_t SizeInBits, uint64_t AlignInBits, 317 uint64_t OffsetInBits, unsigned Flags, 318 DIType Ty) { 319 // TAG_member is encoded in DIDerivedType format. 320 Value *Elts[] = { 321 GetTagConstant(VMContext, dwarf::DW_TAG_member), 322 getNonCompileUnitScope(Scope), 323 MDString::get(VMContext, Name), 324 File, 325 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 326 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 327 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 328 ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 329 ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 330 Ty 331 }; 332 return DIType(MDNode::get(VMContext, Elts)); 333 } 334 335 /// createObjCIVar - Create debugging information entry for Objective-C 336 /// instance variable. 337 DIType DIBuilder::createObjCIVar(StringRef Name, 338 DIFile File, unsigned LineNumber, 339 uint64_t SizeInBits, uint64_t AlignInBits, 340 uint64_t OffsetInBits, unsigned Flags, 341 DIType Ty, StringRef PropertyName, 342 StringRef GetterName, StringRef SetterName, 343 unsigned PropertyAttributes) { 344 // TAG_member is encoded in DIDerivedType format. 345 Value *Elts[] = { 346 GetTagConstant(VMContext, dwarf::DW_TAG_member), 347 getNonCompileUnitScope(File), 348 MDString::get(VMContext, Name), 349 File, 350 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 351 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 352 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 353 ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 354 ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 355 Ty, 356 MDString::get(VMContext, PropertyName), 357 MDString::get(VMContext, GetterName), 358 MDString::get(VMContext, SetterName), 359 ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes) 360 }; 361 return DIType(MDNode::get(VMContext, Elts)); 362 } 363 364 /// createObjCIVar - Create debugging information entry for Objective-C 365 /// instance variable. 366 DIType DIBuilder::createObjCIVar(StringRef Name, 367 DIFile File, unsigned LineNumber, 368 uint64_t SizeInBits, uint64_t AlignInBits, 369 uint64_t OffsetInBits, unsigned Flags, 370 DIType Ty, MDNode *PropertyNode) { 371 // TAG_member is encoded in DIDerivedType format. 372 Value *Elts[] = { 373 GetTagConstant(VMContext, dwarf::DW_TAG_member), 374 getNonCompileUnitScope(File), 375 MDString::get(VMContext, Name), 376 File, 377 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 378 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 379 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 380 ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 381 ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 382 Ty, 383 PropertyNode 384 }; 385 return DIType(MDNode::get(VMContext, Elts)); 386 } 387 388 /// createObjCProperty - Create debugging information entry for Objective-C 389 /// property. 390 DIObjCProperty DIBuilder::createObjCProperty(StringRef Name, 391 DIFile File, unsigned LineNumber, 392 StringRef GetterName, 393 StringRef SetterName, 394 unsigned PropertyAttributes, 395 DIType Ty) { 396 Value *Elts[] = { 397 GetTagConstant(VMContext, dwarf::DW_TAG_APPLE_property), 398 MDString::get(VMContext, Name), 399 File, 400 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 401 MDString::get(VMContext, GetterName), 402 MDString::get(VMContext, SetterName), 403 ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes), 404 Ty 405 }; 406 return DIObjCProperty(MDNode::get(VMContext, Elts)); 407 } 408 409 /// createTemplateTypeParameter - Create debugging information for template 410 /// type parameter. 411 DITemplateTypeParameter 412 DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name, 413 DIType Ty, MDNode *File, unsigned LineNo, 414 unsigned ColumnNo) { 415 Value *Elts[] = { 416 GetTagConstant(VMContext, dwarf::DW_TAG_template_type_parameter), 417 getNonCompileUnitScope(Context), 418 MDString::get(VMContext, Name), 419 Ty, 420 File, 421 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 422 ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo) 423 }; 424 return DITemplateTypeParameter(MDNode::get(VMContext, Elts)); 425 } 426 427 /// createTemplateValueParameter - Create debugging information for template 428 /// value parameter. 429 DITemplateValueParameter 430 DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name, 431 DIType Ty, uint64_t Val, 432 MDNode *File, unsigned LineNo, 433 unsigned ColumnNo) { 434 Value *Elts[] = { 435 GetTagConstant(VMContext, dwarf::DW_TAG_template_value_parameter), 436 getNonCompileUnitScope(Context), 437 MDString::get(VMContext, Name), 438 Ty, 439 ConstantInt::get(Type::getInt64Ty(VMContext), Val), 440 File, 441 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 442 ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo) 443 }; 444 return DITemplateValueParameter(MDNode::get(VMContext, Elts)); 445 } 446 447 /// createClassType - Create debugging information entry for a class. 448 DIType DIBuilder::createClassType(DIDescriptor Context, StringRef Name, 449 DIFile File, unsigned LineNumber, 450 uint64_t SizeInBits, uint64_t AlignInBits, 451 uint64_t OffsetInBits, unsigned Flags, 452 DIType DerivedFrom, DIArray Elements, 453 MDNode *VTableHolder, 454 MDNode *TemplateParams) { 455 // TAG_class_type is encoded in DICompositeType format. 456 Value *Elts[] = { 457 GetTagConstant(VMContext, dwarf::DW_TAG_class_type), 458 getNonCompileUnitScope(Context), 459 MDString::get(VMContext, Name), 460 File, 461 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 462 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 463 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 464 ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits), 465 ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 466 DerivedFrom, 467 Elements, 468 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 469 VTableHolder, 470 TemplateParams 471 }; 472 return DIType(MDNode::get(VMContext, Elts)); 473 } 474 475 /// createStructType - Create debugging information entry for a struct. 476 DIType DIBuilder::createStructType(DIDescriptor Context, StringRef Name, 477 DIFile File, unsigned LineNumber, 478 uint64_t SizeInBits, uint64_t AlignInBits, 479 unsigned Flags, DIArray Elements, 480 unsigned RunTimeLang) { 481 // TAG_structure_type is encoded in DICompositeType format. 482 Value *Elts[] = { 483 GetTagConstant(VMContext, dwarf::DW_TAG_structure_type), 484 getNonCompileUnitScope(Context), 485 MDString::get(VMContext, Name), 486 File, 487 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 488 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 489 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 490 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 491 ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 492 NULL, 493 Elements, 494 ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang), 495 Constant::getNullValue(Type::getInt32Ty(VMContext)) 496 }; 497 return DIType(MDNode::get(VMContext, Elts)); 498 } 499 500 /// createUnionType - Create debugging information entry for an union. 501 DIType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name, 502 DIFile File, 503 unsigned LineNumber, uint64_t SizeInBits, 504 uint64_t AlignInBits, unsigned Flags, 505 DIArray Elements, unsigned RunTimeLang) { 506 // TAG_union_type is encoded in DICompositeType format. 507 Value *Elts[] = { 508 GetTagConstant(VMContext, dwarf::DW_TAG_union_type), 509 getNonCompileUnitScope(Scope), 510 MDString::get(VMContext, Name), 511 File, 512 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 513 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 514 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 515 ConstantInt::get(Type::getInt64Ty(VMContext), 0), 516 ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 517 NULL, 518 Elements, 519 ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang), 520 Constant::getNullValue(Type::getInt32Ty(VMContext)) 521 }; 522 return DIType(MDNode::get(VMContext, Elts)); 523 } 524 525 /// createSubroutineType - Create subroutine type. 526 DIType DIBuilder::createSubroutineType(DIFile File, DIArray ParameterTypes) { 527 // TAG_subroutine_type is encoded in DICompositeType format. 528 Value *Elts[] = { 529 GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type), 530 Constant::getNullValue(Type::getInt32Ty(VMContext)), 531 MDString::get(VMContext, ""), 532 Constant::getNullValue(Type::getInt32Ty(VMContext)), 533 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 534 ConstantInt::get(Type::getInt64Ty(VMContext), 0), 535 ConstantInt::get(Type::getInt64Ty(VMContext), 0), 536 ConstantInt::get(Type::getInt64Ty(VMContext), 0), 537 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 538 NULL, 539 ParameterTypes, 540 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 541 Constant::getNullValue(Type::getInt32Ty(VMContext)) 542 }; 543 return DIType(MDNode::get(VMContext, Elts)); 544 } 545 546 /// createEnumerationType - Create debugging information entry for an 547 /// enumeration. 548 DIType DIBuilder::createEnumerationType(DIDescriptor Scope, StringRef Name, 549 DIFile File, unsigned LineNumber, 550 uint64_t SizeInBits, 551 uint64_t AlignInBits, 552 DIArray Elements, 553 DIType ClassType, unsigned Flags) { 554 // TAG_enumeration_type is encoded in DICompositeType format. 555 Value *Elts[] = { 556 GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type), 557 getNonCompileUnitScope(Scope), 558 MDString::get(VMContext, Name), 559 File, 560 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 561 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 562 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 563 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 564 ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 565 ClassType, 566 Elements, 567 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 568 Constant::getNullValue(Type::getInt32Ty(VMContext)) 569 }; 570 MDNode *Node = MDNode::get(VMContext, Elts); 571 AllEnumTypes.push_back(Node); 572 return DIType(Node); 573 } 574 575 /// createArrayType - Create debugging information entry for an array. 576 DIType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits, 577 DIType Ty, DIArray Subscripts) { 578 // TAG_array_type is encoded in DICompositeType format. 579 Value *Elts[] = { 580 GetTagConstant(VMContext, dwarf::DW_TAG_array_type), 581 NULL, //TheCU, 582 MDString::get(VMContext, ""), 583 NULL, //TheCU, 584 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 585 ConstantInt::get(Type::getInt64Ty(VMContext), Size), 586 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 587 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 588 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 589 Ty, 590 Subscripts, 591 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 592 Constant::getNullValue(Type::getInt32Ty(VMContext)) 593 }; 594 return DIType(MDNode::get(VMContext, Elts)); 595 } 596 597 /// createVectorType - Create debugging information entry for a vector. 598 DIType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits, 599 DIType Ty, DIArray Subscripts) { 600 // TAG_vector_type is encoded in DICompositeType format. 601 Value *Elts[] = { 602 GetTagConstant(VMContext, dwarf::DW_TAG_vector_type), 603 NULL, //TheCU, 604 MDString::get(VMContext, ""), 605 NULL, //TheCU, 606 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 607 ConstantInt::get(Type::getInt64Ty(VMContext), Size), 608 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 609 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 610 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 611 Ty, 612 Subscripts, 613 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 614 Constant::getNullValue(Type::getInt32Ty(VMContext)) 615 }; 616 return DIType(MDNode::get(VMContext, Elts)); 617 } 618 619 /// createArtificialType - Create a new DIType with "artificial" flag set. 620 DIType DIBuilder::createArtificialType(DIType Ty) { 621 if (Ty.isArtificial()) 622 return Ty; 623 624 SmallVector<Value *, 9> Elts; 625 MDNode *N = Ty; 626 assert (N && "Unexpected input DIType!"); 627 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { 628 if (Value *V = N->getOperand(i)) 629 Elts.push_back(V); 630 else 631 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 632 } 633 634 unsigned CurFlags = Ty.getFlags(); 635 CurFlags = CurFlags | DIType::FlagArtificial; 636 637 // Flags are stored at this slot. 638 Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags); 639 640 return DIType(MDNode::get(VMContext, Elts)); 641 } 642 643 /// retainType - Retain DIType in a module even if it is not referenced 644 /// through debug info anchors. 645 void DIBuilder::retainType(DIType T) { 646 AllRetainTypes.push_back(T); 647 } 648 649 /// createUnspecifiedParameter - Create unspeicified type descriptor 650 /// for the subroutine type. 651 DIDescriptor DIBuilder::createUnspecifiedParameter() { 652 Value *Elts[] = { 653 GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters) 654 }; 655 return DIDescriptor(MDNode::get(VMContext, Elts)); 656 } 657 658 /// createTemporaryType - Create a temporary forward-declared type. 659 DIType DIBuilder::createTemporaryType() { 660 // Give the temporary MDNode a tag. It doesn't matter what tag we 661 // use here as long as DIType accepts it. 662 Value *Elts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 663 MDNode *Node = MDNode::getTemporary(VMContext, Elts); 664 return DIType(Node); 665 } 666 667 /// createTemporaryType - Create a temporary forward-declared type. 668 DIType DIBuilder::createTemporaryType(DIFile F) { 669 // Give the temporary MDNode a tag. It doesn't matter what tag we 670 // use here as long as DIType accepts it. 671 Value *Elts[] = { 672 GetTagConstant(VMContext, DW_TAG_base_type), 673 TheCU, 674 NULL, 675 F 676 }; 677 MDNode *Node = MDNode::getTemporary(VMContext, Elts); 678 return DIType(Node); 679 } 680 681 /// createForwardDecl - Create a temporary forward-declared type that 682 /// can be RAUW'd if the full type is seen. 683 DIType DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, 684 DIDescriptor Scope, DIFile F, 685 unsigned Line, unsigned RuntimeLang) { 686 // Create a temporary MDNode. 687 Value *Elts[] = { 688 GetTagConstant(VMContext, Tag), 689 getNonCompileUnitScope(Scope), 690 MDString::get(VMContext, Name), 691 F, 692 ConstantInt::get(Type::getInt32Ty(VMContext), Line), 693 // To ease transition include sizes etc of 0. 694 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 695 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 696 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 697 ConstantInt::get(Type::getInt32Ty(VMContext), 698 DIDescriptor::FlagFwdDecl), 699 NULL, 700 DIArray(), 701 ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang) 702 }; 703 MDNode *Node = MDNode::getTemporary(VMContext, Elts); 704 return DIType(Node); 705 } 706 707 /// getOrCreateArray - Get a DIArray, create one if required. 708 DIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) { 709 if (Elements.empty()) { 710 Value *Null = Constant::getNullValue(Type::getInt32Ty(VMContext)); 711 return DIArray(MDNode::get(VMContext, Null)); 712 } 713 return DIArray(MDNode::get(VMContext, Elements)); 714 } 715 716 /// getOrCreateSubrange - Create a descriptor for a value range. This 717 /// implicitly uniques the values returned. 718 DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Hi) { 719 Value *Elts[] = { 720 GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type), 721 ConstantInt::get(Type::getInt64Ty(VMContext), Lo), 722 ConstantInt::get(Type::getInt64Ty(VMContext), Hi) 723 }; 724 725 return DISubrange(MDNode::get(VMContext, Elts)); 726 } 727 728 /// createGlobalVariable - Create a new descriptor for the specified global. 729 DIGlobalVariable DIBuilder:: 730 createGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber, 731 DIType Ty, bool isLocalToUnit, Value *Val) { 732 Value *Elts[] = { 733 GetTagConstant(VMContext, dwarf::DW_TAG_variable), 734 Constant::getNullValue(Type::getInt32Ty(VMContext)), 735 NULL, // TheCU, 736 MDString::get(VMContext, Name), 737 MDString::get(VMContext, Name), 738 MDString::get(VMContext, Name), 739 F, 740 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 741 Ty, 742 ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit), 743 ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/ 744 Val 745 }; 746 MDNode *Node = MDNode::get(VMContext, Elts); 747 AllGVs.push_back(Node); 748 return DIGlobalVariable(Node); 749 } 750 751 /// createStaticVariable - Create a new descriptor for the specified static 752 /// variable. 753 DIGlobalVariable DIBuilder:: 754 createStaticVariable(DIDescriptor Context, StringRef Name, 755 StringRef LinkageName, DIFile F, unsigned LineNumber, 756 DIType Ty, bool isLocalToUnit, Value *Val) { 757 Value *Elts[] = { 758 GetTagConstant(VMContext, dwarf::DW_TAG_variable), 759 Constant::getNullValue(Type::getInt32Ty(VMContext)), 760 getNonCompileUnitScope(Context), 761 MDString::get(VMContext, Name), 762 MDString::get(VMContext, Name), 763 MDString::get(VMContext, LinkageName), 764 F, 765 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 766 Ty, 767 ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit), 768 ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/ 769 Val 770 }; 771 MDNode *Node = MDNode::get(VMContext, Elts); 772 AllGVs.push_back(Node); 773 return DIGlobalVariable(Node); 774 } 775 776 /// createVariable - Create a new descriptor for the specified variable. 777 DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope, 778 StringRef Name, DIFile File, 779 unsigned LineNo, DIType Ty, 780 bool AlwaysPreserve, unsigned Flags, 781 unsigned ArgNo) { 782 Value *Elts[] = { 783 GetTagConstant(VMContext, Tag), 784 getNonCompileUnitScope(Scope), 785 MDString::get(VMContext, Name), 786 File, 787 ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))), 788 Ty, 789 ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 790 Constant::getNullValue(Type::getInt32Ty(VMContext)) 791 }; 792 MDNode *Node = MDNode::get(VMContext, Elts); 793 if (AlwaysPreserve) { 794 // The optimizer may remove local variable. If there is an interest 795 // to preserve variable info in such situation then stash it in a 796 // named mdnode. 797 DISubprogram Fn(getDISubprogram(Scope)); 798 NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn); 799 FnLocals->addOperand(Node); 800 } 801 return DIVariable(Node); 802 } 803 804 /// createComplexVariable - Create a new descriptor for the specified variable 805 /// which has a complex address expression for its address. 806 DIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope, 807 StringRef Name, DIFile F, 808 unsigned LineNo, 809 DIType Ty, ArrayRef<Value *> Addr, 810 unsigned ArgNo) { 811 SmallVector<Value *, 15> Elts; 812 Elts.push_back(GetTagConstant(VMContext, Tag)); 813 Elts.push_back(getNonCompileUnitScope(Scope)), 814 Elts.push_back(MDString::get(VMContext, Name)); 815 Elts.push_back(F); 816 Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext), 817 (LineNo | (ArgNo << 24)))); 818 Elts.push_back(Ty); 819 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 820 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 821 Elts.append(Addr.begin(), Addr.end()); 822 823 return DIVariable(MDNode::get(VMContext, Elts)); 824 } 825 826 /// createFunction - Create a new descriptor for the specified function. 827 DISubprogram DIBuilder::createFunction(DIDescriptor Context, 828 StringRef Name, 829 StringRef LinkageName, 830 DIFile File, unsigned LineNo, 831 DIType Ty, 832 bool isLocalToUnit, bool isDefinition, 833 unsigned ScopeLine, 834 unsigned Flags, bool isOptimized, 835 Function *Fn, 836 MDNode *TParams, 837 MDNode *Decl) { 838 Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 839 MDNode *Temp = MDNode::getTemporary(VMContext, TElts); 840 Value *TVElts[] = { Temp }; 841 MDNode *THolder = MDNode::get(VMContext, TVElts); 842 843 Value *Elts[] = { 844 GetTagConstant(VMContext, dwarf::DW_TAG_subprogram), 845 Constant::getNullValue(Type::getInt32Ty(VMContext)), 846 getNonCompileUnitScope(Context), 847 MDString::get(VMContext, Name), 848 MDString::get(VMContext, Name), 849 MDString::get(VMContext, LinkageName), 850 File, 851 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 852 Ty, 853 ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), 854 ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), 855 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 856 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 857 NULL, 858 ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 859 ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 860 Fn, 861 TParams, 862 Decl, 863 THolder, 864 ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine) 865 }; 866 MDNode *Node = MDNode::get(VMContext, Elts); 867 868 // Create a named metadata so that we do not lose this mdnode. 869 AllSubprograms.push_back(Node); 870 return DISubprogram(Node); 871 } 872 873 /// createMethod - Create a new descriptor for the specified C++ method. 874 DISubprogram DIBuilder::createMethod(DIDescriptor Context, 875 StringRef Name, 876 StringRef LinkageName, 877 DIFile F, 878 unsigned LineNo, DIType Ty, 879 bool isLocalToUnit, 880 bool isDefinition, 881 unsigned VK, unsigned VIndex, 882 MDNode *VTableHolder, 883 unsigned Flags, 884 bool isOptimized, 885 Function *Fn, 886 MDNode *TParam) { 887 Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 888 MDNode *Temp = MDNode::getTemporary(VMContext, TElts); 889 Value *TVElts[] = { Temp }; 890 MDNode *THolder = MDNode::get(VMContext, TVElts); 891 892 Value *Elts[] = { 893 GetTagConstant(VMContext, dwarf::DW_TAG_subprogram), 894 Constant::getNullValue(Type::getInt32Ty(VMContext)), 895 getNonCompileUnitScope(Context), 896 MDString::get(VMContext, Name), 897 MDString::get(VMContext, Name), 898 MDString::get(VMContext, LinkageName), 899 F, 900 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 901 Ty, 902 ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), 903 ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), 904 ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK), 905 ConstantInt::get(Type::getInt32Ty(VMContext), VIndex), 906 VTableHolder, 907 ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 908 ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 909 Fn, 910 TParam, 911 Constant::getNullValue(Type::getInt32Ty(VMContext)), 912 THolder, 913 // FIXME: Do we want to use different scope/lines? 914 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo) 915 }; 916 MDNode *Node = MDNode::get(VMContext, Elts); 917 return DISubprogram(Node); 918 } 919 920 /// createNameSpace - This creates new descriptor for a namespace 921 /// with the specified parent scope. 922 DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name, 923 DIFile File, unsigned LineNo) { 924 Value *Elts[] = { 925 GetTagConstant(VMContext, dwarf::DW_TAG_namespace), 926 getNonCompileUnitScope(Scope), 927 MDString::get(VMContext, Name), 928 File, 929 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo) 930 }; 931 return DINameSpace(MDNode::get(VMContext, Elts)); 932 } 933 934 /// createLexicalBlockFile - This creates a new MDNode that encapsulates 935 /// an existing scope with a new filename. 936 DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope, 937 DIFile File) { 938 Value *Elts[] = { 939 GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block), 940 Scope, 941 File 942 }; 943 return DILexicalBlockFile(MDNode::get(VMContext, Elts)); 944 } 945 946 DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File, 947 unsigned Line, unsigned Col) { 948 // Defeat MDNode uniqing for lexical blocks by using unique id. 949 static unsigned int unique_id = 0; 950 Value *Elts[] = { 951 GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block), 952 getNonCompileUnitScope(Scope), 953 ConstantInt::get(Type::getInt32Ty(VMContext), Line), 954 ConstantInt::get(Type::getInt32Ty(VMContext), Col), 955 File, 956 ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++) 957 }; 958 return DILexicalBlock(MDNode::get(VMContext, Elts)); 959 } 960 961 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call. 962 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo, 963 Instruction *InsertBefore) { 964 assert(Storage && "no storage passed to dbg.declare"); 965 assert(VarInfo.Verify() && "empty DIVariable passed to dbg.declare"); 966 if (!DeclareFn) 967 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); 968 969 Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo }; 970 return CallInst::Create(DeclareFn, Args, "", InsertBefore); 971 } 972 973 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call. 974 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo, 975 BasicBlock *InsertAtEnd) { 976 assert(Storage && "no storage passed to dbg.declare"); 977 assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.declare"); 978 if (!DeclareFn) 979 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); 980 981 Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo }; 982 983 // If this block already has a terminator then insert this intrinsic 984 // before the terminator. 985 if (TerminatorInst *T = InsertAtEnd->getTerminator()) 986 return CallInst::Create(DeclareFn, Args, "", T); 987 else 988 return CallInst::Create(DeclareFn, Args, "", InsertAtEnd); 989 } 990 991 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. 992 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset, 993 DIVariable VarInfo, 994 Instruction *InsertBefore) { 995 assert(V && "no value passed to dbg.value"); 996 assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value"); 997 if (!ValueFn) 998 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); 999 1000 Value *Args[] = { MDNode::get(V->getContext(), V), 1001 ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), 1002 VarInfo }; 1003 return CallInst::Create(ValueFn, Args, "", InsertBefore); 1004 } 1005 1006 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. 1007 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset, 1008 DIVariable VarInfo, 1009 BasicBlock *InsertAtEnd) { 1010 assert(V && "no value passed to dbg.value"); 1011 assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value"); 1012 if (!ValueFn) 1013 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); 1014 1015 Value *Args[] = { MDNode::get(V->getContext(), V), 1016 ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), 1017 VarInfo }; 1018 return CallInst::Create(ValueFn, Args, "", InsertAtEnd); 1019 } 1020