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