aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Argument.h15
-rw-r--r--lib/VMCore/Function.cpp31
2 files changed, 44 insertions, 2 deletions
diff --git a/include/llvm/Argument.h b/include/llvm/Argument.h
index 314ffeeaa7..a9d85f21d0 100644
--- a/include/llvm/Argument.h
+++ b/include/llvm/Argument.h
@@ -39,13 +39,24 @@ public:
/// Argument ctor - If Function argument is specified, this argument is
/// inserted at the end of the argument list for the function.
///
- explicit Argument(const Type *Ty,
- const std::string &Name = "",
+ explicit Argument(const Type *Ty, const std::string &Name = "",
Function *F = 0);
inline const Function *getParent() const { return Parent; }
inline Function *getParent() { return Parent; }
+ /// getArgNo - Return the index of this formal argument in its containing
+ /// function. For example in "void foo(int a, float b)" a is 0 and b is 1.
+ unsigned getArgNo() const;
+
+ /// hasByValAttr - Return true if this argument has the byval attribute on it
+ /// in its containing function.
+ bool hasByValAttr() const;
+
+ /// hasNoAliasAttr - Return true if this argument has the noalias attribute on
+ /// it in its containing function.
+ bool hasNoAliasAttr() const;
+
virtual void print(std::ostream &OS) const;
void print(std::ostream *OS) const {
if (OS) print(*OS);
diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp
index 8e6570a627..47e85d7aa6 100644
--- a/lib/VMCore/Function.cpp
+++ b/lib/VMCore/Function.cpp
@@ -75,6 +75,37 @@ void Argument::setParent(Function *parent) {
LeakDetector::removeGarbageObject(this);
}
+/// getArgNo - Return the index of this formal argument in its containing
+/// function. For example in "void foo(int a, float b)" a is 0 and b is 1.
+unsigned Argument::getArgNo() const {
+ const Function *F = getParent();
+ assert(F && "Argument is not in a function");
+
+ Function::const_arg_iterator AI = F->arg_begin();
+ unsigned ArgIdx = 0;
+ for (; &*AI != this; ++AI)
+ ++ArgIdx;
+
+ return ArgIdx;
+}
+
+/// hasByValAttr - Return true if this argument has the byval attribute on it
+/// in its containing function.
+bool Argument::hasByValAttr() const {
+ if (!isa<PointerType>(getType())) return false;
+ return getParent()->paramHasAttr(getArgNo()+1, ParamAttr::ByVal);
+}
+
+/// hasNoAliasAttr - Return true if this argument has the noalias attribute on
+/// it in its containing function.
+bool Argument::hasNoAliasAttr() const {
+ if (!isa<PointerType>(getType())) return false;
+ return getParent()->paramHasAttr(getArgNo()+1, ParamAttr::NoAlias);
+}
+
+
+
+
//===----------------------------------------------------------------------===//
// Helper Methods in Function
//===----------------------------------------------------------------------===//