Add hasByValArgument() to test if a call instruction has byval argument(s).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45913 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/llvm/Instructions.h b/include/llvm/Instructions.h
index 1594a0a..76190f1 100644
--- a/include/llvm/Instructions.h
+++ b/include/llvm/Instructions.h
@@ -944,6 +944,9 @@
/// @brief Determine if the call returns a structure.
bool isStructReturn() const;
+ /// @brief Determine if any call argument is an aggregate passed by value.
+ bool hasByValArgument() const;
+
/// getCalledFunction - Return the function being called by this instruction
/// if it is a direct call. If it is a call through a function pointer,
/// return null.
diff --git a/lib/VMCore/Instructions.cpp b/lib/VMCore/Instructions.cpp
index d8bcb31..a9cc275 100644
--- a/lib/VMCore/Instructions.cpp
+++ b/lib/VMCore/Instructions.cpp
@@ -404,6 +404,17 @@
return paramHasAttr(1, ParamAttr::StructRet);
}
+/// @brief Determine if any call argument is an aggregate passed by value.
+bool CallInst::hasByValArgument() const {
+ const Value *Callee = getCalledValue();
+ const PointerType *CalleeTy = cast<PointerType>(Callee->getType());
+ const FunctionType *FTy = cast<FunctionType>(CalleeTy->getElementType());
+ for (unsigned i = 1, e = FTy->getNumParams()+1; i != e; ++i)
+ if (paramHasAttr(i, ParamAttr::ByVal))
+ return true;
+ return false;
+}
+
void CallInst::setDoesNotThrow(bool doesNotThrow) {
const ParamAttrsList *PAL = getParamAttrs();
if (doesNotThrow)