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);
|
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,
|
/// addComplexAddress - Start with the address based on the location provided,
|
||||||
/// and generate the DWARF information necessary to find the actual variable
|
/// and generate the DWARF information necessary to find the actual variable
|
||||||
/// given the extra address information encoded in the DIVariable, starting from
|
/// 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,
|
void CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
|
||||||
unsigned Attribute,
|
unsigned Attribute,
|
||||||
const MachineLocation &Location) {
|
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();
|
DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
|
||||||
|
|
||||||
if (Location.isReg()) {
|
if (Location.isReg())
|
||||||
if (Reg < 32) {
|
addRegisterOp(Block, Location.getReg());
|
||||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
|
else
|
||||||
} else {
|
addRegisterOffset(Block, Location.getReg(), Location.getOffset());
|
||||||
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());
|
|
||||||
}
|
|
||||||
|
|
||||||
for (unsigned i = 0, N = DV->getNumAddrElements(); i < N; ++i) {
|
for (unsigned i = 0, N = DV->getNumAddrElements(); i < N; ++i) {
|
||||||
uint64_t Element = DV->getAddrElement(i);
|
uint64_t Element = DV->getAddrElement(i);
|
||||||
@ -412,55 +449,6 @@ void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
|
|||||||
addBlock(Die, Attribute, 0, Block);
|
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.
|
/// addConstantValue - Add constant value entry in variable DIE.
|
||||||
bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO) {
|
bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO) {
|
||||||
assert (MO.isImm() && "Invalid machine operand!");
|
assert (MO.isImm() && "Invalid machine operand!");
|
||||||
|
@ -194,6 +194,12 @@ public:
|
|||||||
/// addTemplateParams - Add template parameters in buffer.
|
/// addTemplateParams - Add template parameters in buffer.
|
||||||
void addTemplateParams(DIE &Buffer, DIArray TParams);
|
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,
|
/// addComplexAddress - Start with the address based on the location provided,
|
||||||
/// and generate the DWARF information necessary to find the actual variable
|
/// and generate the DWARF information necessary to find the actual variable
|
||||||
/// (navigating the extra location information encoded in the type) based on
|
/// (navigating the extra location information encoded in the type) based on
|
||||||
|
Loading…
x
Reference in New Issue
Block a user