From eb824709cbc6810bfc35833833c5b5cb069f6c40 Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Fri, 11 Jan 2008 21:23:39 +0000 Subject: [PATCH] If there are attributes on the varargs part of a 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 | 18 ++++++++++++++++-- test/Assembler/2008-01-11-VarargAttrs.ll | 10 ++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 test/Assembler/2008-01-11-VarargAttrs.ll diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index 9f12b3eaa39..9674bba4d53 100644 --- a/lib/AsmParser/llvmAsmParser.y +++ b/lib/AsmParser/llvmAsmParser.y @@ -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 index 00000000000..c46b2a563e7 --- /dev/null +++ b/test/Assembler/2008-01-11-VarargAttrs.ll @@ -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 +}