TargetData assumes (and some regression tests depend on it) that the size of
authorOwen Anderson <resistor@mac.com>
Sat, 20 Jan 2007 23:07:13 +0000 (23:07 +0000)
committerOwen Anderson <resistor@mac.com>
Sat, 20 Jan 2007 23:07:13 +0000 (23:07 +0000)
an unspecified datatype in the datalayout is capped by the size of a pointer.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33411 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetData.h
lib/Target/TargetData.cpp

index 42a40dd6c4c136442944803b634660e9b6d51639..b045bef616f71250fd443c228e044685d855478d 100644 (file)
@@ -70,7 +70,8 @@ public:
   /// Constructs a TargetData from a string of the following format:
   /// "E-p:64:64-d:64-f:32-l:64-i:32-s:16-b:8-B:8"
   /// The above string is considered the default, and any values not specified
-  /// in the string will be assumed to be as above.
+  /// in the string will be assumed to be as above, with the caveat that unspecified
+  /// values are always assumed to be smaller than the size of a pointer.
   TargetData(const std::string &TargetDescription) {
     init(TargetDescription);
   }
index 0ae2e1a638bf904d85f395de3ae0d5dbc00e3c86..3cfdd40ddd407c42515f9479d29bd8161e0f8448 100644 (file)
@@ -103,9 +103,9 @@ void TargetData::init(const std::string &TargetDescription) {
   LittleEndian = false;
   PointerMemSize = 8;
   PointerABIAlignment   = 8;
-  DoubleABIAlignment = 8;
+  DoubleABIAlignment = 0;
   FloatABIAlignment = 4;
-  LongABIAlignment   = 8;
+  LongABIAlignment   = 0;
   IntABIAlignment   = 4;
   ShortABIAlignment  = 2;
   ByteABIAlignment  = 1;
@@ -114,9 +114,9 @@ void TargetData::init(const std::string &TargetDescription) {
   BytePrefAlignment = ByteABIAlignment;
   ShortPrefAlignment = ShortABIAlignment;
   IntPrefAlignment = IntABIAlignment;
-  LongPrefAlignment = LongABIAlignment;
+  LongPrefAlignment = 8;
   FloatPrefAlignment = FloatABIAlignment;
-  DoublePrefAlignment = DoubleABIAlignment;
+  DoublePrefAlignment = 8;
   PointerPrefAlignment = PointerABIAlignment;
   AggMinPrefAlignment = 0;
   
@@ -188,6 +188,13 @@ void TargetData::init(const std::string &TargetDescription) {
       break;
     }
   }
+
+  // Unless explicitly specified, the alignments for longs and doubles is capped by 
+  // pointer size.
+  if (LongABIAlignment == 0)
+         LongABIAlignment = LongPrefAlignment = PointerMemSize;
+  if (DoubleABIAlignment == 0)
+    DoubleABIAlignment = DoublePrefAlignment = PointerMemSize;
 }
 
 TargetData::TargetData(const Module *M) {