[cfe-commits] r136753 - in /cfe/trunk: lib/CodeGen/CodeGenModule.cpp test/CodeGen/kr-call.c
John McCall
rjmccall at apple.com
Tue Aug 2 17:43:55 PDT 2011
Author: rjmccall
Date: Tue Aug 2 19:43:55 2011
New Revision: 136753
URL: http://llvm.org/viewvc/llvm-project?rev=136753&view=rev
Log:
When rewriting a call to a K&R function to lead to a well-prototyped
function, be sure to drop parameter attributes when dropping their
associated arguments. Patch by Aaron Landwehr!
Added:
cfe/trunk/test/CodeGen/kr-call.c
Modified:
cfe/trunk/lib/CodeGen/CodeGenModule.cpp
Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=136753&r1=136752&r2=136753&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Tue Aug 2 19:43:55 2011
@@ -1407,6 +1407,17 @@
if (CI->getType() != NewRetTy && !CI->use_empty())
continue;
+ // Get the attribute list.
+ llvm::SmallVector<llvm::AttributeWithIndex, 8> AttrVec;
+ llvm::AttrListPtr AttrList = CI->getAttributes();
+
+ // Get any return attributes.
+ llvm::Attributes RAttrs = AttrList.getRetAttributes();
+
+ // Add the return attributes.
+ if (RAttrs)
+ AttrVec.push_back(llvm::AttributeWithIndex::get(0, RAttrs));
+
// If the function was passed too few arguments, don't transform. If extra
// arguments were passed, we silently drop them. If any of the types
// mismatch, we don't transform.
@@ -1419,10 +1430,17 @@
DontTransform = true;
break;
}
+
+ // Add any parameter attributes.
+ if (llvm::Attributes PAttrs = AttrList.getParamAttributes(ArgNo + 1))
+ AttrVec.push_back(llvm::AttributeWithIndex::get(ArgNo + 1, PAttrs));
}
if (DontTransform)
continue;
+ if (llvm::Attributes FnAttrs = AttrList.getFnAttributes())
+ AttrVec.push_back(llvm::AttributeWithIndex::get(~0, FnAttrs));
+
// Okay, we can transform this. Create the new call instruction and copy
// over the required information.
ArgList.append(CS.arg_begin(), CS.arg_begin() + ArgNo);
@@ -1430,7 +1448,8 @@
ArgList.clear();
if (!NewCall->getType()->isVoidTy())
NewCall->takeName(CI);
- NewCall->setAttributes(CI->getAttributes());
+ NewCall->setAttributes(llvm::AttrListPtr::get(AttrVec.begin(),
+ AttrVec.end()));
NewCall->setCallingConv(CI->getCallingConv());
// Finally, remove the old call, replacing any uses with the new one.
Added: cfe/trunk/test/CodeGen/kr-call.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/kr-call.c?rev=136753&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/kr-call.c (added)
+++ cfe/trunk/test/CodeGen/kr-call.c Tue Aug 2 19:43:55 2011
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -triple s390x-unknown-linux -emit-llvm -o - %s | FileCheck %s
+
+// Test that we don't crash. The s390x-unknown-linux target happens
+// to need to set a sext argument attribute on this call, and we need
+// to make sure that rewriting it correctly drops that attribute when
+// also dropping the spurious argument.
+void test0_helper();
+void test0() {
+ // CHECK: call void @test0_helper()
+ test0_helper(1);
+}
+void test0_helper() {}
+
More information about the cfe-commits
mailing list