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/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());