Add a hashing routine that handles hashing types. Add a test for
authorEric Christopher <echristo@gmail.com>
Tue, 3 Sep 2013 21:57:57 +0000 (21:57 +0000)
committerEric Christopher <echristo@gmail.com>
Tue, 3 Sep 2013 21:57:57 +0000 (21:57 +0000)
hashing the contents of DW_FORM_data1 on top of a type with attributes.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189862 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/DIEHash.cpp
lib/CodeGen/AsmPrinter/DIEHash.h
unittests/CMakeLists.txt
unittests/CodeGen/CMakeLists.txt [new file with mode: 0644]
unittests/CodeGen/DIEHashTest.cpp [new file with mode: 0644]
unittests/CodeGen/Makefile [new file with mode: 0644]
unittests/Makefile

index 1581c9682dabbdf1944368963edb1413db4f634b..519c8a0068586359d19d60cbc6cc29735ce1c470 100644 (file)
@@ -422,6 +422,7 @@ uint64_t DIEHash::computeDIEODRSignature(DIE *Die) {
 /// This is based on the type signature computation given in section 7.27 of the
 /// DWARF4 standard. It is an md5 hash of the flattened description of the DIE
 /// with the inclusion of the full CU and all top level CU entities.
+// TODO: Initialize the type chain at 0 instead of 1 for CU signatures.
 uint64_t DIEHash::computeCUSignature(DIE *Die) {
 
   // Hash the DIE.
@@ -436,3 +437,22 @@ uint64_t DIEHash::computeCUSignature(DIE *Die) {
   // appropriately.
   return *reinterpret_cast<support::ulittle64_t *>(Result + 8);
 }
+
+/// This is based on the type signature computation given in section 7.27 of the
+/// DWARF4 standard. It is an md5 hash of the flattened description of the DIE
+/// with the inclusion of additional forms not specifically called out in the
+/// standard.
+uint64_t DIEHash::computeTypeSignature(DIE *Die) {
+
+  // Hash the DIE.
+  computeHash(Die);
+
+  // Now return the result.
+  MD5::MD5Result Result;
+  Hash.final(Result);
+
+  // ... take the least significant 8 bytes and return those. Our MD5
+  // implementation always returns its results in little endian, swap bytes
+  // appropriately.
+  return *reinterpret_cast<support::ulittle64_t *>(Result + 8);
+}
index f98b56dd73bff7ba2728e83c44648abe9b618ab7..b792aeab6ce6cdd34021164b20b20e3f4f9f60e0 100644 (file)
@@ -87,6 +87,9 @@ public:
   /// \brief Computes the CU signature.
   uint64_t computeCUSignature(DIE *Die);
 
+  /// \brief Computes the type signature.
+  uint64_t computeTypeSignature(DIE *Die);
+
   // Helper routines to process parts of a DIE.
 private:
   /// \brief Adds the parent context of \param Die to the hash.
index bbf571af5dfbdee5c9b00af4b2ce1f06c68fea99..3bfe9c0aff25362c303757c7611456ad58283c28 100644 (file)
@@ -8,6 +8,7 @@ endfunction()
 add_subdirectory(ADT)
 add_subdirectory(Analysis)
 add_subdirectory(Bitcode)
+add_subdirectory(CodeGen)
 add_subdirectory(DebugInfo)
 add_subdirectory(ExecutionEngine)
 add_subdirectory(IR)
diff --git a/unittests/CodeGen/CMakeLists.txt b/unittests/CodeGen/CMakeLists.txt
new file mode 100644 (file)
index 0000000..5f5c90a
--- /dev/null
@@ -0,0 +1,13 @@
+set(LLVM_LINK_COMPONENTS
+  asmprinter
+  codegen
+  support
+  )
+
+set(DebugInfoSources
+  DIEHashTest.cpp
+  )
+
+add_llvm_unittest(DebugInfoTests
+  ${DebugInfoSources}
+  )
diff --git a/unittests/CodeGen/DIEHashTest.cpp b/unittests/CodeGen/DIEHashTest.cpp
new file mode 100644 (file)
index 0000000..54dc4ee
--- /dev/null
@@ -0,0 +1,29 @@
+//===- llvm/unittest/DebugInfo/DWARFFormValueTest.cpp ---------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "../lib/CodeGen/AsmPrinter/DIE.h"
+#include "../lib/CodeGen/AsmPrinter/DIEHash.h"
+#include "llvm/Support/Dwarf.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/Format.h"
+#include "gtest/gtest.h"
+
+namespace {
+
+using namespace llvm;
+TEST(DIEHashData1Test, DIEHash) {
+  DIEHash Hash;
+  DIE *Die = new DIE(dwarf::DW_TAG_base_type);
+  DIEValue *Size = new DIEInteger(4);
+  Die->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Size);
+  uint64_t MD5Res = Hash.computeTypeSignature(Die);
+  ASSERT_TRUE(MD5Res == 0x540e9ff30ade3e4a);
+  delete Die;
+}
+}
diff --git a/unittests/CodeGen/Makefile b/unittests/CodeGen/Makefile
new file mode 100644 (file)
index 0000000..4f07017
--- /dev/null
@@ -0,0 +1,16 @@
+##===- unittests/DebugInfo/Makefile ------------------------*- Makefile -*-===##
+#
+#                     The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../..
+TESTNAME = CodeGen
+LINK_COMPONENTS := asmprinter codegen support
+
+include $(LEVEL)/Makefile.config
+
+include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest
index 36b82da9e6028ea4b2081acb419768f9887481ff..4ba11793651d5d4128042afdc007932012c78daa 100644 (file)
@@ -9,8 +9,8 @@
 
 LEVEL = ..
 
-PARALLEL_DIRS = ADT Analysis Bitcode DebugInfo ExecutionEngine IR Object \
-               Option Support Transforms
+PARALLEL_DIRS = ADT Analysis Bitcode CodeGen DebugInfo ExecutionEngine IR \
+               Object Option Support Transforms
 
 include $(LEVEL)/Makefile.common