If there are attributes on the varargs part of a
authorDuncan Sands <baldrick@free.fr>
Fri, 11 Jan 2008 21:23:39 +0000 (21:23 +0000)
committerDuncan Sands <baldrick@free.fr>
Fri, 11 Jan 2008 21:23:39 +0000 (21:23 +0000)
call, don't discard them.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45884 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AsmParser/llvmAsmParser.y
test/Assembler/2008-01-11-VarargAttrs.ll [new file with mode: 0644]

index 9f12b3eaa3990795bdaf8fdce58028f64da2ce18..9674bba4d53bbfa3e7777a133c0e75c89116dba7 100644 (file)
@@ -2675,8 +2675,15 @@ BBTerminatorInst : RET ResolvedVal {              // Return with a result...
 
       if (Ty->isVarArg()) {
         if (I == E)
-          for (; ArgI != ArgE; ++ArgI)
+          for (; ArgI != ArgE; ++ArgI, ++index) {
             Args.push_back(ArgI->Val); // push the remaining varargs
+            if (ArgI->Attrs != ParamAttr::None) {
+              ParamAttrsWithIndex PAWI;
+              PAWI.index = index;
+              PAWI.attrs = ArgI->Attrs;
+              Attrs.push_back(PAWI);
+            }
+          }
       } else if (I != E || ArgI != ArgE)
         GEN_ERROR("Invalid number of parameters detected");
     }
@@ -3006,8 +3013,15 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
       }
       if (Ty->isVarArg()) {
         if (I == E)
-          for (; ArgI != ArgE; ++ArgI)
+          for (; ArgI != ArgE; ++ArgI, ++index) {
             Args.push_back(ArgI->Val); // push the remaining varargs
+            if (ArgI->Attrs != ParamAttr::None) {
+              ParamAttrsWithIndex PAWI;
+              PAWI.index = index;
+              PAWI.attrs = ArgI->Attrs;
+              Attrs.push_back(PAWI);
+            }
+          }
       } else if (I != E || ArgI != ArgE)
         GEN_ERROR("Invalid number of parameters detected");
     }
diff --git a/test/Assembler/2008-01-11-VarargAttrs.ll b/test/Assembler/2008-01-11-VarargAttrs.ll
new file mode 100644 (file)
index 0000000..c46b2a5
--- /dev/null
@@ -0,0 +1,10 @@
+; RUN: llvm-as < %s | llvm-dis | grep byval | count 2
+
+       %struct = type {  }
+
+declare void @foo(...)
+
+define void @bar() {
+       call void (...)* @foo(%struct* byval null, %struct* byval null )
+       ret void
+}