1 //===-- llvm/CodeGen/DwarfUnit.cpp - Dwarf Type and Compile Units ---------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file contains support for constructing a dwarf compile unit. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "DwarfUnit.h" 15 #include "DwarfAccelTable.h" 16 #include "DwarfCompileUnit.h" 17 #include "DwarfDebug.h" 18 #include "DwarfExpression.h" 19 #include "llvm/ADT/APFloat.h" 20 #include "llvm/CodeGen/MachineFunction.h" 21 #include "llvm/IR/Constants.h" 22 #include "llvm/IR/DIBuilder.h" 23 #include "llvm/IR/DataLayout.h" 24 #include "llvm/IR/GlobalVariable.h" 25 #include "llvm/IR/Instructions.h" 26 #include "llvm/IR/Mangler.h" 27 #include "llvm/MC/MCAsmInfo.h" 28 #include "llvm/MC/MCContext.h" 29 #include "llvm/MC/MCSection.h" 30 #include "llvm/MC/MCStreamer.h" 31 #include "llvm/Support/CommandLine.h" 32 #include "llvm/Target/TargetFrameLowering.h" 33 #include "llvm/Target/TargetLoweringObjectFile.h" 34 #include "llvm/Target/TargetMachine.h" 35 #include "llvm/Target/TargetRegisterInfo.h" 36 #include "llvm/Target/TargetSubtargetInfo.h" 37 38 using namespace llvm; 39 40 #define DEBUG_TYPE "dwarfdebug" 41 42 static cl::opt<bool> 43 GenerateDwarfTypeUnits("generate-type-units", cl::Hidden, 44 cl::desc("Generate DWARF4 type units."), 45 cl::init(false)); 46 47 DIEDwarfExpression::DIEDwarfExpression(const AsmPrinter &AP, DwarfUnit &DU, 48 DIELoc &DIE) 49 : DwarfExpression(*AP.MF->getSubtarget().getRegisterInfo(), 50 AP.getDwarfDebug()->getDwarfVersion()), 51 AP(AP), DU(DU), DIE(DIE) {} 52 53 void DIEDwarfExpression::EmitOp(uint8_t Op, const char* Comment) { 54 DU.addUInt(DIE, dwarf::DW_FORM_data1, Op); 55 } 56 void DIEDwarfExpression::EmitSigned(int64_t Value) { 57 DU.addSInt(DIE, dwarf::DW_FORM_sdata, Value); 58 } 59 void DIEDwarfExpression::EmitUnsigned(uint64_t Value) { 60 DU.addUInt(DIE, dwarf::DW_FORM_udata, Value); 61 } 62 bool DIEDwarfExpression::isFrameRegister(unsigned MachineReg) { 63 return MachineReg == TRI.getFrameRegister(*AP.MF); 64 } 65 66 DwarfUnit::DwarfUnit(dwarf::Tag UnitTag, const DICompileUnit *Node, 67 AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU) 68 : CUNode(Node), UnitDie(*DIE::get(DIEValueAllocator, UnitTag)), Asm(A), 69 DD(DW), DU(DWU), IndexTyDie(nullptr), Section(nullptr) { 70 assert(UnitTag == dwarf::DW_TAG_compile_unit || 71 UnitTag == dwarf::DW_TAG_type_unit); 72 } 73 74 DwarfTypeUnit::DwarfTypeUnit(DwarfCompileUnit &CU, AsmPrinter *A, 75 DwarfDebug *DW, DwarfFile *DWU, 76 MCDwarfDwoLineTable *SplitLineTable) 77 : DwarfUnit(dwarf::DW_TAG_type_unit, CU.getCUNode(), A, DW, DWU), CU(CU), 78 SplitLineTable(SplitLineTable) { 79 if (SplitLineTable) 80 addSectionOffset(UnitDie, dwarf::DW_AT_stmt_list, 0); 81 } 82 83 DwarfUnit::~DwarfUnit() { 84 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j) 85 DIEBlocks[j]->~DIEBlock(); 86 for (unsigned j = 0, M = DIELocs.size(); j < M; ++j) 87 DIELocs[j]->~DIELoc(); 88 } 89 90 int64_t DwarfUnit::getDefaultLowerBound() const { 91 switch (getLanguage()) { 92 default: 93 break; 94 95 case dwarf::DW_LANG_C89: 96 case dwarf::DW_LANG_C99: 97 case dwarf::DW_LANG_C: 98 case dwarf::DW_LANG_C_plus_plus: 99 case dwarf::DW_LANG_ObjC: 100 case dwarf::DW_LANG_ObjC_plus_plus: 101 return 0; 102 103 case dwarf::DW_LANG_Fortran77: 104 case dwarf::DW_LANG_Fortran90: 105 case dwarf::DW_LANG_Fortran95: 106 return 1; 107 108 // The languages below have valid values only if the DWARF version >= 4. 109 case dwarf::DW_LANG_Java: 110 case dwarf::DW_LANG_Python: 111 case dwarf::DW_LANG_UPC: 112 case dwarf::DW_LANG_D: 113 if (dwarf::DWARF_VERSION >= 4) 114 return 0; 115 break; 116 117 case dwarf::DW_LANG_Ada83: 118 case dwarf::DW_LANG_Ada95: 119 case dwarf::DW_LANG_Cobol74: 120 case dwarf::DW_LANG_Cobol85: 121 case dwarf::DW_LANG_Modula2: 122 case dwarf::DW_LANG_Pascal83: 123 case dwarf::DW_LANG_PLI: 124 if (dwarf::DWARF_VERSION >= 4) 125 return 1; 126 break; 127 128 // The languages below have valid values only if the DWARF version >= 5. 129 case dwarf::DW_LANG_OpenCL: 130 case dwarf::DW_LANG_Go: 131 case dwarf::DW_LANG_Haskell: 132 case dwarf::DW_LANG_C_plus_plus_03: 133 case dwarf::DW_LANG_C_plus_plus_11: 134 case dwarf::DW_LANG_OCaml: 135 case dwarf::DW_LANG_Rust: 136 case dwarf::DW_LANG_C11: 137 case dwarf::DW_LANG_Swift: 138 case dwarf::DW_LANG_Dylan: 139 case dwarf::DW_LANG_C_plus_plus_14: 140 if (dwarf::DWARF_VERSION >= 5) 141 return 0; 142 break; 143 144 case dwarf::DW_LANG_Modula3: 145 case dwarf::DW_LANG_Julia: 146 case dwarf::DW_LANG_Fortran03: 147 case dwarf::DW_LANG_Fortran08: 148 if (dwarf::DWARF_VERSION >= 5) 149 return 1; 150 break; 151 } 152 153 return -1; 154 } 155 156 /// Check whether the DIE for this MDNode can be shared across CUs. 157 static bool isShareableAcrossCUs(const DINode *D) { 158 // When the MDNode can be part of the type system, the DIE can be shared 159 // across CUs. 160 // Combining type units and cross-CU DIE sharing is lower value (since 161 // cross-CU DIE sharing is used in LTO and removes type redundancy at that 162 // level already) but may be implementable for some value in projects 163 // building multiple independent libraries with LTO and then linking those 164 // together. 165 return (isa<DIType>(D) || 166 (isa<DISubprogram>(D) && !cast<DISubprogram>(D)->isDefinition())) && 167 !GenerateDwarfTypeUnits; 168 } 169 170 DIE *DwarfUnit::getDIE(const DINode *D) const { 171 if (isShareableAcrossCUs(D)) 172 return DU->getDIE(D); 173 return MDNodeToDieMap.lookup(D); 174 } 175 176 void DwarfUnit::insertDIE(const DINode *Desc, DIE *D) { 177 if (isShareableAcrossCUs(Desc)) { 178 DU->insertDIE(Desc, D); 179 return; 180 } 181 MDNodeToDieMap.insert(std::make_pair(Desc, D)); 182 } 183 184 void DwarfUnit::addFlag(DIE &Die, dwarf::Attribute Attribute) { 185 if (DD->getDwarfVersion() >= 4) 186 Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_flag_present, 187 DIEInteger(1)); 188 else 189 Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_flag, 190 DIEInteger(1)); 191 } 192 193 void DwarfUnit::addUInt(DIEValueList &Die, dwarf::Attribute Attribute, 194 Optional<dwarf::Form> Form, uint64_t Integer) { 195 if (!Form) 196 Form = DIEInteger::BestForm(false, Integer); 197 Die.addValue(DIEValueAllocator, Attribute, *Form, DIEInteger(Integer)); 198 } 199 200 void DwarfUnit::addUInt(DIEValueList &Block, dwarf::Form Form, 201 uint64_t Integer) { 202 addUInt(Block, (dwarf::Attribute)0, Form, Integer); 203 } 204 205 void DwarfUnit::addSInt(DIEValueList &Die, dwarf::Attribute Attribute, 206 Optional<dwarf::Form> Form, int64_t Integer) { 207 if (!Form) 208 Form = DIEInteger::BestForm(true, Integer); 209 Die.addValue(DIEValueAllocator, Attribute, *Form, DIEInteger(Integer)); 210 } 211 212 void DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form, 213 int64_t Integer) { 214 addSInt(Die, (dwarf::Attribute)0, Form, Integer); 215 } 216 217 void DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute, 218 StringRef String) { 219 Die.addValue(DIEValueAllocator, Attribute, 220 isDwoUnit() ? dwarf::DW_FORM_GNU_str_index : dwarf::DW_FORM_strp, 221 DIEString(DU->getStringPool().getEntry(*Asm, String))); 222 } 223 224 DIEValueList::value_iterator DwarfUnit::addLabel(DIEValueList &Die, 225 dwarf::Attribute Attribute, 226 dwarf::Form Form, 227 const MCSymbol *Label) { 228 return Die.addValue(DIEValueAllocator, Attribute, Form, DIELabel(Label)); 229 } 230 231 void DwarfUnit::addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label) { 232 addLabel(Die, (dwarf::Attribute)0, Form, Label); 233 } 234 235 void DwarfUnit::addSectionOffset(DIE &Die, dwarf::Attribute Attribute, 236 uint64_t Integer) { 237 if (DD->getDwarfVersion() >= 4) 238 addUInt(Die, Attribute, dwarf::DW_FORM_sec_offset, Integer); 239 else 240 addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer); 241 } 242 243 unsigned DwarfTypeUnit::getOrCreateSourceID(StringRef FileName, StringRef DirName) { 244 return SplitLineTable ? SplitLineTable->getFile(DirName, FileName) 245 : getCU().getOrCreateSourceID(FileName, DirName); 246 } 247 248 void DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) { 249 if (!DD->useSplitDwarf()) { 250 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr); 251 addLabel(Die, dwarf::DW_FORM_udata, Sym); 252 } else { 253 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index); 254 addUInt(Die, dwarf::DW_FORM_GNU_addr_index, 255 DD->getAddressPool().getIndex(Sym)); 256 } 257 } 258 259 void DwarfUnit::addLabelDelta(DIE &Die, dwarf::Attribute Attribute, 260 const MCSymbol *Hi, const MCSymbol *Lo) { 261 Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_data4, 262 new (DIEValueAllocator) DIEDelta(Hi, Lo)); 263 } 264 265 void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry) { 266 addDIEEntry(Die, Attribute, DIEEntry(Entry)); 267 } 268 269 void DwarfUnit::addDIETypeSignature(DIE &Die, uint64_t Signature) { 270 // Flag the type unit reference as a declaration so that if it contains 271 // members (implicit special members, static data member definitions, member 272 // declarations for definitions in this CU, etc) consumers don't get confused 273 // and think this is a full definition. 274 addFlag(Die, dwarf::DW_AT_declaration); 275 276 Die.addValue(DIEValueAllocator, dwarf::DW_AT_signature, 277 dwarf::DW_FORM_ref_sig8, DIEInteger(Signature)); 278 } 279 280 void DwarfUnit::addDIETypeSignature(DIE &Die, dwarf::Attribute Attribute, 281 StringRef Identifier) { 282 uint64_t Signature = DD->makeTypeSignature(Identifier); 283 Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_ref_sig8, 284 DIEInteger(Signature)); 285 } 286 287 void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, 288 DIEEntry Entry) { 289 const DIE *DieCU = Die.getUnitOrNull(); 290 const DIE *EntryCU = Entry.getEntry().getUnitOrNull(); 291 if (!DieCU) 292 // We assume that Die belongs to this CU, if it is not linked to any CU yet. 293 DieCU = &getUnitDie(); 294 if (!EntryCU) 295 EntryCU = &getUnitDie(); 296 Die.addValue(DIEValueAllocator, Attribute, 297 EntryCU == DieCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr, 298 Entry); 299 } 300 301 DIE *DwarfUnit::createDIE(unsigned Tag, const DINode *N) { 302 DIE *Die = DIE::get(DIEValueAllocator, (dwarf::Tag)Tag); 303 if (N) 304 insertDIE(N, Die); 305 return Die; 306 } 307 308 DIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, const DINode *N) { 309 DIE &Die = Parent.addChild(createDIE(Tag, N)); 310 return Die; 311 } 312 313 void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc) { 314 Loc->ComputeSize(Asm); 315 DIELocs.push_back(Loc); // Memoize so we can call the destructor later on. 316 Die.addValue(DIEValueAllocator, Attribute, 317 Loc->BestForm(DD->getDwarfVersion()), Loc); 318 } 319 320 void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, 321 DIEBlock *Block) { 322 Block->ComputeSize(Asm); 323 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on. 324 Die.addValue(DIEValueAllocator, Attribute, Block->BestForm(), Block); 325 } 326 327 void DwarfUnit::addSourceLine(DIE &Die, unsigned Line, StringRef File, 328 StringRef Directory) { 329 if (Line == 0) 330 return; 331 332 unsigned FileID = getOrCreateSourceID(File, Directory); 333 assert(FileID && "Invalid file id"); 334 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID); 335 addUInt(Die, dwarf::DW_AT_decl_line, None, Line); 336 } 337 338 void DwarfUnit::addSourceLine(DIE &Die, const DILocalVariable *V) { 339 assert(V); 340 341 addSourceLine(Die, V->getLine(), V->getScope()->getFilename(), 342 V->getScope()->getDirectory()); 343 } 344 345 void DwarfUnit::addSourceLine(DIE &Die, const DIGlobalVariable *G) { 346 assert(G); 347 348 addSourceLine(Die, G->getLine(), G->getFilename(), G->getDirectory()); 349 } 350 351 void DwarfUnit::addSourceLine(DIE &Die, const DISubprogram *SP) { 352 assert(SP); 353 354 addSourceLine(Die, SP->getLine(), SP->getFilename(), SP->getDirectory()); 355 } 356 357 void DwarfUnit::addSourceLine(DIE &Die, const DIType *Ty) { 358 assert(Ty); 359 360 addSourceLine(Die, Ty->getLine(), Ty->getFilename(), Ty->getDirectory()); 361 } 362 363 void DwarfUnit::addSourceLine(DIE &Die, const DIObjCProperty *Ty) { 364 assert(Ty); 365 366 addSourceLine(Die, Ty->getLine(), Ty->getFilename(), Ty->getDirectory()); 367 } 368 369 void DwarfUnit::addSourceLine(DIE &Die, const DINamespace *NS) { 370 addSourceLine(Die, NS->getLine(), NS->getFilename(), NS->getDirectory()); 371 } 372 373 bool DwarfUnit::addRegisterOpPiece(DIELoc &TheDie, unsigned Reg, 374 unsigned SizeInBits, unsigned OffsetInBits) { 375 DIEDwarfExpression Expr(*Asm, *this, TheDie); 376 Expr.AddMachineRegPiece(Reg, SizeInBits, OffsetInBits); 377 return true; 378 } 379 380 bool DwarfUnit::addRegisterOffset(DIELoc &TheDie, unsigned Reg, 381 int64_t Offset) { 382 DIEDwarfExpression Expr(*Asm, *this, TheDie); 383 return Expr.AddMachineRegIndirect(Reg, Offset); 384 } 385 386 /* Byref variables, in Blocks, are declared by the programmer as "SomeType 387 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and 388 gives the variable VarName either the struct, or a pointer to the struct, as 389 its type. This is necessary for various behind-the-scenes things the 390 compiler needs to do with by-reference variables in Blocks. 391 392 However, as far as the original *programmer* is concerned, the variable 393 should still have type 'SomeType', as originally declared. 394 395 The function getBlockByrefType dives into the __Block_byref_x_VarName 396 struct to find the original type of the variable, which is then assigned to 397 the variable's Debug Information Entry as its real type. So far, so good. 398 However now the debugger will expect the variable VarName to have the type 399 SomeType. So we need the location attribute for the variable to be an 400 expression that explains to the debugger how to navigate through the 401 pointers and struct to find the actual variable of type SomeType. 402 403 The following function does just that. We start by getting 404 the "normal" location for the variable. This will be the location 405 of either the struct __Block_byref_x_VarName or the pointer to the 406 struct __Block_byref_x_VarName. 407 408 The struct will look something like: 409 410 struct __Block_byref_x_VarName { 411 ... <various fields> 412 struct __Block_byref_x_VarName *forwarding; 413 ... <various other fields> 414 SomeType VarName; 415 ... <maybe more fields> 416 }; 417 418 If we are given the struct directly (as our starting point) we 419 need to tell the debugger to: 420 421 1). Add the offset of the forwarding field. 422 423 2). Follow that pointer to get the real __Block_byref_x_VarName 424 struct to use (the real one may have been copied onto the heap). 425 426 3). Add the offset for the field VarName, to find the actual variable. 427 428 If we started with a pointer to the struct, then we need to 429 dereference that pointer first, before the other steps. 430 Translating this into DWARF ops, we will need to append the following 431 to the current location description for the variable: 432 433 DW_OP_deref -- optional, if we start with a pointer 434 DW_OP_plus_uconst <forward_fld_offset> 435 DW_OP_deref 436 DW_OP_plus_uconst <varName_fld_offset> 437 438 That is what this function does. */ 439 440 void DwarfUnit::addBlockByrefAddress(const DbgVariable &DV, DIE &Die, 441 dwarf::Attribute Attribute, 442 const MachineLocation &Location) { 443 const DIType *Ty = DV.getType(); 444 const DIType *TmpTy = Ty; 445 uint16_t Tag = Ty->getTag(); 446 bool isPointer = false; 447 448 StringRef varName = DV.getName(); 449 450 if (Tag == dwarf::DW_TAG_pointer_type) { 451 auto *DTy = cast<DIDerivedType>(Ty); 452 TmpTy = resolve(DTy->getBaseType()); 453 isPointer = true; 454 } 455 456 // Find the __forwarding field and the variable field in the __Block_byref 457 // struct. 458 DINodeArray Fields = cast<DICompositeType>(TmpTy)->getElements(); 459 const DIDerivedType *varField = nullptr; 460 const DIDerivedType *forwardingField = nullptr; 461 462 for (unsigned i = 0, N = Fields.size(); i < N; ++i) { 463 auto *DT = cast<DIDerivedType>(Fields[i]); 464 StringRef fieldName = DT->getName(); 465 if (fieldName == "__forwarding") 466 forwardingField = DT; 467 else if (fieldName == varName) 468 varField = DT; 469 } 470 471 // Get the offsets for the forwarding field and the variable field. 472 unsigned forwardingFieldOffset = forwardingField->getOffsetInBits() >> 3; 473 unsigned varFieldOffset = varField->getOffsetInBits() >> 2; 474 475 // Decode the original location, and use that as the start of the byref 476 // variable's location. 477 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 478 479 bool validReg; 480 if (Location.isReg()) 481 validReg = addRegisterOpPiece(*Loc, Location.getReg()); 482 else 483 validReg = addRegisterOffset(*Loc, Location.getReg(), Location.getOffset()); 484 485 if (!validReg) 486 return; 487 488 // If we started with a pointer to the __Block_byref... struct, then 489 // the first thing we need to do is dereference the pointer (DW_OP_deref). 490 if (isPointer) 491 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 492 493 // Next add the offset for the '__forwarding' field: 494 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in 495 // adding the offset if it's 0. 496 if (forwardingFieldOffset > 0) { 497 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 498 addUInt(*Loc, dwarf::DW_FORM_udata, forwardingFieldOffset); 499 } 500 501 // Now dereference the __forwarding field to get to the real __Block_byref 502 // struct: DW_OP_deref. 503 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 504 505 // Now that we've got the real __Block_byref... struct, add the offset 506 // for the variable's field to get to the location of the actual variable: 507 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0. 508 if (varFieldOffset > 0) { 509 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 510 addUInt(*Loc, dwarf::DW_FORM_udata, varFieldOffset); 511 } 512 513 // Now attach the location information to the DIE. 514 addBlock(Die, Attribute, Loc); 515 } 516 517 /// Return true if type encoding is unsigned. 518 static bool isUnsignedDIType(DwarfDebug *DD, const DIType *Ty) { 519 if (auto *CTy = dyn_cast<DICompositeType>(Ty)) { 520 // FIXME: Enums without a fixed underlying type have unknown signedness 521 // here, leading to incorrectly emitted constants. 522 if (CTy->getTag() == dwarf::DW_TAG_enumeration_type) 523 return false; 524 525 // (Pieces of) aggregate types that get hacked apart by SROA may be 526 // represented by a constant. Encode them as unsigned bytes. 527 return true; 528 } 529 530 if (auto *DTy = dyn_cast<DIDerivedType>(Ty)) { 531 dwarf::Tag T = (dwarf::Tag)Ty->getTag(); 532 // Encode pointer constants as unsigned bytes. This is used at least for 533 // null pointer constant emission. 534 // FIXME: reference and rvalue_reference /probably/ shouldn't be allowed 535 // here, but accept them for now due to a bug in SROA producing bogus 536 // dbg.values. 537 if (T == dwarf::DW_TAG_pointer_type || 538 T == dwarf::DW_TAG_ptr_to_member_type || 539 T == dwarf::DW_TAG_reference_type || 540 T == dwarf::DW_TAG_rvalue_reference_type) 541 return true; 542 assert(T == dwarf::DW_TAG_typedef || T == dwarf::DW_TAG_const_type || 543 T == dwarf::DW_TAG_volatile_type || 544 T == dwarf::DW_TAG_restrict_type); 545 DITypeRef Deriv = DTy->getBaseType(); 546 assert(Deriv && "Expected valid base type"); 547 return isUnsignedDIType(DD, DD->resolve(Deriv)); 548 } 549 550 auto *BTy = cast<DIBasicType>(Ty); 551 unsigned Encoding = BTy->getEncoding(); 552 assert((Encoding == dwarf::DW_ATE_unsigned || 553 Encoding == dwarf::DW_ATE_unsigned_char || 554 Encoding == dwarf::DW_ATE_signed || 555 Encoding == dwarf::DW_ATE_signed_char || 556 Encoding == dwarf::DW_ATE_float || Encoding == dwarf::DW_ATE_UTF || 557 Encoding == dwarf::DW_ATE_boolean || 558 (Ty->getTag() == dwarf::DW_TAG_unspecified_type && 559 Ty->getName() == "decltype(nullptr)")) && 560 "Unsupported encoding"); 561 return Encoding == dwarf::DW_ATE_unsigned || 562 Encoding == dwarf::DW_ATE_unsigned_char || 563 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean || 564 Ty->getTag() == dwarf::DW_TAG_unspecified_type; 565 } 566 567 /// If this type is derived from a base type then return base type size. 568 static uint64_t getBaseTypeSize(DwarfDebug *DD, const DIDerivedType *Ty) { 569 unsigned Tag = Ty->getTag(); 570 571 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef && 572 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type && 573 Tag != dwarf::DW_TAG_restrict_type) 574 return Ty->getSizeInBits(); 575 576 auto *BaseType = DD->resolve(Ty->getBaseType()); 577 578 assert(BaseType && "Unexpected invalid base type"); 579 580 // If this is a derived type, go ahead and get the base type, unless it's a 581 // reference then it's just the size of the field. Pointer types have no need 582 // of this since they're a different type of qualification on the type. 583 if (BaseType->getTag() == dwarf::DW_TAG_reference_type || 584 BaseType->getTag() == dwarf::DW_TAG_rvalue_reference_type) 585 return Ty->getSizeInBits(); 586 587 if (auto *DT = dyn_cast<DIDerivedType>(BaseType)) 588 return getBaseTypeSize(DD, DT); 589 590 return BaseType->getSizeInBits(); 591 } 592 593 void DwarfUnit::addConstantFPValue(DIE &Die, const MachineOperand &MO) { 594 assert(MO.isFPImm() && "Invalid machine operand!"); 595 DIEBlock *Block = new (DIEValueAllocator) DIEBlock; 596 APFloat FPImm = MO.getFPImm()->getValueAPF(); 597 598 // Get the raw data form of the floating point. 599 const APInt FltVal = FPImm.bitcastToAPInt(); 600 const char *FltPtr = (const char *)FltVal.getRawData(); 601 602 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte. 603 bool LittleEndian = Asm->getDataLayout().isLittleEndian(); 604 int Incr = (LittleEndian ? 1 : -1); 605 int Start = (LittleEndian ? 0 : NumBytes - 1); 606 int Stop = (LittleEndian ? NumBytes : -1); 607 608 // Output the constant to DWARF one byte at a time. 609 for (; Start != Stop; Start += Incr) 610 addUInt(*Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]); 611 612 addBlock(Die, dwarf::DW_AT_const_value, Block); 613 } 614 615 void DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) { 616 // Pass this down to addConstantValue as an unsigned bag of bits. 617 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true); 618 } 619 620 void DwarfUnit::addConstantValue(DIE &Die, const ConstantInt *CI, 621 const DIType *Ty) { 622 addConstantValue(Die, CI->getValue(), Ty); 623 } 624 625 void DwarfUnit::addConstantValue(DIE &Die, const MachineOperand &MO, 626 const DIType *Ty) { 627 assert(MO.isImm() && "Invalid machine operand!"); 628 629 addConstantValue(Die, isUnsignedDIType(DD, Ty), MO.getImm()); 630 } 631 632 void DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val) { 633 // FIXME: This is a bit conservative/simple - it emits negative values always 634 // sign extended to 64 bits rather than minimizing the number of bytes. 635 addUInt(Die, dwarf::DW_AT_const_value, 636 Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val); 637 } 638 639 void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, const DIType *Ty) { 640 addConstantValue(Die, Val, isUnsignedDIType(DD, Ty)); 641 } 642 643 void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) { 644 unsigned CIBitWidth = Val.getBitWidth(); 645 if (CIBitWidth <= 64) { 646 addConstantValue(Die, Unsigned, 647 Unsigned ? Val.getZExtValue() : Val.getSExtValue()); 648 return; 649 } 650 651 DIEBlock *Block = new (DIEValueAllocator) DIEBlock; 652 653 // Get the raw data form of the large APInt. 654 const uint64_t *Ptr64 = Val.getRawData(); 655 656 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte. 657 bool LittleEndian = Asm->getDataLayout().isLittleEndian(); 658 659 // Output the constant to DWARF one byte at a time. 660 for (int i = 0; i < NumBytes; i++) { 661 uint8_t c; 662 if (LittleEndian) 663 c = Ptr64[i / 8] >> (8 * (i & 7)); 664 else 665 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7)); 666 addUInt(*Block, dwarf::DW_FORM_data1, c); 667 } 668 669 addBlock(Die, dwarf::DW_AT_const_value, Block); 670 } 671 672 void DwarfUnit::addLinkageName(DIE &Die, StringRef LinkageName) { 673 if (!LinkageName.empty() && DD->useLinkageNames()) 674 addString(Die, 675 DD->getDwarfVersion() >= 4 ? dwarf::DW_AT_linkage_name 676 : dwarf::DW_AT_MIPS_linkage_name, 677 GlobalValue::getRealLinkageName(LinkageName)); 678 } 679 680 void DwarfUnit::addTemplateParams(DIE &Buffer, DINodeArray TParams) { 681 // Add template parameters. 682 for (const auto *Element : TParams) { 683 if (auto *TTP = dyn_cast<DITemplateTypeParameter>(Element)) 684 constructTemplateTypeParameterDIE(Buffer, TTP); 685 else if (auto *TVP = dyn_cast<DITemplateValueParameter>(Element)) 686 constructTemplateValueParameterDIE(Buffer, TVP); 687 } 688 } 689 690 DIE *DwarfUnit::getOrCreateContextDIE(const DIScope *Context) { 691 if (!Context || isa<DIFile>(Context)) 692 return &getUnitDie(); 693 if (auto *T = dyn_cast<DIType>(Context)) 694 return getOrCreateTypeDIE(T); 695 if (auto *NS = dyn_cast<DINamespace>(Context)) 696 return getOrCreateNameSpace(NS); 697 if (auto *SP = dyn_cast<DISubprogram>(Context)) 698 return getOrCreateSubprogramDIE(SP); 699 if (auto *M = dyn_cast<DIModule>(Context)) 700 return getOrCreateModule(M); 701 return getDIE(Context); 702 } 703 704 DIE *DwarfUnit::createTypeDIE(const DICompositeType *Ty) { 705 auto *Context = resolve(Ty->getScope()); 706 DIE *ContextDIE = getOrCreateContextDIE(Context); 707 708 if (DIE *TyDIE = getDIE(Ty)) 709 return TyDIE; 710 711 // Create new type. 712 DIE &TyDIE = createAndAddDIE(Ty->getTag(), *ContextDIE, Ty); 713 714 constructTypeDIE(TyDIE, cast<DICompositeType>(Ty)); 715 716 if (!Ty->isExternalTypeRef()) 717 updateAcceleratorTables(Context, Ty, TyDIE); 718 return &TyDIE; 719 } 720 721 DIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) { 722 if (!TyNode) 723 return nullptr; 724 725 auto *Ty = cast<DIType>(TyNode); 726 assert(Ty == resolve(Ty->getRef()) && 727 "type was not uniqued, possible ODR violation."); 728 729 // DW_TAG_restrict_type is not supported in DWARF2 730 if (Ty->getTag() == dwarf::DW_TAG_restrict_type && DD->getDwarfVersion() <= 2) 731 return getOrCreateTypeDIE(resolve(cast<DIDerivedType>(Ty)->getBaseType())); 732 733 // Construct the context before querying for the existence of the DIE in case 734 // such construction creates the DIE. 735 // For Local Scope, do not construct context DIE. 736 auto *Context = resolve(Ty->getScope()); 737 bool IsLocalScope = Context && isa<DILocalScope>(Context); 738 DIE *ContextDIE = IsLocalScope ? nullptr : getOrCreateContextDIE(Context); 739 assert(ContextDIE || IsLocalScope); 740 741 if (DIE *TyDIE = getDIE(Ty)) 742 return TyDIE; 743 744 // Create new type and add to map. 745 DIE &TyDIE = IsLocalScope ? *createDIE(Ty->getTag(), Ty) 746 : createAndAddDIE(Ty->getTag(), *ContextDIE, Ty); 747 748 updateAcceleratorTables(Context, Ty, TyDIE); 749 750 if (auto *BT = dyn_cast<DIBasicType>(Ty)) 751 constructTypeDIE(TyDIE, BT); 752 else if (auto *STy = dyn_cast<DISubroutineType>(Ty)) 753 constructTypeDIE(TyDIE, STy); 754 else if (auto *CTy = dyn_cast<DICompositeType>(Ty)) { 755 if (GenerateDwarfTypeUnits && !Ty->isForwardDecl()) 756 if (MDString *TypeId = CTy->getRawIdentifier()) { 757 DD->addDwarfTypeUnitType(getCU(), TypeId->getString(), TyDIE, CTy); 758 // Skip updating the accelerator tables since this is not the full type. 759 return &TyDIE; 760 } 761 constructTypeDIE(TyDIE, CTy); 762 } else { 763 constructTypeDIE(TyDIE, cast<DIDerivedType>(Ty)); 764 } 765 766 return &TyDIE; 767 } 768 769 void DwarfUnit::updateAcceleratorTables(const DIScope *Context, 770 const DIType *Ty, const DIE &TyDIE) { 771 if (!Ty->getName().empty() && !Ty->isForwardDecl()) { 772 bool IsImplementation = 0; 773 if (auto *CT = dyn_cast<DICompositeType>(Ty)) { 774 // A runtime language of 0 actually means C/C++ and that any 775 // non-negative value is some version of Objective-C/C++. 776 IsImplementation = CT->getRuntimeLang() == 0 || CT->isObjcClassComplete(); 777 } 778 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0; 779 DD->addAccelType(Ty->getName(), TyDIE, Flags); 780 781 if (!Context || isa<DICompileUnit>(Context) || isa<DIFile>(Context) || 782 isa<DINamespace>(Context)) 783 addGlobalType(Ty, TyDIE, Context); 784 } 785 } 786 787 void DwarfUnit::addType(DIE &Entity, const DIType *Ty, 788 dwarf::Attribute Attribute) { 789 assert(Ty && "Trying to add a type that doesn't exist?"); 790 addDIEEntry(Entity, Attribute, DIEEntry(*getOrCreateTypeDIE(Ty))); 791 } 792 793 std::string DwarfUnit::getParentContextString(const DIScope *Context) const { 794 if (!Context) 795 return ""; 796 797 // FIXME: Decide whether to implement this for non-C++ languages. 798 if (getLanguage() != dwarf::DW_LANG_C_plus_plus) 799 return ""; 800 801 std::string CS; 802 SmallVector<const DIScope *, 1> Parents; 803 while (!isa<DICompileUnit>(Context)) { 804 Parents.push_back(Context); 805 if (Context->getScope()) 806 Context = resolve(Context->getScope()); 807 else 808 // Structure, etc types will have a NULL context if they're at the top 809 // level. 810 break; 811 } 812 813 // Reverse iterate over our list to go from the outermost construct to the 814 // innermost. 815 for (const DIScope *Ctx : make_range(Parents.rbegin(), Parents.rend())) { 816 StringRef Name = Ctx->getName(); 817 if (Name.empty() && isa<DINamespace>(Ctx)) 818 Name = "(anonymous namespace)"; 819 if (!Name.empty()) { 820 CS += Name; 821 CS += "::"; 822 } 823 } 824 return CS; 825 } 826 827 void DwarfUnit::constructTypeDIE(DIE &Buffer, const DIBasicType *BTy) { 828 // Get core information. 829 StringRef Name = BTy->getName(); 830 // Add name if not anonymous or intermediate type. 831 if (!Name.empty()) 832 addString(Buffer, dwarf::DW_AT_name, Name); 833 834 // An unspecified type only has a name attribute. 835 if (BTy->getTag() == dwarf::DW_TAG_unspecified_type) 836 return; 837 838 addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 839 BTy->getEncoding()); 840 841 uint64_t Size = BTy->getSizeInBits() >> 3; 842 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size); 843 } 844 845 void DwarfUnit::constructTypeDIE(DIE &Buffer, const DIDerivedType *DTy) { 846 // Get core information. 847 StringRef Name = DTy->getName(); 848 uint64_t Size = DTy->getSizeInBits() >> 3; 849 uint16_t Tag = Buffer.getTag(); 850 851 // Map to main type, void will not have a type. 852 const DIType *FromTy = resolve(DTy->getBaseType()); 853 if (FromTy) 854 addType(Buffer, FromTy); 855 856 // Add name if not anonymous or intermediate type. 857 if (!Name.empty()) 858 addString(Buffer, dwarf::DW_AT_name, Name); 859 860 // Add size if non-zero (derived types might be zero-sized.) 861 if (Size && Tag != dwarf::DW_TAG_pointer_type 862 && Tag != dwarf::DW_TAG_ptr_to_member_type 863 && Tag != dwarf::DW_TAG_reference_type 864 && Tag != dwarf::DW_TAG_rvalue_reference_type) 865 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size); 866 867 if (Tag == dwarf::DW_TAG_ptr_to_member_type) 868 addDIEEntry( 869 Buffer, dwarf::DW_AT_containing_type, 870 *getOrCreateTypeDIE(resolve(cast<DIDerivedType>(DTy)->getClassType()))); 871 // Add source line info if available and TyDesc is not a forward declaration. 872 if (!DTy->isForwardDecl()) 873 addSourceLine(Buffer, DTy); 874 } 875 876 void DwarfUnit::constructSubprogramArguments(DIE &Buffer, DITypeRefArray Args) { 877 for (unsigned i = 1, N = Args.size(); i < N; ++i) { 878 const DIType *Ty = resolve(Args[i]); 879 if (!Ty) { 880 assert(i == N-1 && "Unspecified parameter must be the last argument"); 881 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer); 882 } else { 883 DIE &Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer); 884 addType(Arg, Ty); 885 if (Ty->isArtificial()) 886 addFlag(Arg, dwarf::DW_AT_artificial); 887 } 888 } 889 } 890 891 void DwarfUnit::constructTypeDIE(DIE &Buffer, const DISubroutineType *CTy) { 892 // Add return type. A void return won't have a type. 893 auto Elements = cast<DISubroutineType>(CTy)->getTypeArray(); 894 if (Elements.size()) 895 if (auto RTy = resolve(Elements[0])) 896 addType(Buffer, RTy); 897 898 bool isPrototyped = true; 899 if (Elements.size() == 2 && !Elements[1]) 900 isPrototyped = false; 901 902 constructSubprogramArguments(Buffer, Elements); 903 904 // Add prototype flag if we're dealing with a C language and the function has 905 // been prototyped. 906 uint16_t Language = getLanguage(); 907 if (isPrototyped && 908 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 || 909 Language == dwarf::DW_LANG_ObjC)) 910 addFlag(Buffer, dwarf::DW_AT_prototyped); 911 912 if (CTy->isLValueReference()) 913 addFlag(Buffer, dwarf::DW_AT_reference); 914 915 if (CTy->isRValueReference()) 916 addFlag(Buffer, dwarf::DW_AT_rvalue_reference); 917 } 918 919 void DwarfUnit::constructTypeDIE(DIE &Buffer, const DICompositeType *CTy) { 920 if (CTy->isExternalTypeRef()) { 921 StringRef Identifier = CTy->getIdentifier(); 922 assert(!Identifier.empty() && "external type ref without identifier"); 923 addFlag(Buffer, dwarf::DW_AT_declaration); 924 return addDIETypeSignature(Buffer, dwarf::DW_AT_signature, Identifier); 925 } 926 927 // Add name if not anonymous or intermediate type. 928 StringRef Name = CTy->getName(); 929 930 uint64_t Size = CTy->getSizeInBits() >> 3; 931 uint16_t Tag = Buffer.getTag(); 932 933 switch (Tag) { 934 case dwarf::DW_TAG_array_type: 935 constructArrayTypeDIE(Buffer, CTy); 936 break; 937 case dwarf::DW_TAG_enumeration_type: 938 constructEnumTypeDIE(Buffer, CTy); 939 break; 940 case dwarf::DW_TAG_structure_type: 941 case dwarf::DW_TAG_union_type: 942 case dwarf::DW_TAG_class_type: { 943 // Add elements to structure type. 944 DINodeArray Elements = CTy->getElements(); 945 for (const auto *Element : Elements) { 946 if (!Element) 947 continue; 948 if (auto *SP = dyn_cast<DISubprogram>(Element)) 949 getOrCreateSubprogramDIE(SP); 950 else if (auto *DDTy = dyn_cast<DIDerivedType>(Element)) { 951 if (DDTy->getTag() == dwarf::DW_TAG_friend) { 952 DIE &ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer); 953 addType(ElemDie, resolve(DDTy->getBaseType()), dwarf::DW_AT_friend); 954 } else if (DDTy->isStaticMember()) { 955 getOrCreateStaticMemberDIE(DDTy); 956 } else { 957 constructMemberDIE(Buffer, DDTy); 958 } 959 } else if (auto *Property = dyn_cast<DIObjCProperty>(Element)) { 960 DIE &ElemDie = createAndAddDIE(Property->getTag(), Buffer); 961 StringRef PropertyName = Property->getName(); 962 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName); 963 if (Property->getType()) 964 addType(ElemDie, resolve(Property->getType())); 965 addSourceLine(ElemDie, Property); 966 StringRef GetterName = Property->getGetterName(); 967 if (!GetterName.empty()) 968 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName); 969 StringRef SetterName = Property->getSetterName(); 970 if (!SetterName.empty()) 971 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName); 972 if (unsigned PropertyAttributes = Property->getAttributes()) 973 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None, 974 PropertyAttributes); 975 } 976 } 977 978 if (CTy->isAppleBlockExtension()) 979 addFlag(Buffer, dwarf::DW_AT_APPLE_block); 980 981 // This is outside the DWARF spec, but GDB expects a DW_AT_containing_type 982 // inside C++ composite types to point to the base class with the vtable. 983 if (auto *ContainingType = 984 dyn_cast_or_null<DICompositeType>(resolve(CTy->getVTableHolder()))) 985 addDIEEntry(Buffer, dwarf::DW_AT_containing_type, 986 *getOrCreateTypeDIE(ContainingType)); 987 988 if (CTy->isObjcClassComplete()) 989 addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type); 990 991 // Add template parameters to a class, structure or union types. 992 // FIXME: The support isn't in the metadata for this yet. 993 if (Tag == dwarf::DW_TAG_class_type || 994 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) 995 addTemplateParams(Buffer, CTy->getTemplateParams()); 996 997 break; 998 } 999 default: 1000 break; 1001 } 1002 1003 // Add name if not anonymous or intermediate type. 1004 if (!Name.empty()) 1005 addString(Buffer, dwarf::DW_AT_name, Name); 1006 1007 if (Tag == dwarf::DW_TAG_enumeration_type || 1008 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type || 1009 Tag == dwarf::DW_TAG_union_type) { 1010 // Add size if non-zero (derived types might be zero-sized.) 1011 // TODO: Do we care about size for enum forward declarations? 1012 if (Size) 1013 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size); 1014 else if (!CTy->isForwardDecl()) 1015 // Add zero size if it is not a forward declaration. 1016 addUInt(Buffer, dwarf::DW_AT_byte_size, None, 0); 1017 1018 // If we're a forward decl, say so. 1019 if (CTy->isForwardDecl()) 1020 addFlag(Buffer, dwarf::DW_AT_declaration); 1021 1022 // Add source line info if available. 1023 if (!CTy->isForwardDecl()) 1024 addSourceLine(Buffer, CTy); 1025 1026 // No harm in adding the runtime language to the declaration. 1027 unsigned RLang = CTy->getRuntimeLang(); 1028 if (RLang) 1029 addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1, 1030 RLang); 1031 } 1032 } 1033 1034 void DwarfUnit::constructTemplateTypeParameterDIE( 1035 DIE &Buffer, const DITemplateTypeParameter *TP) { 1036 DIE &ParamDIE = 1037 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer); 1038 // Add the type if it exists, it could be void and therefore no type. 1039 if (TP->getType()) 1040 addType(ParamDIE, resolve(TP->getType())); 1041 if (!TP->getName().empty()) 1042 addString(ParamDIE, dwarf::DW_AT_name, TP->getName()); 1043 } 1044 1045 void DwarfUnit::constructTemplateValueParameterDIE( 1046 DIE &Buffer, const DITemplateValueParameter *VP) { 1047 DIE &ParamDIE = createAndAddDIE(VP->getTag(), Buffer); 1048 1049 // Add the type if there is one, template template and template parameter 1050 // packs will not have a type. 1051 if (VP->getTag() == dwarf::DW_TAG_template_value_parameter) 1052 addType(ParamDIE, resolve(VP->getType())); 1053 if (!VP->getName().empty()) 1054 addString(ParamDIE, dwarf::DW_AT_name, VP->getName()); 1055 if (Metadata *Val = VP->getValue()) { 1056 if (ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(Val)) 1057 addConstantValue(ParamDIE, CI, resolve(VP->getType())); 1058 else if (GlobalValue *GV = mdconst::dyn_extract<GlobalValue>(Val)) { 1059 // For declaration non-type template parameters (such as global values and 1060 // functions) 1061 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 1062 addOpAddress(*Loc, Asm->getSymbol(GV)); 1063 // Emit DW_OP_stack_value to use the address as the immediate value of the 1064 // parameter, rather than a pointer to it. 1065 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value); 1066 addBlock(ParamDIE, dwarf::DW_AT_location, Loc); 1067 } else if (VP->getTag() == dwarf::DW_TAG_GNU_template_template_param) { 1068 assert(isa<MDString>(Val)); 1069 addString(ParamDIE, dwarf::DW_AT_GNU_template_name, 1070 cast<MDString>(Val)->getString()); 1071 } else if (VP->getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) { 1072 addTemplateParams(ParamDIE, cast<MDTuple>(Val)); 1073 } 1074 } 1075 } 1076 1077 DIE *DwarfUnit::getOrCreateNameSpace(const DINamespace *NS) { 1078 // Construct the context before querying for the existence of the DIE in case 1079 // such construction creates the DIE. 1080 DIE *ContextDIE = getOrCreateContextDIE(NS->getScope()); 1081 1082 if (DIE *NDie = getDIE(NS)) 1083 return NDie; 1084 DIE &NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS); 1085 1086 StringRef Name = NS->getName(); 1087 if (!Name.empty()) 1088 addString(NDie, dwarf::DW_AT_name, NS->getName()); 1089 else 1090 Name = "(anonymous namespace)"; 1091 DD->addAccelNamespace(Name, NDie); 1092 addGlobalName(Name, NDie, NS->getScope()); 1093 addSourceLine(NDie, NS); 1094 return &NDie; 1095 } 1096 1097 DIE *DwarfUnit::getOrCreateModule(const DIModule *M) { 1098 // Construct the context before querying for the existence of the DIE in case 1099 // such construction creates the DIE. 1100 DIE *ContextDIE = getOrCreateContextDIE(M->getScope()); 1101 1102 if (DIE *MDie = getDIE(M)) 1103 return MDie; 1104 DIE &MDie = createAndAddDIE(dwarf::DW_TAG_module, *ContextDIE, M); 1105 1106 if (!M->getName().empty()) { 1107 addString(MDie, dwarf::DW_AT_name, M->getName()); 1108 addGlobalName(M->getName(), MDie, M->getScope()); 1109 } 1110 if (!M->getConfigurationMacros().empty()) 1111 addString(MDie, dwarf::DW_AT_LLVM_config_macros, 1112 M->getConfigurationMacros()); 1113 if (!M->getIncludePath().empty()) 1114 addString(MDie, dwarf::DW_AT_LLVM_include_path, M->getIncludePath()); 1115 if (!M->getISysRoot().empty()) 1116 addString(MDie, dwarf::DW_AT_LLVM_isysroot, M->getISysRoot()); 1117 1118 return &MDie; 1119 } 1120 1121 DIE *DwarfUnit::getOrCreateSubprogramDIE(const DISubprogram *SP, bool Minimal) { 1122 // Construct the context before querying for the existence of the DIE in case 1123 // such construction creates the DIE (as is the case for member function 1124 // declarations). 1125 DIE *ContextDIE = 1126 Minimal ? &getUnitDie() : getOrCreateContextDIE(resolve(SP->getScope())); 1127 1128 if (DIE *SPDie = getDIE(SP)) 1129 return SPDie; 1130 1131 if (auto *SPDecl = SP->getDeclaration()) { 1132 if (!Minimal) { 1133 // Add subprogram definitions to the CU die directly. 1134 ContextDIE = &getUnitDie(); 1135 // Build the decl now to ensure it precedes the definition. 1136 getOrCreateSubprogramDIE(SPDecl); 1137 } 1138 } 1139 1140 // DW_TAG_inlined_subroutine may refer to this DIE. 1141 DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP); 1142 1143 // Stop here and fill this in later, depending on whether or not this 1144 // subprogram turns out to have inlined instances or not. 1145 if (SP->isDefinition()) 1146 return &SPDie; 1147 1148 applySubprogramAttributes(SP, SPDie); 1149 return &SPDie; 1150 } 1151 1152 bool DwarfUnit::applySubprogramDefinitionAttributes(const DISubprogram *SP, 1153 DIE &SPDie) { 1154 DIE *DeclDie = nullptr; 1155 StringRef DeclLinkageName; 1156 if (auto *SPDecl = SP->getDeclaration()) { 1157 DeclDie = getDIE(SPDecl); 1158 assert(DeclDie && "This DIE should've already been constructed when the " 1159 "definition DIE was created in " 1160 "getOrCreateSubprogramDIE"); 1161 DeclLinkageName = SPDecl->getLinkageName(); 1162 unsigned DeclID = 1163 getOrCreateSourceID(SPDecl->getFilename(), SPDecl->getDirectory()); 1164 unsigned DefID = getOrCreateSourceID(SP->getFilename(), SP->getDirectory()); 1165 if (DeclID != DefID) 1166 addUInt(SPDie, dwarf::DW_AT_decl_file, None, DefID); 1167 1168 if (SP->getLine() != SPDecl->getLine()) 1169 addUInt(SPDie, dwarf::DW_AT_decl_line, None, SP->getLine()); 1170 } 1171 1172 // Add function template parameters. 1173 addTemplateParams(SPDie, SP->getTemplateParams()); 1174 1175 // Add the linkage name if we have one and it isn't in the Decl. 1176 StringRef LinkageName = SP->getLinkageName(); 1177 assert(((LinkageName.empty() || DeclLinkageName.empty()) || 1178 LinkageName == DeclLinkageName) && 1179 "decl has a linkage name and it is different"); 1180 if (DeclLinkageName.empty()) 1181 addLinkageName(SPDie, LinkageName); 1182 1183 if (!DeclDie) 1184 return false; 1185 1186 // Refer to the function declaration where all the other attributes will be 1187 // found. 1188 addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie); 1189 return true; 1190 } 1191 1192 void DwarfUnit::applySubprogramAttributes(const DISubprogram *SP, DIE &SPDie, 1193 bool Minimal) { 1194 if (!Minimal) 1195 if (applySubprogramDefinitionAttributes(SP, SPDie)) 1196 return; 1197 1198 // Constructors and operators for anonymous aggregates do not have names. 1199 if (!SP->getName().empty()) 1200 addString(SPDie, dwarf::DW_AT_name, SP->getName()); 1201 1202 // Skip the rest of the attributes under -gmlt to save space. 1203 if (Minimal) 1204 return; 1205 1206 addSourceLine(SPDie, SP); 1207 1208 // Add the prototype if we have a prototype and we have a C like 1209 // language. 1210 uint16_t Language = getLanguage(); 1211 if (SP->isPrototyped() && 1212 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 || 1213 Language == dwarf::DW_LANG_ObjC)) 1214 addFlag(SPDie, dwarf::DW_AT_prototyped); 1215 1216 DITypeRefArray Args; 1217 if (const DISubroutineType *SPTy = SP->getType()) 1218 Args = SPTy->getTypeArray(); 1219 1220 // Add a return type. If this is a type like a C/C++ void type we don't add a 1221 // return type. 1222 if (Args.size()) 1223 if (auto Ty = resolve(Args[0])) 1224 addType(SPDie, Ty); 1225 1226 unsigned VK = SP->getVirtuality(); 1227 if (VK) { 1228 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK); 1229 DIELoc *Block = getDIELoc(); 1230 addUInt(*Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1231 addUInt(*Block, dwarf::DW_FORM_udata, SP->getVirtualIndex()); 1232 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block); 1233 ContainingTypeMap.insert( 1234 std::make_pair(&SPDie, resolve(SP->getContainingType()))); 1235 } 1236 1237 if (!SP->isDefinition()) { 1238 addFlag(SPDie, dwarf::DW_AT_declaration); 1239 1240 // Add arguments. Do not add arguments for subprogram definition. They will 1241 // be handled while processing variables. 1242 constructSubprogramArguments(SPDie, Args); 1243 } 1244 1245 if (SP->isArtificial()) 1246 addFlag(SPDie, dwarf::DW_AT_artificial); 1247 1248 if (!SP->isLocalToUnit()) 1249 addFlag(SPDie, dwarf::DW_AT_external); 1250 1251 if (SP->isOptimized()) 1252 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized); 1253 1254 if (unsigned isa = Asm->getISAEncoding()) 1255 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa); 1256 1257 if (SP->isLValueReference()) 1258 addFlag(SPDie, dwarf::DW_AT_reference); 1259 1260 if (SP->isRValueReference()) 1261 addFlag(SPDie, dwarf::DW_AT_rvalue_reference); 1262 1263 if (SP->isProtected()) 1264 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1265 dwarf::DW_ACCESS_protected); 1266 else if (SP->isPrivate()) 1267 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1268 dwarf::DW_ACCESS_private); 1269 else if (SP->isPublic()) 1270 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1271 dwarf::DW_ACCESS_public); 1272 1273 if (SP->isExplicit()) 1274 addFlag(SPDie, dwarf::DW_AT_explicit); 1275 } 1276 1277 void DwarfUnit::constructSubrangeDIE(DIE &Buffer, const DISubrange *SR, 1278 DIE *IndexTy) { 1279 DIE &DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer); 1280 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IndexTy); 1281 1282 // The LowerBound value defines the lower bounds which is typically zero for 1283 // C/C++. The Count value is the number of elements. Values are 64 bit. If 1284 // Count == -1 then the array is unbounded and we do not emit 1285 // DW_AT_lower_bound and DW_AT_count attributes. 1286 int64_t LowerBound = SR->getLowerBound(); 1287 int64_t DefaultLowerBound = getDefaultLowerBound(); 1288 int64_t Count = SR->getCount(); 1289 1290 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound) 1291 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound); 1292 1293 if (Count != -1) 1294 // FIXME: An unbounded array should reference the expression that defines 1295 // the array. 1296 addUInt(DW_Subrange, dwarf::DW_AT_count, None, Count); 1297 } 1298 1299 DIE *DwarfUnit::getIndexTyDie() { 1300 if (IndexTyDie) 1301 return IndexTyDie; 1302 // Construct an integer type to use for indexes. 1303 IndexTyDie = &createAndAddDIE(dwarf::DW_TAG_base_type, UnitDie); 1304 addString(*IndexTyDie, dwarf::DW_AT_name, "sizetype"); 1305 addUInt(*IndexTyDie, dwarf::DW_AT_byte_size, None, sizeof(int64_t)); 1306 addUInt(*IndexTyDie, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 1307 dwarf::DW_ATE_unsigned); 1308 return IndexTyDie; 1309 } 1310 1311 void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, const DICompositeType *CTy) { 1312 if (CTy->isVector()) 1313 addFlag(Buffer, dwarf::DW_AT_GNU_vector); 1314 1315 // Emit the element type. 1316 addType(Buffer, resolve(CTy->getBaseType())); 1317 1318 // Get an anonymous type for index type. 1319 // FIXME: This type should be passed down from the front end 1320 // as different languages may have different sizes for indexes. 1321 DIE *IdxTy = getIndexTyDie(); 1322 1323 // Add subranges to array type. 1324 DINodeArray Elements = CTy->getElements(); 1325 for (unsigned i = 0, N = Elements.size(); i < N; ++i) { 1326 // FIXME: Should this really be such a loose cast? 1327 if (auto *Element = dyn_cast_or_null<DINode>(Elements[i])) 1328 if (Element->getTag() == dwarf::DW_TAG_subrange_type) 1329 constructSubrangeDIE(Buffer, cast<DISubrange>(Element), IdxTy); 1330 } 1331 } 1332 1333 void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, const DICompositeType *CTy) { 1334 DINodeArray Elements = CTy->getElements(); 1335 1336 // Add enumerators to enumeration type. 1337 for (unsigned i = 0, N = Elements.size(); i < N; ++i) { 1338 auto *Enum = dyn_cast_or_null<DIEnumerator>(Elements[i]); 1339 if (Enum) { 1340 DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer); 1341 StringRef Name = Enum->getName(); 1342 addString(Enumerator, dwarf::DW_AT_name, Name); 1343 int64_t Value = Enum->getValue(); 1344 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, 1345 Value); 1346 } 1347 } 1348 const DIType *DTy = resolve(CTy->getBaseType()); 1349 if (DTy) { 1350 addType(Buffer, DTy); 1351 addFlag(Buffer, dwarf::DW_AT_enum_class); 1352 } 1353 } 1354 1355 void DwarfUnit::constructContainingTypeDIEs() { 1356 for (auto CI = ContainingTypeMap.begin(), CE = ContainingTypeMap.end(); 1357 CI != CE; ++CI) { 1358 DIE &SPDie = *CI->first; 1359 const DINode *D = CI->second; 1360 if (!D) 1361 continue; 1362 DIE *NDie = getDIE(D); 1363 if (!NDie) 1364 continue; 1365 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie); 1366 } 1367 } 1368 1369 void DwarfUnit::constructMemberDIE(DIE &Buffer, const DIDerivedType *DT) { 1370 DIE &MemberDie = createAndAddDIE(DT->getTag(), Buffer); 1371 StringRef Name = DT->getName(); 1372 if (!Name.empty()) 1373 addString(MemberDie, dwarf::DW_AT_name, Name); 1374 1375 addType(MemberDie, resolve(DT->getBaseType())); 1376 1377 addSourceLine(MemberDie, DT); 1378 1379 if (DT->getTag() == dwarf::DW_TAG_inheritance && DT->isVirtual()) { 1380 1381 // For C++, virtual base classes are not at fixed offset. Use following 1382 // expression to extract appropriate offset from vtable. 1383 // BaseAddr = ObAddr + *((*ObAddr) - Offset) 1384 1385 DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc; 1386 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup); 1387 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1388 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1389 addUInt(*VBaseLocationDie, dwarf::DW_FORM_udata, DT->getOffsetInBits()); 1390 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus); 1391 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1392 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 1393 1394 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie); 1395 } else { 1396 uint64_t Size = DT->getSizeInBits(); 1397 uint64_t FieldSize = getBaseTypeSize(DD, DT); 1398 uint64_t OffsetInBytes; 1399 1400 if (FieldSize && Size != FieldSize) { 1401 // Handle bitfield, assume bytes are 8 bits. 1402 addUInt(MemberDie, dwarf::DW_AT_byte_size, None, FieldSize/8); 1403 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size); 1404 // 1405 // The DWARF 2 DW_AT_bit_offset is counting the bits between the most 1406 // significant bit of the aligned storage unit containing the bit field to 1407 // the most significan bit of the bit field. 1408 // 1409 // FIXME: DWARF 4 states that DW_AT_data_bit_offset (which 1410 // counts from the beginning, regardless of endianness) should 1411 // be used instead. 1412 // 1413 // 1414 // Struct Align Align Align 1415 // v v v v 1416 // +-----------+-----*-----+-----*-----+-- 1417 // | ... |b1|b2|b3|b4| 1418 // +-----------+-----*-----+-----*-----+-- 1419 // | | |<-- Size ->| | 1420 // |<---- Offset --->| |<--->| 1421 // | | | \_ DW_AT_bit_offset (little endian) 1422 // | |<--->| 1423 // |<--------->| \_ StartBitOffset = DW_AT_bit_offset (big endian) 1424 // \ = DW_AT_data_bit_offset (biendian) 1425 // \_ OffsetInBytes 1426 uint64_t Offset = DT->getOffsetInBits(); 1427 uint64_t Align = DT->getAlignInBits() ? DT->getAlignInBits() : FieldSize; 1428 uint64_t AlignMask = ~(Align - 1); 1429 // The bits from the start of the storage unit to the start of the field. 1430 uint64_t StartBitOffset = Offset - (Offset & AlignMask); 1431 // The endian-dependent DWARF 2 offset. 1432 uint64_t DwarfBitOffset = Asm->getDataLayout().isLittleEndian() 1433 ? OffsetToAlignment(Offset + Size, Align) 1434 : StartBitOffset; 1435 1436 // The byte offset of the field's aligned storage unit inside the struct. 1437 OffsetInBytes = (Offset - StartBitOffset) / 8; 1438 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, DwarfBitOffset); 1439 } else 1440 // This is not a bitfield. 1441 OffsetInBytes = DT->getOffsetInBits() / 8; 1442 1443 if (DD->getDwarfVersion() <= 2) { 1444 DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc; 1445 addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 1446 addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes); 1447 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie); 1448 } else 1449 addUInt(MemberDie, dwarf::DW_AT_data_member_location, None, 1450 OffsetInBytes); 1451 } 1452 1453 if (DT->isProtected()) 1454 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1455 dwarf::DW_ACCESS_protected); 1456 else if (DT->isPrivate()) 1457 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1458 dwarf::DW_ACCESS_private); 1459 // Otherwise C++ member and base classes are considered public. 1460 else if (DT->isPublic()) 1461 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1462 dwarf::DW_ACCESS_public); 1463 if (DT->isVirtual()) 1464 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, 1465 dwarf::DW_VIRTUALITY_virtual); 1466 1467 // Objective-C properties. 1468 if (DINode *PNode = DT->getObjCProperty()) 1469 if (DIE *PDie = getDIE(PNode)) 1470 MemberDie.addValue(DIEValueAllocator, dwarf::DW_AT_APPLE_property, 1471 dwarf::DW_FORM_ref4, DIEEntry(*PDie)); 1472 1473 if (DT->isArtificial()) 1474 addFlag(MemberDie, dwarf::DW_AT_artificial); 1475 } 1476 1477 DIE *DwarfUnit::getOrCreateStaticMemberDIE(const DIDerivedType *DT) { 1478 if (!DT) 1479 return nullptr; 1480 1481 // Construct the context before querying for the existence of the DIE in case 1482 // such construction creates the DIE. 1483 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT->getScope())); 1484 assert(dwarf::isType(ContextDIE->getTag()) && 1485 "Static member should belong to a type."); 1486 1487 if (DIE *StaticMemberDIE = getDIE(DT)) 1488 return StaticMemberDIE; 1489 1490 DIE &StaticMemberDIE = createAndAddDIE(DT->getTag(), *ContextDIE, DT); 1491 1492 const DIType *Ty = resolve(DT->getBaseType()); 1493 1494 addString(StaticMemberDIE, dwarf::DW_AT_name, DT->getName()); 1495 addType(StaticMemberDIE, Ty); 1496 addSourceLine(StaticMemberDIE, DT); 1497 addFlag(StaticMemberDIE, dwarf::DW_AT_external); 1498 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration); 1499 1500 // FIXME: We could omit private if the parent is a class_type, and 1501 // public if the parent is something else. 1502 if (DT->isProtected()) 1503 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1504 dwarf::DW_ACCESS_protected); 1505 else if (DT->isPrivate()) 1506 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1507 dwarf::DW_ACCESS_private); 1508 else if (DT->isPublic()) 1509 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1510 dwarf::DW_ACCESS_public); 1511 1512 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT->getConstant())) 1513 addConstantValue(StaticMemberDIE, CI, Ty); 1514 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT->getConstant())) 1515 addConstantFPValue(StaticMemberDIE, CFP); 1516 1517 return &StaticMemberDIE; 1518 } 1519 1520 void DwarfUnit::emitHeader(bool UseOffsets) { 1521 // Emit size of content not including length itself 1522 Asm->OutStreamer->AddComment("Length of Unit"); 1523 Asm->EmitInt32(getHeaderSize() + UnitDie.getSize()); 1524 1525 Asm->OutStreamer->AddComment("DWARF version number"); 1526 Asm->EmitInt16(DD->getDwarfVersion()); 1527 Asm->OutStreamer->AddComment("Offset Into Abbrev. Section"); 1528 1529 // We share one abbreviations table across all units so it's always at the 1530 // start of the section. Use a relocatable offset where needed to ensure 1531 // linking doesn't invalidate that offset. 1532 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 1533 if (UseOffsets) 1534 Asm->EmitInt32(0); 1535 else 1536 Asm->emitDwarfSymbolReference( 1537 TLOF.getDwarfAbbrevSection()->getBeginSymbol(), false); 1538 1539 Asm->OutStreamer->AddComment("Address Size (in bytes)"); 1540 Asm->EmitInt8(Asm->getDataLayout().getPointerSize()); 1541 } 1542 1543 void DwarfUnit::initSection(MCSection *Section) { 1544 assert(!this->Section); 1545 this->Section = Section; 1546 } 1547 1548 void DwarfTypeUnit::emitHeader(bool UseOffsets) { 1549 DwarfUnit::emitHeader(UseOffsets); 1550 Asm->OutStreamer->AddComment("Type Signature"); 1551 Asm->OutStreamer->EmitIntValue(TypeSignature, sizeof(TypeSignature)); 1552 Asm->OutStreamer->AddComment("Type DIE Offset"); 1553 // In a skeleton type unit there is no type DIE so emit a zero offset. 1554 Asm->OutStreamer->EmitIntValue(Ty ? Ty->getOffset() : 0, 1555 sizeof(Ty->getOffset())); 1556 } 1557 1558 bool DwarfTypeUnit::isDwoUnit() const { 1559 // Since there are no skeleton type units, all type units are dwo type units 1560 // when split DWARF is being used. 1561 return DD->useSplitDwarf(); 1562 } 1563