Add hasByValAttr() and hasNoAliasAttr() methods to the Argument class.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46314 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2008-01-24 17:47:11 +00:00
parent 23e202dee0
commit de6fa5f25f
2 changed files with 44 additions and 2 deletions

View File

@ -39,13 +39,24 @@ public:
/// Argument ctor - If Function argument is specified, this argument is /// Argument ctor - If Function argument is specified, this argument is
/// inserted at the end of the argument list for the function. /// inserted at the end of the argument list for the function.
/// ///
explicit Argument(const Type *Ty, explicit Argument(const Type *Ty, const std::string &Name = "",
const std::string &Name = "",
Function *F = 0); Function *F = 0);
inline const Function *getParent() const { return Parent; } inline const Function *getParent() const { return Parent; }
inline Function *getParent() { 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; virtual void print(std::ostream &OS) const;
void print(std::ostream *OS) const { void print(std::ostream *OS) const {
if (OS) print(*OS); if (OS) print(*OS);

View File

@ -75,6 +75,37 @@ void Argument::setParent(Function *parent) {
LeakDetector::removeGarbageObject(this); 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 // Helper Methods in Function
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//