[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