summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2016-04-16 02:05:33 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2016-04-16 02:05:33 +0000
commit6fe1ff260b0461437523ac731008a24c9b63b1bc (patch)
tree7258bdde19399251d6c03c984463c250d02d432c /llvm/lib
parentb6be2027794fe03afa665c7c9ae727d032fafa95 (diff)
downloadbcm5719-llvm-6fe1ff260b0461437523ac731008a24c9b63b1bc.tar.gz
bcm5719-llvm-6fe1ff260b0461437523ac731008a24c9b63b1bc.zip
Revert "ValueMapper: Eliminate cross-file co-recursion, NFC"
This reverts commit r266503, in case it's the root cause of this bot failure: http://lab.llvm.org:8011/builders/lld-x86_64-freebsd/builds/16810 I'm also reverting r266505 -- "ValueMapper: Use API from r266503 in unit tests, NFC" -- since it's in the way. llvm-svn: 266507
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Linker/IRMover.cpp62
-rw-r--r--llvm/lib/Transforms/Utils/ValueMapper.cpp364
2 files changed, 99 insertions, 327 deletions
diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp
index 64c73235777..e4121fedc0a 100644
--- a/llvm/lib/Linker/IRMover.cpp
+++ b/llvm/lib/Linker/IRMover.cpp
@@ -397,9 +397,8 @@ class IRLinker {
bool HasError = false;
- /// Entry point for mapping values and alternate context for mapping aliases.
- ValueMapper Mapper;
- unsigned AliasMCID;
+ /// Flags to pass to value mapper invocations.
+ RemapFlags ValueMapperFlags = RF_MoveDistinctMDs | RF_IgnoreMissingLocals;
/// Handles cloning of a global values from the source module into
/// the destination module, including setting the attributes and visibility.
@@ -471,11 +470,7 @@ public:
std::unique_ptr<Module> SrcM, ArrayRef<GlobalValue *> ValuesToLink,
std::function<void(GlobalValue &, IRMover::ValueAdder)> AddLazyFor)
: DstM(DstM), SrcM(std::move(SrcM)), AddLazyFor(AddLazyFor), TypeMap(Set),
- GValMaterializer(*this), LValMaterializer(*this),
- Mapper(ValueMap, RF_MoveDistinctMDs | RF_IgnoreMissingLocals, &TypeMap,
- &GValMaterializer),
- AliasMCID(Mapper.registerAlternateMappingContext(AliasValueMap,
- &LValMaterializer)) {
+ GValMaterializer(*this), LValMaterializer(*this) {
for (GlobalValue *GV : ValuesToLink)
maybeAdd(GV);
}
@@ -717,10 +712,6 @@ Constant *IRLinker::linkAppendingVarProto(GlobalVariable *DstGV,
Type *EltTy = cast<ArrayType>(TypeMap.get(SrcGV->getValueType()))
->getElementType();
- // FIXME: This upgrade is done during linking to support the C API. Once the
- // old form is deprecated, we should move this upgrade to
- // llvm::UpgradeGlobalVariable() and simplify the logic here and in
- // Mapper::mapAppendingVariable() in ValueMapper.cpp.
StringRef Name = SrcGV->getName();
bool IsNewStructor = false;
bool IsOldStructor = false;
@@ -738,10 +729,8 @@ Constant *IRLinker::linkAppendingVarProto(GlobalVariable *DstGV,
EltTy = StructType::get(SrcGV->getContext(), Tys, false);
}
- uint64_t DstNumElements = 0;
if (DstGV) {
ArrayType *DstTy = cast<ArrayType>(DstGV->getValueType());
- DstNumElements = DstTy->getNumElements();
if (!SrcGV->hasAppendingLinkage() || !DstGV->hasAppendingLinkage()) {
emitError(
@@ -785,6 +774,10 @@ Constant *IRLinker::linkAppendingVarProto(GlobalVariable *DstGV,
}
}
+ SmallVector<Constant *, 16> DstElements;
+ if (DstGV)
+ getArrayElements(DstGV->getInitializer(), DstElements);
+
SmallVector<Constant *, 16> SrcElements;
getArrayElements(SrcGV->getInitializer(), SrcElements);
@@ -800,7 +793,7 @@ Constant *IRLinker::linkAppendingVarProto(GlobalVariable *DstGV,
return !shouldLink(DGV, *Key);
}),
SrcElements.end());
- uint64_t NewSize = DstNumElements + SrcElements.size();
+ uint64_t NewSize = DstElements.size() + SrcElements.size();
ArrayType *NewType = ArrayType::get(EltTy, NewSize);
// Create the new global variable.
@@ -817,9 +810,25 @@ Constant *IRLinker::linkAppendingVarProto(GlobalVariable *DstGV,
// Stop recursion.
ValueMap[SrcGV] = Ret;
- Mapper.scheduleMapAppendingVariable(*NG,
- DstGV ? DstGV->getInitializer() : nullptr,
- IsOldStructor, SrcElements);
+ for (auto *V : SrcElements) {
+ Constant *NewV;
+ if (IsOldStructor) {
+ auto *S = cast<ConstantStruct>(V);
+ auto *E1 = MapValue(S->getOperand(0), ValueMap, ValueMapperFlags,
+ &TypeMap, &GValMaterializer);
+ auto *E2 = MapValue(S->getOperand(1), ValueMap, ValueMapperFlags,
+ &TypeMap, &GValMaterializer);
+ Value *Null = Constant::getNullValue(VoidPtrTy);
+ NewV =
+ ConstantStruct::get(cast<StructType>(EltTy), E1, E2, Null, nullptr);
+ } else {
+ NewV =
+ MapValue(V, ValueMap, ValueMapperFlags, &TypeMap, &GValMaterializer);
+ }
+ DstElements.push_back(NewV);
+ }
+
+ NG->setInitializer(ConstantArray::get(NewType, DstElements));
// Replace any uses of the two global variables with uses of the new
// global.
@@ -926,7 +935,8 @@ Constant *IRLinker::linkGlobalValueProto(GlobalValue *SGV, bool ForAlias) {
/// referenced are in Dest.
void IRLinker::linkGlobalInit(GlobalVariable &Dst, GlobalVariable &Src) {
// Figure out what the initializer looks like in the dest module.
- Mapper.scheduleMapGlobalInitializer(Dst, *Src.getInitializer());
+ Dst.setInitializer(MapValue(Src.getInitializer(), ValueMap, ValueMapperFlags,
+ &TypeMap, &GValMaterializer));
}
/// Copy the source function over into the dest function and fix up references
@@ -958,12 +968,15 @@ bool IRLinker::linkFunctionBody(Function &Dst, Function &Src) {
Dst.getBasicBlockList().splice(Dst.end(), Src.getBasicBlockList());
// Everything has been moved over. Remap it.
- Mapper.scheduleRemapFunction(Dst);
+ RemapFunction(Dst, ValueMap, ValueMapperFlags, &TypeMap, &GValMaterializer);
return false;
}
void IRLinker::linkAliasBody(GlobalAlias &Dst, GlobalAlias &Src) {
- Mapper.scheduleMapGlobalAliasee(Dst, *Src.getAliasee(), AliasMCID);
+ Constant *Aliasee = Src.getAliasee();
+ Constant *Val = MapValue(Aliasee, AliasValueMap, ValueMapperFlags, &TypeMap,
+ &LValMaterializer);
+ Dst.setAliasee(Val);
}
bool IRLinker::linkGlobalValueBody(GlobalValue &Dst, GlobalValue &Src) {
@@ -987,7 +1000,9 @@ void IRLinker::linkNamedMDNodes() {
NamedMDNode *DestNMD = DstM.getOrInsertNamedMetadata(NMD.getName());
// Add Src elements into Dest node.
for (const MDNode *Op : NMD.operands())
- DestNMD->addOperand(Mapper.mapMDNode(*Op));
+ DestNMD->addOperand(MapMetadata(
+ Op, ValueMap, ValueMapperFlags | RF_NullMapMissingGlobalValues,
+ &TypeMap, &GValMaterializer));
}
}
@@ -1227,7 +1242,7 @@ bool IRLinker::run() {
continue;
assert(!GV->isDeclaration());
- Mapper.mapValue(*GV);
+ MapValue(GV, ValueMap, ValueMapperFlags, &TypeMap, &GValMaterializer);
if (HasError)
return true;
}
@@ -1235,7 +1250,6 @@ bool IRLinker::run() {
// Note that we are done linking global value bodies. This prevents
// metadata linking from creating new references.
DoneLinkingBodies = true;
- Mapper.addFlags(RF_NullMapMissingGlobalValues);
// Remap all of the named MDNodes in Src into the DstM module. We do this
// after linking GlobalValues so that MDNodes that reference GlobalValues
diff --git a/llvm/lib/Transforms/Utils/ValueMapper.cpp b/llvm/lib/Transforms/Utils/ValueMapper.cpp
index db984eef59c..102f641ebfc 100644
--- a/llvm/lib/Transforms/Utils/ValueMapper.cpp
+++ b/llvm/lib/Transforms/Utils/ValueMapper.cpp
@@ -16,8 +16,6 @@
#include "llvm/IR/CallSite.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Function.h"
-#include "llvm/IR/GlobalAlias.h"
-#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Metadata.h"
@@ -32,6 +30,14 @@ void ValueMaterializer::materializeInitFor(GlobalValue *New, GlobalValue *Old) {
namespace {
+/// A GlobalValue whose initializer needs to be materialized.
+struct DelayedGlobalValueInit {
+ GlobalValue *Old;
+ GlobalValue *New;
+ DelayedGlobalValueInit(const GlobalValue *Old, GlobalValue *New)
+ : Old(const_cast<GlobalValue *>(Old)), New(New) {}
+};
+
/// A basic block used in a BlockAddress whose function body is not yet
/// materialized.
struct DelayedBasicBlock {
@@ -52,88 +58,30 @@ struct DelayedBasicBlock {
TempBB(BasicBlock::Create(Old.getContext())) {}
};
-struct WorklistEntry {
- enum EntryKind {
- MapGlobalInit,
- MapAppendingVar,
- MapGlobalAliasee,
- RemapFunction
- };
- struct GVInitTy {
- GlobalVariable *GV;
- Constant *Init;
- };
- struct AppendingGVTy {
- GlobalVariable *GV;
- Constant *InitPrefix;
- };
- struct GlobalAliaseeTy {
- GlobalAlias *GA;
- Constant *Aliasee;
- };
-
- unsigned Kind : 2;
- unsigned MCID : 29;
- unsigned AppendingGVIsOldCtorDtor : 1;
- unsigned AppendingGVNumNewMembers;
- union {
- GVInitTy GVInit;
- AppendingGVTy AppendingGV;
- GlobalAliaseeTy GlobalAliasee;
- Function *RemapF;
- } Data;
-};
-
-struct MappingContext {
- ValueToValueMapTy *VM;
- ValueMaterializer *Materializer = nullptr;
-
- /// Construct a MappingContext with a value map and materializer.
- explicit MappingContext(ValueToValueMapTy &VM,
- ValueMaterializer *Materializer = nullptr)
- : VM(&VM), Materializer(Materializer) {}
-};
-
class MDNodeMapper;
class Mapper {
friend class MDNodeMapper;
+ ValueToValueMapTy *VM;
RemapFlags Flags;
ValueMapTypeRemapper *TypeMapper;
- unsigned CurrentMCID = 0;
- SmallVector<MappingContext, 2> MCs;
- SmallVector<WorklistEntry, 4> Worklist;
+ ValueMaterializer *Materializer;
+
+ SmallVector<DelayedGlobalValueInit, 8> DelayedInits;
SmallVector<DelayedBasicBlock, 1> DelayedBBs;
- SmallVector<Constant *, 16> AppendingInits;
public:
Mapper(ValueToValueMapTy &VM, RemapFlags Flags,
ValueMapTypeRemapper *TypeMapper, ValueMaterializer *Materializer)
- : Flags(Flags), TypeMapper(TypeMapper),
- MCs(1, MappingContext(VM, Materializer)) {}
+ : VM(&VM), Flags(Flags), TypeMapper(TypeMapper),
+ Materializer(Materializer) {}
- /// ValueMapper should explicitly call \a flush() before destruction.
- ~Mapper() { assert(!hasWorkToDo() && "Expected to be flushed"); }
-
- bool hasWorkToDo() const { return !Worklist.empty(); }
-
- unsigned
- registerAlternateMappingContext(ValueToValueMapTy &VM,
- ValueMaterializer *Materializer = nullptr) {
- MCs.push_back(MappingContext(VM, Materializer));
- return MCs.size() - 1;
- }
-
- void addFlags(RemapFlags Flags);
+ ~Mapper();
Value *mapValue(const Value *V);
void remapInstruction(Instruction *I);
void remapFunction(Function &F);
- Constant *mapConstant(const Constant *C) {
- return cast_or_null<Constant>(mapValue(C));
- }
-
/// Map metadata.
///
/// Find the mapping for MD. Guarantees that the return will be resolved
@@ -154,28 +102,8 @@ public:
// through metadata operands, always return nullptr on unmapped locals.
Metadata *mapLocalAsMetadata(const LocalAsMetadata &LAM);
- void scheduleMapGlobalInitializer(GlobalVariable &GV, Constant &Init,
- unsigned MCID);
- void scheduleMapAppendingVariable(GlobalVariable &GV, Constant *InitPrefix,
- bool IsOldCtorDtor,
- ArrayRef<Constant *> NewMembers,
- unsigned MCID);
- void scheduleMapGlobalAliasee(GlobalAlias &GA, Constant &Aliasee,
- unsigned MCID);
- void scheduleRemapFunction(Function &F, unsigned MCID);
-
- void flush();
-
private:
- void mapGlobalInitializer(GlobalVariable &GV, Constant &Init);
- void mapAppendingVariable(GlobalVariable &GV, Constant *InitPrefix,
- bool IsOldCtorDtor,
- ArrayRef<Constant *> NewMembers);
- void mapGlobalAliasee(GlobalAlias &GA, Constant &Aliasee);
- void remapFunction(Function &F, ValueToValueMapTy &VM);
-
- ValueToValueMapTy &getVM() { return *MCs[CurrentMCID].VM; }
- ValueMaterializer *getMaterializer() { return MCs[CurrentMCID].Materializer; }
+ ValueToValueMapTy &getVM() { return *VM; }
Value *mapBlockAddress(const BlockAddress &BA);
@@ -336,6 +264,12 @@ private:
} // end namespace
+Value *llvm::MapValue(const Value *V, ValueToValueMapTy &VM, RemapFlags Flags,
+ ValueMapTypeRemapper *TypeMapper,
+ ValueMaterializer *Materializer) {
+ return Mapper(VM, Flags, TypeMapper, Materializer).mapValue(V);
+}
+
Value *Mapper::mapValue(const Value *V) {
ValueToValueMapTy::iterator I = getVM().find(V);
@@ -344,13 +278,13 @@ Value *Mapper::mapValue(const Value *V) {
return I->second;
// If we have a materializer and it can materialize a value, use that.
- if (auto *Materializer = getMaterializer()) {
+ if (Materializer) {
if (Value *NewV =
Materializer->materializeDeclFor(const_cast<Value *>(V))) {
getVM()[V] = NewV;
if (auto *NewGV = dyn_cast<GlobalValue>(NewV))
- Materializer->materializeInitFor(
- NewGV, cast<GlobalValue>(const_cast<Value *>(V)));
+ DelayedInits.push_back(
+ DelayedGlobalValueInit(cast<GlobalValue>(V), NewGV));
return NewV;
}
}
@@ -750,6 +684,12 @@ Optional<Metadata *> Mapper::mapSimpleMetadata(const Metadata *MD) {
return None;
}
+Metadata *llvm::MapMetadata(const Metadata *MD, ValueToValueMapTy &VM,
+ RemapFlags Flags, ValueMapTypeRemapper *TypeMapper,
+ ValueMaterializer *Materializer) {
+ return Mapper(VM, Flags, TypeMapper, Materializer).mapMetadata(MD);
+}
+
Metadata *Mapper::mapLocalAsMetadata(const LocalAsMetadata &LAM) {
// Lookup the mapping for the value itself, and return the appropriate
// metadata.
@@ -776,42 +716,36 @@ Metadata *Mapper::mapMetadata(const Metadata *MD) {
return MDNodeMapper(*this).map(*cast<MDNode>(MD));
}
-void Mapper::flush() {
- // Flush out the worklist of global values.
- while (!Worklist.empty()) {
- WorklistEntry E = Worklist.pop_back_val();
- CurrentMCID = E.MCID;
- switch (E.Kind) {
- case WorklistEntry::MapGlobalInit:
- E.Data.GVInit.GV->setInitializer(mapConstant(E.Data.GVInit.Init));
- break;
- case WorklistEntry::MapAppendingVar: {
- unsigned PrefixSize = AppendingInits.size() - E.AppendingGVNumNewMembers;
- mapAppendingVariable(*E.Data.AppendingGV.GV,
- E.Data.AppendingGV.InitPrefix,
- E.AppendingGVIsOldCtorDtor,
- makeArrayRef(AppendingInits).slice(PrefixSize));
- AppendingInits.resize(PrefixSize);
- break;
- }
- case WorklistEntry::MapGlobalAliasee:
- E.Data.GlobalAliasee.GA->setAliasee(
- mapConstant(E.Data.GlobalAliasee.Aliasee));
- break;
- case WorklistEntry::RemapFunction:
- remapFunction(*E.Data.RemapF);
- break;
- }
+Mapper::~Mapper() {
+ // Materialize global initializers.
+ while (!DelayedInits.empty()) {
+ auto Init = DelayedInits.pop_back_val();
+ Materializer->materializeInitFor(Init.New, Init.Old);
}
- CurrentMCID = 0;
- // Finish logic for block addresses now that all global values have been
- // handled.
+ // Process block addresses delayed until global inits.
while (!DelayedBBs.empty()) {
DelayedBasicBlock DBB = DelayedBBs.pop_back_val();
BasicBlock *BB = cast_or_null<BasicBlock>(mapValue(DBB.OldBB));
DBB.TempBB->replaceAllUsesWith(BB ? BB : DBB.OldBB);
}
+
+ // We don't expect these to grow after clearing.
+ assert(DelayedInits.empty());
+ assert(DelayedBBs.empty());
+}
+
+MDNode *llvm::MapMetadata(const MDNode *MD, ValueToValueMapTy &VM,
+ RemapFlags Flags, ValueMapTypeRemapper *TypeMapper,
+ ValueMaterializer *Materializer) {
+ return cast_or_null<MDNode>(MapMetadata(static_cast<const Metadata *>(MD), VM,
+ Flags, TypeMapper, Materializer));
+}
+
+void llvm::RemapInstruction(Instruction *I, ValueToValueMapTy &VM,
+ RemapFlags Flags, ValueMapTypeRemapper *TypeMapper,
+ ValueMaterializer *Materializer) {
+ Mapper(VM, Flags, TypeMapper, Materializer).remapInstruction(I);
}
void Mapper::remapInstruction(Instruction *I) {
@@ -848,7 +782,7 @@ void Mapper::remapInstruction(Instruction *I) {
if (New != Old)
I->setMetadata(MI.first, New);
}
-
+
if (!TypeMapper)
return;
@@ -874,6 +808,12 @@ void Mapper::remapInstruction(Instruction *I) {
I->mutateType(TypeMapper->remapType(I->getType()));
}
+void llvm::RemapFunction(Function &F, ValueToValueMapTy &VM, RemapFlags Flags,
+ ValueMapTypeRemapper *TypeMapper,
+ ValueMaterializer *Materializer) {
+ Mapper(VM, Flags, TypeMapper, Materializer).remapFunction(F);
+}
+
void Mapper::remapFunction(Function &F) {
// Remap the operands.
for (Use &Op : F.operands())
@@ -896,185 +836,3 @@ void Mapper::remapFunction(Function &F) {
for (Instruction &I : BB)
remapInstruction(&I);
}
-
-void Mapper::mapAppendingVariable(GlobalVariable &GV, Constant *InitPrefix,
- bool IsOldCtorDtor,
- ArrayRef<Constant *> NewMembers) {
- SmallVector<Constant *, 16> Elements;
- if (InitPrefix) {
- unsigned NumElements =
- cast<ArrayType>(InitPrefix->getType())->getNumElements();
- for (unsigned I = 0; I != NumElements; ++I)
- Elements.push_back(InitPrefix->getAggregateElement(I));
- }
-
- PointerType *VoidPtrTy;
- Type *EltTy;
- if (IsOldCtorDtor) {
- // FIXME: This upgrade is done during linking to support the C API. See
- // also IRLinker::linkAppendingVarProto() in IRMover.cpp.
- VoidPtrTy = Type::getInt8Ty(GV.getContext())->getPointerTo();
- auto &ST = *cast<StructType>(NewMembers.front()->getType());
- Type *Tys[3] = {ST.getElementType(0), ST.getElementType(1), VoidPtrTy};
- EltTy = StructType::get(GV.getContext(), Tys, false);
- }
-
- for (auto *V : NewMembers) {
- Constant *NewV;
- if (IsOldCtorDtor) {
- auto *S = cast<ConstantStruct>(V);
- auto *E1 = mapValue(S->getOperand(0));
- auto *E2 = mapValue(S->getOperand(1));
- Value *Null = Constant::getNullValue(VoidPtrTy);
- NewV =
- ConstantStruct::get(cast<StructType>(EltTy), E1, E2, Null, nullptr);
- } else {
- NewV = cast_or_null<Constant>(mapValue(V));
- }
- Elements.push_back(NewV);
- }
-
- GV.setInitializer(ConstantArray::get(
- cast<ArrayType>(GV.getType()->getElementType()), Elements));
-}
-
-void Mapper::scheduleMapGlobalInitializer(GlobalVariable &GV, Constant &Init,
- unsigned MCID) {
- assert(MCID < MCs.size() && "Invalid mapping context");
-
- WorklistEntry WE;
- WE.Kind = WorklistEntry::MapGlobalInit;
- WE.MCID = MCID;
- WE.Data.GVInit.GV = &GV;
- WE.Data.GVInit.Init = &Init;
- Worklist.push_back(WE);
-}
-
-void Mapper::scheduleMapAppendingVariable(GlobalVariable &GV,
- Constant *InitPrefix,
- bool IsOldCtorDtor,
- ArrayRef<Constant *> NewMembers,
- unsigned MCID) {
- assert(MCID < MCs.size() && "Invalid mapping context");
-
- WorklistEntry WE;
- WE.Kind = WorklistEntry::MapAppendingVar;
- WE.MCID = MCID;
- WE.Data.AppendingGV.GV = &GV;
- WE.Data.AppendingGV.InitPrefix = InitPrefix;
- WE.AppendingGVIsOldCtorDtor = IsOldCtorDtor;
- WE.AppendingGVNumNewMembers = NewMembers.size();
- Worklist.push_back(WE);
- AppendingInits.append(NewMembers.begin(), NewMembers.end());
-}
-
-void Mapper::scheduleMapGlobalAliasee(GlobalAlias &GA, Constant &Aliasee,
- unsigned MCID) {
- assert(MCID < MCs.size() && "Invalid mapping context");
-
- WorklistEntry WE;
- WE.Kind = WorklistEntry::MapGlobalAliasee;
- WE.MCID = MCID;
- WE.Data.GlobalAliasee.GA = &GA;
- WE.Data.GlobalAliasee.Aliasee = &Aliasee;
- Worklist.push_back(WE);
-}
-
-void Mapper::scheduleRemapFunction(Function &F, unsigned MCID) {
- assert(MCID < MCs.size() && "Invalid mapping context");
-
- WorklistEntry WE;
- WE.Kind = WorklistEntry::RemapFunction;
- WE.MCID = MCID;
- WE.Data.RemapF = &F;
- Worklist.push_back(WE);
-}
-
-void Mapper::addFlags(RemapFlags Flags) {
- assert(!hasWorkToDo() && "Expected to have flushed the worklist");
- this->Flags = this->Flags | Flags;
-}
-
-static Mapper *getAsMapper(void *pImpl) {
- return reinterpret_cast<Mapper *>(pImpl);
-}
-
-namespace {
-
-class FlushingMapper {
- Mapper &M;
-
-public:
- explicit FlushingMapper(void *pImpl) : M(*getAsMapper(pImpl)) {
- assert(!M.hasWorkToDo() && "Expected to be flushed");
- }
- ~FlushingMapper() { M.flush(); }
- Mapper *operator->() const { return &M; }
-};
-
-} // end namespace
-
-ValueMapper::ValueMapper(ValueToValueMapTy &VM, RemapFlags Flags,
- ValueMapTypeRemapper *TypeMapper,
- ValueMaterializer *Materializer)
- : pImpl(new Mapper(VM, Flags, TypeMapper, Materializer)) {}
-
-ValueMapper::~ValueMapper() { delete getAsMapper(pImpl); }
-
-unsigned
-ValueMapper::registerAlternateMappingContext(ValueToValueMapTy &VM,
- ValueMaterializer *Materializer) {
- return getAsMapper(pImpl)->registerAlternateMappingContext(VM, Materializer);
-}
-
-void ValueMapper::addFlags(RemapFlags Flags) {
- FlushingMapper(pImpl)->addFlags(Flags);
-}
-
-Value *ValueMapper::mapValue(const Value &V) {
- return FlushingMapper(pImpl)->mapValue(&V);
-}
-
-Constant *ValueMapper::mapConstant(const Constant &C) {
- return cast_or_null<Constant>(mapValue(C));
-}
-
-Metadata *ValueMapper::mapMetadata(const Metadata &MD) {
- return FlushingMapper(pImpl)->mapMetadata(&MD);
-}
-
-MDNode *ValueMapper::mapMDNode(const MDNode &N) {
- return cast_or_null<MDNode>(mapMetadata(N));
-}
-
-void ValueMapper::remapInstruction(Instruction &I) {
- FlushingMapper(pImpl)->remapInstruction(&I);
-}
-
-void ValueMapper::remapFunction(Function &F) {
- FlushingMapper(pImpl)->remapFunction(F);
-}
-
-void ValueMapper::scheduleMapGlobalInitializer(GlobalVariable &GV,
- Constant &Init,
- unsigned MCID) {
- getAsMapper(pImpl)->scheduleMapGlobalInitializer(GV, Init, MCID);
-}
-
-void ValueMapper::scheduleMapAppendingVariable(GlobalVariable &GV,
- Constant *InitPrefix,
- bool IsOldCtorDtor,
- ArrayRef<Constant *> NewMembers,
- unsigned MCID) {
- getAsMapper(pImpl)->scheduleMapAppendingVariable(
- GV, InitPrefix, IsOldCtorDtor, NewMembers, MCID);
-}
-
-void ValueMapper::scheduleMapGlobalAliasee(GlobalAlias &GA, Constant &Aliasee,
- unsigned MCID) {
- getAsMapper(pImpl)->scheduleMapGlobalAliasee(GA, Aliasee, MCID);
-}
-
-void ValueMapper::scheduleRemapFunction(Function &F, unsigned MCID) {
- getAsMapper(pImpl)->scheduleRemapFunction(F, MCID);
-}
OpenPOWER on IntegriCloud