From: Owen Anderson Date: Sat, 20 Jan 2007 23:07:13 +0000 (+0000) Subject: TargetData assumes (and some regression tests depend on it) that the size of X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=1027a533d4f1806ff7d2f721504028201cffa7b5;p=oota-llvm.git TargetData assumes (and some regression tests depend on it) that the size of 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 --- diff --git a/include/llvm/Target/TargetData.h b/include/llvm/Target/TargetData.h index 42a40dd6c4c..b045bef616f 100644 --- a/include/llvm/Target/TargetData.h +++ b/include/llvm/Target/TargetData.h @@ -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); } diff --git a/lib/Target/TargetData.cpp b/lib/Target/TargetData.cpp index 0ae2e1a638b..3cfdd40ddd4 100644 --- a/lib/Target/TargetData.cpp +++ b/lib/Target/TargetData.cpp @@ -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) {