diff options
author | Eric Christopher <echristo@gmail.com> | 2014-03-08 00:29:41 +0000 |
---|---|---|
committer | Eric Christopher <echristo@gmail.com> | 2014-03-08 00:29:41 +0000 |
commit | b1c884410141ea7bdae5d4f9b1559d71cecc3d7c (patch) | |
tree | 02f759d522811746bce1820d0e10bdfb5d3df6a1 /lib | |
parent | d07494f1022c01a51abaad6802900fa3e6068a60 (diff) | |
download | llvm-b1c884410141ea7bdae5d4f9b1559d71cecc3d7c.tar.gz llvm-b1c884410141ea7bdae5d4f9b1559d71cecc3d7c.tar.bz2 llvm-b1c884410141ea7bdae5d4f9b1559d71cecc3d7c.tar.xz |
Add support for hashing location information for CU level hashes.
Add a testcase based on sret.cpp where we can now hash the entire
compile unit.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203319 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/AsmPrinter/DIEHash.cpp | 34 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DIEHash.h | 3 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.h | 12 |
3 files changed, 43 insertions, 6 deletions
diff --git a/lib/CodeGen/AsmPrinter/DIEHash.cpp b/lib/CodeGen/AsmPrinter/DIEHash.cpp index cff8f2180a..024ce0e725 100644 --- a/lib/CodeGen/AsmPrinter/DIEHash.cpp +++ b/lib/CodeGen/AsmPrinter/DIEHash.cpp @@ -13,8 +13,10 @@ #define DEBUG_TYPE "dwarfdebug" +#include "ByteStreamer.h" #include "DIEHash.h" #include "DIE.h" +#include "DwarfDebug.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" #include "llvm/CodeGen/AsmPrinter.h" @@ -279,6 +281,28 @@ void DIEHash::hashBlockData(const SmallVectorImpl<DIEValue *> &Values) { Hash.update((uint64_t)cast<DIEInteger>(*I)->getValue()); } +// Hash the contents of a loclistptr class. +void DIEHash::hashLocList(const DIELocList &LocList) { + SmallVectorImpl<DotDebugLocEntry>::const_iterator Start = + AP->getDwarfDebug()->getDebugLocEntries().begin(); + Start += LocList.getValue(); + HashingByteStreamer Streamer(*this); + for (SmallVectorImpl<DotDebugLocEntry>::const_iterator + I = Start, + E = AP->getDwarfDebug()->getDebugLocEntries().end(); + I != E; ++I) { + const DotDebugLocEntry &Entry = *I; + // Go through the entries until we hit the end of the list, + // which is the next empty entry. + if (Entry.isEmpty()) + return; + else if (Entry.isMerged()) + continue; + else + AP->getDwarfDebug()->emitDebugLocEntry(Streamer, Entry); + } +} + // Hash an individual attribute \param Attr based on the type of attribute and // the form. void DIEHash::hashAttribute(AttrEntry Attr, dwarf::Tag Tag) { @@ -333,19 +357,23 @@ void DIEHash::hashAttribute(AttrEntry Attr, dwarf::Tag Tag) { break; case DIEValue::isBlock: case DIEValue::isLoc: + case DIEValue::isLocList: addULEB128('A'); addULEB128(Attribute); addULEB128(dwarf::DW_FORM_block); if (isa<DIEBlock>(Value)) { addULEB128(cast<DIEBlock>(Value)->ComputeSize(AP)); hashBlockData(cast<DIEBlock>(Value)->getValues()); - } else { + } else if (isa<DIELoc>(Value)) { addULEB128(cast<DIELoc>(Value)->ComputeSize(AP)); hashBlockData(cast<DIELoc>(Value)->getValues()); + } else { + // We could add the block length, but that would take + // a bit of work and not add a lot of uniqueness + // to the hash in some way we could test. + hashLocList(*cast<DIELocList>(Value)); } break; - // FIXME: Handle loclistptr. - case DIEValue::isLocList: // FIXME: It's uncertain whether or not we should handle this at the moment. case DIEValue::isExpr: case DIEValue::isLabel: diff --git a/lib/CodeGen/AsmPrinter/DIEHash.h b/lib/CodeGen/AsmPrinter/DIEHash.h index c3db2d06ca..48f16011e8 100644 --- a/lib/CodeGen/AsmPrinter/DIEHash.h +++ b/lib/CodeGen/AsmPrinter/DIEHash.h @@ -137,6 +137,9 @@ private: /// DW_FORM_exprloc. void hashBlockData(const SmallVectorImpl<DIEValue *> &Values); + /// \brief Hashes the contents pointed to in the .debug_loc section. + void hashLocList(const DIELocList &LocList); + /// \brief Hashes an individual attribute. void hashAttribute(AttrEntry Attr, dwarf::Tag Tag); diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 0dadb73562..b8cfdd354b 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -588,9 +588,6 @@ class DwarfDebug : public AsmPrinterHandler { /// \brief Emit visible names into a debug str section. void emitDebugStr(); - /// \brief Emit an entry for the debug loc section. - void emitDebugLocEntry(ByteStreamer &Streamer, const DotDebugLocEntry &Entry); - /// \brief Emit visible names into a debug loc section. void emitDebugLoc(); @@ -761,6 +758,15 @@ public: /// Returns the section symbol for the .debug_loc section. MCSymbol *getDebugLocSym() const { return DwarfDebugLocSectionSym; } + /// Returns the entries for the .debug_loc section. + const SmallVectorImpl<DotDebugLocEntry> &getDebugLocEntries() const { + return DotDebugLocEntries; + } + + /// \brief Emit an entry for the debug loc section. This can be used to + /// handle an entry that's going to be emitted into the debug loc section. + void emitDebugLocEntry(ByteStreamer &Streamer, const DotDebugLocEntry &Entry); + /// Find the MDNode for the given reference. template <typename T> T resolve(DIRef<T> Ref) const { return Ref.resolve(TypeIdentifierMap); |