1f53a7b45SEugene Zelenko //===- DebugInfo.cpp - Debug Information Helper Classes -------------------===//
2ef860a24SChandler Carruth //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ef860a24SChandler Carruth //
7ef860a24SChandler Carruth //===----------------------------------------------------------------------===//
8ef860a24SChandler Carruth //
9ef860a24SChandler Carruth // This file implements the helper classes used to build and interpret debug
10ef860a24SChandler Carruth // information in LLVM IR form.
11ef860a24SChandler Carruth //
12ef860a24SChandler Carruth //===----------------------------------------------------------------------===//
13ef860a24SChandler Carruth 
14789164d4Swhitequark #include "llvm-c/DebugInfo.h"
15f53a7b45SEugene Zelenko #include "llvm/ADT/DenseMap.h"
16f53a7b45SEugene Zelenko #include "llvm/ADT/DenseSet.h"
17789164d4Swhitequark #include "llvm/ADT/STLExtras.h"
18ef860a24SChandler Carruth #include "llvm/ADT/SmallPtrSet.h"
19f53a7b45SEugene Zelenko #include "llvm/ADT/SmallVector.h"
20f53a7b45SEugene Zelenko #include "llvm/ADT/StringRef.h"
21f53a7b45SEugene Zelenko #include "llvm/IR/BasicBlock.h"
229fb823bbSChandler Carruth #include "llvm/IR/Constants.h"
23*e188aae4Sserge-sans-paille #include "llvm/IR/DIBuilder.h"
24*e188aae4Sserge-sans-paille #include "llvm/IR/DebugInfo.h"
25f53a7b45SEugene Zelenko #include "llvm/IR/DebugInfoMetadata.h"
26f53a7b45SEugene Zelenko #include "llvm/IR/DebugLoc.h"
27f53a7b45SEugene Zelenko #include "llvm/IR/Function.h"
28b550cb17SMehdi Amini #include "llvm/IR/GVMaterializer.h"
29f53a7b45SEugene Zelenko #include "llvm/IR/Instruction.h"
309fb823bbSChandler Carruth #include "llvm/IR/IntrinsicInst.h"
31f53a7b45SEugene Zelenko #include "llvm/IR/LLVMContext.h"
32f53a7b45SEugene Zelenko #include "llvm/IR/Metadata.h"
339fb823bbSChandler Carruth #include "llvm/IR/Module.h"
34f53a7b45SEugene Zelenko #include "llvm/Support/Casting.h"
35f53a7b45SEugene Zelenko #include <algorithm>
36f53a7b45SEugene Zelenko #include <cassert>
37f53a7b45SEugene Zelenko #include <utility>
38f53a7b45SEugene Zelenko 
39ef860a24SChandler Carruth using namespace llvm;
40ef860a24SChandler Carruth using namespace llvm::dwarf;
41ef860a24SChandler Carruth 
420ebf9a8eSOCHyams /// Finds all intrinsics declaring local variables as living in the memory that
430ebf9a8eSOCHyams /// 'V' points to. This may include a mix of dbg.declare and
440ebf9a8eSOCHyams /// dbg.addr intrinsics.
FindDbgAddrUses(Value * V)450ebf9a8eSOCHyams TinyPtrVector<DbgVariableIntrinsic *> llvm::FindDbgAddrUses(Value *V) {
460ebf9a8eSOCHyams   // This function is hot. Check whether the value has any metadata to avoid a
470ebf9a8eSOCHyams   // DenseMap lookup.
480ebf9a8eSOCHyams   if (!V->isUsedByMetadata())
490ebf9a8eSOCHyams     return {};
500ebf9a8eSOCHyams   auto *L = LocalAsMetadata::getIfExists(V);
510ebf9a8eSOCHyams   if (!L)
520ebf9a8eSOCHyams     return {};
530ebf9a8eSOCHyams   auto *MDV = MetadataAsValue::getIfExists(V->getContext(), L);
540ebf9a8eSOCHyams   if (!MDV)
550ebf9a8eSOCHyams     return {};
560ebf9a8eSOCHyams 
570ebf9a8eSOCHyams   TinyPtrVector<DbgVariableIntrinsic *> Declares;
580ebf9a8eSOCHyams   for (User *U : MDV->users()) {
590ebf9a8eSOCHyams     if (auto *DII = dyn_cast<DbgVariableIntrinsic>(U))
600ebf9a8eSOCHyams       if (DII->isAddressOfVariable())
610ebf9a8eSOCHyams         Declares.push_back(DII);
620ebf9a8eSOCHyams   }
630ebf9a8eSOCHyams 
640ebf9a8eSOCHyams   return Declares;
650ebf9a8eSOCHyams }
660ebf9a8eSOCHyams 
FindDbgDeclareUses(Value * V)670ebf9a8eSOCHyams TinyPtrVector<DbgDeclareInst *> llvm::FindDbgDeclareUses(Value *V) {
680ebf9a8eSOCHyams   TinyPtrVector<DbgDeclareInst *> DDIs;
690ebf9a8eSOCHyams   for (DbgVariableIntrinsic *DVI : FindDbgAddrUses(V))
700ebf9a8eSOCHyams     if (auto *DDI = dyn_cast<DbgDeclareInst>(DVI))
710ebf9a8eSOCHyams       DDIs.push_back(DDI);
720ebf9a8eSOCHyams   return DDIs;
730ebf9a8eSOCHyams }
740ebf9a8eSOCHyams 
findDbgValues(SmallVectorImpl<DbgValueInst * > & DbgValues,Value * V)750ebf9a8eSOCHyams void llvm::findDbgValues(SmallVectorImpl<DbgValueInst *> &DbgValues, Value *V) {
760ebf9a8eSOCHyams   // This function is hot. Check whether the value has any metadata to avoid a
770ebf9a8eSOCHyams   // DenseMap lookup.
780ebf9a8eSOCHyams   if (!V->isUsedByMetadata())
790ebf9a8eSOCHyams     return;
800ebf9a8eSOCHyams   // TODO: If this value appears multiple times in a DIArgList, we should still
810ebf9a8eSOCHyams   // only add the owning DbgValueInst once; use this set to track ArgListUsers.
820ebf9a8eSOCHyams   // This behaviour can be removed when we can automatically remove duplicates.
830ebf9a8eSOCHyams   SmallPtrSet<DbgValueInst *, 4> EncounteredDbgValues;
840ebf9a8eSOCHyams   if (auto *L = LocalAsMetadata::getIfExists(V)) {
850ebf9a8eSOCHyams     if (auto *MDV = MetadataAsValue::getIfExists(V->getContext(), L)) {
860ebf9a8eSOCHyams       for (User *U : MDV->users())
870ebf9a8eSOCHyams         if (DbgValueInst *DVI = dyn_cast<DbgValueInst>(U))
880ebf9a8eSOCHyams           DbgValues.push_back(DVI);
890ebf9a8eSOCHyams     }
900ebf9a8eSOCHyams     for (Metadata *AL : L->getAllArgListUsers()) {
910ebf9a8eSOCHyams       if (auto *MDV = MetadataAsValue::getIfExists(V->getContext(), AL)) {
920ebf9a8eSOCHyams         for (User *U : MDV->users())
930ebf9a8eSOCHyams           if (DbgValueInst *DVI = dyn_cast<DbgValueInst>(U))
940ebf9a8eSOCHyams             if (EncounteredDbgValues.insert(DVI).second)
950ebf9a8eSOCHyams               DbgValues.push_back(DVI);
960ebf9a8eSOCHyams       }
970ebf9a8eSOCHyams     }
980ebf9a8eSOCHyams   }
990ebf9a8eSOCHyams }
1000ebf9a8eSOCHyams 
findDbgUsers(SmallVectorImpl<DbgVariableIntrinsic * > & DbgUsers,Value * V)1010ebf9a8eSOCHyams void llvm::findDbgUsers(SmallVectorImpl<DbgVariableIntrinsic *> &DbgUsers,
1020ebf9a8eSOCHyams                         Value *V) {
1030ebf9a8eSOCHyams   // This function is hot. Check whether the value has any metadata to avoid a
1040ebf9a8eSOCHyams   // DenseMap lookup.
1050ebf9a8eSOCHyams   if (!V->isUsedByMetadata())
1060ebf9a8eSOCHyams     return;
1070ebf9a8eSOCHyams   // TODO: If this value appears multiple times in a DIArgList, we should still
1080ebf9a8eSOCHyams   // only add the owning DbgValueInst once; use this set to track ArgListUsers.
1090ebf9a8eSOCHyams   // This behaviour can be removed when we can automatically remove duplicates.
1100ebf9a8eSOCHyams   SmallPtrSet<DbgVariableIntrinsic *, 4> EncounteredDbgValues;
1110ebf9a8eSOCHyams   if (auto *L = LocalAsMetadata::getIfExists(V)) {
1120ebf9a8eSOCHyams     if (auto *MDV = MetadataAsValue::getIfExists(V->getContext(), L)) {
1130ebf9a8eSOCHyams       for (User *U : MDV->users())
1140ebf9a8eSOCHyams         if (DbgVariableIntrinsic *DII = dyn_cast<DbgVariableIntrinsic>(U))
1150ebf9a8eSOCHyams           DbgUsers.push_back(DII);
1160ebf9a8eSOCHyams     }
1170ebf9a8eSOCHyams     for (Metadata *AL : L->getAllArgListUsers()) {
1180ebf9a8eSOCHyams       if (auto *MDV = MetadataAsValue::getIfExists(V->getContext(), AL)) {
1190ebf9a8eSOCHyams         for (User *U : MDV->users())
1200ebf9a8eSOCHyams           if (DbgVariableIntrinsic *DII = dyn_cast<DbgVariableIntrinsic>(U))
1210ebf9a8eSOCHyams             if (EncounteredDbgValues.insert(DII).second)
1220ebf9a8eSOCHyams               DbgUsers.push_back(DII);
1230ebf9a8eSOCHyams       }
1240ebf9a8eSOCHyams     }
1250ebf9a8eSOCHyams   }
1260ebf9a8eSOCHyams }
1270ebf9a8eSOCHyams 
getDISubprogram(const MDNode * Scope)128a9308c49SDuncan P. N. Exon Smith DISubprogram *llvm::getDISubprogram(const MDNode *Scope) {
129a9308c49SDuncan P. N. Exon Smith   if (auto *LocalScope = dyn_cast_or_null<DILocalScope>(Scope))
130dd77af87SDuncan P. N. Exon Smith     return LocalScope->getSubprogram();
131dd77af87SDuncan P. N. Exon Smith   return nullptr;
132ef860a24SChandler Carruth }
133ef860a24SChandler Carruth 
134ef860a24SChandler Carruth //===----------------------------------------------------------------------===//
135ef860a24SChandler Carruth // DebugInfoFinder implementations.
136ef860a24SChandler Carruth //===----------------------------------------------------------------------===//
137ef860a24SChandler Carruth 
reset()1389974c88fSManman Ren void DebugInfoFinder::reset() {
1399974c88fSManman Ren   CUs.clear();
1409974c88fSManman Ren   SPs.clear();
1419974c88fSManman Ren   GVs.clear();
1429974c88fSManman Ren   TYs.clear();
1439974c88fSManman Ren   Scopes.clear();
1449974c88fSManman Ren   NodesSeen.clear();
1452085cccfSManman Ren }
1469974c88fSManman Ren 
processModule(const Module & M)147ef860a24SChandler Carruth void DebugInfoFinder::processModule(const Module &M) {
148dab10b54SRoman Tereshin   for (auto *CU : M.debug_compile_units())
149dab10b54SRoman Tereshin     processCompileUnit(CU);
15030779772SKeno Fischer   for (auto &F : M.functions()) {
15175819aedSAdrian Prantl     if (auto *SP = cast_or_null<DISubprogram>(F.getSubprogram()))
15275819aedSAdrian Prantl       processSubprogram(SP);
15330779772SKeno Fischer     // There could be subprograms from inlined functions referenced from
15430779772SKeno Fischer     // instructions only. Walk the function to find them.
155dab10b54SRoman Tereshin     for (const BasicBlock &BB : F)
156dab10b54SRoman Tereshin       for (const Instruction &I : BB)
157dab10b54SRoman Tereshin         processInstruction(M, I);
158d769eb36SRoman Tereshin   }
159d769eb36SRoman Tereshin }
160d769eb36SRoman Tereshin 
processCompileUnit(DICompileUnit * CU)161d769eb36SRoman Tereshin void DebugInfoFinder::processCompileUnit(DICompileUnit *CU) {
162d769eb36SRoman Tereshin   if (!addCompileUnit(CU))
163d769eb36SRoman Tereshin     return;
164d769eb36SRoman Tereshin   for (auto DIG : CU->getGlobalVariables()) {
165d769eb36SRoman Tereshin     if (!addGlobalVariable(DIG))
16630779772SKeno Fischer       continue;
167d769eb36SRoman Tereshin     auto *GV = DIG->getVariable();
168d769eb36SRoman Tereshin     processScope(GV->getScope());
169da82ce99SFangrui Song     processType(GV->getType());
17030779772SKeno Fischer   }
171d769eb36SRoman Tereshin   for (auto *ET : CU->getEnumTypes())
172d769eb36SRoman Tereshin     processType(ET);
173d769eb36SRoman Tereshin   for (auto *RT : CU->getRetainedTypes())
174d769eb36SRoman Tereshin     if (auto *T = dyn_cast<DIType>(RT))
175d769eb36SRoman Tereshin       processType(T);
176d769eb36SRoman Tereshin     else
177d769eb36SRoman Tereshin       processSubprogram(cast<DISubprogram>(RT));
178d769eb36SRoman Tereshin   for (auto *Import : CU->getImportedEntities()) {
179da82ce99SFangrui Song     auto *Entity = Import->getEntity();
180d769eb36SRoman Tereshin     if (auto *T = dyn_cast<DIType>(Entity))
181d769eb36SRoman Tereshin       processType(T);
182d769eb36SRoman Tereshin     else if (auto *SP = dyn_cast<DISubprogram>(Entity))
183d769eb36SRoman Tereshin       processSubprogram(SP);
184d769eb36SRoman Tereshin     else if (auto *NS = dyn_cast<DINamespace>(Entity))
185d769eb36SRoman Tereshin       processScope(NS->getScope());
186d769eb36SRoman Tereshin     else if (auto *M = dyn_cast<DIModule>(Entity))
187d769eb36SRoman Tereshin       processScope(M->getScope());
18830779772SKeno Fischer   }
189ef860a24SChandler Carruth }
190ef860a24SChandler Carruth 
processInstruction(const Module & M,const Instruction & I)191dab10b54SRoman Tereshin void DebugInfoFinder::processInstruction(const Module &M,
192dab10b54SRoman Tereshin                                          const Instruction &I) {
193ecd2aaeeSFangrui Song   if (auto *DVI = dyn_cast<DbgVariableIntrinsic>(&I))
194ecd2aaeeSFangrui Song     processVariable(M, *DVI);
195dab10b54SRoman Tereshin 
196dab10b54SRoman Tereshin   if (auto DbgLoc = I.getDebugLoc())
197dab10b54SRoman Tereshin     processLocation(M, DbgLoc.get());
198dab10b54SRoman Tereshin }
199dab10b54SRoman Tereshin 
processLocation(const Module & M,const DILocation * Loc)200a9308c49SDuncan P. N. Exon Smith void DebugInfoFinder::processLocation(const Module &M, const DILocation *Loc) {
201523bea8aSBill Wendling   if (!Loc)
202523bea8aSBill Wendling     return;
203b7e221baSDuncan P. N. Exon Smith   processScope(Loc->getScope());
204b7e221baSDuncan P. N. Exon Smith   processLocation(M, Loc->getInlinedAt());
205ef860a24SChandler Carruth }
206ef860a24SChandler Carruth 
processType(DIType * DT)207a9308c49SDuncan P. N. Exon Smith void DebugInfoFinder::processType(DIType *DT) {
208ef860a24SChandler Carruth   if (!addType(DT))
209ef860a24SChandler Carruth     return;
210da82ce99SFangrui Song   processScope(DT->getScope());
211260fa8a7SDuncan P. N. Exon Smith   if (auto *ST = dyn_cast<DISubroutineType>(DT)) {
212da82ce99SFangrui Song     for (DIType *Ref : ST->getTypeArray())
213da82ce99SFangrui Song       processType(Ref);
214f8a1967cSManman Ren     return;
215f8a1967cSManman Ren   }
216260fa8a7SDuncan P. N. Exon Smith   if (auto *DCT = dyn_cast<DICompositeType>(DT)) {
217da82ce99SFangrui Song     processType(DCT->getBaseType());
2181433fd46SAnders Waldenborg     for (Metadata *D : DCT->getElements()) {
219a9308c49SDuncan P. N. Exon Smith       if (auto *T = dyn_cast<DIType>(D))
2209d1cf4c1SDuncan P. N. Exon Smith         processType(T);
221a9308c49SDuncan P. N. Exon Smith       else if (auto *SP = dyn_cast<DISubprogram>(D))
2229d1cf4c1SDuncan P. N. Exon Smith         processSubprogram(SP);
223ef860a24SChandler Carruth     }
224260fa8a7SDuncan P. N. Exon Smith     return;
225260fa8a7SDuncan P. N. Exon Smith   }
226260fa8a7SDuncan P. N. Exon Smith   if (auto *DDT = dyn_cast<DIDerivedType>(DT)) {
227da82ce99SFangrui Song     processType(DDT->getBaseType());
228ef860a24SChandler Carruth   }
229ef860a24SChandler Carruth }
230ef860a24SChandler Carruth 
processScope(DIScope * Scope)231a9308c49SDuncan P. N. Exon Smith void DebugInfoFinder::processScope(DIScope *Scope) {
2329d1cf4c1SDuncan P. N. Exon Smith   if (!Scope)
2339d1cf4c1SDuncan P. N. Exon Smith     return;
234a9308c49SDuncan P. N. Exon Smith   if (auto *Ty = dyn_cast<DIType>(Scope)) {
23514dd2a65SManman Ren     processType(Ty);
23614dd2a65SManman Ren     return;
23714dd2a65SManman Ren   }
238a9308c49SDuncan P. N. Exon Smith   if (auto *CU = dyn_cast<DICompileUnit>(Scope)) {
2399d1cf4c1SDuncan P. N. Exon Smith     addCompileUnit(CU);
2408f1a3cf4SManman Ren     return;
2418f1a3cf4SManman Ren   }
242a9308c49SDuncan P. N. Exon Smith   if (auto *SP = dyn_cast<DISubprogram>(Scope)) {
2439d1cf4c1SDuncan P. N. Exon Smith     processSubprogram(SP);
2448f1a3cf4SManman Ren     return;
2458f1a3cf4SManman Ren   }
24614dd2a65SManman Ren   if (!addScope(Scope))
24714dd2a65SManman Ren     return;
248a9308c49SDuncan P. N. Exon Smith   if (auto *LB = dyn_cast<DILexicalBlockBase>(Scope)) {
249537b4a81SDuncan P. N. Exon Smith     processScope(LB->getScope());
250a9308c49SDuncan P. N. Exon Smith   } else if (auto *NS = dyn_cast<DINamespace>(Scope)) {
25120caafbfSDuncan P. N. Exon Smith     processScope(NS->getScope());
252ab1243feSAdrian Prantl   } else if (auto *M = dyn_cast<DIModule>(Scope)) {
253ab1243feSAdrian Prantl     processScope(M->getScope());
25414dd2a65SManman Ren   }
25514dd2a65SManman Ren }
25614dd2a65SManman Ren 
processSubprogram(DISubprogram * SP)257a9308c49SDuncan P. N. Exon Smith void DebugInfoFinder::processSubprogram(DISubprogram *SP) {
258ef860a24SChandler Carruth   if (!addSubprogram(SP))
259ef860a24SChandler Carruth     return;
260da82ce99SFangrui Song   processScope(SP->getScope());
261d769eb36SRoman Tereshin   // Some of the users, e.g. CloneFunctionInto / CloneModule, need to set up a
262d769eb36SRoman Tereshin   // ValueMap containing identity mappings for all of the DICompileUnit's, not
263d769eb36SRoman Tereshin   // just DISubprogram's, referenced from anywhere within the Function being
264d769eb36SRoman Tereshin   // cloned prior to calling MapMetadata / RemapInstruction to avoid their
265d769eb36SRoman Tereshin   // duplication later as DICompileUnit's are also directly referenced by
266d769eb36SRoman Tereshin   // llvm.dbg.cu list. Thefore we need to collect DICompileUnit's here as well.
267d769eb36SRoman Tereshin   // Also, DICompileUnit's may reference DISubprogram's too and therefore need
268d769eb36SRoman Tereshin   // to be at least looked through.
269d769eb36SRoman Tereshin   processCompileUnit(SP->getUnit());
270537b4a81SDuncan P. N. Exon Smith   processType(SP->getType());
271537b4a81SDuncan P. N. Exon Smith   for (auto *Element : SP->getTemplateParams()) {
272a9308c49SDuncan P. N. Exon Smith     if (auto *TType = dyn_cast<DITemplateTypeParameter>(Element)) {
273da82ce99SFangrui Song       processType(TType->getType());
274a9308c49SDuncan P. N. Exon Smith     } else if (auto *TVal = dyn_cast<DITemplateValueParameter>(Element)) {
275da82ce99SFangrui Song       processType(TVal->getType());
2765477cfb5SManman Ren     }
2775477cfb5SManman Ren   }
278ef860a24SChandler Carruth }
279ef860a24SChandler Carruth 
processVariable(const Module & M,const DbgVariableIntrinsic & DVI)280ecd2aaeeSFangrui Song void DebugInfoFinder::processVariable(const Module &M,
281ecd2aaeeSFangrui Song                                       const DbgVariableIntrinsic &DVI) {
282ecd2aaeeSFangrui Song   auto *N = dyn_cast<MDNode>(DVI.getVariable());
283523bea8aSBill Wendling   if (!N)
284523bea8aSBill Wendling     return;
2859974c88fSManman Ren 
286a9308c49SDuncan P. N. Exon Smith   auto *DV = dyn_cast<DILocalVariable>(N);
2879d1cf4c1SDuncan P. N. Exon Smith   if (!DV)
2889974c88fSManman Ren     return;
2899974c88fSManman Ren 
29070573dcdSDavid Blaikie   if (!NodesSeen.insert(DV).second)
2919974c88fSManman Ren     return;
2927348ddaaSDuncan P. N. Exon Smith   processScope(DV->getScope());
293da82ce99SFangrui Song   processType(DV->getType());
2949974c88fSManman Ren }
2959974c88fSManman Ren 
addType(DIType * DT)296a9308c49SDuncan P. N. Exon Smith bool DebugInfoFinder::addType(DIType *DT) {
297921382edSManman Ren   if (!DT)
298ef860a24SChandler Carruth     return false;
299ef860a24SChandler Carruth 
30070573dcdSDavid Blaikie   if (!NodesSeen.insert(DT).second)
301ef860a24SChandler Carruth     return false;
302ef860a24SChandler Carruth 
303a9308c49SDuncan P. N. Exon Smith   TYs.push_back(const_cast<DIType *>(DT));
304ef860a24SChandler Carruth   return true;
305ef860a24SChandler Carruth }
306ef860a24SChandler Carruth 
addCompileUnit(DICompileUnit * CU)307a9308c49SDuncan P. N. Exon Smith bool DebugInfoFinder::addCompileUnit(DICompileUnit *CU) {
308921382edSManman Ren   if (!CU)
309921382edSManman Ren     return false;
31070573dcdSDavid Blaikie   if (!NodesSeen.insert(CU).second)
311ef860a24SChandler Carruth     return false;
312ef860a24SChandler Carruth 
313ef860a24SChandler Carruth   CUs.push_back(CU);
314ef860a24SChandler Carruth   return true;
315ef860a24SChandler Carruth }
316ef860a24SChandler Carruth 
addGlobalVariable(DIGlobalVariableExpression * DIG)317bceaaa96SAdrian Prantl bool DebugInfoFinder::addGlobalVariable(DIGlobalVariableExpression *DIG) {
31870573dcdSDavid Blaikie   if (!NodesSeen.insert(DIG).second)
319ef860a24SChandler Carruth     return false;
320ef860a24SChandler Carruth 
321ef860a24SChandler Carruth   GVs.push_back(DIG);
322ef860a24SChandler Carruth   return true;
323ef860a24SChandler Carruth }
324ef860a24SChandler Carruth 
addSubprogram(DISubprogram * SP)325a9308c49SDuncan P. N. Exon Smith bool DebugInfoFinder::addSubprogram(DISubprogram *SP) {
326921382edSManman Ren   if (!SP)
327ef860a24SChandler Carruth     return false;
328ef860a24SChandler Carruth 
32970573dcdSDavid Blaikie   if (!NodesSeen.insert(SP).second)
330ef860a24SChandler Carruth     return false;
331ef860a24SChandler Carruth 
332ef860a24SChandler Carruth   SPs.push_back(SP);
333ef860a24SChandler Carruth   return true;
334ef860a24SChandler Carruth }
335ef860a24SChandler Carruth 
addScope(DIScope * Scope)336a9308c49SDuncan P. N. Exon Smith bool DebugInfoFinder::addScope(DIScope *Scope) {
33719b4986bSManman Ren   if (!Scope)
33819b4986bSManman Ren     return false;
339b75e0c92SManman Ren   // FIXME: Ocaml binding generates a scope with no content, we treat it
340b75e0c92SManman Ren   // as null for now.
341b75e0c92SManman Ren   if (Scope->getNumOperands() == 0)
342b75e0c92SManman Ren     return false;
34370573dcdSDavid Blaikie   if (!NodesSeen.insert(Scope).second)
34419b4986bSManman Ren     return false;
34519b4986bSManman Ren   Scopes.push_back(Scope);
34619b4986bSManman Ren   return true;
34719b4986bSManman Ren }
34819b4986bSManman Ren 
updateLoopMetadataDebugLocationsImpl(MDNode * OrigLoopID,function_ref<Metadata * (Metadata *)> Updater)349a2cc80bcSVedant Kumar static MDNode *updateLoopMetadataDebugLocationsImpl(
350f3869a5cSAdrian Prantl     MDNode *OrigLoopID, function_ref<Metadata *(Metadata *)> Updater) {
351a2cc80bcSVedant Kumar   assert(OrigLoopID && OrigLoopID->getNumOperands() > 0 &&
352a2cc80bcSVedant Kumar          "Loop ID needs at least one operand");
353a2cc80bcSVedant Kumar   assert(OrigLoopID && OrigLoopID->getOperand(0).get() == OrigLoopID &&
354a2cc80bcSVedant Kumar          "Loop ID should refer to itself");
355a2cc80bcSVedant Kumar 
356a2cc80bcSVedant Kumar   // Save space for the self-referential LoopID.
357a2cc80bcSVedant Kumar   SmallVector<Metadata *, 4> MDs = {nullptr};
358a2cc80bcSVedant Kumar 
359a2cc80bcSVedant Kumar   for (unsigned i = 1; i < OrigLoopID->getNumOperands(); ++i) {
360a2cc80bcSVedant Kumar     Metadata *MD = OrigLoopID->getOperand(i);
361f3869a5cSAdrian Prantl     if (!MD)
362f3869a5cSAdrian Prantl       MDs.push_back(nullptr);
363f3869a5cSAdrian Prantl     else if (Metadata *NewMD = Updater(MD))
364f3869a5cSAdrian Prantl       MDs.push_back(NewMD);
365a2cc80bcSVedant Kumar   }
366a2cc80bcSVedant Kumar 
367a2cc80bcSVedant Kumar   MDNode *NewLoopID = MDNode::getDistinct(OrigLoopID->getContext(), MDs);
368a2cc80bcSVedant Kumar   // Insert the self-referential LoopID.
369a2cc80bcSVedant Kumar   NewLoopID->replaceOperandWith(0, NewLoopID);
370a2cc80bcSVedant Kumar   return NewLoopID;
371a2cc80bcSVedant Kumar }
372a2cc80bcSVedant Kumar 
updateLoopMetadataDebugLocations(Instruction & I,function_ref<Metadata * (Metadata *)> Updater)373a2cc80bcSVedant Kumar void llvm::updateLoopMetadataDebugLocations(
374f3869a5cSAdrian Prantl     Instruction &I, function_ref<Metadata *(Metadata *)> Updater) {
375a2cc80bcSVedant Kumar   MDNode *OrigLoopID = I.getMetadata(LLVMContext::MD_loop);
376a2cc80bcSVedant Kumar   if (!OrigLoopID)
377a2cc80bcSVedant Kumar     return;
378a2cc80bcSVedant Kumar   MDNode *NewLoopID = updateLoopMetadataDebugLocationsImpl(OrigLoopID, Updater);
379a2cc80bcSVedant Kumar   I.setMetadata(LLVMContext::MD_loop, NewLoopID);
380a2cc80bcSVedant Kumar }
381a2cc80bcSVedant Kumar 
382f3869a5cSAdrian Prantl /// Return true if a node is a DILocation or if a DILocation is
383f3869a5cSAdrian Prantl /// indirectly referenced by one of the node's children.
isDILocationReachable(SmallPtrSetImpl<Metadata * > & Visited,SmallPtrSetImpl<Metadata * > & Reachable,Metadata * MD)384f3869a5cSAdrian Prantl static bool isDILocationReachable(SmallPtrSetImpl<Metadata *> &Visited,
385f3869a5cSAdrian Prantl                                   SmallPtrSetImpl<Metadata *> &Reachable,
386f3869a5cSAdrian Prantl                                   Metadata *MD) {
387f3869a5cSAdrian Prantl   MDNode *N = dyn_cast_or_null<MDNode>(MD);
388f3869a5cSAdrian Prantl   if (!N)
389f3869a5cSAdrian Prantl     return false;
390fcfaed4aSAdrian Prantl   if (isa<DILocation>(N) || Reachable.count(N))
391f3869a5cSAdrian Prantl     return true;
392f3869a5cSAdrian Prantl   if (!Visited.insert(N).second)
393f3869a5cSAdrian Prantl     return false;
394f3869a5cSAdrian Prantl   for (auto &OpIt : N->operands()) {
395f3869a5cSAdrian Prantl     Metadata *Op = OpIt.get();
396f3869a5cSAdrian Prantl     if (isDILocationReachable(Visited, Reachable, Op)) {
397f3869a5cSAdrian Prantl       Reachable.insert(N);
398f3869a5cSAdrian Prantl       return true;
399f3869a5cSAdrian Prantl     }
400f3869a5cSAdrian Prantl   }
401f3869a5cSAdrian Prantl   return false;
402f3869a5cSAdrian Prantl }
403f3869a5cSAdrian Prantl 
stripDebugLocFromLoopID(MDNode * N)404f53a7b45SEugene Zelenko static MDNode *stripDebugLocFromLoopID(MDNode *N) {
405fdaa7421SJordan Rose   assert(!N->operands().empty() && "Missing self reference?");
406f3869a5cSAdrian Prantl   SmallPtrSet<Metadata *, 8> Visited, DILocationReachable;
407f3869a5cSAdrian Prantl   // If we already visited N, there is nothing to do.
408f3869a5cSAdrian Prantl   if (!Visited.insert(N).second)
409f3869a5cSAdrian Prantl     return N;
410b96a945bSDaniel Sanders 
411f3869a5cSAdrian Prantl   // If there is no debug location, we do not have to rewrite this
412f3869a5cSAdrian Prantl   // MDNode. This loop also initializes DILocationReachable, later
413f3869a5cSAdrian Prantl   // needed by updateLoopMetadataDebugLocationsImpl; the use of
414f3869a5cSAdrian Prantl   // count_if avoids an early exit.
415f3869a5cSAdrian Prantl   if (!std::count_if(N->op_begin() + 1, N->op_end(),
416f3869a5cSAdrian Prantl                      [&Visited, &DILocationReachable](const MDOperand &Op) {
417fcfaed4aSAdrian Prantl                        return isDILocationReachable(
418f3869a5cSAdrian Prantl                                   Visited, DILocationReachable, Op.get());
4199b4b8c8dSTeresa Johnson                      }))
420b96a945bSDaniel Sanders     return N;
421b96a945bSDaniel Sanders 
4229b4b8c8dSTeresa Johnson   // If there is only the debug location without any actual loop metadata, we
423b96a945bSDaniel Sanders   // can remove the metadata.
424f3869a5cSAdrian Prantl   if (std::all_of(
425f3869a5cSAdrian Prantl           N->op_begin() + 1, N->op_end(),
426f3869a5cSAdrian Prantl           [&Visited, &DILocationReachable](const MDOperand &Op) {
427fcfaed4aSAdrian Prantl             return isDILocationReachable(Visited, DILocationReachable,
428f3869a5cSAdrian Prantl                                          Op.get());
4299b4b8c8dSTeresa Johnson           }))
430b96a945bSDaniel Sanders     return nullptr;
431b96a945bSDaniel Sanders 
432f3869a5cSAdrian Prantl   return updateLoopMetadataDebugLocationsImpl(
433f3869a5cSAdrian Prantl       N, [&DILocationReachable](Metadata *MD) -> Metadata * {
434f3869a5cSAdrian Prantl         if (isa<DILocation>(MD) || DILocationReachable.count(MD))
435a2cc80bcSVedant Kumar           return nullptr;
436f3869a5cSAdrian Prantl         return MD;
437f3869a5cSAdrian Prantl       });
438b96a945bSDaniel Sanders }
439b96a945bSDaniel Sanders 
stripDebugInfo(Function & F)4400d68b4c5SRafael Espindola bool llvm::stripDebugInfo(Function &F) {
4410d68b4c5SRafael Espindola   bool Changed = false;
4420deb9a9aSBenjamin Kramer   if (F.hasMetadata(LLVMContext::MD_dbg)) {
443d4bff303SPeter Collingbourne     Changed = true;
444d4bff303SPeter Collingbourne     F.setSubprogram(nullptr);
445d4bff303SPeter Collingbourne   }
446581f0e14SMehdi Amini 
447f53a7b45SEugene Zelenko   DenseMap<MDNode *, MDNode *> LoopIDsMap;
4480d68b4c5SRafael Espindola   for (BasicBlock &BB : F) {
44987e53a0aSKazu Hirata     for (Instruction &I : llvm::make_early_inc_range(BB)) {
450db8dd551SMehdi Amini       if (isa<DbgInfoIntrinsic>(&I)) {
451db8dd551SMehdi Amini         I.eraseFromParent();
452581f0e14SMehdi Amini         Changed = true;
453bbedb149SMehdi Amini         continue;
454581f0e14SMehdi Amini       }
4550d68b4c5SRafael Espindola       if (I.getDebugLoc()) {
4560d68b4c5SRafael Espindola         Changed = true;
4570d68b4c5SRafael Espindola         I.setDebugLoc(DebugLoc());
4580d68b4c5SRafael Espindola       }
45979f46a30SAdrian Prantl       if (auto *LoopID = I.getMetadata(LLVMContext::MD_loop)) {
460b96a945bSDaniel Sanders         auto *NewLoopID = LoopIDsMap.lookup(LoopID);
461b96a945bSDaniel Sanders         if (!NewLoopID)
462b96a945bSDaniel Sanders           NewLoopID = LoopIDsMap[LoopID] = stripDebugLocFromLoopID(LoopID);
463b96a945bSDaniel Sanders         if (NewLoopID != LoopID)
46479f46a30SAdrian Prantl           I.setMetadata(LLVMContext::MD_loop, NewLoopID);
46579f46a30SAdrian Prantl       }
466c3a18bb1SAdrian Prantl       // Strip heapallocsite attachments, they point into the DIType system.
467c3a18bb1SAdrian Prantl       if (I.hasMetadataOtherThanDebugLoc())
468c3a18bb1SAdrian Prantl         I.setMetadata("heapallocsite", nullptr);
469b96a945bSDaniel Sanders     }
4700d68b4c5SRafael Espindola   }
4710d68b4c5SRafael Espindola   return Changed;
4720d68b4c5SRafael Espindola }
4730d68b4c5SRafael Espindola 
StripDebugInfo(Module & M)474cb14bbccSManman Ren bool llvm::StripDebugInfo(Module &M) {
475cb14bbccSManman Ren   bool Changed = false;
476cb14bbccSManman Ren 
477b4bed1cbSKazu Hirata   for (NamedMDNode &NMD : llvm::make_early_inc_range(M.named_metadata())) {
47884bd58e9SDavide Italiano     // We're stripping debug info, and without them, coverage information
47984bd58e9SDavide Italiano     // doesn't quite make sense.
480b4bed1cbSKazu Hirata     if (NMD.getName().startswith("llvm.dbg.") ||
481b4bed1cbSKazu Hirata         NMD.getName() == "llvm.gcov") {
482b4bed1cbSKazu Hirata       NMD.eraseFromParent();
483cb14bbccSManman Ren       Changed = true;
484cb14bbccSManman Ren     }
485cb14bbccSManman Ren   }
486cb14bbccSManman Ren 
4870d68b4c5SRafael Espindola   for (Function &F : M)
4880d68b4c5SRafael Espindola     Changed |= stripDebugInfo(F);
4890d68b4c5SRafael Espindola 
4903bfe1093SAdrian Prantl   for (auto &GV : M.globals()) {
4910deb9a9aSBenjamin Kramer     Changed |= GV.eraseMetadata(LLVMContext::MD_dbg);
4923bfe1093SAdrian Prantl   }
4933bfe1093SAdrian Prantl 
4940d68b4c5SRafael Espindola   if (GVMaterializer *Materializer = M.getMaterializer())
4950d68b4c5SRafael Espindola     Materializer->setStripDebugInfo();
496cb14bbccSManman Ren 
497cb14bbccSManman Ren   return Changed;
498cb14bbccSManman Ren }
4998b4306ceSManman Ren 
500e5428043SMichael Ilseman namespace {
501e5428043SMichael Ilseman 
502e5428043SMichael Ilseman /// Helper class to downgrade -g metadata to -gline-tables-only metadata.
503e5428043SMichael Ilseman class DebugTypeInfoRemoval {
504e5428043SMichael Ilseman   DenseMap<Metadata *, Metadata *> Replacements;
505e5428043SMichael Ilseman 
506e5428043SMichael Ilseman public:
507e5428043SMichael Ilseman   /// The (void)() type.
508e5428043SMichael Ilseman   MDNode *EmptySubroutineType;
509e5428043SMichael Ilseman 
510e5428043SMichael Ilseman private:
511e5428043SMichael Ilseman   /// Remember what linkage name we originally had before stripping. If we end
512e5428043SMichael Ilseman   /// up making two subprograms identical who originally had different linkage
513e5428043SMichael Ilseman   /// names, then we need to make one of them distinct, to avoid them getting
514e5428043SMichael Ilseman   /// uniqued. Maps the new node to the old linkage name.
515e5428043SMichael Ilseman   DenseMap<DISubprogram *, StringRef> NewToLinkageName;
516e5428043SMichael Ilseman 
517e5428043SMichael Ilseman   // TODO: Remember the distinct subprogram we created for a given linkage name,
518e5428043SMichael Ilseman   // so that we can continue to unique whenever possible. Map <newly created
519e5428043SMichael Ilseman   // node, old linkage name> to the first (possibly distinct) mdsubprogram
520e5428043SMichael Ilseman   // created for that combination. This is not strictly needed for correctness,
521e5428043SMichael Ilseman   // but can cut down on the number of MDNodes and let us diff cleanly with the
522e5428043SMichael Ilseman   // output of -gline-tables-only.
523e5428043SMichael Ilseman 
524e5428043SMichael Ilseman public:
DebugTypeInfoRemoval(LLVMContext & C)525e5428043SMichael Ilseman   DebugTypeInfoRemoval(LLVMContext &C)
526e5428043SMichael Ilseman       : EmptySubroutineType(DISubroutineType::get(C, DINode::FlagZero, 0,
527e5428043SMichael Ilseman                                                   MDNode::get(C, {}))) {}
528e5428043SMichael Ilseman 
map(Metadata * M)529e5428043SMichael Ilseman   Metadata *map(Metadata *M) {
530e5428043SMichael Ilseman     if (!M)
531e5428043SMichael Ilseman       return nullptr;
532e5428043SMichael Ilseman     auto Replacement = Replacements.find(M);
533e5428043SMichael Ilseman     if (Replacement != Replacements.end())
534e5428043SMichael Ilseman       return Replacement->second;
535e5428043SMichael Ilseman 
536e5428043SMichael Ilseman     return M;
537e5428043SMichael Ilseman   }
mapNode(Metadata * N)538e5428043SMichael Ilseman   MDNode *mapNode(Metadata *N) { return dyn_cast_or_null<MDNode>(map(N)); }
539e5428043SMichael Ilseman 
540e5428043SMichael Ilseman   /// Recursively remap N and all its referenced children. Does a DF post-order
541e5428043SMichael Ilseman   /// traversal, so as to remap bottoms up.
traverseAndRemap(MDNode * N)542e5428043SMichael Ilseman   void traverseAndRemap(MDNode *N) { traverse(N); }
543e5428043SMichael Ilseman 
544e5428043SMichael Ilseman private:
545e5428043SMichael Ilseman   // Create a new DISubprogram, to replace the one given.
getReplacementSubprogram(DISubprogram * MDS)546e5428043SMichael Ilseman   DISubprogram *getReplacementSubprogram(DISubprogram *MDS) {
547e5428043SMichael Ilseman     auto *FileAndScope = cast_or_null<DIFile>(map(MDS->getFile()));
548e5428043SMichael Ilseman     StringRef LinkageName = MDS->getName().empty() ? MDS->getLinkageName() : "";
549e5428043SMichael Ilseman     DISubprogram *Declaration = nullptr;
550e5428043SMichael Ilseman     auto *Type = cast_or_null<DISubroutineType>(map(MDS->getType()));
551da82ce99SFangrui Song     DIType *ContainingType =
552da82ce99SFangrui Song         cast_or_null<DIType>(map(MDS->getContainingType()));
553e5428043SMichael Ilseman     auto *Unit = cast_or_null<DICompileUnit>(map(MDS->getUnit()));
554e5428043SMichael Ilseman     auto Variables = nullptr;
555e5428043SMichael Ilseman     auto TemplateParams = nullptr;
556e5428043SMichael Ilseman 
557e5428043SMichael Ilseman     // Make a distinct DISubprogram, for situations that warrent it.
558e5428043SMichael Ilseman     auto distinctMDSubprogram = [&]() {
559e5428043SMichael Ilseman       return DISubprogram::getDistinct(
560e5428043SMichael Ilseman           MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
561cda54210SPaul Robinson           FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(),
562cda54210SPaul Robinson           ContainingType, MDS->getVirtualIndex(), MDS->getThisAdjustment(),
563cda54210SPaul Robinson           MDS->getFlags(), MDS->getSPFlags(), Unit, TemplateParams, Declaration,
564cda54210SPaul Robinson           Variables);
565e5428043SMichael Ilseman     };
566e5428043SMichael Ilseman 
567e5428043SMichael Ilseman     if (MDS->isDistinct())
568e5428043SMichael Ilseman       return distinctMDSubprogram();
569e5428043SMichael Ilseman 
570e5428043SMichael Ilseman     auto *NewMDS = DISubprogram::get(
571e5428043SMichael Ilseman         MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
572cda54210SPaul Robinson         FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(), ContainingType,
573cda54210SPaul Robinson         MDS->getVirtualIndex(), MDS->getThisAdjustment(), MDS->getFlags(),
574cda54210SPaul Robinson         MDS->getSPFlags(), Unit, TemplateParams, Declaration, Variables);
575e5428043SMichael Ilseman 
576e5428043SMichael Ilseman     StringRef OldLinkageName = MDS->getLinkageName();
577e5428043SMichael Ilseman 
578e5428043SMichael Ilseman     // See if we need to make a distinct one.
579e5428043SMichael Ilseman     auto OrigLinkage = NewToLinkageName.find(NewMDS);
580e5428043SMichael Ilseman     if (OrigLinkage != NewToLinkageName.end()) {
581e5428043SMichael Ilseman       if (OrigLinkage->second == OldLinkageName)
582e5428043SMichael Ilseman         // We're good.
583e5428043SMichael Ilseman         return NewMDS;
584e5428043SMichael Ilseman 
585e5428043SMichael Ilseman       // Otherwise, need to make a distinct one.
586e5428043SMichael Ilseman       // TODO: Query the map to see if we already have one.
587e5428043SMichael Ilseman       return distinctMDSubprogram();
588e5428043SMichael Ilseman     }
589e5428043SMichael Ilseman 
590e5428043SMichael Ilseman     NewToLinkageName.insert({NewMDS, MDS->getLinkageName()});
591e5428043SMichael Ilseman     return NewMDS;
592e5428043SMichael Ilseman   }
593e5428043SMichael Ilseman 
594e5428043SMichael Ilseman   /// Create a new compile unit, to replace the one given
getReplacementCU(DICompileUnit * CU)595e5428043SMichael Ilseman   DICompileUnit *getReplacementCU(DICompileUnit *CU) {
596e5428043SMichael Ilseman     // Drop skeleton CUs.
597e5428043SMichael Ilseman     if (CU->getDWOId())
598e5428043SMichael Ilseman       return nullptr;
599e5428043SMichael Ilseman 
600e5428043SMichael Ilseman     auto *File = cast_or_null<DIFile>(map(CU->getFile()));
601e5428043SMichael Ilseman     MDTuple *EnumTypes = nullptr;
602e5428043SMichael Ilseman     MDTuple *RetainedTypes = nullptr;
603e5428043SMichael Ilseman     MDTuple *GlobalVariables = nullptr;
604e5428043SMichael Ilseman     MDTuple *ImportedEntities = nullptr;
605e5428043SMichael Ilseman     return DICompileUnit::getDistinct(
606e5428043SMichael Ilseman         CU->getContext(), CU->getSourceLanguage(), File, CU->getProducer(),
607e5428043SMichael Ilseman         CU->isOptimized(), CU->getFlags(), CU->getRuntimeVersion(),
608e5428043SMichael Ilseman         CU->getSplitDebugFilename(), DICompileUnit::LineTablesOnly, EnumTypes,
609e5428043SMichael Ilseman         RetainedTypes, GlobalVariables, ImportedEntities, CU->getMacros(),
6100944a8c2SDehao Chen         CU->getDWOId(), CU->getSplitDebugInlining(),
611bb279116SDavid Blaikie         CU->getDebugInfoForProfiling(), CU->getNameTableKind(),
612e4e7e447SAdrian Prantl         CU->getRangesBaseAddress(), CU->getSysRoot(), CU->getSDK());
613e5428043SMichael Ilseman   }
614e5428043SMichael Ilseman 
getReplacementMDLocation(DILocation * MLD)615e5428043SMichael Ilseman   DILocation *getReplacementMDLocation(DILocation *MLD) {
616e5428043SMichael Ilseman     auto *Scope = map(MLD->getScope());
617e5428043SMichael Ilseman     auto *InlinedAt = map(MLD->getInlinedAt());
618e5428043SMichael Ilseman     if (MLD->isDistinct())
619e5428043SMichael Ilseman       return DILocation::getDistinct(MLD->getContext(), MLD->getLine(),
620e5428043SMichael Ilseman                                      MLD->getColumn(), Scope, InlinedAt);
621e5428043SMichael Ilseman     return DILocation::get(MLD->getContext(), MLD->getLine(), MLD->getColumn(),
622e5428043SMichael Ilseman                            Scope, InlinedAt);
623e5428043SMichael Ilseman   }
624e5428043SMichael Ilseman 
625e5428043SMichael Ilseman   /// Create a new generic MDNode, to replace the one given
getReplacementMDNode(MDNode * N)626e5428043SMichael Ilseman   MDNode *getReplacementMDNode(MDNode *N) {
627e5428043SMichael Ilseman     SmallVector<Metadata *, 8> Ops;
628e5428043SMichael Ilseman     Ops.reserve(N->getNumOperands());
629e5428043SMichael Ilseman     for (auto &I : N->operands())
630e5428043SMichael Ilseman       if (I)
631e5428043SMichael Ilseman         Ops.push_back(map(I));
632e5428043SMichael Ilseman     auto *Ret = MDNode::get(N->getContext(), Ops);
633e5428043SMichael Ilseman     return Ret;
634e5428043SMichael Ilseman   }
635e5428043SMichael Ilseman 
636e5428043SMichael Ilseman   /// Attempt to re-map N to a newly created node.
remap(MDNode * N)637e5428043SMichael Ilseman   void remap(MDNode *N) {
638e5428043SMichael Ilseman     if (Replacements.count(N))
639e5428043SMichael Ilseman       return;
640e5428043SMichael Ilseman 
641e5428043SMichael Ilseman     auto doRemap = [&](MDNode *N) -> MDNode * {
642e5428043SMichael Ilseman       if (!N)
643e5428043SMichael Ilseman         return nullptr;
644e5428043SMichael Ilseman       if (auto *MDSub = dyn_cast<DISubprogram>(N)) {
645e5428043SMichael Ilseman         remap(MDSub->getUnit());
646e5428043SMichael Ilseman         return getReplacementSubprogram(MDSub);
647e5428043SMichael Ilseman       }
648e5428043SMichael Ilseman       if (isa<DISubroutineType>(N))
649e5428043SMichael Ilseman         return EmptySubroutineType;
650e5428043SMichael Ilseman       if (auto *CU = dyn_cast<DICompileUnit>(N))
651e5428043SMichael Ilseman         return getReplacementCU(CU);
652e5428043SMichael Ilseman       if (isa<DIFile>(N))
653e5428043SMichael Ilseman         return N;
654e5428043SMichael Ilseman       if (auto *MDLB = dyn_cast<DILexicalBlockBase>(N))
655e5428043SMichael Ilseman         // Remap to our referenced scope (recursively).
656e5428043SMichael Ilseman         return mapNode(MDLB->getScope());
657e5428043SMichael Ilseman       if (auto *MLD = dyn_cast<DILocation>(N))
658e5428043SMichael Ilseman         return getReplacementMDLocation(MLD);
659e5428043SMichael Ilseman 
660e5428043SMichael Ilseman       // Otherwise, if we see these, just drop them now. Not strictly necessary,
661e5428043SMichael Ilseman       // but this speeds things up a little.
662e5428043SMichael Ilseman       if (isa<DINode>(N))
663e5428043SMichael Ilseman         return nullptr;
664e5428043SMichael Ilseman 
665e5428043SMichael Ilseman       return getReplacementMDNode(N);
666e5428043SMichael Ilseman     };
667e5428043SMichael Ilseman     Replacements[N] = doRemap(N);
668e5428043SMichael Ilseman   }
669e5428043SMichael Ilseman 
670e5428043SMichael Ilseman   /// Do the remapping traversal.
671e5428043SMichael Ilseman   void traverse(MDNode *);
672e5428043SMichael Ilseman };
673e5428043SMichael Ilseman 
674f53a7b45SEugene Zelenko } // end anonymous namespace
675e5428043SMichael Ilseman 
traverse(MDNode * N)676e5428043SMichael Ilseman void DebugTypeInfoRemoval::traverse(MDNode *N) {
677e5428043SMichael Ilseman   if (!N || Replacements.count(N))
678e5428043SMichael Ilseman     return;
679e5428043SMichael Ilseman 
680e5428043SMichael Ilseman   // To avoid cycles, as well as for efficiency sake, we will sometimes prune
681e5428043SMichael Ilseman   // parts of the graph.
682e5428043SMichael Ilseman   auto prune = [](MDNode *Parent, MDNode *Child) {
683e5428043SMichael Ilseman     if (auto *MDS = dyn_cast<DISubprogram>(Parent))
6842c864551SShiva Chen       return Child == MDS->getRetainedNodes().get();
685e5428043SMichael Ilseman     return false;
686e5428043SMichael Ilseman   };
687e5428043SMichael Ilseman 
688e5428043SMichael Ilseman   SmallVector<MDNode *, 16> ToVisit;
689e5428043SMichael Ilseman   DenseSet<MDNode *> Opened;
690e5428043SMichael Ilseman 
691e5428043SMichael Ilseman   // Visit each node starting at N in post order, and map them.
692e5428043SMichael Ilseman   ToVisit.push_back(N);
693e5428043SMichael Ilseman   while (!ToVisit.empty()) {
694e5428043SMichael Ilseman     auto *N = ToVisit.back();
695e5428043SMichael Ilseman     if (!Opened.insert(N).second) {
696e5428043SMichael Ilseman       // Close it.
697e5428043SMichael Ilseman       remap(N);
698e5428043SMichael Ilseman       ToVisit.pop_back();
699e5428043SMichael Ilseman       continue;
700e5428043SMichael Ilseman     }
701e5428043SMichael Ilseman     for (auto &I : N->operands())
702e5428043SMichael Ilseman       if (auto *MDN = dyn_cast_or_null<MDNode>(I))
703e5428043SMichael Ilseman         if (!Opened.count(MDN) && !Replacements.count(MDN) && !prune(N, MDN) &&
704e5428043SMichael Ilseman             !isa<DICompileUnit>(MDN))
705e5428043SMichael Ilseman           ToVisit.push_back(MDN);
706e5428043SMichael Ilseman   }
707e5428043SMichael Ilseman }
708e5428043SMichael Ilseman 
stripNonLineTableDebugInfo(Module & M)709e5428043SMichael Ilseman bool llvm::stripNonLineTableDebugInfo(Module &M) {
710e5428043SMichael Ilseman   bool Changed = false;
711e5428043SMichael Ilseman 
712e5428043SMichael Ilseman   // First off, delete the debug intrinsics.
713e5428043SMichael Ilseman   auto RemoveUses = [&](StringRef Name) {
714e5428043SMichael Ilseman     if (auto *DbgVal = M.getFunction(Name)) {
715e5428043SMichael Ilseman       while (!DbgVal->use_empty())
716e5428043SMichael Ilseman         cast<Instruction>(DbgVal->user_back())->eraseFromParent();
717e5428043SMichael Ilseman       DbgVal->eraseFromParent();
718e5428043SMichael Ilseman       Changed = true;
719e5428043SMichael Ilseman     }
720e5428043SMichael Ilseman   };
721c024f3ebSAdrian Prantl   RemoveUses("llvm.dbg.addr");
722e5428043SMichael Ilseman   RemoveUses("llvm.dbg.declare");
72393fe58c9SAdrian Prantl   RemoveUses("llvm.dbg.label");
724e5428043SMichael Ilseman   RemoveUses("llvm.dbg.value");
725e5428043SMichael Ilseman 
726e5428043SMichael Ilseman   // Delete non-CU debug info named metadata nodes.
727e5428043SMichael Ilseman   for (auto NMI = M.named_metadata_begin(), NME = M.named_metadata_end();
728e5428043SMichael Ilseman        NMI != NME;) {
729e5428043SMichael Ilseman     NamedMDNode *NMD = &*NMI;
730e5428043SMichael Ilseman     ++NMI;
731e5428043SMichael Ilseman     // Specifically keep dbg.cu around.
732e5428043SMichael Ilseman     if (NMD->getName() == "llvm.dbg.cu")
733e5428043SMichael Ilseman       continue;
734e5428043SMichael Ilseman   }
735e5428043SMichael Ilseman 
736e5428043SMichael Ilseman   // Drop all dbg attachments from global variables.
737e5428043SMichael Ilseman   for (auto &GV : M.globals())
738e5428043SMichael Ilseman     GV.eraseMetadata(LLVMContext::MD_dbg);
739e5428043SMichael Ilseman 
740e5428043SMichael Ilseman   DebugTypeInfoRemoval Mapper(M.getContext());
741f53a7b45SEugene Zelenko   auto remap = [&](MDNode *Node) -> MDNode * {
742e5428043SMichael Ilseman     if (!Node)
743e5428043SMichael Ilseman       return nullptr;
744e5428043SMichael Ilseman     Mapper.traverseAndRemap(Node);
745e5428043SMichael Ilseman     auto *NewNode = Mapper.mapNode(Node);
746e5428043SMichael Ilseman     Changed |= Node != NewNode;
747e5428043SMichael Ilseman     Node = NewNode;
748e5428043SMichael Ilseman     return NewNode;
749e5428043SMichael Ilseman   };
750e5428043SMichael Ilseman 
751e5428043SMichael Ilseman   // Rewrite the DebugLocs to be equivalent to what
752e5428043SMichael Ilseman   // -gline-tables-only would have created.
753e5428043SMichael Ilseman   for (auto &F : M) {
754e5428043SMichael Ilseman     if (auto *SP = F.getSubprogram()) {
755e5428043SMichael Ilseman       Mapper.traverseAndRemap(SP);
756e5428043SMichael Ilseman       auto *NewSP = cast<DISubprogram>(Mapper.mapNode(SP));
757e5428043SMichael Ilseman       Changed |= SP != NewSP;
758e5428043SMichael Ilseman       F.setSubprogram(NewSP);
759e5428043SMichael Ilseman     }
760e5428043SMichael Ilseman     for (auto &BB : F) {
761e5428043SMichael Ilseman       for (auto &I : BB) {
7622c7af6dfSSimon Pilgrim         auto remapDebugLoc = [&](const DebugLoc &DL) -> DebugLoc {
763e5428043SMichael Ilseman           auto *Scope = DL.getScope();
764e5428043SMichael Ilseman           MDNode *InlinedAt = DL.getInlinedAt();
765e5428043SMichael Ilseman           Scope = remap(Scope);
766e5428043SMichael Ilseman           InlinedAt = remap(InlinedAt);
767b5ad32efSFangrui Song           return DILocation::get(M.getContext(), DL.getLine(), DL.getCol(),
768b5ad32efSFangrui Song                                  Scope, InlinedAt);
769346dcaf1SAdrian Prantl         };
770346dcaf1SAdrian Prantl 
771346dcaf1SAdrian Prantl         if (I.getDebugLoc() != DebugLoc())
772346dcaf1SAdrian Prantl           I.setDebugLoc(remapDebugLoc(I.getDebugLoc()));
773346dcaf1SAdrian Prantl 
7749350792cSVedant Kumar         // Remap DILocations in llvm.loop attachments.
775f3869a5cSAdrian Prantl         updateLoopMetadataDebugLocations(I, [&](Metadata *MD) -> Metadata * {
776f3869a5cSAdrian Prantl           if (auto *Loc = dyn_cast_or_null<DILocation>(MD))
777f3869a5cSAdrian Prantl             return remapDebugLoc(Loc).get();
778f3869a5cSAdrian Prantl           return MD;
7799350792cSVedant Kumar         });
780b04c87e0SAdrian Prantl 
781b04c87e0SAdrian Prantl         // Strip heapallocsite attachments, they point into the DIType system.
782b04c87e0SAdrian Prantl         if (I.hasMetadataOtherThanDebugLoc())
783b04c87e0SAdrian Prantl           I.setMetadata("heapallocsite", nullptr);
784e5428043SMichael Ilseman       }
785e5428043SMichael Ilseman     }
786e5428043SMichael Ilseman   }
787e5428043SMichael Ilseman 
788e5428043SMichael Ilseman   // Create a new llvm.dbg.cu, which is equivalent to the one
789e5428043SMichael Ilseman   // -gline-tables-only would have created.
790e5428043SMichael Ilseman   for (auto &NMD : M.getNamedMDList()) {
791e5428043SMichael Ilseman     SmallVector<MDNode *, 8> Ops;
792e5428043SMichael Ilseman     for (MDNode *Op : NMD.operands())
793e5428043SMichael Ilseman       Ops.push_back(remap(Op));
794e5428043SMichael Ilseman 
795e5428043SMichael Ilseman     if (!Changed)
796e5428043SMichael Ilseman       continue;
797e5428043SMichael Ilseman 
798e5428043SMichael Ilseman     NMD.clearOperands();
799e5428043SMichael Ilseman     for (auto *Op : Ops)
800e5428043SMichael Ilseman       if (Op)
801e5428043SMichael Ilseman         NMD.addOperand(Op);
802e5428043SMichael Ilseman   }
803e5428043SMichael Ilseman   return Changed;
804e5428043SMichael Ilseman }
805e5428043SMichael Ilseman 
getDebugMetadataVersionFromModule(const Module & M)806bd4daf82SManman Ren unsigned llvm::getDebugMetadataVersionFromModule(const Module &M) {
807e7a9cdbdSDavid Majnemer   if (auto *Val = mdconst::dyn_extract_or_null<ConstantInt>(
8085bf8fef5SDuncan P. N. Exon Smith           M.getModuleFlag("Debug Info Version")))
8095bf8fef5SDuncan P. N. Exon Smith     return Val->getZExtValue();
8108b4306ceSManman Ren   return 0;
8118b4306ceSManman Ren }
812f464627fSDehao Chen 
applyMergedLocation(const DILocation * LocA,const DILocation * LocB)813f464627fSDehao Chen void Instruction::applyMergedLocation(const DILocation *LocA,
814f464627fSDehao Chen                                       const DILocation *LocB) {
8152a813ef2SDavid Blaikie   setDebugLoc(DILocation::getMergedLocation(LocA, LocB));
816f464627fSDehao Chen }
817789164d4Swhitequark 
updateLocationAfterHoist()818dfc5a9ebSVedant Kumar void Instruction::updateLocationAfterHoist() { dropLocation(); }
819dfc5a9ebSVedant Kumar 
dropLocation()820dfc5a9ebSVedant Kumar void Instruction::dropLocation() {
821dfc5a9ebSVedant Kumar   const DebugLoc &DL = getDebugLoc();
822dfc5a9ebSVedant Kumar   if (!DL)
823dfc5a9ebSVedant Kumar     return;
824dfc5a9ebSVedant Kumar 
825dfc5a9ebSVedant Kumar   // If this isn't a call, drop the location to allow a location from a
826dfc5a9ebSVedant Kumar   // preceding instruction to propagate.
827dfc5a9ebSVedant Kumar   if (!isa<CallBase>(this)) {
828dfc5a9ebSVedant Kumar     setDebugLoc(DebugLoc());
829dfc5a9ebSVedant Kumar     return;
830dfc5a9ebSVedant Kumar   }
831dfc5a9ebSVedant Kumar 
832dfc5a9ebSVedant Kumar   // Set a line 0 location for calls to preserve scope information in case
833dfc5a9ebSVedant Kumar   // inlining occurs.
834b5ad32efSFangrui Song   DISubprogram *SP = getFunction()->getSubprogram();
835dfc5a9ebSVedant Kumar   if (SP)
836dfc5a9ebSVedant Kumar     // If a function scope is available, set it on the line 0 location. When
837dfc5a9ebSVedant Kumar     // hoisting a call to a predecessor block, using the function scope avoids
838dfc5a9ebSVedant Kumar     // making it look like the callee was reached earlier than it should be.
839b5ad32efSFangrui Song     setDebugLoc(DILocation::get(getContext(), 0, 0, SP));
840dfc5a9ebSVedant Kumar   else
841dfc5a9ebSVedant Kumar     // The parent function has no scope. Go ahead and drop the location. If
842dfc5a9ebSVedant Kumar     // the parent function is inlined, and the callee has a subprogram, the
843dfc5a9ebSVedant Kumar     // inliner will attach a location to the call.
844dfc5a9ebSVedant Kumar     //
845dfc5a9ebSVedant Kumar     // One alternative is to set a line 0 location with the existing scope and
846dfc5a9ebSVedant Kumar     // inlinedAt info. The location might be sensitive to when inlining occurs.
847dfc5a9ebSVedant Kumar     setDebugLoc(DebugLoc());
848dfc5a9ebSVedant Kumar }
849dfc5a9ebSVedant Kumar 
850789164d4Swhitequark //===----------------------------------------------------------------------===//
851789164d4Swhitequark // LLVM C API implementations.
852789164d4Swhitequark //===----------------------------------------------------------------------===//
853789164d4Swhitequark 
map_from_llvmDWARFsourcelanguage(LLVMDWARFSourceLanguage lang)854789164d4Swhitequark static unsigned map_from_llvmDWARFsourcelanguage(LLVMDWARFSourceLanguage lang) {
855789164d4Swhitequark   switch (lang) {
856ac69af7aSDavid Blaikie #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR)                 \
857ac69af7aSDavid Blaikie   case LLVMDWARFSourceLanguage##NAME:                                          \
858ac69af7aSDavid Blaikie     return ID;
859789164d4Swhitequark #include "llvm/BinaryFormat/Dwarf.def"
860789164d4Swhitequark #undef HANDLE_DW_LANG
861789164d4Swhitequark   }
862789164d4Swhitequark   llvm_unreachable("Unhandled Tag");
863789164d4Swhitequark }
864789164d4Swhitequark 
unwrapDI(LLVMMetadataRef Ref)865b7881bbfSHarlan Haskins template <typename DIT> DIT *unwrapDI(LLVMMetadataRef Ref) {
866b7881bbfSHarlan Haskins   return (DIT *)(Ref ? unwrap<MDNode>(Ref) : nullptr);
867b7881bbfSHarlan Haskins }
868b7881bbfSHarlan Haskins 
map_from_llvmDIFlags(LLVMDIFlags Flags)869b7881bbfSHarlan Haskins static DINode::DIFlags map_from_llvmDIFlags(LLVMDIFlags Flags) {
870b7881bbfSHarlan Haskins   return static_cast<DINode::DIFlags>(Flags);
871b7881bbfSHarlan Haskins }
872b7881bbfSHarlan Haskins 
map_to_llvmDIFlags(DINode::DIFlags Flags)873260b5814SRobert Widmann static LLVMDIFlags map_to_llvmDIFlags(DINode::DIFlags Flags) {
874260b5814SRobert Widmann   return static_cast<LLVMDIFlags>(Flags);
875260b5814SRobert Widmann }
876260b5814SRobert Widmann 
877cda54210SPaul Robinson static DISubprogram::DISPFlags
pack_into_DISPFlags(bool IsLocalToUnit,bool IsDefinition,bool IsOptimized)878cda54210SPaul Robinson pack_into_DISPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized) {
879cda54210SPaul Robinson   return DISubprogram::toSPFlags(IsLocalToUnit, IsDefinition, IsOptimized);
880cda54210SPaul Robinson }
881cda54210SPaul Robinson 
LLVMDebugMetadataVersion()882789164d4Swhitequark unsigned LLVMDebugMetadataVersion() {
883789164d4Swhitequark   return DEBUG_METADATA_VERSION;
884789164d4Swhitequark }
885789164d4Swhitequark 
LLVMCreateDIBuilderDisallowUnresolved(LLVMModuleRef M)886789164d4Swhitequark LLVMDIBuilderRef LLVMCreateDIBuilderDisallowUnresolved(LLVMModuleRef M) {
887789164d4Swhitequark   return wrap(new DIBuilder(*unwrap(M), false));
888789164d4Swhitequark }
889789164d4Swhitequark 
LLVMCreateDIBuilder(LLVMModuleRef M)890789164d4Swhitequark LLVMDIBuilderRef LLVMCreateDIBuilder(LLVMModuleRef M) {
891789164d4Swhitequark   return wrap(new DIBuilder(*unwrap(M)));
892789164d4Swhitequark }
893789164d4Swhitequark 
LLVMGetModuleDebugMetadataVersion(LLVMModuleRef M)894789164d4Swhitequark unsigned LLVMGetModuleDebugMetadataVersion(LLVMModuleRef M) {
895789164d4Swhitequark   return getDebugMetadataVersionFromModule(*unwrap(M));
896789164d4Swhitequark }
897789164d4Swhitequark 
LLVMStripModuleDebugInfo(LLVMModuleRef M)898789164d4Swhitequark LLVMBool LLVMStripModuleDebugInfo(LLVMModuleRef M) {
899789164d4Swhitequark   return StripDebugInfo(*unwrap(M));
900789164d4Swhitequark }
901789164d4Swhitequark 
LLVMDisposeDIBuilder(LLVMDIBuilderRef Builder)902789164d4Swhitequark void LLVMDisposeDIBuilder(LLVMDIBuilderRef Builder) {
903789164d4Swhitequark   delete unwrap(Builder);
904789164d4Swhitequark }
905789164d4Swhitequark 
LLVMDIBuilderFinalize(LLVMDIBuilderRef Builder)906789164d4Swhitequark void LLVMDIBuilderFinalize(LLVMDIBuilderRef Builder) {
907789164d4Swhitequark   unwrap(Builder)->finalize();
908789164d4Swhitequark }
909789164d4Swhitequark 
LLVMDIBuilderFinalizeSubprogram(LLVMDIBuilderRef Builder,LLVMMetadataRef subprogram)91016661b1aSKoutheir Attouchi void LLVMDIBuilderFinalizeSubprogram(LLVMDIBuilderRef Builder,
91116661b1aSKoutheir Attouchi                                      LLVMMetadataRef subprogram) {
91216661b1aSKoutheir Attouchi   unwrap(Builder)->finalizeSubprogram(unwrapDI<DISubprogram>(subprogram));
91316661b1aSKoutheir Attouchi }
91416661b1aSKoutheir Attouchi 
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)915789164d4Swhitequark LLVMMetadataRef LLVMDIBuilderCreateCompileUnit(
916789164d4Swhitequark     LLVMDIBuilderRef Builder, LLVMDWARFSourceLanguage Lang,
917789164d4Swhitequark     LLVMMetadataRef FileRef, const char *Producer, size_t ProducerLen,
918789164d4Swhitequark     LLVMBool isOptimized, const char *Flags, size_t FlagsLen,
919789164d4Swhitequark     unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen,
920789164d4Swhitequark     LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining,
921e4e7e447SAdrian Prantl     LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen,
922e4e7e447SAdrian Prantl     const char *SDK, size_t SDKLen) {
923b7881bbfSHarlan Haskins   auto File = unwrapDI<DIFile>(FileRef);
924789164d4Swhitequark 
925789164d4Swhitequark   return wrap(unwrap(Builder)->createCompileUnit(
926789164d4Swhitequark       map_from_llvmDWARFsourcelanguage(Lang), File,
9277b30370eSAdrian Prantl       StringRef(Producer, ProducerLen), isOptimized, StringRef(Flags, FlagsLen),
9287b30370eSAdrian Prantl       RuntimeVer, StringRef(SplitName, SplitNameLen),
929789164d4Swhitequark       static_cast<DICompileUnit::DebugEmissionKind>(Kind), DWOId,
9307b30370eSAdrian Prantl       SplitDebugInlining, DebugInfoForProfiling,
9317b30370eSAdrian Prantl       DICompileUnit::DebugNameTableKind::Default, false,
932e4e7e447SAdrian Prantl       StringRef(SysRoot, SysRootLen), StringRef(SDK, SDKLen)));
933789164d4Swhitequark }
934789164d4Swhitequark 
935789164d4Swhitequark LLVMMetadataRef
LLVMDIBuilderCreateFile(LLVMDIBuilderRef Builder,const char * Filename,size_t FilenameLen,const char * Directory,size_t DirectoryLen)936789164d4Swhitequark LLVMDIBuilderCreateFile(LLVMDIBuilderRef Builder, const char *Filename,
937789164d4Swhitequark                         size_t FilenameLen, const char *Directory,
938789164d4Swhitequark                         size_t DirectoryLen) {
939789164d4Swhitequark   return wrap(unwrap(Builder)->createFile(StringRef(Filename, FilenameLen),
940789164d4Swhitequark                                           StringRef(Directory, DirectoryLen)));
941789164d4Swhitequark }
942789164d4Swhitequark 
943b02fe644SRobert Widmann 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)944b02fe644SRobert Widmann LLVMDIBuilderCreateModule(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope,
945b02fe644SRobert Widmann                           const char *Name, size_t NameLen,
946b02fe644SRobert Widmann                           const char *ConfigMacros, size_t ConfigMacrosLen,
947d5180ea1SAdrian Prantl                           const char *IncludePath, size_t IncludePathLen,
948d5180ea1SAdrian Prantl                           const char *APINotesFile, size_t APINotesFileLen) {
949b02fe644SRobert Widmann   return wrap(unwrap(Builder)->createModule(
950b02fe644SRobert Widmann       unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen),
951b02fe644SRobert Widmann       StringRef(ConfigMacros, ConfigMacrosLen),
952d5180ea1SAdrian Prantl       StringRef(IncludePath, IncludePathLen),
953d5180ea1SAdrian Prantl       StringRef(APINotesFile, APINotesFileLen)));
954b02fe644SRobert Widmann }
955b02fe644SRobert Widmann 
LLVMDIBuilderCreateNameSpace(LLVMDIBuilderRef Builder,LLVMMetadataRef ParentScope,const char * Name,size_t NameLen,LLVMBool ExportSymbols)956b02fe644SRobert Widmann LLVMMetadataRef LLVMDIBuilderCreateNameSpace(LLVMDIBuilderRef Builder,
957b02fe644SRobert Widmann                                              LLVMMetadataRef ParentScope,
958b02fe644SRobert Widmann                                              const char *Name, size_t NameLen,
959b02fe644SRobert Widmann                                              LLVMBool ExportSymbols) {
960b02fe644SRobert Widmann   return wrap(unwrap(Builder)->createNameSpace(
961b02fe644SRobert Widmann       unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen), ExportSymbols));
962b02fe644SRobert Widmann }
963b02fe644SRobert Widmann 
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)964f53050f0SRobert Widmann LLVMMetadataRef LLVMDIBuilderCreateFunction(
965f53050f0SRobert Widmann     LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
966f53050f0SRobert Widmann     size_t NameLen, const char *LinkageName, size_t LinkageNameLen,
967f53050f0SRobert Widmann     LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
968f53050f0SRobert Widmann     LLVMBool IsLocalToUnit, LLVMBool IsDefinition,
969f53050f0SRobert Widmann     unsigned ScopeLine, LLVMDIFlags Flags, LLVMBool IsOptimized) {
970f53050f0SRobert Widmann   return wrap(unwrap(Builder)->createFunction(
971f53050f0SRobert Widmann       unwrapDI<DIScope>(Scope), {Name, NameLen}, {LinkageName, LinkageNameLen},
972cda54210SPaul Robinson       unwrapDI<DIFile>(File), LineNo, unwrapDI<DISubroutineType>(Ty), ScopeLine,
973cda54210SPaul Robinson       map_from_llvmDIFlags(Flags),
974cda54210SPaul Robinson       pack_into_DISPFlags(IsLocalToUnit, IsDefinition, IsOptimized), nullptr,
975cda54210SPaul Robinson       nullptr, nullptr));
976f53050f0SRobert Widmann }
977f53050f0SRobert Widmann 
978f53050f0SRobert Widmann 
LLVMDIBuilderCreateLexicalBlock(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,LLVMMetadataRef File,unsigned Line,unsigned Col)979f53050f0SRobert Widmann LLVMMetadataRef LLVMDIBuilderCreateLexicalBlock(
980f53050f0SRobert Widmann     LLVMDIBuilderRef Builder, LLVMMetadataRef Scope,
981f53050f0SRobert Widmann     LLVMMetadataRef File, unsigned Line, unsigned Col) {
982f53050f0SRobert Widmann   return wrap(unwrap(Builder)->createLexicalBlock(unwrapDI<DIScope>(Scope),
983f53050f0SRobert Widmann                                                   unwrapDI<DIFile>(File),
984f53050f0SRobert Widmann                                                   Line, Col));
985f53050f0SRobert Widmann }
986f53050f0SRobert Widmann 
987f53050f0SRobert Widmann LLVMMetadataRef
LLVMDIBuilderCreateLexicalBlockFile(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,LLVMMetadataRef File,unsigned Discriminator)988f53050f0SRobert Widmann LLVMDIBuilderCreateLexicalBlockFile(LLVMDIBuilderRef Builder,
989f53050f0SRobert Widmann                                     LLVMMetadataRef Scope,
990f53050f0SRobert Widmann                                     LLVMMetadataRef File,
991f53050f0SRobert Widmann                                     unsigned Discriminator) {
992f53050f0SRobert Widmann   return wrap(unwrap(Builder)->createLexicalBlockFile(unwrapDI<DIScope>(Scope),
993f53050f0SRobert Widmann                                                       unwrapDI<DIFile>(File),
994f53050f0SRobert Widmann                                                       Discriminator));
995f53050f0SRobert Widmann }
996f53050f0SRobert Widmann 
997789164d4Swhitequark LLVMMetadataRef
LLVMDIBuilderCreateImportedModuleFromNamespace(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,LLVMMetadataRef NS,LLVMMetadataRef File,unsigned Line)998aec494f3SRobert Widmann LLVMDIBuilderCreateImportedModuleFromNamespace(LLVMDIBuilderRef Builder,
999aec494f3SRobert Widmann                                                LLVMMetadataRef Scope,
1000aec494f3SRobert Widmann                                                LLVMMetadataRef NS,
1001aec494f3SRobert Widmann                                                LLVMMetadataRef File,
1002aec494f3SRobert Widmann                                                unsigned Line) {
1003aec494f3SRobert Widmann   return wrap(unwrap(Builder)->createImportedModule(unwrapDI<DIScope>(Scope),
1004aec494f3SRobert Widmann                                                     unwrapDI<DINamespace>(NS),
1005aec494f3SRobert Widmann                                                     unwrapDI<DIFile>(File),
1006aec494f3SRobert Widmann                                                     Line));
1007aec494f3SRobert Widmann }
1008aec494f3SRobert Widmann 
LLVMDIBuilderCreateImportedModuleFromAlias(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,LLVMMetadataRef ImportedEntity,LLVMMetadataRef File,unsigned Line,LLVMMetadataRef * Elements,unsigned NumElements)1009a5b72abcSAlok Kumar Sharma LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromAlias(
1010a5b72abcSAlok Kumar Sharma     LLVMDIBuilderRef Builder, LLVMMetadataRef Scope,
1011a5b72abcSAlok Kumar Sharma     LLVMMetadataRef ImportedEntity, LLVMMetadataRef File, unsigned Line,
1012a5b72abcSAlok Kumar Sharma     LLVMMetadataRef *Elements, unsigned NumElements) {
1013a5b72abcSAlok Kumar Sharma   auto Elts =
1014a5b72abcSAlok Kumar Sharma       (NumElements > 0)
1015a5b72abcSAlok Kumar Sharma           ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1016a5b72abcSAlok Kumar Sharma           : nullptr;
1017aec494f3SRobert Widmann   return wrap(unwrap(Builder)->createImportedModule(
1018a5b72abcSAlok Kumar Sharma       unwrapDI<DIScope>(Scope), unwrapDI<DIImportedEntity>(ImportedEntity),
1019a5b72abcSAlok Kumar Sharma       unwrapDI<DIFile>(File), Line, Elts));
1020aec494f3SRobert Widmann }
1021aec494f3SRobert Widmann 
LLVMDIBuilderCreateImportedModuleFromModule(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,LLVMMetadataRef M,LLVMMetadataRef File,unsigned Line,LLVMMetadataRef * Elements,unsigned NumElements)1022a5b72abcSAlok Kumar Sharma LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromModule(
1023a5b72abcSAlok Kumar Sharma     LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef M,
1024a5b72abcSAlok Kumar Sharma     LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements,
1025a5b72abcSAlok Kumar Sharma     unsigned NumElements) {
1026a5b72abcSAlok Kumar Sharma   auto Elts =
1027a5b72abcSAlok Kumar Sharma       (NumElements > 0)
1028a5b72abcSAlok Kumar Sharma           ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1029a5b72abcSAlok Kumar Sharma           : nullptr;
1030a5b72abcSAlok Kumar Sharma   return wrap(unwrap(Builder)->createImportedModule(
1031a5b72abcSAlok Kumar Sharma       unwrapDI<DIScope>(Scope), unwrapDI<DIModule>(M), unwrapDI<DIFile>(File),
1032a5b72abcSAlok Kumar Sharma       Line, Elts));
1033aec494f3SRobert Widmann }
1034aec494f3SRobert Widmann 
LLVMDIBuilderCreateImportedDeclaration(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,LLVMMetadataRef Decl,LLVMMetadataRef File,unsigned Line,const char * Name,size_t NameLen,LLVMMetadataRef * Elements,unsigned NumElements)1035a5b72abcSAlok Kumar Sharma LLVMMetadataRef LLVMDIBuilderCreateImportedDeclaration(
1036a5b72abcSAlok Kumar Sharma     LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef Decl,
1037a5b72abcSAlok Kumar Sharma     LLVMMetadataRef File, unsigned Line, const char *Name, size_t NameLen,
1038a5b72abcSAlok Kumar Sharma     LLVMMetadataRef *Elements, unsigned NumElements) {
1039a5b72abcSAlok Kumar Sharma   auto Elts =
1040a5b72abcSAlok Kumar Sharma       (NumElements > 0)
1041a5b72abcSAlok Kumar Sharma           ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1042a5b72abcSAlok Kumar Sharma           : nullptr;
1043aec494f3SRobert Widmann   return wrap(unwrap(Builder)->createImportedDeclaration(
1044a5b72abcSAlok Kumar Sharma       unwrapDI<DIScope>(Scope), unwrapDI<DINode>(Decl), unwrapDI<DIFile>(File),
1045a5b72abcSAlok Kumar Sharma       Line, {Name, NameLen}, Elts));
1046aec494f3SRobert Widmann }
1047aec494f3SRobert Widmann 
1048aec494f3SRobert Widmann LLVMMetadataRef
LLVMDIBuilderCreateDebugLocation(LLVMContextRef Ctx,unsigned Line,unsigned Column,LLVMMetadataRef Scope,LLVMMetadataRef InlinedAt)1049789164d4Swhitequark LLVMDIBuilderCreateDebugLocation(LLVMContextRef Ctx, unsigned Line,
1050789164d4Swhitequark                                  unsigned Column, LLVMMetadataRef Scope,
1051789164d4Swhitequark                                  LLVMMetadataRef InlinedAt) {
1052789164d4Swhitequark   return wrap(DILocation::get(*unwrap(Ctx), Line, Column, unwrap(Scope),
1053789164d4Swhitequark                               unwrap(InlinedAt)));
1054789164d4Swhitequark }
1055b7881bbfSHarlan Haskins 
LLVMDILocationGetLine(LLVMMetadataRef Location)1056260b5814SRobert Widmann unsigned LLVMDILocationGetLine(LLVMMetadataRef Location) {
1057260b5814SRobert Widmann   return unwrapDI<DILocation>(Location)->getLine();
1058260b5814SRobert Widmann }
1059260b5814SRobert Widmann 
LLVMDILocationGetColumn(LLVMMetadataRef Location)1060260b5814SRobert Widmann unsigned LLVMDILocationGetColumn(LLVMMetadataRef Location) {
1061260b5814SRobert Widmann   return unwrapDI<DILocation>(Location)->getColumn();
1062260b5814SRobert Widmann }
1063260b5814SRobert Widmann 
LLVMDILocationGetScope(LLVMMetadataRef Location)1064260b5814SRobert Widmann LLVMMetadataRef LLVMDILocationGetScope(LLVMMetadataRef Location) {
1065260b5814SRobert Widmann   return wrap(unwrapDI<DILocation>(Location)->getScope());
1066260b5814SRobert Widmann }
1067260b5814SRobert Widmann 
LLVMDILocationGetInlinedAt(LLVMMetadataRef Location)1068cce47418SRobert Widmann LLVMMetadataRef LLVMDILocationGetInlinedAt(LLVMMetadataRef Location) {
1069cce47418SRobert Widmann   return wrap(unwrapDI<DILocation>(Location)->getInlinedAt());
1070cce47418SRobert Widmann }
1071cce47418SRobert Widmann 
LLVMDIScopeGetFile(LLVMMetadataRef Scope)1072d909a5edSRobert Widmann LLVMMetadataRef LLVMDIScopeGetFile(LLVMMetadataRef Scope) {
1073d909a5edSRobert Widmann   return wrap(unwrapDI<DIScope>(Scope)->getFile());
1074d909a5edSRobert Widmann }
1075d909a5edSRobert Widmann 
LLVMDIFileGetDirectory(LLVMMetadataRef File,unsigned * Len)1076d909a5edSRobert Widmann const char *LLVMDIFileGetDirectory(LLVMMetadataRef File, unsigned *Len) {
1077d909a5edSRobert Widmann   auto Dir = unwrapDI<DIFile>(File)->getDirectory();
1078d909a5edSRobert Widmann   *Len = Dir.size();
1079d909a5edSRobert Widmann   return Dir.data();
1080d909a5edSRobert Widmann }
1081d909a5edSRobert Widmann 
LLVMDIFileGetFilename(LLVMMetadataRef File,unsigned * Len)1082d909a5edSRobert Widmann const char *LLVMDIFileGetFilename(LLVMMetadataRef File, unsigned *Len) {
1083d909a5edSRobert Widmann   auto Name = unwrapDI<DIFile>(File)->getFilename();
1084d909a5edSRobert Widmann   *Len = Name.size();
1085d909a5edSRobert Widmann   return Name.data();
1086d909a5edSRobert Widmann }
1087d909a5edSRobert Widmann 
LLVMDIFileGetSource(LLVMMetadataRef File,unsigned * Len)1088d909a5edSRobert Widmann const char *LLVMDIFileGetSource(LLVMMetadataRef File, unsigned *Len) {
1089d909a5edSRobert Widmann   if (auto Src = unwrapDI<DIFile>(File)->getSource()) {
1090d909a5edSRobert Widmann     *Len = Src->size();
1091d909a5edSRobert Widmann     return Src->data();
1092d909a5edSRobert Widmann   }
1093d909a5edSRobert Widmann   *Len = 0;
1094d909a5edSRobert Widmann   return "";
1095d909a5edSRobert Widmann }
1096d909a5edSRobert Widmann 
LLVMDIBuilderCreateMacro(LLVMDIBuilderRef Builder,LLVMMetadataRef ParentMacroFile,unsigned Line,LLVMDWARFMacinfoRecordType RecordType,const char * Name,size_t NameLen,const char * Value,size_t ValueLen)1097b63db94fSwhitequark LLVMMetadataRef LLVMDIBuilderCreateMacro(LLVMDIBuilderRef Builder,
1098b63db94fSwhitequark                                          LLVMMetadataRef ParentMacroFile,
1099b63db94fSwhitequark                                          unsigned Line,
1100b63db94fSwhitequark                                          LLVMDWARFMacinfoRecordType RecordType,
1101b63db94fSwhitequark                                          const char *Name, size_t NameLen,
1102b63db94fSwhitequark                                          const char *Value, size_t ValueLen) {
1103b63db94fSwhitequark   return wrap(
1104b63db94fSwhitequark       unwrap(Builder)->createMacro(unwrapDI<DIMacroFile>(ParentMacroFile), Line,
1105b63db94fSwhitequark                                    static_cast<MacinfoRecordType>(RecordType),
1106b63db94fSwhitequark                                    {Name, NameLen}, {Value, ValueLen}));
1107b63db94fSwhitequark }
1108b63db94fSwhitequark 
1109b63db94fSwhitequark LLVMMetadataRef
LLVMDIBuilderCreateTempMacroFile(LLVMDIBuilderRef Builder,LLVMMetadataRef ParentMacroFile,unsigned Line,LLVMMetadataRef File)1110b63db94fSwhitequark LLVMDIBuilderCreateTempMacroFile(LLVMDIBuilderRef Builder,
1111b63db94fSwhitequark                                  LLVMMetadataRef ParentMacroFile, unsigned Line,
1112b63db94fSwhitequark                                  LLVMMetadataRef File) {
1113b63db94fSwhitequark   return wrap(unwrap(Builder)->createTempMacroFile(
1114b63db94fSwhitequark       unwrapDI<DIMacroFile>(ParentMacroFile), Line, unwrapDI<DIFile>(File)));
1115b63db94fSwhitequark }
1116b63db94fSwhitequark 
LLVMDIBuilderCreateEnumerator(LLVMDIBuilderRef Builder,const char * Name,size_t NameLen,int64_t Value,LLVMBool IsUnsigned)1117a82b613cSRobert Widmann LLVMMetadataRef LLVMDIBuilderCreateEnumerator(LLVMDIBuilderRef Builder,
1118a82b613cSRobert Widmann                                               const char *Name, size_t NameLen,
1119a82b613cSRobert Widmann                                               int64_t Value,
1120a82b613cSRobert Widmann                                               LLVMBool IsUnsigned) {
1121a82b613cSRobert Widmann   return wrap(unwrap(Builder)->createEnumerator({Name, NameLen}, Value,
1122a82b613cSRobert Widmann                                                 IsUnsigned != 0));
1123a82b613cSRobert Widmann }
1124a82b613cSRobert Widmann 
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)1125b7881bbfSHarlan Haskins LLVMMetadataRef LLVMDIBuilderCreateEnumerationType(
1126b7881bbfSHarlan Haskins   LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1127b7881bbfSHarlan Haskins   size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
11282d2698c6SRobert Widmann   uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef *Elements,
1129b7881bbfSHarlan Haskins   unsigned NumElements, LLVMMetadataRef ClassTy) {
1130b7881bbfSHarlan Haskins auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1131b7881bbfSHarlan Haskins                                                NumElements});
1132b7881bbfSHarlan Haskins return wrap(unwrap(Builder)->createEnumerationType(
1133b7881bbfSHarlan Haskins     unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1134b7881bbfSHarlan Haskins     LineNumber, SizeInBits, AlignInBits, Elts, unwrapDI<DIType>(ClassTy)));
1135b7881bbfSHarlan Haskins }
1136b7881bbfSHarlan Haskins 
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)1137b7881bbfSHarlan Haskins LLVMMetadataRef LLVMDIBuilderCreateUnionType(
1138b7881bbfSHarlan Haskins   LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1139b7881bbfSHarlan Haskins   size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
11402d2698c6SRobert Widmann   uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags,
1141b7881bbfSHarlan Haskins   LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang,
1142b7881bbfSHarlan Haskins   const char *UniqueId, size_t UniqueIdLen) {
1143b7881bbfSHarlan Haskins   auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1144b7881bbfSHarlan Haskins                                                  NumElements});
1145b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createUnionType(
1146b7881bbfSHarlan Haskins      unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1147b7881bbfSHarlan Haskins      LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1148b7881bbfSHarlan Haskins      Elts, RunTimeLang, {UniqueId, UniqueIdLen}));
1149b7881bbfSHarlan Haskins }
1150b7881bbfSHarlan Haskins 
1151b7881bbfSHarlan Haskins 
1152b7881bbfSHarlan Haskins LLVMMetadataRef
LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef Builder,uint64_t Size,uint32_t AlignInBits,LLVMMetadataRef Ty,LLVMMetadataRef * Subscripts,unsigned NumSubscripts)11532d2698c6SRobert Widmann LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef Builder, uint64_t Size,
11542d2698c6SRobert Widmann                              uint32_t AlignInBits, LLVMMetadataRef Ty,
1155b7881bbfSHarlan Haskins                              LLVMMetadataRef *Subscripts,
1156b7881bbfSHarlan Haskins                              unsigned NumSubscripts) {
1157b7881bbfSHarlan Haskins   auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts),
1158b7881bbfSHarlan Haskins                                                  NumSubscripts});
1159b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createArrayType(Size, AlignInBits,
1160b7881bbfSHarlan Haskins                                                unwrapDI<DIType>(Ty), Subs));
1161b7881bbfSHarlan Haskins }
1162b7881bbfSHarlan Haskins 
1163b7881bbfSHarlan Haskins LLVMMetadataRef
LLVMDIBuilderCreateVectorType(LLVMDIBuilderRef Builder,uint64_t Size,uint32_t AlignInBits,LLVMMetadataRef Ty,LLVMMetadataRef * Subscripts,unsigned NumSubscripts)11642d2698c6SRobert Widmann LLVMDIBuilderCreateVectorType(LLVMDIBuilderRef Builder, uint64_t Size,
11652d2698c6SRobert Widmann                               uint32_t AlignInBits, LLVMMetadataRef Ty,
1166b7881bbfSHarlan Haskins                               LLVMMetadataRef *Subscripts,
1167b7881bbfSHarlan Haskins                               unsigned NumSubscripts) {
1168b7881bbfSHarlan Haskins   auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts),
1169b7881bbfSHarlan Haskins                                                  NumSubscripts});
1170b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createVectorType(Size, AlignInBits,
1171b7881bbfSHarlan Haskins                                                 unwrapDI<DIType>(Ty), Subs));
1172b7881bbfSHarlan Haskins }
1173b7881bbfSHarlan Haskins 
1174b7881bbfSHarlan Haskins LLVMMetadataRef
LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Builder,const char * Name,size_t NameLen,uint64_t SizeInBits,LLVMDWARFTypeEncoding Encoding,LLVMDIFlags Flags)1175b7881bbfSHarlan Haskins LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Builder, const char *Name,
11762d2698c6SRobert Widmann                              size_t NameLen, uint64_t SizeInBits,
1177b56a4d31Swhitequark                              LLVMDWARFTypeEncoding Encoding,
1178b56a4d31Swhitequark                              LLVMDIFlags Flags) {
1179b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createBasicType({Name, NameLen},
1180b56a4d31Swhitequark                                                SizeInBits, Encoding,
1181b56a4d31Swhitequark                                                map_from_llvmDIFlags(Flags)));
1182b7881bbfSHarlan Haskins }
1183b7881bbfSHarlan Haskins 
LLVMDIBuilderCreatePointerType(LLVMDIBuilderRef Builder,LLVMMetadataRef PointeeTy,uint64_t SizeInBits,uint32_t AlignInBits,unsigned AddressSpace,const char * Name,size_t NameLen)1184b7881bbfSHarlan Haskins LLVMMetadataRef LLVMDIBuilderCreatePointerType(
1185b7881bbfSHarlan Haskins     LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy,
11862d2698c6SRobert Widmann     uint64_t SizeInBits, uint32_t AlignInBits, unsigned AddressSpace,
1187b7881bbfSHarlan Haskins     const char *Name, size_t NameLen) {
1188b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createPointerType(unwrapDI<DIType>(PointeeTy),
1189b7881bbfSHarlan Haskins                                          SizeInBits, AlignInBits,
1190b7881bbfSHarlan Haskins                                          AddressSpace, {Name, NameLen}));
1191b7881bbfSHarlan Haskins }
1192b7881bbfSHarlan Haskins 
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)1193b7881bbfSHarlan Haskins LLVMMetadataRef LLVMDIBuilderCreateStructType(
1194b7881bbfSHarlan Haskins     LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1195b7881bbfSHarlan Haskins     size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
11962d2698c6SRobert Widmann     uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags,
1197b7881bbfSHarlan Haskins     LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements,
1198b7881bbfSHarlan Haskins     unsigned NumElements, unsigned RunTimeLang, LLVMMetadataRef VTableHolder,
1199b7881bbfSHarlan Haskins     const char *UniqueId, size_t UniqueIdLen) {
1200b7881bbfSHarlan Haskins   auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1201b7881bbfSHarlan Haskins                                                  NumElements});
1202b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createStructType(
1203b7881bbfSHarlan Haskins       unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1204b7881bbfSHarlan Haskins       LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1205b7881bbfSHarlan Haskins       unwrapDI<DIType>(DerivedFrom), Elts, RunTimeLang,
1206b7881bbfSHarlan Haskins       unwrapDI<DIType>(VTableHolder), {UniqueId, UniqueIdLen}));
1207b7881bbfSHarlan Haskins }
1208b7881bbfSHarlan Haskins 
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)1209b7881bbfSHarlan Haskins LLVMMetadataRef LLVMDIBuilderCreateMemberType(
1210b7881bbfSHarlan Haskins     LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
12112d2698c6SRobert Widmann     size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits,
12122d2698c6SRobert Widmann     uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags,
1213b7881bbfSHarlan Haskins     LLVMMetadataRef Ty) {
1214b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createMemberType(unwrapDI<DIScope>(Scope),
1215b7881bbfSHarlan Haskins       {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, SizeInBits, AlignInBits,
1216b7881bbfSHarlan Haskins       OffsetInBits, map_from_llvmDIFlags(Flags), unwrapDI<DIType>(Ty)));
1217b7881bbfSHarlan Haskins }
1218b7881bbfSHarlan Haskins 
1219b7881bbfSHarlan Haskins LLVMMetadataRef
LLVMDIBuilderCreateUnspecifiedType(LLVMDIBuilderRef Builder,const char * Name,size_t NameLen)1220b7881bbfSHarlan Haskins LLVMDIBuilderCreateUnspecifiedType(LLVMDIBuilderRef Builder, const char *Name,
1221b7881bbfSHarlan Haskins                                    size_t NameLen) {
1222b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createUnspecifiedType({Name, NameLen}));
1223b7881bbfSHarlan Haskins }
1224b7881bbfSHarlan Haskins 
1225b7881bbfSHarlan Haskins LLVMMetadataRef
LLVMDIBuilderCreateStaticMemberType(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNumber,LLVMMetadataRef Type,LLVMDIFlags Flags,LLVMValueRef ConstantVal,uint32_t AlignInBits)1226b7881bbfSHarlan Haskins LLVMDIBuilderCreateStaticMemberType(
1227b7881bbfSHarlan Haskins     LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1228b7881bbfSHarlan Haskins     size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1229b7881bbfSHarlan Haskins     LLVMMetadataRef Type, LLVMDIFlags Flags, LLVMValueRef ConstantVal,
12302d2698c6SRobert Widmann     uint32_t AlignInBits) {
1231b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createStaticMemberType(
1232b7881bbfSHarlan Haskins                   unwrapDI<DIScope>(Scope), {Name, NameLen},
1233b7881bbfSHarlan Haskins                   unwrapDI<DIFile>(File), LineNumber, unwrapDI<DIType>(Type),
1234b7881bbfSHarlan Haskins                   map_from_llvmDIFlags(Flags), unwrap<Constant>(ConstantVal),
1235b7881bbfSHarlan Haskins                   AlignInBits));
1236b7881bbfSHarlan Haskins }
1237b7881bbfSHarlan Haskins 
1238b7881bbfSHarlan Haskins 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)123938fa750bSRobert Widmann LLVMDIBuilderCreateObjCIVar(LLVMDIBuilderRef Builder,
124038fa750bSRobert Widmann                             const char *Name, size_t NameLen,
124138fa750bSRobert Widmann                             LLVMMetadataRef File, unsigned LineNo,
124238fa750bSRobert Widmann                             uint64_t SizeInBits, uint32_t AlignInBits,
124338fa750bSRobert Widmann                             uint64_t OffsetInBits, LLVMDIFlags Flags,
124438fa750bSRobert Widmann                             LLVMMetadataRef Ty, LLVMMetadataRef PropertyNode) {
124538fa750bSRobert Widmann   return wrap(unwrap(Builder)->createObjCIVar(
124638fa750bSRobert Widmann                   {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
124738fa750bSRobert Widmann                   SizeInBits, AlignInBits, OffsetInBits,
124838fa750bSRobert Widmann                   map_from_llvmDIFlags(Flags), unwrapDI<DIType>(Ty),
124938fa750bSRobert Widmann                   unwrapDI<MDNode>(PropertyNode)));
125038fa750bSRobert Widmann }
125138fa750bSRobert Widmann 
125238fa750bSRobert Widmann 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)125338fa750bSRobert Widmann LLVMDIBuilderCreateObjCProperty(LLVMDIBuilderRef Builder,
125438fa750bSRobert Widmann                                 const char *Name, size_t NameLen,
125538fa750bSRobert Widmann                                 LLVMMetadataRef File, unsigned LineNo,
125638fa750bSRobert Widmann                                 const char *GetterName, size_t GetterNameLen,
125738fa750bSRobert Widmann                                 const char *SetterName, size_t SetterNameLen,
125838fa750bSRobert Widmann                                 unsigned PropertyAttributes,
125938fa750bSRobert Widmann                                 LLVMMetadataRef Ty) {
126038fa750bSRobert Widmann   return wrap(unwrap(Builder)->createObjCProperty(
126138fa750bSRobert Widmann                   {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
126238fa750bSRobert Widmann                   {GetterName, GetterNameLen}, {SetterName, SetterNameLen},
126338fa750bSRobert Widmann                   PropertyAttributes, unwrapDI<DIType>(Ty)));
126438fa750bSRobert Widmann }
126538fa750bSRobert Widmann 
126638fa750bSRobert Widmann LLVMMetadataRef
LLVMDIBuilderCreateObjectPointerType(LLVMDIBuilderRef Builder,LLVMMetadataRef Type)1267b7881bbfSHarlan Haskins LLVMDIBuilderCreateObjectPointerType(LLVMDIBuilderRef Builder,
1268b7881bbfSHarlan Haskins                                      LLVMMetadataRef Type) {
1269b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createObjectPointerType(unwrapDI<DIType>(Type)));
1270b7881bbfSHarlan Haskins }
1271b7881bbfSHarlan Haskins 
1272b7881bbfSHarlan Haskins LLVMMetadataRef
LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Builder,LLVMMetadataRef Type,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNo,LLVMMetadataRef Scope,uint32_t AlignInBits)12734b0084bfSRobert Widmann LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Builder, LLVMMetadataRef Type,
12744b0084bfSRobert Widmann                            const char *Name, size_t NameLen,
12754b0084bfSRobert Widmann                            LLVMMetadataRef File, unsigned LineNo,
1276f1e3988aSSourabh Singh Tomar                            LLVMMetadataRef Scope, uint32_t AlignInBits) {
12774b0084bfSRobert Widmann   return wrap(unwrap(Builder)->createTypedef(
1278f1e3988aSSourabh Singh Tomar       unwrapDI<DIType>(Type), {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1279f1e3988aSSourabh Singh Tomar       unwrapDI<DIScope>(Scope), AlignInBits));
12804b0084bfSRobert Widmann }
12814b0084bfSRobert Widmann 
12824b0084bfSRobert Widmann LLVMMetadataRef
LLVMDIBuilderCreateInheritance(LLVMDIBuilderRef Builder,LLVMMetadataRef Ty,LLVMMetadataRef BaseTy,uint64_t BaseOffset,uint32_t VBPtrOffset,LLVMDIFlags Flags)128338fa750bSRobert Widmann LLVMDIBuilderCreateInheritance(LLVMDIBuilderRef Builder,
128438fa750bSRobert Widmann                                LLVMMetadataRef Ty, LLVMMetadataRef BaseTy,
128538fa750bSRobert Widmann                                uint64_t BaseOffset, uint32_t VBPtrOffset,
128638fa750bSRobert Widmann                                LLVMDIFlags Flags) {
128738fa750bSRobert Widmann   return wrap(unwrap(Builder)->createInheritance(
128838fa750bSRobert Widmann                   unwrapDI<DIType>(Ty), unwrapDI<DIType>(BaseTy),
128938fa750bSRobert Widmann                   BaseOffset, VBPtrOffset, map_from_llvmDIFlags(Flags)));
129038fa750bSRobert Widmann }
129138fa750bSRobert Widmann 
129238fa750bSRobert Widmann 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)1293b02fe644SRobert Widmann LLVMDIBuilderCreateForwardDecl(
1294b02fe644SRobert Widmann     LLVMDIBuilderRef Builder, unsigned Tag, const char *Name,
1295b02fe644SRobert Widmann     size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line,
12962d2698c6SRobert Widmann     unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
1297b02fe644SRobert Widmann     const char *UniqueIdentifier, size_t UniqueIdentifierLen) {
1298b02fe644SRobert Widmann   return wrap(unwrap(Builder)->createForwardDecl(
1299b02fe644SRobert Widmann                   Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope),
1300b02fe644SRobert Widmann                   unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1301b02fe644SRobert Widmann                   AlignInBits, {UniqueIdentifier, UniqueIdentifierLen}));
1302b02fe644SRobert Widmann }
1303b02fe644SRobert Widmann 
1304b02fe644SRobert Widmann 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)1305b7881bbfSHarlan Haskins LLVMDIBuilderCreateReplaceableCompositeType(
1306bee4b589SHarlan Haskins     LLVMDIBuilderRef Builder, unsigned Tag, const char *Name,
1307bee4b589SHarlan Haskins     size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line,
13082d2698c6SRobert Widmann     unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
1309b7881bbfSHarlan Haskins     LLVMDIFlags Flags, const char *UniqueIdentifier,
1310bee4b589SHarlan Haskins     size_t UniqueIdentifierLen) {
1311b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createReplaceableCompositeType(
1312b7881bbfSHarlan Haskins                   Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope),
1313b7881bbfSHarlan Haskins                   unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1314b7881bbfSHarlan Haskins                   AlignInBits, map_from_llvmDIFlags(Flags),
1315b7881bbfSHarlan Haskins                   {UniqueIdentifier, UniqueIdentifierLen}));
1316b7881bbfSHarlan Haskins }
1317b7881bbfSHarlan Haskins 
1318b7881bbfSHarlan Haskins LLVMMetadataRef
LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef Builder,unsigned Tag,LLVMMetadataRef Type)1319b7881bbfSHarlan Haskins LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef Builder, unsigned Tag,
1320b7881bbfSHarlan Haskins                                  LLVMMetadataRef Type) {
1321b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createQualifiedType(Tag,
1322b7881bbfSHarlan Haskins                                                    unwrapDI<DIType>(Type)));
1323b7881bbfSHarlan Haskins }
1324b7881bbfSHarlan Haskins 
1325b7881bbfSHarlan Haskins LLVMMetadataRef
LLVMDIBuilderCreateReferenceType(LLVMDIBuilderRef Builder,unsigned Tag,LLVMMetadataRef Type)1326b7881bbfSHarlan Haskins LLVMDIBuilderCreateReferenceType(LLVMDIBuilderRef Builder, unsigned Tag,
1327b7881bbfSHarlan Haskins                                  LLVMMetadataRef Type) {
1328b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createReferenceType(Tag,
1329b7881bbfSHarlan Haskins                                                    unwrapDI<DIType>(Type)));
1330b7881bbfSHarlan Haskins }
1331b7881bbfSHarlan Haskins 
1332b7881bbfSHarlan Haskins LLVMMetadataRef
LLVMDIBuilderCreateNullPtrType(LLVMDIBuilderRef Builder)1333b7881bbfSHarlan Haskins LLVMDIBuilderCreateNullPtrType(LLVMDIBuilderRef Builder) {
1334b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createNullPtrType());
1335b7881bbfSHarlan Haskins }
1336b7881bbfSHarlan Haskins 
1337b7881bbfSHarlan Haskins LLVMMetadataRef
LLVMDIBuilderCreateMemberPointerType(LLVMDIBuilderRef Builder,LLVMMetadataRef PointeeType,LLVMMetadataRef ClassType,uint64_t SizeInBits,uint32_t AlignInBits,LLVMDIFlags Flags)1338b7881bbfSHarlan Haskins LLVMDIBuilderCreateMemberPointerType(LLVMDIBuilderRef Builder,
1339b7881bbfSHarlan Haskins                                      LLVMMetadataRef PointeeType,
1340b7881bbfSHarlan Haskins                                      LLVMMetadataRef ClassType,
13412d2698c6SRobert Widmann                                      uint64_t SizeInBits,
13422d2698c6SRobert Widmann                                      uint32_t AlignInBits,
1343b7881bbfSHarlan Haskins                                      LLVMDIFlags Flags) {
1344b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createMemberPointerType(
1345b7881bbfSHarlan Haskins                   unwrapDI<DIType>(PointeeType),
1346b7881bbfSHarlan Haskins                   unwrapDI<DIType>(ClassType), AlignInBits, SizeInBits,
1347b7881bbfSHarlan Haskins                   map_from_llvmDIFlags(Flags)));
1348b7881bbfSHarlan Haskins }
1349b7881bbfSHarlan Haskins 
1350b7881bbfSHarlan Haskins 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)13512d2698c6SRobert Widmann LLVMDIBuilderCreateBitFieldMemberType(LLVMDIBuilderRef Builder,
13522d2698c6SRobert Widmann                                       LLVMMetadataRef Scope,
13532d2698c6SRobert Widmann                                       const char *Name, size_t NameLen,
13542d2698c6SRobert Widmann                                       LLVMMetadataRef File, unsigned LineNumber,
13552d2698c6SRobert Widmann                                       uint64_t SizeInBits,
13562d2698c6SRobert Widmann                                       uint64_t OffsetInBits,
13572d2698c6SRobert Widmann                                       uint64_t StorageOffsetInBits,
13582d2698c6SRobert Widmann                                       LLVMDIFlags Flags, LLVMMetadataRef Type) {
13592d2698c6SRobert Widmann   return wrap(unwrap(Builder)->createBitFieldMemberType(
13602d2698c6SRobert Widmann                   unwrapDI<DIScope>(Scope), {Name, NameLen},
13612d2698c6SRobert Widmann                   unwrapDI<DIFile>(File), LineNumber,
13622d2698c6SRobert Widmann                   SizeInBits, OffsetInBits, StorageOffsetInBits,
13632d2698c6SRobert Widmann                   map_from_llvmDIFlags(Flags), unwrapDI<DIType>(Type)));
13642d2698c6SRobert Widmann }
13652d2698c6SRobert Widmann 
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)13662d2698c6SRobert Widmann LLVMMetadataRef LLVMDIBuilderCreateClassType(LLVMDIBuilderRef Builder,
13672d2698c6SRobert Widmann     LLVMMetadataRef Scope, const char *Name, size_t NameLen,
13682d2698c6SRobert Widmann     LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits,
13692d2698c6SRobert Widmann     uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags,
13702d2698c6SRobert Widmann     LLVMMetadataRef DerivedFrom,
13712d2698c6SRobert Widmann     LLVMMetadataRef *Elements, unsigned NumElements,
13722d2698c6SRobert Widmann     LLVMMetadataRef VTableHolder, LLVMMetadataRef TemplateParamsNode,
13732d2698c6SRobert Widmann     const char *UniqueIdentifier, size_t UniqueIdentifierLen) {
13742d2698c6SRobert Widmann   auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
13752d2698c6SRobert Widmann                                                  NumElements});
13762d2698c6SRobert Widmann   return wrap(unwrap(Builder)->createClassType(
13772d2698c6SRobert Widmann                   unwrapDI<DIScope>(Scope), {Name, NameLen},
13782d2698c6SRobert Widmann                   unwrapDI<DIFile>(File), LineNumber,
13792d2698c6SRobert Widmann                   SizeInBits, AlignInBits, OffsetInBits,
13802d2698c6SRobert Widmann                   map_from_llvmDIFlags(Flags), unwrapDI<DIType>(DerivedFrom),
13812d2698c6SRobert Widmann                   Elts, unwrapDI<DIType>(VTableHolder),
13822d2698c6SRobert Widmann                   unwrapDI<MDNode>(TemplateParamsNode),
13832d2698c6SRobert Widmann                   {UniqueIdentifier, UniqueIdentifierLen}));
13842d2698c6SRobert Widmann }
13852d2698c6SRobert Widmann 
13862d2698c6SRobert Widmann LLVMMetadataRef
LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef Builder,LLVMMetadataRef Type)1387b7881bbfSHarlan Haskins LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef Builder,
1388b7881bbfSHarlan Haskins                                   LLVMMetadataRef Type) {
1389b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createArtificialType(unwrapDI<DIType>(Type)));
1390b7881bbfSHarlan Haskins }
1391b7881bbfSHarlan Haskins 
LLVMDITypeGetName(LLVMMetadataRef DType,size_t * Length)1392260b5814SRobert Widmann const char *LLVMDITypeGetName(LLVMMetadataRef DType, size_t *Length) {
1393260b5814SRobert Widmann   StringRef Str = unwrap<DIType>(DType)->getName();
1394260b5814SRobert Widmann   *Length = Str.size();
1395260b5814SRobert Widmann   return Str.data();
1396260b5814SRobert Widmann }
1397260b5814SRobert Widmann 
LLVMDITypeGetSizeInBits(LLVMMetadataRef DType)1398260b5814SRobert Widmann uint64_t LLVMDITypeGetSizeInBits(LLVMMetadataRef DType) {
1399260b5814SRobert Widmann   return unwrapDI<DIType>(DType)->getSizeInBits();
1400260b5814SRobert Widmann }
1401260b5814SRobert Widmann 
LLVMDITypeGetOffsetInBits(LLVMMetadataRef DType)1402260b5814SRobert Widmann uint64_t LLVMDITypeGetOffsetInBits(LLVMMetadataRef DType) {
1403260b5814SRobert Widmann   return unwrapDI<DIType>(DType)->getOffsetInBits();
1404260b5814SRobert Widmann }
1405260b5814SRobert Widmann 
LLVMDITypeGetAlignInBits(LLVMMetadataRef DType)1406260b5814SRobert Widmann uint32_t LLVMDITypeGetAlignInBits(LLVMMetadataRef DType) {
1407260b5814SRobert Widmann   return unwrapDI<DIType>(DType)->getAlignInBits();
1408260b5814SRobert Widmann }
1409260b5814SRobert Widmann 
LLVMDITypeGetLine(LLVMMetadataRef DType)1410260b5814SRobert Widmann unsigned LLVMDITypeGetLine(LLVMMetadataRef DType) {
1411260b5814SRobert Widmann   return unwrapDI<DIType>(DType)->getLine();
1412260b5814SRobert Widmann }
1413260b5814SRobert Widmann 
LLVMDITypeGetFlags(LLVMMetadataRef DType)1414260b5814SRobert Widmann LLVMDIFlags LLVMDITypeGetFlags(LLVMMetadataRef DType) {
1415260b5814SRobert Widmann   return map_to_llvmDIFlags(unwrapDI<DIType>(DType)->getFlags());
1416260b5814SRobert Widmann }
1417260b5814SRobert Widmann 
LLVMDIBuilderGetOrCreateTypeArray(LLVMDIBuilderRef Builder,LLVMMetadataRef * Types,size_t Length)14186978db78SRobert Widmann LLVMMetadataRef LLVMDIBuilderGetOrCreateTypeArray(LLVMDIBuilderRef Builder,
14196978db78SRobert Widmann                                                   LLVMMetadataRef *Types,
14206978db78SRobert Widmann                                                   size_t Length) {
14216978db78SRobert Widmann   return wrap(
14226978db78SRobert Widmann       unwrap(Builder)->getOrCreateTypeArray({unwrap(Types), Length}).get());
14236978db78SRobert Widmann }
14246978db78SRobert Widmann 
1425b7881bbfSHarlan Haskins LLVMMetadataRef
LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Builder,LLVMMetadataRef File,LLVMMetadataRef * ParameterTypes,unsigned NumParameterTypes,LLVMDIFlags Flags)1426b7881bbfSHarlan Haskins LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Builder,
1427b7881bbfSHarlan Haskins                                   LLVMMetadataRef File,
1428b7881bbfSHarlan Haskins                                   LLVMMetadataRef *ParameterTypes,
1429b7881bbfSHarlan Haskins                                   unsigned NumParameterTypes,
1430b7881bbfSHarlan Haskins                                   LLVMDIFlags Flags) {
1431b7881bbfSHarlan Haskins   auto Elts = unwrap(Builder)->getOrCreateTypeArray({unwrap(ParameterTypes),
1432b7881bbfSHarlan Haskins                                                      NumParameterTypes});
1433b7881bbfSHarlan Haskins   return wrap(unwrap(Builder)->createSubroutineType(
1434b7881bbfSHarlan Haskins     Elts, map_from_llvmDIFlags(Flags)));
1435b7881bbfSHarlan Haskins }
1436f53050f0SRobert Widmann 
LLVMDIBuilderCreateExpression(LLVMDIBuilderRef Builder,uint64_t * Addr,size_t Length)143712e367b6SRobert Widmann LLVMMetadataRef LLVMDIBuilderCreateExpression(LLVMDIBuilderRef Builder,
1438ec501f15SShao-Ce SUN                                               uint64_t *Addr, size_t Length) {
1439ec501f15SShao-Ce SUN   return wrap(
1440ec501f15SShao-Ce SUN       unwrap(Builder)->createExpression(ArrayRef<uint64_t>(Addr, Length)));
144112e367b6SRobert Widmann }
144212e367b6SRobert Widmann 
144321fc15d5SRobert Widmann LLVMMetadataRef
LLVMDIBuilderCreateConstantValueExpression(LLVMDIBuilderRef Builder,uint64_t Value)144421fc15d5SRobert Widmann LLVMDIBuilderCreateConstantValueExpression(LLVMDIBuilderRef Builder,
1445ec501f15SShao-Ce SUN                                            uint64_t Value) {
144621fc15d5SRobert Widmann   return wrap(unwrap(Builder)->createConstantValueExpression(Value));
144721fc15d5SRobert Widmann }
144821fc15d5SRobert Widmann 
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)1449f8ab35a4SMatthew Voss LLVMMetadataRef LLVMDIBuilderCreateGlobalVariableExpression(
1450f8ab35a4SMatthew Voss     LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1451f8ab35a4SMatthew Voss     size_t NameLen, const char *Linkage, size_t LinkLen, LLVMMetadataRef File,
1452f8ab35a4SMatthew Voss     unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit,
1453f8ab35a4SMatthew Voss     LLVMMetadataRef Expr, LLVMMetadataRef Decl, uint32_t AlignInBits) {
145421fc15d5SRobert Widmann   return wrap(unwrap(Builder)->createGlobalVariableExpression(
145521fc15d5SRobert Widmann       unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LinkLen},
1456f8ab35a4SMatthew Voss       unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1457e3d8ee35SYonghong Song       true, unwrap<DIExpression>(Expr), unwrapDI<MDNode>(Decl),
1458f8ab35a4SMatthew Voss       nullptr, AlignInBits));
145921fc15d5SRobert Widmann }
146021fc15d5SRobert Widmann 
LLVMDIGlobalVariableExpressionGetVariable(LLVMMetadataRef GVE)1461d6eb4bb8SRobert Widmann LLVMMetadataRef LLVMDIGlobalVariableExpressionGetVariable(LLVMMetadataRef GVE) {
1462d6eb4bb8SRobert Widmann   return wrap(unwrapDI<DIGlobalVariableExpression>(GVE)->getVariable());
1463d6eb4bb8SRobert Widmann }
1464d6eb4bb8SRobert Widmann 
LLVMDIGlobalVariableExpressionGetExpression(LLVMMetadataRef GVE)1465d6eb4bb8SRobert Widmann LLVMMetadataRef LLVMDIGlobalVariableExpressionGetExpression(
1466d6eb4bb8SRobert Widmann     LLVMMetadataRef GVE) {
1467d6eb4bb8SRobert Widmann   return wrap(unwrapDI<DIGlobalVariableExpression>(GVE)->getExpression());
1468d6eb4bb8SRobert Widmann }
1469d6eb4bb8SRobert Widmann 
LLVMDIVariableGetFile(LLVMMetadataRef Var)1470d6eb4bb8SRobert Widmann LLVMMetadataRef LLVMDIVariableGetFile(LLVMMetadataRef Var) {
1471d6eb4bb8SRobert Widmann   return wrap(unwrapDI<DIVariable>(Var)->getFile());
1472d6eb4bb8SRobert Widmann }
1473d6eb4bb8SRobert Widmann 
LLVMDIVariableGetScope(LLVMMetadataRef Var)1474d6eb4bb8SRobert Widmann LLVMMetadataRef LLVMDIVariableGetScope(LLVMMetadataRef Var) {
1475d6eb4bb8SRobert Widmann   return wrap(unwrapDI<DIVariable>(Var)->getScope());
1476d6eb4bb8SRobert Widmann }
1477d6eb4bb8SRobert Widmann 
LLVMDIVariableGetLine(LLVMMetadataRef Var)1478d6eb4bb8SRobert Widmann unsigned LLVMDIVariableGetLine(LLVMMetadataRef Var) {
1479d6eb4bb8SRobert Widmann   return unwrapDI<DIVariable>(Var)->getLine();
1480d6eb4bb8SRobert Widmann }
1481d6eb4bb8SRobert Widmann 
LLVMTemporaryMDNode(LLVMContextRef Ctx,LLVMMetadataRef * Data,size_t Count)1482a428eba8SRobert Widmann LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef Ctx, LLVMMetadataRef *Data,
1483a428eba8SRobert Widmann                                     size_t Count) {
1484a428eba8SRobert Widmann   return wrap(
1485a428eba8SRobert Widmann       MDTuple::getTemporary(*unwrap(Ctx), {unwrap(Data), Count}).release());
1486a428eba8SRobert Widmann }
1487a428eba8SRobert Widmann 
LLVMDisposeTemporaryMDNode(LLVMMetadataRef TempNode)1488a428eba8SRobert Widmann void LLVMDisposeTemporaryMDNode(LLVMMetadataRef TempNode) {
1489a428eba8SRobert Widmann   MDNode::deleteTemporary(unwrapDI<MDNode>(TempNode));
1490a428eba8SRobert Widmann }
1491a428eba8SRobert Widmann 
LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef TargetMetadata,LLVMMetadataRef Replacement)1492a428eba8SRobert Widmann void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef TargetMetadata,
1493a428eba8SRobert Widmann                                     LLVMMetadataRef Replacement) {
1494a428eba8SRobert Widmann   auto *Node = unwrapDI<MDNode>(TargetMetadata);
1495a428eba8SRobert Widmann   Node->replaceAllUsesWith(unwrap<Metadata>(Replacement));
1496a428eba8SRobert Widmann   MDNode::deleteTemporary(Node);
1497a428eba8SRobert Widmann }
1498a428eba8SRobert Widmann 
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)1499f8ab35a4SMatthew Voss LLVMMetadataRef LLVMDIBuilderCreateTempGlobalVariableFwdDecl(
1500f8ab35a4SMatthew Voss     LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1501f8ab35a4SMatthew Voss     size_t NameLen, const char *Linkage, size_t LnkLen, LLVMMetadataRef File,
1502f8ab35a4SMatthew Voss     unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit,
1503f8ab35a4SMatthew Voss     LLVMMetadataRef Decl, uint32_t AlignInBits) {
150421fc15d5SRobert Widmann   return wrap(unwrap(Builder)->createTempGlobalVariableFwdDecl(
150521fc15d5SRobert Widmann       unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LnkLen},
1506f8ab35a4SMatthew Voss       unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1507f8ab35a4SMatthew Voss       unwrapDI<MDNode>(Decl), nullptr, AlignInBits));
150821fc15d5SRobert Widmann }
150921fc15d5SRobert Widmann 
1510f8ab35a4SMatthew Voss LLVMValueRef
LLVMDIBuilderInsertDeclareBefore(LLVMDIBuilderRef Builder,LLVMValueRef Storage,LLVMMetadataRef VarInfo,LLVMMetadataRef Expr,LLVMMetadataRef DL,LLVMValueRef Instr)1511f8ab35a4SMatthew Voss LLVMDIBuilderInsertDeclareBefore(LLVMDIBuilderRef Builder, LLVMValueRef Storage,
1512f8ab35a4SMatthew Voss                                  LLVMMetadataRef VarInfo, LLVMMetadataRef Expr,
1513f8ab35a4SMatthew Voss                                  LLVMMetadataRef DL, LLVMValueRef Instr) {
151412e367b6SRobert Widmann   return wrap(unwrap(Builder)->insertDeclare(
151512e367b6SRobert Widmann                   unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
151612e367b6SRobert Widmann                   unwrap<DIExpression>(Expr), unwrap<DILocation>(DL),
151712e367b6SRobert Widmann                   unwrap<Instruction>(Instr)));
151812e367b6SRobert Widmann }
151912e367b6SRobert Widmann 
LLVMDIBuilderInsertDeclareAtEnd(LLVMDIBuilderRef Builder,LLVMValueRef Storage,LLVMMetadataRef VarInfo,LLVMMetadataRef Expr,LLVMMetadataRef DL,LLVMBasicBlockRef Block)152012e367b6SRobert Widmann LLVMValueRef LLVMDIBuilderInsertDeclareAtEnd(
152112e367b6SRobert Widmann     LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo,
152212e367b6SRobert Widmann     LLVMMetadataRef Expr, LLVMMetadataRef DL, LLVMBasicBlockRef Block) {
152312e367b6SRobert Widmann   return wrap(unwrap(Builder)->insertDeclare(
152412e367b6SRobert Widmann                   unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
152512e367b6SRobert Widmann                   unwrap<DIExpression>(Expr), unwrap<DILocation>(DL),
152612e367b6SRobert Widmann                   unwrap(Block)));
152712e367b6SRobert Widmann }
152812e367b6SRobert Widmann 
LLVMDIBuilderInsertDbgValueBefore(LLVMDIBuilderRef Builder,LLVMValueRef Val,LLVMMetadataRef VarInfo,LLVMMetadataRef Expr,LLVMMetadataRef DebugLoc,LLVMValueRef Instr)152921fc15d5SRobert Widmann LLVMValueRef LLVMDIBuilderInsertDbgValueBefore(LLVMDIBuilderRef Builder,
153021fc15d5SRobert Widmann                                                LLVMValueRef Val,
153121fc15d5SRobert Widmann                                                LLVMMetadataRef VarInfo,
153221fc15d5SRobert Widmann                                                LLVMMetadataRef Expr,
153321fc15d5SRobert Widmann                                                LLVMMetadataRef DebugLoc,
153421fc15d5SRobert Widmann                                                LLVMValueRef Instr) {
153521fc15d5SRobert Widmann   return wrap(unwrap(Builder)->insertDbgValueIntrinsic(
153621fc15d5SRobert Widmann                   unwrap(Val), unwrap<DILocalVariable>(VarInfo),
153721fc15d5SRobert Widmann                   unwrap<DIExpression>(Expr), unwrap<DILocation>(DebugLoc),
153821fc15d5SRobert Widmann                   unwrap<Instruction>(Instr)));
153921fc15d5SRobert Widmann }
154021fc15d5SRobert Widmann 
LLVMDIBuilderInsertDbgValueAtEnd(LLVMDIBuilderRef Builder,LLVMValueRef Val,LLVMMetadataRef VarInfo,LLVMMetadataRef Expr,LLVMMetadataRef DebugLoc,LLVMBasicBlockRef Block)154121fc15d5SRobert Widmann LLVMValueRef LLVMDIBuilderInsertDbgValueAtEnd(LLVMDIBuilderRef Builder,
154221fc15d5SRobert Widmann                                               LLVMValueRef Val,
154321fc15d5SRobert Widmann                                               LLVMMetadataRef VarInfo,
154421fc15d5SRobert Widmann                                               LLVMMetadataRef Expr,
154521fc15d5SRobert Widmann                                               LLVMMetadataRef DebugLoc,
154621fc15d5SRobert Widmann                                               LLVMBasicBlockRef Block) {
154721fc15d5SRobert Widmann   return wrap(unwrap(Builder)->insertDbgValueIntrinsic(
154821fc15d5SRobert Widmann                   unwrap(Val), unwrap<DILocalVariable>(VarInfo),
154921fc15d5SRobert Widmann                   unwrap<DIExpression>(Expr), unwrap<DILocation>(DebugLoc),
155021fc15d5SRobert Widmann                   unwrap(Block)));
155121fc15d5SRobert Widmann }
155221fc15d5SRobert Widmann 
LLVMDIBuilderCreateAutoVariable(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,LLVMMetadataRef File,unsigned LineNo,LLVMMetadataRef Ty,LLVMBool AlwaysPreserve,LLVMDIFlags Flags,uint32_t AlignInBits)155312e367b6SRobert Widmann LLVMMetadataRef LLVMDIBuilderCreateAutoVariable(
155412e367b6SRobert Widmann     LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
155512e367b6SRobert Widmann     size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
155612e367b6SRobert Widmann     LLVMBool AlwaysPreserve, LLVMDIFlags Flags, uint32_t AlignInBits) {
155712e367b6SRobert Widmann   return wrap(unwrap(Builder)->createAutoVariable(
155812e367b6SRobert Widmann                   unwrap<DIScope>(Scope), {Name, NameLen}, unwrap<DIFile>(File),
155912e367b6SRobert Widmann                   LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
156012e367b6SRobert Widmann                   map_from_llvmDIFlags(Flags), AlignInBits));
156112e367b6SRobert Widmann }
156212e367b6SRobert Widmann 
LLVMDIBuilderCreateParameterVariable(LLVMDIBuilderRef Builder,LLVMMetadataRef Scope,const char * Name,size_t NameLen,unsigned ArgNo,LLVMMetadataRef File,unsigned LineNo,LLVMMetadataRef Ty,LLVMBool AlwaysPreserve,LLVMDIFlags Flags)156312e367b6SRobert Widmann LLVMMetadataRef LLVMDIBuilderCreateParameterVariable(
156412e367b6SRobert Widmann     LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
156512e367b6SRobert Widmann     size_t NameLen, unsigned ArgNo, LLVMMetadataRef File, unsigned LineNo,
156612e367b6SRobert Widmann     LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags) {
156712e367b6SRobert Widmann   return wrap(unwrap(Builder)->createParameterVariable(
1568106eab02SRobert Widmann                   unwrap<DIScope>(Scope), {Name, NameLen}, ArgNo, unwrap<DIFile>(File),
156912e367b6SRobert Widmann                   LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
157012e367b6SRobert Widmann                   map_from_llvmDIFlags(Flags)));
157112e367b6SRobert Widmann }
157212e367b6SRobert Widmann 
LLVMDIBuilderGetOrCreateSubrange(LLVMDIBuilderRef Builder,int64_t Lo,int64_t Count)15736978db78SRobert Widmann LLVMMetadataRef LLVMDIBuilderGetOrCreateSubrange(LLVMDIBuilderRef Builder,
15746978db78SRobert Widmann                                                  int64_t Lo, int64_t Count) {
15756978db78SRobert Widmann   return wrap(unwrap(Builder)->getOrCreateSubrange(Lo, Count));
15766978db78SRobert Widmann }
15776978db78SRobert Widmann 
LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef Builder,LLVMMetadataRef * Data,size_t Length)15786978db78SRobert Widmann LLVMMetadataRef LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef Builder,
15796978db78SRobert Widmann                                               LLVMMetadataRef *Data,
15806978db78SRobert Widmann                                               size_t Length) {
15816978db78SRobert Widmann   Metadata **DataValue = unwrap(Data);
15826978db78SRobert Widmann   return wrap(unwrap(Builder)->getOrCreateArray({DataValue, Length}).get());
15836978db78SRobert Widmann }
15846978db78SRobert Widmann 
LLVMGetSubprogram(LLVMValueRef Func)1585f53050f0SRobert Widmann LLVMMetadataRef LLVMGetSubprogram(LLVMValueRef Func) {
1586f53050f0SRobert Widmann   return wrap(unwrap<Function>(Func)->getSubprogram());
1587f53050f0SRobert Widmann }
1588f53050f0SRobert Widmann 
LLVMSetSubprogram(LLVMValueRef Func,LLVMMetadataRef SP)1589f53050f0SRobert Widmann void LLVMSetSubprogram(LLVMValueRef Func, LLVMMetadataRef SP) {
1590f53050f0SRobert Widmann   unwrap<Function>(Func)->setSubprogram(unwrap<DISubprogram>(SP));
1591f53050f0SRobert Widmann }
1592abda7ee8SRobert Widmann 
LLVMDISubprogramGetLine(LLVMMetadataRef Subprogram)1593d6eb4bb8SRobert Widmann unsigned LLVMDISubprogramGetLine(LLVMMetadataRef Subprogram) {
1594d6eb4bb8SRobert Widmann   return unwrapDI<DISubprogram>(Subprogram)->getLine();
1595d6eb4bb8SRobert Widmann }
1596d6eb4bb8SRobert Widmann 
LLVMInstructionGetDebugLoc(LLVMValueRef Inst)1597bec0a45dSRobert Widmann LLVMMetadataRef LLVMInstructionGetDebugLoc(LLVMValueRef Inst) {
1598bec0a45dSRobert Widmann   return wrap(unwrap<Instruction>(Inst)->getDebugLoc().getAsMDNode());
1599bec0a45dSRobert Widmann }
1600bec0a45dSRobert Widmann 
LLVMInstructionSetDebugLoc(LLVMValueRef Inst,LLVMMetadataRef Loc)1601bec0a45dSRobert Widmann void LLVMInstructionSetDebugLoc(LLVMValueRef Inst, LLVMMetadataRef Loc) {
1602bec0a45dSRobert Widmann   if (Loc)
1603bec0a45dSRobert Widmann     unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc(unwrap<MDNode>(Loc)));
1604bec0a45dSRobert Widmann   else
1605bec0a45dSRobert Widmann     unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc());
1606bec0a45dSRobert Widmann }
1607bec0a45dSRobert Widmann 
LLVMGetMetadataKind(LLVMMetadataRef Metadata)1608abda7ee8SRobert Widmann LLVMMetadataKind LLVMGetMetadataKind(LLVMMetadataRef Metadata) {
1609abda7ee8SRobert Widmann   switch(unwrap(Metadata)->getMetadataID()) {
1610abda7ee8SRobert Widmann #define HANDLE_METADATA_LEAF(CLASS) \
1611abda7ee8SRobert Widmann   case Metadata::CLASS##Kind: \
1612abda7ee8SRobert Widmann     return (LLVMMetadataKind)LLVM##CLASS##MetadataKind;
1613abda7ee8SRobert Widmann #include "llvm/IR/Metadata.def"
1614abda7ee8SRobert Widmann   default:
1615abda7ee8SRobert Widmann     return (LLVMMetadataKind)LLVMGenericDINodeMetadataKind;
1616abda7ee8SRobert Widmann   }
1617abda7ee8SRobert Widmann }
1618