Remove the last of uses that use the Attribute object as a collection of attributes.

Collections of attributes are handled via the AttributeSet class now. This
finally frees us up to make significant changes to how attributes are structured.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173228 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling 2013-01-23 06:14:59 +00:00
parent d3afa9be99
commit 28d65722d6
10 changed files with 93 additions and 59 deletions

View File

@ -79,10 +79,10 @@ public:
bool hasStructRetAttr() const;
/// \brief Add a Attribute to an argument.
void addAttr(Attribute);
void addAttr(AttributeSet AS);
/// \brief Remove a Attribute from an argument.
void removeAttr(Attribute);
void removeAttr(AttributeSet AS);
/// \brief Method for support type inquiry through isa, cast, and
/// dyn_cast.

View File

@ -234,6 +234,8 @@ public:
/// \brief Return an AttributeSet with the specified parameters in it.
static AttributeSet get(LLVMContext &C, ArrayRef<AttributeWithIndex> Attrs);
static AttributeSet get(LLVMContext &C, unsigned Idx,
Attribute::AttrKind Kind);
static AttributeSet get(LLVMContext &C, unsigned Idx, AttrBuilder &B);
/// \brief Add an attribute to the attribute set at the given index. Since
@ -275,9 +277,7 @@ public:
//===--------------------------------------------------------------------===//
/// \brief The attributes for the specified index are returned.
Attribute getParamAttributes(unsigned Idx) const {
return getAttributes(Idx);
}
AttributeSet getParamAttributes(unsigned Idx) const;
/// \brief The attributes for the ret value are returned.
AttributeSet getRetAttributes() const;

View File

@ -541,6 +541,14 @@ AttributeWithIndex AttributeWithIndex::get(LLVMContext &C, unsigned Idx,
// AttributeSetImpl Definition
//===----------------------------------------------------------------------===//
AttributeSet AttributeSet::getParamAttributes(unsigned Idx) const {
// FIXME: Remove.
return AttrList && hasAttributes(Idx) ?
AttributeSet::get(AttrList->getContext(),
AttributeWithIndex::get(Idx, getAttributes(Idx))) :
AttributeSet();
}
AttributeSet AttributeSet::getRetAttributes() const {
// FIXME: Remove.
return AttrList && hasAttributes(ReturnIndex) ?
@ -601,6 +609,11 @@ AttributeSet AttributeSet::get(LLVMContext &C, unsigned Idx, AttrBuilder &B) {
return get(C, AttributeWithIndex::get(Idx, Attribute::get(C, B)));
}
AttributeSet AttributeSet::get(LLVMContext &C, unsigned Idx,
Attribute::AttrKind Kind) {
return get(C, AttributeWithIndex::get(Idx, Attribute::get(C, Kind)));
}
//===----------------------------------------------------------------------===//
// AttributeSet Method Implementations
//===----------------------------------------------------------------------===//

View File

@ -1467,13 +1467,13 @@ LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg) {
void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA) {
Argument *A = unwrap<Argument>(Arg);
AttrBuilder B(PA);
A->addAttr(Attribute::get(A->getContext(), B));
A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B));
}
void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA) {
Argument *A = unwrap<Argument>(Arg);
AttrBuilder B(PA);
A->removeAttr(Attribute::get(A->getContext(), B));
A->removeAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B));
}
LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg) {
@ -1484,10 +1484,10 @@ LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg) {
void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align) {
Argument *A = unwrap<Argument>(Arg);
AttrBuilder B;
B.addAlignmentAttr(align);
unwrap<Argument>(Arg)->addAttr(Attribute::
get(unwrap<Argument>(Arg)->getContext(), B));
A->addAttr(AttributeSet::get(A->getContext(),A->getArgNo() + 1, B));
}
/*--.. Operations on basic blocks ..........................................--*/

View File

@ -123,23 +123,16 @@ bool Argument::hasStructRetAttr() const {
hasAttribute(1, Attribute::StructRet);
}
/// addAttr - Add a Attribute to an argument
void Argument::addAttr(Attribute attr) {
AttrBuilder B(attr);
getParent()->addAttributes(getArgNo() + 1,
AttributeSet::get(getParent()->getContext(),
getArgNo() + 1, B));
/// addAttr - Add attributes to an argument.
void Argument::addAttr(AttributeSet AS) {
getParent()->addAttributes(getArgNo() + 1, AS);
}
/// removeAttr - Remove a Attribute from an argument
void Argument::removeAttr(Attribute attr) {
AttrBuilder B(attr);
getParent()->removeAttributes(getArgNo() + 1,
AttributeSet::get(getParent()->getContext(),
getArgNo() + 1, B));
/// removeAttr - Remove attributes from an argument.
void Argument::removeAttr(AttributeSet AS) {
getParent()->removeAttributes(getArgNo() + 1, AS);
}
//===----------------------------------------------------------------------===//
// Helper Methods in Function
//===----------------------------------------------------------------------===//

View File

@ -537,9 +537,13 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
} else if (!ArgsToPromote.count(I)) {
// Unchanged argument
Params.push_back(I->getType());
Attribute attrs = PAL.getParamAttributes(ArgIndex);
if (attrs.hasAttributes())
AttributesVec.push_back(AttributeWithIndex::get(Params.size(), attrs));
AttributeSet attrs = PAL.getParamAttributes(ArgIndex);
if (attrs.hasAttributes(ArgIndex)) {
AttributesVec.
push_back(AttributeWithIndex::get(F->getContext(),
ArgIndex, attrs));
AttributesVec.back().Index = Params.size();
}
} else if (I->use_empty()) {
// Dead argument (which are always marked as promotable)
++NumArgumentsDead;
@ -653,10 +657,12 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
if (!ArgsToPromote.count(I) && !ByValArgsToTransform.count(I)) {
Args.push_back(*AI); // Unmodified argument
Attribute Attrs = CallPAL.getParamAttributes(ArgIndex);
if (Attrs.hasAttributes())
AttributesVec.push_back(AttributeWithIndex::get(Args.size(), Attrs));
if (CallPAL.hasAttributes(ArgIndex)) {
AttributesVec.
push_back(AttributeWithIndex::get(F->getContext(), ArgIndex,
CallPAL.getParamAttributes(ArgIndex)));
AttributesVec.back().Index = Args.size();
}
} else if (ByValArgsToTransform.count(I)) {
// Emit a GEP and load for each element of the struct.
Type *AgTy = cast<PointerType>(I->getType())->getElementType();
@ -715,9 +721,12 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
// Push any varargs arguments on the list.
for (; AI != CS.arg_end(); ++AI, ++ArgIndex) {
Args.push_back(*AI);
Attribute Attrs = CallPAL.getParamAttributes(ArgIndex);
if (Attrs.hasAttributes())
AttributesVec.push_back(AttributeWithIndex::get(Args.size(), Attrs));
if (CallPAL.hasAttributes(ArgIndex)) {
AttributesVec.
push_back(AttributeWithIndex::get(F->getContext(), ArgIndex,
CallPAL.getParamAttributes(ArgIndex)));
AttributesVec.back().Index = Args.size();
}
}
// Add any function attributes.

View File

@ -791,9 +791,12 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
// Get the original parameter attributes (skipping the first one, that is
// for the return value.
Attribute Attrs = PAL.getParamAttributes(i + 1);
if (Attrs.hasAttributes())
AttributesVec.push_back(AttributeWithIndex::get(Params.size(), Attrs));
if (PAL.hasAttributes(i + 1)) {
AttributesVec.
push_back(AttributeWithIndex::get(F->getContext(), i + 1,
PAL.getParamAttributes(i + 1)));
AttributesVec.back().Index = Params.size();
}
} else {
++NumArgumentsEliminated;
DEBUG(dbgs() << "DAE - Removing argument " << i << " (" << I->getName()
@ -859,17 +862,23 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
if (ArgAlive[i]) {
Args.push_back(*I);
// Get original parameter attributes, but skip return attributes.
Attribute Attrs = CallPAL.getParamAttributes(i + 1);
if (Attrs.hasAttributes())
AttributesVec.push_back(AttributeWithIndex::get(Args.size(), Attrs));
if (CallPAL.hasAttributes(i + 1)) {
AttributesVec.
push_back(AttributeWithIndex::get(F->getContext(), i + 1,
CallPAL.getParamAttributes(i + 1)));
AttributesVec.back().Index = Args.size();
}
}
// Push any varargs arguments on the list. Don't forget their attributes.
for (CallSite::arg_iterator E = CS.arg_end(); I != E; ++I, ++i) {
Args.push_back(*I);
Attribute Attrs = CallPAL.getParamAttributes(i + 1);
if (Attrs.hasAttributes())
AttributesVec.push_back(AttributeWithIndex::get(Args.size(), Attrs));
if (CallPAL.hasAttributes(i + 1)) {
AttributesVec.
push_back(AttributeWithIndex::get(F->getContext(), i + 1,
CallPAL.getParamAttributes(i + 1)));
AttributesVec.back().Index = Args.size();
}
}
if (CallPAL.hasAttributes(AttributeSet::FunctionIndex))

View File

@ -380,7 +380,7 @@ bool FunctionAttrs::AddNoCaptureAttrs(const CallGraphSCC &SCC) {
for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end();
A != E; ++A) {
if (A->getType()->isPointerTy() && !A->hasNoCaptureAttr()) {
A->addAttr(Attribute::get(F->getContext(), B));
A->addAttr(AttributeSet::get(F->getContext(), A->getArgNo() + 1, B));
++NumNoCapture;
Changed = true;
}
@ -395,7 +395,7 @@ bool FunctionAttrs::AddNoCaptureAttrs(const CallGraphSCC &SCC) {
if (!Tracker.Captured) {
if (Tracker.Uses.empty()) {
// If it's trivially not captured, mark it nocapture now.
A->addAttr(Attribute::get(F->getContext(), B));
A->addAttr(AttributeSet::get(F->getContext(), A->getArgNo()+1, B));
++NumNoCapture;
Changed = true;
} else {
@ -430,7 +430,9 @@ bool FunctionAttrs::AddNoCaptureAttrs(const CallGraphSCC &SCC) {
ArgumentSCC[0]->Uses[0] == ArgumentSCC[0]) {
ArgumentSCC[0]->
Definition->
addAttr(Attribute::get(ArgumentSCC[0]->Definition->getContext(), B));
addAttr(AttributeSet::get(ArgumentSCC[0]->Definition->getContext(),
ArgumentSCC[0]->Definition->getArgNo() + 1,
B));
++NumNoCapture;
Changed = true;
}
@ -472,7 +474,7 @@ bool FunctionAttrs::AddNoCaptureAttrs(const CallGraphSCC &SCC) {
for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) {
Argument *A = ArgumentSCC[i]->Definition;
A->addAttr(Attribute::get(A->getContext(), B));
A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B));
++NumNoCapture;
Changed = true;
}

View File

@ -1044,14 +1044,15 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) {
if (!CastInst::isCastable(ActTy, ParamTy))
return false; // Cannot transform this parameter value.
Attribute Attrs = CallerPAL.getParamAttributes(i + 1);
if (AttrBuilder(Attrs).
if (AttrBuilder(CallerPAL.getParamAttributes(i + 1), i + 1).
hasAttributes(Attribute::typeIncompatible(ParamTy)))
return false; // Attribute not compatible with transformed value.
// If the parameter is passed as a byval argument, then we have to have a
// sized type and the sized type has to have the same size as the old type.
if (ParamTy != ActTy && Attrs.hasAttribute(Attribute::ByVal)) {
if (ParamTy != ActTy &&
CallerPAL.getParamAttributes(i + 1).hasAttribute(i + 1,
Attribute::ByVal)) {
PointerType *ParamPTy = dyn_cast<PointerType>(ParamTy);
if (ParamPTy == 0 || !ParamPTy->getElementType()->isSized() || TD == 0)
return false;
@ -1141,9 +1142,11 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) {
}
// Add any parameter attributes.
Attribute PAttrs = CallerPAL.getParamAttributes(i + 1);
AttrBuilder PAttrs(CallerPAL.getParamAttributes(i + 1), i + 1);
if (PAttrs.hasAttributes())
attrVec.push_back(AttributeWithIndex::get(i + 1, PAttrs));
attrVec.push_back(
AttributeWithIndex::get(i + 1,
Attribute::get(FT->getContext(), PAttrs)));
}
// If the function takes more arguments than the call was taking, add them
@ -1168,9 +1171,11 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) {
}
// Add any parameter attributes.
Attribute PAttrs = CallerPAL.getParamAttributes(i + 1);
AttrBuilder PAttrs(CallerPAL.getParamAttributes(i + 1), i + 1);
if (PAttrs.hasAttributes())
attrVec.push_back(AttributeWithIndex::get(i + 1, PAttrs));
attrVec.push_back(
AttributeWithIndex::get(i + 1,
Attribute::get(FT->getContext(), PAttrs)));
}
}
}
@ -1263,12 +1268,12 @@ InstCombiner::transformCallThroughTrampoline(CallSite CS,
if (!NestAttrs.isEmpty()) {
unsigned NestIdx = 1;
Type *NestTy = 0;
Attribute NestAttr;
AttributeSet NestAttr;
// Look for a parameter marked with the 'nest' attribute.
for (FunctionType::param_iterator I = NestFTy->param_begin(),
E = NestFTy->param_end(); I != E; ++NestIdx, ++I)
if (NestAttrs.getParamAttributes(NestIdx).hasAttribute(Attribute::Nest)){
if (NestAttrs.hasAttribute(NestIdx, Attribute::Nest)) {
// Record the parameter type and any other attributes.
NestTy = *I;
NestAttr = NestAttrs.getParamAttributes(NestIdx);
@ -1302,7 +1307,8 @@ InstCombiner::transformCallThroughTrampoline(CallSite CS,
if (NestVal->getType() != NestTy)
NestVal = Builder->CreateBitCast(NestVal, NestTy, "nest");
NewArgs.push_back(NestVal);
NewAttrs.push_back(AttributeWithIndex::get(NestIdx, NestAttr));
NewAttrs.push_back(AttributeWithIndex::get(Caller->getContext(),
NestIdx, NestAttr));
}
if (I == E)
@ -1310,10 +1316,12 @@ InstCombiner::transformCallThroughTrampoline(CallSite CS,
// Add the original argument and attributes.
NewArgs.push_back(*I);
Attribute Attr = Attrs.getParamAttributes(Idx);
if (Attr.hasAttributes())
AttributeSet Attr = Attrs.getParamAttributes(Idx);
if (Attr.hasAttributes(Idx)) {
NewAttrs.push_back
(AttributeWithIndex::get(Idx + (Idx >= NestIdx), Attr));
(AttributeWithIndex::get(Caller->getContext(), Idx, Attr));
NewAttrs.back().Index = Idx + (Idx >= NestIdx);
}
++Idx, ++I;
} while (1);

View File

@ -95,7 +95,7 @@ void llvm::CloneFunctionInto(Function *NewFunc, const Function *OldFunc,
for (Function::const_arg_iterator I = OldFunc->arg_begin(),
E = OldFunc->arg_end(); I != E; ++I)
if (Argument* Anew = dyn_cast<Argument>(VMap[I]))
Anew->addAttr( OldFunc->getAttributes()
Anew->addAttr(OldFunc->getAttributes()
.getParamAttributes(I->getArgNo() + 1));
NewFunc->setAttributes(NewFunc->getAttributes()
.addRetAttributes(NewFunc->getContext(),