Change CallEvent to use ArrayRef<> interface to get formal parameters of callee.
llvm-svn: 199472
This commit is contained in:
parent
81541c561c
commit
2ff160046b
|
@ -344,21 +344,14 @@ private:
|
|||
typedef std::const_mem_fun_t<QualType, ParmVarDecl> get_type_fun;
|
||||
|
||||
public:
|
||||
typedef const ParmVarDecl * const *param_iterator;
|
||||
|
||||
/// Returns an iterator over the call's formal parameters.
|
||||
/// Return call's formal parameters.
|
||||
///
|
||||
/// Remember that the number of formal parameters may not match the number
|
||||
/// of arguments for all calls. However, the first parameter will always
|
||||
/// correspond with the argument value returned by \c getArgSVal(0).
|
||||
///
|
||||
/// If the call has no accessible declaration, \c param_begin() will be equal
|
||||
/// to \c param_end().
|
||||
virtual param_iterator param_begin() const = 0;
|
||||
/// \sa param_begin()
|
||||
virtual param_iterator param_end() const = 0;
|
||||
virtual ArrayRef<ParmVarDecl*> parameters() const = 0;
|
||||
|
||||
typedef llvm::mapped_iterator<param_iterator, get_type_fun>
|
||||
typedef llvm::mapped_iterator<ArrayRef<ParmVarDecl*>::iterator, get_type_fun>
|
||||
param_type_iterator;
|
||||
|
||||
/// Returns an iterator over the types of the call's formal parameters.
|
||||
|
@ -367,12 +360,13 @@ public:
|
|||
/// definition because it represents a public interface, and probably has
|
||||
/// more annotations.
|
||||
param_type_iterator param_type_begin() const {
|
||||
return llvm::map_iterator(param_begin(),
|
||||
return llvm::map_iterator(parameters().begin(),
|
||||
get_type_fun(&ParmVarDecl::getType));
|
||||
}
|
||||
/// \sa param_type_begin()
|
||||
param_type_iterator param_type_end() const {
|
||||
return llvm::map_iterator(param_end(), get_type_fun(&ParmVarDecl::getType));
|
||||
return llvm::map_iterator(parameters().end(),
|
||||
get_type_fun(&ParmVarDecl::getType));
|
||||
}
|
||||
|
||||
// For debugging purposes only
|
||||
|
@ -420,8 +414,7 @@ public:
|
|||
virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
|
||||
BindingsTy &Bindings) const;
|
||||
|
||||
virtual param_iterator param_begin() const;
|
||||
virtual param_iterator param_end() const;
|
||||
virtual ArrayRef<ParmVarDecl *> parameters() const;
|
||||
|
||||
static bool classof(const CallEvent *CA) {
|
||||
return CA->getKind() >= CE_BEG_FUNCTION_CALLS &&
|
||||
|
@ -515,8 +508,7 @@ public:
|
|||
virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
|
||||
BindingsTy &Bindings) const;
|
||||
|
||||
virtual param_iterator param_begin() const;
|
||||
virtual param_iterator param_end() const;
|
||||
virtual ArrayRef<ParmVarDecl*> parameters() const;
|
||||
|
||||
virtual Kind getKind() const { return CE_Block; }
|
||||
|
||||
|
@ -885,8 +877,7 @@ public:
|
|||
virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
|
||||
BindingsTy &Bindings) const;
|
||||
|
||||
virtual param_iterator param_begin() const;
|
||||
virtual param_iterator param_end() const;
|
||||
virtual ArrayRef<ParmVarDecl*> parameters() const;
|
||||
|
||||
virtual Kind getKind() const { return CE_ObjCMessage; }
|
||||
|
||||
|
|
|
@ -1613,8 +1613,10 @@ UndefOrNullArgVisitor::VisitNode(const ExplodedNode *N,
|
|||
CallEventManager &CEMgr = BRC.getStateManager().getCallEventManager();
|
||||
CallEventRef<> Call = CEMgr.getCaller(CEnter->getCalleeContext(), State);
|
||||
unsigned Idx = 0;
|
||||
for (CallEvent::param_iterator I = Call->param_begin(),
|
||||
E = Call->param_end(); I != E; ++I, ++Idx) {
|
||||
ArrayRef<ParmVarDecl*> parms = Call->parameters();
|
||||
|
||||
for (ArrayRef<ParmVarDecl*>::iterator I = parms.begin(), E = parms.end();
|
||||
I != E; ++I, ++Idx) {
|
||||
const MemRegion *ArgReg = Call->getArgSVal(Idx).getAsRegion();
|
||||
|
||||
// Are we tracking the argument or its subregion?
|
||||
|
|
|
@ -282,14 +282,14 @@ static void addParameterValuesToBindings(const StackFrameContext *CalleeCtx,
|
|||
CallEvent::BindingsTy &Bindings,
|
||||
SValBuilder &SVB,
|
||||
const CallEvent &Call,
|
||||
CallEvent::param_iterator I,
|
||||
CallEvent::param_iterator E) {
|
||||
ArrayRef<ParmVarDecl*> parameters) {
|
||||
MemRegionManager &MRMgr = SVB.getRegionManager();
|
||||
|
||||
// If the function has fewer parameters than the call has arguments, we simply
|
||||
// do not bind any values to them.
|
||||
unsigned NumArgs = Call.getNumArgs();
|
||||
unsigned Idx = 0;
|
||||
ArrayRef<ParmVarDecl*>::iterator I = parameters.begin(), E = parameters.end();
|
||||
for (; I != E && Idx < NumArgs; ++I, ++Idx) {
|
||||
const ParmVarDecl *ParamDecl = *I;
|
||||
assert(ParamDecl && "Formal parameter has no decl?");
|
||||
|
@ -304,21 +304,11 @@ static void addParameterValuesToBindings(const StackFrameContext *CalleeCtx,
|
|||
// FIXME: Variadic arguments are not handled at all right now.
|
||||
}
|
||||
|
||||
|
||||
CallEvent::param_iterator AnyFunctionCall::param_begin() const {
|
||||
ArrayRef<ParmVarDecl*> AnyFunctionCall::parameters() const {
|
||||
const FunctionDecl *D = getDecl();
|
||||
if (!D)
|
||||
return 0;
|
||||
|
||||
return D->param_begin();
|
||||
}
|
||||
|
||||
CallEvent::param_iterator AnyFunctionCall::param_end() const {
|
||||
const FunctionDecl *D = getDecl();
|
||||
if (!D)
|
||||
return 0;
|
||||
|
||||
return D->param_end();
|
||||
return llvm::ArrayRef<ParmVarDecl*>();
|
||||
return D->parameters();
|
||||
}
|
||||
|
||||
void AnyFunctionCall::getInitialStackFrameContents(
|
||||
|
@ -327,7 +317,7 @@ void AnyFunctionCall::getInitialStackFrameContents(
|
|||
const FunctionDecl *D = cast<FunctionDecl>(CalleeCtx->getDecl());
|
||||
SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
|
||||
addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
|
||||
D->param_begin(), D->param_end());
|
||||
D->parameters());
|
||||
}
|
||||
|
||||
bool AnyFunctionCall::argumentsMayEscape() const {
|
||||
|
@ -548,18 +538,11 @@ const BlockDataRegion *BlockCall::getBlockRegion() const {
|
|||
return dyn_cast_or_null<BlockDataRegion>(DataReg);
|
||||
}
|
||||
|
||||
CallEvent::param_iterator BlockCall::param_begin() const {
|
||||
ArrayRef<ParmVarDecl*> BlockCall::parameters() const {
|
||||
const BlockDecl *D = getDecl();
|
||||
if (!D)
|
||||
return 0;
|
||||
return D->param_begin();
|
||||
}
|
||||
|
||||
CallEvent::param_iterator BlockCall::param_end() const {
|
||||
const BlockDecl *D = getDecl();
|
||||
if (!D)
|
||||
return 0;
|
||||
return D->param_end();
|
||||
return D->parameters();
|
||||
}
|
||||
|
||||
void BlockCall::getExtraInvalidatedValues(ValueList &Values) const {
|
||||
|
@ -573,7 +556,7 @@ void BlockCall::getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
|
|||
const BlockDecl *D = cast<BlockDecl>(CalleeCtx->getDecl());
|
||||
SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
|
||||
addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
|
||||
D->param_begin(), D->param_end());
|
||||
D->parameters());
|
||||
}
|
||||
|
||||
|
||||
|
@ -602,8 +585,6 @@ void CXXConstructorCall::getInitialStackFrameContents(
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
SVal CXXDestructorCall::getCXXThisVal() const {
|
||||
if (Data)
|
||||
return loc::MemRegionVal(DtorDataTy::getFromOpaqueValue(Data).getPointer());
|
||||
|
@ -619,21 +600,11 @@ RuntimeDefinition CXXDestructorCall::getRuntimeDefinition() const {
|
|||
return CXXInstanceCall::getRuntimeDefinition();
|
||||
}
|
||||
|
||||
|
||||
CallEvent::param_iterator ObjCMethodCall::param_begin() const {
|
||||
ArrayRef<ParmVarDecl*> ObjCMethodCall::parameters() const {
|
||||
const ObjCMethodDecl *D = getDecl();
|
||||
if (!D)
|
||||
return 0;
|
||||
|
||||
return D->param_begin();
|
||||
}
|
||||
|
||||
CallEvent::param_iterator ObjCMethodCall::param_end() const {
|
||||
const ObjCMethodDecl *D = getDecl();
|
||||
if (!D)
|
||||
return 0;
|
||||
|
||||
return D->param_end();
|
||||
return ArrayRef<ParmVarDecl*>();
|
||||
return D->parameters();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -911,7 +882,7 @@ void ObjCMethodCall::getInitialStackFrameContents(
|
|||
const ObjCMethodDecl *D = cast<ObjCMethodDecl>(CalleeCtx->getDecl());
|
||||
SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
|
||||
addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
|
||||
D->param_begin(), D->param_end());
|
||||
D->parameters());
|
||||
|
||||
SVal SelfVal = getReceiverSVal();
|
||||
if (!SelfVal.isUnknown()) {
|
||||
|
|
Loading…
Reference in New Issue