diff options
author | Mehdi Amini <mehdi.amini@apple.com> | 2016-12-16 19:16:29 +0000 |
---|---|---|
committer | Mehdi Amini <mehdi.amini@apple.com> | 2016-12-16 19:16:29 +0000 |
commit | 8662305bae83768a73057cd9f9e3b93df8c3a037 (patch) | |
tree | 1654c758f89c04039f510dfdeffdcf8cdf1f9da5 /llvm/lib | |
parent | c66e7e3b8c3baa213864259505790aeb726429ee (diff) | |
download | bcm5719-llvm-8662305bae83768a73057cd9f9e3b93df8c3a037.tar.gz bcm5719-llvm-8662305bae83768a73057cd9f9e3b93df8c3a037.zip |
Strip invalid TBAA when reading bitcode
This ensures backward compatibility on bitcode loading.
Differential Revision: https://reviews.llvm.org/D27839
llvm-svn: 289977
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 24 | ||||
-rw-r--r-- | llvm/lib/Bitcode/Reader/MetadataLoader.cpp | 13 | ||||
-rw-r--r-- | llvm/lib/Bitcode/Reader/MetadataLoader.h | 6 |
3 files changed, 43 insertions, 0 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 36f3239c2e0..ad4d9cec717 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -48,6 +48,7 @@ #include "llvm/IR/GlobalVariable.h" #include "llvm/IR/GVMaterializer.h" #include "llvm/IR/InlineAsm.h" +#include "llvm/IR/InstIterator.h" #include "llvm/IR/InstrTypes.h" #include "llvm/IR/Instruction.h" #include "llvm/IR/Instructions.h" @@ -60,6 +61,7 @@ #include "llvm/IR/TrackingMDRef.h" #include "llvm/IR/Type.h" #include "llvm/IR/ValueHandle.h" +#include "llvm/IR/Verifier.h" #include "llvm/Support/AtomicOrdering.h" #include "llvm/Support/Casting.h" #include "llvm/Support/CommandLine.h" @@ -148,6 +150,16 @@ static bool convertToString(ArrayRef<uint64_t> Record, unsigned Idx, return false; } +// Strip all the TBAA attachment for the module. +void stripTBAA(Module *M) { + for (auto &F : *M) { + if (F.isMaterializable()) + continue; + for (auto &I : instructions(F)) + I.setMetadata(LLVMContext::MD_tbaa, nullptr); + } +} + /// Read the "IDENTIFICATION_BLOCK_ID" block, do some basic enforcement on the /// "epoch" encoded in the bitcode, and return the producer name if any. Expected<std::string> readIdentificationBlock(BitstreamCursor &Stream) { @@ -460,6 +472,7 @@ class BitcodeReader : public BitcodeReaderBase, public GVMaterializer { bool WillMaterializeAllForwardRefs = false; bool StripDebugInfo = false; + TBAAVerifier TBAAVerifyHelper; std::vector<std::string> BundleTags; @@ -4449,6 +4462,17 @@ Error BitcodeReader::materialize(GlobalValue *GV) { if (DISubprogram *SP = MDLoader->lookupSubprogramForFunction(F)) F->setSubprogram(SP); + // Check if the TBAA Metadata are valid, otherwise we will need to strip them. + if (!MDLoader->isStrippingTBAA()) { + for (auto &I : instructions(F)) { + MDNode *TBAA = I.getMetadata(LLVMContext::MD_tbaa); + if (!TBAA || TBAAVerifyHelper.visitTBAAMetadata(I, TBAA)) + continue; + MDLoader->setStripTBAA(true); + stripTBAA(F->getParent()); + } + } + // Bring in any functions that this function forward-referenced via // blockaddresses. return materializeForwardReferencedFunctions(); diff --git a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp index b47628dde28..96601100e34 100644 --- a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp +++ b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp @@ -382,6 +382,7 @@ class MetadataLoader::MetadataLoaderImpl { // Map the bitcode's custom MDKind ID to the Module's MDKind ID. DenseMap<unsigned, unsigned> MDKindMap; + bool StripTBAA = false; bool HasSeenOldLoopTags = false; Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob, @@ -420,6 +421,9 @@ public: Error parseMetadataKinds(); + void setStripTBAA(bool Value) { StripTBAA = Value; } + bool isStrippingTBAA() { return StripTBAA; } + unsigned size() const { return MetadataList.size(); } void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); } }; @@ -1208,6 +1212,9 @@ Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment( DenseMap<unsigned, unsigned>::iterator I = MDKindMap.find(Kind); if (I == MDKindMap.end()) return error("Invalid ID"); + if (I->second == LLVMContext::MD_tbaa && StripTBAA) + continue; + Metadata *Node = MetadataList.getMetadataFwdRef(Record[i + 1]); if (isa<LocalAsMetadata>(Node)) // Drop the attachment. This used to be legal, but there's no @@ -1327,5 +1334,11 @@ Error MetadataLoader::parseMetadataKinds() { return Pimpl->parseMetadataKinds(); } +void MetadataLoader::setStripTBAA(bool StripTBAA) { + return Pimpl->setStripTBAA(StripTBAA); +} + +bool MetadataLoader::isStrippingTBAA() { return Pimpl->isStrippingTBAA(); } + unsigned MetadataLoader::size() const { return Pimpl->size(); } void MetadataLoader::shrinkTo(unsigned N) { return Pimpl->shrinkTo(N); } diff --git a/llvm/lib/Bitcode/Reader/MetadataLoader.h b/llvm/lib/Bitcode/Reader/MetadataLoader.h index 3f7b64307da..7d1027e9d52 100644 --- a/llvm/lib/Bitcode/Reader/MetadataLoader.h +++ b/llvm/lib/Bitcode/Reader/MetadataLoader.h @@ -52,6 +52,12 @@ public: // Parse a function metadata block Error parseFunctionMetadata() { return parseMetadata(false); } + /// Set the mode to strip TBAA metadata on load. + void setStripTBAA(bool StripTBAA = true); + + /// Return true if the Loader is stripping TBAA metadata. + bool isStrippingTBAA(); + // Return true there are remaining unresolved forward references. bool hasFwdRefs() const; |