DebugInfo.cpp revision 72dfb052ab74a9e642256212a50c9b805ce5c943
1//===--- DebugInfo.cpp - Debug Information Helper Classes -----------------===// 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 helper classes used to build and interpret debug 11// information in LLVM IR form. 12// 13//===----------------------------------------------------------------------===// 14 15#include "llvm/DebugInfo.h" 16#include "llvm/ADT/STLExtras.h" 17#include "llvm/ADT/SmallPtrSet.h" 18#include "llvm/ADT/SmallString.h" 19#include "llvm/Analysis/ValueTracking.h" 20#include "llvm/IR/Constants.h" 21#include "llvm/IR/DerivedTypes.h" 22#include "llvm/IR/Instructions.h" 23#include "llvm/IR/IntrinsicInst.h" 24#include "llvm/IR/Intrinsics.h" 25#include "llvm/IR/Module.h" 26#include "llvm/Support/Debug.h" 27#include "llvm/Support/Dwarf.h" 28#include "llvm/Support/ValueHandle.h" 29#include "llvm/Support/raw_ostream.h" 30using namespace llvm; 31using namespace llvm::dwarf; 32 33//===----------------------------------------------------------------------===// 34// DIDescriptor 35//===----------------------------------------------------------------------===// 36 37DIDescriptor::DIDescriptor(const DIFile F) : DbgNode(F.DbgNode) { 38} 39 40DIDescriptor::DIDescriptor(const DISubprogram F) : DbgNode(F.DbgNode) { 41} 42 43DIDescriptor::DIDescriptor(const DILexicalBlockFile F) : DbgNode(F.DbgNode) { 44} 45 46DIDescriptor::DIDescriptor(const DILexicalBlock F) : DbgNode(F.DbgNode) { 47} 48 49DIDescriptor::DIDescriptor(const DIVariable F) : DbgNode(F.DbgNode) { 50} 51 52DIDescriptor::DIDescriptor(const DIType F) : DbgNode(F.DbgNode) { 53} 54 55bool DIDescriptor::Verify() const { 56 return DbgNode && 57 (DIDerivedType(DbgNode).Verify() || 58 DICompositeType(DbgNode).Verify() || DIBasicType(DbgNode).Verify() || 59 DIVariable(DbgNode).Verify() || DISubprogram(DbgNode).Verify() || 60 DIGlobalVariable(DbgNode).Verify() || DIFile(DbgNode).Verify() || 61 DICompileUnit(DbgNode).Verify() || DINameSpace(DbgNode).Verify() || 62 DILexicalBlock(DbgNode).Verify() || 63 DILexicalBlockFile(DbgNode).Verify() || 64 DISubrange(DbgNode).Verify() || DIEnumerator(DbgNode).Verify() || 65 DIObjCProperty(DbgNode).Verify() || 66 DITemplateTypeParameter(DbgNode).Verify() || 67 DITemplateValueParameter(DbgNode).Verify()); 68} 69 70static Value *getField(const MDNode *DbgNode, unsigned Elt) { 71 if (DbgNode == 0 || Elt >= DbgNode->getNumOperands()) 72 return 0; 73 return DbgNode->getOperand(Elt); 74} 75 76static const MDNode *getNodeField(const MDNode *DbgNode, unsigned Elt) { 77 if (const MDNode *R = dyn_cast_or_null<MDNode>(getField(DbgNode, Elt))) 78 return R; 79 return 0; 80} 81 82static StringRef getStringField(const MDNode *DbgNode, unsigned Elt) { 83 if (MDString *MDS = dyn_cast_or_null<MDString>(getField(DbgNode, Elt))) 84 return MDS->getString(); 85 return StringRef(); 86} 87 88StringRef DIDescriptor::getStringField(unsigned Elt) const { 89 return ::getStringField(DbgNode, Elt); 90} 91 92uint64_t DIDescriptor::getUInt64Field(unsigned Elt) const { 93 if (DbgNode == 0) 94 return 0; 95 96 if (Elt < DbgNode->getNumOperands()) 97 if (ConstantInt *CI 98 = dyn_cast_or_null<ConstantInt>(DbgNode->getOperand(Elt))) 99 return CI->getZExtValue(); 100 101 return 0; 102} 103 104int64_t DIDescriptor::getInt64Field(unsigned Elt) const { 105 if (DbgNode == 0) 106 return 0; 107 108 if (Elt < DbgNode->getNumOperands()) 109 if (ConstantInt *CI 110 = dyn_cast_or_null<ConstantInt>(DbgNode->getOperand(Elt))) 111 return CI->getSExtValue(); 112 113 return 0; 114} 115 116DIDescriptor DIDescriptor::getDescriptorField(unsigned Elt) const { 117 if (DbgNode == 0) 118 return DIDescriptor(); 119 120 if (Elt < DbgNode->getNumOperands()) 121 return 122 DIDescriptor(dyn_cast_or_null<const MDNode>(DbgNode->getOperand(Elt))); 123 return DIDescriptor(); 124} 125 126GlobalVariable *DIDescriptor::getGlobalVariableField(unsigned Elt) const { 127 if (DbgNode == 0) 128 return 0; 129 130 if (Elt < DbgNode->getNumOperands()) 131 return dyn_cast_or_null<GlobalVariable>(DbgNode->getOperand(Elt)); 132 return 0; 133} 134 135Constant *DIDescriptor::getConstantField(unsigned Elt) const { 136 if (DbgNode == 0) 137 return 0; 138 139 if (Elt < DbgNode->getNumOperands()) 140 return dyn_cast_or_null<Constant>(DbgNode->getOperand(Elt)); 141 return 0; 142} 143 144Function *DIDescriptor::getFunctionField(unsigned Elt) const { 145 if (DbgNode == 0) 146 return 0; 147 148 if (Elt < DbgNode->getNumOperands()) 149 return dyn_cast_or_null<Function>(DbgNode->getOperand(Elt)); 150 return 0; 151} 152 153void DIDescriptor::replaceFunctionField(unsigned Elt, Function *F) { 154 if (DbgNode == 0) 155 return; 156 157 if (Elt < DbgNode->getNumOperands()) { 158 MDNode *Node = const_cast<MDNode*>(DbgNode); 159 Node->replaceOperandWith(Elt, F); 160 } 161} 162 163unsigned DIVariable::getNumAddrElements() const { 164 return DbgNode->getNumOperands()-8; 165} 166 167/// getInlinedAt - If this variable is inlined then return inline location. 168MDNode *DIVariable::getInlinedAt() const { 169 return dyn_cast_or_null<MDNode>(DbgNode->getOperand(7)); 170} 171 172//===----------------------------------------------------------------------===// 173// Predicates 174//===----------------------------------------------------------------------===// 175 176/// isBasicType - Return true if the specified tag is legal for 177/// DIBasicType. 178bool DIDescriptor::isBasicType() const { 179 if (!DbgNode) return false; 180 switch (getTag()) { 181 case dwarf::DW_TAG_base_type: 182 case dwarf::DW_TAG_unspecified_type: 183 return true; 184 default: 185 return false; 186 } 187} 188 189/// isDerivedType - Return true if the specified tag is legal for DIDerivedType. 190bool DIDescriptor::isDerivedType() const { 191 if (!DbgNode) return false; 192 switch (getTag()) { 193 case dwarf::DW_TAG_typedef: 194 case dwarf::DW_TAG_pointer_type: 195 case dwarf::DW_TAG_ptr_to_member_type: 196 case dwarf::DW_TAG_reference_type: 197 case dwarf::DW_TAG_rvalue_reference_type: 198 case dwarf::DW_TAG_const_type: 199 case dwarf::DW_TAG_volatile_type: 200 case dwarf::DW_TAG_restrict_type: 201 case dwarf::DW_TAG_member: 202 case dwarf::DW_TAG_inheritance: 203 case dwarf::DW_TAG_friend: 204 return true; 205 default: 206 // CompositeTypes are currently modelled as DerivedTypes. 207 return isCompositeType(); 208 } 209} 210 211/// isCompositeType - Return true if the specified tag is legal for 212/// DICompositeType. 213bool DIDescriptor::isCompositeType() const { 214 if (!DbgNode) return false; 215 switch (getTag()) { 216 case dwarf::DW_TAG_array_type: 217 case dwarf::DW_TAG_structure_type: 218 case dwarf::DW_TAG_union_type: 219 case dwarf::DW_TAG_enumeration_type: 220 case dwarf::DW_TAG_subroutine_type: 221 case dwarf::DW_TAG_class_type: 222 return true; 223 default: 224 return false; 225 } 226} 227 228/// isVariable - Return true if the specified tag is legal for DIVariable. 229bool DIDescriptor::isVariable() const { 230 if (!DbgNode) return false; 231 switch (getTag()) { 232 case dwarf::DW_TAG_auto_variable: 233 case dwarf::DW_TAG_arg_variable: 234 return true; 235 default: 236 return false; 237 } 238} 239 240/// isType - Return true if the specified tag is legal for DIType. 241bool DIDescriptor::isType() const { 242 return isBasicType() || isCompositeType() || isDerivedType(); 243} 244 245/// isSubprogram - Return true if the specified tag is legal for 246/// DISubprogram. 247bool DIDescriptor::isSubprogram() const { 248 return DbgNode && getTag() == dwarf::DW_TAG_subprogram; 249} 250 251/// isGlobalVariable - Return true if the specified tag is legal for 252/// DIGlobalVariable. 253bool DIDescriptor::isGlobalVariable() const { 254 return DbgNode && (getTag() == dwarf::DW_TAG_variable || 255 getTag() == dwarf::DW_TAG_constant); 256} 257 258/// isGlobal - Return true if the specified tag is legal for DIGlobal. 259bool DIDescriptor::isGlobal() const { 260 return isGlobalVariable(); 261} 262 263/// isUnspecifiedParmeter - Return true if the specified tag is 264/// DW_TAG_unspecified_parameters. 265bool DIDescriptor::isUnspecifiedParameter() const { 266 return DbgNode && getTag() == dwarf::DW_TAG_unspecified_parameters; 267} 268 269/// isScope - Return true if the specified tag is one of the scope 270/// related tag. 271bool DIDescriptor::isScope() const { 272 if (!DbgNode) return false; 273 switch (getTag()) { 274 case dwarf::DW_TAG_compile_unit: 275 case dwarf::DW_TAG_lexical_block: 276 case dwarf::DW_TAG_subprogram: 277 case dwarf::DW_TAG_namespace: 278 return true; 279 default: 280 break; 281 } 282 return false; 283} 284 285/// isTemplateTypeParameter - Return true if the specified tag is 286/// DW_TAG_template_type_parameter. 287bool DIDescriptor::isTemplateTypeParameter() const { 288 return DbgNode && getTag() == dwarf::DW_TAG_template_type_parameter; 289} 290 291/// isTemplateValueParameter - Return true if the specified tag is 292/// DW_TAG_template_value_parameter. 293bool DIDescriptor::isTemplateValueParameter() const { 294 return DbgNode && getTag() == dwarf::DW_TAG_template_value_parameter; 295} 296 297/// isCompileUnit - Return true if the specified tag is DW_TAG_compile_unit. 298bool DIDescriptor::isCompileUnit() const { 299 return DbgNode && getTag() == dwarf::DW_TAG_compile_unit; 300} 301 302/// isFile - Return true if the specified tag is DW_TAG_file_type. 303bool DIDescriptor::isFile() const { 304 return DbgNode && getTag() == dwarf::DW_TAG_file_type; 305} 306 307/// isNameSpace - Return true if the specified tag is DW_TAG_namespace. 308bool DIDescriptor::isNameSpace() const { 309 return DbgNode && getTag() == dwarf::DW_TAG_namespace; 310} 311 312/// isLexicalBlockFile - Return true if the specified descriptor is a 313/// lexical block with an extra file. 314bool DIDescriptor::isLexicalBlockFile() const { 315 return DbgNode && getTag() == dwarf::DW_TAG_lexical_block && 316 (DbgNode->getNumOperands() == 3); 317} 318 319/// isLexicalBlock - Return true if the specified tag is DW_TAG_lexical_block. 320bool DIDescriptor::isLexicalBlock() const { 321 return DbgNode && getTag() == dwarf::DW_TAG_lexical_block && 322 (DbgNode->getNumOperands() > 3); 323} 324 325/// isSubrange - Return true if the specified tag is DW_TAG_subrange_type. 326bool DIDescriptor::isSubrange() const { 327 return DbgNode && getTag() == dwarf::DW_TAG_subrange_type; 328} 329 330/// isEnumerator - Return true if the specified tag is DW_TAG_enumerator. 331bool DIDescriptor::isEnumerator() const { 332 return DbgNode && getTag() == dwarf::DW_TAG_enumerator; 333} 334 335/// isObjCProperty - Return true if the specified tag is DW_TAG_APPLE_property. 336bool DIDescriptor::isObjCProperty() const { 337 return DbgNode && getTag() == dwarf::DW_TAG_APPLE_property; 338} 339//===----------------------------------------------------------------------===// 340// Simple Descriptor Constructors and other Methods 341//===----------------------------------------------------------------------===// 342 343DIType::DIType(const MDNode *N) : DIScope(N) { 344 if (!N) return; 345 if (!isBasicType() && !isDerivedType() && !isCompositeType()) { 346 DbgNode = 0; 347 } 348} 349 350unsigned DIArray::getNumElements() const { 351 if (!DbgNode) 352 return 0; 353 return DbgNode->getNumOperands(); 354} 355 356/// replaceAllUsesWith - Replace all uses of debug info referenced by 357/// this descriptor. 358void DIType::replaceAllUsesWith(DIDescriptor &D) { 359 if (!DbgNode) 360 return; 361 362 // Since we use a TrackingVH for the node, its easy for clients to manufacture 363 // legitimate situations where they want to replaceAllUsesWith() on something 364 // which, due to uniquing, has merged with the source. We shield clients from 365 // this detail by allowing a value to be replaced with replaceAllUsesWith() 366 // itself. 367 if (DbgNode != D) { 368 MDNode *Node = const_cast<MDNode*>(DbgNode); 369 const MDNode *DN = D; 370 const Value *V = cast_or_null<Value>(DN); 371 Node->replaceAllUsesWith(const_cast<Value*>(V)); 372 MDNode::deleteTemporary(Node); 373 } 374} 375 376/// replaceAllUsesWith - Replace all uses of debug info referenced by 377/// this descriptor. 378void DIType::replaceAllUsesWith(MDNode *D) { 379 if (!DbgNode) 380 return; 381 382 // Since we use a TrackingVH for the node, its easy for clients to manufacture 383 // legitimate situations where they want to replaceAllUsesWith() on something 384 // which, due to uniquing, has merged with the source. We shield clients from 385 // this detail by allowing a value to be replaced with replaceAllUsesWith() 386 // itself. 387 if (DbgNode != D) { 388 MDNode *Node = const_cast<MDNode*>(DbgNode); 389 const MDNode *DN = D; 390 const Value *V = cast_or_null<Value>(DN); 391 Node->replaceAllUsesWith(const_cast<Value*>(V)); 392 MDNode::deleteTemporary(Node); 393 } 394} 395 396/// isUnsignedDIType - Return true if type encoding is unsigned. 397bool DIType::isUnsignedDIType() { 398 DIDerivedType DTy(DbgNode); 399 if (DTy.Verify()) 400 return DTy.getTypeDerivedFrom().isUnsignedDIType(); 401 402 DIBasicType BTy(DbgNode); 403 if (BTy.Verify()) { 404 unsigned Encoding = BTy.getEncoding(); 405 if (Encoding == dwarf::DW_ATE_unsigned || 406 Encoding == dwarf::DW_ATE_unsigned_char || 407 Encoding == dwarf::DW_ATE_boolean) 408 return true; 409 } 410 return false; 411} 412 413/// Verify - Verify that a compile unit is well formed. 414bool DICompileUnit::Verify() const { 415 if (!isCompileUnit()) 416 return false; 417 StringRef N = getFilename(); 418 if (N.empty()) 419 return false; 420 // It is possible that directory and produce string is empty. 421 return DbgNode->getNumOperands() == 12; 422} 423 424/// Verify - Verify that an ObjC property is well formed. 425bool DIObjCProperty::Verify() const { 426 if (!isObjCProperty()) 427 return false; 428 429 DIType Ty = getType(); 430 if (!Ty.Verify()) return false; 431 432 // Don't worry about the rest of the strings for now. 433 return DbgNode->getNumOperands() == 8; 434} 435 436/// Verify - Verify that a type descriptor is well formed. 437bool DIType::Verify() const { 438 if (!isType()) 439 return false; 440 if (getContext() && !getContext().Verify()) 441 return false; 442 unsigned Tag = getTag(); 443 if (!isBasicType() && Tag != dwarf::DW_TAG_const_type && 444 Tag != dwarf::DW_TAG_volatile_type && Tag != dwarf::DW_TAG_pointer_type && 445 Tag != dwarf::DW_TAG_ptr_to_member_type && 446 Tag != dwarf::DW_TAG_reference_type && 447 Tag != dwarf::DW_TAG_rvalue_reference_type && 448 Tag != dwarf::DW_TAG_restrict_type && 449 Tag != dwarf::DW_TAG_array_type && 450 Tag != dwarf::DW_TAG_enumeration_type && 451 Tag != dwarf::DW_TAG_subroutine_type && 452 getFilename().empty()) 453 return false; 454 return true; 455} 456 457/// Verify - Verify that a basic type descriptor is well formed. 458bool DIBasicType::Verify() const { 459 return isBasicType() && DbgNode->getNumOperands() == 10; 460} 461 462/// Verify - Verify that a derived type descriptor is well formed. 463bool DIDerivedType::Verify() const { 464 return isDerivedType() && DbgNode->getNumOperands() >= 10 && 465 DbgNode->getNumOperands() <= 14; 466} 467 468/// Verify - Verify that a composite type descriptor is well formed. 469bool DICompositeType::Verify() const { 470 if (!isCompositeType()) 471 return false; 472 if (getContext() && !getContext().Verify()) 473 return false; 474 475 return DbgNode->getNumOperands() >= 10 && DbgNode->getNumOperands() <= 14; 476} 477 478/// Verify - Verify that a subprogram descriptor is well formed. 479bool DISubprogram::Verify() const { 480 if (!isSubprogram()) 481 return false; 482 483 if (getContext() && !getContext().Verify()) 484 return false; 485 486 DICompositeType Ty = getType(); 487 if (!Ty.Verify()) 488 return false; 489 return DbgNode->getNumOperands() == 20; 490} 491 492/// Verify - Verify that a global variable descriptor is well formed. 493bool DIGlobalVariable::Verify() const { 494 if (!isGlobalVariable()) 495 return false; 496 497 if (getDisplayName().empty()) 498 return false; 499 500 if (getContext() && !getContext().Verify()) 501 return false; 502 503 DIType Ty = getType(); 504 if (!Ty.Verify()) 505 return false; 506 507 if (!getGlobal() && !getConstant()) 508 return false; 509 510 return DbgNode->getNumOperands() == 13; 511} 512 513/// Verify - Verify that a variable descriptor is well formed. 514bool DIVariable::Verify() const { 515 if (!isVariable()) 516 return false; 517 518 if (getContext() && !getContext().Verify()) 519 return false; 520 521 DIType Ty = getType(); 522 if (!Ty.Verify()) 523 return false; 524 525 return DbgNode->getNumOperands() >= 8; 526} 527 528/// Verify - Verify that a location descriptor is well formed. 529bool DILocation::Verify() const { 530 if (!DbgNode) 531 return false; 532 533 return DbgNode->getNumOperands() == 4; 534} 535 536/// Verify - Verify that a namespace descriptor is well formed. 537bool DINameSpace::Verify() const { 538 if (!isNameSpace()) 539 return false; 540 return DbgNode->getNumOperands() == 5; 541} 542 543/// \brief Retrieve the MDNode for the directory/file pair. 544MDNode *DIFile::getFileNode() const { 545 return const_cast<MDNode*>(getNodeField(DbgNode, 1)); 546} 547 548/// \brief Verify that the file descriptor is well formed. 549bool DIFile::Verify() const { 550 return isFile() && DbgNode->getNumOperands() == 2; 551} 552 553/// \brief Verify that the enumerator descriptor is well formed. 554bool DIEnumerator::Verify() const { 555 return isEnumerator() && DbgNode->getNumOperands() == 3; 556} 557 558/// \brief Verify that the subrange descriptor is well formed. 559bool DISubrange::Verify() const { 560 return isSubrange() && DbgNode->getNumOperands() == 3; 561} 562 563/// \brief Verify that the lexical block descriptor is well formed. 564bool DILexicalBlock::Verify() const { 565 return isLexicalBlock() && DbgNode->getNumOperands() == 6; 566} 567 568/// \brief Verify that the file-scoped lexical block descriptor is well formed. 569bool DILexicalBlockFile::Verify() const { 570 return isLexicalBlockFile() && DbgNode->getNumOperands() == 3; 571} 572 573/// \brief Verify that the template type parameter descriptor is well formed. 574bool DITemplateTypeParameter::Verify() const { 575 return isTemplateTypeParameter() && DbgNode->getNumOperands() == 7; 576} 577 578/// \brief Verify that the template value parameter descriptor is well formed. 579bool DITemplateValueParameter::Verify() const { 580 return isTemplateValueParameter() && DbgNode->getNumOperands() == 8; 581} 582 583/// getOriginalTypeSize - If this type is derived from a base type then 584/// return base type size. 585uint64_t DIDerivedType::getOriginalTypeSize() const { 586 unsigned Tag = getTag(); 587 588 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef && 589 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type && 590 Tag != dwarf::DW_TAG_restrict_type) 591 return getSizeInBits(); 592 593 DIType BaseType = getTypeDerivedFrom(); 594 595 // If this type is not derived from any type then take conservative approach. 596 if (!BaseType.isValid()) 597 return getSizeInBits(); 598 599 // If this is a derived type, go ahead and get the base type, unless it's a 600 // reference then it's just the size of the field. Pointer types have no need 601 // of this since they're a different type of qualification on the type. 602 if (BaseType.getTag() == dwarf::DW_TAG_reference_type || 603 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type) 604 return getSizeInBits(); 605 606 if (BaseType.isDerivedType()) 607 return DIDerivedType(BaseType).getOriginalTypeSize(); 608 609 return BaseType.getSizeInBits(); 610} 611 612/// getObjCProperty - Return property node, if this ivar is associated with one. 613MDNode *DIDerivedType::getObjCProperty() const { 614 if (DbgNode->getNumOperands() <= 10) 615 return NULL; 616 return dyn_cast_or_null<MDNode>(DbgNode->getOperand(10)); 617} 618 619/// \brief Set the array of member DITypes. 620void DICompositeType::setTypeArray(DIArray Elements, DIArray TParams) { 621 assert((!TParams || DbgNode->getNumOperands() == 14) && 622 "If you're setting the template parameters this should include a slot " 623 "for that!"); 624 TrackingVH<MDNode> N(*this); 625 N->replaceOperandWith(10, Elements); 626 if (TParams) 627 N->replaceOperandWith(13, TParams); 628 DbgNode = N; 629} 630 631/// \brief Set the containing type. 632void DICompositeType::setContainingType(DICompositeType ContainingType) { 633 TrackingVH<MDNode> N(*this); 634 N->replaceOperandWith(12, ContainingType); 635 DbgNode = N; 636} 637 638/// isInlinedFnArgument - Return true if this variable provides debugging 639/// information for an inlined function arguments. 640bool DIVariable::isInlinedFnArgument(const Function *CurFn) { 641 assert(CurFn && "Invalid function"); 642 if (!getContext().isSubprogram()) 643 return false; 644 // This variable is not inlined function argument if its scope 645 // does not describe current function. 646 return !DISubprogram(getContext()).describes(CurFn); 647} 648 649/// describes - Return true if this subprogram provides debugging 650/// information for the function F. 651bool DISubprogram::describes(const Function *F) { 652 assert(F && "Invalid function"); 653 if (F == getFunction()) 654 return true; 655 StringRef Name = getLinkageName(); 656 if (Name.empty()) 657 Name = getName(); 658 if (F->getName() == Name) 659 return true; 660 return false; 661} 662 663unsigned DISubprogram::isOptimized() const { 664 assert (DbgNode && "Invalid subprogram descriptor!"); 665 if (DbgNode->getNumOperands() == 15) 666 return getUnsignedField(14); 667 return 0; 668} 669 670MDNode *DISubprogram::getVariablesNodes() const { 671 if (!DbgNode || DbgNode->getNumOperands() <= 18) 672 return NULL; 673 return dyn_cast_or_null<MDNode>(DbgNode->getOperand(18)); 674} 675 676DIArray DISubprogram::getVariables() const { 677 if (!DbgNode || DbgNode->getNumOperands() <= 18) 678 return DIArray(); 679 if (MDNode *T = dyn_cast_or_null<MDNode>(DbgNode->getOperand(18))) 680 return DIArray(T); 681 return DIArray(); 682} 683 684StringRef DIScope::getFilename() const { 685 if (!DbgNode) 686 return StringRef(); 687 return ::getStringField(getNodeField(DbgNode, 1), 0); 688} 689 690StringRef DIScope::getDirectory() const { 691 if (!DbgNode) 692 return StringRef(); 693 return ::getStringField(getNodeField(DbgNode, 1), 1); 694} 695 696DIArray DICompileUnit::getEnumTypes() const { 697 if (!DbgNode || DbgNode->getNumOperands() < 12) 698 return DIArray(); 699 700 if (MDNode *N = dyn_cast_or_null<MDNode>(DbgNode->getOperand(7))) 701 return DIArray(N); 702 return DIArray(); 703} 704 705DIArray DICompileUnit::getRetainedTypes() const { 706 if (!DbgNode || DbgNode->getNumOperands() < 12) 707 return DIArray(); 708 709 if (MDNode *N = dyn_cast_or_null<MDNode>(DbgNode->getOperand(8))) 710 return DIArray(N); 711 return DIArray(); 712} 713 714DIArray DICompileUnit::getSubprograms() const { 715 if (!DbgNode || DbgNode->getNumOperands() < 12) 716 return DIArray(); 717 718 if (MDNode *N = dyn_cast_or_null<MDNode>(DbgNode->getOperand(9))) 719 return DIArray(N); 720 return DIArray(); 721} 722 723 724DIArray DICompileUnit::getGlobalVariables() const { 725 if (!DbgNode || DbgNode->getNumOperands() < 12) 726 return DIArray(); 727 728 if (MDNode *N = dyn_cast_or_null<MDNode>(DbgNode->getOperand(10))) 729 return DIArray(N); 730 return DIArray(); 731} 732 733/// fixupObjcLikeName - Replace contains special characters used 734/// in a typical Objective-C names with '.' in a given string. 735static void fixupObjcLikeName(StringRef Str, SmallVectorImpl<char> &Out) { 736 bool isObjCLike = false; 737 for (size_t i = 0, e = Str.size(); i < e; ++i) { 738 char C = Str[i]; 739 if (C == '[') 740 isObjCLike = true; 741 742 if (isObjCLike && (C == '[' || C == ']' || C == ' ' || C == ':' || 743 C == '+' || C == '(' || C == ')')) 744 Out.push_back('.'); 745 else 746 Out.push_back(C); 747 } 748} 749 750/// getFnSpecificMDNode - Return a NameMDNode, if available, that is 751/// suitable to hold function specific information. 752NamedMDNode *llvm::getFnSpecificMDNode(const Module &M, DISubprogram Fn) { 753 SmallString<32> Name = StringRef("llvm.dbg.lv."); 754 StringRef FName = "fn"; 755 if (Fn.getFunction()) 756 FName = Fn.getFunction()->getName(); 757 else 758 FName = Fn.getName(); 759 char One = '\1'; 760 if (FName.startswith(StringRef(&One, 1))) 761 FName = FName.substr(1); 762 fixupObjcLikeName(FName, Name); 763 return M.getNamedMetadata(Name.str()); 764} 765 766/// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable 767/// to hold function specific information. 768NamedMDNode *llvm::getOrInsertFnSpecificMDNode(Module &M, DISubprogram Fn) { 769 SmallString<32> Name = StringRef("llvm.dbg.lv."); 770 StringRef FName = "fn"; 771 if (Fn.getFunction()) 772 FName = Fn.getFunction()->getName(); 773 else 774 FName = Fn.getName(); 775 char One = '\1'; 776 if (FName.startswith(StringRef(&One, 1))) 777 FName = FName.substr(1); 778 fixupObjcLikeName(FName, Name); 779 780 return M.getOrInsertNamedMetadata(Name.str()); 781} 782 783/// createInlinedVariable - Create a new inlined variable based on current 784/// variable. 785/// @param DV Current Variable. 786/// @param InlinedScope Location at current variable is inlined. 787DIVariable llvm::createInlinedVariable(MDNode *DV, MDNode *InlinedScope, 788 LLVMContext &VMContext) { 789 SmallVector<Value *, 16> Elts; 790 // Insert inlined scope as 7th element. 791 for (unsigned i = 0, e = DV->getNumOperands(); i != e; ++i) 792 i == 7 ? Elts.push_back(InlinedScope) : 793 Elts.push_back(DV->getOperand(i)); 794 return DIVariable(MDNode::get(VMContext, Elts)); 795} 796 797/// cleanseInlinedVariable - Remove inlined scope from the variable. 798DIVariable llvm::cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext) { 799 SmallVector<Value *, 16> Elts; 800 // Insert inlined scope as 7th element. 801 for (unsigned i = 0, e = DV->getNumOperands(); i != e; ++i) 802 i == 7 ? 803 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))): 804 Elts.push_back(DV->getOperand(i)); 805 return DIVariable(MDNode::get(VMContext, Elts)); 806} 807 808/// getDISubprogram - Find subprogram that is enclosing this scope. 809DISubprogram llvm::getDISubprogram(const MDNode *Scope) { 810 DIDescriptor D(Scope); 811 if (D.isSubprogram()) 812 return DISubprogram(Scope); 813 814 if (D.isLexicalBlockFile()) 815 return getDISubprogram(DILexicalBlockFile(Scope).getContext()); 816 817 if (D.isLexicalBlock()) 818 return getDISubprogram(DILexicalBlock(Scope).getContext()); 819 820 return DISubprogram(); 821} 822 823/// getDICompositeType - Find underlying composite type. 824DICompositeType llvm::getDICompositeType(DIType T) { 825 if (T.isCompositeType()) 826 return DICompositeType(T); 827 828 if (T.isDerivedType()) 829 return getDICompositeType(DIDerivedType(T).getTypeDerivedFrom()); 830 831 return DICompositeType(); 832} 833 834/// isSubprogramContext - Return true if Context is either a subprogram 835/// or another context nested inside a subprogram. 836bool llvm::isSubprogramContext(const MDNode *Context) { 837 if (!Context) 838 return false; 839 DIDescriptor D(Context); 840 if (D.isSubprogram()) 841 return true; 842 if (D.isType()) 843 return isSubprogramContext(DIType(Context).getContext()); 844 return false; 845} 846 847//===----------------------------------------------------------------------===// 848// DebugInfoFinder implementations. 849//===----------------------------------------------------------------------===// 850 851/// processModule - Process entire module and collect debug info. 852void DebugInfoFinder::processModule(const Module &M) { 853 if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) { 854 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) { 855 DICompileUnit CU(CU_Nodes->getOperand(i)); 856 addCompileUnit(CU); 857 DIArray GVs = CU.getGlobalVariables(); 858 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) { 859 DIGlobalVariable DIG(GVs.getElement(i)); 860 if (addGlobalVariable(DIG)) 861 processType(DIG.getType()); 862 } 863 DIArray SPs = CU.getSubprograms(); 864 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) 865 processSubprogram(DISubprogram(SPs.getElement(i))); 866 DIArray EnumTypes = CU.getEnumTypes(); 867 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i) 868 processType(DIType(EnumTypes.getElement(i))); 869 DIArray RetainedTypes = CU.getRetainedTypes(); 870 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) 871 processType(DIType(RetainedTypes.getElement(i))); 872 // FIXME: We really shouldn't be bailing out after visiting just one CU 873 return; 874 } 875 } 876} 877 878/// processLocation - Process DILocation. 879void DebugInfoFinder::processLocation(DILocation Loc) { 880 if (!Loc.Verify()) return; 881 DIDescriptor S(Loc.getScope()); 882 if (S.isCompileUnit()) 883 addCompileUnit(DICompileUnit(S)); 884 else if (S.isSubprogram()) 885 processSubprogram(DISubprogram(S)); 886 else if (S.isLexicalBlock()) 887 processLexicalBlock(DILexicalBlock(S)); 888 else if (S.isLexicalBlockFile()) { 889 DILexicalBlockFile DBF = DILexicalBlockFile(S); 890 processLexicalBlock(DILexicalBlock(DBF.getScope())); 891 } 892 processLocation(Loc.getOrigLocation()); 893} 894 895/// processType - Process DIType. 896void DebugInfoFinder::processType(DIType DT) { 897 if (!addType(DT)) 898 return; 899 if (DT.isCompositeType()) { 900 DICompositeType DCT(DT); 901 processType(DCT.getTypeDerivedFrom()); 902 DIArray DA = DCT.getTypeArray(); 903 for (unsigned i = 0, e = DA.getNumElements(); i != e; ++i) { 904 DIDescriptor D = DA.getElement(i); 905 if (D.isType()) 906 processType(DIType(D)); 907 else if (D.isSubprogram()) 908 processSubprogram(DISubprogram(D)); 909 } 910 } else if (DT.isDerivedType()) { 911 DIDerivedType DDT(DT); 912 processType(DDT.getTypeDerivedFrom()); 913 } 914} 915 916/// processLexicalBlock 917void DebugInfoFinder::processLexicalBlock(DILexicalBlock LB) { 918 DIScope Context = LB.getContext(); 919 if (Context.isLexicalBlock()) 920 return processLexicalBlock(DILexicalBlock(Context)); 921 else if (Context.isLexicalBlockFile()) { 922 DILexicalBlockFile DBF = DILexicalBlockFile(Context); 923 return processLexicalBlock(DILexicalBlock(DBF.getScope())); 924 } 925 else 926 return processSubprogram(DISubprogram(Context)); 927} 928 929/// processSubprogram - Process DISubprogram. 930void DebugInfoFinder::processSubprogram(DISubprogram SP) { 931 if (!addSubprogram(SP)) 932 return; 933 processType(SP.getType()); 934} 935 936/// processDeclare - Process DbgDeclareInst. 937void DebugInfoFinder::processDeclare(const DbgDeclareInst *DDI) { 938 MDNode *N = dyn_cast<MDNode>(DDI->getVariable()); 939 if (!N) return; 940 941 DIDescriptor DV(N); 942 if (!DV.isVariable()) 943 return; 944 945 if (!NodesSeen.insert(DV)) 946 return; 947 processType(DIVariable(N).getType()); 948} 949 950/// addType - Add type into Tys. 951bool DebugInfoFinder::addType(DIType DT) { 952 if (!DT.isValid()) 953 return false; 954 955 if (!NodesSeen.insert(DT)) 956 return false; 957 958 TYs.push_back(DT); 959 return true; 960} 961 962/// addCompileUnit - Add compile unit into CUs. 963bool DebugInfoFinder::addCompileUnit(DICompileUnit CU) { 964 if (!CU.Verify()) 965 return false; 966 967 if (!NodesSeen.insert(CU)) 968 return false; 969 970 CUs.push_back(CU); 971 return true; 972} 973 974/// addGlobalVariable - Add global variable into GVs. 975bool DebugInfoFinder::addGlobalVariable(DIGlobalVariable DIG) { 976 if (!DIDescriptor(DIG).isGlobalVariable()) 977 return false; 978 979 if (!NodesSeen.insert(DIG)) 980 return false; 981 982 GVs.push_back(DIG); 983 return true; 984} 985 986// addSubprogram - Add subprgoram into SPs. 987bool DebugInfoFinder::addSubprogram(DISubprogram SP) { 988 if (!DIDescriptor(SP).isSubprogram()) 989 return false; 990 991 if (!NodesSeen.insert(SP)) 992 return false; 993 994 SPs.push_back(SP); 995 return true; 996} 997 998//===----------------------------------------------------------------------===// 999// DIDescriptor: dump routines for all descriptors. 1000//===----------------------------------------------------------------------===// 1001 1002/// dump - Print descriptor to dbgs() with a newline. 1003void DIDescriptor::dump() const { 1004 print(dbgs()); dbgs() << '\n'; 1005} 1006 1007/// print - Print descriptor. 1008void DIDescriptor::print(raw_ostream &OS) const { 1009 if (!DbgNode) return; 1010 1011 if (const char *Tag = dwarf::TagString(getTag())) 1012 OS << "[ " << Tag << " ]"; 1013 1014 if (this->isSubrange()) { 1015 DISubrange(DbgNode).printInternal(OS); 1016 } else if (this->isCompileUnit()) { 1017 DICompileUnit(DbgNode).printInternal(OS); 1018 } else if (this->isFile()) { 1019 DIFile(DbgNode).printInternal(OS); 1020 } else if (this->isEnumerator()) { 1021 DIEnumerator(DbgNode).printInternal(OS); 1022 } else if (this->isBasicType()) { 1023 DIType(DbgNode).printInternal(OS); 1024 } else if (this->isDerivedType()) { 1025 DIDerivedType(DbgNode).printInternal(OS); 1026 } else if (this->isCompositeType()) { 1027 DICompositeType(DbgNode).printInternal(OS); 1028 } else if (this->isSubprogram()) { 1029 DISubprogram(DbgNode).printInternal(OS); 1030 } else if (this->isGlobalVariable()) { 1031 DIGlobalVariable(DbgNode).printInternal(OS); 1032 } else if (this->isVariable()) { 1033 DIVariable(DbgNode).printInternal(OS); 1034 } else if (this->isObjCProperty()) { 1035 DIObjCProperty(DbgNode).printInternal(OS); 1036 } else if (this->isNameSpace()) { 1037 DINameSpace(DbgNode).printInternal(OS); 1038 } else if (this->isScope()) { 1039 DIScope(DbgNode).printInternal(OS); 1040 } 1041} 1042 1043void DISubrange::printInternal(raw_ostream &OS) const { 1044 int64_t Count = getCount(); 1045 if (Count != -1) 1046 OS << " [" << getLo() << ", " << Count - 1 << ']'; 1047 else 1048 OS << " [unbounded]"; 1049} 1050 1051void DIScope::printInternal(raw_ostream &OS) const { 1052 OS << " [" << getDirectory() << "/" << getFilename() << ']'; 1053} 1054 1055void DICompileUnit::printInternal(raw_ostream &OS) const { 1056 DIScope::printInternal(OS); 1057 if (const char *Lang = dwarf::LanguageString(getLanguage())) 1058 OS << " [" << Lang << ']'; 1059} 1060 1061void DIEnumerator::printInternal(raw_ostream &OS) const { 1062 OS << " [" << getName() << " :: " << getEnumValue() << ']'; 1063} 1064 1065void DIType::printInternal(raw_ostream &OS) const { 1066 if (!DbgNode) return; 1067 1068 StringRef Res = getName(); 1069 if (!Res.empty()) 1070 OS << " [" << Res << "]"; 1071 1072 // TODO: Print context? 1073 1074 OS << " [line " << getLineNumber() 1075 << ", size " << getSizeInBits() 1076 << ", align " << getAlignInBits() 1077 << ", offset " << getOffsetInBits(); 1078 if (isBasicType()) 1079 if (const char *Enc = 1080 dwarf::AttributeEncodingString(DIBasicType(DbgNode).getEncoding())) 1081 OS << ", enc " << Enc; 1082 OS << "]"; 1083 1084 if (isPrivate()) 1085 OS << " [private]"; 1086 else if (isProtected()) 1087 OS << " [protected]"; 1088 1089 if (isArtificial()) 1090 OS << " [artificial]"; 1091 1092 if (isForwardDecl()) 1093 OS << " [fwd]"; 1094 if (isVector()) 1095 OS << " [vector]"; 1096 if (isStaticMember()) 1097 OS << " [static]"; 1098} 1099 1100void DIDerivedType::printInternal(raw_ostream &OS) const { 1101 DIType::printInternal(OS); 1102 OS << " [from " << getTypeDerivedFrom().getName() << ']'; 1103} 1104 1105void DICompositeType::printInternal(raw_ostream &OS) const { 1106 DIType::printInternal(OS); 1107 DIArray A = getTypeArray(); 1108 OS << " [" << A.getNumElements() << " elements]"; 1109} 1110 1111void DINameSpace::printInternal(raw_ostream &OS) const { 1112 StringRef Name = getName(); 1113 if (!Name.empty()) 1114 OS << " [" << Name << ']'; 1115 1116 OS << " [line " << getLineNumber() << ']'; 1117} 1118 1119void DISubprogram::printInternal(raw_ostream &OS) const { 1120 // TODO : Print context 1121 OS << " [line " << getLineNumber() << ']'; 1122 1123 if (isLocalToUnit()) 1124 OS << " [local]"; 1125 1126 if (isDefinition()) 1127 OS << " [def]"; 1128 1129 if (getScopeLineNumber() != getLineNumber()) 1130 OS << " [scope " << getScopeLineNumber() << "]"; 1131 1132 if (isPrivate()) 1133 OS << " [private]"; 1134 else if (isProtected()) 1135 OS << " [protected]"; 1136 1137 StringRef Res = getName(); 1138 if (!Res.empty()) 1139 OS << " [" << Res << ']'; 1140} 1141 1142void DIGlobalVariable::printInternal(raw_ostream &OS) const { 1143 StringRef Res = getName(); 1144 if (!Res.empty()) 1145 OS << " [" << Res << ']'; 1146 1147 OS << " [line " << getLineNumber() << ']'; 1148 1149 // TODO : Print context 1150 1151 if (isLocalToUnit()) 1152 OS << " [local]"; 1153 1154 if (isDefinition()) 1155 OS << " [def]"; 1156} 1157 1158void DIVariable::printInternal(raw_ostream &OS) const { 1159 StringRef Res = getName(); 1160 if (!Res.empty()) 1161 OS << " [" << Res << ']'; 1162 1163 OS << " [line " << getLineNumber() << ']'; 1164} 1165 1166void DIObjCProperty::printInternal(raw_ostream &OS) const { 1167 StringRef Name = getObjCPropertyName(); 1168 if (!Name.empty()) 1169 OS << " [" << Name << ']'; 1170 1171 OS << " [line " << getLineNumber() 1172 << ", properties " << getUnsignedField(6) << ']'; 1173} 1174 1175static void printDebugLoc(DebugLoc DL, raw_ostream &CommentOS, 1176 const LLVMContext &Ctx) { 1177 if (!DL.isUnknown()) { // Print source line info. 1178 DIScope Scope(DL.getScope(Ctx)); 1179 // Omit the directory, because it's likely to be long and uninteresting. 1180 if (Scope.Verify()) 1181 CommentOS << Scope.getFilename(); 1182 else 1183 CommentOS << "<unknown>"; 1184 CommentOS << ':' << DL.getLine(); 1185 if (DL.getCol() != 0) 1186 CommentOS << ':' << DL.getCol(); 1187 DebugLoc InlinedAtDL = DebugLoc::getFromDILocation(DL.getInlinedAt(Ctx)); 1188 if (!InlinedAtDL.isUnknown()) { 1189 CommentOS << " @[ "; 1190 printDebugLoc(InlinedAtDL, CommentOS, Ctx); 1191 CommentOS << " ]"; 1192 } 1193 } 1194} 1195 1196void DIVariable::printExtendedName(raw_ostream &OS) const { 1197 const LLVMContext &Ctx = DbgNode->getContext(); 1198 StringRef Res = getName(); 1199 if (!Res.empty()) 1200 OS << Res << "," << getLineNumber(); 1201 if (MDNode *InlinedAt = getInlinedAt()) { 1202 DebugLoc InlinedAtDL = DebugLoc::getFromDILocation(InlinedAt); 1203 if (!InlinedAtDL.isUnknown()) { 1204 OS << " @["; 1205 printDebugLoc(InlinedAtDL, OS, Ctx); 1206 OS << "]"; 1207 } 1208 } 1209} 1210