diff options
author | Bill Wendling <isanbard@gmail.com> | 2009-05-08 21:03:15 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2009-05-08 21:03:15 +0000 |
commit | fa03b0084ab68a7a17db7e9f2fa6cb7db55655fc (patch) | |
tree | 9920878b0eb51fd1a6693b35432a8e3f2cf51e2a /llvm/lib | |
parent | c05bb947c430a45cb92f084b8c1f0b14cdc38df5 (diff) | |
download | bcm5719-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.cpp | 31 |
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. } } |