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.
/// \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
//===--------------------------------------------------------------------===//
/// \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;
// 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) ?
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
//===----------------------------------------------------------------------===//
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) {
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 ..........................................--*/
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
//===----------------------------------------------------------------------===//
} 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;
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();
// 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.
// 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()
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))
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;
}
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 {
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;
}
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;
}
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;
}
// 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
}
// 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 (!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);
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)
// 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);
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(),