mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[MachineFunction] Introduce a reset method.
This method allows to reset the state of a MachineFunction as if it was just created. This will be used during the bring-up of GlobalISel to provide a way to fallback on SelectionDAG. That way, we can start doing correctness testing even if we are not able to select all functions via the global instruction selector. llvm-svn: 279876
This commit is contained in:
parent
927551b112
commit
947cfac2b5
@ -238,11 +238,28 @@ class MachineFunction {
|
||||
|
||||
MachineFunction(const MachineFunction &) = delete;
|
||||
void operator=(const MachineFunction&) = delete;
|
||||
|
||||
/// Clear all the members of this MachineFunction, but the ones used
|
||||
/// to initialize again the MachineFunction.
|
||||
/// More specifically, this deallocates all the dynamically allocated
|
||||
/// objects and get rid of all the XXXInfo data structure, but keep
|
||||
/// unchanged the references to Fn, Target, MMI, and FunctionNumber.
|
||||
void clear();
|
||||
/// Allocate and initialize the different members.
|
||||
/// In particular, the XXXInfo data structure.
|
||||
/// \pre Fn, Target, MMI, and FunctionNumber are properly set.
|
||||
void init();
|
||||
public:
|
||||
MachineFunction(const Function *Fn, const TargetMachine &TM,
|
||||
unsigned FunctionNum, MachineModuleInfo &MMI);
|
||||
~MachineFunction();
|
||||
|
||||
/// Reset the instance as if it was just created.
|
||||
void reset() {
|
||||
clear();
|
||||
init();
|
||||
}
|
||||
|
||||
MachineModuleInfo &getMMI() const { return MMI; }
|
||||
MCContext &getContext() const { return Ctx; }
|
||||
|
||||
|
@ -100,6 +100,11 @@ MachineFunction::MachineFunction(const Function *F, const TargetMachine &TM,
|
||||
unsigned FunctionNum, MachineModuleInfo &mmi)
|
||||
: Fn(F), Target(TM), STI(TM.getSubtargetImpl(*F)), Ctx(mmi.getContext()),
|
||||
MMI(mmi) {
|
||||
FunctionNumber = FunctionNum;
|
||||
init();
|
||||
}
|
||||
|
||||
void MachineFunction::init() {
|
||||
// Assume the function starts in SSA form with correct liveness.
|
||||
Properties.set(MachineFunctionProperties::Property::IsSSA);
|
||||
Properties.set(MachineFunctionProperties::Property::TracksLiveness);
|
||||
@ -112,11 +117,11 @@ MachineFunction::MachineFunction(const Function *F, const TargetMachine &TM,
|
||||
// We can realign the stack if the target supports it and the user hasn't
|
||||
// explicitly asked us not to.
|
||||
bool CanRealignSP = STI->getFrameLowering()->isStackRealignable() &&
|
||||
!F->hasFnAttribute("no-realign-stack");
|
||||
!Fn->hasFnAttribute("no-realign-stack");
|
||||
FrameInfo = new (Allocator) MachineFrameInfo(
|
||||
getFnStackAlignment(STI, Fn), /*StackRealignable=*/CanRealignSP,
|
||||
/*ForceRealign=*/CanRealignSP &&
|
||||
F->hasFnAttribute(Attribute::StackAlignment));
|
||||
Fn->hasFnAttribute(Attribute::StackAlignment));
|
||||
|
||||
if (Fn->hasFnAttribute(Attribute::StackAlignment))
|
||||
FrameInfo->ensureMaxAlignment(Fn->getFnStackAlignment());
|
||||
@ -133,15 +138,14 @@ MachineFunction::MachineFunction(const Function *F, const TargetMachine &TM,
|
||||
if (AlignAllFunctions)
|
||||
Alignment = AlignAllFunctions;
|
||||
|
||||
FunctionNumber = FunctionNum;
|
||||
JumpTableInfo = nullptr;
|
||||
|
||||
if (isFuncletEHPersonality(classifyEHPersonality(
|
||||
F->hasPersonalityFn() ? F->getPersonalityFn() : nullptr))) {
|
||||
Fn->hasPersonalityFn() ? Fn->getPersonalityFn() : nullptr))) {
|
||||
WinEHInfo = new (Allocator) WinEHFuncInfo();
|
||||
}
|
||||
|
||||
assert(TM.isCompatibleDataLayout(getDataLayout()) &&
|
||||
assert(Target.isCompatibleDataLayout(getDataLayout()) &&
|
||||
"Can't create a MachineFunction using a Module with a "
|
||||
"Target-incompatible DataLayout attached\n");
|
||||
|
||||
@ -149,6 +153,11 @@ MachineFunction::MachineFunction(const Function *F, const TargetMachine &TM,
|
||||
}
|
||||
|
||||
MachineFunction::~MachineFunction() {
|
||||
clear();
|
||||
}
|
||||
|
||||
void MachineFunction::clear() {
|
||||
Properties.reset();
|
||||
// Don't call destructors on MachineInstr and MachineOperand. All of their
|
||||
// memory comes from the BumpPtrAllocator which is about to be purged.
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user