
This fixes what I consider to be an API flaw I've tripped over multiple times. The point this is constructed isn't well defined, so depending on where this is first called, you can conclude different information based on the MachineFunction. For example, the AMDGPU implementation inspected the MachineFrameInfo on construction for the stack objects and if the frame has calls. This kind of worked in SelectionDAG which visited all allocas up front, but broke in GlobalISel which hasn't visited any of the IR when arguments are lowered. I've run into similar problems before with the MIR parser and trying to make use of other MachineFunction fields, so I think it's best to just categorically disallow dependency on the MachineFunction state in the constructor and to always construct this at the same time as the MachineFunction itself. A missing feature I still could use is a way to access an custom analysis pass on the IR here.
102 lines
3.1 KiB
C++
102 lines
3.1 KiB
C++
//===- XCoreMachineFunctionInfo.h - XCore machine function info -*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file declares XCore-specific per-machine-function information.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_XCORE_XCOREMACHINEFUNCTIONINFO_H
|
|
#define LLVM_LIB_TARGET_XCORE_XCOREMACHINEFUNCTIONINFO_H
|
|
|
|
#include "llvm/CodeGen/MachineBasicBlock.h"
|
|
#include "llvm/CodeGen/MachineFrameInfo.h"
|
|
#include "llvm/CodeGen/MachineFunction.h"
|
|
#include <cassert>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
|
|
/// XCoreFunctionInfo - This class is derived from MachineFunction private
|
|
/// XCore target-specific information for each MachineFunction.
|
|
class XCoreFunctionInfo : public MachineFunctionInfo {
|
|
bool LRSpillSlotSet = false;
|
|
int LRSpillSlot;
|
|
bool FPSpillSlotSet = false;
|
|
int FPSpillSlot;
|
|
bool EHSpillSlotSet = false;
|
|
int EHSpillSlot[2];
|
|
unsigned ReturnStackOffset;
|
|
bool ReturnStackOffsetSet = false;
|
|
int VarArgsFrameIndex = 0;
|
|
mutable int CachedEStackSize = -1;
|
|
std::vector<std::pair<MachineBasicBlock::iterator, CalleeSavedInfo>>
|
|
SpillLabels;
|
|
|
|
virtual void anchor();
|
|
|
|
public:
|
|
XCoreFunctionInfo() = default;
|
|
|
|
explicit XCoreFunctionInfo(const Function &F,
|
|
const TargetSubtargetInfo *STI) {}
|
|
|
|
MachineFunctionInfo *
|
|
clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF,
|
|
const DenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB)
|
|
const override;
|
|
|
|
~XCoreFunctionInfo() override = default;
|
|
|
|
void setVarArgsFrameIndex(int off) { VarArgsFrameIndex = off; }
|
|
int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
|
|
|
|
int createLRSpillSlot(MachineFunction &MF);
|
|
bool hasLRSpillSlot() { return LRSpillSlotSet; }
|
|
int getLRSpillSlot() const {
|
|
assert(LRSpillSlotSet && "LR Spill slot not set");
|
|
return LRSpillSlot;
|
|
}
|
|
|
|
int createFPSpillSlot(MachineFunction &MF);
|
|
bool hasFPSpillSlot() { return FPSpillSlotSet; }
|
|
int getFPSpillSlot() const {
|
|
assert(FPSpillSlotSet && "FP Spill slot not set");
|
|
return FPSpillSlot;
|
|
}
|
|
|
|
const int* createEHSpillSlot(MachineFunction &MF);
|
|
bool hasEHSpillSlot() { return EHSpillSlotSet; }
|
|
const int* getEHSpillSlot() const {
|
|
assert(EHSpillSlotSet && "EH Spill slot not set");
|
|
return EHSpillSlot;
|
|
}
|
|
|
|
void setReturnStackOffset(unsigned value) {
|
|
assert(!ReturnStackOffsetSet && "Return stack offset set twice");
|
|
ReturnStackOffset = value;
|
|
ReturnStackOffsetSet = true;
|
|
}
|
|
|
|
unsigned getReturnStackOffset() const {
|
|
assert(ReturnStackOffsetSet && "Return stack offset not set");
|
|
return ReturnStackOffset;
|
|
}
|
|
|
|
bool isLargeFrame(const MachineFunction &MF) const;
|
|
|
|
std::vector<std::pair<MachineBasicBlock::iterator, CalleeSavedInfo>> &
|
|
getSpillLabels() {
|
|
return SpillLabels;
|
|
}
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_LIB_TARGET_XCORE_XCOREMACHINEFUNCTIONINFO_H
|