diff --git a/include/llvm/Attributes.h b/include/llvm/Attributes.h index 2a7e0dea4fd..01b3be8cb60 100644 --- a/include/llvm/Attributes.h +++ b/include/llvm/Attributes.h @@ -205,24 +205,6 @@ public: 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". operator const void *() const { return Bits ? this : 0; } bool isEmptyOrSingleton() const { return (Bits & (Bits - 1)) == 0; } @@ -230,9 +212,8 @@ public: return Bits == Attrs.Bits; } bool operator != (const Attributes &Attrs) const { - return !(this == Attrs); + return Bits != Attrs.Bits; } - Attributes operator | (const Attributes &Attrs) const { return Attributes(Bits | Attrs.Bits); } @@ -313,6 +294,14 @@ inline Attributes constructAlignmentFromInt(unsigned i) { 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 /// the form used internally in Attributes. inline Attributes constructStackAlignmentFromInt(unsigned i) { @@ -325,6 +314,15 @@ inline Attributes constructStackAlignmentFromInt(unsigned i) { 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 /// LLVM attributes found in the given attribute bitset. Any /// change to this encoding is a breaking change to bitcode @@ -452,7 +450,7 @@ public: /// getParamAlignment - Return the alignment for the specified function /// parameter. unsigned getParamAlignment(unsigned Idx) const { - return getAttributes(Idx).getAlignment(); + return Attribute::getAlignmentFromAttrs(getAttributes(Idx)); } /// hasAttrSomewhere - Return true if the specified attribute is set for at diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index c1d5272ca50..2e4af3abb76 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -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 (FuncAttrs & Attribute::Alignment) { - Alignment = FuncAttrs.getAlignment(); + Alignment = Attribute::getAlignmentFromAttrs(FuncAttrs); FuncAttrs &= ~Attribute::Alignment; } diff --git a/lib/CodeGen/MachineFunction.cpp b/lib/CodeGen/MachineFunction.cpp index 304e39e1592..328722bad48 100644 --- a/lib/CodeGen/MachineFunction.cpp +++ b/lib/CodeGen/MachineFunction.cpp @@ -60,8 +60,8 @@ MachineFunction::MachineFunction(const Function *F, const TargetMachine &TM, MFInfo = 0; FrameInfo = new (Allocator) MachineFrameInfo(*TM.getFrameLowering()); if (Fn->hasFnAttr(Attribute::StackAlignment)) - FrameInfo->ensureMaxAlignment(Fn->getAttributes(). - getFnAttributes().getStackAlignment()); + FrameInfo->ensureMaxAlignment(Attribute::getStackAlignmentFromAttrs( + Fn->getAttributes().getFnAttributes())); ConstantPool = new (Allocator) MachineConstantPool(TM.getTargetData()); Alignment = TM.getTargetLowering()->getMinFunctionAlignment(); // FIXME: Shouldn't use pref alignment if explicit alignment is set on Fn. diff --git a/lib/Target/CppBackend/CPPBackend.cpp b/lib/Target/CppBackend/CPPBackend.cpp index 444da2bb21e..4ddcd38aca6 100644 --- a/lib/Target/CppBackend/CPPBackend.cpp +++ b/lib/Target/CppBackend/CPPBackend.cpp @@ -508,7 +508,7 @@ void CppWriter::printAttributes(const AttrListPtr &PAL, #undef HANDLE_ATTR if (attrs & Attribute::StackAlignment) Out << " | Attribute::constructStackAlignmentFromInt(" - << attrs.getStackAlignment() + << Attribute::getStackAlignmentFromAttrs(attrs) << ")"; attrs &= ~Attribute::StackAlignment; assert(attrs == 0 && "Unhandled attribute!"); diff --git a/lib/VMCore/Attributes.cpp b/lib/VMCore/Attributes.cpp index af8163fd40e..3a87da44dd1 100644 --- a/lib/VMCore/Attributes.cpp +++ b/lib/VMCore/Attributes.cpp @@ -80,12 +80,12 @@ std::string Attributes::getAsString() const { Result += "address_safety "; if (hasStackAlignmentAttr()) { Result += "alignstack("; - Result += utostr(getStackAlignment()); + Result += utostr(Attribute::getStackAlignmentFromAttrs(*this)); Result += ") "; } if (hasAlignmentAttr()) { Result += "align "; - Result += utostr(getAlignment()); + Result += utostr(Attribute::getAlignmentFromAttrs(*this)); Result += " "; } // Trim the trailing space. @@ -174,7 +174,7 @@ AttrListPtr AttrListPtr::get(ArrayRef Attrs) { #ifndef NDEBUG for (unsigned i = 0, e = Attrs.size(); i != e; ++i) { - assert(Attrs[i].Attrs.hasAttributes() && + assert(Attrs[i].Attrs != Attribute::None && "Pointless attribute!"); assert((!i || Attrs[i-1].Index < Attrs[i].Index) && "Misordered AttributesList!"); @@ -247,14 +247,13 @@ const AttributeWithIndex &AttrListPtr::getSlot(unsigned Slot) const { /// returned. Attributes for the result are denoted with Idx = 0. /// Function notes are denoted with idx = ~0. Attributes AttrListPtr::getAttributes(unsigned Idx) const { - if (AttrList == 0) return Attributes(); + if (AttrList == 0) return Attribute::None; const SmallVector &Attrs = AttrList->Attrs; for (unsigned i = 0, e = Attrs.size(); i != e && Attrs[i].Index <= Idx; ++i) if (Attrs[i].Index == Idx) return Attrs[i].Attrs; - - return Attributes(); + return Attribute::None; } /// hasAttrSomewhere - Return true if the specified attribute is set for at @@ -275,8 +274,8 @@ AttrListPtr AttrListPtr::addAttr(unsigned Idx, Attributes Attrs) const { #ifndef NDEBUG // FIXME it is not obvious how this should work for alignment. // For now, say we can't change a known alignment. - unsigned OldAlign = OldAttrs.getAlignment(); - unsigned NewAlign = Attrs.getAlignment(); + unsigned OldAlign = Attribute::getAlignmentFromAttrs(OldAttrs); + unsigned NewAlign = Attribute::getAlignmentFromAttrs(Attrs); assert((!OldAlign || !NewAlign || OldAlign == NewAlign) && "Attempt to change alignment!"); #endif