+//===----------------------------------------------------------------------===//
+// 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 ParamAttr::None;
+}
+
+
+std::string
+ParamAttrsList::getParamAttrsText(uint16_t Attrs) {
+ std::string Result;
+ if (Attrs & ParamAttr::ZExt)
+ Result += "zeroext ";
+ if (Attrs & ParamAttr::SExt)
+ Result += "signext ";
+ if (Attrs & ParamAttr::NoReturn)
+ Result += "noreturn ";
+ if (Attrs & ParamAttr::NoUnwind)
+ Result += "nounwind ";
+ if (Attrs & ParamAttr::InReg)
+ Result += "inreg ";
+ if (Attrs & ParamAttr::NoAlias)
+ Result += "noalias ";
+ if (Attrs & ParamAttr::StructRet)
+ Result += "sret ";
+ if (Attrs & ParamAttr::ByVal)
+ Result += "byval ";
+ return Result;
+}
+
+void
+ParamAttrsList::Profile(FoldingSetNodeID &ID) const {
+ for (unsigned i = 0; i < attrs.size(); ++i) {
+ unsigned val = attrs[i].attrs << 16 | attrs[i].index;
+ ID.AddInteger(val);
+ }
+}
+
+static ManagedStatic<FoldingSet<ParamAttrsList> > ParamAttrsLists;
+
+ParamAttrsList *
+ParamAttrsList::get(const ParamAttrsVector &attrVec) {
+ assert(!attrVec.empty() && "Illegal to create empty ParamAttrsList");
+ ParamAttrsList key(attrVec);
+ FoldingSetNodeID ID;
+ key.Profile(ID);
+ void *InsertPos;
+ ParamAttrsList* PAL = ParamAttrsLists->FindNodeOrInsertPos(ID, InsertPos);
+ if (!PAL) {
+ PAL = new ParamAttrsList(attrVec);
+ ParamAttrsLists->InsertNode(PAL, InsertPos);
+ }
+ return PAL;
+}
+
+ParamAttrsList::~ParamAttrsList() {
+ ParamAttrsLists->RemoveNode(this);
+}
+