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