summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2009-05-08 21:03:15 +0000
committerBill Wendling <isanbard@gmail.com>2009-05-08 21:03:15 +0000
commitfa03b0084ab68a7a17db7e9f2fa6cb7db55655fc (patch)
tree9920878b0eb51fd1a6693b35432a8e3f2cf51e2a /llvm/lib
parentc05bb947c430a45cb92f084b8c1f0b14cdc38df5 (diff)
downloadbcm5719-llvm-fa03b0084ab68a7a17db7e9f2fa6cb7db55655fc.tar.gz
bcm5719-llvm-fa03b0084ab68a7a17db7e9f2fa6cb7db55655fc.zip
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
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp31
1 files changed, 20 insertions, 11 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
index 1739ec9d2aa..1409feb98d5 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
@@ -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.
}
}
OpenPOWER on IntegriCloud