From 2bf4b3be5ca34d822ae7a79e9f2df655da8e0aa8 Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Fri, 25 Jun 2010 11:25:30 +0000 Subject: [PATCH] use ArgOperand accessors and CallInst for getting hold of the intrinsic's arguments simplify along the way (at least for me this is much more legible now) Bill, Baldrick or Anton, please review\! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106838 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/DwarfEHPrepare.cpp | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/CodeGen/DwarfEHPrepare.cpp b/lib/CodeGen/DwarfEHPrepare.cpp index 417215482f9..007289ce771 100644 --- a/lib/CodeGen/DwarfEHPrepare.cpp +++ b/lib/CodeGen/DwarfEHPrepare.cpp @@ -22,6 +22,7 @@ #include "llvm/Analysis/Dominators.h" #include "llvm/CodeGen/Passes.h" #include "llvm/MC/MCAsmInfo.h" +#include "llvm/Support/CallSite.h" #include "llvm/Target/TargetLowering.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/PromoteMemToReg.h" @@ -193,8 +194,8 @@ FunctionPass *llvm::createDwarfEHPass(const TargetMachine *tm, bool fast) { bool DwarfEHPrepare::HasCatchAllInSelector(IntrinsicInst *II) { if (!EHCatchAllValue) return false; - unsigned OpIdx = II->getNumOperands() - 1; - GlobalVariable *GV = dyn_cast(II->getOperand(OpIdx)); + unsigned ArgIdx = II->getNumArgOperands() - 1; + GlobalVariable *GV = dyn_cast(II->getArgOperand(ArgIdx)); return GV == EHCatchAllValue; } @@ -386,16 +387,20 @@ bool DwarfEHPrepare::HandleURoRInvokes() { // Use the exception object pointer and the personality function // from the original selector. - Args.push_back(II->getArgOperand(0)); // Exception object pointer. - Args.push_back(II->getArgOperand(1)); // Personality function. + CallSite CS(II); + IntrinsicInst::op_iterator I = CS.arg_begin(); + Args.push_back(*I++); // Exception object pointer. + Args.push_back(*I++); // Personality function. - unsigned I = 3; - unsigned E = II->getNumOperands() - - (isa(II->getOperand(II->getNumOperands() - 1)) ? 1 : 0); + IntrinsicInst::op_iterator E = CS.arg_end(); + IntrinsicInst::op_iterator B = prior(E); + + // Exclude last argument if it is an integer. + if (isa(B)) E = B; // Add in any filter IDs. - for (; I < E; ++I) - Args.push_back(II->getOperand(I)); + for (; I != E; ++I) + Args.push_back(*I); Args.push_back(EHCatchAllValue->getInitializer()); // Catch-all indicator.