1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

IR: Avoid mallocs in constructor of ModuleSlotTracker

A ModuleSlotTracker can be created without actually being used (e.g.,
r266889 added one to the Verifier).  Create the SlotTracker within it
lazily on the first call to ModuleSlotTracker::getMachine.

llvm-svn: 266902
This commit is contained in:
Duncan P. N. Exon Smith 2016-04-20 19:05:59 +00:00
parent bb4e30e8f3
commit 596a95c4d7
2 changed files with 20 additions and 5 deletions

View File

@ -30,6 +30,8 @@ class Value;
class ModuleSlotTracker {
/// Storage for a slot tracker.
std::unique_ptr<SlotTracker> MachineStorage;
bool ShouldCreateStorage = false;
bool ShouldInitializeAllMetadata = false;
const Module *M = nullptr;
const Function *F = nullptr;
@ -53,7 +55,9 @@ public:
/// Destructor to clean up storage.
~ModuleSlotTracker();
SlotTracker *getMachine() const { return Machine; }
/// Lazily creates a slot tracker.
SlotTracker *getMachine();
const Module *getModule() const { return M; }
const Function *getCurrentFunction() const { return F; }

View File

@ -697,14 +697,25 @@ ModuleSlotTracker::ModuleSlotTracker(SlotTracker &Machine, const Module *M,
ModuleSlotTracker::ModuleSlotTracker(const Module *M,
bool ShouldInitializeAllMetadata)
: MachineStorage(M ? new SlotTracker(M, ShouldInitializeAllMetadata)
: nullptr),
M(M), Machine(MachineStorage.get()) {}
: ShouldCreateStorage(M),
ShouldInitializeAllMetadata(ShouldInitializeAllMetadata), M(M) {}
ModuleSlotTracker::~ModuleSlotTracker() {}
SlotTracker *ModuleSlotTracker::getMachine() {
if (!ShouldCreateStorage)
return Machine;
ShouldCreateStorage = false;
MachineStorage =
llvm::make_unique<SlotTracker>(M, ShouldInitializeAllMetadata);
Machine = MachineStorage.get();
return Machine;
}
void ModuleSlotTracker::incorporateFunction(const Function &F) {
if (!Machine)
// Using getMachine() may lazily create the slot tracker.
if (!getMachine())
return;
// Nothing to do if this is the right function already.