mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-23 11:49:50 +00:00
Move VariableDbgInfo from MachineModuleInfo to MachineFunction
VariableDbgInfo is per function data, so it makes sense to have it with the function instead of the module. This is a necessary step to have machine module passes work properly. Differential Revision: https://reviews.llvm.org/D27186 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288292 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
14250381b8
commit
40485c228c
@ -264,6 +264,20 @@ class MachineFunction {
|
||||
/// \pre Fn, Target, MMI, and FunctionNumber are properly set.
|
||||
void init();
|
||||
public:
|
||||
|
||||
struct VariableDbgInfo {
|
||||
const DILocalVariable *Var;
|
||||
const DIExpression *Expr;
|
||||
unsigned Slot;
|
||||
const DILocation *Loc;
|
||||
|
||||
VariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr,
|
||||
unsigned Slot, const DILocation *Loc)
|
||||
: Var(Var), Expr(Expr), Slot(Slot), Loc(Loc) {}
|
||||
};
|
||||
typedef SmallVector<VariableDbgInfo, 4> VariableDbgInfoMapTy;
|
||||
VariableDbgInfoMapTy VariableDbgInfos;
|
||||
|
||||
MachineFunction(const Function *Fn, const TargetMachine &TM,
|
||||
unsigned FunctionNum, MachineModuleInfo &MMI);
|
||||
~MachineFunction();
|
||||
@ -657,6 +671,17 @@ public:
|
||||
FrameInstructions.push_back(Inst);
|
||||
return FrameInstructions.size() - 1;
|
||||
}
|
||||
|
||||
/// Collect information used to emit debugging information of a variable.
|
||||
void setVariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr,
|
||||
unsigned Slot, const DILocation *Loc) {
|
||||
VariableDbgInfos.emplace_back(Var, Expr, Slot, Loc);
|
||||
}
|
||||
|
||||
VariableDbgInfoMapTy &getVariableDbgInfo() { return VariableDbgInfos; }
|
||||
const VariableDbgInfoMapTy &getVariableDbgInfo() const {
|
||||
return VariableDbgInfos;
|
||||
}
|
||||
};
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
@ -190,19 +190,6 @@ class MachineModuleInfo : public ImmutablePass {
|
||||
public:
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
|
||||
struct VariableDbgInfo {
|
||||
const DILocalVariable *Var;
|
||||
const DIExpression *Expr;
|
||||
unsigned Slot;
|
||||
const DILocation *Loc;
|
||||
|
||||
VariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr,
|
||||
unsigned Slot, const DILocation *Loc)
|
||||
: Var(Var), Expr(Expr), Slot(Slot), Loc(Loc) {}
|
||||
};
|
||||
typedef SmallVector<VariableDbgInfo, 4> VariableDbgInfoMapTy;
|
||||
VariableDbgInfoMapTy VariableDbgInfos;
|
||||
|
||||
explicit MachineModuleInfo(const TargetMachine *TM = nullptr);
|
||||
~MachineModuleInfo() override;
|
||||
|
||||
@ -396,15 +383,6 @@ public:
|
||||
const std::vector<unsigned> &getFilterIds() const {
|
||||
return FilterIds;
|
||||
}
|
||||
|
||||
/// Collect information used to emit debugging information of a variable.
|
||||
void setVariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr,
|
||||
unsigned Slot, const DILocation *Loc) {
|
||||
VariableDbgInfos.emplace_back(Var, Expr, Slot, Loc);
|
||||
}
|
||||
|
||||
VariableDbgInfoMapTy &getVariableDbgInfo() { return VariableDbgInfos; }
|
||||
|
||||
}; // End class MachineModuleInfo
|
||||
|
||||
//===- MMI building helpers -----------------------------------------------===//
|
||||
|
@ -864,14 +864,14 @@ CodeViewDebug::createDefRangeGeneral(uint16_t CVRegister, bool InMemory,
|
||||
return DR;
|
||||
}
|
||||
|
||||
void CodeViewDebug::collectVariableInfoFromMMITable(
|
||||
void CodeViewDebug::collectVariableInfoFromMFTable(
|
||||
DenseSet<InlinedVariable> &Processed) {
|
||||
const TargetSubtargetInfo &TSI = Asm->MF->getSubtarget();
|
||||
const MachineFunction &MF = *Asm->MF;
|
||||
const TargetSubtargetInfo &TSI = MF.getSubtarget();
|
||||
const TargetFrameLowering *TFI = TSI.getFrameLowering();
|
||||
const TargetRegisterInfo *TRI = TSI.getRegisterInfo();
|
||||
|
||||
for (const MachineModuleInfo::VariableDbgInfo &VI :
|
||||
MMI->getVariableDbgInfo()) {
|
||||
for (const MachineFunction::VariableDbgInfo &VI : MF.getVariableDbgInfo()) {
|
||||
if (!VI.Var)
|
||||
continue;
|
||||
assert(VI.Var->isValidLocationForIntrinsic(VI.Loc) &&
|
||||
@ -908,7 +908,7 @@ void CodeViewDebug::collectVariableInfoFromMMITable(
|
||||
void CodeViewDebug::collectVariableInfo(const DISubprogram *SP) {
|
||||
DenseSet<InlinedVariable> Processed;
|
||||
// Grab the variable info that was squirreled away in the MMI side-table.
|
||||
collectVariableInfoFromMMITable(Processed);
|
||||
collectVariableInfoFromMFTable(Processed);
|
||||
|
||||
const TargetRegisterInfo *TRI = Asm->MF->getSubtarget().getRegisterInfo();
|
||||
|
||||
|
@ -227,7 +227,7 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {
|
||||
|
||||
void collectVariableInfo(const DISubprogram *SP);
|
||||
|
||||
void collectVariableInfoFromMMITable(DenseSet<InlinedVariable> &Processed);
|
||||
void collectVariableInfoFromMFTable(DenseSet<InlinedVariable> &Processed);
|
||||
|
||||
/// Records information about a local variable in the appropriate scope. In
|
||||
/// particular, locals from inlined code live inside the inlining site.
|
||||
|
@ -726,10 +726,10 @@ void DwarfDebug::ensureAbstractVariableIsCreatedIfScoped(
|
||||
createAbstractVariable(Cleansed, Scope);
|
||||
}
|
||||
|
||||
// Collect variable information from side table maintained by MMI.
|
||||
void DwarfDebug::collectVariableInfoFromMMITable(
|
||||
// Collect variable information from side table maintained by MF.
|
||||
void DwarfDebug::collectVariableInfoFromMFTable(
|
||||
DenseSet<InlinedVariable> &Processed) {
|
||||
for (const auto &VI : MMI->getVariableDbgInfo()) {
|
||||
for (const auto &VI : Asm->MF->getVariableDbgInfo()) {
|
||||
if (!VI.Var)
|
||||
continue;
|
||||
assert(VI.Var->isValidLocationForIntrinsic(VI.Loc) &&
|
||||
@ -939,7 +939,7 @@ void DwarfDebug::collectVariableInfo(DwarfCompileUnit &TheCU,
|
||||
const DISubprogram *SP,
|
||||
DenseSet<InlinedVariable> &Processed) {
|
||||
// Grab the variable info that was squirreled away in the MMI side-table.
|
||||
collectVariableInfoFromMMITable(Processed);
|
||||
collectVariableInfoFromMFTable(Processed);
|
||||
|
||||
for (const auto &I : DbgValues) {
|
||||
InlinedVariable IV = I.first;
|
||||
|
@ -440,9 +440,8 @@ class DwarfDebug : public DebugHandlerBase {
|
||||
void buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
|
||||
const DbgValueHistoryMap::InstrRanges &Ranges);
|
||||
|
||||
/// Collect variable information from the side table maintained
|
||||
/// by MMI.
|
||||
void collectVariableInfoFromMMITable(DenseSet<InlinedVariable> &P);
|
||||
/// Collect variable information from the side table maintained by MF.
|
||||
void collectVariableInfoFromMFTable(DenseSet<InlinedVariable> &P);
|
||||
|
||||
public:
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
@ -674,7 +674,7 @@ bool MIRParserImpl::parseStackObjectsDebugInfo(PerFunctionMIParsingState &PFS,
|
||||
typecheckMDNode(DIExpr, Expr, Object.DebugExpr, "DIExpression", *this) ||
|
||||
typecheckMDNode(DILoc, Loc, Object.DebugLoc, "DILocation", *this))
|
||||
return true;
|
||||
PFS.MF.getMMI().setVariableDbgInfo(DIVar, DIExpr, unsigned(FrameIdx), DILoc);
|
||||
PFS.MF.setVariableDbgInfo(DIVar, DIExpr, unsigned(FrameIdx), DILoc);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -90,10 +90,8 @@ public:
|
||||
const MachineConstantPool &ConstantPool);
|
||||
void convert(ModuleSlotTracker &MST, yaml::MachineJumpTable &YamlJTI,
|
||||
const MachineJumpTableInfo &JTI);
|
||||
void convertStackObjects(yaml::MachineFunction &MF,
|
||||
const MachineFrameInfo &MFI, MachineModuleInfo &MMI,
|
||||
ModuleSlotTracker &MST,
|
||||
const TargetRegisterInfo *TRI);
|
||||
void convertStackObjects(yaml::MachineFunction &YMF,
|
||||
const MachineFunction &MF, ModuleSlotTracker &MST);
|
||||
|
||||
private:
|
||||
void initRegisterMaskIds(const MachineFunction &MF);
|
||||
@ -188,8 +186,7 @@ void MIRPrinter::print(const MachineFunction &MF) {
|
||||
ModuleSlotTracker MST(MF.getFunction()->getParent());
|
||||
MST.incorporateFunction(*MF.getFunction());
|
||||
convert(MST, YamlMF.FrameInfo, MF.getFrameInfo());
|
||||
convertStackObjects(YamlMF, MF.getFrameInfo(), MF.getMMI(), MST,
|
||||
MF.getSubtarget().getRegisterInfo());
|
||||
convertStackObjects(YamlMF, MF, MST);
|
||||
if (const auto *ConstantPool = MF.getConstantPool())
|
||||
convert(YamlMF, *ConstantPool);
|
||||
if (const auto *JumpTableInfo = MF.getJumpTableInfo())
|
||||
@ -286,11 +283,11 @@ void MIRPrinter::convert(ModuleSlotTracker &MST,
|
||||
}
|
||||
}
|
||||
|
||||
void MIRPrinter::convertStackObjects(yaml::MachineFunction &MF,
|
||||
const MachineFrameInfo &MFI,
|
||||
MachineModuleInfo &MMI,
|
||||
ModuleSlotTracker &MST,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
void MIRPrinter::convertStackObjects(yaml::MachineFunction &YMF,
|
||||
const MachineFunction &MF,
|
||||
ModuleSlotTracker &MST) {
|
||||
const MachineFrameInfo &MFI = MF.getFrameInfo();
|
||||
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
|
||||
// Process fixed stack objects.
|
||||
unsigned ID = 0;
|
||||
for (int I = MFI.getObjectIndexBegin(); I < 0; ++I) {
|
||||
@ -307,7 +304,7 @@ void MIRPrinter::convertStackObjects(yaml::MachineFunction &MF,
|
||||
YamlObject.Alignment = MFI.getObjectAlignment(I);
|
||||
YamlObject.IsImmutable = MFI.isImmutableObjectIndex(I);
|
||||
YamlObject.IsAliased = MFI.isAliasedObjectIndex(I);
|
||||
MF.FixedStackObjects.push_back(YamlObject);
|
||||
YMF.FixedStackObjects.push_back(YamlObject);
|
||||
StackObjectOperandMapping.insert(
|
||||
std::make_pair(I, FrameIndexOperand::createFixed(ID++)));
|
||||
}
|
||||
@ -332,7 +329,7 @@ void MIRPrinter::convertStackObjects(yaml::MachineFunction &MF,
|
||||
YamlObject.Size = MFI.getObjectSize(I);
|
||||
YamlObject.Alignment = MFI.getObjectAlignment(I);
|
||||
|
||||
MF.StackObjects.push_back(YamlObject);
|
||||
YMF.StackObjects.push_back(YamlObject);
|
||||
StackObjectOperandMapping.insert(std::make_pair(
|
||||
I, FrameIndexOperand::create(YamlObject.Name.Value, ID++)));
|
||||
}
|
||||
@ -345,9 +342,9 @@ void MIRPrinter::convertStackObjects(yaml::MachineFunction &MF,
|
||||
"Invalid stack object index");
|
||||
const FrameIndexOperand &StackObject = StackObjectInfo->second;
|
||||
if (StackObject.IsFixed)
|
||||
MF.FixedStackObjects[StackObject.ID].CalleeSavedRegister = Reg;
|
||||
YMF.FixedStackObjects[StackObject.ID].CalleeSavedRegister = Reg;
|
||||
else
|
||||
MF.StackObjects[StackObject.ID].CalleeSavedRegister = Reg;
|
||||
YMF.StackObjects[StackObject.ID].CalleeSavedRegister = Reg;
|
||||
}
|
||||
for (unsigned I = 0, E = MFI.getLocalFrameObjectCount(); I < E; ++I) {
|
||||
auto LocalObject = MFI.getLocalFrameObjectMap(I);
|
||||
@ -356,26 +353,26 @@ void MIRPrinter::convertStackObjects(yaml::MachineFunction &MF,
|
||||
"Invalid stack object index");
|
||||
const FrameIndexOperand &StackObject = StackObjectInfo->second;
|
||||
assert(!StackObject.IsFixed && "Expected a locally mapped stack object");
|
||||
MF.StackObjects[StackObject.ID].LocalOffset = LocalObject.second;
|
||||
YMF.StackObjects[StackObject.ID].LocalOffset = LocalObject.second;
|
||||
}
|
||||
|
||||
// Print the stack object references in the frame information class after
|
||||
// converting the stack objects.
|
||||
if (MFI.hasStackProtectorIndex()) {
|
||||
raw_string_ostream StrOS(MF.FrameInfo.StackProtector.Value);
|
||||
raw_string_ostream StrOS(YMF.FrameInfo.StackProtector.Value);
|
||||
MIPrinter(StrOS, MST, RegisterMaskIds, StackObjectOperandMapping)
|
||||
.printStackObjectReference(MFI.getStackProtectorIndex());
|
||||
}
|
||||
|
||||
// Print the debug variable information.
|
||||
for (MachineModuleInfo::VariableDbgInfo &DebugVar :
|
||||
MMI.getVariableDbgInfo()) {
|
||||
for (const MachineFunction::VariableDbgInfo &DebugVar :
|
||||
MF.getVariableDbgInfo()) {
|
||||
auto StackObjectInfo = StackObjectOperandMapping.find(DebugVar.Slot);
|
||||
assert(StackObjectInfo != StackObjectOperandMapping.end() &&
|
||||
"Invalid stack object index");
|
||||
const FrameIndexOperand &StackObject = StackObjectInfo->second;
|
||||
assert(!StackObject.IsFixed && "Expected a non-fixed stack object");
|
||||
auto &Object = MF.StackObjects[StackObject.ID];
|
||||
auto &Object = YMF.StackObjects[StackObject.ID];
|
||||
{
|
||||
raw_string_ostream StrOS(Object.DebugVar.Value);
|
||||
DebugVar.Var->printAsOperand(StrOS, MST);
|
||||
|
@ -240,7 +240,6 @@ void MachineModuleInfo::EndFunction() {
|
||||
CallsEHReturn = false;
|
||||
CallsUnwindInit = false;
|
||||
HasEHFunclets = false;
|
||||
VariableDbgInfos.clear();
|
||||
}
|
||||
|
||||
//===- Address of Block Management ----------------------------------------===//
|
||||
|
@ -236,7 +236,7 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf,
|
||||
StaticAllocaMap.find(AI);
|
||||
if (SI != StaticAllocaMap.end()) { // Check for VLAs.
|
||||
int FI = SI->second;
|
||||
MMI.setVariableDbgInfo(DI->getVariable(), DI->getExpression(),
|
||||
MF->setVariableDbgInfo(DI->getVariable(), DI->getExpression(),
|
||||
FI, DI->getDebugLoc());
|
||||
}
|
||||
}
|
||||
|
@ -778,10 +778,9 @@ void StackColoring::remapInstructions(DenseMap<int, int> &SlotRemap) {
|
||||
unsigned FixedInstr = 0;
|
||||
unsigned FixedMemOp = 0;
|
||||
unsigned FixedDbg = 0;
|
||||
MachineModuleInfo *MMI = &MF->getMMI();
|
||||
|
||||
// Remap debug information that refers to stack slots.
|
||||
for (auto &VI : MMI->getVariableDbgInfo()) {
|
||||
for (auto &VI : MF->getVariableDbgInfo()) {
|
||||
if (!VI.Var)
|
||||
continue;
|
||||
if (SlotRemap.count(VI.Slot)) {
|
||||
|
Loading…
Reference in New Issue
Block a user