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)