Use SHA1 to verify libbcc is consistent with cache

Modify Android.mk to build a host version of sha1sum.
Modify bcc and MCCacheReader/Writer to check for sha1 on runtime.

Change-Id: I0aa32e2efd85e21f67cd46a20a9e55a430c41f30
diff --git a/Android.mk b/Android.mk
index 07f4498..9aad1ce 100644
--- a/Android.mk
+++ b/Android.mk
@@ -70,6 +70,19 @@
   helper/sha1.c
 endif
 
+FULL_PATH_libbcc_SRC_FILES := \
+  $(addprefix $(LOCAL_PATH)/, $(libbcc_SRC_FILES)) \
+  $(sort $(shell find $(LOCAL_PATH) -name "*.h"))
+
+# Build Host SHA1 Command Line
+# ========================================================
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := helper/sha1.c
+LOCAL_MODULE := sha1sum
+LOCAL_MODULE_TAGS := optional
+LOCAL_CFLAGS += -DCMDLINE
+include $(BUILD_HOST_EXECUTABLE)
+
 #
 # Shared library for target
 # ========================================================
@@ -77,10 +90,22 @@
 
 LOCAL_MODULE := libbcc
 LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
 LOCAL_CFLAGS += $(local_cflags_for_libbcc)
 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
+	@echo -n "char const libbcc_build_checksum[41] = \"" > $@
+	@cat $(FULL_PATH_libbcc_SRC_FILES) | $(HOST_OUT_EXECUTABLES)/sha1sum >> $@
+	@echo "\";" >> $@
+
 ifeq ($(TARGET_ARCH),arm)
   LOCAL_SRC_FILES += \
     runtime/lib/arm/adddf3vfp.S \
@@ -223,11 +248,24 @@
 
 LOCAL_MODULE := libbcc
 LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_IS_HOST_MODULE := true
 LOCAL_CFLAGS += $(local_cflags_for_libbcc)
 LOCAL_SRC_FILES := \
   $(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
+	@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 17554a3..aaccbbd 100644
--- a/Config.h
+++ b/Config.h
@@ -21,7 +21,7 @@
 
 #define USE_DISASSEMBLER_FILE 0
 
-#define USE_LIBBCC_SHA1SUM 1
+#define USE_LIBBCC_SHA1SUM 0
 
 #define USE_LOGGER 1
 
diff --git a/helper/sha1.c b/helper/sha1.c
index cef9f77..4141c55 100644
--- a/helper/sha1.c
+++ b/helper/sha1.c
@@ -80,9 +80,9 @@
 #define SHA1HANDSOFF    /*Copies data before messing with it.*/
 
 /*#define CMDLINE        * include main() and file processing */
-#ifdef CMDLINE
-# undef CMDLINE         /* Never include main() for libbcc */
-#endif
+//#ifdef CMDLINE
+//# undef CMDLINE         /* Never include main() for libbcc */
+//#endif
 
 #include "sha1.h"
 
@@ -435,6 +435,12 @@
 #endif
     unsigned char err;
 
+    // Read from STDIN
+    sha1file(NULL, digest);
+    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/include/bcc/bcc.h b/include/bcc/bcc.h
index 0d56e68..7f174d2 100644
--- a/include/bcc/bcc.h
+++ b/include/bcc/bcc.h
@@ -20,6 +20,8 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include "bcc/bcc_checksum.h"
+
 /*-------------------------------------------------------------------------*/
 
 /* libbcc script opaque type */
@@ -150,14 +152,6 @@
 };
 #endif
 
-
-/*-------------------------------------------------------------------------*/
-
-
-/* libbcc library build time */
-extern char const libbcc_build_time[24];
-
-
 /*-------------------------------------------------------------------------*/
 
 #endif
diff --git a/include/bcc/bcc_cache.h b/include/bcc/bcc_cache.h
index 38c197d..04a5d2b 100644
--- a/include/bcc/bcc_cache.h
+++ b/include/bcc/bcc_cache.h
@@ -32,8 +32,8 @@
   uint8_t magic[4];
   uint8_t version[4];
 
-  /* libbcc build time */
-  char libbcc_build_time[24];
+  /* libbcc SHA1 checksum */
+  char libbcc_build_checksum[41];
 
   /* machine-dependent integer type size */
   uint8_t endianness;
diff --git a/include/bcc/bcc_checksum.h b/include/bcc/bcc_checksum.h
new file mode 100644
index 0000000..bd62d1e
--- /dev/null
+++ b/include/bcc/bcc_checksum.h
@@ -0,0 +1,8 @@
+#ifndef ANDROID_BCC_BCC_CHECKSUM_H
+#define ANDROID_BCC_BCC_CHECKSUM_H
+
+/* libbcc library build time */
+extern char const libbcc_build_checksum[41];
+
+#endif
+
diff --git a/include/bcc/bcc_mccache.h b/include/bcc/bcc_mccache.h
index e519555..d7e719f 100644
--- a/include/bcc/bcc_mccache.h
+++ b/include/bcc/bcc_mccache.h
@@ -34,8 +34,8 @@
   uint8_t magic[4];
   uint8_t version[4];
 
-  /* libbcc build time */
-  char libbcc_build_time[24];
+  /* libbcc SHA1 checksum */
+  char libbcc_build_checksum[41];
 
   /* machine-dependent integer type size */
   uint8_t endianness;
diff --git a/lib/ExecutionEngine/CacheReader.cpp b/lib/ExecutionEngine/CacheReader.cpp
index f748452..408b1f7 100644
--- a/lib/ExecutionEngine/CacheReader.cpp
+++ b/lib/ExecutionEngine/CacheReader.cpp
@@ -149,10 +149,10 @@
     return false;
   }
 
-  if (memcmp(mpHeader->libbcc_build_time, libbcc_build_time, 24) != 0) {
-    mpHeader->libbcc_build_time[24 - 1] = '\0'; // ensure terminated
-    LOGW("Build time mismatch: lib %s cached %s\n", libbcc_build_time,
-         mpHeader->libbcc_build_time);
+  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;
   }
 
diff --git a/lib/ExecutionEngine/CacheWriter.cpp b/lib/ExecutionEngine/CacheWriter.cpp
index 67def9b..ab8dd03 100644
--- a/lib/ExecutionEngine/CacheWriter.cpp
+++ b/lib/ExecutionEngine/CacheWriter.cpp
@@ -93,7 +93,7 @@
   // Magic word and version
   memcpy(header->magic, OBCC_MAGIC, 4);
   memcpy(header->version, OBCC_VERSION, 4);
-  memcpy(header->libbcc_build_time, libbcc_build_time, 24);
+  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 6f54dbc..4595d41 100644
--- a/lib/ExecutionEngine/Compiler.cpp
+++ b/lib/ExecutionEngine/Compiler.cpp
@@ -153,7 +153,7 @@
   if (GlobalInitialized)
     return;
 
-  LOGI("LIBBCC BUILD: %s\n", libbcc_build_time);
+  LOGI("LIBBCC BUILD CHECKSUM: %s\n", libbcc_build_checksum);
 
   // if (!llvm::llvm_is_multithreaded())
   //   llvm::llvm_start_multithreaded();
diff --git a/lib/ExecutionEngine/MCCacheReader.cpp b/lib/ExecutionEngine/MCCacheReader.cpp
index 35a006a..aac7be7 100644
--- a/lib/ExecutionEngine/MCCacheReader.cpp
+++ b/lib/ExecutionEngine/MCCacheReader.cpp
@@ -151,10 +151,10 @@
     return false;
   }
 
-  if (memcmp(mpHeader->libbcc_build_time, libbcc_build_time, 24) != 0) {
-    mpHeader->libbcc_build_time[24 - 1] = '\0'; // ensure terminated
-    LOGW("Build time mismatch: lib %s cached %s\n", libbcc_build_time,
-         mpHeader->libbcc_build_time);
+  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;
   }
 
diff --git a/lib/ExecutionEngine/MCCacheWriter.cpp b/lib/ExecutionEngine/MCCacheWriter.cpp
index dc42cf0..499a82b 100644
--- a/lib/ExecutionEngine/MCCacheWriter.cpp
+++ b/lib/ExecutionEngine/MCCacheWriter.cpp
@@ -92,7 +92,7 @@
   // Magic word and version
   memcpy(header->magic, OBCC_MAGIC, 4);
   memcpy(header->version, OBCC_VERSION, 4);
-  memcpy(header->libbcc_build_time, libbcc_build_time, 24);
+  memcpy(header->libbcc_build_checksum, libbcc_build_checksum, 41);
 
   // Machine Integer Type
   uint32_t number = 0x00000001;
diff --git a/lib/ExecutionEngine/ScriptCached.h b/lib/ExecutionEngine/ScriptCached.h
index 147c935..39cf663 100644
--- a/lib/ExecutionEngine/ScriptCached.h
+++ b/lib/ExecutionEngine/ScriptCached.h
@@ -17,6 +17,8 @@
 #ifndef BCC_SCRIPTCACHED_H
 #define BCC_SCRIPTCACHED_H
 
+#include "Config.h"
+
 #include <bcc/bcc.h>
 #include <bcc/bcc_cache.h>
 #include <bcc/bcc_mccache.h>
diff --git a/lib/ExecutionEngine/bcc.cpp b/lib/ExecutionEngine/bcc.cpp
index 30415d8..f0501cf 100644
--- a/lib/ExecutionEngine/bcc.cpp
+++ b/lib/ExecutionEngine/bcc.cpp
@@ -30,14 +30,10 @@
 
 using namespace bcc;
 
-char const libbcc_build_time[24] = __DATE__ " " __TIME__;
-
-
 namespace llvm {
   class Module;
 }
 
-
 extern "C" BCCScriptRef bccCreateScript() {
   BCC_FUNC_LOGGER();
   return wrap(new bcc::Script());