X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/2d39b0e377c0896910ee49ae70082ba665faf986..refs/heads/master:/build-symbol-table-index.py diff --git a/build-symbol-table-index.py b/build-symbol-table-index.py index fe8469f..06ef030 100755 --- a/build-symbol-table-index.py +++ b/build-symbol-table-index.py @@ -1,9 +1,33 @@ #!/usr/bin/python +# Copyright (C) 2014 Apple Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + import glob import os import subprocess import sys +from sets import Set from operator import itemgetter @@ -14,14 +38,15 @@ print("Building Index Table") if current_arch not in ("x86_64", "arm64"): sys.exit() -binary_file_directory = os.path.join(os.getenv("OBJECT_FILE_DIR_" + os.getenv("CURRENT_VARIANT")), current_arch) +bitcode_file_original_directory = os.path.join(os.getenv("TARGET_TEMP_DIR"), "Objects-" + os.getenv("CURRENT_VARIANT"), current_arch) -if not os.path.isdir(binary_file_directory): - print("Failed to build index table at " + binary_file_directory) +if not os.path.isdir(bitcode_file_original_directory): + print("Failed to build index table at " + bitcode_file_original_directory) sys.exit() framework_directory = os.path.join(os.getenv("BUILT_PRODUCTS_DIR"), os.getenv("JAVASCRIPTCORE_RESOURCES_DIR"), "Runtime", current_arch) + symbol_table_location = os.path.join(framework_directory, "Runtime.symtbl") symbol_table = {} @@ -33,23 +58,36 @@ symbol_table_modification_time = 0 if os.path.isfile(symbol_table_location): symbol_table_modification_time = os.path.getmtime(symbol_table_location) -file_suffix = "bc.gz" +file_suffix = "bc" file_suffix_length = len(file_suffix) +tested_symbols_location = "./tested-symbols.symlst" +include_symbol_table_location = os.path.join(os.getenv("SHARED_DERIVED_FILE_DIR"), "JavaScriptCore/InlineRuntimeSymbolTable.h") + +tested_symbols = Set([]) + +if os.path.isfile(tested_symbols_location): + with open(tested_symbols_location, 'r') as file: + print("Loading tested symbols") + for line in file: + tested_symbols.add(line[:-1]) + +print ("Original directory: " + bitcode_file_original_directory) + for bitcode_file in glob.iglob(os.path.join(framework_directory, "*." + file_suffix)): bitcode_basename = os.path.basename(bitcode_file) - binary_file = os.path.join(binary_file_directory, bitcode_basename[:-file_suffix_length] + "o") - if os.path.getmtime(binary_file) < symbol_table_modification_time: + bitcode_file_original = os.path.join(bitcode_file_original_directory, bitcode_basename[:-file_suffix_length] + "o") + if os.path.getmtime(bitcode_file_original) < symbol_table_modification_time: continue symbol_table_is_out_of_date = True print("Appending symbols from " + bitcode_basename) - lines = subprocess.check_output(["nm", "-U", "-j", binary_file]).splitlines() + lines = subprocess.check_output(["nm", "-U", "-j", bitcode_file]).splitlines() for symbol in lines: - if symbol[:2] == "__" and symbol[-3:] != ".eh": - symbol_table[symbol] = bitcode_basename[1:] + if symbol[:2] == "__" and symbol[-3:] != ".eh" and symbol in tested_symbols: + symbol_table[symbol[1:]] = bitcode_basename if not symbol_table_is_out_of_date: sys.exit() @@ -65,10 +103,14 @@ if os.path.isfile(symbol_table_location): symbol_list = symbol_table.items() -print("Writing symbol table") - -with open(symbol_table_location, "w") as file: - for symbol, location in symbol_list: - file.write("{} {}\n".format(symbol, location)) +print("Writing symbol table: " + symbol_table_location) +print("Writing inline file: " + include_symbol_table_location) +with open(symbol_table_location, "w") as symbol_file: + with open(include_symbol_table_location, "w") as include_file: + include_file.write("#define FOR_EACH_LIBRARY_SYMBOL(macro)") + for symbol, location in symbol_list: + symbol_file.write("{} {}\n".format(symbol, location)) + include_file.write(" \\\nmacro(\"{}\", \"{}\")".format(symbol, location)) + include_file.write("\n") print("Done")