Use 20-byte libbcc.so.sha1 to store checksum

Change-Id: I1e66e559918426e995b92785666beb7b6a49869d
diff --git a/Android.mk b/Android.mk
index 8b2f11a..ba1ea82 100644
--- a/Android.mk
+++ b/Android.mk
@@ -86,27 +86,19 @@
 # Calculate SHA1 checksum for libbcc.so and libRS.so
 # ========================================================
 include $(CLEAR_VARS)
-LOCAL_MODULE := libbcc_sha1
+LOCAL_MODULE := libbcc.so.sha1
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := SHARED_LIBRARIES
 
-CONVERT_ASM := frameworks/compile/libbcc/tools/dataconvert.py
-
-intermediates := $(local-intermediates-dir)
-libbcc_CHECKSUM_FILE := $(intermediates)/checksum.S
-LOCAL_GENERATED_SOURCES += $(libbcc_CHECKSUM_FILE)
-
+include $(BUILD_SYSTEM)/base_rules.mk
 libbcc_SHA1_SRCS := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/libbcc.so \
     $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/libRS.so
 
-$(libbcc_CHECKSUM_FILE): PRIVATE_SHA1_SRCS := $(libbcc_SHA1_SRCS)
-$(libbcc_CHECKSUM_FILE) : $(libbcc_SHA1_SRCS) \
-                          $(HOST_OUT_EXECUTABLES)/sha1sum
+$(LOCAL_BUILT_MODULE): PRIVATE_SHA1_SRCS := $(libbcc_SHA1_SRCS)
+$(LOCAL_BUILT_MODULE) : $(libbcc_SHA1_SRCS) \
+                       $(HOST_OUT_EXECUTABLES)/sha1sum
 	$(hide) mkdir -p $(dir $@) && \
-            cat $(PRIVATE_SHA1_SRCS) | $(HOST_OUT_EXECUTABLES)/sha1sum | \
-            python $(CONVERT_ASM) libbcc_checksum > $@
-
-include $(BUILD_SHARED_LIBRARY)
+          cat $(PRIVATE_SHA1_SRCS) | $(HOST_OUT_EXECUTABLES)/sha1sum -B $@
 
 #
 # Shared library for target
@@ -246,8 +238,8 @@
     $(LOCAL_STATIC_LIBRARIES)
 endif
 
-# This makes libclcore.bc get installed if and only if the target libbcc.so is installed.
-LOCAL_REQUIRED_MODULES := libclcore.bc libbcc_sha1
+# Modules that need get installed if and only if the target libbcc.so is installed.
+LOCAL_REQUIRED_MODULES := libclcore.bc libbcc.so.sha1
 
 # -Wl,--exclude-libs=ALL would hide most of the symbols in the shared library
 # and reduces the size of libbcc.so by about 800k.
diff --git a/CleanSpec.mk b/CleanSpec.mk
index adf2982..d2a917e 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -47,6 +47,8 @@
 $(call add-clean-step, rm -rf $(HOST_OUT)/obj/SHARED_LIBRARIES/libbcc_intermediates)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/libruntime.bc)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libclcore.bc_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libbcc_sha1_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/libbcc_sha1.so)
 
 
 # ************************************************
diff --git a/helper/sha1.c b/helper/sha1.c
index 4141c55..e7d9f81 100644
--- a/helper/sha1.c
+++ b/helper/sha1.c
@@ -434,12 +434,7 @@
     char ext[MAXEXT];
 #endif
     unsigned char err;
-
-    // Read from STDIN
-    sha1file(NULL, digest);
-    for (j = 0; j < HASHSIZE; j++)
-        printf("%02x", digest[j]);
-    return 0;
+    const char *binary_output_file = 0;
 
     for (i = 1; i < argc; i++)
     {
@@ -447,6 +442,10 @@
         {
             switch (argv[i][1])
             {
+                case 'B':
+                    ++i;
+                    binary_output_file = argv[i];
+                    break;
                 case 'c':
                 case 'C':
                     check = 1;
@@ -461,6 +460,22 @@
         }
     }
 
+    // Read from STDIN
+    sha1file(NULL, digest);
+    if (binary_output_file) {
+      FILE *fout = fopen(binary_output_file, "wb");
+      if (!fout) {
+        fprintf(stderr, "Error: Can not write to %s.\n", binary_output_file);
+        return 1;
+      }
+      fwrite(digest, 1, HASHSIZE, fout);
+      fclose(fout);
+      return 0;
+    }
+    for (j = 0; j < HASHSIZE; j++)
+        printf("%02x", digest[j]);
+    return 0;
+
     for (i=1; i<argc; i++)
     {
         if (argv[i][0] != '-')
diff --git a/lib/ExecutionEngine/Compiler.cpp b/lib/ExecutionEngine/Compiler.cpp
index 9d13039..b849505 100644
--- a/lib/ExecutionEngine/Compiler.cpp
+++ b/lib/ExecutionEngine/Compiler.cpp
@@ -246,8 +246,8 @@
      llvm::createLinearScanRegisterAllocator);
 
 #if USE_CACHE
-  // Calculate the SHA1 checksum of libbcc and libRS.
-  calcFileSHA1(sha1LibBCC_SHA1, pathLibBCC_SHA1);
+  // Read in SHA1 checksum of libbcc and libRS.
+  readSHA1(sha1LibBCC_SHA1, sizeof(sha1LibBCC_SHA1), pathLibBCC_SHA1);
 #endif
 
   GlobalInitialized = true;
diff --git a/lib/ExecutionEngine/Sha1Helper.cpp b/lib/ExecutionEngine/Sha1Helper.cpp
index e7e7932..4e9ee07 100644
--- a/lib/ExecutionEngine/Sha1Helper.cpp
+++ b/lib/ExecutionEngine/Sha1Helper.cpp
@@ -30,7 +30,7 @@
 namespace bcc {
 
 unsigned char sha1LibBCC_SHA1[20];
-char const *pathLibBCC_SHA1 = "/system/lib/libbcc_sha1.so";
+char const *pathLibBCC_SHA1 = "/system/lib/libbcc.so.sha1";
 
 void calcSHA1(unsigned char *result, char const *data, size_t size) {
   SHA1_CTX hashContext;
@@ -81,4 +81,14 @@
   SHA1Final(result, &hashContext);
 }
 
+void readSHA1(unsigned char *result, int result_size, char const *filename) {
+  FileHandle file;
+  if (file.open(filename, OpenMode::Read) < 0) {
+    LOGE("Unable to read binary sha1 file %s\n", filename);
+    memset(result, '\0', result_size);
+    return;
+  }
+  file.read((char *)result, result_size);
+}
+
 } // namespace bcc
diff --git a/lib/ExecutionEngine/Sha1Helper.h b/lib/ExecutionEngine/Sha1Helper.h
index f53c0ce..08e0cda 100644
--- a/lib/ExecutionEngine/Sha1Helper.h
+++ b/lib/ExecutionEngine/Sha1Helper.h
@@ -28,6 +28,9 @@
   void calcSHA1(unsigned char *result, char const *data, size_t size);
 
   void calcFileSHA1(unsigned char *result, char const *filename);
+
+  // Read binary representation of sha1 from filename.
+  void readSHA1(unsigned char *result, int resultsize, char const *filename);
 }
 
 #endif // BCC_SHA1HELPER_H