[llvm-commits] [llvm] r61030 - in /llvm/trunk: include/llvm/Attributes.h lib/AsmParser/llvmAsmParser.y lib/Bitcode/Writer/BitcodeWriter.cpp lib/VMCore/Attributes.cpp
Nick Lewycky
nicholas at mxc.ca
Sun Dec 14 23:29:55 PST 2008
Author: nicholas
Date: Mon Dec 15 01:29:55 2008
New Revision: 61030
URL: http://llvm.org/viewvc/llvm-project?rev=61030&view=rev
Log:
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.
Modified:
llvm/trunk/include/llvm/Attributes.h
llvm/trunk/lib/AsmParser/llvmAsmParser.y
llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
llvm/trunk/lib/VMCore/Attributes.cpp
Modified: llvm/trunk/include/llvm/Attributes.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Attributes.h?rev=61030&r1=61029&r2=61030&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Attributes.h (original)
+++ llvm/trunk/include/llvm/Attributes.h Mon Dec 15 01:29:55 2008
@@ -51,7 +51,8 @@
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 @@
/// 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 @@
/// 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
Modified: llvm/trunk/lib/AsmParser/llvmAsmParser.y
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/llvmAsmParser.y?rev=61030&r1=61029&r2=61030&view=diff
==============================================================================
--- llvm/trunk/lib/AsmParser/llvmAsmParser.y (original)
+++ llvm/trunk/lib/AsmParser/llvmAsmParser.y Mon Dec 15 01:29:55 2008
@@ -1332,6 +1332,8 @@
$$ = $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 @@
$$ = $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 @@
| 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
};
Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=61030&r1=61029&r2=61030&view=diff
==============================================================================
--- llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp (original)
+++ llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Mon Dec 15 01:29:55 2008
@@ -128,7 +128,8 @@
// 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);
Modified: llvm/trunk/lib/VMCore/Attributes.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Attributes.cpp?rev=61030&r1=61029&r2=61030&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/Attributes.cpp (original)
+++ llvm/trunk/lib/VMCore/Attributes.cpp Mon Dec 15 01:29:55 2008
@@ -61,7 +61,7 @@
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.
More information about the llvm-commits
mailing list