Fix resetting the DataLayout in a Module.
No tool does this currently, but as everything else in a module we should be
able to change its DataLayout.
Most of the fix is in DataLayout to make sure it can be reset properly.
The test uses Module::setDataLayout since the fact that we mutate a DataLayout
is an implementation detail. The module could hold a OwningPtr<DataLayout> and
the DataLayout itself could be immutable.
Thanks to Philip Reames for pushing me in the right direction.
llvm-svn: 202198
diff --git a/llvm/lib/IR/DataLayout.cpp b/llvm/lib/IR/DataLayout.cpp
index d60c79f5..ccdaec5 100644
--- a/llvm/lib/IR/DataLayout.cpp
+++ b/llvm/lib/IR/DataLayout.cpp
@@ -176,7 +176,9 @@
{ AGGREGATE_ALIGN, 0, 0, 8 } // struct
};
-void DataLayout::init(StringRef Desc) {
+void DataLayout::reset(StringRef Desc) {
+ clear();
+
LayoutMap = 0;
LittleEndian = false;
StackNaturalAlign = 0;
@@ -344,12 +346,12 @@
}
}
-DataLayout::DataLayout(const Module *M) {
+DataLayout::DataLayout(const Module *M) : LayoutMap(0) {
const DataLayout *Other = M->getDataLayout();
if (Other)
*this = *Other;
else
- init("");
+ reset("");
}
void
@@ -469,8 +471,16 @@
} // end anonymous namespace
+void DataLayout::clear() {
+ LegalIntWidths.clear();
+ Alignments.clear();
+ Pointers.clear();
+ delete static_cast<StructLayoutMap *>(LayoutMap);
+ LayoutMap = 0;
+}
+
DataLayout::~DataLayout() {
- delete static_cast<StructLayoutMap*>(LayoutMap);
+ clear();
}
const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp
index 739f888..4204c8e 100644
--- a/llvm/lib/IR/Module.cpp
+++ b/llvm/lib/IR/Module.cpp
@@ -339,17 +339,21 @@
}
void Module::setDataLayout(StringRef Desc) {
+ DL.reset(Desc);
+
if (Desc.empty()) {
DataLayoutStr = "";
} else {
- DL.init(Desc);
DataLayoutStr = DL.getStringRepresentation();
+ // DataLayoutStr is now equivalent to Desc, but since the representation
+ // is not unique, they may not be identical.
}
}
void Module::setDataLayout(const DataLayout *Other) {
if (!Other) {
DataLayoutStr = "";
+ DL.reset("");
} else {
DL = *Other;
DataLayoutStr = DL.getStringRepresentation();