]> git.saurik.com Git - bison.git/commitdiff
Force a large alignment of a variant structure.
authorSamuel Tardieu <sam@rfc1149.net>
Mon, 24 Nov 2008 14:27:49 +0000 (15:27 +0100)
committerAkim Demaille <demaille@gostai.com>
Wed, 28 Jan 2009 14:46:05 +0000 (15:46 +0100)
This is a temporary band-aid until Bison gets proper alignment handling.
We need it on ARM.

* data/lalr1.cc (variant): Declare the buffer as a union to force
the same alignment as "long double".

data/lalr1.cc

index 49f4bf772bdebae3185705f819e0e4473d3a4b7a..54b7038b28b69853ad931da7059a3bf8b1531f31 100644 (file)
@@ -433,7 +433,7 @@ dnl FIXME: This is wrong, we want computed header guards.
     {]b4_assert_if([
       assert(!built);
       built = true;])[
-      return *new (buffer) T;
+      return *new (buffer.raw) T;
     }
 
     /// Instantiate a \a T in here from \a t.
@@ -443,7 +443,7 @@ dnl FIXME: This is wrong, we want computed header guards.
     {]b4_assert_if([
       assert(!built);
       built = true;])[
-      return *new (buffer) T(t);
+      return *new (buffer.raw) T(t);
     }
 
     /// Construct and fill.
@@ -452,7 +452,7 @@ dnl FIXME: This is wrong, we want computed header guards.
     variant (const T& t)]b4_assert_if([
       : built(true)])[
     {
-      new (buffer) T(t);
+      new (buffer.raw) T(t);
     }
 
     /// Accessor to a built \a T.
@@ -461,7 +461,7 @@ dnl FIXME: This is wrong, we want computed header guards.
     as()
     {]b4_assert_if([
       assert(built);])[
-      return reinterpret_cast<T&>(buffer);
+      return reinterpret_cast<T&>(buffer.raw);
     }
 
     /// Const accessor to a built \a T (for %printer).
@@ -470,7 +470,7 @@ dnl FIXME: This is wrong, we want computed header guards.
     as() const
     {]b4_assert_if([
       assert(built);])[
-      return reinterpret_cast<const T&>(buffer);
+      return reinterpret_cast<const T&>(buffer.raw);
     }
 
     /// Swap the content with \a other.
@@ -502,7 +502,12 @@ dnl FIXME: This is wrong, we want computed header guards.
     }
 
     /// A buffer large enough to store any of the semantic values.
-    char buffer[S];
+    /// Long double is chosen as it has the strongest alignment
+    /// constraints.
+    union {
+      long double align_me;
+      char raw[S];
+    } buffer;
   };
 ]])[
 ]b4_namespace_close[