aboutsummaryrefslogtreecommitdiff
path: root/lib/VMCore/Function.cpp
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2007-04-09 15:01:12 +0000
committerReid Spencer <rspencer@reidspencer.com>2007-04-09 15:01:12 +0000
commit4746ecf16eeb5ff920672fdff1c0dd85594437ed (patch)
tree3325b29641ff0704e69a93a2994446de651e4ea4 /lib/VMCore/Function.cpp
parentefc366263659db05ddc5e14532946cb9213bcdd6 (diff)
For PR1146:
* Add ParamAttrList pointers to Function and CallInst. * Move the implementation of ParamAttrList from Type.cpp to Function.cpp git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35818 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/Function.cpp')
-rw-r--r--lib/VMCore/Function.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp
index 5da3cebb06..c6bf331ccb 100644
--- a/lib/VMCore/Function.cpp
+++ b/lib/VMCore/Function.cpp
@@ -72,12 +72,76 @@ void Argument::setParent(Function *parent) {
}
//===----------------------------------------------------------------------===//
+// ParamAttrsList Implementation
+//===----------------------------------------------------------------------===//
+
+uint16_t
+ParamAttrsList::getParamAttrs(uint16_t Index) const {
+ unsigned limit = attrs.size();
+ for (unsigned i = 0; i < limit; ++i)
+ if (attrs[i].index == Index)
+ return attrs[i].attrs;
+ return NoAttributeSet;
+}
+
+
+std::string
+ParamAttrsList::getParamAttrsText(uint16_t Attrs) {
+ std::string Result;
+ if (Attrs & ZExtAttribute)
+ Result += "zext ";
+ if (Attrs & SExtAttribute)
+ Result += "sext ";
+ if (Attrs & NoReturnAttribute)
+ Result += "noreturn ";
+ if (Attrs & NoUnwindAttribute)
+ Result += "nounwind ";
+ if (Attrs & InRegAttribute)
+ Result += "inreg ";
+ if (Attrs & StructRetAttribute)
+ Result += "sret ";
+ return Result;
+}
+
+void
+ParamAttrsList::addAttributes(uint16_t Index, uint16_t Attrs) {
+ // First, try to replace an existing one
+ for (unsigned i = 0; i < attrs.size(); ++i)
+ if (attrs[i].index == Index) {
+ attrs[i].attrs |= Attrs;
+ return;
+ }
+
+ // If not found, add a new one
+ ParamAttrsWithIndex Val;
+ Val.attrs = Attrs;
+ Val.index = Index;
+ attrs.push_back(Val);
+}
+
+void
+ParamAttrsList::removeAttributes(uint16_t Index, uint16_t Attrs) {
+ // Find the index from which to remove the attributes
+ for (unsigned i = 0; i < attrs.size(); ++i)
+ if (attrs[i].index == Index) {
+ attrs[i].attrs &= ~Attrs;
+ if (attrs[i].attrs == NoAttributeSet)
+ attrs.erase(&attrs[i]);
+ return;
+ }
+
+ // The index wasn't found above
+ assert(0 && "Index not found for removeAttributes");
+}
+
+//===----------------------------------------------------------------------===//
// Function Implementation
//===----------------------------------------------------------------------===//
Function::Function(const FunctionType *Ty, LinkageTypes Linkage,
const std::string &name, Module *ParentModule)
: GlobalValue(PointerType::get(Ty), Value::FunctionVal, 0, 0, Linkage, name) {
+ ParamAttrs = 0;
CallingConvention = 0;
BasicBlocks.setItemParent(this);
BasicBlocks.setParent(this);