mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-26 05:25:47 +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:
@@ -51,7 +51,8 @@ const Attributes OptimizeForSize = 1<<13; ///< opt_size
|
|||||||
const Attributes StackProtect = 1<<14; ///< Stack protection.
|
const Attributes StackProtect = 1<<14; ///< Stack protection.
|
||||||
const Attributes StackProtectReq = 1<<15; ///< Stack protection required.
|
const Attributes StackProtectReq = 1<<15; ///< Stack protection required.
|
||||||
const Attributes Alignment = 31<<16; ///< Alignment of parameter (5 bits)
|
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
|
const Attributes NoCapture = 1<<21; ///< Function creates no aliases of pointer
|
||||||
|
|
||||||
/// @brief Attributes that only apply to function parameters.
|
/// @brief Attributes that only apply to function parameters.
|
||||||
@@ -79,7 +80,8 @@ Attributes typeIncompatible(const Type *Ty);
|
|||||||
/// form used internally in Attributes.
|
/// form used internally in Attributes.
|
||||||
inline Attributes constructAlignmentFromInt(unsigned i) {
|
inline Attributes constructAlignmentFromInt(unsigned i) {
|
||||||
assert(isPowerOf2_32(i) && "Alignment must be a power of two.");
|
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
|
/// The set of Attributes set in Attributes is converted to a
|
||||||
@@ -178,7 +180,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 (getAttributes(Idx) & Attribute::Alignment) >> 16;
|
return 1ull << (((getAttributes(Idx) & Attribute::Alignment) >> 16) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// hasAttrSomewhere - Return true if the specified attribute is set for at
|
/// hasAttrSomewhere - Return true if the specified attribute is set for at
|
||||||
|
@@ -1332,6 +1332,8 @@ OptAlign : /*empty*/ { $$ = 0; } |
|
|||||||
$$ = $2;
|
$$ = $2;
|
||||||
if ($$ != 0 && !isPowerOf2_32($$))
|
if ($$ != 0 && !isPowerOf2_32($$))
|
||||||
GEN_ERROR("Alignment must be a power of two");
|
GEN_ERROR("Alignment must be a power of two");
|
||||||
|
if ($$ > 0x40000000)
|
||||||
|
GEN_ERROR("Alignment too large");
|
||||||
CHECK_FOR_ERROR
|
CHECK_FOR_ERROR
|
||||||
};
|
};
|
||||||
OptCAlign : /*empty*/ { $$ = 0; } |
|
OptCAlign : /*empty*/ { $$ = 0; } |
|
||||||
@@ -1339,6 +1341,8 @@ OptCAlign : /*empty*/ { $$ = 0; } |
|
|||||||
$$ = $3;
|
$$ = $3;
|
||||||
if ($$ != 0 && !isPowerOf2_32($$))
|
if ($$ != 0 && !isPowerOf2_32($$))
|
||||||
GEN_ERROR("Alignment must be a power of two");
|
GEN_ERROR("Alignment must be a power of two");
|
||||||
|
if ($$ > 0x40000000)
|
||||||
|
GEN_ERROR("Alignment too large");
|
||||||
CHECK_FOR_ERROR
|
CHECK_FOR_ERROR
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1368,6 +1372,8 @@ GlobalVarAttribute : SectionString {
|
|||||||
| ALIGN EUINT64VAL {
|
| ALIGN EUINT64VAL {
|
||||||
if ($2 != 0 && !isPowerOf2_32($2))
|
if ($2 != 0 && !isPowerOf2_32($2))
|
||||||
GEN_ERROR("Alignment must be a power of two");
|
GEN_ERROR("Alignment must be a power of two");
|
||||||
|
if ($2 > 0x40000000)
|
||||||
|
GEN_ERROR("Alignment too large");
|
||||||
CurGV->setAlignment($2);
|
CurGV->setAlignment($2);
|
||||||
CHECK_FOR_ERROR
|
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
|
// 5-bit log2 encoded value. Shift the bits above the alignment up by
|
||||||
// 11 bits.
|
// 11 bits.
|
||||||
uint64_t FauxAttr = PAWI.Attrs & 0xffff;
|
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;
|
FauxAttr |= (PAWI.Attrs & (0x3FFull << 21)) << 11;
|
||||||
|
|
||||||
Record.push_back(FauxAttr);
|
Record.push_back(FauxAttr);
|
||||||
|
@@ -61,7 +61,7 @@ std::string Attribute::getAsString(Attributes Attrs) {
|
|||||||
Result += "sspreq ";
|
Result += "sspreq ";
|
||||||
if (Attrs & Attribute::Alignment) {
|
if (Attrs & Attribute::Alignment) {
|
||||||
Result += "align ";
|
Result += "align ";
|
||||||
Result += utostr(1ull << ((Attrs & Attribute::Alignment)>>16));
|
Result += utostr(1ull << (((Attrs & Attribute::Alignment)>>16) - 1));
|
||||||
Result += " ";
|
Result += " ";
|
||||||
}
|
}
|
||||||
// Trim the trailing space.
|
// Trim the trailing space.
|
||||||
|
Reference in New Issue
Block a user