mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-13 22:24:07 +00:00
Debug Info: Simplify Frame Index handling in DBG_VALUE Machine Instructions
Rather than using the full power of target-specific addressing modes in DBG_VALUEs with Frame Indicies, simply use Frame Index + Offset. This reduces the complexity of debug info handling down to two representations of values (reg+offset and frame index+offset) rather than three or four. Ideally we could ensure that frame indicies had been eliminated by the time we reached an assembly or dwarf generation, but I haven't spent the time to figure out where the FIs are leaking through into that & whether there's a good place to convert them. Some FI+offset=>reg+offset conversion is done (see PrologEpilogInserter, for example) which is necessary for some SelectionDAG assumptions about registers, I believe, but it might be possible to make this a more thorough conversion & ensure there are no remaining FIs no matter how instruction selection is performed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184066 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -1525,43 +1525,23 @@ DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
|
||||
// Check if variable is described by a DBG_VALUE instruction.
|
||||
if (const MachineInstr *DVInsn = DV->getMInsn()) {
|
||||
bool updated = false;
|
||||
if (DVInsn->getNumOperands() == 3) {
|
||||
if (DVInsn->getOperand(0).isReg()) {
|
||||
const MachineOperand RegOp = DVInsn->getOperand(0);
|
||||
const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
|
||||
if (DVInsn->getOperand(1).isImm() &&
|
||||
TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
|
||||
unsigned FrameReg = 0;
|
||||
const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
|
||||
int Offset =
|
||||
TFI->getFrameIndexReference(*Asm->MF,
|
||||
DVInsn->getOperand(1).getImm(),
|
||||
FrameReg);
|
||||
MachineLocation Location(FrameReg, Offset);
|
||||
addVariableAddress(DV, VariableDie, Location);
|
||||
|
||||
} else if (RegOp.getReg())
|
||||
addVariableAddress(DV, VariableDie,
|
||||
MachineLocation(RegOp.getReg()));
|
||||
updated = true;
|
||||
}
|
||||
else if (DVInsn->getOperand(0).isImm())
|
||||
updated =
|
||||
addConstantValue(VariableDie, DVInsn->getOperand(0),
|
||||
DV->getType());
|
||||
else if (DVInsn->getOperand(0).isFPImm())
|
||||
updated =
|
||||
addConstantFPValue(VariableDie, DVInsn->getOperand(0));
|
||||
else if (DVInsn->getOperand(0).isCImm())
|
||||
updated =
|
||||
addConstantValue(VariableDie,
|
||||
DVInsn->getOperand(0).getCImm(),
|
||||
DV->getType().isUnsignedDIType());
|
||||
} else {
|
||||
addVariableAddress(DV, VariableDie,
|
||||
Asm->getDebugValueLocation(DVInsn));
|
||||
assert(DVInsn->getNumOperands() == 3);
|
||||
if (DVInsn->getOperand(0).isReg()) {
|
||||
const MachineOperand RegOp = DVInsn->getOperand(0);
|
||||
if (int64_t Offset = DVInsn->getOperand(1).getImm()) {
|
||||
MachineLocation Location(RegOp.getReg(), Offset);
|
||||
addVariableAddress(DV, VariableDie, Location);
|
||||
} else if (RegOp.getReg())
|
||||
addVariableAddress(DV, VariableDie, MachineLocation(RegOp.getReg()));
|
||||
updated = true;
|
||||
}
|
||||
} else if (DVInsn->getOperand(0).isImm())
|
||||
updated =
|
||||
addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
|
||||
else if (DVInsn->getOperand(0).isFPImm())
|
||||
updated = addConstantFPValue(VariableDie, DVInsn->getOperand(0));
|
||||
else if (DVInsn->getOperand(0).isCImm())
|
||||
updated = addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
|
||||
DV->getType().isUnsignedDIType());
|
||||
if (!updated) {
|
||||
// If variableDie is not updated then DBG_VALUE instruction does not
|
||||
// have valid variable info.
|
||||
|
Reference in New Issue
Block a user