mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-19 12:33:51 +00:00
It turns out that "align 1" and unaligned are different. Add a bias to the
alignment attribute such that 0 means unaligned. This will probably require a rebuild of llvm-gcc because of the change to Attributes.h. If you see many test failures on "make check", please rebuild your llvm-gcc. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61030 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d17c030276
commit
382da62ec2
@ -51,7 +51,8 @@ const Attributes OptimizeForSize = 1<<13; ///< opt_size
|
||||
const Attributes StackProtect = 1<<14; ///< Stack protection.
|
||||
const Attributes StackProtectReq = 1<<15; ///< Stack protection required.
|
||||
const Attributes Alignment = 31<<16; ///< Alignment of parameter (5 bits)
|
||||
// stored as log2 of alignment.
|
||||
// stored as log2 of alignment with +1 bias
|
||||
// 0 means unaligned different from align 1
|
||||
const Attributes NoCapture = 1<<21; ///< Function creates no aliases of pointer
|
||||
|
||||
/// @brief Attributes that only apply to function parameters.
|
||||
@ -79,7 +80,8 @@ Attributes typeIncompatible(const Type *Ty);
|
||||
/// form used internally in Attributes.
|
||||
inline Attributes constructAlignmentFromInt(unsigned i) {
|
||||
assert(isPowerOf2_32(i) && "Alignment must be a power of two.");
|
||||
return Log2_32(i) << 16;
|
||||
assert(i <= 0x40000000 && "Alignment too large.");
|
||||
return (Log2_32(i)+1) << 16;
|
||||
}
|
||||
|
||||
/// The set of Attributes set in Attributes is converted to a
|
||||
@ -178,7 +180,7 @@ public:
|
||||
/// getParamAlignment - Return the alignment for the specified function
|
||||
/// parameter.
|
||||
unsigned getParamAlignment(unsigned Idx) const {
|
||||
return (getAttributes(Idx) & Attribute::Alignment) >> 16;
|
||||
return 1ull << (((getAttributes(Idx) & Attribute::Alignment) >> 16) - 1);
|
||||
}
|
||||
|
||||
/// hasAttrSomewhere - Return true if the specified attribute is set for at
|
||||
|
@ -1332,6 +1332,8 @@ OptAlign : /*empty*/ { $$ = 0; } |
|
||||
$$ = $2;
|
||||
if ($$ != 0 && !isPowerOf2_32($$))
|
||||
GEN_ERROR("Alignment must be a power of two");
|
||||
if ($$ > 0x40000000)
|
||||
GEN_ERROR("Alignment too large");
|
||||
CHECK_FOR_ERROR
|
||||
};
|
||||
OptCAlign : /*empty*/ { $$ = 0; } |
|
||||
@ -1339,6 +1341,8 @@ OptCAlign : /*empty*/ { $$ = 0; } |
|
||||
$$ = $3;
|
||||
if ($$ != 0 && !isPowerOf2_32($$))
|
||||
GEN_ERROR("Alignment must be a power of two");
|
||||
if ($$ > 0x40000000)
|
||||
GEN_ERROR("Alignment too large");
|
||||
CHECK_FOR_ERROR
|
||||
};
|
||||
|
||||
@ -1368,6 +1372,8 @@ GlobalVarAttribute : SectionString {
|
||||
| ALIGN EUINT64VAL {
|
||||
if ($2 != 0 && !isPowerOf2_32($2))
|
||||
GEN_ERROR("Alignment must be a power of two");
|
||||
if ($2 > 0x40000000)
|
||||
GEN_ERROR("Alignment too large");
|
||||
CurGV->setAlignment($2);
|
||||
CHECK_FOR_ERROR
|
||||
};
|
||||
|
@ -128,7 +128,8 @@ static void WriteAttributeTable(const ValueEnumerator &VE,
|
||||
// 5-bit log2 encoded value. Shift the bits above the alignment up by
|
||||
// 11 bits.
|
||||
uint64_t FauxAttr = PAWI.Attrs & 0xffff;
|
||||
FauxAttr |= (1ull<<16)<<((PAWI.Attrs & Attribute::Alignment) >> 16);
|
||||
if (PAWI.Attrs & Attribute::Alignment)
|
||||
FauxAttr |= (1ull<<16)<<(((PAWI.Attrs & Attribute::Alignment)-1) >> 16);
|
||||
FauxAttr |= (PAWI.Attrs & (0x3FFull << 21)) << 11;
|
||||
|
||||
Record.push_back(FauxAttr);
|
||||
|
@ -61,7 +61,7 @@ std::string Attribute::getAsString(Attributes Attrs) {
|
||||
Result += "sspreq ";
|
||||
if (Attrs & Attribute::Alignment) {
|
||||
Result += "align ";
|
||||
Result += utostr(1ull << ((Attrs & Attribute::Alignment)>>16));
|
||||
Result += utostr(1ull << (((Attrs & Attribute::Alignment)>>16) - 1));
|
||||
Result += " ";
|
||||
}
|
||||
// Trim the trailing space.
|
||||
|
Loading…
x
Reference in New Issue
Block a user