aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2007-01-20 23:07:13 +0000
committerOwen Anderson <resistor@mac.com>2007-01-20 23:07:13 +0000
commit1027a533d4f1806ff7d2f721504028201cffa7b5 (patch)
tree966162e5e2bcd71486b74dbca302e813ec3bf2db
parent4a8c32debf092d8883b18c90a33e99bdc9cbb509 (diff)
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
-rw-r--r--include/llvm/Target/TargetData.h3
-rw-r--r--lib/Target/TargetData.cpp15
2 files changed, 13 insertions, 5 deletions
diff --git a/include/llvm/Target/TargetData.h b/include/llvm/Target/TargetData.h
index 42a40dd6c4..b045bef616 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 0ae2e1a638..3cfdd40ddd 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) {