Compute the offsets of the compile units. We need this so that when we emit a

concrete instance of an inlined function, we can get the actual address of the
abstract instance inside of the compile unit.

This isn't currently used, but will be by a future check-in.

llvm-svn: 71263
This commit is contained in:
Bill Wendling 2009-05-08 21:03:15 +00:00
parent c05bb947c4
commit fa03b0084a
1 changed files with 20 additions and 11 deletions

View File

@ -1289,6 +1289,11 @@ class DwarfDebug : public Dwarf {
/// variables.
DenseMap<const MachineInstr *, DbgScope *> InlinedVariableScopes;
/// CompileUnitOffsets - A vector of the offsets of the compile units. This is
/// used when calculating the "origin" of a concrete instance of an inlined
/// function.
DenseMap<CompileUnit *, unsigned> CompileUnitOffsets;
/// DebugTimer - Timer for the Dwarf debug writer.
Timer *DebugTimer;
@ -2360,24 +2365,28 @@ private:
/// SizeAndOffsets - Compute the size and offset of all the DIEs.
///
void SizeAndOffsets() {
// Compute size of compile unit header.
static unsigned Offset =
sizeof(int32_t) + // Length of Compilation Unit Info
sizeof(int16_t) + // DWARF version number
sizeof(int32_t) + // Offset Into Abbrev. Section
sizeof(int8_t); // Pointer Size (in bytes)
// Process base compile unit.
if (MainCU) {
// Compute size of compile unit header
unsigned Offset = sizeof(int32_t) + // Length of Compilation Unit Info
sizeof(int16_t) + // DWARF version number
sizeof(int32_t) + // Offset Into Abbrev. Section
sizeof(int8_t); // Pointer Size (in bytes)
SizeAndOffsetDie(MainCU->getDie(), Offset, true);
CompileUnitOffsets[MainCU] = 0;
return;
}
// Process all compile units.
unsigned PrevOffset = 0;
for (unsigned i = 0, e = CompileUnits.size(); i != e; ++i) {
CompileUnit *Unit = CompileUnits[i];
// Compute size of compile unit header
unsigned Offset = sizeof(int32_t) + // Length of Compilation Unit Info
sizeof(int16_t) + // DWARF version number
sizeof(int32_t) + // Offset Into Abbrev. Section
sizeof(int8_t); // Pointer Size (in bytes)
SizeAndOffsetDie(Unit->getDie(), Offset, true);
CompileUnitOffsets[Unit] = PrevOffset;
PrevOffset += SizeAndOffsetDie(Unit->getDie(), Offset, true)
+ sizeof(int32_t); // FIXME - extra pad for gdb bug.
}
}