summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorMehdi Amini <mehdi.amini@apple.com>2016-12-16 19:16:29 +0000
committerMehdi Amini <mehdi.amini@apple.com>2016-12-16 19:16:29 +0000
commit8662305bae83768a73057cd9f9e3b93df8c3a037 (patch)
tree1654c758f89c04039f510dfdeffdcf8cdf1f9da5 /llvm/lib
parentc66e7e3b8c3baa213864259505790aeb726429ee (diff)
downloadbcm5719-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.cpp24
-rw-r--r--llvm/lib/Bitcode/Reader/MetadataLoader.cpp13
-rw-r--r--llvm/lib/Bitcode/Reader/MetadataLoader.h6
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;
OpenPOWER on IntegriCloud