Make the 'get*AlignmentFromAttr' functions into member functions within the Attributes class.

llvm-svn: 164308
This commit is contained in:
Bill Wendling 2012-09-20 16:27:05 +00:00
parent b4e211cd19
commit abac66150c
5 changed files with 33 additions and 30 deletions

View File

@ -205,6 +205,24 @@ public:
return Bits & Attribute::StackAlignment_i; return Bits & Attribute::StackAlignment_i;
} }
/// This returns the alignment field of an attribute as a byte alignment
/// value.
unsigned getAlignment() const {
if (!hasAlignmentAttr())
return 0;
return 1U << ((getRawAlignment() >> 16) - 1);
}
/// This returns the stack alignment field of an attribute as a byte alignment
/// value.
unsigned getStackAlignment() const {
if (!hasStackAlignmentAttr())
return 0;
return 1U << ((getRawStackAlignment() >> 26) - 1);
}
// This is a "safe bool() operator". // This is a "safe bool() operator".
operator const void *() const { return Bits ? this : 0; } operator const void *() const { return Bits ? this : 0; }
bool isEmptyOrSingleton() const { return (Bits & (Bits - 1)) == 0; } bool isEmptyOrSingleton() const { return (Bits & (Bits - 1)) == 0; }
@ -212,8 +230,9 @@ public:
return Bits == Attrs.Bits; return Bits == Attrs.Bits;
} }
bool operator != (const Attributes &Attrs) const { bool operator != (const Attributes &Attrs) const {
return Bits != Attrs.Bits; return !(this == Attrs);
} }
Attributes operator | (const Attributes &Attrs) const { Attributes operator | (const Attributes &Attrs) const {
return Attributes(Bits | Attrs.Bits); return Attributes(Bits | Attrs.Bits);
} }
@ -294,14 +313,6 @@ inline Attributes constructAlignmentFromInt(unsigned i) {
return Attributes((Log2_32(i)+1) << 16); return Attributes((Log2_32(i)+1) << 16);
} }
/// This returns the alignment field of an attribute as a byte alignment value.
inline unsigned getAlignmentFromAttrs(Attributes A) {
if (!A.hasAlignmentAttr())
return 0;
return 1U << ((A.getRawAlignment() >> 16) - 1);
}
/// This turns an int stack alignment (which must be a power of 2) into /// This turns an int stack alignment (which must be a power of 2) into
/// the form used internally in Attributes. /// the form used internally in Attributes.
inline Attributes constructStackAlignmentFromInt(unsigned i) { inline Attributes constructStackAlignmentFromInt(unsigned i) {
@ -314,15 +325,6 @@ inline Attributes constructStackAlignmentFromInt(unsigned i) {
return Attributes((Log2_32(i)+1) << 26); return Attributes((Log2_32(i)+1) << 26);
} }
/// This returns the stack alignment field of an attribute as a byte alignment
/// value.
inline unsigned getStackAlignmentFromAttrs(Attributes A) {
if (!A.hasStackAlignmentAttr())
return 0;
return 1U << ((A.getRawStackAlignment() >> 26) - 1);
}
/// This returns an integer containing an encoding of all the /// This returns an integer containing an encoding of all the
/// LLVM attributes found in the given attribute bitset. Any /// LLVM attributes found in the given attribute bitset. Any
/// change to this encoding is a breaking change to bitcode /// change to this encoding is a breaking change to bitcode
@ -450,7 +452,7 @@ public:
/// getParamAlignment - Return the alignment for the specified function /// getParamAlignment - Return the alignment for the specified function
/// parameter. /// parameter.
unsigned getParamAlignment(unsigned Idx) const { unsigned getParamAlignment(unsigned Idx) const {
return Attribute::getAlignmentFromAttrs(getAttributes(Idx)); return getAttributes(Idx).getAlignment();
} }
/// hasAttrSomewhere - Return true if the specified attribute is set for at /// hasAttrSomewhere - Return true if the specified attribute is set for at

View File

@ -2717,7 +2717,7 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) {
// If the alignment was parsed as an attribute, move to the alignment field. // If the alignment was parsed as an attribute, move to the alignment field.
if (FuncAttrs & Attribute::Alignment) { if (FuncAttrs & Attribute::Alignment) {
Alignment = Attribute::getAlignmentFromAttrs(FuncAttrs); Alignment = FuncAttrs.getAlignment();
FuncAttrs &= ~Attribute::Alignment; FuncAttrs &= ~Attribute::Alignment;
} }

View File

@ -60,8 +60,8 @@ MachineFunction::MachineFunction(const Function *F, const TargetMachine &TM,
MFInfo = 0; MFInfo = 0;
FrameInfo = new (Allocator) MachineFrameInfo(*TM.getFrameLowering()); FrameInfo = new (Allocator) MachineFrameInfo(*TM.getFrameLowering());
if (Fn->hasFnAttr(Attribute::StackAlignment)) if (Fn->hasFnAttr(Attribute::StackAlignment))
FrameInfo->ensureMaxAlignment(Attribute::getStackAlignmentFromAttrs( FrameInfo->ensureMaxAlignment(Fn->getAttributes().
Fn->getAttributes().getFnAttributes())); getFnAttributes().getStackAlignment());
ConstantPool = new (Allocator) MachineConstantPool(TM.getTargetData()); ConstantPool = new (Allocator) MachineConstantPool(TM.getTargetData());
Alignment = TM.getTargetLowering()->getMinFunctionAlignment(); Alignment = TM.getTargetLowering()->getMinFunctionAlignment();
// FIXME: Shouldn't use pref alignment if explicit alignment is set on Fn. // FIXME: Shouldn't use pref alignment if explicit alignment is set on Fn.

View File

@ -508,7 +508,7 @@ void CppWriter::printAttributes(const AttrListPtr &PAL,
#undef HANDLE_ATTR #undef HANDLE_ATTR
if (attrs & Attribute::StackAlignment) if (attrs & Attribute::StackAlignment)
Out << " | Attribute::constructStackAlignmentFromInt(" Out << " | Attribute::constructStackAlignmentFromInt("
<< Attribute::getStackAlignmentFromAttrs(attrs) << attrs.getStackAlignment()
<< ")"; << ")";
attrs &= ~Attribute::StackAlignment; attrs &= ~Attribute::StackAlignment;
assert(attrs == 0 && "Unhandled attribute!"); assert(attrs == 0 && "Unhandled attribute!");

View File

@ -80,12 +80,12 @@ std::string Attributes::getAsString() const {
Result += "address_safety "; Result += "address_safety ";
if (hasStackAlignmentAttr()) { if (hasStackAlignmentAttr()) {
Result += "alignstack("; Result += "alignstack(";
Result += utostr(Attribute::getStackAlignmentFromAttrs(*this)); Result += utostr(getStackAlignment());
Result += ") "; Result += ") ";
} }
if (hasAlignmentAttr()) { if (hasAlignmentAttr()) {
Result += "align "; Result += "align ";
Result += utostr(Attribute::getAlignmentFromAttrs(*this)); Result += utostr(getAlignment());
Result += " "; Result += " ";
} }
// Trim the trailing space. // Trim the trailing space.
@ -174,7 +174,7 @@ AttrListPtr AttrListPtr::get(ArrayRef<AttributeWithIndex> Attrs) {
#ifndef NDEBUG #ifndef NDEBUG
for (unsigned i = 0, e = Attrs.size(); i != e; ++i) { for (unsigned i = 0, e = Attrs.size(); i != e; ++i) {
assert(Attrs[i].Attrs != Attribute::None && assert(Attrs[i].Attrs.hasAttributes() &&
"Pointless attribute!"); "Pointless attribute!");
assert((!i || Attrs[i-1].Index < Attrs[i].Index) && assert((!i || Attrs[i-1].Index < Attrs[i].Index) &&
"Misordered AttributesList!"); "Misordered AttributesList!");
@ -247,13 +247,14 @@ const AttributeWithIndex &AttrListPtr::getSlot(unsigned Slot) const {
/// returned. Attributes for the result are denoted with Idx = 0. /// returned. Attributes for the result are denoted with Idx = 0.
/// Function notes are denoted with idx = ~0. /// Function notes are denoted with idx = ~0.
Attributes AttrListPtr::getAttributes(unsigned Idx) const { Attributes AttrListPtr::getAttributes(unsigned Idx) const {
if (AttrList == 0) return Attribute::None; if (AttrList == 0) return Attributes();
const SmallVector<AttributeWithIndex, 4> &Attrs = AttrList->Attrs; const SmallVector<AttributeWithIndex, 4> &Attrs = AttrList->Attrs;
for (unsigned i = 0, e = Attrs.size(); i != e && Attrs[i].Index <= Idx; ++i) for (unsigned i = 0, e = Attrs.size(); i != e && Attrs[i].Index <= Idx; ++i)
if (Attrs[i].Index == Idx) if (Attrs[i].Index == Idx)
return Attrs[i].Attrs; return Attrs[i].Attrs;
return Attribute::None;
return Attributes();
} }
/// hasAttrSomewhere - Return true if the specified attribute is set for at /// hasAttrSomewhere - Return true if the specified attribute is set for at
@ -274,8 +275,8 @@ AttrListPtr AttrListPtr::addAttr(unsigned Idx, Attributes Attrs) const {
#ifndef NDEBUG #ifndef NDEBUG
// FIXME it is not obvious how this should work for alignment. // FIXME it is not obvious how this should work for alignment.
// For now, say we can't change a known alignment. // For now, say we can't change a known alignment.
unsigned OldAlign = Attribute::getAlignmentFromAttrs(OldAttrs); unsigned OldAlign = OldAttrs.getAlignment();
unsigned NewAlign = Attribute::getAlignmentFromAttrs(Attrs); unsigned NewAlign = Attrs.getAlignment();
assert((!OldAlign || !NewAlign || OldAlign == NewAlign) && assert((!OldAlign || !NewAlign || OldAlign == NewAlign) &&
"Attempt to change alignment!"); "Attempt to change alignment!");
#endif #endif