]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - build-symbol-table-index.py
JavaScriptCore-7600.1.4.9.tar.gz
[apple/javascriptcore.git] / build-symbol-table-index.py
diff --git a/build-symbol-table-index.py b/build-symbol-table-index.py
new file mode 100755 (executable)
index 0000000..fe8469f
--- /dev/null
@@ -0,0 +1,74 @@
+#!/usr/bin/python
+
+import glob
+import os
+import subprocess
+import sys
+from operator import itemgetter
+
+
+current_arch = sys.argv[1]
+
+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)
+
+if not os.path.isdir(binary_file_directory):
+    print("Failed to build index table at " + binary_file_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 = {}
+
+symbol_table_is_out_of_date = False
+
+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_length = len(file_suffix)
+
+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:
+        continue
+
+    symbol_table_is_out_of_date = True
+
+    print("Appending symbols from " + bitcode_basename)
+    lines = subprocess.check_output(["nm", "-U", "-j", binary_file]).splitlines()
+
+    for symbol in lines:
+        if symbol[:2] == "__" and symbol[-3:] != ".eh":
+            symbol_table[symbol] = bitcode_basename[1:]
+
+if not symbol_table_is_out_of_date:
+    sys.exit()
+
+if os.path.isfile(symbol_table_location):
+    with open(symbol_table_location, 'r') as file:
+        print("Loading symbol table")
+        for line in file:
+            symbol, _, location = line[:-1].partition(" ")
+            # don't overwrite new symbols with old locations
+            if not symbol in symbol_table:
+                symbol_table[symbol] = 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("Done")