CGDebugInfo.cpp revision 869683782e0da7a5fb7aca04b681a31d1b7ae355
1//===--- CGDebugInfo.cpp - Emit Debug Information for a Module ------------===// 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 coordinates the debug information generation while generating code. 11// 12//===----------------------------------------------------------------------===// 13 14#include "CGDebugInfo.h" 15#include "CodeGenFunction.h" 16#include "CodeGenModule.h" 17#include "clang/AST/ASTContext.h" 18#include "clang/AST/DeclObjC.h" 19#include "clang/AST/DeclTemplate.h" 20#include "clang/AST/Expr.h" 21#include "clang/AST/RecordLayout.h" 22#include "clang/Basic/SourceManager.h" 23#include "clang/Basic/FileManager.h" 24#include "clang/Basic/Version.h" 25#include "clang/Frontend/CodeGenOptions.h" 26#include "llvm/Constants.h" 27#include "llvm/DerivedTypes.h" 28#include "llvm/Instructions.h" 29#include "llvm/Intrinsics.h" 30#include "llvm/Module.h" 31#include "llvm/ADT/StringExtras.h" 32#include "llvm/ADT/SmallVector.h" 33#include "llvm/Support/Dwarf.h" 34#include "llvm/System/Path.h" 35#include "llvm/Target/TargetMachine.h" 36using namespace clang; 37using namespace clang::CodeGen; 38 39CGDebugInfo::CGDebugInfo(CodeGenModule &CGM) 40 : CGM(CGM), DebugFactory(CGM.getModule()), 41 BlockLiteralGenericSet(false) { 42 CreateCompileUnit(); 43} 44 45CGDebugInfo::~CGDebugInfo() { 46 assert(RegionStack.empty() && "Region stack mismatch, stack not empty!"); 47} 48 49void CGDebugInfo::setLocation(SourceLocation Loc) { 50 if (Loc.isValid()) 51 CurLoc = CGM.getContext().getSourceManager().getInstantiationLoc(Loc); 52} 53 54/// getContextDescriptor - Get context info for the decl. 55llvm::DIDescriptor CGDebugInfo::getContextDescriptor(const Decl *Context, 56 llvm::DIDescriptor &CompileUnit) { 57 if (!Context) 58 return CompileUnit; 59 60 llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator 61 I = RegionMap.find(Context); 62 if (I != RegionMap.end()) 63 return llvm::DIDescriptor(dyn_cast_or_null<llvm::MDNode>(I->second)); 64 65 // Check namespace. 66 if (const NamespaceDecl *NSDecl = dyn_cast<NamespaceDecl>(Context)) 67 return llvm::DIDescriptor(getOrCreateNameSpace(NSDecl, CompileUnit)); 68 69 if (const RecordDecl *RDecl = dyn_cast<RecordDecl>(Context)) { 70 if (!RDecl->isDependentType()) { 71 llvm::DIType Ty = getOrCreateType(CGM.getContext().getTypeDeclType(RDecl), 72 llvm::DIFile(CompileUnit)); 73 return llvm::DIDescriptor(Ty); 74 } 75 } 76 return CompileUnit; 77} 78 79/// getFunctionName - Get function name for the given FunctionDecl. If the 80/// name is constructred on demand (e.g. C++ destructor) then the name 81/// is stored on the side. 82llvm::StringRef CGDebugInfo::getFunctionName(const FunctionDecl *FD) { 83 assert (FD && "Invalid FunctionDecl!"); 84 IdentifierInfo *FII = FD->getIdentifier(); 85 if (FII) 86 return FII->getName(); 87 88 // Otherwise construct human readable name for debug info. 89 std::string NS = FD->getNameAsString(); 90 91 // Copy this name on the side and use its reference. 92 char *StrPtr = DebugInfoNames.Allocate<char>(NS.length()); 93 memcpy(StrPtr, NS.data(), NS.length()); 94 return llvm::StringRef(StrPtr, NS.length()); 95} 96 97/// getClassName - Get class name including template argument list. 98llvm::StringRef 99CGDebugInfo::getClassName(RecordDecl *RD) { 100 ClassTemplateSpecializationDecl *Spec 101 = dyn_cast<ClassTemplateSpecializationDecl>(RD); 102 if (!Spec) 103 return RD->getName(); 104 105 const TemplateArgument *Args; 106 unsigned NumArgs; 107 std::string Buffer; 108 if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) { 109 const TemplateSpecializationType *TST = 110 cast<TemplateSpecializationType>(TAW->getType()); 111 Args = TST->getArgs(); 112 NumArgs = TST->getNumArgs(); 113 } else { 114 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 115 Args = TemplateArgs.getFlatArgumentList(); 116 NumArgs = TemplateArgs.flat_size(); 117 } 118 Buffer = RD->getIdentifier()->getNameStart(); 119 PrintingPolicy Policy(CGM.getLangOptions()); 120 Buffer += TemplateSpecializationType::PrintTemplateArgumentList(Args, 121 NumArgs, 122 Policy); 123 124 // Copy this name on the side and use its reference. 125 char *StrPtr = DebugInfoNames.Allocate<char>(Buffer.length()); 126 memcpy(StrPtr, Buffer.data(), Buffer.length()); 127 return llvm::StringRef(StrPtr, Buffer.length()); 128 129} 130 131/// getOrCreateFile - Get the file debug info descriptor for the input location. 132llvm::DIFile CGDebugInfo::getOrCreateFile(SourceLocation Loc) { 133 if (!Loc.isValid()) 134 // If Location is not valid then use main input file. 135 return DebugFactory.CreateFile(TheCU.getFilename(), TheCU.getDirectory(), 136 TheCU); 137 SourceManager &SM = CGM.getContext().getSourceManager(); 138 PresumedLoc PLoc = SM.getPresumedLoc(Loc); 139 140 // Cache the results. 141 const char *fname = PLoc.getFilename(); 142 llvm::DenseMap<const char *, llvm::WeakVH>::iterator it = 143 DIFileCache.find(fname); 144 145 if (it != DIFileCache.end()) { 146 // Verify that the information still exists. 147 if (&*it->second) 148 return llvm::DIFile(cast<llvm::MDNode>(it->second)); 149 } 150 151 llvm::DIFile F = DebugFactory.CreateFile(PLoc.getFilename(), 152 getCurrentDirname(), TheCU); 153 154 DIFileCache[fname] = F; 155 return F; 156 157} 158 159/// getLineNumber - Get line number for the location. If location is invalid 160/// then use current location. 161unsigned CGDebugInfo::getLineNumber(SourceLocation Loc) { 162 assert (CurLoc.isValid() && "Invalid current location!"); 163 SourceManager &SM = CGM.getContext().getSourceManager(); 164 PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc); 165 return PLoc.getLine(); 166} 167 168/// getColumnNumber - Get column number for the location. If location is 169/// invalid then use current location. 170unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc) { 171 assert (CurLoc.isValid() && "Invalid current location!"); 172 SourceManager &SM = CGM.getContext().getSourceManager(); 173 PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc); 174 return PLoc.getColumn(); 175} 176 177llvm::StringRef CGDebugInfo::getCurrentDirname() { 178 if (!CWDName.empty()) 179 return CWDName; 180 char *CompDirnamePtr = NULL; 181 llvm::sys::Path CWD = llvm::sys::Path::GetCurrentDirectory(); 182 CompDirnamePtr = DebugInfoNames.Allocate<char>(CWD.size()); 183 memcpy(CompDirnamePtr, CWD.c_str(), CWD.size()); 184 return CWDName = llvm::StringRef(CompDirnamePtr, CWD.size()); 185} 186 187/// CreateCompileUnit - Create new compile unit. 188void CGDebugInfo::CreateCompileUnit() { 189 190 // Get absolute path name. 191 SourceManager &SM = CGM.getContext().getSourceManager(); 192 std::string MainFileName = CGM.getCodeGenOpts().MainFileName; 193 if (MainFileName.empty()) 194 MainFileName = "<unknown>"; 195 196 // The main file name provided via the "-main-file-name" option contains just 197 // the file name itself with no path information. This file name may have had 198 // a relative path, so we look into the actual file entry for the main 199 // file to determine the real absolute path for the file. 200 std::string MainFileDir; 201 if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) { 202 MainFileDir = MainFile->getDir()->getName(); 203 if (MainFileDir != ".") 204 MainFileName = MainFileDir + "/" + MainFileName; 205 } 206 207 // Save filename string. 208 char *FilenamePtr = DebugInfoNames.Allocate<char>(MainFileName.length()); 209 memcpy(FilenamePtr, MainFileName.c_str(), MainFileName.length()); 210 llvm::StringRef Filename(FilenamePtr, MainFileName.length()); 211 212 unsigned LangTag; 213 const LangOptions &LO = CGM.getLangOptions(); 214 if (LO.CPlusPlus) { 215 if (LO.ObjC1) 216 LangTag = llvm::dwarf::DW_LANG_ObjC_plus_plus; 217 else 218 LangTag = llvm::dwarf::DW_LANG_C_plus_plus; 219 } else if (LO.ObjC1) { 220 LangTag = llvm::dwarf::DW_LANG_ObjC; 221 } else if (LO.C99) { 222 LangTag = llvm::dwarf::DW_LANG_C99; 223 } else { 224 LangTag = llvm::dwarf::DW_LANG_C89; 225 } 226 227 const char *Producer = 228#ifdef CLANG_VENDOR 229 CLANG_VENDOR 230#endif 231 "clang " CLANG_VERSION_STRING; 232 233 // Figure out which version of the ObjC runtime we have. 234 unsigned RuntimeVers = 0; 235 if (LO.ObjC1) 236 RuntimeVers = LO.ObjCNonFragileABI ? 2 : 1; 237 238 // Create new compile unit. 239 TheCU = DebugFactory.CreateCompileUnit( 240 LangTag, Filename, getCurrentDirname(), 241 Producer, true, 242 LO.Optimize, CGM.getCodeGenOpts().DwarfDebugFlags, RuntimeVers); 243} 244 245/// CreateType - Get the Basic type from the cache or create a new 246/// one if necessary. 247llvm::DIType CGDebugInfo::CreateType(const BuiltinType *BT, 248 llvm::DIFile Unit) { 249 unsigned Encoding = 0; 250 const char *BTName = NULL; 251 switch (BT->getKind()) { 252 default: 253 case BuiltinType::Void: 254 return llvm::DIType(); 255 case BuiltinType::ObjCClass: 256 return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type, 257 Unit, "objc_class", Unit, 0, 0, 0, 0, 258 llvm::DIType::FlagFwdDecl, 259 llvm::DIType(), llvm::DIArray()); 260 case BuiltinType::ObjCId: { 261 // typedef struct objc_class *Class; 262 // typedef struct objc_object { 263 // Class isa; 264 // } *id; 265 266 llvm::DIType OCTy = 267 DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type, 268 Unit, "objc_class", Unit, 0, 0, 0, 0, 269 llvm::DIType::FlagFwdDecl, 270 llvm::DIType(), llvm::DIArray()); 271 unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 272 273 llvm::DIType ISATy = 274 DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type, 275 Unit, "", Unit, 276 0, Size, 0, 0, 0, OCTy); 277 278 llvm::SmallVector<llvm::DIDescriptor, 16> EltTys; 279 280 llvm::DIType FieldTy = 281 DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit, 282 "isa", Unit, 283 0,Size, 0, 0, 0, ISATy); 284 EltTys.push_back(FieldTy); 285 llvm::DIArray Elements = 286 DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size()); 287 288 return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type, 289 Unit, "objc_object", Unit, 0, 0, 0, 0, 290 0, 291 llvm::DIType(), Elements); 292 } 293 case BuiltinType::UChar: 294 case BuiltinType::Char_U: Encoding = llvm::dwarf::DW_ATE_unsigned_char; break; 295 case BuiltinType::Char_S: 296 case BuiltinType::SChar: Encoding = llvm::dwarf::DW_ATE_signed_char; break; 297 case BuiltinType::UShort: 298 case BuiltinType::UInt: 299 case BuiltinType::ULong: 300 case BuiltinType::ULongLong: Encoding = llvm::dwarf::DW_ATE_unsigned; break; 301 case BuiltinType::Short: 302 case BuiltinType::Int: 303 case BuiltinType::Long: 304 case BuiltinType::LongLong: Encoding = llvm::dwarf::DW_ATE_signed; break; 305 case BuiltinType::Bool: Encoding = llvm::dwarf::DW_ATE_boolean; break; 306 case BuiltinType::Float: 307 case BuiltinType::LongDouble: 308 case BuiltinType::Double: Encoding = llvm::dwarf::DW_ATE_float; break; 309 } 310 311 switch (BT->getKind()) { 312 case BuiltinType::Long: BTName = "long int"; break; 313 case BuiltinType::LongLong: BTName = "long long int"; break; 314 case BuiltinType::ULong: BTName = "long unsigned int"; break; 315 case BuiltinType::ULongLong: BTName = "long long unsigned int"; break; 316 default: 317 BTName = BT->getName(CGM.getContext().getLangOptions()); 318 break; 319 } 320 // Bit size, align and offset of the type. 321 uint64_t Size = CGM.getContext().getTypeSize(BT); 322 uint64_t Align = CGM.getContext().getTypeAlign(BT); 323 uint64_t Offset = 0; 324 325 llvm::DIType DbgTy = 326 DebugFactory.CreateBasicType(Unit, BTName, 327 Unit, 0, Size, Align, 328 Offset, /*flags*/ 0, Encoding); 329 return DbgTy; 330} 331 332llvm::DIType CGDebugInfo::CreateType(const ComplexType *Ty, 333 llvm::DIFile Unit) { 334 // Bit size, align and offset of the type. 335 unsigned Encoding = llvm::dwarf::DW_ATE_complex_float; 336 if (Ty->isComplexIntegerType()) 337 Encoding = llvm::dwarf::DW_ATE_lo_user; 338 339 uint64_t Size = CGM.getContext().getTypeSize(Ty); 340 uint64_t Align = CGM.getContext().getTypeAlign(Ty); 341 uint64_t Offset = 0; 342 343 llvm::DIType DbgTy = 344 DebugFactory.CreateBasicType(Unit, "complex", 345 Unit, 0, Size, Align, 346 Offset, /*flags*/ 0, Encoding); 347 return DbgTy; 348} 349 350/// CreateCVRType - Get the qualified type from the cache or create 351/// a new one if necessary. 352llvm::DIType CGDebugInfo::CreateQualifiedType(QualType Ty, llvm::DIFile Unit) { 353 QualifierCollector Qc; 354 const Type *T = Qc.strip(Ty); 355 356 // Ignore these qualifiers for now. 357 Qc.removeObjCGCAttr(); 358 Qc.removeAddressSpace(); 359 360 // We will create one Derived type for one qualifier and recurse to handle any 361 // additional ones. 362 unsigned Tag; 363 if (Qc.hasConst()) { 364 Tag = llvm::dwarf::DW_TAG_const_type; 365 Qc.removeConst(); 366 } else if (Qc.hasVolatile()) { 367 Tag = llvm::dwarf::DW_TAG_volatile_type; 368 Qc.removeVolatile(); 369 } else if (Qc.hasRestrict()) { 370 Tag = llvm::dwarf::DW_TAG_restrict_type; 371 Qc.removeRestrict(); 372 } else { 373 assert(Qc.empty() && "Unknown type qualifier for debug info"); 374 return getOrCreateType(QualType(T, 0), Unit); 375 } 376 377 llvm::DIType FromTy = getOrCreateType(Qc.apply(T), Unit); 378 379 // No need to fill in the Name, Line, Size, Alignment, Offset in case of 380 // CVR derived types. 381 llvm::DIType DbgTy = 382 DebugFactory.CreateDerivedType(Tag, Unit, "", Unit, 383 0, 0, 0, 0, 0, FromTy); 384 return DbgTy; 385} 386 387llvm::DIType CGDebugInfo::CreateType(const ObjCObjectPointerType *Ty, 388 llvm::DIFile Unit) { 389 llvm::DIType DbgTy = 390 CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 391 Ty->getPointeeType(), Unit); 392 return DbgTy; 393} 394 395llvm::DIType CGDebugInfo::CreateType(const PointerType *Ty, 396 llvm::DIFile Unit) { 397 return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 398 Ty->getPointeeType(), Unit); 399} 400 401llvm::DIType CGDebugInfo::CreatePointerLikeType(unsigned Tag, 402 const Type *Ty, 403 QualType PointeeTy, 404 llvm::DIFile Unit) { 405 llvm::DIType EltTy = getOrCreateType(PointeeTy, Unit); 406 407 // Bit size, align and offset of the type. 408 409 // Size is always the size of a pointer. We can't use getTypeSize here 410 // because that does not return the correct value for references. 411 uint64_t Size = 412 CGM.getContext().Target.getPointerWidth(PointeeTy.getAddressSpace()); 413 uint64_t Align = CGM.getContext().getTypeAlign(Ty); 414 415 return 416 DebugFactory.CreateDerivedType(Tag, Unit, "", Unit, 417 0, Size, Align, 0, 0, EltTy); 418 419} 420 421llvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty, 422 llvm::DIFile Unit) { 423 if (BlockLiteralGenericSet) 424 return BlockLiteralGeneric; 425 426 unsigned Tag = llvm::dwarf::DW_TAG_structure_type; 427 428 llvm::SmallVector<llvm::DIDescriptor, 5> EltTys; 429 430 llvm::DIType FieldTy; 431 432 QualType FType; 433 uint64_t FieldSize, FieldOffset; 434 unsigned FieldAlign; 435 436 llvm::DIArray Elements; 437 llvm::DIType EltTy, DescTy; 438 439 FieldOffset = 0; 440 FType = CGM.getContext().UnsignedLongTy; 441 EltTys.push_back(CreateMemberType(Unit, FType, "reserved", &FieldOffset)); 442 EltTys.push_back(CreateMemberType(Unit, FType, "Size", &FieldOffset)); 443 444 Elements = DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size()); 445 EltTys.clear(); 446 447 unsigned Flags = llvm::DIType::FlagAppleBlock; 448 unsigned LineNo = getLineNumber(CurLoc); 449 450 EltTy = DebugFactory.CreateCompositeType(Tag, Unit, "__block_descriptor", 451 Unit, LineNo, FieldOffset, 0, 0, 452 Flags, llvm::DIType(), Elements); 453 454 // Bit size, align and offset of the type. 455 uint64_t Size = CGM.getContext().getTypeSize(Ty); 456 uint64_t Align = CGM.getContext().getTypeAlign(Ty); 457 458 DescTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type, 459 Unit, "", Unit, 460 LineNo, Size, Align, 0, 0, EltTy); 461 462 FieldOffset = 0; 463 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 464 EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 465 FType = CGM.getContext().IntTy; 466 EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 467 EltTys.push_back(CreateMemberType(Unit, FType, "__reserved", &FieldOffset)); 468 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 469 EltTys.push_back(CreateMemberType(Unit, FType, "__FuncPtr", &FieldOffset)); 470 471 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 472 FieldTy = DescTy; 473 FieldSize = CGM.getContext().getTypeSize(Ty); 474 FieldAlign = CGM.getContext().getTypeAlign(Ty); 475 FieldTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit, 476 "__descriptor", Unit, 477 LineNo, FieldSize, FieldAlign, 478 FieldOffset, 0, FieldTy); 479 EltTys.push_back(FieldTy); 480 481 FieldOffset += FieldSize; 482 Elements = DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size()); 483 484 EltTy = DebugFactory.CreateCompositeType(Tag, Unit, "__block_literal_generic", 485 Unit, LineNo, FieldOffset, 0, 0, 486 Flags, llvm::DIType(), Elements); 487 488 BlockLiteralGenericSet = true; 489 BlockLiteralGeneric 490 = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type, Unit, 491 "", Unit, 492 LineNo, Size, Align, 0, 0, EltTy); 493 return BlockLiteralGeneric; 494} 495 496llvm::DIType CGDebugInfo::CreateType(const TypedefType *Ty, 497 llvm::DIFile Unit) { 498 // Typedefs are derived from some other type. If we have a typedef of a 499 // typedef, make sure to emit the whole chain. 500 llvm::DIType Src = getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit); 501 502 // We don't set size information, but do specify where the typedef was 503 // declared. 504 unsigned Line = getLineNumber(Ty->getDecl()->getLocation()); 505 506 llvm::DIDescriptor TyContext 507 = getContextDescriptor(dyn_cast<Decl>(Ty->getDecl()->getDeclContext()), 508 Unit); 509 llvm::DIType DbgTy = 510 DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_typedef, 511 TyContext, 512 Ty->getDecl()->getName(), Unit, 513 Line, 0, 0, 0, 0, Src); 514 return DbgTy; 515} 516 517llvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty, 518 llvm::DIFile Unit) { 519 llvm::SmallVector<llvm::DIDescriptor, 16> EltTys; 520 521 // Add the result type at least. 522 EltTys.push_back(getOrCreateType(Ty->getResultType(), Unit)); 523 524 // Set up remainder of arguments if there is a prototype. 525 // FIXME: IF NOT, HOW IS THIS REPRESENTED? llvm-gcc doesn't represent '...'! 526 if (const FunctionProtoType *FTP = dyn_cast<FunctionProtoType>(Ty)) { 527 for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i) 528 EltTys.push_back(getOrCreateType(FTP->getArgType(i), Unit)); 529 } else { 530 // FIXME: Handle () case in C. llvm-gcc doesn't do it either. 531 } 532 533 llvm::DIArray EltTypeArray = 534 DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size()); 535 536 llvm::DIType DbgTy = 537 DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_subroutine_type, 538 Unit, "", Unit, 539 0, 0, 0, 0, 0, 540 llvm::DIType(), EltTypeArray); 541 return DbgTy; 542} 543 544/// CollectRecordFields - A helper function to collect debug info for 545/// record fields. This is used while creating debug info entry for a Record. 546void CGDebugInfo:: 547CollectRecordFields(const RecordDecl *RD, llvm::DIFile Unit, 548 llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys) { 549 unsigned FieldNo = 0; 550 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 551 for (RecordDecl::field_iterator I = RD->field_begin(), 552 E = RD->field_end(); 553 I != E; ++I, ++FieldNo) { 554 FieldDecl *Field = *I; 555 llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); 556 llvm::StringRef FieldName = Field->getName(); 557 558 // Ignore unnamed fields. Do not ignore unnamed records. 559 if (FieldName.empty() && !isa<RecordType>(Field->getType())) 560 continue; 561 562 // Get the location for the field. 563 llvm::DIFile FieldDefUnit = getOrCreateFile(Field->getLocation()); 564 unsigned FieldLine = getLineNumber(Field->getLocation()); 565 QualType FType = Field->getType(); 566 uint64_t FieldSize = 0; 567 unsigned FieldAlign = 0; 568 if (!FType->isIncompleteArrayType()) { 569 570 // Bit size, align and offset of the type. 571 FieldSize = CGM.getContext().getTypeSize(FType); 572 Expr *BitWidth = Field->getBitWidth(); 573 if (BitWidth) 574 FieldSize = BitWidth->EvaluateAsInt(CGM.getContext()).getZExtValue(); 575 FieldAlign = CGM.getContext().getTypeAlign(FType); 576 } 577 578 uint64_t FieldOffset = RL.getFieldOffset(FieldNo); 579 580 unsigned Flags = 0; 581 AccessSpecifier Access = I->getAccess(); 582 if (Access == clang::AS_private) 583 Flags |= llvm::DIType::FlagPrivate; 584 else if (Access == clang::AS_protected) 585 Flags |= llvm::DIType::FlagProtected; 586 587 // Create a DW_TAG_member node to remember the offset of this field in the 588 // struct. FIXME: This is an absolutely insane way to capture this 589 // information. When we gut debug info, this should be fixed. 590 FieldTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit, 591 FieldName, FieldDefUnit, 592 FieldLine, FieldSize, FieldAlign, 593 FieldOffset, Flags, FieldTy); 594 EltTys.push_back(FieldTy); 595 } 596} 597 598/// getOrCreateMethodType - CXXMethodDecl's type is a FunctionType. This 599/// function type is not updated to include implicit "this" pointer. Use this 600/// routine to get a method type which includes "this" pointer. 601llvm::DIType 602CGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method, 603 llvm::DIFile Unit) { 604 llvm::DIType FnTy 605 = getOrCreateType(QualType(Method->getType()->getAs<FunctionProtoType>(), 606 0), 607 Unit); 608 609 // Static methods do not need "this" pointer argument. 610 if (Method->isStatic()) 611 return FnTy; 612 613 // Add "this" pointer. 614 615 llvm::DIArray Args = llvm::DICompositeType(FnTy).getTypeArray(); 616 assert (Args.getNumElements() && "Invalid number of arguments!"); 617 618 llvm::SmallVector<llvm::DIDescriptor, 16> Elts; 619 620 // First element is always return type. For 'void' functions it is NULL. 621 Elts.push_back(Args.getElement(0)); 622 623 // "this" pointer is always first argument. 624 ASTContext &Context = CGM.getContext(); 625 QualType ThisPtr = 626 Context.getPointerType(Context.getTagDeclType(Method->getParent())); 627 llvm::DIType ThisPtrType = 628 DebugFactory.CreateArtificialType(getOrCreateType(ThisPtr, Unit)); 629 630 TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType; 631 Elts.push_back(ThisPtrType); 632 633 // Copy rest of the arguments. 634 for (unsigned i = 1, e = Args.getNumElements(); i != e; ++i) 635 Elts.push_back(Args.getElement(i)); 636 637 llvm::DIArray EltTypeArray = 638 DebugFactory.GetOrCreateArray(Elts.data(), Elts.size()); 639 640 return 641 DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_subroutine_type, 642 Unit, "", Unit, 643 0, 0, 0, 0, 0, 644 llvm::DIType(), EltTypeArray); 645} 646 647/// CreateCXXMemberFunction - A helper function to create a DISubprogram for 648/// a single member function GlobalDecl. 649llvm::DISubprogram 650CGDebugInfo::CreateCXXMemberFunction(const CXXMethodDecl *Method, 651 llvm::DIFile Unit, 652 llvm::DIType RecordTy) { 653 bool IsCtorOrDtor = 654 isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method); 655 656 llvm::StringRef MethodName = getFunctionName(Method); 657 llvm::DIType MethodTy = getOrCreateMethodType(Method, Unit); 658 659 // Since a single ctor/dtor corresponds to multiple functions, it doesn't 660 // make sense to give a single ctor/dtor a linkage name. 661 llvm::StringRef MethodLinkageName; 662 if (!IsCtorOrDtor) 663 MethodLinkageName = CGM.getMangledName(Method); 664 665 // Get the location for the method. 666 llvm::DIFile MethodDefUnit = getOrCreateFile(Method->getLocation()); 667 unsigned MethodLine = getLineNumber(Method->getLocation()); 668 669 // Collect virtual method info. 670 llvm::DIType ContainingType; 671 unsigned Virtuality = 0; 672 unsigned VIndex = 0; 673 674 if (Method->isVirtual()) { 675 if (Method->isPure()) 676 Virtuality = llvm::dwarf::DW_VIRTUALITY_pure_virtual; 677 else 678 Virtuality = llvm::dwarf::DW_VIRTUALITY_virtual; 679 680 // It doesn't make sense to give a virtual destructor a vtable index, 681 // since a single destructor has two entries in the vtable. 682 if (!isa<CXXDestructorDecl>(Method)) 683 VIndex = CGM.getVTables().getMethodVTableIndex(Method); 684 ContainingType = RecordTy; 685 } 686 687 llvm::DISubprogram SP = 688 DebugFactory.CreateSubprogram(RecordTy , MethodName, MethodName, 689 MethodLinkageName, 690 MethodDefUnit, MethodLine, 691 MethodTy, /*isLocalToUnit=*/false, 692 /* isDefintion=*/ false, 693 Virtuality, VIndex, ContainingType, 694 Method->isImplicit(), 695 CGM.getLangOptions().Optimize); 696 697 // Don't cache ctors or dtors since we have to emit multiple functions for 698 // a single ctor or dtor. 699 if (!IsCtorOrDtor && Method->isThisDeclarationADefinition()) 700 SPCache[Method] = llvm::WeakVH(SP); 701 702 return SP; 703} 704 705/// CollectCXXMemberFunctions - A helper function to collect debug info for 706/// C++ member functions.This is used while creating debug info entry for 707/// a Record. 708void CGDebugInfo:: 709CollectCXXMemberFunctions(const CXXRecordDecl *RD, llvm::DIFile Unit, 710 llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys, 711 llvm::DIType RecordTy) { 712 for(CXXRecordDecl::method_iterator I = RD->method_begin(), 713 E = RD->method_end(); I != E; ++I) { 714 const CXXMethodDecl *Method = *I; 715 716 if (Method->isImplicit() && !Method->isUsed()) 717 continue; 718 719 EltTys.push_back(CreateCXXMemberFunction(Method, Unit, RecordTy)); 720 } 721} 722 723/// CollectCXXBases - A helper function to collect debug info for 724/// C++ base classes. This is used while creating debug info entry for 725/// a Record. 726void CGDebugInfo:: 727CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit, 728 llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys, 729 llvm::DIType RecordTy) { 730 731 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 732 for (CXXRecordDecl::base_class_const_iterator BI = RD->bases_begin(), 733 BE = RD->bases_end(); BI != BE; ++BI) { 734 unsigned BFlags = 0; 735 uint64_t BaseOffset; 736 737 const CXXRecordDecl *Base = 738 cast<CXXRecordDecl>(BI->getType()->getAs<RecordType>()->getDecl()); 739 740 if (BI->isVirtual()) { 741 // virtual base offset offset is -ve. The code generator emits dwarf 742 // expression where it expects +ve number. 743 BaseOffset = 0 - CGM.getVTables().getVirtualBaseOffsetOffset(RD, Base); 744 BFlags = llvm::DIType::FlagVirtual; 745 } else 746 BaseOffset = RL.getBaseClassOffset(Base); 747 748 AccessSpecifier Access = BI->getAccessSpecifier(); 749 if (Access == clang::AS_private) 750 BFlags |= llvm::DIType::FlagPrivate; 751 else if (Access == clang::AS_protected) 752 BFlags |= llvm::DIType::FlagProtected; 753 754 llvm::DIType DTy = 755 DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_inheritance, 756 RecordTy, llvm::StringRef(), 757 Unit, 0, 0, 0, 758 BaseOffset, BFlags, 759 getOrCreateType(BI->getType(), 760 Unit)); 761 EltTys.push_back(DTy); 762 } 763} 764 765/// getOrCreateVTablePtrType - Return debug info descriptor for vtable. 766llvm::DIType CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile Unit) { 767 if (VTablePtrType.isValid()) 768 return VTablePtrType; 769 770 ASTContext &Context = CGM.getContext(); 771 772 /* Function type */ 773 llvm::DIDescriptor STy = getOrCreateType(Context.IntTy, Unit); 774 llvm::DIArray SElements = DebugFactory.GetOrCreateArray(&STy, 1); 775 llvm::DIType SubTy = 776 DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_subroutine_type, 777 Unit, "", Unit, 778 0, 0, 0, 0, 0, llvm::DIType(), SElements); 779 780 unsigned Size = Context.getTypeSize(Context.VoidPtrTy); 781 llvm::DIType vtbl_ptr_type 782 = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type, 783 Unit, "__vtbl_ptr_type", Unit, 784 0, Size, 0, 0, 0, SubTy); 785 786 VTablePtrType = 787 DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type, 788 Unit, "", Unit, 789 0, Size, 0, 0, 0, vtbl_ptr_type); 790 return VTablePtrType; 791} 792 793/// getVTableName - Get vtable name for the given Class. 794llvm::StringRef CGDebugInfo::getVTableName(const CXXRecordDecl *RD) { 795 // Otherwise construct gdb compatible name name. 796 std::string Name = "_vptr$" + RD->getNameAsString(); 797 798 // Copy this name on the side and use its reference. 799 char *StrPtr = DebugInfoNames.Allocate<char>(Name.length()); 800 memcpy(StrPtr, Name.data(), Name.length()); 801 return llvm::StringRef(StrPtr, Name.length()); 802} 803 804 805/// CollectVTableInfo - If the C++ class has vtable info then insert appropriate 806/// debug info entry in EltTys vector. 807void CGDebugInfo:: 808CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile Unit, 809 llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys) { 810 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 811 812 // If there is a primary base then it will hold vtable info. 813 if (RL.getPrimaryBase()) 814 return; 815 816 // If this class is not dynamic then there is not any vtable info to collect. 817 if (!RD->isDynamicClass()) 818 return; 819 820 unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 821 llvm::DIType VPTR 822 = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit, 823 getVTableName(RD), Unit, 824 0, Size, 0, 0, 0, 825 getOrCreateVTablePtrType(Unit)); 826 EltTys.push_back(VPTR); 827} 828 829/// CreateType - get structure or union type. 830llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, 831 llvm::DIFile Unit) { 832 RecordDecl *RD = Ty->getDecl(); 833 834 unsigned Tag; 835 if (RD->isStruct()) 836 Tag = llvm::dwarf::DW_TAG_structure_type; 837 else if (RD->isUnion()) 838 Tag = llvm::dwarf::DW_TAG_union_type; 839 else { 840 assert(RD->isClass() && "Unknown RecordType!"); 841 Tag = llvm::dwarf::DW_TAG_class_type; 842 } 843 844 // Get overall information about the record type for the debug info. 845 llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 846 unsigned Line = getLineNumber(RD->getLocation()); 847 848 // Records and classes and unions can all be recursive. To handle them, we 849 // first generate a debug descriptor for the struct as a forward declaration. 850 // Then (if it is a definition) we go through and get debug info for all of 851 // its members. Finally, we create a descriptor for the complete type (which 852 // may refer to the forward decl if the struct is recursive) and replace all 853 // uses of the forward declaration with the final definition. 854 llvm::DIDescriptor FDContext = 855 getContextDescriptor(dyn_cast<Decl>(RD->getDeclContext()), Unit); 856 857 // If this is just a forward declaration, construct an appropriately 858 // marked node and just return it. 859 if (!RD->getDefinition()) { 860 llvm::DICompositeType FwdDecl = 861 DebugFactory.CreateCompositeType(Tag, FDContext, RD->getName(), 862 DefUnit, Line, 0, 0, 0, 863 llvm::DIType::FlagFwdDecl, 864 llvm::DIType(), llvm::DIArray()); 865 866 return FwdDecl; 867 } 868 869 // A RD->getName() is not unique. However, the debug info descriptors 870 // are uniqued so use type name to ensure uniquness. 871 llvm::DIType FwdDecl = DebugFactory.CreateTemporaryType(); 872 873 llvm::MDNode *MN = FwdDecl; 874 llvm::TrackingVH<llvm::MDNode> FwdDeclNode = MN; 875 // Otherwise, insert it into the TypeCache so that recursive uses will find 876 // it. 877 TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = FwdDecl; 878 // Push the struct on region stack. 879 RegionStack.push_back(FwdDeclNode); 880 RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); 881 882 // Convert all the elements. 883 llvm::SmallVector<llvm::DIDescriptor, 16> EltTys; 884 885 const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); 886 if (CXXDecl) { 887 CollectCXXBases(CXXDecl, Unit, EltTys, FwdDecl); 888 CollectVTableInfo(CXXDecl, Unit, EltTys); 889 } 890 891 // Collect static variables with initializers. 892 for (RecordDecl::decl_iterator I = RD->decls_begin(), E = RD->decls_end(); 893 I != E; ++I) 894 if (const VarDecl *V = dyn_cast<VarDecl>(*I)) { 895 if (const Expr *Init = V->getInit()) { 896 Expr::EvalResult Result; 897 if (Init->Evaluate(Result, CGM.getContext()) && Result.Val.isInt()) { 898 llvm::ConstantInt *CI 899 = llvm::ConstantInt::get(CGM.getLLVMContext(), Result.Val.getInt()); 900 901 // Create the descriptor for static variable. 902 llvm::DIFile VUnit = getOrCreateFile(V->getLocation()); 903 llvm::StringRef VName = V->getName(); 904 llvm::DIType VTy = getOrCreateType(V->getType(), VUnit); 905 // Do not use DIGlobalVariable for enums. 906 if (VTy.getTag() != llvm::dwarf::DW_TAG_enumeration_type) { 907 DebugFactory.CreateGlobalVariable(FwdDecl, VName, VName, VName, VUnit, 908 getLineNumber(V->getLocation()), 909 VTy, true, true, CI); 910 } 911 } 912 } 913 } 914 915 CollectRecordFields(RD, Unit, EltTys); 916 llvm::MDNode *ContainingType = NULL; 917 if (CXXDecl) { 918 CollectCXXMemberFunctions(CXXDecl, Unit, EltTys, FwdDecl); 919 920 // A class's primary base or the class itself contains the vtable. 921 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 922 if (const CXXRecordDecl *PBase = RL.getPrimaryBase()) 923 ContainingType = 924 getOrCreateType(QualType(PBase->getTypeForDecl(), 0), Unit); 925 else if (CXXDecl->isDynamicClass()) 926 ContainingType = FwdDecl; 927 } 928 929 llvm::DIArray Elements = 930 DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size()); 931 932 // Bit size, align and offset of the type. 933 uint64_t Size = CGM.getContext().getTypeSize(Ty); 934 uint64_t Align = CGM.getContext().getTypeAlign(Ty); 935 936 RegionStack.pop_back(); 937 llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator RI = 938 RegionMap.find(Ty->getDecl()); 939 if (RI != RegionMap.end()) 940 RegionMap.erase(RI); 941 942 llvm::DIDescriptor RDContext = 943 getContextDescriptor(dyn_cast<Decl>(RD->getDeclContext()), Unit); 944 945 llvm::StringRef RDName = RD->getName(); 946 // If this is a class, include the template arguments also. 947 if (Tag == llvm::dwarf::DW_TAG_class_type) 948 RDName = getClassName(RD); 949 950 llvm::DICompositeType RealDecl = 951 DebugFactory.CreateCompositeType(Tag, RDContext, 952 RDName, 953 DefUnit, Line, Size, Align, 0, 0, 954 llvm::DIType(), Elements, 955 0, ContainingType); 956 957 // Now that we have a real decl for the struct, replace anything using the 958 // old decl with the new one. This will recursively update the debug info. 959 llvm::DIType(FwdDeclNode).replaceAllUsesWith(RealDecl); 960 RegionMap[RD] = llvm::WeakVH(RealDecl); 961 return RealDecl; 962} 963 964/// CreateType - get objective-c object type. 965llvm::DIType CGDebugInfo::CreateType(const ObjCObjectType *Ty, 966 llvm::DIFile Unit) { 967 // Ignore protocols. 968 return getOrCreateType(Ty->getBaseType(), Unit); 969} 970 971/// CreateType - get objective-c interface type. 972llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, 973 llvm::DIFile Unit) { 974 ObjCInterfaceDecl *ID = Ty->getDecl(); 975 unsigned Tag = llvm::dwarf::DW_TAG_structure_type; 976 977 // Get overall information about the record type for the debug info. 978 llvm::DIFile DefUnit = getOrCreateFile(ID->getLocation()); 979 unsigned Line = getLineNumber(ID->getLocation()); 980 unsigned RuntimeLang = TheCU.getLanguage(); 981 982 // To handle recursive interface, we 983 // first generate a debug descriptor for the struct as a forward declaration. 984 // Then (if it is a definition) we go through and get debug info for all of 985 // its members. Finally, we create a descriptor for the complete type (which 986 // may refer to the forward decl if the struct is recursive) and replace all 987 // uses of the forward declaration with the final definition. 988 llvm::DIType FwdDecl = DebugFactory.CreateTemporaryType(); 989 990 // If this is just a forward declaration, return it. 991 if (ID->isForwardDecl()) 992 return FwdDecl; 993 994 llvm::MDNode *MN = FwdDecl; 995 llvm::TrackingVH<llvm::MDNode> FwdDeclNode = MN; 996 // Otherwise, insert it into the TypeCache so that recursive uses will find 997 // it. 998 TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = FwdDecl; 999 // Push the struct on region stack. 1000 RegionStack.push_back(FwdDeclNode); 1001 RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); 1002 1003 // Convert all the elements. 1004 llvm::SmallVector<llvm::DIDescriptor, 16> EltTys; 1005 1006 ObjCInterfaceDecl *SClass = ID->getSuperClass(); 1007 if (SClass) { 1008 llvm::DIType SClassTy = 1009 getOrCreateType(CGM.getContext().getObjCInterfaceType(SClass), Unit); 1010 llvm::DIType InhTag = 1011 DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_inheritance, 1012 Unit, "", Unit, 0, 0, 0, 1013 0 /* offset */, 0, SClassTy); 1014 EltTys.push_back(InhTag); 1015 } 1016 1017 const ASTRecordLayout &RL = CGM.getContext().getASTObjCInterfaceLayout(ID); 1018 1019 unsigned FieldNo = 0; 1020 for (ObjCInterfaceDecl::ivar_iterator I = ID->ivar_begin(), 1021 E = ID->ivar_end(); I != E; ++I, ++FieldNo) { 1022 ObjCIvarDecl *Field = *I; 1023 llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); 1024 1025 llvm::StringRef FieldName = Field->getName(); 1026 1027 // Ignore unnamed fields. 1028 if (FieldName.empty()) 1029 continue; 1030 1031 // Get the location for the field. 1032 llvm::DIFile FieldDefUnit = getOrCreateFile(Field->getLocation()); 1033 unsigned FieldLine = getLineNumber(Field->getLocation()); 1034 QualType FType = Field->getType(); 1035 uint64_t FieldSize = 0; 1036 unsigned FieldAlign = 0; 1037 1038 if (!FType->isIncompleteArrayType()) { 1039 1040 // Bit size, align and offset of the type. 1041 FieldSize = CGM.getContext().getTypeSize(FType); 1042 Expr *BitWidth = Field->getBitWidth(); 1043 if (BitWidth) 1044 FieldSize = BitWidth->EvaluateAsInt(CGM.getContext()).getZExtValue(); 1045 1046 FieldAlign = CGM.getContext().getTypeAlign(FType); 1047 } 1048 1049 uint64_t FieldOffset = RL.getFieldOffset(FieldNo); 1050 1051 unsigned Flags = 0; 1052 if (Field->getAccessControl() == ObjCIvarDecl::Protected) 1053 Flags = llvm::DIType::FlagProtected; 1054 else if (Field->getAccessControl() == ObjCIvarDecl::Private) 1055 Flags = llvm::DIType::FlagPrivate; 1056 1057 // Create a DW_TAG_member node to remember the offset of this field in the 1058 // struct. FIXME: This is an absolutely insane way to capture this 1059 // information. When we gut debug info, this should be fixed. 1060 FieldTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit, 1061 FieldName, FieldDefUnit, 1062 FieldLine, FieldSize, FieldAlign, 1063 FieldOffset, Flags, FieldTy); 1064 EltTys.push_back(FieldTy); 1065 } 1066 1067 llvm::DIArray Elements = 1068 DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size()); 1069 1070 RegionStack.pop_back(); 1071 llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator RI = 1072 RegionMap.find(Ty->getDecl()); 1073 if (RI != RegionMap.end()) 1074 RegionMap.erase(RI); 1075 1076 // Bit size, align and offset of the type. 1077 uint64_t Size = CGM.getContext().getTypeSize(Ty); 1078 uint64_t Align = CGM.getContext().getTypeAlign(Ty); 1079 1080 llvm::DICompositeType RealDecl = 1081 DebugFactory.CreateCompositeType(Tag, Unit, ID->getName(), DefUnit, 1082 Line, Size, Align, 0, 0, llvm::DIType(), 1083 Elements, RuntimeLang); 1084 1085 // Now that we have a real decl for the struct, replace anything using the 1086 // old decl with the new one. This will recursively update the debug info. 1087 llvm::DIType(FwdDeclNode).replaceAllUsesWith(RealDecl); 1088 RegionMap[ID] = llvm::WeakVH(RealDecl); 1089 1090 return RealDecl; 1091} 1092 1093llvm::DIType CGDebugInfo::CreateType(const EnumType *Ty, 1094 llvm::DIFile Unit) { 1095 EnumDecl *ED = Ty->getDecl(); 1096 1097 llvm::SmallVector<llvm::DIDescriptor, 32> Enumerators; 1098 1099 // Create DIEnumerator elements for each enumerator. 1100 for (EnumDecl::enumerator_iterator 1101 Enum = ED->enumerator_begin(), EnumEnd = ED->enumerator_end(); 1102 Enum != EnumEnd; ++Enum) { 1103 Enumerators.push_back(DebugFactory.CreateEnumerator(Enum->getName(), 1104 Enum->getInitVal().getZExtValue())); 1105 } 1106 1107 // Return a CompositeType for the enum itself. 1108 llvm::DIArray EltArray = 1109 DebugFactory.GetOrCreateArray(Enumerators.data(), Enumerators.size()); 1110 1111 llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation()); 1112 unsigned Line = getLineNumber(ED->getLocation()); 1113 1114 // Size and align of the type. 1115 uint64_t Size = 0; 1116 unsigned Align = 0; 1117 if (!Ty->isIncompleteType()) { 1118 Size = CGM.getContext().getTypeSize(Ty); 1119 Align = CGM.getContext().getTypeAlign(Ty); 1120 } 1121 1122 llvm::DIType DbgTy = 1123 DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_enumeration_type, 1124 Unit, ED->getName(), DefUnit, Line, 1125 Size, Align, 0, 0, 1126 llvm::DIType(), EltArray); 1127 return DbgTy; 1128} 1129 1130llvm::DIType CGDebugInfo::CreateType(const TagType *Ty, 1131 llvm::DIFile Unit) { 1132 if (const RecordType *RT = dyn_cast<RecordType>(Ty)) 1133 return CreateType(RT, Unit); 1134 else if (const EnumType *ET = dyn_cast<EnumType>(Ty)) 1135 return CreateType(ET, Unit); 1136 1137 return llvm::DIType(); 1138} 1139 1140llvm::DIType CGDebugInfo::CreateType(const VectorType *Ty, 1141 llvm::DIFile Unit) { 1142 llvm::DIType ElementTy = getOrCreateType(Ty->getElementType(), Unit); 1143 uint64_t NumElems = Ty->getNumElements(); 1144 if (NumElems > 0) 1145 --NumElems; 1146 1147 llvm::DIDescriptor Subscript = DebugFactory.GetOrCreateSubrange(0, NumElems); 1148 llvm::DIArray SubscriptArray = DebugFactory.GetOrCreateArray(&Subscript, 1); 1149 1150 uint64_t Size = CGM.getContext().getTypeSize(Ty); 1151 uint64_t Align = CGM.getContext().getTypeAlign(Ty); 1152 1153 return 1154 DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_vector_type, 1155 Unit, "", Unit, 1156 0, Size, Align, 0, 0, 1157 ElementTy, SubscriptArray); 1158} 1159 1160llvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty, 1161 llvm::DIFile Unit) { 1162 uint64_t Size; 1163 uint64_t Align; 1164 1165 1166 // FIXME: make getTypeAlign() aware of VLAs and incomplete array types 1167 if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(Ty)) { 1168 Size = 0; 1169 Align = 1170 CGM.getContext().getTypeAlign(CGM.getContext().getBaseElementType(VAT)); 1171 } else if (Ty->isIncompleteArrayType()) { 1172 Size = 0; 1173 Align = CGM.getContext().getTypeAlign(Ty->getElementType()); 1174 } else { 1175 // Size and align of the whole array, not the element type. 1176 Size = CGM.getContext().getTypeSize(Ty); 1177 Align = CGM.getContext().getTypeAlign(Ty); 1178 } 1179 1180 // Add the dimensions of the array. FIXME: This loses CV qualifiers from 1181 // interior arrays, do we care? Why aren't nested arrays represented the 1182 // obvious/recursive way? 1183 llvm::SmallVector<llvm::DIDescriptor, 8> Subscripts; 1184 QualType EltTy(Ty, 0); 1185 while ((Ty = dyn_cast<ArrayType>(EltTy))) { 1186 uint64_t Upper = 0; 1187 if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(Ty)) 1188 if (CAT->getSize().getZExtValue()) 1189 Upper = CAT->getSize().getZExtValue() - 1; 1190 // FIXME: Verify this is right for VLAs. 1191 Subscripts.push_back(DebugFactory.GetOrCreateSubrange(0, Upper)); 1192 EltTy = Ty->getElementType(); 1193 } 1194 1195 llvm::DIArray SubscriptArray = 1196 DebugFactory.GetOrCreateArray(Subscripts.data(), Subscripts.size()); 1197 1198 llvm::DIType DbgTy = 1199 DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_array_type, 1200 Unit, "", Unit, 1201 0, Size, Align, 0, 0, 1202 getOrCreateType(EltTy, Unit), 1203 SubscriptArray); 1204 return DbgTy; 1205} 1206 1207llvm::DIType CGDebugInfo::CreateType(const LValueReferenceType *Ty, 1208 llvm::DIFile Unit) { 1209 return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type, 1210 Ty, Ty->getPointeeType(), Unit); 1211} 1212 1213llvm::DIType CGDebugInfo::CreateType(const MemberPointerType *Ty, 1214 llvm::DIFile U) { 1215 QualType PointerDiffTy = CGM.getContext().getPointerDiffType(); 1216 llvm::DIType PointerDiffDITy = getOrCreateType(PointerDiffTy, U); 1217 1218 if (!Ty->getPointeeType()->isFunctionType()) { 1219 // We have a data member pointer type. 1220 return PointerDiffDITy; 1221 } 1222 1223 // We have a member function pointer type. Treat it as a struct with two 1224 // ptrdiff_t members. 1225 std::pair<uint64_t, unsigned> Info = CGM.getContext().getTypeInfo(Ty); 1226 1227 uint64_t FieldOffset = 0; 1228 llvm::DIDescriptor ElementTypes[2]; 1229 1230 // FIXME: This should probably be a function type instead. 1231 ElementTypes[0] = 1232 DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, U, 1233 "ptr", U, 0, 1234 Info.first, Info.second, FieldOffset, 0, 1235 PointerDiffDITy); 1236 FieldOffset += Info.first; 1237 1238 ElementTypes[1] = 1239 DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, U, 1240 "ptr", U, 0, 1241 Info.first, Info.second, FieldOffset, 0, 1242 PointerDiffDITy); 1243 1244 llvm::DIArray Elements = 1245 DebugFactory.GetOrCreateArray(&ElementTypes[0], 1246 llvm::array_lengthof(ElementTypes)); 1247 1248 return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type, 1249 U, llvm::StringRef("test"), 1250 U, 0, FieldOffset, 1251 0, 0, 0, llvm::DIType(), Elements); 1252} 1253 1254static QualType UnwrapTypeForDebugInfo(QualType T) { 1255 do { 1256 QualType LastT = T; 1257 switch (T->getTypeClass()) { 1258 default: 1259 return T; 1260 case Type::TemplateSpecialization: 1261 T = cast<TemplateSpecializationType>(T)->desugar(); 1262 break; 1263 case Type::TypeOfExpr: { 1264 TypeOfExprType *Ty = cast<TypeOfExprType>(T); 1265 T = Ty->getUnderlyingExpr()->getType(); 1266 break; 1267 } 1268 case Type::TypeOf: 1269 T = cast<TypeOfType>(T)->getUnderlyingType(); 1270 break; 1271 case Type::Decltype: 1272 T = cast<DecltypeType>(T)->getUnderlyingType(); 1273 break; 1274 case Type::Elaborated: 1275 T = cast<ElaboratedType>(T)->getNamedType(); 1276 break; 1277 case Type::SubstTemplateTypeParm: 1278 T = cast<SubstTemplateTypeParmType>(T)->getReplacementType(); 1279 break; 1280 } 1281 1282 assert(T != LastT && "Type unwrapping failed to unwrap!"); 1283 if (T == LastT) 1284 return T; 1285 } while (true); 1286 1287 return T; 1288} 1289 1290/// getOrCreateType - Get the type from the cache or create a new 1291/// one if necessary. 1292llvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, 1293 llvm::DIFile Unit) { 1294 if (Ty.isNull()) 1295 return llvm::DIType(); 1296 1297 // Unwrap the type as needed for debug information. 1298 Ty = UnwrapTypeForDebugInfo(Ty); 1299 1300 // Check for existing entry. 1301 llvm::DenseMap<void *, llvm::WeakVH>::iterator it = 1302 TypeCache.find(Ty.getAsOpaquePtr()); 1303 if (it != TypeCache.end()) { 1304 // Verify that the debug info still exists. 1305 if (&*it->second) 1306 return llvm::DIType(cast<llvm::MDNode>(it->second)); 1307 } 1308 1309 // Otherwise create the type. 1310 llvm::DIType Res = CreateTypeNode(Ty, Unit); 1311 1312 // And update the type cache. 1313 TypeCache[Ty.getAsOpaquePtr()] = Res; 1314 return Res; 1315} 1316 1317/// CreateTypeNode - Create a new debug type node. 1318llvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty, 1319 llvm::DIFile Unit) { 1320 // Handle qualifiers, which recursively handles what they refer to. 1321 if (Ty.hasLocalQualifiers()) 1322 return CreateQualifiedType(Ty, Unit); 1323 1324 const char *Diag = 0; 1325 1326 // Work out details of type. 1327 switch (Ty->getTypeClass()) { 1328#define TYPE(Class, Base) 1329#define ABSTRACT_TYPE(Class, Base) 1330#define NON_CANONICAL_TYPE(Class, Base) 1331#define DEPENDENT_TYPE(Class, Base) case Type::Class: 1332#include "clang/AST/TypeNodes.def" 1333 assert(false && "Dependent types cannot show up in debug information"); 1334 1335 // FIXME: Handle these. 1336 case Type::ExtVector: 1337 return llvm::DIType(); 1338 1339 case Type::Vector: 1340 return CreateType(cast<VectorType>(Ty), Unit); 1341 case Type::ObjCObjectPointer: 1342 return CreateType(cast<ObjCObjectPointerType>(Ty), Unit); 1343 case Type::ObjCObject: 1344 return CreateType(cast<ObjCObjectType>(Ty), Unit); 1345 case Type::ObjCInterface: 1346 return CreateType(cast<ObjCInterfaceType>(Ty), Unit); 1347 case Type::Builtin: return CreateType(cast<BuiltinType>(Ty), Unit); 1348 case Type::Complex: return CreateType(cast<ComplexType>(Ty), Unit); 1349 case Type::Pointer: return CreateType(cast<PointerType>(Ty), Unit); 1350 case Type::BlockPointer: 1351 return CreateType(cast<BlockPointerType>(Ty), Unit); 1352 case Type::Typedef: return CreateType(cast<TypedefType>(Ty), Unit); 1353 case Type::Record: 1354 case Type::Enum: 1355 return CreateType(cast<TagType>(Ty), Unit); 1356 case Type::FunctionProto: 1357 case Type::FunctionNoProto: 1358 return CreateType(cast<FunctionType>(Ty), Unit); 1359 case Type::ConstantArray: 1360 case Type::VariableArray: 1361 case Type::IncompleteArray: 1362 return CreateType(cast<ArrayType>(Ty), Unit); 1363 1364 case Type::LValueReference: 1365 return CreateType(cast<LValueReferenceType>(Ty), Unit); 1366 1367 case Type::MemberPointer: 1368 return CreateType(cast<MemberPointerType>(Ty), Unit); 1369 1370 case Type::TemplateSpecialization: 1371 case Type::Elaborated: 1372 case Type::SubstTemplateTypeParm: 1373 case Type::TypeOfExpr: 1374 case Type::TypeOf: 1375 case Type::Decltype: 1376 llvm_unreachable("type should have been unwrapped!"); 1377 return llvm::DIType(); 1378 1379 case Type::RValueReference: 1380 // FIXME: Implement! 1381 Diag = "rvalue references"; 1382 break; 1383 } 1384 1385 assert(Diag && "Fall through without a diagnostic?"); 1386 unsigned DiagID = CGM.getDiags().getCustomDiagID(Diagnostic::Error, 1387 "debug information for %0 is not yet supported"); 1388 CGM.getDiags().Report(FullSourceLoc(), DiagID) 1389 << Diag; 1390 return llvm::DIType(); 1391} 1392 1393/// CreateMemberType - Create new member and increase Offset by FType's size. 1394llvm::DIType CGDebugInfo::CreateMemberType(llvm::DIFile Unit, QualType FType, 1395 llvm::StringRef Name, 1396 uint64_t *Offset) { 1397 llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit); 1398 uint64_t FieldSize = CGM.getContext().getTypeSize(FType); 1399 unsigned FieldAlign = CGM.getContext().getTypeAlign(FType); 1400 llvm::DIType Ty = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, 1401 Unit, Name, Unit, 0, 1402 FieldSize, FieldAlign, 1403 *Offset, 0, FieldTy); 1404 *Offset += FieldSize; 1405 return Ty; 1406} 1407 1408/// EmitFunctionStart - Constructs the debug code for entering a function - 1409/// "llvm.dbg.func.start.". 1410void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType, 1411 llvm::Function *Fn, 1412 CGBuilderTy &Builder) { 1413 1414 llvm::StringRef Name; 1415 llvm::StringRef LinkageName; 1416 1417 FnBeginRegionCount.push_back(RegionStack.size()); 1418 1419 const Decl *D = GD.getDecl(); 1420 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 1421 // If there is a DISubprogram for this function available then use it. 1422 llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 1423 FI = SPCache.find(FD); 1424 if (FI != SPCache.end()) { 1425 llvm::DIDescriptor SP(dyn_cast_or_null<llvm::MDNode>(FI->second)); 1426 if (SP.isSubprogram() && llvm::DISubprogram(SP).isDefinition()) { 1427 llvm::MDNode *SPN = SP; 1428 RegionStack.push_back(SPN); 1429 RegionMap[D] = llvm::WeakVH(SP); 1430 return; 1431 } 1432 } 1433 Name = getFunctionName(FD); 1434 // Use mangled name as linkage name for c/c++ functions. 1435 LinkageName = CGM.getMangledName(GD); 1436 } else { 1437 // Use llvm function name as linkage name. 1438 Name = Fn->getName(); 1439 LinkageName = Name; 1440 } 1441 if (!Name.empty() && Name[0] == '\01') 1442 Name = Name.substr(1); 1443 1444 // It is expected that CurLoc is set before using EmitFunctionStart. 1445 // Usually, CurLoc points to the left bracket location of compound 1446 // statement representing function body. 1447 llvm::DIFile Unit = getOrCreateFile(CurLoc); 1448 unsigned LineNo = getLineNumber(CurLoc); 1449 1450 llvm::DISubprogram SP = 1451 DebugFactory.CreateSubprogram(Unit, Name, Name, LinkageName, Unit, LineNo, 1452 getOrCreateType(FnType, Unit), 1453 Fn->hasInternalLinkage(), true/*definition*/, 1454 0, 0, llvm::DIType(), 1455 D->isImplicit(), 1456 CGM.getLangOptions().Optimize, Fn); 1457 1458 // Push function on region stack. 1459 llvm::MDNode *SPN = SP; 1460 RegionStack.push_back(SPN); 1461 RegionMap[D] = llvm::WeakVH(SP); 1462 1463 // Clear stack used to keep track of #line directives. 1464 LineDirectiveFiles.clear(); 1465} 1466 1467 1468void CGDebugInfo::EmitStopPoint(CGBuilderTy &Builder) { 1469 if (CurLoc.isInvalid() || CurLoc.isMacroID()) return; 1470 1471 // Don't bother if things are the same as last time. 1472 SourceManager &SM = CGM.getContext().getSourceManager(); 1473 if (CurLoc == PrevLoc 1474 || (SM.getInstantiationLineNumber(CurLoc) == 1475 SM.getInstantiationLineNumber(PrevLoc) 1476 && SM.isFromSameFile(CurLoc, PrevLoc))) 1477 // New Builder may not be in sync with CGDebugInfo. 1478 if (!Builder.getCurrentDebugLocation().isUnknown()) 1479 return; 1480 1481 // Update last state. 1482 PrevLoc = CurLoc; 1483 1484 llvm::MDNode *Scope = RegionStack.back(); 1485 Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(getLineNumber(CurLoc), 1486 getColumnNumber(CurLoc), 1487 Scope)); 1488} 1489 1490/// UpdateLineDirectiveRegion - Update region stack only if #line directive 1491/// has introduced scope change. 1492void CGDebugInfo::UpdateLineDirectiveRegion(CGBuilderTy &Builder) { 1493 if (CurLoc.isInvalid() || CurLoc.isMacroID() || 1494 PrevLoc.isInvalid() || PrevLoc.isMacroID()) 1495 return; 1496 SourceManager &SM = CGM.getContext().getSourceManager(); 1497 PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc); 1498 PresumedLoc PPLoc = SM.getPresumedLoc(PrevLoc); 1499 1500 if (!strcmp(PPLoc.getFilename(), PCLoc.getFilename())) 1501 return; 1502 1503 // If #line directive stack is empty then we are entering a new scope. 1504 if (LineDirectiveFiles.empty()) { 1505 EmitRegionStart(Builder); 1506 LineDirectiveFiles.push_back(PCLoc.getFilename()); 1507 return; 1508 } 1509 1510 assert (RegionStack.size() >= LineDirectiveFiles.size() 1511 && "error handling #line regions!"); 1512 1513 bool SeenThisFile = false; 1514 for(std::vector<const char *>::iterator I = LineDirectiveFiles.begin(), 1515 E = LineDirectiveFiles.end(); I != E; ++I) 1516 if (!strcmp(PPLoc.getFilename(), *I)) { 1517 SeenThisFile = true; 1518 break; 1519 } 1520 1521 // If #line for this file is seen earlier then pop out #line regions. 1522 if (SeenThisFile) { 1523 while (!LineDirectiveFiles.empty()) { 1524 const char *LastFile = LineDirectiveFiles.back(); 1525 RegionStack.pop_back(); 1526 LineDirectiveFiles.pop_back(); 1527 if (!strcmp(PPLoc.getFilename(), LastFile)) 1528 break; 1529 } 1530 return; 1531 } 1532 1533 // .. otherwise insert new #line region. 1534 EmitRegionStart(Builder); 1535 LineDirectiveFiles.push_back(PCLoc.getFilename()); 1536 1537 return; 1538} 1539/// EmitRegionStart- Constructs the debug code for entering a declarative 1540/// region - "llvm.dbg.region.start.". 1541void CGDebugInfo::EmitRegionStart(CGBuilderTy &Builder) { 1542 llvm::DIDescriptor D = 1543 DebugFactory.CreateLexicalBlock(RegionStack.empty() ? 1544 llvm::DIDescriptor() : 1545 llvm::DIDescriptor(RegionStack.back()), 1546 getOrCreateFile(CurLoc), 1547 getLineNumber(CurLoc), 1548 getColumnNumber(CurLoc)); 1549 llvm::MDNode *DN = D; 1550 RegionStack.push_back(DN); 1551} 1552 1553/// EmitRegionEnd - Constructs the debug code for exiting a declarative 1554/// region - "llvm.dbg.region.end." 1555void CGDebugInfo::EmitRegionEnd(CGBuilderTy &Builder) { 1556 assert(!RegionStack.empty() && "Region stack mismatch, stack empty!"); 1557 1558 // Provide an region stop point. 1559 EmitStopPoint(Builder); 1560 1561 RegionStack.pop_back(); 1562} 1563 1564/// EmitFunctionEnd - Constructs the debug code for exiting a function. 1565void CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder) { 1566 assert(!RegionStack.empty() && "Region stack mismatch, stack empty!"); 1567 unsigned RCount = FnBeginRegionCount.back(); 1568 assert(RCount <= RegionStack.size() && "Region stack mismatch"); 1569 1570 // Pop all regions for this function. 1571 while (RegionStack.size() != RCount) 1572 EmitRegionEnd(Builder); 1573 FnBeginRegionCount.pop_back(); 1574} 1575 1576// EmitTypeForVarWithBlocksAttr - Build up structure info for the byref. 1577// See BuildByRefType. 1578llvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const ValueDecl *VD, 1579 uint64_t *XOffset) { 1580 1581 llvm::SmallVector<llvm::DIDescriptor, 5> EltTys; 1582 1583 QualType FType; 1584 uint64_t FieldSize, FieldOffset; 1585 unsigned FieldAlign; 1586 1587 llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 1588 QualType Type = VD->getType(); 1589 1590 FieldOffset = 0; 1591 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 1592 EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 1593 EltTys.push_back(CreateMemberType(Unit, FType, "__forwarding", &FieldOffset)); 1594 FType = CGM.getContext().IntTy; 1595 EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 1596 EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset)); 1597 1598 bool HasCopyAndDispose = CGM.BlockRequiresCopying(Type); 1599 if (HasCopyAndDispose) { 1600 FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 1601 EltTys.push_back(CreateMemberType(Unit, FType, "__copy_helper", 1602 &FieldOffset)); 1603 EltTys.push_back(CreateMemberType(Unit, FType, "__destroy_helper", 1604 &FieldOffset)); 1605 } 1606 1607 CharUnits Align = CGM.getContext().getDeclAlign(VD); 1608 if (Align > CharUnits::fromQuantity( 1609 CGM.getContext().Target.getPointerAlign(0) / 8)) { 1610 unsigned AlignedOffsetInBytes 1611 = llvm::RoundUpToAlignment(FieldOffset/8, Align.getQuantity()); 1612 unsigned NumPaddingBytes 1613 = AlignedOffsetInBytes - FieldOffset/8; 1614 1615 if (NumPaddingBytes > 0) { 1616 llvm::APInt pad(32, NumPaddingBytes); 1617 FType = CGM.getContext().getConstantArrayType(CGM.getContext().CharTy, 1618 pad, ArrayType::Normal, 0); 1619 EltTys.push_back(CreateMemberType(Unit, FType, "", &FieldOffset)); 1620 } 1621 } 1622 1623 FType = Type; 1624 llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit); 1625 FieldSize = CGM.getContext().getTypeSize(FType); 1626 FieldAlign = Align.getQuantity()*8; 1627 1628 *XOffset = FieldOffset; 1629 FieldTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit, 1630 VD->getName(), Unit, 1631 0, FieldSize, FieldAlign, 1632 FieldOffset, 0, FieldTy); 1633 EltTys.push_back(FieldTy); 1634 FieldOffset += FieldSize; 1635 1636 llvm::DIArray Elements = 1637 DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size()); 1638 1639 unsigned Flags = llvm::DIType::FlagBlockByrefStruct; 1640 1641 return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type, 1642 Unit, "", Unit, 1643 0, FieldOffset, 0, 0, Flags, 1644 llvm::DIType(), Elements); 1645 1646} 1647/// EmitDeclare - Emit local variable declaration debug info. 1648void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag, 1649 llvm::Value *Storage, CGBuilderTy &Builder) { 1650 assert(!RegionStack.empty() && "Region stack mismatch, stack empty!"); 1651 1652 llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 1653 llvm::DIType Ty; 1654 uint64_t XOffset = 0; 1655 if (VD->hasAttr<BlocksAttr>()) 1656 Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset); 1657 else 1658 Ty = getOrCreateType(VD->getType(), Unit); 1659 1660 // If there is not any debug info for type then do not emit debug info 1661 // for this variable. 1662 if (!Ty) 1663 return; 1664 1665 // Get location information. 1666 unsigned Line = getLineNumber(VD->getLocation()); 1667 unsigned Column = getColumnNumber(VD->getLocation()); 1668 1669 // Create the descriptor for the variable. 1670 llvm::DIVariable D = 1671 DebugFactory.CreateVariable(Tag, llvm::DIDescriptor(RegionStack.back()), 1672 VD->getName(), 1673 Unit, Line, Ty, CGM.getLangOptions().Optimize); 1674 // Insert an llvm.dbg.declare into the current block. 1675 llvm::Instruction *Call = 1676 DebugFactory.InsertDeclare(Storage, D, Builder.GetInsertBlock()); 1677 1678 llvm::MDNode *Scope = RegionStack.back(); 1679 Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 1680} 1681 1682/// EmitDeclare - Emit local variable declaration debug info. 1683void CGDebugInfo::EmitDeclare(const BlockDeclRefExpr *BDRE, unsigned Tag, 1684 llvm::Value *Storage, CGBuilderTy &Builder, 1685 CodeGenFunction *CGF) { 1686 const ValueDecl *VD = BDRE->getDecl(); 1687 assert(!RegionStack.empty() && "Region stack mismatch, stack empty!"); 1688 1689 if (Builder.GetInsertBlock() == 0) 1690 return; 1691 1692 uint64_t XOffset = 0; 1693 llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 1694 llvm::DIType Ty; 1695 if (VD->hasAttr<BlocksAttr>()) 1696 Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset); 1697 else 1698 Ty = getOrCreateType(VD->getType(), Unit); 1699 1700 // Get location information. 1701 unsigned Line = getLineNumber(VD->getLocation()); 1702 unsigned Column = getColumnNumber(VD->getLocation()); 1703 1704 CharUnits offset = CGF->BlockDecls[VD]; 1705 llvm::SmallVector<llvm::Value *, 9> addr; 1706 const llvm::Type *Int64Ty = llvm::Type::getInt64Ty(CGM.getLLVMContext()); 1707 addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpDeref)); 1708 addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpPlus)); 1709 addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 1710 if (BDRE->isByRef()) { 1711 addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpDeref)); 1712 addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpPlus)); 1713 // offset of __forwarding field 1714 offset = CharUnits::fromQuantity(CGF->LLVMPointerWidth/8); 1715 addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 1716 addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpDeref)); 1717 addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpPlus)); 1718 // offset of x field 1719 offset = CharUnits::fromQuantity(XOffset/8); 1720 addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 1721 } 1722 1723 // Create the descriptor for the variable. 1724 llvm::DIVariable D = 1725 DebugFactory.CreateComplexVariable(Tag, 1726 llvm::DIDescriptor(RegionStack.back()), 1727 VD->getName(), Unit, Line, Ty, 1728 addr); 1729 // Insert an llvm.dbg.declare into the current block. 1730 llvm::Instruction *Call = 1731 DebugFactory.InsertDeclare(Storage, D, Builder.GetInsertBlock()); 1732 1733 llvm::MDNode *Scope = RegionStack.back(); 1734 Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 1735} 1736 1737void CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD, 1738 llvm::Value *Storage, 1739 CGBuilderTy &Builder) { 1740 EmitDeclare(VD, llvm::dwarf::DW_TAG_auto_variable, Storage, Builder); 1741} 1742 1743void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable( 1744 const BlockDeclRefExpr *BDRE, llvm::Value *Storage, CGBuilderTy &Builder, 1745 CodeGenFunction *CGF) { 1746 EmitDeclare(BDRE, llvm::dwarf::DW_TAG_auto_variable, Storage, Builder, CGF); 1747} 1748 1749/// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument 1750/// variable declaration. 1751void CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI, 1752 CGBuilderTy &Builder) { 1753 EmitDeclare(VD, llvm::dwarf::DW_TAG_arg_variable, AI, Builder); 1754} 1755 1756 1757 1758/// EmitGlobalVariable - Emit information about a global variable. 1759void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 1760 const VarDecl *D) { 1761 1762 // Create global variable debug descriptor. 1763 llvm::DIFile Unit = getOrCreateFile(D->getLocation()); 1764 unsigned LineNo = getLineNumber(D->getLocation()); 1765 1766 QualType T = D->getType(); 1767 if (T->isIncompleteArrayType()) { 1768 1769 // CodeGen turns int[] into int[1] so we'll do the same here. 1770 llvm::APSInt ConstVal(32); 1771 1772 ConstVal = 1; 1773 QualType ET = CGM.getContext().getAsArrayType(T)->getElementType(); 1774 1775 T = CGM.getContext().getConstantArrayType(ET, ConstVal, 1776 ArrayType::Normal, 0); 1777 } 1778 llvm::StringRef DeclName = D->getName(); 1779 llvm::StringRef LinkageName; 1780 if (D->getDeclContext() && !isa<FunctionDecl>(D->getDeclContext())) 1781 LinkageName = Var->getName(); 1782 llvm::DIDescriptor DContext = 1783 getContextDescriptor(dyn_cast<Decl>(D->getDeclContext()), Unit); 1784 DebugFactory.CreateGlobalVariable(DContext, DeclName, DeclName, LinkageName, 1785 Unit, LineNo, getOrCreateType(T, Unit), 1786 Var->hasInternalLinkage(), 1787 true/*definition*/, Var); 1788} 1789 1790/// EmitGlobalVariable - Emit information about an objective-c interface. 1791void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 1792 ObjCInterfaceDecl *ID) { 1793 // Create global variable debug descriptor. 1794 llvm::DIFile Unit = getOrCreateFile(ID->getLocation()); 1795 unsigned LineNo = getLineNumber(ID->getLocation()); 1796 1797 llvm::StringRef Name = ID->getName(); 1798 1799 QualType T = CGM.getContext().getObjCInterfaceType(ID); 1800 if (T->isIncompleteArrayType()) { 1801 1802 // CodeGen turns int[] into int[1] so we'll do the same here. 1803 llvm::APSInt ConstVal(32); 1804 1805 ConstVal = 1; 1806 QualType ET = CGM.getContext().getAsArrayType(T)->getElementType(); 1807 1808 T = CGM.getContext().getConstantArrayType(ET, ConstVal, 1809 ArrayType::Normal, 0); 1810 } 1811 1812 DebugFactory.CreateGlobalVariable(Unit, Name, Name, Name, Unit, LineNo, 1813 getOrCreateType(T, Unit), 1814 Var->hasInternalLinkage(), 1815 true/*definition*/, Var); 1816} 1817 1818/// EmitGlobalVariable - Emit global variable's debug info. 1819void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, 1820 llvm::ConstantInt *Init, 1821 CGBuilderTy &Builder) { 1822 // Create the descriptor for the variable. 1823 llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 1824 llvm::StringRef Name = VD->getName(); 1825 llvm::DIType Ty = getOrCreateType(VD->getType(), Unit); 1826 // Do not use DIGlobalVariable for enums. 1827 if (Ty.getTag() == llvm::dwarf::DW_TAG_enumeration_type) 1828 return; 1829 DebugFactory.CreateGlobalVariable(Unit, Name, Name, Name, Unit, 1830 getLineNumber(VD->getLocation()), 1831 Ty, true, true, Init); 1832} 1833 1834/// getOrCreateNamesSpace - Return namespace descriptor for the given 1835/// namespace decl. 1836llvm::DINameSpace 1837CGDebugInfo::getOrCreateNameSpace(const NamespaceDecl *NSDecl, 1838 llvm::DIDescriptor Unit) { 1839 llvm::DenseMap<const NamespaceDecl *, llvm::WeakVH>::iterator I = 1840 NameSpaceCache.find(NSDecl); 1841 if (I != NameSpaceCache.end()) 1842 return llvm::DINameSpace(cast<llvm::MDNode>(I->second)); 1843 1844 unsigned LineNo = getLineNumber(NSDecl->getLocation()); 1845 1846 llvm::DIDescriptor Context = 1847 getContextDescriptor(dyn_cast<Decl>(NSDecl->getDeclContext()), Unit); 1848 llvm::DINameSpace NS = 1849 DebugFactory.CreateNameSpace(Context, NSDecl->getName(), 1850 llvm::DIFile(Unit), LineNo); 1851 NameSpaceCache[NSDecl] = llvm::WeakVH(NS); 1852 return NS; 1853} 1854