Fix the libbcc SHA1 checksum dependency

Calculate SHA1 checksum of libbcc.so and libRS.so at compile time.

Change-Id: Ief1c20e20d62f5d5bf0a62592e081d4a6d77dcd4
diff --git a/Android.mk b/Android.mk
index 81e6e9e..c985ff3 100644
--- a/Android.mk
+++ b/Android.mk
@@ -83,6 +83,29 @@
 LOCAL_CFLAGS += -DCMDLINE
 include $(BUILD_HOST_EXECUTABLE)
 
+# Calculate SHA1 checksum for libbcc.so and libRS.so
+# ========================================================
+include $(CLEAR_VARS)
+LOCAL_MODULE := libbcc_sha1
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+
+LOCAL_REQUIRED_MODULES := libbcc sha1sum libRS
+
+CONVERT_ASM := frameworks/compile/libbcc/tools/dataconvert.py
+
+intermediates := $(local-intermediates-dir)
+libbcc_CHECKSUM_FILE := $(intermediates)/checksum.S
+LOCAL_GENERATED_SOURCES += $(libbcc_CHECKSUM_FILE)
+
+$(libbcc_CHECKSUM_FILE):$(TARGET_OUT_SHARED_LIBRARIES)/libbcc.so \
+                        $(TARGET_OUT_SHARED_LIBRARIES)/libRS.so
+	@mkdir -p $(dir $@) && \
+	  cat $^ | $(HOST_OUT_EXECUTABLES)/sha1sum | \
+	  python $(CONVERT_ASM) libbcc_checksum > $@
+
+include $(BUILD_SHARED_LIBRARY)
+
 #
 # Shared library for target
 # ========================================================
@@ -95,16 +118,7 @@
 LOCAL_SRC_FILES := \
   $(libbcc_SRC_FILES)
 
-intermediates := $(local-intermediates-dir)
-libbcc_CHECKSUM_FILE := $(intermediates)/lib/bcc_checksum.c
-
-LOCAL_GENERATED_SOURCES += $(libbcc_CHECKSUM_FILE)
-
-$(libbcc_CHECKSUM_FILE):$(HOST_OUT_EXECUTABLES)/sha1sum $(FULL_PATH_libbcc_SRC_FILES)
-	@echo Generate SHA1
-	@mkdir -p $(dir $@) && echo -n "char const libbcc_build_checksum[41] = \"" > $@
-	@cat $(FULL_PATH_libbcc_SRC_FILES) | $(HOST_OUT_EXECUTABLES)/sha1sum >> $@
-	@echo "\";" >> $@
+LOCAL_CFLAGS += -DTARGET_BUILD
 
 ifeq ($(TARGET_ARCH),arm)
   LOCAL_SRC_FILES += \
@@ -255,17 +269,6 @@
   $(libbcc_SRC_FILES) \
   helper/DebugHelper.c
 
-intermediates := $(local-intermediates-dir)
-libbcc_CHECKSUM_FILE := $(intermediates)/lib/bcc_checksum.c
-
-LOCAL_GENERATED_SOURCES += $(libbcc_CHECKSUM_FILE)
-
-$(libbcc_CHECKSUM_FILE):$(HOST_OUT_EXECUTABLES)/sha1sum $(FULL_PATH_libbcc_SRC_FILES)
-	@echo Generate SHA1
-	@mkdir -p $(dir $@) && echo -n "char const libbcc_build_checksum[41] = \"" > $@
-	@cat $(FULL_PATH_libbcc_SRC_FILES) | $(HOST_OUT_EXECUTABLES)/sha1sum >> $@
-	@echo "\";" >> $@
-
 ifeq ($(libbcc_USE_MCJIT),1)
   LOCAL_STATIC_LIBRARIES += librsloader
 endif
diff --git a/Config.h b/Config.h
index aaccbbd..f010ce7 100644
--- a/Config.h
+++ b/Config.h
@@ -21,8 +21,6 @@
 
 #define USE_DISASSEMBLER_FILE 0
 
-#define USE_LIBBCC_SHA1SUM 0
-
 #define USE_LOGGER 1
 
 #define USE_FUNC_LOGGER 0
diff --git a/include/bcc/bcc_cache.h b/include/bcc/bcc_cache.h
index 04a5d2b..51ec887 100644
--- a/include/bcc/bcc_cache.h
+++ b/include/bcc/bcc_cache.h
@@ -32,9 +32,6 @@
   uint8_t magic[4];
   uint8_t version[4];
 
-  /* libbcc SHA1 checksum */
-  char libbcc_build_checksum[41];
-
   /* machine-dependent integer type size */
   uint8_t endianness;
   uint8_t sizeof_off_t;
diff --git a/include/bcc/bcc_mccache.h b/include/bcc/bcc_mccache.h
index d7e719f..97fcfdc 100644
--- a/include/bcc/bcc_mccache.h
+++ b/include/bcc/bcc_mccache.h
@@ -34,9 +34,6 @@
   uint8_t magic[4];
   uint8_t version[4];
 
-  /* libbcc SHA1 checksum */
-  char libbcc_build_checksum[41];
-
   /* machine-dependent integer type size */
   uint8_t endianness;
   uint8_t sizeof_off_t;
diff --git a/lib/ExecutionEngine/CacheReader.cpp b/lib/ExecutionEngine/CacheReader.cpp
index 408b1f7..136cccd 100644
--- a/lib/ExecutionEngine/CacheReader.cpp
+++ b/lib/ExecutionEngine/CacheReader.cpp
@@ -148,14 +148,6 @@
          OBCC_VERSION, mpHeader->version);
     return false;
   }
-
-  if (memcmp(mpHeader->libbcc_build_checksum, libbcc_build_checksum, 41) != 0) {
-    mpHeader->libbcc_build_checksum[41 - 1] = '\0'; // ensure terminated
-    LOGW("Build checksum mismatch: lib %s cached %s\n", libbcc_build_checksum,
-         mpHeader->libbcc_build_checksum);
-    return false;
-  }
-
   return true;
 }
 
diff --git a/lib/ExecutionEngine/CacheWriter.cpp b/lib/ExecutionEngine/CacheWriter.cpp
index ab8dd03..86775a7 100644
--- a/lib/ExecutionEngine/CacheWriter.cpp
+++ b/lib/ExecutionEngine/CacheWriter.cpp
@@ -93,7 +93,6 @@
   // Magic word and version
   memcpy(header->magic, OBCC_MAGIC, 4);
   memcpy(header->version, OBCC_VERSION, 4);
-  memcpy(header->libbcc_build_checksum, libbcc_build_checksum, 41);
 
   // Machine Integer Type
   uint32_t number = 0x00000001;
diff --git a/lib/ExecutionEngine/Compiler.cpp b/lib/ExecutionEngine/Compiler.cpp
index 78dbb47..bccf571 100644
--- a/lib/ExecutionEngine/Compiler.cpp
+++ b/lib/ExecutionEngine/Compiler.cpp
@@ -152,9 +152,6 @@
 void Compiler::GlobalInitialization() {
   if (GlobalInitialized)
     return;
-
-  LOGI("LIBBCC BUILD CHECKSUM: %s\n", libbcc_build_checksum);
-
   // if (!llvm::llvm_is_multithreaded())
   //   llvm::llvm_start_multithreaded();
 
@@ -253,10 +250,7 @@
 
 #if USE_CACHE
   // Calculate the SHA1 checksum of libbcc and libRS.
-#if USE_LIBBCC_SHA1SUM
-  calcFileSHA1(sha1LibBCC, pathLibBCC);
-#endif
-  calcFileSHA1(sha1LibRS, pathLibRS);
+  calcFileSHA1(sha1LibBCC_SHA1, pathLibBCC_SHA1);
 #endif
 
   GlobalInitialized = true;
diff --git a/lib/ExecutionEngine/MCCacheReader.cpp b/lib/ExecutionEngine/MCCacheReader.cpp
index 2034317..ba1f7fc 100644
--- a/lib/ExecutionEngine/MCCacheReader.cpp
+++ b/lib/ExecutionEngine/MCCacheReader.cpp
@@ -148,14 +148,6 @@
          OBCC_VERSION, mpHeader->version);
     return false;
   }
-
-  if (memcmp(mpHeader->libbcc_build_checksum, libbcc_build_checksum, 41) != 0) {
-    mpHeader->libbcc_build_checksum[41 - 1] = '\0'; // ensure terminated
-    LOGW("Build checksum mismatch: lib %s cached %s\n", libbcc_build_checksum,
-         mpHeader->libbcc_build_checksum);
-    return false;
-  }
-
   return true;
 }
 
diff --git a/lib/ExecutionEngine/MCCacheWriter.cpp b/lib/ExecutionEngine/MCCacheWriter.cpp
index c2d0d04..1250ab7 100644
--- a/lib/ExecutionEngine/MCCacheWriter.cpp
+++ b/lib/ExecutionEngine/MCCacheWriter.cpp
@@ -90,7 +90,6 @@
   // Magic word and version
   memcpy(header->magic, OBCC_MAGIC, 4);
   memcpy(header->version, OBCC_VERSION, 4);
-  memcpy(header->libbcc_build_checksum, libbcc_build_checksum, 41);
 
   // Machine Integer Type
   uint32_t number = 0x00000001;
diff --git a/lib/ExecutionEngine/Script.cpp b/lib/ExecutionEngine/Script.cpp
index 67e59f6..7aa3748 100644
--- a/lib/ExecutionEngine/Script.cpp
+++ b/lib/ExecutionEngine/Script.cpp
@@ -272,11 +272,7 @@
 #endif
 
   // Dependencies
-#if USE_LIBBCC_SHA1SUM
-  reader.addDependency(BCC_FILE_RESOURCE, pathLibBCC, sha1LibBCC);
-#endif
-
-  reader.addDependency(BCC_FILE_RESOURCE, pathLibRS, sha1LibRS);
+  reader.addDependency(BCC_FILE_RESOURCE, pathLibBCC_SHA1, sha1LibBCC_SHA1);
 
   for (size_t i = 0; i < 2; ++i) {
     if (mSourceList[i]) {
@@ -410,11 +406,10 @@
       CacheWriter writer;
 #endif
 
+#ifdef TARGET_BUILD
       // Dependencies
-#if USE_LIBBCC_SHA1SUM
-      writer.addDependency(BCC_FILE_RESOURCE, pathLibBCC, sha1LibBCC);
+      writer.addDependency(BCC_FILE_RESOURCE, pathLibBCC_SHA1, sha1LibBCC_SHA1);
 #endif
-      writer.addDependency(BCC_FILE_RESOURCE, pathLibRS, sha1LibRS);
 
       for (size_t i = 0; i < 2; ++i) {
         if (mSourceList[i]) {
diff --git a/lib/ExecutionEngine/Sha1Helper.cpp b/lib/ExecutionEngine/Sha1Helper.cpp
index f4589c9..e7e7932 100644
--- a/lib/ExecutionEngine/Sha1Helper.cpp
+++ b/lib/ExecutionEngine/Sha1Helper.cpp
@@ -29,14 +29,8 @@
 
 namespace bcc {
 
-#if USE_LIBBCC_SHA1SUM
-unsigned char sha1LibBCC[20];
-char const *pathLibBCC = "/system/lib/libbcc.so";
-#endif
-
-unsigned char sha1LibRS[20];
-char const *pathLibRS = "/system/lib/libRS.so";
-
+unsigned char sha1LibBCC_SHA1[20];
+char const *pathLibBCC_SHA1 = "/system/lib/libbcc_sha1.so";
 
 void calcSHA1(unsigned char *result, char const *data, size_t size) {
   SHA1_CTX hashContext;
diff --git a/lib/ExecutionEngine/Sha1Helper.h b/lib/ExecutionEngine/Sha1Helper.h
index 5e98036..f53c0ce 100644
--- a/lib/ExecutionEngine/Sha1Helper.h
+++ b/lib/ExecutionEngine/Sha1Helper.h
@@ -22,13 +22,8 @@
 #include <stddef.h>
 
 namespace bcc {
-#if USE_LIBBCC_SHA1SUM
-  extern unsigned char sha1LibBCC[20];
-  extern char const *pathLibBCC;
-#endif
-
-  extern unsigned char sha1LibRS[20];
-  extern char const *pathLibRS;
+  extern unsigned char sha1LibBCC_SHA1[20];
+  extern char const *pathLibBCC_SHA1;
 
   void calcSHA1(unsigned char *result, char const *data, size_t size);
 
diff --git a/tools/dataconvert.py b/tools/dataconvert.py
new file mode 100755
index 0000000..9aec157
--- /dev/null
+++ b/tools/dataconvert.py
@@ -0,0 +1,87 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2011 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+
+"""Convert data files to assembly output."""
+
+import sys
+
+
+def PrintHeader(var_name):
+  """Print out header for assembly file."""
+  sys.stdout.write("""
+#ifdef __APPLE_CC__
+/*\n\
+ * The mid-2007 version of gcc that ships with Macs requires a\n\
+ * comma on the .section line, but the rest of the world thinks\n\
+ * that's a syntax error. It also wants globals to be explicitly\n\
+ * prefixed with \"_\" as opposed to modern gccs that do the\n\
+ * prefixing for you.\n\
+ */\n\
+.globl _%s\n\
+  .section .rodata,\n\
+  .align 8\n\
+_%s:\n\
+#else\n\
+.globl %s\n\
+  .section .rodata\n\
+  .align 8\n\
+%s:\n\
+#endif\n\
+""" % (var_name, var_name, var_name, var_name))
+
+
+def File2Asm(var_name):
+  """Convert file to assembly output."""
+  PrintHeader(var_name)
+
+  input_size = 0
+  col = 0
+  while True:
+    buf = sys.stdin.read(1024)
+    if len(buf) <= 0:
+      break
+    input_size += len(buf)
+    for c in buf:
+      if col == 0:
+        sys.stdout.write(".byte ")
+      sys.stdout.write("0x%02x" % ord(c))
+      col += 1
+      if col == 8:
+        sys.stdout.write("\n")
+        col = 0
+      elif col % 4 == 0:
+        sys.stdout.write(", ")
+      else:
+        sys.stdout.write(",")
+  if col != 0:
+    sys.stdout.write("\n")
+
+  # encode file size
+  PrintHeader(var_name + "_size")
+  sys.stdout.write("  .long %d\n" % input_size)
+
+
+def main(argv):
+  if len(argv) < 2:
+    print "usage: %s <name>" % argv[0]
+    return 1
+
+  File2Asm(argv[1])
+
+if __name__ == "__main__":
+  main(sys.argv)