diff options
author | Gabor Greif <ggreif@gmail.com> | 2010-06-25 11:25:30 +0000 |
---|---|---|
committer | Gabor Greif <ggreif@gmail.com> | 2010-06-25 11:25:30 +0000 |
commit | 2bf4b3be5ca34d822ae7a79e9f2df655da8e0aa8 (patch) | |
tree | 03d370b53ef47c794d89be0e97bd8a22c83a7f2e /lib/CodeGen/DwarfEHPrepare.cpp | |
parent | c13055db267909518e758fd4f93f4dec1c23df29 (diff) | |
download | llvm-2bf4b3be5ca34d822ae7a79e9f2df655da8e0aa8.tar.gz llvm-2bf4b3be5ca34d822ae7a79e9f2df655da8e0aa8.tar.bz2 llvm-2bf4b3be5ca34d822ae7a79e9f2df655da8e0aa8.tar.xz |
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
Diffstat (limited to 'lib/CodeGen/DwarfEHPrepare.cpp')
-rw-r--r-- | lib/CodeGen/DwarfEHPrepare.cpp | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/lib/CodeGen/DwarfEHPrepare.cpp b/lib/CodeGen/DwarfEHPrepare.cpp index 417215482f..007289ce77 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<GlobalVariable>(II->getOperand(OpIdx)); + unsigned ArgIdx = II->getNumArgOperands() - 1; + GlobalVariable *GV = dyn_cast<GlobalVariable>(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<ConstantInt>(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<ConstantInt>(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. |