From eccf5bf0815b183a6aa679a100d99d844e8725d8 Mon Sep 17 00:00:00 2001 From: whitequark Date: Wed, 24 Apr 2019 13:30:03 +0000 Subject: [PATCH] [LLVM-C] Use dyn_cast instead of unwrap in LLVMGetDebugLoc functions Summary: The `unwrap` calls can assert with: ``` Assertion failed: (isa(Val) && "cast() argument of incompatible type!"), function cast ``` so replace them with `dyn_cast`. Reviewers: whitequark, abdulras, hiraditya, compnerd Reviewed By: whitequark Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D60473 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359093 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/IR/Core.cpp | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp index 2a4ea8d5246..354921dc43e 100644 --- a/lib/IR/Core.cpp +++ b/lib/IR/Core.cpp @@ -1199,15 +1199,17 @@ void LLVMAddNamedMetadataOperand(LLVMModuleRef M, const char *Name, const char *LLVMGetDebugLocDirectory(LLVMValueRef Val, unsigned *Length) { if (!Length) return nullptr; StringRef S; - if (const auto *I = unwrap(Val)) { - S = I->getDebugLoc()->getDirectory(); - } else if (const auto *GV = unwrap(Val)) { + if (const auto *I = dyn_cast(unwrap(Val))) { + if (const auto &DL = I->getDebugLoc()) { + S = DL->getDirectory(); + } + } else if (const auto *GV = dyn_cast(unwrap(Val))) { SmallVector GVEs; GV->getDebugInfo(GVEs); if (GVEs.size()) if (const DIGlobalVariable *DGV = GVEs[0]->getVariable()) S = DGV->getDirectory(); - } else if (const auto *F = unwrap(Val)) { + } else if (const auto *F = dyn_cast(unwrap(Val))) { if (const DISubprogram *DSP = F->getSubprogram()) S = DSP->getDirectory(); } else { @@ -1221,15 +1223,17 @@ const char *LLVMGetDebugLocDirectory(LLVMValueRef Val, unsigned *Length) { const char *LLVMGetDebugLocFilename(LLVMValueRef Val, unsigned *Length) { if (!Length) return nullptr; StringRef S; - if (const auto *I = unwrap(Val)) { - S = I->getDebugLoc()->getFilename(); - } else if (const auto *GV = unwrap(Val)) { + if (const auto *I = dyn_cast(unwrap(Val))) { + if (const auto &DL = I->getDebugLoc()) { + S = DL->getFilename(); + } + } else if (const auto *GV = dyn_cast(unwrap(Val))) { SmallVector GVEs; GV->getDebugInfo(GVEs); if (GVEs.size()) if (const DIGlobalVariable *DGV = GVEs[0]->getVariable()) S = DGV->getFilename(); - } else if (const auto *F = unwrap(Val)) { + } else if (const auto *F = dyn_cast(unwrap(Val))) { if (const DISubprogram *DSP = F->getSubprogram()) S = DSP->getFilename(); } else { @@ -1242,15 +1246,17 @@ const char *LLVMGetDebugLocFilename(LLVMValueRef Val, unsigned *Length) { unsigned LLVMGetDebugLocLine(LLVMValueRef Val) { unsigned L = 0; - if (const auto *I = unwrap(Val)) { - L = I->getDebugLoc()->getLine(); - } else if (const auto *GV = unwrap(Val)) { + if (const auto *I = dyn_cast(unwrap(Val))) { + if (const auto &DL = I->getDebugLoc()) { + L = DL->getLine(); + } + } else if (const auto *GV = dyn_cast(unwrap(Val))) { SmallVector GVEs; GV->getDebugInfo(GVEs); if (GVEs.size()) if (const DIGlobalVariable *DGV = GVEs[0]->getVariable()) L = DGV->getLine(); - } else if (const auto *F = unwrap(Val)) { + } else if (const auto *F = dyn_cast(unwrap(Val))) { if (const DISubprogram *DSP = F->getSubprogram()) L = DSP->getLine(); } else { @@ -1262,9 +1268,9 @@ unsigned LLVMGetDebugLocLine(LLVMValueRef Val) { unsigned LLVMGetDebugLocColumn(LLVMValueRef Val) { unsigned C = 0; - if (const auto *I = unwrap(Val)) - if (const auto &L = I->getDebugLoc()) - C = L->getColumn(); + if (const auto *I = dyn_cast(unwrap(Val))) + if (const auto &DL = I->getDebugLoc()) + C = DL->getColumn(); return C; } -- 2.50.1