1 //===- DebugInfo.cpp - Debug Information Helper Classes -------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements the helper classes used to build and interpret debug 10 // information in LLVM IR form. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm-c/DebugInfo.h" 15 #include "llvm/ADT/DenseMap.h" 16 #include "llvm/ADT/DenseSet.h" 17 #include "llvm/ADT/None.h" 18 #include "llvm/ADT/STLExtras.h" 19 #include "llvm/ADT/SmallPtrSet.h" 20 #include "llvm/ADT/SmallVector.h" 21 #include "llvm/ADT/StringRef.h" 22 #include "llvm/IR/BasicBlock.h" 23 #include "llvm/IR/Constants.h" 24 #include "llvm/IR/DebugInfoMetadata.h" 25 #include "llvm/IR/DebugLoc.h" 26 #include "llvm/IR/DebugInfo.h" 27 #include "llvm/IR/DIBuilder.h" 28 #include "llvm/IR/Function.h" 29 #include "llvm/IR/GVMaterializer.h" 30 #include "llvm/IR/Instruction.h" 31 #include "llvm/IR/IntrinsicInst.h" 32 #include "llvm/IR/LLVMContext.h" 33 #include "llvm/IR/Metadata.h" 34 #include "llvm/IR/Module.h" 35 #include "llvm/Support/Casting.h" 36 #include <algorithm> 37 #include <cassert> 38 #include <utility> 39 40 using namespace llvm; 41 using namespace llvm::dwarf; 42 43 /// Finds all intrinsics declaring local variables as living in the memory that 44 /// 'V' points to. This may include a mix of dbg.declare and 45 /// dbg.addr intrinsics. 46 TinyPtrVector<DbgVariableIntrinsic *> llvm::FindDbgAddrUses(Value *V) { 47 // This function is hot. Check whether the value has any metadata to avoid a 48 // DenseMap lookup. 49 if (!V->isUsedByMetadata()) 50 return {}; 51 auto *L = LocalAsMetadata::getIfExists(V); 52 if (!L) 53 return {}; 54 auto *MDV = MetadataAsValue::getIfExists(V->getContext(), L); 55 if (!MDV) 56 return {}; 57 58 TinyPtrVector<DbgVariableIntrinsic *> Declares; 59 for (User *U : MDV->users()) { 60 if (auto *DII = dyn_cast<DbgVariableIntrinsic>(U)) 61 if (DII->isAddressOfVariable()) 62 Declares.push_back(DII); 63 } 64 65 return Declares; 66 } 67 68 TinyPtrVector<DbgDeclareInst *> llvm::FindDbgDeclareUses(Value *V) { 69 TinyPtrVector<DbgDeclareInst *> DDIs; 70 for (DbgVariableIntrinsic *DVI : FindDbgAddrUses(V)) 71 if (auto *DDI = dyn_cast<DbgDeclareInst>(DVI)) 72 DDIs.push_back(DDI); 73 return DDIs; 74 } 75 76 void llvm::findDbgValues(SmallVectorImpl<DbgValueInst *> &DbgValues, Value *V) { 77 // This function is hot. Check whether the value has any metadata to avoid a 78 // DenseMap lookup. 79 if (!V->isUsedByMetadata()) 80 return; 81 // TODO: If this value appears multiple times in a DIArgList, we should still 82 // only add the owning DbgValueInst once; use this set to track ArgListUsers. 83 // This behaviour can be removed when we can automatically remove duplicates. 84 SmallPtrSet<DbgValueInst *, 4> EncounteredDbgValues; 85 if (auto *L = LocalAsMetadata::getIfExists(V)) { 86 if (auto *MDV = MetadataAsValue::getIfExists(V->getContext(), L)) { 87 for (User *U : MDV->users()) 88 if (DbgValueInst *DVI = dyn_cast<DbgValueInst>(U)) 89 DbgValues.push_back(DVI); 90 } 91 for (Metadata *AL : L->getAllArgListUsers()) { 92 if (auto *MDV = MetadataAsValue::getIfExists(V->getContext(), AL)) { 93 for (User *U : MDV->users()) 94 if (DbgValueInst *DVI = dyn_cast<DbgValueInst>(U)) 95 if (EncounteredDbgValues.insert(DVI).second) 96 DbgValues.push_back(DVI); 97 } 98 } 99 } 100 } 101 102 void llvm::findDbgUsers(SmallVectorImpl<DbgVariableIntrinsic *> &DbgUsers, 103 Value *V) { 104 // This function is hot. Check whether the value has any metadata to avoid a 105 // DenseMap lookup. 106 if (!V->isUsedByMetadata()) 107 return; 108 // TODO: If this value appears multiple times in a DIArgList, we should still 109 // only add the owning DbgValueInst once; use this set to track ArgListUsers. 110 // This behaviour can be removed when we can automatically remove duplicates. 111 SmallPtrSet<DbgVariableIntrinsic *, 4> EncounteredDbgValues; 112 if (auto *L = LocalAsMetadata::getIfExists(V)) { 113 if (auto *MDV = MetadataAsValue::getIfExists(V->getContext(), L)) { 114 for (User *U : MDV->users()) 115 if (DbgVariableIntrinsic *DII = dyn_cast<DbgVariableIntrinsic>(U)) 116 DbgUsers.push_back(DII); 117 } 118 for (Metadata *AL : L->getAllArgListUsers()) { 119 if (auto *MDV = MetadataAsValue::getIfExists(V->getContext(), AL)) { 120 for (User *U : MDV->users()) 121 if (DbgVariableIntrinsic *DII = dyn_cast<DbgVariableIntrinsic>(U)) 122 if (EncounteredDbgValues.insert(DII).second) 123 DbgUsers.push_back(DII); 124 } 125 } 126 } 127 } 128 129 DISubprogram *llvm::getDISubprogram(const MDNode *Scope) { 130 if (auto *LocalScope = dyn_cast_or_null<DILocalScope>(Scope)) 131 return LocalScope->getSubprogram(); 132 return nullptr; 133 } 134 135 //===----------------------------------------------------------------------===// 136 // DebugInfoFinder implementations. 137 //===----------------------------------------------------------------------===// 138 139 void DebugInfoFinder::reset() { 140 CUs.clear(); 141 SPs.clear(); 142 GVs.clear(); 143 TYs.clear(); 144 Scopes.clear(); 145 NodesSeen.clear(); 146 } 147 148 void DebugInfoFinder::processModule(const Module &M) { 149 for (auto *CU : M.debug_compile_units()) 150 processCompileUnit(CU); 151 for (auto &F : M.functions()) { 152 if (auto *SP = cast_or_null<DISubprogram>(F.getSubprogram())) 153 processSubprogram(SP); 154 // There could be subprograms from inlined functions referenced from 155 // instructions only. Walk the function to find them. 156 for (const BasicBlock &BB : F) 157 for (const Instruction &I : BB) 158 processInstruction(M, I); 159 } 160 } 161 162 void DebugInfoFinder::processCompileUnit(DICompileUnit *CU) { 163 if (!addCompileUnit(CU)) 164 return; 165 for (auto DIG : CU->getGlobalVariables()) { 166 if (!addGlobalVariable(DIG)) 167 continue; 168 auto *GV = DIG->getVariable(); 169 processScope(GV->getScope()); 170 processType(GV->getType()); 171 } 172 for (auto *ET : CU->getEnumTypes()) 173 processType(ET); 174 for (auto *RT : CU->getRetainedTypes()) 175 if (auto *T = dyn_cast<DIType>(RT)) 176 processType(T); 177 else 178 processSubprogram(cast<DISubprogram>(RT)); 179 for (auto *Import : CU->getImportedEntities()) { 180 auto *Entity = Import->getEntity(); 181 if (auto *T = dyn_cast<DIType>(Entity)) 182 processType(T); 183 else if (auto *SP = dyn_cast<DISubprogram>(Entity)) 184 processSubprogram(SP); 185 else if (auto *NS = dyn_cast<DINamespace>(Entity)) 186 processScope(NS->getScope()); 187 else if (auto *M = dyn_cast<DIModule>(Entity)) 188 processScope(M->getScope()); 189 } 190 } 191 192 void DebugInfoFinder::processInstruction(const Module &M, 193 const Instruction &I) { 194 if (auto *DVI = dyn_cast<DbgVariableIntrinsic>(&I)) 195 processVariable(M, *DVI); 196 197 if (auto DbgLoc = I.getDebugLoc()) 198 processLocation(M, DbgLoc.get()); 199 } 200 201 void DebugInfoFinder::processLocation(const Module &M, const DILocation *Loc) { 202 if (!Loc) 203 return; 204 processScope(Loc->getScope()); 205 processLocation(M, Loc->getInlinedAt()); 206 } 207 208 void DebugInfoFinder::processType(DIType *DT) { 209 if (!addType(DT)) 210 return; 211 processScope(DT->getScope()); 212 if (auto *ST = dyn_cast<DISubroutineType>(DT)) { 213 for (DIType *Ref : ST->getTypeArray()) 214 processType(Ref); 215 return; 216 } 217 if (auto *DCT = dyn_cast<DICompositeType>(DT)) { 218 processType(DCT->getBaseType()); 219 for (Metadata *D : DCT->getElements()) { 220 if (auto *T = dyn_cast<DIType>(D)) 221 processType(T); 222 else if (auto *SP = dyn_cast<DISubprogram>(D)) 223 processSubprogram(SP); 224 } 225 return; 226 } 227 if (auto *DDT = dyn_cast<DIDerivedType>(DT)) { 228 processType(DDT->getBaseType()); 229 } 230 } 231 232 void DebugInfoFinder::processScope(DIScope *Scope) { 233 if (!Scope) 234 return; 235 if (auto *Ty = dyn_cast<DIType>(Scope)) { 236 processType(Ty); 237 return; 238 } 239 if (auto *CU = dyn_cast<DICompileUnit>(Scope)) { 240 addCompileUnit(CU); 241 return; 242 } 243 if (auto *SP = dyn_cast<DISubprogram>(Scope)) { 244 processSubprogram(SP); 245 return; 246 } 247 if (!addScope(Scope)) 248 return; 249 if (auto *LB = dyn_cast<DILexicalBlockBase>(Scope)) { 250 processScope(LB->getScope()); 251 } else if (auto *NS = dyn_cast<DINamespace>(Scope)) { 252 processScope(NS->getScope()); 253 } else if (auto *M = dyn_cast<DIModule>(Scope)) { 254 processScope(M->getScope()); 255 } 256 } 257 258 void DebugInfoFinder::processSubprogram(DISubprogram *SP) { 259 if (!addSubprogram(SP)) 260 return; 261 processScope(SP->getScope()); 262 // Some of the users, e.g. CloneFunctionInto / CloneModule, need to set up a 263 // ValueMap containing identity mappings for all of the DICompileUnit's, not 264 // just DISubprogram's, referenced from anywhere within the Function being 265 // cloned prior to calling MapMetadata / RemapInstruction to avoid their 266 // duplication later as DICompileUnit's are also directly referenced by 267 // llvm.dbg.cu list. Thefore we need to collect DICompileUnit's here as well. 268 // Also, DICompileUnit's may reference DISubprogram's too and therefore need 269 // to be at least looked through. 270 processCompileUnit(SP->getUnit()); 271 processType(SP->getType()); 272 for (auto *Element : SP->getTemplateParams()) { 273 if (auto *TType = dyn_cast<DITemplateTypeParameter>(Element)) { 274 processType(TType->getType()); 275 } else if (auto *TVal = dyn_cast<DITemplateValueParameter>(Element)) { 276 processType(TVal->getType()); 277 } 278 } 279 } 280 281 void DebugInfoFinder::processVariable(const Module &M, 282 const DbgVariableIntrinsic &DVI) { 283 auto *N = dyn_cast<MDNode>(DVI.getVariable()); 284 if (!N) 285 return; 286 287 auto *DV = dyn_cast<DILocalVariable>(N); 288 if (!DV) 289 return; 290 291 if (!NodesSeen.insert(DV).second) 292 return; 293 processScope(DV->getScope()); 294 processType(DV->getType()); 295 } 296 297 bool DebugInfoFinder::addType(DIType *DT) { 298 if (!DT) 299 return false; 300 301 if (!NodesSeen.insert(DT).second) 302 return false; 303 304 TYs.push_back(const_cast<DIType *>(DT)); 305 return true; 306 } 307 308 bool DebugInfoFinder::addCompileUnit(DICompileUnit *CU) { 309 if (!CU) 310 return false; 311 if (!NodesSeen.insert(CU).second) 312 return false; 313 314 CUs.push_back(CU); 315 return true; 316 } 317 318 bool DebugInfoFinder::addGlobalVariable(DIGlobalVariableExpression *DIG) { 319 if (!NodesSeen.insert(DIG).second) 320 return false; 321 322 GVs.push_back(DIG); 323 return true; 324 } 325 326 bool DebugInfoFinder::addSubprogram(DISubprogram *SP) { 327 if (!SP) 328 return false; 329 330 if (!NodesSeen.insert(SP).second) 331 return false; 332 333 SPs.push_back(SP); 334 return true; 335 } 336 337 bool DebugInfoFinder::addScope(DIScope *Scope) { 338 if (!Scope) 339 return false; 340 // FIXME: Ocaml binding generates a scope with no content, we treat it 341 // as null for now. 342 if (Scope->getNumOperands() == 0) 343 return false; 344 if (!NodesSeen.insert(Scope).second) 345 return false; 346 Scopes.push_back(Scope); 347 return true; 348 } 349 350 static MDNode *updateLoopMetadataDebugLocationsImpl( 351 MDNode *OrigLoopID, function_ref<Metadata *(Metadata *)> Updater) { 352 assert(OrigLoopID && OrigLoopID->getNumOperands() > 0 && 353 "Loop ID needs at least one operand"); 354 assert(OrigLoopID && OrigLoopID->getOperand(0).get() == OrigLoopID && 355 "Loop ID should refer to itself"); 356 357 // Save space for the self-referential LoopID. 358 SmallVector<Metadata *, 4> MDs = {nullptr}; 359 360 for (unsigned i = 1; i < OrigLoopID->getNumOperands(); ++i) { 361 Metadata *MD = OrigLoopID->getOperand(i); 362 if (!MD) 363 MDs.push_back(nullptr); 364 else if (Metadata *NewMD = Updater(MD)) 365 MDs.push_back(NewMD); 366 } 367 368 MDNode *NewLoopID = MDNode::getDistinct(OrigLoopID->getContext(), MDs); 369 // Insert the self-referential LoopID. 370 NewLoopID->replaceOperandWith(0, NewLoopID); 371 return NewLoopID; 372 } 373 374 void llvm::updateLoopMetadataDebugLocations( 375 Instruction &I, function_ref<Metadata *(Metadata *)> Updater) { 376 MDNode *OrigLoopID = I.getMetadata(LLVMContext::MD_loop); 377 if (!OrigLoopID) 378 return; 379 MDNode *NewLoopID = updateLoopMetadataDebugLocationsImpl(OrigLoopID, Updater); 380 I.setMetadata(LLVMContext::MD_loop, NewLoopID); 381 } 382 383 /// Return true if a node is a DILocation or if a DILocation is 384 /// indirectly referenced by one of the node's children. 385 static bool isDILocationReachable(SmallPtrSetImpl<Metadata *> &Visited, 386 SmallPtrSetImpl<Metadata *> &Reachable, 387 Metadata *MD) { 388 MDNode *N = dyn_cast_or_null<MDNode>(MD); 389 if (!N) 390 return false; 391 if (isa<DILocation>(N) || Reachable.count(N)) 392 return true; 393 if (!Visited.insert(N).second) 394 return false; 395 for (auto &OpIt : N->operands()) { 396 Metadata *Op = OpIt.get(); 397 if (isDILocationReachable(Visited, Reachable, Op)) { 398 Reachable.insert(N); 399 return true; 400 } 401 } 402 return false; 403 } 404 405 static MDNode *stripDebugLocFromLoopID(MDNode *N) { 406 assert(!N->operands().empty() && "Missing self reference?"); 407 SmallPtrSet<Metadata *, 8> Visited, DILocationReachable; 408 // If we already visited N, there is nothing to do. 409 if (!Visited.insert(N).second) 410 return N; 411 412 // If there is no debug location, we do not have to rewrite this 413 // MDNode. This loop also initializes DILocationReachable, later 414 // needed by updateLoopMetadataDebugLocationsImpl; the use of 415 // count_if avoids an early exit. 416 if (!std::count_if(N->op_begin() + 1, N->op_end(), 417 [&Visited, &DILocationReachable](const MDOperand &Op) { 418 return isDILocationReachable( 419 Visited, DILocationReachable, Op.get()); 420 })) 421 return N; 422 423 // If there is only the debug location without any actual loop metadata, we 424 // can remove the metadata. 425 if (std::all_of( 426 N->op_begin() + 1, N->op_end(), 427 [&Visited, &DILocationReachable](const MDOperand &Op) { 428 return isDILocationReachable(Visited, DILocationReachable, 429 Op.get()); 430 })) 431 return nullptr; 432 433 return updateLoopMetadataDebugLocationsImpl( 434 N, [&DILocationReachable](Metadata *MD) -> Metadata * { 435 if (isa<DILocation>(MD) || DILocationReachable.count(MD)) 436 return nullptr; 437 return MD; 438 }); 439 } 440 441 bool llvm::stripDebugInfo(Function &F) { 442 bool Changed = false; 443 if (F.hasMetadata(LLVMContext::MD_dbg)) { 444 Changed = true; 445 F.setSubprogram(nullptr); 446 } 447 448 DenseMap<MDNode *, MDNode *> LoopIDsMap; 449 for (BasicBlock &BB : F) { 450 for (auto II = BB.begin(), End = BB.end(); II != End;) { 451 Instruction &I = *II++; // We may delete the instruction, increment now. 452 if (isa<DbgInfoIntrinsic>(&I)) { 453 I.eraseFromParent(); 454 Changed = true; 455 continue; 456 } 457 if (I.getDebugLoc()) { 458 Changed = true; 459 I.setDebugLoc(DebugLoc()); 460 } 461 if (auto *LoopID = I.getMetadata(LLVMContext::MD_loop)) { 462 auto *NewLoopID = LoopIDsMap.lookup(LoopID); 463 if (!NewLoopID) 464 NewLoopID = LoopIDsMap[LoopID] = stripDebugLocFromLoopID(LoopID); 465 if (NewLoopID != LoopID) 466 I.setMetadata(LLVMContext::MD_loop, NewLoopID); 467 } 468 // Strip heapallocsite attachments, they point into the DIType system. 469 if (I.hasMetadataOtherThanDebugLoc()) 470 I.setMetadata("heapallocsite", nullptr); 471 } 472 } 473 return Changed; 474 } 475 476 bool llvm::StripDebugInfo(Module &M) { 477 bool Changed = false; 478 479 for (NamedMDNode &NMD : llvm::make_early_inc_range(M.named_metadata())) { 480 // We're stripping debug info, and without them, coverage information 481 // doesn't quite make sense. 482 if (NMD.getName().startswith("llvm.dbg.") || 483 NMD.getName() == "llvm.gcov") { 484 NMD.eraseFromParent(); 485 Changed = true; 486 } 487 } 488 489 for (Function &F : M) 490 Changed |= stripDebugInfo(F); 491 492 for (auto &GV : M.globals()) { 493 Changed |= GV.eraseMetadata(LLVMContext::MD_dbg); 494 } 495 496 if (GVMaterializer *Materializer = M.getMaterializer()) 497 Materializer->setStripDebugInfo(); 498 499 return Changed; 500 } 501 502 namespace { 503 504 /// Helper class to downgrade -g metadata to -gline-tables-only metadata. 505 class DebugTypeInfoRemoval { 506 DenseMap<Metadata *, Metadata *> Replacements; 507 508 public: 509 /// The (void)() type. 510 MDNode *EmptySubroutineType; 511 512 private: 513 /// Remember what linkage name we originally had before stripping. If we end 514 /// up making two subprograms identical who originally had different linkage 515 /// names, then we need to make one of them distinct, to avoid them getting 516 /// uniqued. Maps the new node to the old linkage name. 517 DenseMap<DISubprogram *, StringRef> NewToLinkageName; 518 519 // TODO: Remember the distinct subprogram we created for a given linkage name, 520 // so that we can continue to unique whenever possible. Map <newly created 521 // node, old linkage name> to the first (possibly distinct) mdsubprogram 522 // created for that combination. This is not strictly needed for correctness, 523 // but can cut down on the number of MDNodes and let us diff cleanly with the 524 // output of -gline-tables-only. 525 526 public: 527 DebugTypeInfoRemoval(LLVMContext &C) 528 : EmptySubroutineType(DISubroutineType::get(C, DINode::FlagZero, 0, 529 MDNode::get(C, {}))) {} 530 531 Metadata *map(Metadata *M) { 532 if (!M) 533 return nullptr; 534 auto Replacement = Replacements.find(M); 535 if (Replacement != Replacements.end()) 536 return Replacement->second; 537 538 return M; 539 } 540 MDNode *mapNode(Metadata *N) { return dyn_cast_or_null<MDNode>(map(N)); } 541 542 /// Recursively remap N and all its referenced children. Does a DF post-order 543 /// traversal, so as to remap bottoms up. 544 void traverseAndRemap(MDNode *N) { traverse(N); } 545 546 private: 547 // Create a new DISubprogram, to replace the one given. 548 DISubprogram *getReplacementSubprogram(DISubprogram *MDS) { 549 auto *FileAndScope = cast_or_null<DIFile>(map(MDS->getFile())); 550 StringRef LinkageName = MDS->getName().empty() ? MDS->getLinkageName() : ""; 551 DISubprogram *Declaration = nullptr; 552 auto *Type = cast_or_null<DISubroutineType>(map(MDS->getType())); 553 DIType *ContainingType = 554 cast_or_null<DIType>(map(MDS->getContainingType())); 555 auto *Unit = cast_or_null<DICompileUnit>(map(MDS->getUnit())); 556 auto Variables = nullptr; 557 auto TemplateParams = nullptr; 558 559 // Make a distinct DISubprogram, for situations that warrent it. 560 auto distinctMDSubprogram = [&]() { 561 return DISubprogram::getDistinct( 562 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName, 563 FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(), 564 ContainingType, MDS->getVirtualIndex(), MDS->getThisAdjustment(), 565 MDS->getFlags(), MDS->getSPFlags(), Unit, TemplateParams, Declaration, 566 Variables); 567 }; 568 569 if (MDS->isDistinct()) 570 return distinctMDSubprogram(); 571 572 auto *NewMDS = DISubprogram::get( 573 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName, 574 FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(), ContainingType, 575 MDS->getVirtualIndex(), MDS->getThisAdjustment(), MDS->getFlags(), 576 MDS->getSPFlags(), Unit, TemplateParams, Declaration, Variables); 577 578 StringRef OldLinkageName = MDS->getLinkageName(); 579 580 // See if we need to make a distinct one. 581 auto OrigLinkage = NewToLinkageName.find(NewMDS); 582 if (OrigLinkage != NewToLinkageName.end()) { 583 if (OrigLinkage->second == OldLinkageName) 584 // We're good. 585 return NewMDS; 586 587 // Otherwise, need to make a distinct one. 588 // TODO: Query the map to see if we already have one. 589 return distinctMDSubprogram(); 590 } 591 592 NewToLinkageName.insert({NewMDS, MDS->getLinkageName()}); 593 return NewMDS; 594 } 595 596 /// Create a new compile unit, to replace the one given 597 DICompileUnit *getReplacementCU(DICompileUnit *CU) { 598 // Drop skeleton CUs. 599 if (CU->getDWOId()) 600 return nullptr; 601 602 auto *File = cast_or_null<DIFile>(map(CU->getFile())); 603 MDTuple *EnumTypes = nullptr; 604 MDTuple *RetainedTypes = nullptr; 605 MDTuple *GlobalVariables = nullptr; 606 MDTuple *ImportedEntities = nullptr; 607 return DICompileUnit::getDistinct( 608 CU->getContext(), CU->getSourceLanguage(), File, CU->getProducer(), 609 CU->isOptimized(), CU->getFlags(), CU->getRuntimeVersion(), 610 CU->getSplitDebugFilename(), DICompileUnit::LineTablesOnly, EnumTypes, 611 RetainedTypes, GlobalVariables, ImportedEntities, CU->getMacros(), 612 CU->getDWOId(), CU->getSplitDebugInlining(), 613 CU->getDebugInfoForProfiling(), CU->getNameTableKind(), 614 CU->getRangesBaseAddress(), CU->getSysRoot(), CU->getSDK()); 615 } 616 617 DILocation *getReplacementMDLocation(DILocation *MLD) { 618 auto *Scope = map(MLD->getScope()); 619 auto *InlinedAt = map(MLD->getInlinedAt()); 620 if (MLD->isDistinct()) 621 return DILocation::getDistinct(MLD->getContext(), MLD->getLine(), 622 MLD->getColumn(), Scope, InlinedAt); 623 return DILocation::get(MLD->getContext(), MLD->getLine(), MLD->getColumn(), 624 Scope, InlinedAt); 625 } 626 627 /// Create a new generic MDNode, to replace the one given 628 MDNode *getReplacementMDNode(MDNode *N) { 629 SmallVector<Metadata *, 8> Ops; 630 Ops.reserve(N->getNumOperands()); 631 for (auto &I : N->operands()) 632 if (I) 633 Ops.push_back(map(I)); 634 auto *Ret = MDNode::get(N->getContext(), Ops); 635 return Ret; 636 } 637 638 /// Attempt to re-map N to a newly created node. 639 void remap(MDNode *N) { 640 if (Replacements.count(N)) 641 return; 642 643 auto doRemap = [&](MDNode *N) -> MDNode * { 644 if (!N) 645 return nullptr; 646 if (auto *MDSub = dyn_cast<DISubprogram>(N)) { 647 remap(MDSub->getUnit()); 648 return getReplacementSubprogram(MDSub); 649 } 650 if (isa<DISubroutineType>(N)) 651 return EmptySubroutineType; 652 if (auto *CU = dyn_cast<DICompileUnit>(N)) 653 return getReplacementCU(CU); 654 if (isa<DIFile>(N)) 655 return N; 656 if (auto *MDLB = dyn_cast<DILexicalBlockBase>(N)) 657 // Remap to our referenced scope (recursively). 658 return mapNode(MDLB->getScope()); 659 if (auto *MLD = dyn_cast<DILocation>(N)) 660 return getReplacementMDLocation(MLD); 661 662 // Otherwise, if we see these, just drop them now. Not strictly necessary, 663 // but this speeds things up a little. 664 if (isa<DINode>(N)) 665 return nullptr; 666 667 return getReplacementMDNode(N); 668 }; 669 Replacements[N] = doRemap(N); 670 } 671 672 /// Do the remapping traversal. 673 void traverse(MDNode *); 674 }; 675 676 } // end anonymous namespace 677 678 void DebugTypeInfoRemoval::traverse(MDNode *N) { 679 if (!N || Replacements.count(N)) 680 return; 681 682 // To avoid cycles, as well as for efficiency sake, we will sometimes prune 683 // parts of the graph. 684 auto prune = [](MDNode *Parent, MDNode *Child) { 685 if (auto *MDS = dyn_cast<DISubprogram>(Parent)) 686 return Child == MDS->getRetainedNodes().get(); 687 return false; 688 }; 689 690 SmallVector<MDNode *, 16> ToVisit; 691 DenseSet<MDNode *> Opened; 692 693 // Visit each node starting at N in post order, and map them. 694 ToVisit.push_back(N); 695 while (!ToVisit.empty()) { 696 auto *N = ToVisit.back(); 697 if (!Opened.insert(N).second) { 698 // Close it. 699 remap(N); 700 ToVisit.pop_back(); 701 continue; 702 } 703 for (auto &I : N->operands()) 704 if (auto *MDN = dyn_cast_or_null<MDNode>(I)) 705 if (!Opened.count(MDN) && !Replacements.count(MDN) && !prune(N, MDN) && 706 !isa<DICompileUnit>(MDN)) 707 ToVisit.push_back(MDN); 708 } 709 } 710 711 bool llvm::stripNonLineTableDebugInfo(Module &M) { 712 bool Changed = false; 713 714 // First off, delete the debug intrinsics. 715 auto RemoveUses = [&](StringRef Name) { 716 if (auto *DbgVal = M.getFunction(Name)) { 717 while (!DbgVal->use_empty()) 718 cast<Instruction>(DbgVal->user_back())->eraseFromParent(); 719 DbgVal->eraseFromParent(); 720 Changed = true; 721 } 722 }; 723 RemoveUses("llvm.dbg.addr"); 724 RemoveUses("llvm.dbg.declare"); 725 RemoveUses("llvm.dbg.label"); 726 RemoveUses("llvm.dbg.value"); 727 728 // Delete non-CU debug info named metadata nodes. 729 for (auto NMI = M.named_metadata_begin(), NME = M.named_metadata_end(); 730 NMI != NME;) { 731 NamedMDNode *NMD = &*NMI; 732 ++NMI; 733 // Specifically keep dbg.cu around. 734 if (NMD->getName() == "llvm.dbg.cu") 735 continue; 736 } 737 738 // Drop all dbg attachments from global variables. 739 for (auto &GV : M.globals()) 740 GV.eraseMetadata(LLVMContext::MD_dbg); 741 742 DebugTypeInfoRemoval Mapper(M.getContext()); 743 auto remap = [&](MDNode *Node) -> MDNode * { 744 if (!Node) 745 return nullptr; 746 Mapper.traverseAndRemap(Node); 747 auto *NewNode = Mapper.mapNode(Node); 748 Changed |= Node != NewNode; 749 Node = NewNode; 750 return NewNode; 751 }; 752 753 // Rewrite the DebugLocs to be equivalent to what 754 // -gline-tables-only would have created. 755 for (auto &F : M) { 756 if (auto *SP = F.getSubprogram()) { 757 Mapper.traverseAndRemap(SP); 758 auto *NewSP = cast<DISubprogram>(Mapper.mapNode(SP)); 759 Changed |= SP != NewSP; 760 F.setSubprogram(NewSP); 761 } 762 for (auto &BB : F) { 763 for (auto &I : BB) { 764 auto remapDebugLoc = [&](const DebugLoc &DL) -> DebugLoc { 765 auto *Scope = DL.getScope(); 766 MDNode *InlinedAt = DL.getInlinedAt(); 767 Scope = remap(Scope); 768 InlinedAt = remap(InlinedAt); 769 return DILocation::get(M.getContext(), DL.getLine(), DL.getCol(), 770 Scope, InlinedAt); 771 }; 772 773 if (I.getDebugLoc() != DebugLoc()) 774 I.setDebugLoc(remapDebugLoc(I.getDebugLoc())); 775 776 // Remap DILocations in llvm.loop attachments. 777 updateLoopMetadataDebugLocations(I, [&](Metadata *MD) -> Metadata * { 778 if (auto *Loc = dyn_cast_or_null<DILocation>(MD)) 779 return remapDebugLoc(Loc).get(); 780 return MD; 781 }); 782 783 // Strip heapallocsite attachments, they point into the DIType system. 784 if (I.hasMetadataOtherThanDebugLoc()) 785 I.setMetadata("heapallocsite", nullptr); 786 } 787 } 788 } 789 790 // Create a new llvm.dbg.cu, which is equivalent to the one 791 // -gline-tables-only would have created. 792 for (auto &NMD : M.getNamedMDList()) { 793 SmallVector<MDNode *, 8> Ops; 794 for (MDNode *Op : NMD.operands()) 795 Ops.push_back(remap(Op)); 796 797 if (!Changed) 798 continue; 799 800 NMD.clearOperands(); 801 for (auto *Op : Ops) 802 if (Op) 803 NMD.addOperand(Op); 804 } 805 return Changed; 806 } 807 808 unsigned llvm::getDebugMetadataVersionFromModule(const Module &M) { 809 if (auto *Val = mdconst::dyn_extract_or_null<ConstantInt>( 810 M.getModuleFlag("Debug Info Version"))) 811 return Val->getZExtValue(); 812 return 0; 813 } 814 815 void Instruction::applyMergedLocation(const DILocation *LocA, 816 const DILocation *LocB) { 817 setDebugLoc(DILocation::getMergedLocation(LocA, LocB)); 818 } 819 820 void Instruction::updateLocationAfterHoist() { dropLocation(); } 821 822 void Instruction::dropLocation() { 823 const DebugLoc &DL = getDebugLoc(); 824 if (!DL) 825 return; 826 827 // If this isn't a call, drop the location to allow a location from a 828 // preceding instruction to propagate. 829 if (!isa<CallBase>(this)) { 830 setDebugLoc(DebugLoc()); 831 return; 832 } 833 834 // Set a line 0 location for calls to preserve scope information in case 835 // inlining occurs. 836 DISubprogram *SP = getFunction()->getSubprogram(); 837 if (SP) 838 // If a function scope is available, set it on the line 0 location. When 839 // hoisting a call to a predecessor block, using the function scope avoids 840 // making it look like the callee was reached earlier than it should be. 841 setDebugLoc(DILocation::get(getContext(), 0, 0, SP)); 842 else 843 // The parent function has no scope. Go ahead and drop the location. If 844 // the parent function is inlined, and the callee has a subprogram, the 845 // inliner will attach a location to the call. 846 // 847 // One alternative is to set a line 0 location with the existing scope and 848 // inlinedAt info. The location might be sensitive to when inlining occurs. 849 setDebugLoc(DebugLoc()); 850 } 851 852 //===----------------------------------------------------------------------===// 853 // LLVM C API implementations. 854 //===----------------------------------------------------------------------===// 855 856 static unsigned map_from_llvmDWARFsourcelanguage(LLVMDWARFSourceLanguage lang) { 857 switch (lang) { 858 #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ 859 case LLVMDWARFSourceLanguage##NAME: \ 860 return ID; 861 #include "llvm/BinaryFormat/Dwarf.def" 862 #undef HANDLE_DW_LANG 863 } 864 llvm_unreachable("Unhandled Tag"); 865 } 866 867 template <typename DIT> DIT *unwrapDI(LLVMMetadataRef Ref) { 868 return (DIT *)(Ref ? unwrap<MDNode>(Ref) : nullptr); 869 } 870 871 static DINode::DIFlags map_from_llvmDIFlags(LLVMDIFlags Flags) { 872 return static_cast<DINode::DIFlags>(Flags); 873 } 874 875 static LLVMDIFlags map_to_llvmDIFlags(DINode::DIFlags Flags) { 876 return static_cast<LLVMDIFlags>(Flags); 877 } 878 879 static DISubprogram::DISPFlags 880 pack_into_DISPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized) { 881 return DISubprogram::toSPFlags(IsLocalToUnit, IsDefinition, IsOptimized); 882 } 883 884 unsigned LLVMDebugMetadataVersion() { 885 return DEBUG_METADATA_VERSION; 886 } 887 888 LLVMDIBuilderRef LLVMCreateDIBuilderDisallowUnresolved(LLVMModuleRef M) { 889 return wrap(new DIBuilder(*unwrap(M), false)); 890 } 891 892 LLVMDIBuilderRef LLVMCreateDIBuilder(LLVMModuleRef M) { 893 return wrap(new DIBuilder(*unwrap(M))); 894 } 895 896 unsigned LLVMGetModuleDebugMetadataVersion(LLVMModuleRef M) { 897 return getDebugMetadataVersionFromModule(*unwrap(M)); 898 } 899 900 LLVMBool LLVMStripModuleDebugInfo(LLVMModuleRef M) { 901 return StripDebugInfo(*unwrap(M)); 902 } 903 904 void LLVMDisposeDIBuilder(LLVMDIBuilderRef Builder) { 905 delete unwrap(Builder); 906 } 907 908 void LLVMDIBuilderFinalize(LLVMDIBuilderRef Builder) { 909 unwrap(Builder)->finalize(); 910 } 911 912 void LLVMDIBuilderFinalizeSubprogram(LLVMDIBuilderRef Builder, 913 LLVMMetadataRef subprogram) { 914 unwrap(Builder)->finalizeSubprogram(unwrapDI<DISubprogram>(subprogram)); 915 } 916 917 LLVMMetadataRef LLVMDIBuilderCreateCompileUnit( 918 LLVMDIBuilderRef Builder, LLVMDWARFSourceLanguage Lang, 919 LLVMMetadataRef FileRef, const char *Producer, size_t ProducerLen, 920 LLVMBool isOptimized, const char *Flags, size_t FlagsLen, 921 unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen, 922 LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining, 923 LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen, 924 const char *SDK, size_t SDKLen) { 925 auto File = unwrapDI<DIFile>(FileRef); 926 927 return wrap(unwrap(Builder)->createCompileUnit( 928 map_from_llvmDWARFsourcelanguage(Lang), File, 929 StringRef(Producer, ProducerLen), isOptimized, StringRef(Flags, FlagsLen), 930 RuntimeVer, StringRef(SplitName, SplitNameLen), 931 static_cast<DICompileUnit::DebugEmissionKind>(Kind), DWOId, 932 SplitDebugInlining, DebugInfoForProfiling, 933 DICompileUnit::DebugNameTableKind::Default, false, 934 StringRef(SysRoot, SysRootLen), StringRef(SDK, SDKLen))); 935 } 936 937 LLVMMetadataRef 938 LLVMDIBuilderCreateFile(LLVMDIBuilderRef Builder, const char *Filename, 939 size_t FilenameLen, const char *Directory, 940 size_t DirectoryLen) { 941 return wrap(unwrap(Builder)->createFile(StringRef(Filename, FilenameLen), 942 StringRef(Directory, DirectoryLen))); 943 } 944 945 LLVMMetadataRef 946 LLVMDIBuilderCreateModule(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope, 947 const char *Name, size_t NameLen, 948 const char *ConfigMacros, size_t ConfigMacrosLen, 949 const char *IncludePath, size_t IncludePathLen, 950 const char *APINotesFile, size_t APINotesFileLen) { 951 return wrap(unwrap(Builder)->createModule( 952 unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen), 953 StringRef(ConfigMacros, ConfigMacrosLen), 954 StringRef(IncludePath, IncludePathLen), 955 StringRef(APINotesFile, APINotesFileLen))); 956 } 957 958 LLVMMetadataRef LLVMDIBuilderCreateNameSpace(LLVMDIBuilderRef Builder, 959 LLVMMetadataRef ParentScope, 960 const char *Name, size_t NameLen, 961 LLVMBool ExportSymbols) { 962 return wrap(unwrap(Builder)->createNameSpace( 963 unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen), ExportSymbols)); 964 } 965 966 LLVMMetadataRef LLVMDIBuilderCreateFunction( 967 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, 968 size_t NameLen, const char *LinkageName, size_t LinkageNameLen, 969 LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, 970 LLVMBool IsLocalToUnit, LLVMBool IsDefinition, 971 unsigned ScopeLine, LLVMDIFlags Flags, LLVMBool IsOptimized) { 972 return wrap(unwrap(Builder)->createFunction( 973 unwrapDI<DIScope>(Scope), {Name, NameLen}, {LinkageName, LinkageNameLen}, 974 unwrapDI<DIFile>(File), LineNo, unwrapDI<DISubroutineType>(Ty), ScopeLine, 975 map_from_llvmDIFlags(Flags), 976 pack_into_DISPFlags(IsLocalToUnit, IsDefinition, IsOptimized), nullptr, 977 nullptr, nullptr)); 978 } 979 980 981 LLVMMetadataRef LLVMDIBuilderCreateLexicalBlock( 982 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, 983 LLVMMetadataRef File, unsigned Line, unsigned Col) { 984 return wrap(unwrap(Builder)->createLexicalBlock(unwrapDI<DIScope>(Scope), 985 unwrapDI<DIFile>(File), 986 Line, Col)); 987 } 988 989 LLVMMetadataRef 990 LLVMDIBuilderCreateLexicalBlockFile(LLVMDIBuilderRef Builder, 991 LLVMMetadataRef Scope, 992 LLVMMetadataRef File, 993 unsigned Discriminator) { 994 return wrap(unwrap(Builder)->createLexicalBlockFile(unwrapDI<DIScope>(Scope), 995 unwrapDI<DIFile>(File), 996 Discriminator)); 997 } 998 999 LLVMMetadataRef 1000 LLVMDIBuilderCreateImportedModuleFromNamespace(LLVMDIBuilderRef Builder, 1001 LLVMMetadataRef Scope, 1002 LLVMMetadataRef NS, 1003 LLVMMetadataRef File, 1004 unsigned Line) { 1005 return wrap(unwrap(Builder)->createImportedModule(unwrapDI<DIScope>(Scope), 1006 unwrapDI<DINamespace>(NS), 1007 unwrapDI<DIFile>(File), 1008 Line)); 1009 } 1010 1011 LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromAlias( 1012 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, 1013 LLVMMetadataRef ImportedEntity, LLVMMetadataRef File, unsigned Line, 1014 LLVMMetadataRef *Elements, unsigned NumElements) { 1015 auto Elts = 1016 (NumElements > 0) 1017 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements}) 1018 : nullptr; 1019 return wrap(unwrap(Builder)->createImportedModule( 1020 unwrapDI<DIScope>(Scope), unwrapDI<DIImportedEntity>(ImportedEntity), 1021 unwrapDI<DIFile>(File), Line, Elts)); 1022 } 1023 1024 LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromModule( 1025 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef M, 1026 LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements, 1027 unsigned NumElements) { 1028 auto Elts = 1029 (NumElements > 0) 1030 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements}) 1031 : nullptr; 1032 return wrap(unwrap(Builder)->createImportedModule( 1033 unwrapDI<DIScope>(Scope), unwrapDI<DIModule>(M), unwrapDI<DIFile>(File), 1034 Line, Elts)); 1035 } 1036 1037 LLVMMetadataRef LLVMDIBuilderCreateImportedDeclaration( 1038 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef Decl, 1039 LLVMMetadataRef File, unsigned Line, const char *Name, size_t NameLen, 1040 LLVMMetadataRef *Elements, unsigned NumElements) { 1041 auto Elts = 1042 (NumElements > 0) 1043 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements}) 1044 : nullptr; 1045 return wrap(unwrap(Builder)->createImportedDeclaration( 1046 unwrapDI<DIScope>(Scope), unwrapDI<DINode>(Decl), unwrapDI<DIFile>(File), 1047 Line, {Name, NameLen}, Elts)); 1048 } 1049 1050 LLVMMetadataRef 1051 LLVMDIBuilderCreateDebugLocation(LLVMContextRef Ctx, unsigned Line, 1052 unsigned Column, LLVMMetadataRef Scope, 1053 LLVMMetadataRef InlinedAt) { 1054 return wrap(DILocation::get(*unwrap(Ctx), Line, Column, unwrap(Scope), 1055 unwrap(InlinedAt))); 1056 } 1057 1058 unsigned LLVMDILocationGetLine(LLVMMetadataRef Location) { 1059 return unwrapDI<DILocation>(Location)->getLine(); 1060 } 1061 1062 unsigned LLVMDILocationGetColumn(LLVMMetadataRef Location) { 1063 return unwrapDI<DILocation>(Location)->getColumn(); 1064 } 1065 1066 LLVMMetadataRef LLVMDILocationGetScope(LLVMMetadataRef Location) { 1067 return wrap(unwrapDI<DILocation>(Location)->getScope()); 1068 } 1069 1070 LLVMMetadataRef LLVMDILocationGetInlinedAt(LLVMMetadataRef Location) { 1071 return wrap(unwrapDI<DILocation>(Location)->getInlinedAt()); 1072 } 1073 1074 LLVMMetadataRef LLVMDIScopeGetFile(LLVMMetadataRef Scope) { 1075 return wrap(unwrapDI<DIScope>(Scope)->getFile()); 1076 } 1077 1078 const char *LLVMDIFileGetDirectory(LLVMMetadataRef File, unsigned *Len) { 1079 auto Dir = unwrapDI<DIFile>(File)->getDirectory(); 1080 *Len = Dir.size(); 1081 return Dir.data(); 1082 } 1083 1084 const char *LLVMDIFileGetFilename(LLVMMetadataRef File, unsigned *Len) { 1085 auto Name = unwrapDI<DIFile>(File)->getFilename(); 1086 *Len = Name.size(); 1087 return Name.data(); 1088 } 1089 1090 const char *LLVMDIFileGetSource(LLVMMetadataRef File, unsigned *Len) { 1091 if (auto Src = unwrapDI<DIFile>(File)->getSource()) { 1092 *Len = Src->size(); 1093 return Src->data(); 1094 } 1095 *Len = 0; 1096 return ""; 1097 } 1098 1099 LLVMMetadataRef LLVMDIBuilderCreateMacro(LLVMDIBuilderRef Builder, 1100 LLVMMetadataRef ParentMacroFile, 1101 unsigned Line, 1102 LLVMDWARFMacinfoRecordType RecordType, 1103 const char *Name, size_t NameLen, 1104 const char *Value, size_t ValueLen) { 1105 return wrap( 1106 unwrap(Builder)->createMacro(unwrapDI<DIMacroFile>(ParentMacroFile), Line, 1107 static_cast<MacinfoRecordType>(RecordType), 1108 {Name, NameLen}, {Value, ValueLen})); 1109 } 1110 1111 LLVMMetadataRef 1112 LLVMDIBuilderCreateTempMacroFile(LLVMDIBuilderRef Builder, 1113 LLVMMetadataRef ParentMacroFile, unsigned Line, 1114 LLVMMetadataRef File) { 1115 return wrap(unwrap(Builder)->createTempMacroFile( 1116 unwrapDI<DIMacroFile>(ParentMacroFile), Line, unwrapDI<DIFile>(File))); 1117 } 1118 1119 LLVMMetadataRef LLVMDIBuilderCreateEnumerator(LLVMDIBuilderRef Builder, 1120 const char *Name, size_t NameLen, 1121 int64_t Value, 1122 LLVMBool IsUnsigned) { 1123 return wrap(unwrap(Builder)->createEnumerator({Name, NameLen}, Value, 1124 IsUnsigned != 0)); 1125 } 1126 1127 LLVMMetadataRef LLVMDIBuilderCreateEnumerationType( 1128 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, 1129 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, 1130 uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef *Elements, 1131 unsigned NumElements, LLVMMetadataRef ClassTy) { 1132 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements), 1133 NumElements}); 1134 return wrap(unwrap(Builder)->createEnumerationType( 1135 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File), 1136 LineNumber, SizeInBits, AlignInBits, Elts, unwrapDI<DIType>(ClassTy))); 1137 } 1138 1139 LLVMMetadataRef LLVMDIBuilderCreateUnionType( 1140 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, 1141 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, 1142 uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, 1143 LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang, 1144 const char *UniqueId, size_t UniqueIdLen) { 1145 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements), 1146 NumElements}); 1147 return wrap(unwrap(Builder)->createUnionType( 1148 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File), 1149 LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags), 1150 Elts, RunTimeLang, {UniqueId, UniqueIdLen})); 1151 } 1152 1153 1154 LLVMMetadataRef 1155 LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef Builder, uint64_t Size, 1156 uint32_t AlignInBits, LLVMMetadataRef Ty, 1157 LLVMMetadataRef *Subscripts, 1158 unsigned NumSubscripts) { 1159 auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts), 1160 NumSubscripts}); 1161 return wrap(unwrap(Builder)->createArrayType(Size, AlignInBits, 1162 unwrapDI<DIType>(Ty), Subs)); 1163 } 1164 1165 LLVMMetadataRef 1166 LLVMDIBuilderCreateVectorType(LLVMDIBuilderRef Builder, uint64_t Size, 1167 uint32_t AlignInBits, LLVMMetadataRef Ty, 1168 LLVMMetadataRef *Subscripts, 1169 unsigned NumSubscripts) { 1170 auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts), 1171 NumSubscripts}); 1172 return wrap(unwrap(Builder)->createVectorType(Size, AlignInBits, 1173 unwrapDI<DIType>(Ty), Subs)); 1174 } 1175 1176 LLVMMetadataRef 1177 LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Builder, const char *Name, 1178 size_t NameLen, uint64_t SizeInBits, 1179 LLVMDWARFTypeEncoding Encoding, 1180 LLVMDIFlags Flags) { 1181 return wrap(unwrap(Builder)->createBasicType({Name, NameLen}, 1182 SizeInBits, Encoding, 1183 map_from_llvmDIFlags(Flags))); 1184 } 1185 1186 LLVMMetadataRef LLVMDIBuilderCreatePointerType( 1187 LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy, 1188 uint64_t SizeInBits, uint32_t AlignInBits, unsigned AddressSpace, 1189 const char *Name, size_t NameLen) { 1190 return wrap(unwrap(Builder)->createPointerType(unwrapDI<DIType>(PointeeTy), 1191 SizeInBits, AlignInBits, 1192 AddressSpace, {Name, NameLen})); 1193 } 1194 1195 LLVMMetadataRef LLVMDIBuilderCreateStructType( 1196 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, 1197 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, 1198 uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, 1199 LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements, 1200 unsigned NumElements, unsigned RunTimeLang, LLVMMetadataRef VTableHolder, 1201 const char *UniqueId, size_t UniqueIdLen) { 1202 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements), 1203 NumElements}); 1204 return wrap(unwrap(Builder)->createStructType( 1205 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File), 1206 LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags), 1207 unwrapDI<DIType>(DerivedFrom), Elts, RunTimeLang, 1208 unwrapDI<DIType>(VTableHolder), {UniqueId, UniqueIdLen})); 1209 } 1210 1211 LLVMMetadataRef LLVMDIBuilderCreateMemberType( 1212 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, 1213 size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits, 1214 uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, 1215 LLVMMetadataRef Ty) { 1216 return wrap(unwrap(Builder)->createMemberType(unwrapDI<DIScope>(Scope), 1217 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, SizeInBits, AlignInBits, 1218 OffsetInBits, map_from_llvmDIFlags(Flags), unwrapDI<DIType>(Ty))); 1219 } 1220 1221 LLVMMetadataRef 1222 LLVMDIBuilderCreateUnspecifiedType(LLVMDIBuilderRef Builder, const char *Name, 1223 size_t NameLen) { 1224 return wrap(unwrap(Builder)->createUnspecifiedType({Name, NameLen})); 1225 } 1226 1227 LLVMMetadataRef 1228 LLVMDIBuilderCreateStaticMemberType( 1229 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, 1230 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, 1231 LLVMMetadataRef Type, LLVMDIFlags Flags, LLVMValueRef ConstantVal, 1232 uint32_t AlignInBits) { 1233 return wrap(unwrap(Builder)->createStaticMemberType( 1234 unwrapDI<DIScope>(Scope), {Name, NameLen}, 1235 unwrapDI<DIFile>(File), LineNumber, unwrapDI<DIType>(Type), 1236 map_from_llvmDIFlags(Flags), unwrap<Constant>(ConstantVal), 1237 AlignInBits)); 1238 } 1239 1240 LLVMMetadataRef 1241 LLVMDIBuilderCreateObjCIVar(LLVMDIBuilderRef Builder, 1242 const char *Name, size_t NameLen, 1243 LLVMMetadataRef File, unsigned LineNo, 1244 uint64_t SizeInBits, uint32_t AlignInBits, 1245 uint64_t OffsetInBits, LLVMDIFlags Flags, 1246 LLVMMetadataRef Ty, LLVMMetadataRef PropertyNode) { 1247 return wrap(unwrap(Builder)->createObjCIVar( 1248 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, 1249 SizeInBits, AlignInBits, OffsetInBits, 1250 map_from_llvmDIFlags(Flags), unwrapDI<DIType>(Ty), 1251 unwrapDI<MDNode>(PropertyNode))); 1252 } 1253 1254 LLVMMetadataRef 1255 LLVMDIBuilderCreateObjCProperty(LLVMDIBuilderRef Builder, 1256 const char *Name, size_t NameLen, 1257 LLVMMetadataRef File, unsigned LineNo, 1258 const char *GetterName, size_t GetterNameLen, 1259 const char *SetterName, size_t SetterNameLen, 1260 unsigned PropertyAttributes, 1261 LLVMMetadataRef Ty) { 1262 return wrap(unwrap(Builder)->createObjCProperty( 1263 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, 1264 {GetterName, GetterNameLen}, {SetterName, SetterNameLen}, 1265 PropertyAttributes, unwrapDI<DIType>(Ty))); 1266 } 1267 1268 LLVMMetadataRef 1269 LLVMDIBuilderCreateObjectPointerType(LLVMDIBuilderRef Builder, 1270 LLVMMetadataRef Type) { 1271 return wrap(unwrap(Builder)->createObjectPointerType(unwrapDI<DIType>(Type))); 1272 } 1273 1274 LLVMMetadataRef 1275 LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Builder, LLVMMetadataRef Type, 1276 const char *Name, size_t NameLen, 1277 LLVMMetadataRef File, unsigned LineNo, 1278 LLVMMetadataRef Scope, uint32_t AlignInBits) { 1279 return wrap(unwrap(Builder)->createTypedef( 1280 unwrapDI<DIType>(Type), {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, 1281 unwrapDI<DIScope>(Scope), AlignInBits)); 1282 } 1283 1284 LLVMMetadataRef 1285 LLVMDIBuilderCreateInheritance(LLVMDIBuilderRef Builder, 1286 LLVMMetadataRef Ty, LLVMMetadataRef BaseTy, 1287 uint64_t BaseOffset, uint32_t VBPtrOffset, 1288 LLVMDIFlags Flags) { 1289 return wrap(unwrap(Builder)->createInheritance( 1290 unwrapDI<DIType>(Ty), unwrapDI<DIType>(BaseTy), 1291 BaseOffset, VBPtrOffset, map_from_llvmDIFlags(Flags))); 1292 } 1293 1294 LLVMMetadataRef 1295 LLVMDIBuilderCreateForwardDecl( 1296 LLVMDIBuilderRef Builder, unsigned Tag, const char *Name, 1297 size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, 1298 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits, 1299 const char *UniqueIdentifier, size_t UniqueIdentifierLen) { 1300 return wrap(unwrap(Builder)->createForwardDecl( 1301 Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope), 1302 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits, 1303 AlignInBits, {UniqueIdentifier, UniqueIdentifierLen})); 1304 } 1305 1306 LLVMMetadataRef 1307 LLVMDIBuilderCreateReplaceableCompositeType( 1308 LLVMDIBuilderRef Builder, unsigned Tag, const char *Name, 1309 size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, 1310 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits, 1311 LLVMDIFlags Flags, const char *UniqueIdentifier, 1312 size_t UniqueIdentifierLen) { 1313 return wrap(unwrap(Builder)->createReplaceableCompositeType( 1314 Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope), 1315 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits, 1316 AlignInBits, map_from_llvmDIFlags(Flags), 1317 {UniqueIdentifier, UniqueIdentifierLen})); 1318 } 1319 1320 LLVMMetadataRef 1321 LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef Builder, unsigned Tag, 1322 LLVMMetadataRef Type) { 1323 return wrap(unwrap(Builder)->createQualifiedType(Tag, 1324 unwrapDI<DIType>(Type))); 1325 } 1326 1327 LLVMMetadataRef 1328 LLVMDIBuilderCreateReferenceType(LLVMDIBuilderRef Builder, unsigned Tag, 1329 LLVMMetadataRef Type) { 1330 return wrap(unwrap(Builder)->createReferenceType(Tag, 1331 unwrapDI<DIType>(Type))); 1332 } 1333 1334 LLVMMetadataRef 1335 LLVMDIBuilderCreateNullPtrType(LLVMDIBuilderRef Builder) { 1336 return wrap(unwrap(Builder)->createNullPtrType()); 1337 } 1338 1339 LLVMMetadataRef 1340 LLVMDIBuilderCreateMemberPointerType(LLVMDIBuilderRef Builder, 1341 LLVMMetadataRef PointeeType, 1342 LLVMMetadataRef ClassType, 1343 uint64_t SizeInBits, 1344 uint32_t AlignInBits, 1345 LLVMDIFlags Flags) { 1346 return wrap(unwrap(Builder)->createMemberPointerType( 1347 unwrapDI<DIType>(PointeeType), 1348 unwrapDI<DIType>(ClassType), AlignInBits, SizeInBits, 1349 map_from_llvmDIFlags(Flags))); 1350 } 1351 1352 LLVMMetadataRef 1353 LLVMDIBuilderCreateBitFieldMemberType(LLVMDIBuilderRef Builder, 1354 LLVMMetadataRef Scope, 1355 const char *Name, size_t NameLen, 1356 LLVMMetadataRef File, unsigned LineNumber, 1357 uint64_t SizeInBits, 1358 uint64_t OffsetInBits, 1359 uint64_t StorageOffsetInBits, 1360 LLVMDIFlags Flags, LLVMMetadataRef Type) { 1361 return wrap(unwrap(Builder)->createBitFieldMemberType( 1362 unwrapDI<DIScope>(Scope), {Name, NameLen}, 1363 unwrapDI<DIFile>(File), LineNumber, 1364 SizeInBits, OffsetInBits, StorageOffsetInBits, 1365 map_from_llvmDIFlags(Flags), unwrapDI<DIType>(Type))); 1366 } 1367 1368 LLVMMetadataRef LLVMDIBuilderCreateClassType(LLVMDIBuilderRef Builder, 1369 LLVMMetadataRef Scope, const char *Name, size_t NameLen, 1370 LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, 1371 uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, 1372 LLVMMetadataRef DerivedFrom, 1373 LLVMMetadataRef *Elements, unsigned NumElements, 1374 LLVMMetadataRef VTableHolder, LLVMMetadataRef TemplateParamsNode, 1375 const char *UniqueIdentifier, size_t UniqueIdentifierLen) { 1376 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements), 1377 NumElements}); 1378 return wrap(unwrap(Builder)->createClassType( 1379 unwrapDI<DIScope>(Scope), {Name, NameLen}, 1380 unwrapDI<DIFile>(File), LineNumber, 1381 SizeInBits, AlignInBits, OffsetInBits, 1382 map_from_llvmDIFlags(Flags), unwrapDI<DIType>(DerivedFrom), 1383 Elts, unwrapDI<DIType>(VTableHolder), 1384 unwrapDI<MDNode>(TemplateParamsNode), 1385 {UniqueIdentifier, UniqueIdentifierLen})); 1386 } 1387 1388 LLVMMetadataRef 1389 LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef Builder, 1390 LLVMMetadataRef Type) { 1391 return wrap(unwrap(Builder)->createArtificialType(unwrapDI<DIType>(Type))); 1392 } 1393 1394 const char *LLVMDITypeGetName(LLVMMetadataRef DType, size_t *Length) { 1395 StringRef Str = unwrap<DIType>(DType)->getName(); 1396 *Length = Str.size(); 1397 return Str.data(); 1398 } 1399 1400 uint64_t LLVMDITypeGetSizeInBits(LLVMMetadataRef DType) { 1401 return unwrapDI<DIType>(DType)->getSizeInBits(); 1402 } 1403 1404 uint64_t LLVMDITypeGetOffsetInBits(LLVMMetadataRef DType) { 1405 return unwrapDI<DIType>(DType)->getOffsetInBits(); 1406 } 1407 1408 uint32_t LLVMDITypeGetAlignInBits(LLVMMetadataRef DType) { 1409 return unwrapDI<DIType>(DType)->getAlignInBits(); 1410 } 1411 1412 unsigned LLVMDITypeGetLine(LLVMMetadataRef DType) { 1413 return unwrapDI<DIType>(DType)->getLine(); 1414 } 1415 1416 LLVMDIFlags LLVMDITypeGetFlags(LLVMMetadataRef DType) { 1417 return map_to_llvmDIFlags(unwrapDI<DIType>(DType)->getFlags()); 1418 } 1419 1420 LLVMMetadataRef LLVMDIBuilderGetOrCreateTypeArray(LLVMDIBuilderRef Builder, 1421 LLVMMetadataRef *Types, 1422 size_t Length) { 1423 return wrap( 1424 unwrap(Builder)->getOrCreateTypeArray({unwrap(Types), Length}).get()); 1425 } 1426 1427 LLVMMetadataRef 1428 LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Builder, 1429 LLVMMetadataRef File, 1430 LLVMMetadataRef *ParameterTypes, 1431 unsigned NumParameterTypes, 1432 LLVMDIFlags Flags) { 1433 auto Elts = unwrap(Builder)->getOrCreateTypeArray({unwrap(ParameterTypes), 1434 NumParameterTypes}); 1435 return wrap(unwrap(Builder)->createSubroutineType( 1436 Elts, map_from_llvmDIFlags(Flags))); 1437 } 1438 1439 LLVMMetadataRef LLVMDIBuilderCreateExpression(LLVMDIBuilderRef Builder, 1440 int64_t *Addr, size_t Length) { 1441 return wrap(unwrap(Builder)->createExpression(ArrayRef<int64_t>(Addr, 1442 Length))); 1443 } 1444 1445 LLVMMetadataRef 1446 LLVMDIBuilderCreateConstantValueExpression(LLVMDIBuilderRef Builder, 1447 int64_t Value) { 1448 return wrap(unwrap(Builder)->createConstantValueExpression(Value)); 1449 } 1450 1451 LLVMMetadataRef LLVMDIBuilderCreateGlobalVariableExpression( 1452 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, 1453 size_t NameLen, const char *Linkage, size_t LinkLen, LLVMMetadataRef File, 1454 unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit, 1455 LLVMMetadataRef Expr, LLVMMetadataRef Decl, uint32_t AlignInBits) { 1456 return wrap(unwrap(Builder)->createGlobalVariableExpression( 1457 unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LinkLen}, 1458 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit, 1459 true, unwrap<DIExpression>(Expr), unwrapDI<MDNode>(Decl), 1460 nullptr, AlignInBits)); 1461 } 1462 1463 LLVMMetadataRef LLVMDIGlobalVariableExpressionGetVariable(LLVMMetadataRef GVE) { 1464 return wrap(unwrapDI<DIGlobalVariableExpression>(GVE)->getVariable()); 1465 } 1466 1467 LLVMMetadataRef LLVMDIGlobalVariableExpressionGetExpression( 1468 LLVMMetadataRef GVE) { 1469 return wrap(unwrapDI<DIGlobalVariableExpression>(GVE)->getExpression()); 1470 } 1471 1472 LLVMMetadataRef LLVMDIVariableGetFile(LLVMMetadataRef Var) { 1473 return wrap(unwrapDI<DIVariable>(Var)->getFile()); 1474 } 1475 1476 LLVMMetadataRef LLVMDIVariableGetScope(LLVMMetadataRef Var) { 1477 return wrap(unwrapDI<DIVariable>(Var)->getScope()); 1478 } 1479 1480 unsigned LLVMDIVariableGetLine(LLVMMetadataRef Var) { 1481 return unwrapDI<DIVariable>(Var)->getLine(); 1482 } 1483 1484 LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef Ctx, LLVMMetadataRef *Data, 1485 size_t Count) { 1486 return wrap( 1487 MDTuple::getTemporary(*unwrap(Ctx), {unwrap(Data), Count}).release()); 1488 } 1489 1490 void LLVMDisposeTemporaryMDNode(LLVMMetadataRef TempNode) { 1491 MDNode::deleteTemporary(unwrapDI<MDNode>(TempNode)); 1492 } 1493 1494 void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef TargetMetadata, 1495 LLVMMetadataRef Replacement) { 1496 auto *Node = unwrapDI<MDNode>(TargetMetadata); 1497 Node->replaceAllUsesWith(unwrap<Metadata>(Replacement)); 1498 MDNode::deleteTemporary(Node); 1499 } 1500 1501 LLVMMetadataRef LLVMDIBuilderCreateTempGlobalVariableFwdDecl( 1502 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, 1503 size_t NameLen, const char *Linkage, size_t LnkLen, LLVMMetadataRef File, 1504 unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit, 1505 LLVMMetadataRef Decl, uint32_t AlignInBits) { 1506 return wrap(unwrap(Builder)->createTempGlobalVariableFwdDecl( 1507 unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LnkLen}, 1508 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit, 1509 unwrapDI<MDNode>(Decl), nullptr, AlignInBits)); 1510 } 1511 1512 LLVMValueRef 1513 LLVMDIBuilderInsertDeclareBefore(LLVMDIBuilderRef Builder, LLVMValueRef Storage, 1514 LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, 1515 LLVMMetadataRef DL, LLVMValueRef Instr) { 1516 return wrap(unwrap(Builder)->insertDeclare( 1517 unwrap(Storage), unwrap<DILocalVariable>(VarInfo), 1518 unwrap<DIExpression>(Expr), unwrap<DILocation>(DL), 1519 unwrap<Instruction>(Instr))); 1520 } 1521 1522 LLVMValueRef LLVMDIBuilderInsertDeclareAtEnd( 1523 LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo, 1524 LLVMMetadataRef Expr, LLVMMetadataRef DL, LLVMBasicBlockRef Block) { 1525 return wrap(unwrap(Builder)->insertDeclare( 1526 unwrap(Storage), unwrap<DILocalVariable>(VarInfo), 1527 unwrap<DIExpression>(Expr), unwrap<DILocation>(DL), 1528 unwrap(Block))); 1529 } 1530 1531 LLVMValueRef LLVMDIBuilderInsertDbgValueBefore(LLVMDIBuilderRef Builder, 1532 LLVMValueRef Val, 1533 LLVMMetadataRef VarInfo, 1534 LLVMMetadataRef Expr, 1535 LLVMMetadataRef DebugLoc, 1536 LLVMValueRef Instr) { 1537 return wrap(unwrap(Builder)->insertDbgValueIntrinsic( 1538 unwrap(Val), unwrap<DILocalVariable>(VarInfo), 1539 unwrap<DIExpression>(Expr), unwrap<DILocation>(DebugLoc), 1540 unwrap<Instruction>(Instr))); 1541 } 1542 1543 LLVMValueRef LLVMDIBuilderInsertDbgValueAtEnd(LLVMDIBuilderRef Builder, 1544 LLVMValueRef Val, 1545 LLVMMetadataRef VarInfo, 1546 LLVMMetadataRef Expr, 1547 LLVMMetadataRef DebugLoc, 1548 LLVMBasicBlockRef Block) { 1549 return wrap(unwrap(Builder)->insertDbgValueIntrinsic( 1550 unwrap(Val), unwrap<DILocalVariable>(VarInfo), 1551 unwrap<DIExpression>(Expr), unwrap<DILocation>(DebugLoc), 1552 unwrap(Block))); 1553 } 1554 1555 LLVMMetadataRef LLVMDIBuilderCreateAutoVariable( 1556 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, 1557 size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, 1558 LLVMBool AlwaysPreserve, LLVMDIFlags Flags, uint32_t AlignInBits) { 1559 return wrap(unwrap(Builder)->createAutoVariable( 1560 unwrap<DIScope>(Scope), {Name, NameLen}, unwrap<DIFile>(File), 1561 LineNo, unwrap<DIType>(Ty), AlwaysPreserve, 1562 map_from_llvmDIFlags(Flags), AlignInBits)); 1563 } 1564 1565 LLVMMetadataRef LLVMDIBuilderCreateParameterVariable( 1566 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, 1567 size_t NameLen, unsigned ArgNo, LLVMMetadataRef File, unsigned LineNo, 1568 LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags) { 1569 return wrap(unwrap(Builder)->createParameterVariable( 1570 unwrap<DIScope>(Scope), {Name, NameLen}, ArgNo, unwrap<DIFile>(File), 1571 LineNo, unwrap<DIType>(Ty), AlwaysPreserve, 1572 map_from_llvmDIFlags(Flags))); 1573 } 1574 1575 LLVMMetadataRef LLVMDIBuilderGetOrCreateSubrange(LLVMDIBuilderRef Builder, 1576 int64_t Lo, int64_t Count) { 1577 return wrap(unwrap(Builder)->getOrCreateSubrange(Lo, Count)); 1578 } 1579 1580 LLVMMetadataRef LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef Builder, 1581 LLVMMetadataRef *Data, 1582 size_t Length) { 1583 Metadata **DataValue = unwrap(Data); 1584 return wrap(unwrap(Builder)->getOrCreateArray({DataValue, Length}).get()); 1585 } 1586 1587 LLVMMetadataRef LLVMGetSubprogram(LLVMValueRef Func) { 1588 return wrap(unwrap<Function>(Func)->getSubprogram()); 1589 } 1590 1591 void LLVMSetSubprogram(LLVMValueRef Func, LLVMMetadataRef SP) { 1592 unwrap<Function>(Func)->setSubprogram(unwrap<DISubprogram>(SP)); 1593 } 1594 1595 unsigned LLVMDISubprogramGetLine(LLVMMetadataRef Subprogram) { 1596 return unwrapDI<DISubprogram>(Subprogram)->getLine(); 1597 } 1598 1599 LLVMMetadataRef LLVMInstructionGetDebugLoc(LLVMValueRef Inst) { 1600 return wrap(unwrap<Instruction>(Inst)->getDebugLoc().getAsMDNode()); 1601 } 1602 1603 void LLVMInstructionSetDebugLoc(LLVMValueRef Inst, LLVMMetadataRef Loc) { 1604 if (Loc) 1605 unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc(unwrap<MDNode>(Loc))); 1606 else 1607 unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc()); 1608 } 1609 1610 LLVMMetadataKind LLVMGetMetadataKind(LLVMMetadataRef Metadata) { 1611 switch(unwrap(Metadata)->getMetadataID()) { 1612 #define HANDLE_METADATA_LEAF(CLASS) \ 1613 case Metadata::CLASS##Kind: \ 1614 return (LLVMMetadataKind)LLVM##CLASS##MetadataKind; 1615 #include "llvm/IR/Metadata.def" 1616 default: 1617 return (LLVMMetadataKind)LLVMGenericDINodeMetadataKind; 1618 } 1619 } 1620