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 "LLVMContextImpl.h"
16 #include "llvm/ADT/APSInt.h"
17 #include "llvm/ADT/DenseMap.h"
18 #include "llvm/ADT/DenseSet.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/ADT/SmallPtrSet.h"
21 #include "llvm/ADT/SmallVector.h"
22 #include "llvm/ADT/StringRef.h"
23 #include "llvm/IR/BasicBlock.h"
24 #include "llvm/IR/Constants.h"
25 #include "llvm/IR/DIBuilder.h"
26 #include "llvm/IR/DebugInfo.h"
27 #include "llvm/IR/DebugInfoMetadata.h"
28 #include "llvm/IR/DebugLoc.h"
29 #include "llvm/IR/DebugProgramInstruction.h"
30 #include "llvm/IR/Function.h"
31 #include "llvm/IR/GVMaterializer.h"
32 #include "llvm/IR/Instruction.h"
33 #include "llvm/IR/IntrinsicInst.h"
34 #include "llvm/IR/LLVMContext.h"
35 #include "llvm/IR/Metadata.h"
36 #include "llvm/IR/Module.h"
37 #include "llvm/IR/PassManager.h"
38 #include "llvm/Support/Casting.h"
39 #include <algorithm>
40 #include <cassert>
41 #include <optional>
42 #include <utility>
43
44 using namespace llvm;
45 using namespace llvm::at;
46 using namespace llvm::dwarf;
47
findDbgDeclares(Value * V)48 TinyPtrVector<DbgDeclareInst *> llvm::findDbgDeclares(Value *V) {
49 // This function is hot. Check whether the value has any metadata to avoid a
50 // DenseMap lookup. This check is a bitfield datamember lookup.
51 if (!V->isUsedByMetadata())
52 return {};
53 auto *L = ValueAsMetadata::getIfExists(V);
54 if (!L)
55 return {};
56 auto *MDV = MetadataAsValue::getIfExists(V->getContext(), L);
57 if (!MDV)
58 return {};
59
60 TinyPtrVector<DbgDeclareInst *> Declares;
61 for (User *U : MDV->users())
62 if (auto *DDI = dyn_cast<DbgDeclareInst>(U))
63 Declares.push_back(DDI);
64
65 return Declares;
66 }
findDVRDeclares(Value * V)67 TinyPtrVector<DbgVariableRecord *> llvm::findDVRDeclares(Value *V) {
68 // This function is hot. Check whether the value has any metadata to avoid a
69 // DenseMap lookup. This check is a bitfield datamember lookup.
70 if (!V->isUsedByMetadata())
71 return {};
72 auto *L = ValueAsMetadata::getIfExists(V);
73 if (!L)
74 return {};
75
76 TinyPtrVector<DbgVariableRecord *> Declares;
77 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers())
78 if (DVR->getType() == DbgVariableRecord::LocationType::Declare)
79 Declares.push_back(DVR);
80
81 return Declares;
82 }
83
findDVRValues(Value * V)84 TinyPtrVector<DbgVariableRecord *> llvm::findDVRValues(Value *V) {
85 // This function is hot. Check whether the value has any metadata to avoid a
86 // DenseMap lookup. This check is a bitfield datamember lookup.
87 if (!V->isUsedByMetadata())
88 return {};
89 auto *L = ValueAsMetadata::getIfExists(V);
90 if (!L)
91 return {};
92
93 TinyPtrVector<DbgVariableRecord *> Values;
94 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers())
95 if (DVR->isValueOfVariable())
96 Values.push_back(DVR);
97
98 return Values;
99 }
100
101 template <typename IntrinsicT, bool DbgAssignAndValuesOnly>
102 static void
findDbgIntrinsics(SmallVectorImpl<IntrinsicT * > & Result,Value * V,SmallVectorImpl<DbgVariableRecord * > * DbgVariableRecords)103 findDbgIntrinsics(SmallVectorImpl<IntrinsicT *> &Result, Value *V,
104 SmallVectorImpl<DbgVariableRecord *> *DbgVariableRecords) {
105 // This function is hot. Check whether the value has any metadata to avoid a
106 // DenseMap lookup.
107 if (!V->isUsedByMetadata())
108 return;
109
110 LLVMContext &Ctx = V->getContext();
111 // TODO: If this value appears multiple times in a DIArgList, we should still
112 // only add the owning DbgValueInst once; use this set to track ArgListUsers.
113 // This behaviour can be removed when we can automatically remove duplicates.
114 // V will also appear twice in a dbg.assign if its used in the both the value
115 // and address components.
116 SmallPtrSet<IntrinsicT *, 4> EncounteredIntrinsics;
117 SmallPtrSet<DbgVariableRecord *, 4> EncounteredDbgVariableRecords;
118
119 /// Append IntrinsicT users of MetadataAsValue(MD).
120 auto AppendUsers = [&Ctx, &EncounteredIntrinsics,
121 &EncounteredDbgVariableRecords, &Result,
122 DbgVariableRecords](Metadata *MD) {
123 if (auto *MDV = MetadataAsValue::getIfExists(Ctx, MD)) {
124 for (User *U : MDV->users())
125 if (IntrinsicT *DVI = dyn_cast<IntrinsicT>(U))
126 if (EncounteredIntrinsics.insert(DVI).second)
127 Result.push_back(DVI);
128 }
129 if (!DbgVariableRecords)
130 return;
131 // Get DbgVariableRecords that use this as a single value.
132 if (LocalAsMetadata *L = dyn_cast<LocalAsMetadata>(MD)) {
133 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers()) {
134 if (!DbgAssignAndValuesOnly || DVR->isDbgValue() || DVR->isDbgAssign())
135 if (EncounteredDbgVariableRecords.insert(DVR).second)
136 DbgVariableRecords->push_back(DVR);
137 }
138 }
139 };
140
141 if (auto *L = LocalAsMetadata::getIfExists(V)) {
142 AppendUsers(L);
143 for (Metadata *AL : L->getAllArgListUsers()) {
144 AppendUsers(AL);
145 if (!DbgVariableRecords)
146 continue;
147 DIArgList *DI = cast<DIArgList>(AL);
148 for (DbgVariableRecord *DVR : DI->getAllDbgVariableRecordUsers())
149 if (!DbgAssignAndValuesOnly || DVR->isDbgValue() || DVR->isDbgAssign())
150 if (EncounteredDbgVariableRecords.insert(DVR).second)
151 DbgVariableRecords->push_back(DVR);
152 }
153 }
154 }
155
findDbgValues(SmallVectorImpl<DbgValueInst * > & DbgValues,Value * V,SmallVectorImpl<DbgVariableRecord * > * DbgVariableRecords)156 void llvm::findDbgValues(
157 SmallVectorImpl<DbgValueInst *> &DbgValues, Value *V,
158 SmallVectorImpl<DbgVariableRecord *> *DbgVariableRecords) {
159 findDbgIntrinsics<DbgValueInst, /*DbgAssignAndValuesOnly=*/true>(
160 DbgValues, V, DbgVariableRecords);
161 }
162
findDbgUsers(SmallVectorImpl<DbgVariableIntrinsic * > & DbgUsers,Value * V,SmallVectorImpl<DbgVariableRecord * > * DbgVariableRecords)163 void llvm::findDbgUsers(
164 SmallVectorImpl<DbgVariableIntrinsic *> &DbgUsers, Value *V,
165 SmallVectorImpl<DbgVariableRecord *> *DbgVariableRecords) {
166 findDbgIntrinsics<DbgVariableIntrinsic, /*DbgAssignAndValuesOnly=*/false>(
167 DbgUsers, V, DbgVariableRecords);
168 }
169
getDISubprogram(const MDNode * Scope)170 DISubprogram *llvm::getDISubprogram(const MDNode *Scope) {
171 if (auto *LocalScope = dyn_cast_or_null<DILocalScope>(Scope))
172 return LocalScope->getSubprogram();
173 return nullptr;
174 }
175
getDebugValueLoc(DbgVariableIntrinsic * DII)176 DebugLoc llvm::getDebugValueLoc(DbgVariableIntrinsic *DII) {
177 // Original dbg.declare must have a location.
178 const DebugLoc &DeclareLoc = DII->getDebugLoc();
179 MDNode *Scope = DeclareLoc.getScope();
180 DILocation *InlinedAt = DeclareLoc.getInlinedAt();
181 // Because no machine insts can come from debug intrinsics, only the scope
182 // and inlinedAt is significant. Zero line numbers are used in case this
183 // DebugLoc leaks into any adjacent instructions. Produce an unknown location
184 // with the correct scope / inlinedAt fields.
185 return DILocation::get(DII->getContext(), 0, 0, Scope, InlinedAt);
186 }
187
getDebugValueLoc(DbgVariableRecord * DVR)188 DebugLoc llvm::getDebugValueLoc(DbgVariableRecord *DVR) {
189 // Original dbg.declare must have a location.
190 const DebugLoc &DeclareLoc = DVR->getDebugLoc();
191 MDNode *Scope = DeclareLoc.getScope();
192 DILocation *InlinedAt = DeclareLoc.getInlinedAt();
193 // Because no machine insts can come from debug intrinsics, only the scope
194 // and inlinedAt is significant. Zero line numbers are used in case this
195 // DebugLoc leaks into any adjacent instructions. Produce an unknown location
196 // with the correct scope / inlinedAt fields.
197 return DILocation::get(DVR->getContext(), 0, 0, Scope, InlinedAt);
198 }
199
200 //===----------------------------------------------------------------------===//
201 // DebugInfoFinder implementations.
202 //===----------------------------------------------------------------------===//
203
reset()204 void DebugInfoFinder::reset() {
205 CUs.clear();
206 SPs.clear();
207 GVs.clear();
208 TYs.clear();
209 Scopes.clear();
210 NodesSeen.clear();
211 }
212
processModule(const Module & M)213 void DebugInfoFinder::processModule(const Module &M) {
214 for (auto *CU : M.debug_compile_units())
215 processCompileUnit(CU);
216 for (auto &F : M.functions()) {
217 if (auto *SP = cast_or_null<DISubprogram>(F.getSubprogram()))
218 processSubprogram(SP);
219 // There could be subprograms from inlined functions referenced from
220 // instructions only. Walk the function to find them.
221 for (const BasicBlock &BB : F)
222 for (const Instruction &I : BB)
223 processInstruction(M, I);
224 }
225 }
226
processCompileUnit(DICompileUnit * CU)227 void DebugInfoFinder::processCompileUnit(DICompileUnit *CU) {
228 if (!addCompileUnit(CU))
229 return;
230 for (auto *DIG : CU->getGlobalVariables()) {
231 if (!addGlobalVariable(DIG))
232 continue;
233 auto *GV = DIG->getVariable();
234 processScope(GV->getScope());
235 processType(GV->getType());
236 }
237 for (auto *ET : CU->getEnumTypes())
238 processType(ET);
239 for (auto *RT : CU->getRetainedTypes())
240 if (auto *T = dyn_cast<DIType>(RT))
241 processType(T);
242 else
243 processSubprogram(cast<DISubprogram>(RT));
244 for (auto *Import : CU->getImportedEntities())
245 processImportedEntity(Import);
246 }
247
processInstruction(const Module & M,const Instruction & I)248 void DebugInfoFinder::processInstruction(const Module &M,
249 const Instruction &I) {
250 if (auto *DVI = dyn_cast<DbgVariableIntrinsic>(&I))
251 processVariable(DVI->getVariable());
252
253 if (auto DbgLoc = I.getDebugLoc())
254 processLocation(M, DbgLoc.get());
255
256 for (const DbgRecord &DPR : I.getDbgRecordRange())
257 processDbgRecord(M, DPR);
258 }
259
processLocation(const Module & M,const DILocation * Loc)260 void DebugInfoFinder::processLocation(const Module &M, const DILocation *Loc) {
261 if (!Loc)
262 return;
263 processScope(Loc->getScope());
264 processLocation(M, Loc->getInlinedAt());
265 }
266
processDbgRecord(const Module & M,const DbgRecord & DR)267 void DebugInfoFinder::processDbgRecord(const Module &M, const DbgRecord &DR) {
268 if (const DbgVariableRecord *DVR = dyn_cast<const DbgVariableRecord>(&DR))
269 processVariable(DVR->getVariable());
270 processLocation(M, DR.getDebugLoc().get());
271 }
272
processType(DIType * DT)273 void DebugInfoFinder::processType(DIType *DT) {
274 if (!addType(DT))
275 return;
276 processScope(DT->getScope());
277 if (auto *ST = dyn_cast<DISubroutineType>(DT)) {
278 for (DIType *Ref : ST->getTypeArray())
279 processType(Ref);
280 return;
281 }
282 if (auto *DCT = dyn_cast<DICompositeType>(DT)) {
283 processType(DCT->getBaseType());
284 for (Metadata *D : DCT->getElements()) {
285 if (auto *T = dyn_cast<DIType>(D))
286 processType(T);
287 else if (auto *SP = dyn_cast<DISubprogram>(D))
288 processSubprogram(SP);
289 }
290 return;
291 }
292 if (auto *DDT = dyn_cast<DIDerivedType>(DT)) {
293 processType(DDT->getBaseType());
294 }
295 }
296
processImportedEntity(DIImportedEntity * Import)297 void DebugInfoFinder::processImportedEntity(DIImportedEntity *Import) {
298 auto *Entity = Import->getEntity();
299 if (auto *T = dyn_cast<DIType>(Entity))
300 processType(T);
301 else if (auto *SP = dyn_cast<DISubprogram>(Entity))
302 processSubprogram(SP);
303 else if (auto *NS = dyn_cast<DINamespace>(Entity))
304 processScope(NS->getScope());
305 else if (auto *M = dyn_cast<DIModule>(Entity))
306 processScope(M->getScope());
307 }
308
processScope(DIScope * Scope)309 void DebugInfoFinder::processScope(DIScope *Scope) {
310 if (!Scope)
311 return;
312 if (auto *Ty = dyn_cast<DIType>(Scope)) {
313 processType(Ty);
314 return;
315 }
316 if (auto *CU = dyn_cast<DICompileUnit>(Scope)) {
317 addCompileUnit(CU);
318 return;
319 }
320 if (auto *SP = dyn_cast<DISubprogram>(Scope)) {
321 processSubprogram(SP);
322 return;
323 }
324 if (!addScope(Scope))
325 return;
326 if (auto *LB = dyn_cast<DILexicalBlockBase>(Scope)) {
327 processScope(LB->getScope());
328 } else if (auto *NS = dyn_cast<DINamespace>(Scope)) {
329 processScope(NS->getScope());
330 } else if (auto *M = dyn_cast<DIModule>(Scope)) {
331 processScope(M->getScope());
332 }
333 }
334
processSubprogram(DISubprogram * SP)335 void DebugInfoFinder::processSubprogram(DISubprogram *SP) {
336 if (!addSubprogram(SP))
337 return;
338 processScope(SP->getScope());
339 // Some of the users, e.g. CloneFunctionInto / CloneModule, need to set up a
340 // ValueMap containing identity mappings for all of the DICompileUnit's, not
341 // just DISubprogram's, referenced from anywhere within the Function being
342 // cloned prior to calling MapMetadata / RemapInstruction to avoid their
343 // duplication later as DICompileUnit's are also directly referenced by
344 // llvm.dbg.cu list. Thefore we need to collect DICompileUnit's here as well.
345 // Also, DICompileUnit's may reference DISubprogram's too and therefore need
346 // to be at least looked through.
347 processCompileUnit(SP->getUnit());
348 processType(SP->getType());
349 for (auto *Element : SP->getTemplateParams()) {
350 if (auto *TType = dyn_cast<DITemplateTypeParameter>(Element)) {
351 processType(TType->getType());
352 } else if (auto *TVal = dyn_cast<DITemplateValueParameter>(Element)) {
353 processType(TVal->getType());
354 }
355 }
356
357 for (auto *N : SP->getRetainedNodes()) {
358 if (auto *Var = dyn_cast_or_null<DILocalVariable>(N))
359 processVariable(Var);
360 else if (auto *Import = dyn_cast_or_null<DIImportedEntity>(N))
361 processImportedEntity(Import);
362 }
363 }
364
processVariable(DILocalVariable * DV)365 void DebugInfoFinder::processVariable(DILocalVariable *DV) {
366 if (!NodesSeen.insert(DV).second)
367 return;
368 processScope(DV->getScope());
369 processType(DV->getType());
370 }
371
addType(DIType * DT)372 bool DebugInfoFinder::addType(DIType *DT) {
373 if (!DT)
374 return false;
375
376 if (!NodesSeen.insert(DT).second)
377 return false;
378
379 TYs.push_back(DT);
380 return true;
381 }
382
addCompileUnit(DICompileUnit * CU)383 bool DebugInfoFinder::addCompileUnit(DICompileUnit *CU) {
384 if (!CU)
385 return false;
386 if (!NodesSeen.insert(CU).second)
387 return false;
388
389 CUs.push_back(CU);
390 return true;
391 }
392
addGlobalVariable(DIGlobalVariableExpression * DIG)393 bool DebugInfoFinder::addGlobalVariable(DIGlobalVariableExpression *DIG) {
394 if (!NodesSeen.insert(DIG).second)
395 return false;
396
397 GVs.push_back(DIG);
398 return true;
399 }
400
addSubprogram(DISubprogram * SP)401 bool DebugInfoFinder::addSubprogram(DISubprogram *SP) {
402 if (!SP)
403 return false;
404
405 if (!NodesSeen.insert(SP).second)
406 return false;
407
408 SPs.push_back(SP);
409 return true;
410 }
411
addScope(DIScope * Scope)412 bool DebugInfoFinder::addScope(DIScope *Scope) {
413 if (!Scope)
414 return false;
415 // FIXME: Ocaml binding generates a scope with no content, we treat it
416 // as null for now.
417 if (Scope->getNumOperands() == 0)
418 return false;
419 if (!NodesSeen.insert(Scope).second)
420 return false;
421 Scopes.push_back(Scope);
422 return true;
423 }
424
updateLoopMetadataDebugLocationsImpl(MDNode * OrigLoopID,function_ref<Metadata * (Metadata *)> Updater)425 static MDNode *updateLoopMetadataDebugLocationsImpl(
426 MDNode *OrigLoopID, function_ref<Metadata *(Metadata *)> Updater) {
427 assert(OrigLoopID && OrigLoopID->getNumOperands() > 0 &&
428 "Loop ID needs at least one operand");
429 assert(OrigLoopID && OrigLoopID->getOperand(0).get() == OrigLoopID &&
430 "Loop ID should refer to itself");
431
432 // Save space for the self-referential LoopID.
433 SmallVector<Metadata *, 4> MDs = {nullptr};
434
435 for (unsigned i = 1; i < OrigLoopID->getNumOperands(); ++i) {
436 Metadata *MD = OrigLoopID->getOperand(i);
437 if (!MD)
438 MDs.push_back(nullptr);
439 else if (Metadata *NewMD = Updater(MD))
440 MDs.push_back(NewMD);
441 }
442
443 MDNode *NewLoopID = MDNode::getDistinct(OrigLoopID->getContext(), MDs);
444 // Insert the self-referential LoopID.
445 NewLoopID->replaceOperandWith(0, NewLoopID);
446 return NewLoopID;
447 }
448
updateLoopMetadataDebugLocations(Instruction & I,function_ref<Metadata * (Metadata *)> Updater)449 void llvm::updateLoopMetadataDebugLocations(
450 Instruction &I, function_ref<Metadata *(Metadata *)> Updater) {
451 MDNode *OrigLoopID = I.getMetadata(LLVMContext::MD_loop);
452 if (!OrigLoopID)
453 return;
454 MDNode *NewLoopID = updateLoopMetadataDebugLocationsImpl(OrigLoopID, Updater);
455 I.setMetadata(LLVMContext::MD_loop, NewLoopID);
456 }
457
458 /// Return true if a node is a DILocation or if a DILocation is
459 /// indirectly referenced by one of the node's children.
isDILocationReachable(SmallPtrSetImpl<Metadata * > & Visited,SmallPtrSetImpl<Metadata * > & Reachable,Metadata * MD)460 static bool isDILocationReachable(SmallPtrSetImpl<Metadata *> &Visited,
461 SmallPtrSetImpl<Metadata *> &Reachable,
462 Metadata *MD) {
463 MDNode *N = dyn_cast_or_null<MDNode>(MD);
464 if (!N)
465 return false;
466 if (isa<DILocation>(N) || Reachable.count(N))
467 return true;
468 if (!Visited.insert(N).second)
469 return false;
470 for (auto &OpIt : N->operands()) {
471 Metadata *Op = OpIt.get();
472 if (isDILocationReachable(Visited, Reachable, Op)) {
473 // Don't return just yet as we want to visit all MD's children to
474 // initialize DILocationReachable in stripDebugLocFromLoopID
475 Reachable.insert(N);
476 }
477 }
478 return Reachable.count(N);
479 }
480
isAllDILocation(SmallPtrSetImpl<Metadata * > & Visited,SmallPtrSetImpl<Metadata * > & AllDILocation,const SmallPtrSetImpl<Metadata * > & DIReachable,Metadata * MD)481 static bool isAllDILocation(SmallPtrSetImpl<Metadata *> &Visited,
482 SmallPtrSetImpl<Metadata *> &AllDILocation,
483 const SmallPtrSetImpl<Metadata *> &DIReachable,
484 Metadata *MD) {
485 MDNode *N = dyn_cast_or_null<MDNode>(MD);
486 if (!N)
487 return false;
488 if (isa<DILocation>(N) || AllDILocation.count(N))
489 return true;
490 if (!DIReachable.count(N))
491 return false;
492 if (!Visited.insert(N).second)
493 return false;
494 for (auto &OpIt : N->operands()) {
495 Metadata *Op = OpIt.get();
496 if (Op == MD)
497 continue;
498 if (!isAllDILocation(Visited, AllDILocation, DIReachable, Op)) {
499 return false;
500 }
501 }
502 AllDILocation.insert(N);
503 return true;
504 }
505
506 static Metadata *
stripLoopMDLoc(const SmallPtrSetImpl<Metadata * > & AllDILocation,const SmallPtrSetImpl<Metadata * > & DIReachable,Metadata * MD)507 stripLoopMDLoc(const SmallPtrSetImpl<Metadata *> &AllDILocation,
508 const SmallPtrSetImpl<Metadata *> &DIReachable, Metadata *MD) {
509 if (isa<DILocation>(MD) || AllDILocation.count(MD))
510 return nullptr;
511
512 if (!DIReachable.count(MD))
513 return MD;
514
515 MDNode *N = dyn_cast_or_null<MDNode>(MD);
516 if (!N)
517 return MD;
518
519 SmallVector<Metadata *, 4> Args;
520 bool HasSelfRef = false;
521 for (unsigned i = 0; i < N->getNumOperands(); ++i) {
522 Metadata *A = N->getOperand(i);
523 if (!A) {
524 Args.push_back(nullptr);
525 } else if (A == MD) {
526 assert(i == 0 && "expected i==0 for self-reference");
527 HasSelfRef = true;
528 Args.push_back(nullptr);
529 } else if (Metadata *NewArg =
530 stripLoopMDLoc(AllDILocation, DIReachable, A)) {
531 Args.push_back(NewArg);
532 }
533 }
534 if (Args.empty() || (HasSelfRef && Args.size() == 1))
535 return nullptr;
536
537 MDNode *NewMD = N->isDistinct() ? MDNode::getDistinct(N->getContext(), Args)
538 : MDNode::get(N->getContext(), Args);
539 if (HasSelfRef)
540 NewMD->replaceOperandWith(0, NewMD);
541 return NewMD;
542 }
543
stripDebugLocFromLoopID(MDNode * N)544 static MDNode *stripDebugLocFromLoopID(MDNode *N) {
545 assert(!N->operands().empty() && "Missing self reference?");
546 SmallPtrSet<Metadata *, 8> Visited, DILocationReachable, AllDILocation;
547 // If we already visited N, there is nothing to do.
548 if (!Visited.insert(N).second)
549 return N;
550
551 // If there is no debug location, we do not have to rewrite this
552 // MDNode. This loop also initializes DILocationReachable, later
553 // needed by updateLoopMetadataDebugLocationsImpl; the use of
554 // count_if avoids an early exit.
555 if (!llvm::count_if(llvm::drop_begin(N->operands()),
556 [&Visited, &DILocationReachable](const MDOperand &Op) {
557 return isDILocationReachable(
558 Visited, DILocationReachable, Op.get());
559 }))
560 return N;
561
562 Visited.clear();
563 // If there is only the debug location without any actual loop metadata, we
564 // can remove the metadata.
565 if (llvm::all_of(llvm::drop_begin(N->operands()),
566 [&Visited, &AllDILocation,
567 &DILocationReachable](const MDOperand &Op) {
568 return isAllDILocation(Visited, AllDILocation,
569 DILocationReachable, Op.get());
570 }))
571 return nullptr;
572
573 return updateLoopMetadataDebugLocationsImpl(
574 N, [&AllDILocation, &DILocationReachable](Metadata *MD) -> Metadata * {
575 return stripLoopMDLoc(AllDILocation, DILocationReachable, MD);
576 });
577 }
578
stripDebugInfo(Function & F)579 bool llvm::stripDebugInfo(Function &F) {
580 bool Changed = false;
581 if (F.hasMetadata(LLVMContext::MD_dbg)) {
582 Changed = true;
583 F.setSubprogram(nullptr);
584 }
585
586 DenseMap<MDNode *, MDNode *> LoopIDsMap;
587 for (BasicBlock &BB : F) {
588 for (Instruction &I : llvm::make_early_inc_range(BB)) {
589 if (I.getDebugLoc()) {
590 Changed = true;
591 I.setDebugLoc(DebugLoc());
592 }
593 if (auto *LoopID = I.getMetadata(LLVMContext::MD_loop)) {
594 auto *NewLoopID = LoopIDsMap.lookup(LoopID);
595 if (!NewLoopID)
596 NewLoopID = LoopIDsMap[LoopID] = stripDebugLocFromLoopID(LoopID);
597 if (NewLoopID != LoopID)
598 I.setMetadata(LLVMContext::MD_loop, NewLoopID);
599 }
600 // Strip other attachments that are or use debug info.
601 if (I.hasMetadataOtherThanDebugLoc()) {
602 // Heapallocsites point into the DIType system.
603 I.setMetadata("heapallocsite", nullptr);
604 // DIAssignID are debug info metadata primitives.
605 I.setMetadata(LLVMContext::MD_DIAssignID, nullptr);
606 }
607 I.dropDbgRecords();
608 }
609 }
610 return Changed;
611 }
612
StripDebugInfo(Module & M)613 bool llvm::StripDebugInfo(Module &M) {
614 bool Changed = false;
615
616 for (NamedMDNode &NMD : llvm::make_early_inc_range(M.named_metadata())) {
617 // We're stripping debug info, and without them, coverage information
618 // doesn't quite make sense.
619 if (NMD.getName().starts_with("llvm.dbg.") ||
620 NMD.getName() == "llvm.gcov") {
621 NMD.eraseFromParent();
622 Changed = true;
623 }
624 }
625
626 for (Function &F : M)
627 Changed |= stripDebugInfo(F);
628
629 for (auto &GV : M.globals()) {
630 Changed |= GV.eraseMetadata(LLVMContext::MD_dbg);
631 }
632
633 if (GVMaterializer *Materializer = M.getMaterializer())
634 Materializer->setStripDebugInfo();
635
636 return Changed;
637 }
638
639 namespace {
640
641 /// Helper class to downgrade -g metadata to -gline-tables-only metadata.
642 class DebugTypeInfoRemoval {
643 DenseMap<Metadata *, Metadata *> Replacements;
644
645 public:
646 /// The (void)() type.
647 MDNode *EmptySubroutineType;
648
649 private:
650 /// Remember what linkage name we originally had before stripping. If we end
651 /// up making two subprograms identical who originally had different linkage
652 /// names, then we need to make one of them distinct, to avoid them getting
653 /// uniqued. Maps the new node to the old linkage name.
654 DenseMap<DISubprogram *, StringRef> NewToLinkageName;
655
656 // TODO: Remember the distinct subprogram we created for a given linkage name,
657 // so that we can continue to unique whenever possible. Map <newly created
658 // node, old linkage name> to the first (possibly distinct) mdsubprogram
659 // created for that combination. This is not strictly needed for correctness,
660 // but can cut down on the number of MDNodes and let us diff cleanly with the
661 // output of -gline-tables-only.
662
663 public:
DebugTypeInfoRemoval(LLVMContext & C)664 DebugTypeInfoRemoval(LLVMContext &C)
665 : EmptySubroutineType(DISubroutineType::get(C, DINode::FlagZero, 0,
666 MDNode::get(C, {}))) {}
667
map(Metadata * M)668 Metadata *map(Metadata *M) {
669 if (!M)
670 return nullptr;
671 auto Replacement = Replacements.find(M);
672 if (Replacement != Replacements.end())
673 return Replacement->second;
674
675 return M;
676 }
mapNode(Metadata * N)677 MDNode *mapNode(Metadata *N) { return dyn_cast_or_null<MDNode>(map(N)); }
678
679 /// Recursively remap N and all its referenced children. Does a DF post-order
680 /// traversal, so as to remap bottoms up.
traverseAndRemap(MDNode * N)681 void traverseAndRemap(MDNode *N) { traverse(N); }
682
683 private:
684 // Create a new DISubprogram, to replace the one given.
getReplacementSubprogram(DISubprogram * MDS)685 DISubprogram *getReplacementSubprogram(DISubprogram *MDS) {
686 auto *FileAndScope = cast_or_null<DIFile>(map(MDS->getFile()));
687 StringRef LinkageName = MDS->getName().empty() ? MDS->getLinkageName() : "";
688 DISubprogram *Declaration = nullptr;
689 auto *Type = cast_or_null<DISubroutineType>(map(MDS->getType()));
690 DIType *ContainingType =
691 cast_or_null<DIType>(map(MDS->getContainingType()));
692 auto *Unit = cast_or_null<DICompileUnit>(map(MDS->getUnit()));
693 auto Variables = nullptr;
694 auto TemplateParams = nullptr;
695
696 // Make a distinct DISubprogram, for situations that warrent it.
697 auto distinctMDSubprogram = [&]() {
698 return DISubprogram::getDistinct(
699 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
700 FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(),
701 ContainingType, MDS->getVirtualIndex(), MDS->getThisAdjustment(),
702 MDS->getFlags(), MDS->getSPFlags(), Unit, TemplateParams, Declaration,
703 Variables);
704 };
705
706 if (MDS->isDistinct())
707 return distinctMDSubprogram();
708
709 auto *NewMDS = DISubprogram::get(
710 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
711 FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(), ContainingType,
712 MDS->getVirtualIndex(), MDS->getThisAdjustment(), MDS->getFlags(),
713 MDS->getSPFlags(), Unit, TemplateParams, Declaration, Variables);
714
715 StringRef OldLinkageName = MDS->getLinkageName();
716
717 // See if we need to make a distinct one.
718 auto OrigLinkage = NewToLinkageName.find(NewMDS);
719 if (OrigLinkage != NewToLinkageName.end()) {
720 if (OrigLinkage->second == OldLinkageName)
721 // We're good.
722 return NewMDS;
723
724 // Otherwise, need to make a distinct one.
725 // TODO: Query the map to see if we already have one.
726 return distinctMDSubprogram();
727 }
728
729 NewToLinkageName.insert({NewMDS, MDS->getLinkageName()});
730 return NewMDS;
731 }
732
733 /// Create a new compile unit, to replace the one given
getReplacementCU(DICompileUnit * CU)734 DICompileUnit *getReplacementCU(DICompileUnit *CU) {
735 // Drop skeleton CUs.
736 if (CU->getDWOId())
737 return nullptr;
738
739 auto *File = cast_or_null<DIFile>(map(CU->getFile()));
740 MDTuple *EnumTypes = nullptr;
741 MDTuple *RetainedTypes = nullptr;
742 MDTuple *GlobalVariables = nullptr;
743 MDTuple *ImportedEntities = nullptr;
744 return DICompileUnit::getDistinct(
745 CU->getContext(), CU->getSourceLanguage(), File, CU->getProducer(),
746 CU->isOptimized(), CU->getFlags(), CU->getRuntimeVersion(),
747 CU->getSplitDebugFilename(), DICompileUnit::LineTablesOnly, EnumTypes,
748 RetainedTypes, GlobalVariables, ImportedEntities, CU->getMacros(),
749 CU->getDWOId(), CU->getSplitDebugInlining(),
750 CU->getDebugInfoForProfiling(), CU->getNameTableKind(),
751 CU->getRangesBaseAddress(), CU->getSysRoot(), CU->getSDK());
752 }
753
getReplacementMDLocation(DILocation * MLD)754 DILocation *getReplacementMDLocation(DILocation *MLD) {
755 auto *Scope = map(MLD->getScope());
756 auto *InlinedAt = map(MLD->getInlinedAt());
757 if (MLD->isDistinct())
758 return DILocation::getDistinct(MLD->getContext(), MLD->getLine(),
759 MLD->getColumn(), Scope, InlinedAt);
760 return DILocation::get(MLD->getContext(), MLD->getLine(), MLD->getColumn(),
761 Scope, InlinedAt);
762 }
763
764 /// Create a new generic MDNode, to replace the one given
getReplacementMDNode(MDNode * N)765 MDNode *getReplacementMDNode(MDNode *N) {
766 SmallVector<Metadata *, 8> Ops;
767 Ops.reserve(N->getNumOperands());
768 for (auto &I : N->operands())
769 if (I)
770 Ops.push_back(map(I));
771 auto *Ret = MDNode::get(N->getContext(), Ops);
772 return Ret;
773 }
774
775 /// Attempt to re-map N to a newly created node.
remap(MDNode * N)776 void remap(MDNode *N) {
777 if (Replacements.count(N))
778 return;
779
780 auto doRemap = [&](MDNode *N) -> MDNode * {
781 if (!N)
782 return nullptr;
783 if (auto *MDSub = dyn_cast<DISubprogram>(N)) {
784 remap(MDSub->getUnit());
785 return getReplacementSubprogram(MDSub);
786 }
787 if (isa<DISubroutineType>(N))
788 return EmptySubroutineType;
789 if (auto *CU = dyn_cast<DICompileUnit>(N))
790 return getReplacementCU(CU);
791 if (isa<DIFile>(N))
792 return N;
793 if (auto *MDLB = dyn_cast<DILexicalBlockBase>(N))
794 // Remap to our referenced scope (recursively).
795 return mapNode(MDLB->getScope());
796 if (auto *MLD = dyn_cast<DILocation>(N))
797 return getReplacementMDLocation(MLD);
798
799 // Otherwise, if we see these, just drop them now. Not strictly necessary,
800 // but this speeds things up a little.
801 if (isa<DINode>(N))
802 return nullptr;
803
804 return getReplacementMDNode(N);
805 };
806 // Seperate recursive doRemap and operator [] into 2 lines to avoid
807 // out-of-order evaluations since both of them can access the same memory
808 // location in map Replacements.
809 auto Value = doRemap(N);
810 Replacements[N] = Value;
811 }
812
813 /// Do the remapping traversal.
814 void traverse(MDNode *);
815 };
816
817 } // end anonymous namespace
818
traverse(MDNode * N)819 void DebugTypeInfoRemoval::traverse(MDNode *N) {
820 if (!N || Replacements.count(N))
821 return;
822
823 // To avoid cycles, as well as for efficiency sake, we will sometimes prune
824 // parts of the graph.
825 auto prune = [](MDNode *Parent, MDNode *Child) {
826 if (auto *MDS = dyn_cast<DISubprogram>(Parent))
827 return Child == MDS->getRetainedNodes().get();
828 return false;
829 };
830
831 SmallVector<MDNode *, 16> ToVisit;
832 DenseSet<MDNode *> Opened;
833
834 // Visit each node starting at N in post order, and map them.
835 ToVisit.push_back(N);
836 while (!ToVisit.empty()) {
837 auto *N = ToVisit.back();
838 if (!Opened.insert(N).second) {
839 // Close it.
840 remap(N);
841 ToVisit.pop_back();
842 continue;
843 }
844 for (auto &I : N->operands())
845 if (auto *MDN = dyn_cast_or_null<MDNode>(I))
846 if (!Opened.count(MDN) && !Replacements.count(MDN) && !prune(N, MDN) &&
847 !isa<DICompileUnit>(MDN))
848 ToVisit.push_back(MDN);
849 }
850 }
851
stripNonLineTableDebugInfo(Module & M)852 bool llvm::stripNonLineTableDebugInfo(Module &M) {
853 bool Changed = false;
854
855 // First off, delete the debug intrinsics.
856 auto RemoveUses = [&](StringRef Name) {
857 if (auto *DbgVal = M.getFunction(Name)) {
858 while (!DbgVal->use_empty())
859 cast<Instruction>(DbgVal->user_back())->eraseFromParent();
860 DbgVal->eraseFromParent();
861 Changed = true;
862 }
863 };
864 RemoveUses("llvm.dbg.declare");
865 RemoveUses("llvm.dbg.label");
866 RemoveUses("llvm.dbg.value");
867
868 // Delete non-CU debug info named metadata nodes.
869 for (auto NMI = M.named_metadata_begin(), NME = M.named_metadata_end();
870 NMI != NME;) {
871 NamedMDNode *NMD = &*NMI;
872 ++NMI;
873 // Specifically keep dbg.cu around.
874 if (NMD->getName() == "llvm.dbg.cu")
875 continue;
876 }
877
878 // Drop all dbg attachments from global variables.
879 for (auto &GV : M.globals())
880 GV.eraseMetadata(LLVMContext::MD_dbg);
881
882 DebugTypeInfoRemoval Mapper(M.getContext());
883 auto remap = [&](MDNode *Node) -> MDNode * {
884 if (!Node)
885 return nullptr;
886 Mapper.traverseAndRemap(Node);
887 auto *NewNode = Mapper.mapNode(Node);
888 Changed |= Node != NewNode;
889 Node = NewNode;
890 return NewNode;
891 };
892
893 // Rewrite the DebugLocs to be equivalent to what
894 // -gline-tables-only would have created.
895 for (auto &F : M) {
896 if (auto *SP = F.getSubprogram()) {
897 Mapper.traverseAndRemap(SP);
898 auto *NewSP = cast<DISubprogram>(Mapper.mapNode(SP));
899 Changed |= SP != NewSP;
900 F.setSubprogram(NewSP);
901 }
902 for (auto &BB : F) {
903 for (auto &I : BB) {
904 auto remapDebugLoc = [&](const DebugLoc &DL) -> DebugLoc {
905 auto *Scope = DL.getScope();
906 MDNode *InlinedAt = DL.getInlinedAt();
907 Scope = remap(Scope);
908 InlinedAt = remap(InlinedAt);
909 return DILocation::get(M.getContext(), DL.getLine(), DL.getCol(),
910 Scope, InlinedAt);
911 };
912
913 if (I.getDebugLoc() != DebugLoc())
914 I.setDebugLoc(remapDebugLoc(I.getDebugLoc()));
915
916 // Remap DILocations in llvm.loop attachments.
917 updateLoopMetadataDebugLocations(I, [&](Metadata *MD) -> Metadata * {
918 if (auto *Loc = dyn_cast_or_null<DILocation>(MD))
919 return remapDebugLoc(Loc).get();
920 return MD;
921 });
922
923 // Strip heapallocsite attachments, they point into the DIType system.
924 if (I.hasMetadataOtherThanDebugLoc())
925 I.setMetadata("heapallocsite", nullptr);
926
927 // Strip any DbgRecords attached.
928 I.dropDbgRecords();
929 }
930 }
931 }
932
933 // Create a new llvm.dbg.cu, which is equivalent to the one
934 // -gline-tables-only would have created.
935 for (auto &NMD : M.named_metadata()) {
936 SmallVector<MDNode *, 8> Ops;
937 for (MDNode *Op : NMD.operands())
938 Ops.push_back(remap(Op));
939
940 if (!Changed)
941 continue;
942
943 NMD.clearOperands();
944 for (auto *Op : Ops)
945 if (Op)
946 NMD.addOperand(Op);
947 }
948 return Changed;
949 }
950
getDebugMetadataVersionFromModule(const Module & M)951 unsigned llvm::getDebugMetadataVersionFromModule(const Module &M) {
952 if (auto *Val = mdconst::dyn_extract_or_null<ConstantInt>(
953 M.getModuleFlag("Debug Info Version")))
954 return Val->getZExtValue();
955 return 0;
956 }
957
applyMergedLocation(DebugLoc LocA,DebugLoc LocB)958 void Instruction::applyMergedLocation(DebugLoc LocA, DebugLoc LocB) {
959 setDebugLoc(DebugLoc::getMergedLocation(LocA, LocB));
960 }
961
mergeDIAssignID(ArrayRef<const Instruction * > SourceInstructions)962 void Instruction::mergeDIAssignID(
963 ArrayRef<const Instruction *> SourceInstructions) {
964 // Replace all uses (and attachments) of all the DIAssignIDs
965 // on SourceInstructions with a single merged value.
966 assert(getFunction() && "Uninserted instruction merged");
967 // Collect up the DIAssignID tags.
968 SmallVector<DIAssignID *, 4> IDs;
969 for (const Instruction *I : SourceInstructions) {
970 if (auto *MD = I->getMetadata(LLVMContext::MD_DIAssignID))
971 IDs.push_back(cast<DIAssignID>(MD));
972 assert(getFunction() == I->getFunction() &&
973 "Merging with instruction from another function not allowed");
974 }
975
976 // Add this instruction's DIAssignID too, if it has one.
977 if (auto *MD = getMetadata(LLVMContext::MD_DIAssignID))
978 IDs.push_back(cast<DIAssignID>(MD));
979
980 if (IDs.empty())
981 return; // No DIAssignID tags to process.
982
983 DIAssignID *MergeID = IDs[0];
984 for (DIAssignID *AssignID : drop_begin(IDs)) {
985 if (AssignID != MergeID)
986 at::RAUW(AssignID, MergeID);
987 }
988 setMetadata(LLVMContext::MD_DIAssignID, MergeID);
989 }
990
updateLocationAfterHoist()991 void Instruction::updateLocationAfterHoist() { dropLocation(); }
992
dropLocation()993 void Instruction::dropLocation() {
994 const DebugLoc &DL = getDebugLoc();
995 if (!DL) {
996 setDebugLoc(DebugLoc::getDropped());
997 return;
998 }
999
1000 // If this isn't a call, drop the location to allow a location from a
1001 // preceding instruction to propagate.
1002 bool MayLowerToCall = false;
1003 if (isa<CallBase>(this)) {
1004 auto *II = dyn_cast<IntrinsicInst>(this);
1005 MayLowerToCall =
1006 !II || IntrinsicInst::mayLowerToFunctionCall(II->getIntrinsicID());
1007 }
1008
1009 if (!MayLowerToCall) {
1010 setDebugLoc(DebugLoc::getDropped());
1011 return;
1012 }
1013
1014 // Set a line 0 location for calls to preserve scope information in case
1015 // inlining occurs.
1016 DISubprogram *SP = getFunction()->getSubprogram();
1017 if (SP)
1018 // If a function scope is available, set it on the line 0 location. When
1019 // hoisting a call to a predecessor block, using the function scope avoids
1020 // making it look like the callee was reached earlier than it should be.
1021 setDebugLoc(DILocation::get(getContext(), 0, 0, SP));
1022 else
1023 // The parent function has no scope. Go ahead and drop the location. If
1024 // the parent function is inlined, and the callee has a subprogram, the
1025 // inliner will attach a location to the call.
1026 //
1027 // One alternative is to set a line 0 location with the existing scope and
1028 // inlinedAt info. The location might be sensitive to when inlining occurs.
1029 setDebugLoc(DebugLoc::getDropped());
1030 }
1031
1032 //===----------------------------------------------------------------------===//
1033 // LLVM C API implementations.
1034 //===----------------------------------------------------------------------===//
1035
map_from_llvmDWARFsourcelanguage(LLVMDWARFSourceLanguage lang)1036 static unsigned map_from_llvmDWARFsourcelanguage(LLVMDWARFSourceLanguage lang) {
1037 switch (lang) {
1038 #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \
1039 case LLVMDWARFSourceLanguage##NAME: \
1040 return ID;
1041 #include "llvm/BinaryFormat/Dwarf.def"
1042 #undef HANDLE_DW_LANG
1043 }
1044 llvm_unreachable("Unhandled Tag");
1045 }
1046
unwrapDI(LLVMMetadataRef Ref)1047 template <typename DIT> DIT *unwrapDI(LLVMMetadataRef Ref) {
1048 return (DIT *)(Ref ? unwrap<MDNode>(Ref) : nullptr);
1049 }
1050
map_from_llvmDIFlags(LLVMDIFlags Flags)1051 static DINode::DIFlags map_from_llvmDIFlags(LLVMDIFlags Flags) {
1052 return static_cast<DINode::DIFlags>(Flags);
1053 }
1054
map_to_llvmDIFlags(DINode::DIFlags Flags)1055 static LLVMDIFlags map_to_llvmDIFlags(DINode::DIFlags Flags) {
1056 return static_cast<LLVMDIFlags>(Flags);
1057 }
1058
1059 static DISubprogram::DISPFlags
pack_into_DISPFlags(bool IsLocalToUnit,bool IsDefinition,bool IsOptimized)1060 pack_into_DISPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized) {
1061 return DISubprogram::toSPFlags(IsLocalToUnit, IsDefinition, IsOptimized);
1062 }
1063
LLVMDebugMetadataVersion()1064 unsigned LLVMDebugMetadataVersion() {
1065 return DEBUG_METADATA_VERSION;
1066 }
1067
LLVMCreateDIBuilderDisallowUnresolved(LLVMModuleRef M)1068 LLVMDIBuilderRef LLVMCreateDIBuilderDisallowUnresolved(LLVMModuleRef M) {
1069 return wrap(new DIBuilder(*unwrap(M), false));
1070 }
1071
LLVMCreateDIBuilder(LLVMModuleRef M)1072 LLVMDIBuilderRef LLVMCreateDIBuilder(LLVMModuleRef M) {
1073 return wrap(new DIBuilder(*unwrap(M)));
1074 }
1075
LLVMGetModuleDebugMetadataVersion(LLVMModuleRef M)1076 unsigned LLVMGetModuleDebugMetadataVersion(LLVMModuleRef M) {
1077 return getDebugMetadataVersionFromModule(*unwrap(M));
1078 }
1079
LLVMStripModuleDebugInfo(LLVMModuleRef M)1080 LLVMBool LLVMStripModuleDebugInfo(LLVMModuleRef M) {
1081 return StripDebugInfo(*unwrap(M));
1082 }
1083
LLVMDisposeDIBuilder(LLVMDIBuilderRef Builder)1084 void LLVMDisposeDIBuilder(LLVMDIBuilderRef Builder) {
1085 delete unwrap(Builder);
1086 }
1087
LLVMDIBuilderFinalize(LLVMDIBuilderRef Builder)1088 void LLVMDIBuilderFinalize(LLVMDIBuilderRef Builder) {
1089 unwrap(Builder)->finalize();
1090 }
1091
LLVMDIBuilderFinalizeSubprogram(LLVMDIBuilderRef Builder,LLVMMetadataRef subprogram)1092 void LLVMDIBuilderFinalizeSubprogram(LLVMDIBuilderRef Builder,
1093 LLVMMetadataRef subprogram) {
1094 unwrap(Builder)->finalizeSubprogram(unwrapDI<DISubprogram>(subprogram));
1095 }
1096
LLVMDIBuilderCreateCompileUnit(LLVMDIBuilderRef Builder,LLVMDWARFSourceLanguage Lang,LLVMMetadataRef FileRef,const char * Producer,size_t ProducerLen,LLVMBool isOptimized,const char * Flags,size_t FlagsLen,unsigned RuntimeVer,const char * SplitName,size_t SplitNameLen,LLVMDWARFEmissionKind Kind,unsigned DWOId,LLVMBool SplitDebugInlining,LLVMBool DebugInfoForProfiling,const char * SysRoot,size_t SysRootLen,const char * SDK,size_t SDKLen)1097 LLVMMetadataRef LLVMDIBuilderCreateCompileUnit(
1098 LLVMDIBuilderRef Builder, LLVMDWARFSourceLanguage Lang,
1099 LLVMMetadataRef FileRef, const char *Producer, size_t ProducerLen,
1100 LLVMBool isOptimized, const char *Flags, size_t FlagsLen,
1101 unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen,
1102 LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining,
1103 LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen,
1104 const char *SDK, size_t SDKLen) {
1105 auto File = unwrapDI<DIFile>(FileRef);
1106
1107 return wrap(unwrap(Builder)->createCompileUnit(
1108 map_from_llvmDWARFsourcelanguage(Lang), File,
1109 StringRef(Producer, ProducerLen), isOptimized, StringRef(Flags, FlagsLen),
1110 RuntimeVer, StringRef(SplitName, SplitNameLen),
1111 static_cast<DICompileUnit::DebugEmissionKind>(Kind), DWOId,
1112 SplitDebugInlining, DebugInfoForProfiling,
1113 DICompileUnit::DebugNameTableKind::Default, false,
1114 StringRef(SysRoot, SysRootLen), StringRef(SDK, SDKLen)));
1115 }
1116
1117 LLVMMetadataRef
LLVMDIBuilderCreateFile(LLVMDIBuilderRef Builder,const char * Filename,size_t FilenameLen,const char * Directory,size_t DirectoryLen)1118 LLVMDIBuilderCreateFile(LLVMDIBuilderRef Builder, const char *Filename,
1119 size_t FilenameLen, const char *Directory,
1120 size_t DirectoryLen) {
1121 return wrap(unwrap(Builder)->createFile(StringRef(Filename, FilenameLen),
1122 StringRef(Directory, DirectoryLen)));
1123 }
1124
1125 LLVMMetadataRef
LLVMDIBuilderCreateModule(LLVMDIBuilderRef Builder,LLVMMetadataRef ParentScope,const char * Name,size_t NameLen,const char * ConfigMacros,size_t ConfigMacrosLen,const char * IncludePath,size_t IncludePathLen,const char * APINotesFile,size_t APINotesFileLen)1126 LLVMDIBuilderCreateModule(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope,
1127 const char *Name, size_t NameLen,
1128 const char *ConfigMacros, size_t ConfigMacrosLen,
1129 const char *IncludePath, size_t IncludePathLen,
1130 const char *APINotesFile, size_t APINotesFileLen) {
1131 return wrap(unwrap(Builder)->createModule(
1132 unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen),
1133 StringRef(ConfigMacros, ConfigMacrosLen),
1134 StringRef(IncludePath, IncludePathLen),
1135 StringRef(APINotesFile, APINotesFileLen)));
1136 }
1137
LLVMDIBuilderCreateNameSpace(LLVMDIBuilderRef Builder,LLVMMetadataRef ParentScope,const char * Name,size_t NameLen,LLVMBool ExportSymbols)1138 LLVMMetadataRef LLVMDIBuilderCreateNameSpace(LLVMDIBuilderRef Builder,
1139 LLVMMetadataRef ParentScope,
1140 const char *Name, size_t NameLen,
1141 LLVMBool ExportSymbols) {
1142 return wrap(unwrap(Builder)->createNameSpace(
1143 unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen), ExportSymbols));
1144 }
1145
LLVMDIBuilderCreateFunction(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,const char * LinkageName,size_t LinkageNameLen,LLVMMetadataRef File,unsigned LineNo,LLVMMetadataRef Ty,LLVMBool IsLocalToUnit,LLVMBool IsDefinition,unsigned ScopeLine,LLVMDIFlags Flags,LLVMBool IsOptimized)1146 LLVMMetadataRef LLVMDIBuilderCreateFunction(
1147 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1148 size_t NameLen, const char *LinkageName, size_t LinkageNameLen,
1149 LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1150 LLVMBool IsLocalToUnit, LLVMBool IsDefinition,
1151 unsigned ScopeLine, LLVMDIFlags Flags, LLVMBool IsOptimized) {
1152 return wrap(unwrap(Builder)->createFunction(
1153 unwrapDI<DIScope>(Scope), {Name, NameLen}, {LinkageName, LinkageNameLen},
1154 unwrapDI<DIFile>(File), LineNo, unwrapDI<DISubroutineType>(Ty), ScopeLine,
1155 map_from_llvmDIFlags(Flags),
1156 pack_into_DISPFlags(IsLocalToUnit, IsDefinition, IsOptimized), nullptr,
1157 nullptr, nullptr));
1158 }
1159
1160
LLVMDIBuilderCreateLexicalBlock(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,LLVMMetadataRef File,unsigned Line,unsigned Col)1161 LLVMMetadataRef LLVMDIBuilderCreateLexicalBlock(
1162 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope,
1163 LLVMMetadataRef File, unsigned Line, unsigned Col) {
1164 return wrap(unwrap(Builder)->createLexicalBlock(unwrapDI<DIScope>(Scope),
1165 unwrapDI<DIFile>(File),
1166 Line, Col));
1167 }
1168
1169 LLVMMetadataRef
LLVMDIBuilderCreateLexicalBlockFile(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,LLVMMetadataRef File,unsigned Discriminator)1170 LLVMDIBuilderCreateLexicalBlockFile(LLVMDIBuilderRef Builder,
1171 LLVMMetadataRef Scope,
1172 LLVMMetadataRef File,
1173 unsigned Discriminator) {
1174 return wrap(unwrap(Builder)->createLexicalBlockFile(unwrapDI<DIScope>(Scope),
1175 unwrapDI<DIFile>(File),
1176 Discriminator));
1177 }
1178
1179 LLVMMetadataRef
LLVMDIBuilderCreateImportedModuleFromNamespace(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,LLVMMetadataRef NS,LLVMMetadataRef File,unsigned Line)1180 LLVMDIBuilderCreateImportedModuleFromNamespace(LLVMDIBuilderRef Builder,
1181 LLVMMetadataRef Scope,
1182 LLVMMetadataRef NS,
1183 LLVMMetadataRef File,
1184 unsigned Line) {
1185 return wrap(unwrap(Builder)->createImportedModule(unwrapDI<DIScope>(Scope),
1186 unwrapDI<DINamespace>(NS),
1187 unwrapDI<DIFile>(File),
1188 Line));
1189 }
1190
LLVMDIBuilderCreateImportedModuleFromAlias(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,LLVMMetadataRef ImportedEntity,LLVMMetadataRef File,unsigned Line,LLVMMetadataRef * Elements,unsigned NumElements)1191 LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromAlias(
1192 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope,
1193 LLVMMetadataRef ImportedEntity, LLVMMetadataRef File, unsigned Line,
1194 LLVMMetadataRef *Elements, unsigned NumElements) {
1195 auto Elts =
1196 (NumElements > 0)
1197 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1198 : nullptr;
1199 return wrap(unwrap(Builder)->createImportedModule(
1200 unwrapDI<DIScope>(Scope), unwrapDI<DIImportedEntity>(ImportedEntity),
1201 unwrapDI<DIFile>(File), Line, Elts));
1202 }
1203
LLVMDIBuilderCreateImportedModuleFromModule(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,LLVMMetadataRef M,LLVMMetadataRef File,unsigned Line,LLVMMetadataRef * Elements,unsigned NumElements)1204 LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromModule(
1205 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef M,
1206 LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements,
1207 unsigned NumElements) {
1208 auto Elts =
1209 (NumElements > 0)
1210 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1211 : nullptr;
1212 return wrap(unwrap(Builder)->createImportedModule(
1213 unwrapDI<DIScope>(Scope), unwrapDI<DIModule>(M), unwrapDI<DIFile>(File),
1214 Line, Elts));
1215 }
1216
LLVMDIBuilderCreateImportedDeclaration(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,LLVMMetadataRef Decl,LLVMMetadataRef File,unsigned Line,const char * Name,size_t NameLen,LLVMMetadataRef * Elements,unsigned NumElements)1217 LLVMMetadataRef LLVMDIBuilderCreateImportedDeclaration(
1218 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef Decl,
1219 LLVMMetadataRef File, unsigned Line, const char *Name, size_t NameLen,
1220 LLVMMetadataRef *Elements, unsigned NumElements) {
1221 auto Elts =
1222 (NumElements > 0)
1223 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1224 : nullptr;
1225 return wrap(unwrap(Builder)->createImportedDeclaration(
1226 unwrapDI<DIScope>(Scope), unwrapDI<DINode>(Decl), unwrapDI<DIFile>(File),
1227 Line, {Name, NameLen}, Elts));
1228 }
1229
1230 LLVMMetadataRef
LLVMDIBuilderCreateDebugLocation(LLVMContextRef Ctx,unsigned Line,unsigned Column,LLVMMetadataRef Scope,LLVMMetadataRef InlinedAt)1231 LLVMDIBuilderCreateDebugLocation(LLVMContextRef Ctx, unsigned Line,
1232 unsigned Column, LLVMMetadataRef Scope,
1233 LLVMMetadataRef InlinedAt) {
1234 return wrap(DILocation::get(*unwrap(Ctx), Line, Column, unwrap(Scope),
1235 unwrap(InlinedAt)));
1236 }
1237
LLVMDILocationGetLine(LLVMMetadataRef Location)1238 unsigned LLVMDILocationGetLine(LLVMMetadataRef Location) {
1239 return unwrapDI<DILocation>(Location)->getLine();
1240 }
1241
LLVMDILocationGetColumn(LLVMMetadataRef Location)1242 unsigned LLVMDILocationGetColumn(LLVMMetadataRef Location) {
1243 return unwrapDI<DILocation>(Location)->getColumn();
1244 }
1245
LLVMDILocationGetScope(LLVMMetadataRef Location)1246 LLVMMetadataRef LLVMDILocationGetScope(LLVMMetadataRef Location) {
1247 return wrap(unwrapDI<DILocation>(Location)->getScope());
1248 }
1249
LLVMDILocationGetInlinedAt(LLVMMetadataRef Location)1250 LLVMMetadataRef LLVMDILocationGetInlinedAt(LLVMMetadataRef Location) {
1251 return wrap(unwrapDI<DILocation>(Location)->getInlinedAt());
1252 }
1253
LLVMDIScopeGetFile(LLVMMetadataRef Scope)1254 LLVMMetadataRef LLVMDIScopeGetFile(LLVMMetadataRef Scope) {
1255 return wrap(unwrapDI<DIScope>(Scope)->getFile());
1256 }
1257
LLVMDIFileGetDirectory(LLVMMetadataRef File,unsigned * Len)1258 const char *LLVMDIFileGetDirectory(LLVMMetadataRef File, unsigned *Len) {
1259 auto Dir = unwrapDI<DIFile>(File)->getDirectory();
1260 *Len = Dir.size();
1261 return Dir.data();
1262 }
1263
LLVMDIFileGetFilename(LLVMMetadataRef File,unsigned * Len)1264 const char *LLVMDIFileGetFilename(LLVMMetadataRef File, unsigned *Len) {
1265 auto Name = unwrapDI<DIFile>(File)->getFilename();
1266 *Len = Name.size();
1267 return Name.data();
1268 }
1269
LLVMDIFileGetSource(LLVMMetadataRef File,unsigned * Len)1270 const char *LLVMDIFileGetSource(LLVMMetadataRef File, unsigned *Len) {
1271 if (auto Src = unwrapDI<DIFile>(File)->getSource()) {
1272 *Len = Src->size();
1273 return Src->data();
1274 }
1275 *Len = 0;
1276 return "";
1277 }
1278
LLVMDIBuilderCreateMacro(LLVMDIBuilderRef Builder,LLVMMetadataRef ParentMacroFile,unsigned Line,LLVMDWARFMacinfoRecordType RecordType,const char * Name,size_t NameLen,const char * Value,size_t ValueLen)1279 LLVMMetadataRef LLVMDIBuilderCreateMacro(LLVMDIBuilderRef Builder,
1280 LLVMMetadataRef ParentMacroFile,
1281 unsigned Line,
1282 LLVMDWARFMacinfoRecordType RecordType,
1283 const char *Name, size_t NameLen,
1284 const char *Value, size_t ValueLen) {
1285 return wrap(
1286 unwrap(Builder)->createMacro(unwrapDI<DIMacroFile>(ParentMacroFile), Line,
1287 static_cast<MacinfoRecordType>(RecordType),
1288 {Name, NameLen}, {Value, ValueLen}));
1289 }
1290
1291 LLVMMetadataRef
LLVMDIBuilderCreateTempMacroFile(LLVMDIBuilderRef Builder,LLVMMetadataRef ParentMacroFile,unsigned Line,LLVMMetadataRef File)1292 LLVMDIBuilderCreateTempMacroFile(LLVMDIBuilderRef Builder,
1293 LLVMMetadataRef ParentMacroFile, unsigned Line,
1294 LLVMMetadataRef File) {
1295 return wrap(unwrap(Builder)->createTempMacroFile(
1296 unwrapDI<DIMacroFile>(ParentMacroFile), Line, unwrapDI<DIFile>(File)));
1297 }
1298
LLVMDIBuilderCreateEnumerator(LLVMDIBuilderRef Builder,const char * Name,size_t NameLen,int64_t Value,LLVMBool IsUnsigned)1299 LLVMMetadataRef LLVMDIBuilderCreateEnumerator(LLVMDIBuilderRef Builder,
1300 const char *Name, size_t NameLen,
1301 int64_t Value,
1302 LLVMBool IsUnsigned) {
1303 return wrap(unwrap(Builder)->createEnumerator({Name, NameLen}, Value,
1304 IsUnsigned != 0));
1305 }
1306
LLVMDIBuilderCreateEnumeratorOfArbitraryPrecision(LLVMDIBuilderRef Builder,const char * Name,size_t NameLen,uint64_t SizeInBits,const uint64_t Words[],LLVMBool IsUnsigned)1307 LLVMMetadataRef LLVMDIBuilderCreateEnumeratorOfArbitraryPrecision(
1308 LLVMDIBuilderRef Builder, const char *Name, size_t NameLen,
1309 uint64_t SizeInBits, const uint64_t Words[], LLVMBool IsUnsigned) {
1310 uint64_t NumWords = (SizeInBits + 63) / 64;
1311 return wrap(unwrap(Builder)->createEnumerator(
1312 {Name, NameLen},
1313 APSInt(APInt(SizeInBits, ArrayRef(Words, NumWords)), IsUnsigned != 0)));
1314 }
1315
LLVMDIBuilderCreateEnumerationType(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNumber,uint64_t SizeInBits,uint32_t AlignInBits,LLVMMetadataRef * Elements,unsigned NumElements,LLVMMetadataRef ClassTy)1316 LLVMMetadataRef LLVMDIBuilderCreateEnumerationType(
1317 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1318 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1319 uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef *Elements,
1320 unsigned NumElements, LLVMMetadataRef ClassTy) {
1321 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1322 NumElements});
1323 return wrap(unwrap(Builder)->createEnumerationType(
1324 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1325 LineNumber, SizeInBits, AlignInBits, Elts, unwrapDI<DIType>(ClassTy)));
1326 }
1327
LLVMDIBuilderCreateSetType(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNumber,uint64_t SizeInBits,uint32_t AlignInBits,LLVMMetadataRef BaseTy)1328 LLVMMetadataRef LLVMDIBuilderCreateSetType(
1329 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1330 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1331 uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef BaseTy) {
1332 return wrap(unwrap(Builder)->createSetType(
1333 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1334 LineNumber, SizeInBits, AlignInBits, unwrapDI<DIType>(BaseTy)));
1335 }
1336
LLVMDIBuilderCreateSubrangeType(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,unsigned LineNo,LLVMMetadataRef File,uint64_t SizeInBits,uint32_t AlignInBits,LLVMDIFlags Flags,LLVMMetadataRef BaseTy,LLVMMetadataRef LowerBound,LLVMMetadataRef UpperBound,LLVMMetadataRef Stride,LLVMMetadataRef Bias)1337 LLVMMetadataRef LLVMDIBuilderCreateSubrangeType(
1338 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1339 size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t SizeInBits,
1340 uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef BaseTy,
1341 LLVMMetadataRef LowerBound, LLVMMetadataRef UpperBound,
1342 LLVMMetadataRef Stride, LLVMMetadataRef Bias) {
1343 return wrap(unwrap(Builder)->createSubrangeType(
1344 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, unwrapDI<DIScope>(Scope),
1345 SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1346 unwrapDI<DIType>(BaseTy), unwrap(LowerBound), unwrap(UpperBound),
1347 unwrap(Stride), unwrap(Bias)));
1348 }
1349
1350 /// MD may be nullptr, a DIExpression or DIVariable.
unwrapExprVar(LLVMMetadataRef MD)1351 PointerUnion<DIExpression *, DIVariable *> unwrapExprVar(LLVMMetadataRef MD) {
1352 if (!MD)
1353 return nullptr;
1354 MDNode *MDN = unwrapDI<MDNode>(MD);
1355 if (auto *E = dyn_cast<DIExpression>(MDN))
1356 return E;
1357 assert(isa<DIVariable>(MDN) && "Expected DIExpression or DIVariable");
1358 return cast<DIVariable>(MDN);
1359 }
1360
LLVMDIBuilderCreateDynamicArrayType(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,unsigned LineNo,LLVMMetadataRef File,uint64_t Size,uint32_t AlignInBits,LLVMMetadataRef Ty,LLVMMetadataRef * Subscripts,unsigned NumSubscripts,LLVMMetadataRef DataLocation,LLVMMetadataRef Associated,LLVMMetadataRef Allocated,LLVMMetadataRef Rank,LLVMMetadataRef BitStride)1361 LLVMMetadataRef LLVMDIBuilderCreateDynamicArrayType(
1362 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1363 size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t Size,
1364 uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts,
1365 unsigned NumSubscripts, LLVMMetadataRef DataLocation,
1366 LLVMMetadataRef Associated, LLVMMetadataRef Allocated, LLVMMetadataRef Rank,
1367 LLVMMetadataRef BitStride) {
1368 auto Subs =
1369 unwrap(Builder)->getOrCreateArray({unwrap(Subscripts), NumSubscripts});
1370 return wrap(unwrap(Builder)->createArrayType(
1371 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1372 Size, AlignInBits, unwrapDI<DIType>(Ty), Subs,
1373 unwrapExprVar(DataLocation), unwrapExprVar(Associated),
1374 unwrapExprVar(Allocated), unwrapExprVar(Rank), unwrap(BitStride)));
1375 }
1376
LLVMReplaceArrays(LLVMDIBuilderRef Builder,LLVMMetadataRef * T,LLVMMetadataRef * Elements,unsigned NumElements)1377 void LLVMReplaceArrays(LLVMDIBuilderRef Builder, LLVMMetadataRef *T,
1378 LLVMMetadataRef *Elements, unsigned NumElements) {
1379 auto CT = unwrap<DICompositeType>(*T);
1380 auto Elts =
1381 unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements});
1382 unwrap(Builder)->replaceArrays(CT, Elts);
1383 }
1384
LLVMDIBuilderCreateUnionType(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNumber,uint64_t SizeInBits,uint32_t AlignInBits,LLVMDIFlags Flags,LLVMMetadataRef * Elements,unsigned NumElements,unsigned RunTimeLang,const char * UniqueId,size_t UniqueIdLen)1385 LLVMMetadataRef LLVMDIBuilderCreateUnionType(
1386 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1387 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1388 uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags,
1389 LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang,
1390 const char *UniqueId, size_t UniqueIdLen) {
1391 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1392 NumElements});
1393 return wrap(unwrap(Builder)->createUnionType(
1394 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1395 LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1396 Elts, RunTimeLang, {UniqueId, UniqueIdLen}));
1397 }
1398
1399
1400 LLVMMetadataRef
LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef Builder,uint64_t Size,uint32_t AlignInBits,LLVMMetadataRef Ty,LLVMMetadataRef * Subscripts,unsigned NumSubscripts)1401 LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef Builder, uint64_t Size,
1402 uint32_t AlignInBits, LLVMMetadataRef Ty,
1403 LLVMMetadataRef *Subscripts,
1404 unsigned NumSubscripts) {
1405 auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts),
1406 NumSubscripts});
1407 return wrap(unwrap(Builder)->createArrayType(Size, AlignInBits,
1408 unwrapDI<DIType>(Ty), Subs));
1409 }
1410
1411 LLVMMetadataRef
LLVMDIBuilderCreateVectorType(LLVMDIBuilderRef Builder,uint64_t Size,uint32_t AlignInBits,LLVMMetadataRef Ty,LLVMMetadataRef * Subscripts,unsigned NumSubscripts)1412 LLVMDIBuilderCreateVectorType(LLVMDIBuilderRef Builder, uint64_t Size,
1413 uint32_t AlignInBits, LLVMMetadataRef Ty,
1414 LLVMMetadataRef *Subscripts,
1415 unsigned NumSubscripts) {
1416 auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts),
1417 NumSubscripts});
1418 return wrap(unwrap(Builder)->createVectorType(Size, AlignInBits,
1419 unwrapDI<DIType>(Ty), Subs));
1420 }
1421
1422 LLVMMetadataRef
LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Builder,const char * Name,size_t NameLen,uint64_t SizeInBits,LLVMDWARFTypeEncoding Encoding,LLVMDIFlags Flags)1423 LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Builder, const char *Name,
1424 size_t NameLen, uint64_t SizeInBits,
1425 LLVMDWARFTypeEncoding Encoding,
1426 LLVMDIFlags Flags) {
1427 return wrap(unwrap(Builder)->createBasicType({Name, NameLen},
1428 SizeInBits, Encoding,
1429 map_from_llvmDIFlags(Flags)));
1430 }
1431
LLVMDIBuilderCreatePointerType(LLVMDIBuilderRef Builder,LLVMMetadataRef PointeeTy,uint64_t SizeInBits,uint32_t AlignInBits,unsigned AddressSpace,const char * Name,size_t NameLen)1432 LLVMMetadataRef LLVMDIBuilderCreatePointerType(
1433 LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy,
1434 uint64_t SizeInBits, uint32_t AlignInBits, unsigned AddressSpace,
1435 const char *Name, size_t NameLen) {
1436 return wrap(unwrap(Builder)->createPointerType(
1437 unwrapDI<DIType>(PointeeTy), SizeInBits, AlignInBits, AddressSpace,
1438 {Name, NameLen}));
1439 }
1440
LLVMDIBuilderCreateStructType(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNumber,uint64_t SizeInBits,uint32_t AlignInBits,LLVMDIFlags Flags,LLVMMetadataRef DerivedFrom,LLVMMetadataRef * Elements,unsigned NumElements,unsigned RunTimeLang,LLVMMetadataRef VTableHolder,const char * UniqueId,size_t UniqueIdLen)1441 LLVMMetadataRef LLVMDIBuilderCreateStructType(
1442 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1443 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1444 uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags,
1445 LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements,
1446 unsigned NumElements, unsigned RunTimeLang, LLVMMetadataRef VTableHolder,
1447 const char *UniqueId, size_t UniqueIdLen) {
1448 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1449 NumElements});
1450 return wrap(unwrap(Builder)->createStructType(
1451 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1452 LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1453 unwrapDI<DIType>(DerivedFrom), Elts, RunTimeLang,
1454 unwrapDI<DIType>(VTableHolder), {UniqueId, UniqueIdLen}));
1455 }
1456
LLVMDIBuilderCreateMemberType(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNo,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,LLVMDIFlags Flags,LLVMMetadataRef Ty)1457 LLVMMetadataRef LLVMDIBuilderCreateMemberType(
1458 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1459 size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits,
1460 uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags,
1461 LLVMMetadataRef Ty) {
1462 return wrap(unwrap(Builder)->createMemberType(unwrapDI<DIScope>(Scope),
1463 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, SizeInBits, AlignInBits,
1464 OffsetInBits, map_from_llvmDIFlags(Flags), unwrapDI<DIType>(Ty)));
1465 }
1466
1467 LLVMMetadataRef
LLVMDIBuilderCreateUnspecifiedType(LLVMDIBuilderRef Builder,const char * Name,size_t NameLen)1468 LLVMDIBuilderCreateUnspecifiedType(LLVMDIBuilderRef Builder, const char *Name,
1469 size_t NameLen) {
1470 return wrap(unwrap(Builder)->createUnspecifiedType({Name, NameLen}));
1471 }
1472
LLVMDIBuilderCreateStaticMemberType(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNumber,LLVMMetadataRef Type,LLVMDIFlags Flags,LLVMValueRef ConstantVal,uint32_t AlignInBits)1473 LLVMMetadataRef LLVMDIBuilderCreateStaticMemberType(
1474 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1475 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1476 LLVMMetadataRef Type, LLVMDIFlags Flags, LLVMValueRef ConstantVal,
1477 uint32_t AlignInBits) {
1478 return wrap(unwrap(Builder)->createStaticMemberType(
1479 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1480 LineNumber, unwrapDI<DIType>(Type), map_from_llvmDIFlags(Flags),
1481 unwrap<Constant>(ConstantVal), DW_TAG_member, AlignInBits));
1482 }
1483
1484 LLVMMetadataRef
LLVMDIBuilderCreateObjCIVar(LLVMDIBuilderRef Builder,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNo,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,LLVMDIFlags Flags,LLVMMetadataRef Ty,LLVMMetadataRef PropertyNode)1485 LLVMDIBuilderCreateObjCIVar(LLVMDIBuilderRef Builder,
1486 const char *Name, size_t NameLen,
1487 LLVMMetadataRef File, unsigned LineNo,
1488 uint64_t SizeInBits, uint32_t AlignInBits,
1489 uint64_t OffsetInBits, LLVMDIFlags Flags,
1490 LLVMMetadataRef Ty, LLVMMetadataRef PropertyNode) {
1491 return wrap(unwrap(Builder)->createObjCIVar(
1492 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1493 SizeInBits, AlignInBits, OffsetInBits,
1494 map_from_llvmDIFlags(Flags), unwrapDI<DIType>(Ty),
1495 unwrapDI<MDNode>(PropertyNode)));
1496 }
1497
1498 LLVMMetadataRef
LLVMDIBuilderCreateObjCProperty(LLVMDIBuilderRef Builder,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNo,const char * GetterName,size_t GetterNameLen,const char * SetterName,size_t SetterNameLen,unsigned PropertyAttributes,LLVMMetadataRef Ty)1499 LLVMDIBuilderCreateObjCProperty(LLVMDIBuilderRef Builder,
1500 const char *Name, size_t NameLen,
1501 LLVMMetadataRef File, unsigned LineNo,
1502 const char *GetterName, size_t GetterNameLen,
1503 const char *SetterName, size_t SetterNameLen,
1504 unsigned PropertyAttributes,
1505 LLVMMetadataRef Ty) {
1506 return wrap(unwrap(Builder)->createObjCProperty(
1507 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1508 {GetterName, GetterNameLen}, {SetterName, SetterNameLen},
1509 PropertyAttributes, unwrapDI<DIType>(Ty)));
1510 }
1511
LLVMDIBuilderCreateObjectPointerType(LLVMDIBuilderRef Builder,LLVMMetadataRef Type,LLVMBool Implicit)1512 LLVMMetadataRef LLVMDIBuilderCreateObjectPointerType(LLVMDIBuilderRef Builder,
1513 LLVMMetadataRef Type,
1514 LLVMBool Implicit) {
1515 return wrap(unwrap(Builder)->createObjectPointerType(unwrapDI<DIType>(Type),
1516 Implicit));
1517 }
1518
1519 LLVMMetadataRef
LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Builder,LLVMMetadataRef Type,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNo,LLVMMetadataRef Scope,uint32_t AlignInBits)1520 LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Builder, LLVMMetadataRef Type,
1521 const char *Name, size_t NameLen,
1522 LLVMMetadataRef File, unsigned LineNo,
1523 LLVMMetadataRef Scope, uint32_t AlignInBits) {
1524 return wrap(unwrap(Builder)->createTypedef(
1525 unwrapDI<DIType>(Type), {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1526 unwrapDI<DIScope>(Scope), AlignInBits));
1527 }
1528
1529 LLVMMetadataRef
LLVMDIBuilderCreateInheritance(LLVMDIBuilderRef Builder,LLVMMetadataRef Ty,LLVMMetadataRef BaseTy,uint64_t BaseOffset,uint32_t VBPtrOffset,LLVMDIFlags Flags)1530 LLVMDIBuilderCreateInheritance(LLVMDIBuilderRef Builder,
1531 LLVMMetadataRef Ty, LLVMMetadataRef BaseTy,
1532 uint64_t BaseOffset, uint32_t VBPtrOffset,
1533 LLVMDIFlags Flags) {
1534 return wrap(unwrap(Builder)->createInheritance(
1535 unwrapDI<DIType>(Ty), unwrapDI<DIType>(BaseTy),
1536 BaseOffset, VBPtrOffset, map_from_llvmDIFlags(Flags)));
1537 }
1538
1539 LLVMMetadataRef
LLVMDIBuilderCreateForwardDecl(LLVMDIBuilderRef Builder,unsigned Tag,const char * Name,size_t NameLen,LLVMMetadataRef Scope,LLVMMetadataRef File,unsigned Line,unsigned RuntimeLang,uint64_t SizeInBits,uint32_t AlignInBits,const char * UniqueIdentifier,size_t UniqueIdentifierLen)1540 LLVMDIBuilderCreateForwardDecl(
1541 LLVMDIBuilderRef Builder, unsigned Tag, const char *Name,
1542 size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line,
1543 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
1544 const char *UniqueIdentifier, size_t UniqueIdentifierLen) {
1545 return wrap(unwrap(Builder)->createForwardDecl(
1546 Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope),
1547 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1548 AlignInBits, {UniqueIdentifier, UniqueIdentifierLen}));
1549 }
1550
1551 LLVMMetadataRef
LLVMDIBuilderCreateReplaceableCompositeType(LLVMDIBuilderRef Builder,unsigned Tag,const char * Name,size_t NameLen,LLVMMetadataRef Scope,LLVMMetadataRef File,unsigned Line,unsigned RuntimeLang,uint64_t SizeInBits,uint32_t AlignInBits,LLVMDIFlags Flags,const char * UniqueIdentifier,size_t UniqueIdentifierLen)1552 LLVMDIBuilderCreateReplaceableCompositeType(
1553 LLVMDIBuilderRef Builder, unsigned Tag, const char *Name,
1554 size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line,
1555 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
1556 LLVMDIFlags Flags, const char *UniqueIdentifier,
1557 size_t UniqueIdentifierLen) {
1558 return wrap(unwrap(Builder)->createReplaceableCompositeType(
1559 Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope),
1560 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1561 AlignInBits, map_from_llvmDIFlags(Flags),
1562 {UniqueIdentifier, UniqueIdentifierLen}));
1563 }
1564
1565 LLVMMetadataRef
LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef Builder,unsigned Tag,LLVMMetadataRef Type)1566 LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef Builder, unsigned Tag,
1567 LLVMMetadataRef Type) {
1568 return wrap(unwrap(Builder)->createQualifiedType(Tag,
1569 unwrapDI<DIType>(Type)));
1570 }
1571
1572 LLVMMetadataRef
LLVMDIBuilderCreateReferenceType(LLVMDIBuilderRef Builder,unsigned Tag,LLVMMetadataRef Type)1573 LLVMDIBuilderCreateReferenceType(LLVMDIBuilderRef Builder, unsigned Tag,
1574 LLVMMetadataRef Type) {
1575 return wrap(unwrap(Builder)->createReferenceType(Tag,
1576 unwrapDI<DIType>(Type)));
1577 }
1578
1579 LLVMMetadataRef
LLVMDIBuilderCreateNullPtrType(LLVMDIBuilderRef Builder)1580 LLVMDIBuilderCreateNullPtrType(LLVMDIBuilderRef Builder) {
1581 return wrap(unwrap(Builder)->createNullPtrType());
1582 }
1583
1584 LLVMMetadataRef
LLVMDIBuilderCreateMemberPointerType(LLVMDIBuilderRef Builder,LLVMMetadataRef PointeeType,LLVMMetadataRef ClassType,uint64_t SizeInBits,uint32_t AlignInBits,LLVMDIFlags Flags)1585 LLVMDIBuilderCreateMemberPointerType(LLVMDIBuilderRef Builder,
1586 LLVMMetadataRef PointeeType,
1587 LLVMMetadataRef ClassType,
1588 uint64_t SizeInBits,
1589 uint32_t AlignInBits,
1590 LLVMDIFlags Flags) {
1591 return wrap(unwrap(Builder)->createMemberPointerType(
1592 unwrapDI<DIType>(PointeeType),
1593 unwrapDI<DIType>(ClassType), AlignInBits, SizeInBits,
1594 map_from_llvmDIFlags(Flags)));
1595 }
1596
1597 LLVMMetadataRef
LLVMDIBuilderCreateBitFieldMemberType(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNumber,uint64_t SizeInBits,uint64_t OffsetInBits,uint64_t StorageOffsetInBits,LLVMDIFlags Flags,LLVMMetadataRef Type)1598 LLVMDIBuilderCreateBitFieldMemberType(LLVMDIBuilderRef Builder,
1599 LLVMMetadataRef Scope,
1600 const char *Name, size_t NameLen,
1601 LLVMMetadataRef File, unsigned LineNumber,
1602 uint64_t SizeInBits,
1603 uint64_t OffsetInBits,
1604 uint64_t StorageOffsetInBits,
1605 LLVMDIFlags Flags, LLVMMetadataRef Type) {
1606 return wrap(unwrap(Builder)->createBitFieldMemberType(
1607 unwrapDI<DIScope>(Scope), {Name, NameLen},
1608 unwrapDI<DIFile>(File), LineNumber,
1609 SizeInBits, OffsetInBits, StorageOffsetInBits,
1610 map_from_llvmDIFlags(Flags), unwrapDI<DIType>(Type)));
1611 }
1612
LLVMDIBuilderCreateClassType(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNumber,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,LLVMDIFlags Flags,LLVMMetadataRef DerivedFrom,LLVMMetadataRef * Elements,unsigned NumElements,LLVMMetadataRef VTableHolder,LLVMMetadataRef TemplateParamsNode,const char * UniqueIdentifier,size_t UniqueIdentifierLen)1613 LLVMMetadataRef LLVMDIBuilderCreateClassType(LLVMDIBuilderRef Builder,
1614 LLVMMetadataRef Scope, const char *Name, size_t NameLen,
1615 LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits,
1616 uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags,
1617 LLVMMetadataRef DerivedFrom,
1618 LLVMMetadataRef *Elements, unsigned NumElements,
1619 LLVMMetadataRef VTableHolder, LLVMMetadataRef TemplateParamsNode,
1620 const char *UniqueIdentifier, size_t UniqueIdentifierLen) {
1621 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1622 NumElements});
1623 return wrap(unwrap(Builder)->createClassType(
1624 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1625 LineNumber, SizeInBits, AlignInBits, OffsetInBits,
1626 map_from_llvmDIFlags(Flags), unwrapDI<DIType>(DerivedFrom), Elts,
1627 /*RunTimeLang=*/0, unwrapDI<DIType>(VTableHolder),
1628 unwrapDI<MDNode>(TemplateParamsNode),
1629 {UniqueIdentifier, UniqueIdentifierLen}));
1630 }
1631
1632 LLVMMetadataRef
LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef Builder,LLVMMetadataRef Type)1633 LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef Builder,
1634 LLVMMetadataRef Type) {
1635 return wrap(unwrap(Builder)->createArtificialType(unwrapDI<DIType>(Type)));
1636 }
1637
LLVMGetDINodeTag(LLVMMetadataRef MD)1638 uint16_t LLVMGetDINodeTag(LLVMMetadataRef MD) {
1639 return unwrapDI<DINode>(MD)->getTag();
1640 }
1641
LLVMDITypeGetName(LLVMMetadataRef DType,size_t * Length)1642 const char *LLVMDITypeGetName(LLVMMetadataRef DType, size_t *Length) {
1643 StringRef Str = unwrapDI<DIType>(DType)->getName();
1644 *Length = Str.size();
1645 return Str.data();
1646 }
1647
LLVMDITypeGetSizeInBits(LLVMMetadataRef DType)1648 uint64_t LLVMDITypeGetSizeInBits(LLVMMetadataRef DType) {
1649 return unwrapDI<DIType>(DType)->getSizeInBits();
1650 }
1651
LLVMDITypeGetOffsetInBits(LLVMMetadataRef DType)1652 uint64_t LLVMDITypeGetOffsetInBits(LLVMMetadataRef DType) {
1653 return unwrapDI<DIType>(DType)->getOffsetInBits();
1654 }
1655
LLVMDITypeGetAlignInBits(LLVMMetadataRef DType)1656 uint32_t LLVMDITypeGetAlignInBits(LLVMMetadataRef DType) {
1657 return unwrapDI<DIType>(DType)->getAlignInBits();
1658 }
1659
LLVMDITypeGetLine(LLVMMetadataRef DType)1660 unsigned LLVMDITypeGetLine(LLVMMetadataRef DType) {
1661 return unwrapDI<DIType>(DType)->getLine();
1662 }
1663
LLVMDITypeGetFlags(LLVMMetadataRef DType)1664 LLVMDIFlags LLVMDITypeGetFlags(LLVMMetadataRef DType) {
1665 return map_to_llvmDIFlags(unwrapDI<DIType>(DType)->getFlags());
1666 }
1667
LLVMDIBuilderGetOrCreateTypeArray(LLVMDIBuilderRef Builder,LLVMMetadataRef * Types,size_t Length)1668 LLVMMetadataRef LLVMDIBuilderGetOrCreateTypeArray(LLVMDIBuilderRef Builder,
1669 LLVMMetadataRef *Types,
1670 size_t Length) {
1671 return wrap(
1672 unwrap(Builder)->getOrCreateTypeArray({unwrap(Types), Length}).get());
1673 }
1674
1675 LLVMMetadataRef
LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Builder,LLVMMetadataRef File,LLVMMetadataRef * ParameterTypes,unsigned NumParameterTypes,LLVMDIFlags Flags)1676 LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Builder,
1677 LLVMMetadataRef File,
1678 LLVMMetadataRef *ParameterTypes,
1679 unsigned NumParameterTypes,
1680 LLVMDIFlags Flags) {
1681 auto Elts = unwrap(Builder)->getOrCreateTypeArray({unwrap(ParameterTypes),
1682 NumParameterTypes});
1683 return wrap(unwrap(Builder)->createSubroutineType(
1684 Elts, map_from_llvmDIFlags(Flags)));
1685 }
1686
LLVMDIBuilderCreateExpression(LLVMDIBuilderRef Builder,uint64_t * Addr,size_t Length)1687 LLVMMetadataRef LLVMDIBuilderCreateExpression(LLVMDIBuilderRef Builder,
1688 uint64_t *Addr, size_t Length) {
1689 return wrap(
1690 unwrap(Builder)->createExpression(ArrayRef<uint64_t>(Addr, Length)));
1691 }
1692
1693 LLVMMetadataRef
LLVMDIBuilderCreateConstantValueExpression(LLVMDIBuilderRef Builder,uint64_t Value)1694 LLVMDIBuilderCreateConstantValueExpression(LLVMDIBuilderRef Builder,
1695 uint64_t Value) {
1696 return wrap(unwrap(Builder)->createConstantValueExpression(Value));
1697 }
1698
LLVMDIBuilderCreateGlobalVariableExpression(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,const char * Linkage,size_t LinkLen,LLVMMetadataRef File,unsigned LineNo,LLVMMetadataRef Ty,LLVMBool LocalToUnit,LLVMMetadataRef Expr,LLVMMetadataRef Decl,uint32_t AlignInBits)1699 LLVMMetadataRef LLVMDIBuilderCreateGlobalVariableExpression(
1700 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1701 size_t NameLen, const char *Linkage, size_t LinkLen, LLVMMetadataRef File,
1702 unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit,
1703 LLVMMetadataRef Expr, LLVMMetadataRef Decl, uint32_t AlignInBits) {
1704 return wrap(unwrap(Builder)->createGlobalVariableExpression(
1705 unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LinkLen},
1706 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1707 true, unwrap<DIExpression>(Expr), unwrapDI<MDNode>(Decl),
1708 nullptr, AlignInBits));
1709 }
1710
LLVMDIGlobalVariableExpressionGetVariable(LLVMMetadataRef GVE)1711 LLVMMetadataRef LLVMDIGlobalVariableExpressionGetVariable(LLVMMetadataRef GVE) {
1712 return wrap(unwrapDI<DIGlobalVariableExpression>(GVE)->getVariable());
1713 }
1714
LLVMDIGlobalVariableExpressionGetExpression(LLVMMetadataRef GVE)1715 LLVMMetadataRef LLVMDIGlobalVariableExpressionGetExpression(
1716 LLVMMetadataRef GVE) {
1717 return wrap(unwrapDI<DIGlobalVariableExpression>(GVE)->getExpression());
1718 }
1719
LLVMDIVariableGetFile(LLVMMetadataRef Var)1720 LLVMMetadataRef LLVMDIVariableGetFile(LLVMMetadataRef Var) {
1721 return wrap(unwrapDI<DIVariable>(Var)->getFile());
1722 }
1723
LLVMDIVariableGetScope(LLVMMetadataRef Var)1724 LLVMMetadataRef LLVMDIVariableGetScope(LLVMMetadataRef Var) {
1725 return wrap(unwrapDI<DIVariable>(Var)->getScope());
1726 }
1727
LLVMDIVariableGetLine(LLVMMetadataRef Var)1728 unsigned LLVMDIVariableGetLine(LLVMMetadataRef Var) {
1729 return unwrapDI<DIVariable>(Var)->getLine();
1730 }
1731
LLVMTemporaryMDNode(LLVMContextRef Ctx,LLVMMetadataRef * Data,size_t Count)1732 LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef Ctx, LLVMMetadataRef *Data,
1733 size_t Count) {
1734 return wrap(
1735 MDTuple::getTemporary(*unwrap(Ctx), {unwrap(Data), Count}).release());
1736 }
1737
LLVMDisposeTemporaryMDNode(LLVMMetadataRef TempNode)1738 void LLVMDisposeTemporaryMDNode(LLVMMetadataRef TempNode) {
1739 MDNode::deleteTemporary(unwrapDI<MDNode>(TempNode));
1740 }
1741
LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef TargetMetadata,LLVMMetadataRef Replacement)1742 void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef TargetMetadata,
1743 LLVMMetadataRef Replacement) {
1744 auto *Node = unwrapDI<MDNode>(TargetMetadata);
1745 Node->replaceAllUsesWith(unwrap(Replacement));
1746 MDNode::deleteTemporary(Node);
1747 }
1748
LLVMDIBuilderCreateTempGlobalVariableFwdDecl(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,const char * Linkage,size_t LnkLen,LLVMMetadataRef File,unsigned LineNo,LLVMMetadataRef Ty,LLVMBool LocalToUnit,LLVMMetadataRef Decl,uint32_t AlignInBits)1749 LLVMMetadataRef LLVMDIBuilderCreateTempGlobalVariableFwdDecl(
1750 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1751 size_t NameLen, const char *Linkage, size_t LnkLen, LLVMMetadataRef File,
1752 unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit,
1753 LLVMMetadataRef Decl, uint32_t AlignInBits) {
1754 return wrap(unwrap(Builder)->createTempGlobalVariableFwdDecl(
1755 unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LnkLen},
1756 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1757 unwrapDI<MDNode>(Decl), nullptr, AlignInBits));
1758 }
1759
LLVMDIBuilderInsertDeclareRecordBefore(LLVMDIBuilderRef Builder,LLVMValueRef Storage,LLVMMetadataRef VarInfo,LLVMMetadataRef Expr,LLVMMetadataRef DL,LLVMValueRef Instr)1760 LLVMDbgRecordRef LLVMDIBuilderInsertDeclareRecordBefore(
1761 LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo,
1762 LLVMMetadataRef Expr, LLVMMetadataRef DL, LLVMValueRef Instr) {
1763 DbgInstPtr DbgInst = unwrap(Builder)->insertDeclare(
1764 unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
1765 unwrap<DIExpression>(Expr), unwrap<DILocation>(DL),
1766 Instr ? InsertPosition(unwrap<Instruction>(Instr)->getIterator())
1767 : nullptr);
1768 // This assert will fail if the module is in the old debug info format.
1769 // This function should only be called if the module is in the new
1770 // debug info format.
1771 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1772 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1773 assert(isa<DbgRecord *>(DbgInst) &&
1774 "Function unexpectedly in old debug info format");
1775 return wrap(cast<DbgRecord *>(DbgInst));
1776 }
1777
LLVMDIBuilderInsertDeclareRecordAtEnd(LLVMDIBuilderRef Builder,LLVMValueRef Storage,LLVMMetadataRef VarInfo,LLVMMetadataRef Expr,LLVMMetadataRef DL,LLVMBasicBlockRef Block)1778 LLVMDbgRecordRef LLVMDIBuilderInsertDeclareRecordAtEnd(
1779 LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo,
1780 LLVMMetadataRef Expr, LLVMMetadataRef DL, LLVMBasicBlockRef Block) {
1781 DbgInstPtr DbgInst = unwrap(Builder)->insertDeclare(
1782 unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
1783 unwrap<DIExpression>(Expr), unwrap<DILocation>(DL), unwrap(Block));
1784 // This assert will fail if the module is in the old debug info format.
1785 // This function should only be called if the module is in the new
1786 // debug info format.
1787 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1788 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1789 assert(isa<DbgRecord *>(DbgInst) &&
1790 "Function unexpectedly in old debug info format");
1791 return wrap(cast<DbgRecord *>(DbgInst));
1792 }
1793
LLVMDIBuilderInsertDbgValueRecordBefore(LLVMDIBuilderRef Builder,LLVMValueRef Val,LLVMMetadataRef VarInfo,LLVMMetadataRef Expr,LLVMMetadataRef DebugLoc,LLVMValueRef Instr)1794 LLVMDbgRecordRef LLVMDIBuilderInsertDbgValueRecordBefore(
1795 LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo,
1796 LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMValueRef Instr) {
1797 DbgInstPtr DbgInst = unwrap(Builder)->insertDbgValueIntrinsic(
1798 unwrap(Val), unwrap<DILocalVariable>(VarInfo), unwrap<DIExpression>(Expr),
1799 unwrap<DILocation>(DebugLoc),
1800 Instr ? InsertPosition(unwrap<Instruction>(Instr)->getIterator())
1801 : nullptr);
1802 // This assert will fail if the module is in the old debug info format.
1803 // This function should only be called if the module is in the new
1804 // debug info format.
1805 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1806 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1807 assert(isa<DbgRecord *>(DbgInst) &&
1808 "Function unexpectedly in old debug info format");
1809 return wrap(cast<DbgRecord *>(DbgInst));
1810 }
1811
LLVMDIBuilderInsertDbgValueRecordAtEnd(LLVMDIBuilderRef Builder,LLVMValueRef Val,LLVMMetadataRef VarInfo,LLVMMetadataRef Expr,LLVMMetadataRef DebugLoc,LLVMBasicBlockRef Block)1812 LLVMDbgRecordRef LLVMDIBuilderInsertDbgValueRecordAtEnd(
1813 LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo,
1814 LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMBasicBlockRef Block) {
1815 DbgInstPtr DbgInst = unwrap(Builder)->insertDbgValueIntrinsic(
1816 unwrap(Val), unwrap<DILocalVariable>(VarInfo), unwrap<DIExpression>(Expr),
1817 unwrap<DILocation>(DebugLoc),
1818 Block ? InsertPosition(unwrap(Block)->end()) : nullptr);
1819 // This assert will fail if the module is in the old debug info format.
1820 // This function should only be called if the module is in the new
1821 // debug info format.
1822 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1823 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1824 assert(isa<DbgRecord *>(DbgInst) &&
1825 "Function unexpectedly in old debug info format");
1826 return wrap(cast<DbgRecord *>(DbgInst));
1827 }
1828
LLVMDIBuilderCreateAutoVariable(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNo,LLVMMetadataRef Ty,LLVMBool AlwaysPreserve,LLVMDIFlags Flags,uint32_t AlignInBits)1829 LLVMMetadataRef LLVMDIBuilderCreateAutoVariable(
1830 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1831 size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1832 LLVMBool AlwaysPreserve, LLVMDIFlags Flags, uint32_t AlignInBits) {
1833 return wrap(unwrap(Builder)->createAutoVariable(
1834 unwrap<DIScope>(Scope), {Name, NameLen}, unwrap<DIFile>(File),
1835 LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
1836 map_from_llvmDIFlags(Flags), AlignInBits));
1837 }
1838
LLVMDIBuilderCreateParameterVariable(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,unsigned ArgNo,LLVMMetadataRef File,unsigned LineNo,LLVMMetadataRef Ty,LLVMBool AlwaysPreserve,LLVMDIFlags Flags)1839 LLVMMetadataRef LLVMDIBuilderCreateParameterVariable(
1840 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1841 size_t NameLen, unsigned ArgNo, LLVMMetadataRef File, unsigned LineNo,
1842 LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags) {
1843 return wrap(unwrap(Builder)->createParameterVariable(
1844 unwrap<DIScope>(Scope), {Name, NameLen}, ArgNo, unwrap<DIFile>(File),
1845 LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
1846 map_from_llvmDIFlags(Flags)));
1847 }
1848
LLVMDIBuilderGetOrCreateSubrange(LLVMDIBuilderRef Builder,int64_t Lo,int64_t Count)1849 LLVMMetadataRef LLVMDIBuilderGetOrCreateSubrange(LLVMDIBuilderRef Builder,
1850 int64_t Lo, int64_t Count) {
1851 return wrap(unwrap(Builder)->getOrCreateSubrange(Lo, Count));
1852 }
1853
LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef Builder,LLVMMetadataRef * Data,size_t Length)1854 LLVMMetadataRef LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef Builder,
1855 LLVMMetadataRef *Data,
1856 size_t Length) {
1857 Metadata **DataValue = unwrap(Data);
1858 return wrap(unwrap(Builder)->getOrCreateArray({DataValue, Length}).get());
1859 }
1860
LLVMGetSubprogram(LLVMValueRef Func)1861 LLVMMetadataRef LLVMGetSubprogram(LLVMValueRef Func) {
1862 return wrap(unwrap<Function>(Func)->getSubprogram());
1863 }
1864
LLVMSetSubprogram(LLVMValueRef Func,LLVMMetadataRef SP)1865 void LLVMSetSubprogram(LLVMValueRef Func, LLVMMetadataRef SP) {
1866 unwrap<Function>(Func)->setSubprogram(unwrap<DISubprogram>(SP));
1867 }
1868
LLVMDISubprogramGetLine(LLVMMetadataRef Subprogram)1869 unsigned LLVMDISubprogramGetLine(LLVMMetadataRef Subprogram) {
1870 return unwrapDI<DISubprogram>(Subprogram)->getLine();
1871 }
1872
LLVMDISubprogramReplaceType(LLVMMetadataRef Subprogram,LLVMMetadataRef SubroutineType)1873 void LLVMDISubprogramReplaceType(LLVMMetadataRef Subprogram,
1874 LLVMMetadataRef SubroutineType) {
1875 unwrapDI<DISubprogram>(Subprogram)
1876 ->replaceType(unwrapDI<DISubroutineType>(SubroutineType));
1877 }
1878
LLVMInstructionGetDebugLoc(LLVMValueRef Inst)1879 LLVMMetadataRef LLVMInstructionGetDebugLoc(LLVMValueRef Inst) {
1880 return wrap(unwrap<Instruction>(Inst)->getDebugLoc().getAsMDNode());
1881 }
1882
LLVMInstructionSetDebugLoc(LLVMValueRef Inst,LLVMMetadataRef Loc)1883 void LLVMInstructionSetDebugLoc(LLVMValueRef Inst, LLVMMetadataRef Loc) {
1884 if (Loc)
1885 unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc(unwrap<MDNode>(Loc)));
1886 else
1887 unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc());
1888 }
1889
LLVMDIBuilderCreateLabel(LLVMDIBuilderRef Builder,LLVMMetadataRef Context,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNo,LLVMBool AlwaysPreserve)1890 LLVMMetadataRef LLVMDIBuilderCreateLabel(LLVMDIBuilderRef Builder,
1891 LLVMMetadataRef Context,
1892 const char *Name, size_t NameLen,
1893 LLVMMetadataRef File, unsigned LineNo,
1894 LLVMBool AlwaysPreserve) {
1895 return wrap(unwrap(Builder)->createLabel(
1896 unwrapDI<DIScope>(Context), StringRef(Name, NameLen),
1897 unwrapDI<DIFile>(File), LineNo, /*Column*/ 0, /*IsArtificial*/ false,
1898 /*CoroSuspendIdx*/ std::nullopt, AlwaysPreserve));
1899 }
1900
LLVMDIBuilderInsertLabelBefore(LLVMDIBuilderRef Builder,LLVMMetadataRef LabelInfo,LLVMMetadataRef Location,LLVMValueRef InsertBefore)1901 LLVMDbgRecordRef LLVMDIBuilderInsertLabelBefore(LLVMDIBuilderRef Builder,
1902 LLVMMetadataRef LabelInfo,
1903 LLVMMetadataRef Location,
1904 LLVMValueRef InsertBefore) {
1905 DbgInstPtr DbgInst = unwrap(Builder)->insertLabel(
1906 unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location),
1907 InsertBefore
1908 ? InsertPosition(unwrap<Instruction>(InsertBefore)->getIterator())
1909 : nullptr);
1910 // This assert will fail if the module is in the old debug info format.
1911 // This function should only be called if the module is in the new
1912 // debug info format.
1913 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1914 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1915 assert(isa<DbgRecord *>(DbgInst) &&
1916 "Function unexpectedly in old debug info format");
1917 return wrap(cast<DbgRecord *>(DbgInst));
1918 }
1919
LLVMDIBuilderInsertLabelAtEnd(LLVMDIBuilderRef Builder,LLVMMetadataRef LabelInfo,LLVMMetadataRef Location,LLVMBasicBlockRef InsertAtEnd)1920 LLVMDbgRecordRef LLVMDIBuilderInsertLabelAtEnd(LLVMDIBuilderRef Builder,
1921 LLVMMetadataRef LabelInfo,
1922 LLVMMetadataRef Location,
1923 LLVMBasicBlockRef InsertAtEnd) {
1924 DbgInstPtr DbgInst = unwrap(Builder)->insertLabel(
1925 unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location),
1926 InsertAtEnd ? InsertPosition(unwrap(InsertAtEnd)->end()) : nullptr);
1927 // This assert will fail if the module is in the old debug info format.
1928 // This function should only be called if the module is in the new
1929 // debug info format.
1930 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1931 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1932 assert(isa<DbgRecord *>(DbgInst) &&
1933 "Function unexpectedly in old debug info format");
1934 return wrap(cast<DbgRecord *>(DbgInst));
1935 }
1936
LLVMGetMetadataKind(LLVMMetadataRef Metadata)1937 LLVMMetadataKind LLVMGetMetadataKind(LLVMMetadataRef Metadata) {
1938 switch(unwrap(Metadata)->getMetadataID()) {
1939 #define HANDLE_METADATA_LEAF(CLASS) \
1940 case Metadata::CLASS##Kind: \
1941 return (LLVMMetadataKind)LLVM##CLASS##MetadataKind;
1942 #include "llvm/IR/Metadata.def"
1943 default:
1944 return (LLVMMetadataKind)LLVMGenericDINodeMetadataKind;
1945 }
1946 }
1947
getAssignmentInsts(DIAssignID * ID)1948 AssignmentInstRange at::getAssignmentInsts(DIAssignID *ID) {
1949 assert(ID && "Expected non-null ID");
1950 LLVMContext &Ctx = ID->getContext();
1951 auto &Map = Ctx.pImpl->AssignmentIDToInstrs;
1952
1953 auto MapIt = Map.find(ID);
1954 if (MapIt == Map.end())
1955 return make_range(nullptr, nullptr);
1956
1957 return make_range(MapIt->second.begin(), MapIt->second.end());
1958 }
1959
getAssignmentMarkers(DIAssignID * ID)1960 AssignmentMarkerRange at::getAssignmentMarkers(DIAssignID *ID) {
1961 assert(ID && "Expected non-null ID");
1962 LLVMContext &Ctx = ID->getContext();
1963
1964 auto *IDAsValue = MetadataAsValue::getIfExists(Ctx, ID);
1965
1966 // The ID is only used wrapped in MetadataAsValue(ID), so lets check that
1967 // one of those already exists first.
1968 if (!IDAsValue)
1969 return make_range(Value::user_iterator(), Value::user_iterator());
1970
1971 return make_range(IDAsValue->user_begin(), IDAsValue->user_end());
1972 }
1973
deleteAssignmentMarkers(const Instruction * Inst)1974 void at::deleteAssignmentMarkers(const Instruction *Inst) {
1975 auto Range = getAssignmentMarkers(Inst);
1976 SmallVector<DbgVariableRecord *> DVRAssigns = getDVRAssignmentMarkers(Inst);
1977 if (Range.empty() && DVRAssigns.empty())
1978 return;
1979 SmallVector<DbgAssignIntrinsic *> ToDelete(Range.begin(), Range.end());
1980 for (auto *DAI : ToDelete)
1981 DAI->eraseFromParent();
1982 for (auto *DVR : DVRAssigns)
1983 DVR->eraseFromParent();
1984 }
1985
RAUW(DIAssignID * Old,DIAssignID * New)1986 void at::RAUW(DIAssignID *Old, DIAssignID *New) {
1987 // Replace attachments.
1988 AssignmentInstRange InstRange = getAssignmentInsts(Old);
1989 // Use intermediate storage for the instruction ptrs because the
1990 // getAssignmentInsts range iterators will be invalidated by adding and
1991 // removing DIAssignID attachments.
1992 SmallVector<Instruction *> InstVec(InstRange.begin(), InstRange.end());
1993 for (auto *I : InstVec)
1994 I->setMetadata(LLVMContext::MD_DIAssignID, New);
1995
1996 Old->replaceAllUsesWith(New);
1997 }
1998
deleteAll(Function * F)1999 void at::deleteAll(Function *F) {
2000 SmallVector<DbgAssignIntrinsic *, 12> ToDelete;
2001 SmallVector<DbgVariableRecord *, 12> DPToDelete;
2002 for (BasicBlock &BB : *F) {
2003 for (Instruction &I : BB) {
2004 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange()))
2005 if (DVR.isDbgAssign())
2006 DPToDelete.push_back(&DVR);
2007 if (auto *DAI = dyn_cast<DbgAssignIntrinsic>(&I))
2008 ToDelete.push_back(DAI);
2009 else
2010 I.setMetadata(LLVMContext::MD_DIAssignID, nullptr);
2011 }
2012 }
2013 for (auto *DAI : ToDelete)
2014 DAI->eraseFromParent();
2015 for (auto *DVR : DPToDelete)
2016 DVR->eraseFromParent();
2017 }
2018
2019 /// FIXME: Remove this wrapper function and call
2020 /// DIExpression::calculateFragmentIntersect directly.
2021 template <typename T>
calculateFragmentIntersectImpl(const DataLayout & DL,const Value * Dest,uint64_t SliceOffsetInBits,uint64_t SliceSizeInBits,const T * AssignRecord,std::optional<DIExpression::FragmentInfo> & Result)2022 bool calculateFragmentIntersectImpl(
2023 const DataLayout &DL, const Value *Dest, uint64_t SliceOffsetInBits,
2024 uint64_t SliceSizeInBits, const T *AssignRecord,
2025 std::optional<DIExpression::FragmentInfo> &Result) {
2026 // No overlap if this DbgRecord describes a killed location.
2027 if (AssignRecord->isKillAddress())
2028 return false;
2029
2030 int64_t AddrOffsetInBits;
2031 {
2032 int64_t AddrOffsetInBytes;
2033 SmallVector<uint64_t> PostOffsetOps; //< Unused.
2034 // Bail if we can't find a constant offset (or none) in the expression.
2035 if (!AssignRecord->getAddressExpression()->extractLeadingOffset(
2036 AddrOffsetInBytes, PostOffsetOps))
2037 return false;
2038 AddrOffsetInBits = AddrOffsetInBytes * 8;
2039 }
2040
2041 Value *Addr = AssignRecord->getAddress();
2042 // FIXME: It may not always be zero.
2043 int64_t BitExtractOffsetInBits = 0;
2044 DIExpression::FragmentInfo VarFrag =
2045 AssignRecord->getFragmentOrEntireVariable();
2046
2047 int64_t OffsetFromLocationInBits; //< Unused.
2048 return DIExpression::calculateFragmentIntersect(
2049 DL, Dest, SliceOffsetInBits, SliceSizeInBits, Addr, AddrOffsetInBits,
2050 BitExtractOffsetInBits, VarFrag, Result, OffsetFromLocationInBits);
2051 }
2052
2053 /// FIXME: Remove this wrapper function and call
2054 /// DIExpression::calculateFragmentIntersect directly.
calculateFragmentIntersect(const DataLayout & DL,const Value * Dest,uint64_t SliceOffsetInBits,uint64_t SliceSizeInBits,const DbgAssignIntrinsic * DbgAssign,std::optional<DIExpression::FragmentInfo> & Result)2055 bool at::calculateFragmentIntersect(
2056 const DataLayout &DL, const Value *Dest, uint64_t SliceOffsetInBits,
2057 uint64_t SliceSizeInBits, const DbgAssignIntrinsic *DbgAssign,
2058 std::optional<DIExpression::FragmentInfo> &Result) {
2059 return calculateFragmentIntersectImpl(DL, Dest, SliceOffsetInBits,
2060 SliceSizeInBits, DbgAssign, Result);
2061 }
2062
2063 /// FIXME: Remove this wrapper function and call
2064 /// DIExpression::calculateFragmentIntersect directly.
calculateFragmentIntersect(const DataLayout & DL,const Value * Dest,uint64_t SliceOffsetInBits,uint64_t SliceSizeInBits,const DbgVariableRecord * DVRAssign,std::optional<DIExpression::FragmentInfo> & Result)2065 bool at::calculateFragmentIntersect(
2066 const DataLayout &DL, const Value *Dest, uint64_t SliceOffsetInBits,
2067 uint64_t SliceSizeInBits, const DbgVariableRecord *DVRAssign,
2068 std::optional<DIExpression::FragmentInfo> &Result) {
2069 return calculateFragmentIntersectImpl(DL, Dest, SliceOffsetInBits,
2070 SliceSizeInBits, DVRAssign, Result);
2071 }
2072
2073 /// Update inlined instructions' DIAssignID metadata. We need to do this
2074 /// otherwise a function inlined more than once into the same function
2075 /// will cause DIAssignID to be shared by many instructions.
remapAssignID(DenseMap<DIAssignID *,DIAssignID * > & Map,Instruction & I)2076 void at::remapAssignID(DenseMap<DIAssignID *, DIAssignID *> &Map,
2077 Instruction &I) {
2078 auto GetNewID = [&Map](Metadata *Old) {
2079 DIAssignID *OldID = cast<DIAssignID>(Old);
2080 if (DIAssignID *NewID = Map.lookup(OldID))
2081 return NewID;
2082 DIAssignID *NewID = DIAssignID::getDistinct(OldID->getContext());
2083 Map[OldID] = NewID;
2084 return NewID;
2085 };
2086 // If we find a DIAssignID attachment or use, replace it with a new version.
2087 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
2088 if (DVR.isDbgAssign())
2089 DVR.setAssignId(GetNewID(DVR.getAssignID()));
2090 }
2091 if (auto *ID = I.getMetadata(LLVMContext::MD_DIAssignID))
2092 I.setMetadata(LLVMContext::MD_DIAssignID, GetNewID(ID));
2093 else if (auto *DAI = dyn_cast<DbgAssignIntrinsic>(&I))
2094 DAI->setAssignId(GetNewID(DAI->getAssignID()));
2095 }
2096
2097 /// Collect constant properies (base, size, offset) of \p StoreDest.
2098 /// Return std::nullopt if any properties are not constants or the
2099 /// offset from the base pointer is negative.
2100 static std::optional<AssignmentInfo>
getAssignmentInfoImpl(const DataLayout & DL,const Value * StoreDest,TypeSize SizeInBits)2101 getAssignmentInfoImpl(const DataLayout &DL, const Value *StoreDest,
2102 TypeSize SizeInBits) {
2103 if (SizeInBits.isScalable())
2104 return std::nullopt;
2105 APInt GEPOffset(DL.getIndexTypeSizeInBits(StoreDest->getType()), 0);
2106 const Value *Base = StoreDest->stripAndAccumulateConstantOffsets(
2107 DL, GEPOffset, /*AllowNonInbounds*/ true);
2108
2109 if (GEPOffset.isNegative())
2110 return std::nullopt;
2111
2112 uint64_t OffsetInBytes = GEPOffset.getLimitedValue();
2113 // Check for overflow.
2114 if (OffsetInBytes == UINT64_MAX)
2115 return std::nullopt;
2116 if (const auto *Alloca = dyn_cast<AllocaInst>(Base))
2117 return AssignmentInfo(DL, Alloca, OffsetInBytes * 8, SizeInBits);
2118 return std::nullopt;
2119 }
2120
getAssignmentInfo(const DataLayout & DL,const MemIntrinsic * I)2121 std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2122 const MemIntrinsic *I) {
2123 const Value *StoreDest = I->getRawDest();
2124 // Assume 8 bit bytes.
2125 auto *ConstLengthInBytes = dyn_cast<ConstantInt>(I->getLength());
2126 if (!ConstLengthInBytes)
2127 // We can't use a non-const size, bail.
2128 return std::nullopt;
2129 uint64_t SizeInBits = 8 * ConstLengthInBytes->getZExtValue();
2130 return getAssignmentInfoImpl(DL, StoreDest, TypeSize::getFixed(SizeInBits));
2131 }
2132
getAssignmentInfo(const DataLayout & DL,const StoreInst * SI)2133 std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2134 const StoreInst *SI) {
2135 TypeSize SizeInBits = DL.getTypeSizeInBits(SI->getValueOperand()->getType());
2136 return getAssignmentInfoImpl(DL, SI->getPointerOperand(), SizeInBits);
2137 }
2138
getAssignmentInfo(const DataLayout & DL,const AllocaInst * AI)2139 std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2140 const AllocaInst *AI) {
2141 TypeSize SizeInBits = DL.getTypeSizeInBits(AI->getAllocatedType());
2142 return getAssignmentInfoImpl(DL, AI, SizeInBits);
2143 }
2144
2145 /// Returns nullptr if the assignment shouldn't be attributed to this variable.
emitDbgAssign(AssignmentInfo Info,Value * Val,Value * Dest,Instruction & StoreLikeInst,const VarRecord & VarRec,DIBuilder & DIB)2146 static void emitDbgAssign(AssignmentInfo Info, Value *Val, Value *Dest,
2147 Instruction &StoreLikeInst, const VarRecord &VarRec,
2148 DIBuilder &DIB) {
2149 auto *ID = StoreLikeInst.getMetadata(LLVMContext::MD_DIAssignID);
2150 assert(ID && "Store instruction must have DIAssignID metadata");
2151 (void)ID;
2152
2153 const uint64_t StoreStartBit = Info.OffsetInBits;
2154 const uint64_t StoreEndBit = Info.OffsetInBits + Info.SizeInBits;
2155
2156 uint64_t FragStartBit = StoreStartBit;
2157 uint64_t FragEndBit = StoreEndBit;
2158
2159 bool StoreToWholeVariable = Info.StoreToWholeAlloca;
2160 if (auto Size = VarRec.Var->getSizeInBits()) {
2161 // NOTE: trackAssignments doesn't understand base expressions yet, so all
2162 // variables that reach here are guaranteed to start at offset 0 in the
2163 // alloca.
2164 const uint64_t VarStartBit = 0;
2165 const uint64_t VarEndBit = *Size;
2166
2167 // FIXME: trim FragStartBit when nonzero VarStartBit is supported.
2168 FragEndBit = std::min(FragEndBit, VarEndBit);
2169
2170 // Discard stores to bits outside this variable.
2171 if (FragStartBit >= FragEndBit)
2172 return;
2173
2174 StoreToWholeVariable = FragStartBit <= VarStartBit && FragEndBit >= *Size;
2175 }
2176
2177 DIExpression *Expr = DIExpression::get(StoreLikeInst.getContext(), {});
2178 if (!StoreToWholeVariable) {
2179 auto R = DIExpression::createFragmentExpression(Expr, FragStartBit,
2180 FragEndBit - FragStartBit);
2181 assert(R.has_value() && "failed to create fragment expression");
2182 Expr = *R;
2183 }
2184 DIExpression *AddrExpr = DIExpression::get(StoreLikeInst.getContext(), {});
2185 auto *Assign = DbgVariableRecord::createLinkedDVRAssign(
2186 &StoreLikeInst, Val, VarRec.Var, Expr, Dest, AddrExpr, VarRec.DL);
2187 (void)Assign;
2188 LLVM_DEBUG(if (Assign) errs() << " > INSERT: " << *Assign << "\n");
2189 }
2190
2191 #undef DEBUG_TYPE // Silence redefinition warning (from ConstantsContext.h).
2192 #define DEBUG_TYPE "assignment-tracking"
2193
trackAssignments(Function::iterator Start,Function::iterator End,const StorageToVarsMap & Vars,const DataLayout & DL,bool DebugPrints)2194 void at::trackAssignments(Function::iterator Start, Function::iterator End,
2195 const StorageToVarsMap &Vars, const DataLayout &DL,
2196 bool DebugPrints) {
2197 // Early-exit if there are no interesting variables.
2198 if (Vars.empty())
2199 return;
2200
2201 auto &Ctx = Start->getContext();
2202 auto &Module = *Start->getModule();
2203
2204 // Poison type doesn't matter, so long as it isn't void. Let's just use i1.
2205 auto *Poison = PoisonValue::get(Type::getInt1Ty(Ctx));
2206 DIBuilder DIB(Module, /*AllowUnresolved*/ false);
2207
2208 // Scan the instructions looking for stores to local variables' storage.
2209 LLVM_DEBUG(errs() << "# Scanning instructions\n");
2210 for (auto BBI = Start; BBI != End; ++BBI) {
2211 for (Instruction &I : *BBI) {
2212
2213 std::optional<AssignmentInfo> Info;
2214 Value *ValueComponent = nullptr;
2215 Value *DestComponent = nullptr;
2216 if (auto *AI = dyn_cast<AllocaInst>(&I)) {
2217 // We want to track the variable's stack home from its alloca's
2218 // position onwards so we treat it as an assignment (where the stored
2219 // value is poison).
2220 Info = getAssignmentInfo(DL, AI);
2221 ValueComponent = Poison;
2222 DestComponent = AI;
2223 } else if (auto *SI = dyn_cast<StoreInst>(&I)) {
2224 Info = getAssignmentInfo(DL, SI);
2225 ValueComponent = SI->getValueOperand();
2226 DestComponent = SI->getPointerOperand();
2227 } else if (auto *MI = dyn_cast<MemTransferInst>(&I)) {
2228 Info = getAssignmentInfo(DL, MI);
2229 // May not be able to represent this value easily.
2230 ValueComponent = Poison;
2231 DestComponent = MI->getOperand(0);
2232 } else if (auto *MI = dyn_cast<MemSetInst>(&I)) {
2233 Info = getAssignmentInfo(DL, MI);
2234 // If we're zero-initing we can state the assigned value is zero,
2235 // otherwise use undef.
2236 auto *ConstValue = dyn_cast<ConstantInt>(MI->getOperand(1));
2237 if (ConstValue && ConstValue->isZero())
2238 ValueComponent = ConstValue;
2239 else
2240 ValueComponent = Poison;
2241 DestComponent = MI->getOperand(0);
2242 } else {
2243 // Not a store-like instruction.
2244 continue;
2245 }
2246
2247 assert(ValueComponent && DestComponent);
2248 LLVM_DEBUG(errs() << "SCAN: Found store-like: " << I << "\n");
2249
2250 // Check if getAssignmentInfo failed to understand this store.
2251 if (!Info.has_value()) {
2252 LLVM_DEBUG(
2253 errs()
2254 << " | SKIP: Untrackable store (e.g. through non-const gep)\n");
2255 continue;
2256 }
2257 LLVM_DEBUG(errs() << " | BASE: " << *Info->Base << "\n");
2258
2259 // Check if the store destination is a local variable with debug info.
2260 auto LocalIt = Vars.find(Info->Base);
2261 if (LocalIt == Vars.end()) {
2262 LLVM_DEBUG(
2263 errs()
2264 << " | SKIP: Base address not associated with local variable\n");
2265 continue;
2266 }
2267
2268 DIAssignID *ID =
2269 cast_or_null<DIAssignID>(I.getMetadata(LLVMContext::MD_DIAssignID));
2270 if (!ID) {
2271 ID = DIAssignID::getDistinct(Ctx);
2272 I.setMetadata(LLVMContext::MD_DIAssignID, ID);
2273 }
2274
2275 for (const VarRecord &R : LocalIt->second)
2276 emitDbgAssign(*Info, ValueComponent, DestComponent, I, R, DIB);
2277 }
2278 }
2279 }
2280
runOnFunction(Function & F)2281 bool AssignmentTrackingPass::runOnFunction(Function &F) {
2282 // No value in assignment tracking without optimisations.
2283 if (F.hasFnAttribute(Attribute::OptimizeNone))
2284 return /*Changed*/ false;
2285
2286 bool Changed = false;
2287 auto *DL = &F.getDataLayout();
2288 // Collect a map of {backing storage : dbg.declares} (currently "backing
2289 // storage" is limited to Allocas). We'll use this to find dbg.declares to
2290 // delete after running `trackAssignments`.
2291 DenseMap<const AllocaInst *, SmallPtrSet<DbgDeclareInst *, 2>> DbgDeclares;
2292 DenseMap<const AllocaInst *, SmallPtrSet<DbgVariableRecord *, 2>> DVRDeclares;
2293 // Create another similar map of {storage : variables} that we'll pass to
2294 // trackAssignments.
2295 StorageToVarsMap Vars;
2296 auto ProcessDeclare = [&](auto *Declare, auto &DeclareList) {
2297 // FIXME: trackAssignments doesn't let you specify any modifiers to the
2298 // variable (e.g. fragment) or location (e.g. offset), so we have to
2299 // leave dbg.declares with non-empty expressions in place.
2300 if (Declare->getExpression()->getNumElements() != 0)
2301 return;
2302 if (!Declare->getAddress())
2303 return;
2304 if (AllocaInst *Alloca =
2305 dyn_cast<AllocaInst>(Declare->getAddress()->stripPointerCasts())) {
2306 // FIXME: Skip VLAs for now (let these variables use dbg.declares).
2307 if (!Alloca->isStaticAlloca())
2308 return;
2309 // Similarly, skip scalable vectors (use dbg.declares instead).
2310 if (auto Sz = Alloca->getAllocationSize(*DL); Sz && Sz->isScalable())
2311 return;
2312 DeclareList[Alloca].insert(Declare);
2313 Vars[Alloca].insert(VarRecord(Declare));
2314 }
2315 };
2316 for (auto &BB : F) {
2317 for (auto &I : BB) {
2318 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
2319 if (DVR.isDbgDeclare())
2320 ProcessDeclare(&DVR, DVRDeclares);
2321 }
2322 if (DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(&I))
2323 ProcessDeclare(DDI, DbgDeclares);
2324 }
2325 }
2326
2327 // FIXME: Locals can be backed by caller allocas (sret, byval).
2328 // Note: trackAssignments doesn't respect dbg.declare's IR positions (as it
2329 // doesn't "understand" dbg.declares). However, this doesn't appear to break
2330 // any rules given this description of dbg.declare from
2331 // llvm/docs/SourceLevelDebugging.rst:
2332 //
2333 // It is not control-dependent, meaning that if a call to llvm.dbg.declare
2334 // exists and has a valid location argument, that address is considered to
2335 // be the true home of the variable across its entire lifetime.
2336 trackAssignments(F.begin(), F.end(), Vars, *DL);
2337
2338 // Delete dbg.declares for variables now tracked with assignment tracking.
2339 auto DeleteSubsumedDeclare = [&](const auto &Markers, auto &Declares) {
2340 (void)Markers;
2341 for (auto *Declare : Declares) {
2342 // Assert that the alloca that Declare uses is now linked to a dbg.assign
2343 // describing the same variable (i.e. check that this dbg.declare has
2344 // been replaced by a dbg.assign). Use DebugVariableAggregate to Discard
2345 // the fragment part because trackAssignments may alter the
2346 // fragment. e.g. if the alloca is smaller than the variable, then
2347 // trackAssignments will create an alloca-sized fragment for the
2348 // dbg.assign.
2349 assert(llvm::any_of(Markers, [Declare](auto *Assign) {
2350 return DebugVariableAggregate(Assign) ==
2351 DebugVariableAggregate(Declare);
2352 }));
2353 // Delete Declare because the variable location is now tracked using
2354 // assignment tracking.
2355 Declare->eraseFromParent();
2356 Changed = true;
2357 }
2358 };
2359 for (auto &P : DbgDeclares)
2360 DeleteSubsumedDeclare(at::getAssignmentMarkers(P.first), P.second);
2361 for (auto &P : DVRDeclares)
2362 DeleteSubsumedDeclare(at::getDVRAssignmentMarkers(P.first), P.second);
2363 return Changed;
2364 }
2365
2366 static const char *AssignmentTrackingModuleFlag =
2367 "debug-info-assignment-tracking";
2368
setAssignmentTrackingModuleFlag(Module & M)2369 static void setAssignmentTrackingModuleFlag(Module &M) {
2370 M.setModuleFlag(Module::ModFlagBehavior::Max, AssignmentTrackingModuleFlag,
2371 ConstantAsMetadata::get(
2372 ConstantInt::get(Type::getInt1Ty(M.getContext()), 1)));
2373 }
2374
getAssignmentTrackingModuleFlag(const Module & M)2375 static bool getAssignmentTrackingModuleFlag(const Module &M) {
2376 Metadata *Value = M.getModuleFlag(AssignmentTrackingModuleFlag);
2377 return Value && !cast<ConstantAsMetadata>(Value)->getValue()->isZeroValue();
2378 }
2379
isAssignmentTrackingEnabled(const Module & M)2380 bool llvm::isAssignmentTrackingEnabled(const Module &M) {
2381 return getAssignmentTrackingModuleFlag(M);
2382 }
2383
run(Function & F,FunctionAnalysisManager & AM)2384 PreservedAnalyses AssignmentTrackingPass::run(Function &F,
2385 FunctionAnalysisManager &AM) {
2386 if (!runOnFunction(F))
2387 return PreservedAnalyses::all();
2388
2389 // Record that this module uses assignment tracking. It doesn't matter that
2390 // some functons in the module may not use it - the debug info in those
2391 // functions will still be handled properly.
2392 setAssignmentTrackingModuleFlag(*F.getParent());
2393
2394 // Q: Can we return a less conservative set than just CFGAnalyses? Can we
2395 // return PreservedAnalyses::all()?
2396 PreservedAnalyses PA;
2397 PA.preserveSet<CFGAnalyses>();
2398 return PA;
2399 }
2400
run(Module & M,ModuleAnalysisManager & AM)2401 PreservedAnalyses AssignmentTrackingPass::run(Module &M,
2402 ModuleAnalysisManager &AM) {
2403 bool Changed = false;
2404 for (auto &F : M)
2405 Changed |= runOnFunction(F);
2406
2407 if (!Changed)
2408 return PreservedAnalyses::all();
2409
2410 // Record that this module uses assignment tracking.
2411 setAssignmentTrackingModuleFlag(M);
2412
2413 // Q: Can we return a less conservative set than just CFGAnalyses? Can we
2414 // return PreservedAnalyses::all()?
2415 PreservedAnalyses PA;
2416 PA.preserveSet<CFGAnalyses>();
2417 return PA;
2418 }
2419
2420 #undef DEBUG_TYPE
2421