forked from OSchip/llvm-project
Make the 'get*AlignmentFromAttr' functions into member functions within the Attributes class.
llvm-svn: 164308
This commit is contained in:
parent
b4e211cd19
commit
abac66150c
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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!");
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue