Skip to content

Commit

Permalink
Simplify handling of variables with complex address (i.e. blocks vari…
Browse files Browse the repository at this point in the history
…ables)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130339 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Devang Patel committed Apr 27, 2011
1 parent 2790ba8 commit e1cdf84
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 44 deletions.
25 changes: 4 additions & 21 deletions lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -192,16 +192,10 @@ void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
}

/// addFrameVariableAddress - Add DW_AT_location attribute for a
/// DbgVariable based on provided frame index.
void CompileUnit::addFrameVariableAddress(DbgVariable *&DV, DIE *Die,
int64_t FI) {
MachineLocation Location;
unsigned FrameReg;
const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
Location.set(FrameReg, Offset);

/// addVariableAddress - Add DW_AT_location attribute for a
/// DbgVariable based on provided MachineLocation.
void CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die,
MachineLocation Location) {
if (DV->variableHasComplexAddress())
addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
else if (DV->isBlockByrefVariable())
Expand Down Expand Up @@ -255,17 +249,6 @@ void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
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
Expand Down
9 changes: 3 additions & 6 deletions lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
Original file line number Diff line number Diff line change
Expand Up @@ -181,9 +181,6 @@ class CompileUnit {
void addAddress(DIE *Die, unsigned Attribute,
const MachineLocation &Location);

/// addRegisterAddress - Add register location entry in variable DIE.
bool addRegisterAddress(DIE *Die, const MachineOperand &MO);

/// addConstantValue - Add constant value entry in variable DIE.
bool addConstantValue(DIE *Die, const MachineOperand &MO);
bool addConstantValue(DIE *Die, ConstantInt *CI, bool Unsigned);
Expand Down Expand Up @@ -218,9 +215,9 @@ class CompileUnit {
void addBlockByrefAddress(DbgVariable *&DV, DIE *Die, unsigned Attribute,
const MachineLocation &Location);

/// addFrameVariableAddress - Add DW_AT_location attribute for a DbgVariable
/// based on provided frame index.
void addFrameVariableAddress(DbgVariable *&DV, DIE *Die, int64_t FI);
/// addVariableAddress - Add DW_AT_location attribute for a
/// DbgVariable based on provided MachineLocation.
void addVariableAddress(DbgVariable *&DV, DIE *Die, MachineLocation Location);

/// addToContextOwner - Add Die into the list of its context owner's children.
void addToContextOwner(DIE *Die, DIDescriptor Context);
Expand Down
42 changes: 25 additions & 17 deletions lib/CodeGen/AsmPrinter/DwarfDebug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -699,11 +699,19 @@ DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
if (DVInsn->getOperand(1).isImm() &&
TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
VariableCU->addFrameVariableAddress(DV, VariableDie,
DVInsn->getOperand(1).getImm());
updated = true;
} else
updated = VariableCU->addRegisterAddress(VariableDie, RegOp);
unsigned FrameReg = 0;
const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
int Offset =
TFI->getFrameIndexReference(*Asm->MF,
DVInsn->getOperand(1).getImm(),
FrameReg);
MachineLocation Location(FrameReg, Offset);
VariableCU->addVariableAddress(DV, VariableDie, Location);

} else if (RegOp.getReg())
VariableCU->addVariableAddress(DV, VariableDie,
MachineLocation(RegOp.getReg()));
updated = true;
}
else if (DVInsn->getOperand(0).isImm())
updated = VariableCU->addConstantValue(VariableDie,
Expand All @@ -712,15 +720,9 @@ DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
updated =
VariableCU->addConstantFPValue(VariableDie, DVInsn->getOperand(0));
} else {
MachineLocation Location = Asm->getDebugValueLocation(DVInsn);
if (Location.getReg()) {
if (DV->getVariable().hasComplexAddress())
VariableCU->addComplexAddress(DV, VariableDie, dwarf::DW_AT_location,
Location);
else
VariableCU->addAddress(VariableDie, dwarf::DW_AT_location, Location);
updated = true;
}
VariableCU->addVariableAddress(DV, VariableDie,
Asm->getDebugValueLocation(DVInsn));
updated = true;
}
if (!updated) {
// If variableDie is not updated then DBG_VALUE instruction does not
Expand All @@ -734,9 +736,15 @@ DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {

// .. else use frame index, if available.
int FI = 0;
if (findVariableFrameIndex(DV, &FI))
VariableCU->addFrameVariableAddress(DV, VariableDie, FI);

if (findVariableFrameIndex(DV, &FI)) {
unsigned FrameReg = 0;
const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
int Offset =
TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
MachineLocation Location(FrameReg, Offset);
VariableCU->addVariableAddress(DV, VariableDie, Location);
}

DV->setDIE(VariableDie);
return VariableDie;

Expand Down

0 comments on commit e1cdf84

Please sign in to comment.