mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-01 07:30:33 +00:00
Strip invalid TBAA when reading bitcode
This ensures backward compatibility on bitcode loading. Differential Revision: https://reviews.llvm.org/D27839 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289977 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4bdcc320cf
commit
ce07e02348
@ -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();
|
||||
|
@ -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); }
|
||||
|
@ -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;
|
||||
|
||||
|
@ -1,5 +1,9 @@
|
||||
; RUN: not llvm-as < %s 2>&1 | FileCheck %s
|
||||
; RUN: llvm-as -disable-verify < %s 2>&1 | opt -verify -S | FileCheck %s --check-prefix=STRIP
|
||||
|
||||
; STRIP-NOT: tbaa
|
||||
; STRIP: @f_0
|
||||
; STRIP: Do no strip this
|
||||
define void @f_0(i32* %ptr) {
|
||||
; This part checks for the easy syntactic verifier rules.
|
||||
|
||||
@ -34,10 +38,10 @@ define void @f_0(i32* %ptr) {
|
||||
store i32 4, i32* %ptr, !tbaa !{!3, null, !"40", i64 0}
|
||||
store i32 5, i32* %ptr, !tbaa !{!3, !3, !"40", i64 0}
|
||||
store i32 6, i32* %ptr, !tbaa !{!3, !2, i32 40, i64 0}
|
||||
store i32 7, i32* %ptr, !tbaa !{!3, !12, i32 40, i64 0}
|
||||
store i32 7, i32* %ptr, !tbaa !{!3, !12, i32 40, i64 0}, !metadata !42
|
||||
ret void
|
||||
}
|
||||
|
||||
!42 = !{!"Do no strip this!"}
|
||||
|
||||
define void @f_1(i32* %ptr) {
|
||||
; This part checks for more semantic verifier rules.
|
||||
|
Loading…
Reference in New Issue
Block a user