summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorEric Christopher <echristo@gmail.com>2014-03-08 00:29:41 +0000
committerEric Christopher <echristo@gmail.com>2014-03-08 00:29:41 +0000
commitb1c884410141ea7bdae5d4f9b1559d71cecc3d7c (patch)
tree02f759d522811746bce1820d0e10bdfb5d3df6a1 /lib
parentd07494f1022c01a51abaad6802900fa3e6068a60 (diff)
downloadllvm-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.cpp34
-rw-r--r--lib/CodeGen/AsmPrinter/DIEHash.h3
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfDebug.h12
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);