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! llvm-svn: 136753
This commit is contained in:
@@ -1407,6 +1407,17 @@ static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old,
|
||||
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 @@ static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old,
|
||||
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 @@ static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old,
|
||||
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.
|
||||
|
||||
Reference in New Issue
Block a user