[PATCH] D79900: [BitcodeReader] datalayout must be specified before it is queried.
Eli Friedman via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed May 13 12:31:33 PDT 2020
efriedma created this revision.
efriedma added reviewers: mehdi_amini, jdoerfert, arsenm.
Herald added subscribers: hiraditya, wdng.
Herald added a project: LLVM.
efriedma added a child revision: D78403: Infer alignment of loads with unspecified alignment in IR/bitcode parsing..
This isn't really a new invariant; it effectively already existed due to existing DataLayout queries. But this makes it explicit.
This is technically not backward-compatible with the existing bitcode reader, but it's backward-compatible with the output of the bitcode writer, which is what matters in practice.
No testcase because I don't know a good way to write one.
Split off from D78403 <https://reviews.llvm.org/D78403>. (And modified a bit to handle the interaction between datalayout parsing and DataLayout::getProgramAddressSpace().)
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D79900
Files:
llvm/lib/Bitcode/Reader/BitcodeReader.cpp
Index: llvm/lib/Bitcode/Reader/BitcodeReader.cpp
===================================================================
--- llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ llvm/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -3428,6 +3428,22 @@
SmallVector<uint64_t, 64> Record;
+ // Parts of bitcode parsing depend on the datalayout. Make sure we
+ // finalize the datalayout before we run any of that code.
+ bool ResolvedDataLayout = false;
+ auto ResolveDataLayout = [&] {
+ if (ResolvedDataLayout)
+ return;
+
+ // datalayout and triple can't be parsed after this point.
+ ResolvedDataLayout = true;
+
+ // Upgrade data layout string.
+ std::string DL = llvm::UpgradeDataLayoutString(
+ TheModule->getDataLayoutStr(), TheModule->getTargetTriple());
+ TheModule->setDataLayout(DL);
+ };
+
// Read all the records for this module.
while (true) {
Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
@@ -3439,6 +3455,7 @@
case BitstreamEntry::Error:
return error("Malformed block");
case BitstreamEntry::EndBlock:
+ ResolveDataLayout();
return globalCleanup();
case BitstreamEntry::SubBlock:
@@ -3503,6 +3520,8 @@
return Err;
break;
case bitc::FUNCTION_BLOCK_ID:
+ ResolveDataLayout();
+
// If this is the first function body we've seen, reverse the
// FunctionsWithBodies list.
if (!SeenFirstFunctionBody) {
@@ -3589,6 +3608,8 @@
break;
}
case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N]
+ if (ResolvedDataLayout)
+ return error("target triple too late in module");
std::string S;
if (convertToString(Record, 0, S))
return error("Invalid record");
@@ -3596,6 +3617,8 @@
break;
}
case bitc::MODULE_CODE_DATALAYOUT: { // DATALAYOUT: [strchr x N]
+ if (ResolvedDataLayout)
+ return error("datalayout too late in module");
std::string S;
if (convertToString(Record, 0, S))
return error("Invalid record");
@@ -3640,6 +3663,7 @@
return Err;
break;
case bitc::MODULE_CODE_FUNCTION:
+ ResolveDataLayout();
if (Error Err = parseFunctionRecord(Record))
return Err;
break;
@@ -3667,11 +3691,6 @@
break;
}
Record.clear();
-
- // Upgrade data layout string.
- std::string DL = llvm::UpgradeDataLayoutString(
- TheModule->getDataLayoutStr(), TheModule->getTargetTriple());
- TheModule->setDataLayout(DL);
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79900.263812.patch
Type: text/x-patch
Size: 2547 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200513/7c7e331f/attachment.bin>
More information about the llvm-commits
mailing list