Revert "[WebAssembly] Update use of Attributes after r299875"
authorDerek Schuff <dschuff@google.com>
Wed, 12 Apr 2017 01:17:31 +0000 (01:17 +0000)
committerDerek Schuff <dschuff@google.com>
Wed, 12 Apr 2017 01:17:31 +0000 (01:17 +0000)
This reverts commit 2a0eb61dcccb15058d5b2a572bb3da0cf47fd550, r300015

I raced with rnk on the commit.

llvm-svn: 300016

llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp

index 08e2707..16e7ffa 100644 (file)
@@ -435,23 +435,26 @@ Value *WebAssemblyLowerEmscriptenEHSjLj::wrapInvoke(CallOrInvoke *CI) {
 
   // Because we added the pointer to the callee as first argument, all
   // argument attribute indices have to be incremented by one.
-  SmallVector<AttributeSetNode *, 8> AttributesVec;
-  const AttributeList &InvokeAL = CI->getAttributes();
-
-  // Add any return attributes.
-  AttributesVec.push_back(InvokeAL.getRetAttributes());
-  // No attributes for the callee pointer.
-  AttributesVec.push_back(nullptr);
-  // Copy the argument attributes from the original
-  for (unsigned i = 1, e = CI->getNumArgOperands(); i <= e; ++i) {
-    AttributesVec.push_back(InvokeAL.getParamAttributes(i));
+  SmallVector<AttributeList, 8> AttributesVec;
+  const AttributeList &InvokePAL = CI->getAttributes();
+  CallSite::arg_iterator AI = CI->arg_begin();
+  unsigned i = 1; // Argument attribute index starts from 1
+  for (unsigned e = CI->getNumArgOperands(); i <= e; ++AI, ++i) {
+    if (InvokePAL.hasAttributes(i)) {
+      AttrBuilder B(InvokePAL, i);
+      AttributesVec.push_back(AttributeList::get(C, i + 1, B));
+    }
   }
-
+  // Add any return attributes.
+  if (InvokePAL.hasAttributes(AttributeList::ReturnIndex))
+    AttributesVec.push_back(
+        AttributeList::get(C, InvokePAL.getRetAttributes()));
   // Add any function attributes.
-  AttributesVec.push_back(InvokeAL.getFnAttributes());
+  if (InvokePAL.hasAttributes(AttributeList::FunctionIndex))
+    AttributesVec.push_back(AttributeList::get(C, InvokePAL.getFnAttributes()));
   // Reconstruct the AttributesList based on the vector we constructed.
-  AttributeList NewCallAL = AttributeList::get(C, AttributesVec);
-  NewCall->setAttributes(NewCallAL);
+  AttributeList NewCallPAL = AttributeList::get(C, AttributesVec);
+  NewCall->setAttributes(NewCallPAL);
 
   CI->replaceAllUsesWith(NewCall);