mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
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:
parent
d3afa9be99
commit
28d65722d6
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -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 ..........................................--*/
|
||||
|
@ -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
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -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.
|
||||
|
@ -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))
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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(),
|
||||
|
Loading…
Reference in New Issue
Block a user