mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-18 13:34:04 +00:00
Refactor code. Keep dwarf register operation selection logic at one place.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130231 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1394e6d925
commit
116da2fbe9
@ -210,6 +210,62 @@ void CompileUnit::addFrameVariableAddress(DbgVariable *&DV, DIE *Die,
|
||||
addAddress(Die, dwarf::DW_AT_location, Location);
|
||||
}
|
||||
|
||||
/// addRegisterOp - Add register operand.
|
||||
void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
|
||||
const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
|
||||
unsigned DWReg = RI->getDwarfRegNum(Reg, false);
|
||||
if (DWReg < 32)
|
||||
addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
|
||||
else {
|
||||
addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
|
||||
addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
|
||||
}
|
||||
}
|
||||
|
||||
/// addRegisterOffset - Add register offset.
|
||||
void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
|
||||
int64_t Offset) {
|
||||
const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
|
||||
unsigned DWReg = RI->getDwarfRegNum(Reg, false);
|
||||
const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
|
||||
if (Reg == TRI->getFrameRegister(*Asm->MF))
|
||||
// If variable offset is based in frame register then use fbreg.
|
||||
addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
|
||||
else if (DWReg < 32)
|
||||
addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
|
||||
else {
|
||||
addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
|
||||
addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
|
||||
}
|
||||
addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
|
||||
}
|
||||
|
||||
/// addAddress - Add an address attribute to a die based on the location
|
||||
/// provided.
|
||||
void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
|
||||
const MachineLocation &Location) {
|
||||
DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
|
||||
|
||||
if (Location.isReg())
|
||||
addRegisterOp(Block, Location.getReg());
|
||||
else
|
||||
addRegisterOffset(Block, Location.getReg(), Location.getOffset());
|
||||
|
||||
// Now attach the location information to the DIE.
|
||||
addBlock(Die, Attribute, 0, Block);
|
||||
}
|
||||
|
||||
/// addRegisterAddress - Add register location entry in variable DIE.
|
||||
bool CompileUnit::addRegisterAddress(DIE *Die, const MachineOperand &MO) {
|
||||
assert (MO.isReg() && "Invalid machine operand!");
|
||||
if (!MO.getReg())
|
||||
return false;
|
||||
MachineLocation Location;
|
||||
Location.set(MO.getReg());
|
||||
addAddress(Die, dwarf::DW_AT_location, Location);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// addComplexAddress - Start with the address based on the location provided,
|
||||
/// and generate the DWARF information necessary to find the actual variable
|
||||
/// given the extra address information encoded in the DIVariable, starting from
|
||||
@ -218,31 +274,12 @@ void CompileUnit::addFrameVariableAddress(DbgVariable *&DV, DIE *Die,
|
||||
void CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
|
||||
unsigned Attribute,
|
||||
const MachineLocation &Location) {
|
||||
DIType Ty = DV->getType();
|
||||
|
||||
// Decode the original location, and use that as the start of the byref
|
||||
// variable's location.
|
||||
const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
|
||||
unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
|
||||
DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
|
||||
|
||||
if (Location.isReg()) {
|
||||
if (Reg < 32) {
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
|
||||
} else {
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
|
||||
addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
|
||||
}
|
||||
} else {
|
||||
if (Reg < 32)
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
|
||||
else {
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
|
||||
addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
|
||||
}
|
||||
|
||||
addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
|
||||
}
|
||||
if (Location.isReg())
|
||||
addRegisterOp(Block, Location.getReg());
|
||||
else
|
||||
addRegisterOffset(Block, Location.getReg(), Location.getOffset());
|
||||
|
||||
for (unsigned i = 0, N = DV->getNumAddrElements(); i < N; ++i) {
|
||||
uint64_t Element = DV->getAddrElement(i);
|
||||
@ -412,55 +449,6 @@ void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
|
||||
addBlock(Die, Attribute, 0, Block);
|
||||
}
|
||||
|
||||
/// addAddress - Add an address attribute to a die based on the location
|
||||
/// provided.
|
||||
void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
|
||||
const MachineLocation &Location) {
|
||||
const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
|
||||
unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
|
||||
DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
|
||||
|
||||
if (RI->getFrameRegister(*Asm->MF) == Location.getReg()
|
||||
&& Location.getOffset()) {
|
||||
// If variable offset is based in frame register then use fbreg.
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
|
||||
addSInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
|
||||
addBlock(Die, Attribute, 0, Block);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Location.isReg()) {
|
||||
if (Reg < 32) {
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
|
||||
} else {
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
|
||||
addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
|
||||
}
|
||||
} else {
|
||||
if (Reg < 32) {
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
|
||||
} else {
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
|
||||
addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
|
||||
}
|
||||
|
||||
addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
|
||||
}
|
||||
|
||||
addBlock(Die, Attribute, 0, Block);
|
||||
}
|
||||
|
||||
/// addRegisterAddress - Add register location entry in variable DIE.
|
||||
bool CompileUnit::addRegisterAddress(DIE *Die, const MachineOperand &MO) {
|
||||
assert (MO.isReg() && "Invalid machine operand!");
|
||||
if (!MO.getReg())
|
||||
return false;
|
||||
MachineLocation Location;
|
||||
Location.set(MO.getReg());
|
||||
addAddress(Die, dwarf::DW_AT_location, Location);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// addConstantValue - Add constant value entry in variable DIE.
|
||||
bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO) {
|
||||
assert (MO.isImm() && "Invalid machine operand!");
|
||||
|
@ -194,6 +194,12 @@ public:
|
||||
/// addTemplateParams - Add template parameters in buffer.
|
||||
void addTemplateParams(DIE &Buffer, DIArray TParams);
|
||||
|
||||
/// addRegisterOp - Add register operand.
|
||||
void addRegisterOp(DIE *TheDie, unsigned Reg);
|
||||
|
||||
/// addRegisterOffset - Add register offset.
|
||||
void addRegisterOffset(DIE *TheDie, unsigned Reg, int64_t Offset);
|
||||
|
||||
/// addComplexAddress - Start with the address based on the location provided,
|
||||
/// and generate the DWARF information necessary to find the actual variable
|
||||
/// (navigating the extra location information encoded in the type) based on
|
||||
|
Loading…
x
Reference in New Issue
Block a user