diff options
author | Saleem Abdulrasool <compnerd@compnerd.org> | 2018-10-10 23:53:12 +0000 |
---|---|---|
committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2018-10-10 23:53:12 +0000 |
commit | 0d1cbcc3ebb0ca5a6994e272d5dfe0dd886e7f14 (patch) | |
tree | e1c375b5cd471b4235c01b9ebb765764e4bc7111 /llvm/lib/IR | |
parent | cee53ce4f2e4aa78113a26bf6cadd2c84e109a03 (diff) | |
download | bcm5719-llvm-0d1cbcc3ebb0ca5a6994e272d5dfe0dd886e7f14.tar.gz bcm5719-llvm-0d1cbcc3ebb0ca5a6994e272d5dfe0dd886e7f14.zip |
llvm-c: Add C APIs to access DebugLoc info
Add thin shims to C interface to provide access to DebugLoc info for
Instructions, GlobalVariables and Functions. Patch by Josh Berdine!
llvm-svn: 344202
Diffstat (limited to 'llvm/lib/IR')
-rw-r--r-- | llvm/lib/IR/Core.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp index 410a426a4a2..639b6b4489a 100644 --- a/llvm/lib/IR/Core.cpp +++ b/llvm/lib/IR/Core.cpp @@ -17,6 +17,7 @@ #include "llvm/IR/Attributes.h" #include "llvm/IR/CallSite.h" #include "llvm/IR/Constants.h" +#include "llvm/IR/DebugInfoMetadata.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/DiagnosticPrinter.h" @@ -1189,6 +1190,78 @@ void LLVMAddNamedMetadataOperand(LLVMModuleRef M, const char *Name, N->addOperand(extractMDNode(unwrap<MetadataAsValue>(Val))); } +const char *LLVMGetDebugLocDirectory(LLVMValueRef Val, unsigned *Length) { + if (!Length) return nullptr; + StringRef S; + if (const auto *I = unwrap<Instruction>(Val)) { + S = I->getDebugLoc()->getDirectory(); + } else if (const auto *GV = unwrap<GlobalVariable>(Val)) { + SmallVector<DIGlobalVariableExpression *, 1> GVEs; + GV->getDebugInfo(GVEs); + if (GVEs.size()) + if (const DIGlobalVariable *DGV = GVEs[0]->getVariable()) + S = DGV->getDirectory(); + } else if (const auto *F = unwrap<Function>(Val)) { + if (const DISubprogram *DSP = F->getSubprogram()) + S = DSP->getDirectory(); + } else { + assert(0 && "Expected Instruction, GlobalVariable or Function"); + return nullptr; + } + *Length = S.size(); + return S.data(); +} + +const char *LLVMGetDebugLocFilename(LLVMValueRef Val, unsigned *Length) { + if (!Length) return nullptr; + StringRef S; + if (const auto *I = unwrap<Instruction>(Val)) { + S = I->getDebugLoc()->getFilename(); + } else if (const auto *GV = unwrap<GlobalVariable>(Val)) { + SmallVector<DIGlobalVariableExpression *, 1> GVEs; + GV->getDebugInfo(GVEs); + if (GVEs.size()) + if (const DIGlobalVariable *DGV = GVEs[0]->getVariable()) + S = DGV->getFilename(); + } else if (const auto *F = unwrap<Function>(Val)) { + if (const DISubprogram *DSP = F->getSubprogram()) + S = DSP->getFilename(); + } else { + assert(0 && "Expected Instruction, GlobalVariable or Function"); + return nullptr; + } + *Length = S.size(); + return S.data(); +} + +unsigned LLVMGetDebugLocLine(LLVMValueRef Val) { + unsigned L = 0; + if (const auto *I = unwrap<Instruction>(Val)) { + L = I->getDebugLoc()->getLine(); + } else if (const auto *GV = unwrap<GlobalVariable>(Val)) { + SmallVector<DIGlobalVariableExpression *, 1> GVEs; + GV->getDebugInfo(GVEs); + if (GVEs.size()) + if (const DIGlobalVariable *DGV = GVEs[0]->getVariable()) + L = DGV->getLine(); + } else if (const auto *F = unwrap<Function>(Val)) { + if (const DISubprogram *DSP = F->getSubprogram()) + L = DSP->getLine(); + } else { + assert(0 && "Expected Instruction, GlobalVariable or Function"); + return -1; + } + return L; +} + +unsigned LLVMGetDebugLocColumn(LLVMValueRef Val) { + unsigned C = 0; + if (const auto *I = unwrap<Instruction>(Val)) + if (const auto &L = I->getDebugLoc()) + C = L->getColumn(); + return C; +} + /*--.. Operations on scalar constants ......................................--*/ LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N, |