CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
272 lines
5.5 KiB
Python
272 lines
5.5 KiB
Python
# ===----------------------------------------------------------------------===##
|
|
#
|
|
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
# See https://llvm.org/LICENSE.txt for license information.
|
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
#
|
|
# ===----------------------------------------------------------------------===##
|
|
|
|
import ast
|
|
import distutils.spawn
|
|
import re
|
|
import sys
|
|
from pprint import pformat
|
|
|
|
import libcudacxx.util
|
|
|
|
|
|
def read_syms_from_list(slist):
|
|
"""
|
|
Read a list of symbols from a list of strings.
|
|
Each string is one symbol.
|
|
"""
|
|
return [ast.literal_eval(s) for s in slist]
|
|
|
|
|
|
def read_syms_from_file(filename):
|
|
"""
|
|
Read a list of symbols in from a file.
|
|
"""
|
|
with open(filename, "r") as f:
|
|
data = f.read()
|
|
return read_syms_from_list(data.splitlines())
|
|
|
|
|
|
def read_blacklist(filename):
|
|
with open(filename, "r") as f:
|
|
data = f.read()
|
|
lines = [line.strip() for line in data.splitlines() if line.strip()]
|
|
lines = [line for line in lines if not line.startswith("#")]
|
|
return lines
|
|
|
|
|
|
def write_syms(sym_list, out=None, names_only=False, filter=None):
|
|
"""
|
|
Write a list of symbols to the file named by out.
|
|
"""
|
|
out_str = ""
|
|
out_list = sym_list
|
|
out_list.sort(key=lambda x: x["name"])
|
|
if filter is not None:
|
|
out_list = filter(out_list)
|
|
if names_only:
|
|
out_list = [sym["name"] for sym in out_list]
|
|
for sym in out_list:
|
|
# Use pformat for consistent ordering of keys.
|
|
out_str += pformat(sym, width=100000) + "\n"
|
|
if out is None:
|
|
sys.stdout.write(out_str)
|
|
else:
|
|
with open(out, "w") as f:
|
|
f.write(out_str)
|
|
|
|
|
|
_cppfilt_exe = distutils.spawn.find_executable("c++filt")
|
|
|
|
|
|
def demangle_symbol(symbol):
|
|
if _cppfilt_exe is None:
|
|
return symbol
|
|
out, _, exit_code = libcudacxx.util.executeCommandVerbose(
|
|
[_cppfilt_exe], input=symbol
|
|
)
|
|
if exit_code != 0:
|
|
return symbol
|
|
return out
|
|
|
|
|
|
def is_elf(filename):
|
|
with open(filename, "rb") as f:
|
|
magic_bytes = f.read(4)
|
|
return magic_bytes == b"\x7fELF"
|
|
|
|
|
|
def is_mach_o(filename):
|
|
with open(filename, "rb") as f:
|
|
magic_bytes = f.read(4)
|
|
return magic_bytes in [
|
|
"\xfe\xed\xfa\xce", # MH_MAGIC
|
|
"\xce\xfa\xed\xfe", # MH_CIGAM
|
|
"\xfe\xed\xfa\xcf", # MH_MAGIC_64
|
|
"\xcf\xfa\xed\xfe", # MH_CIGAM_64
|
|
"\xca\xfe\xba\xbe", # FAT_MAGIC
|
|
"\xbe\xba\xfe\xca", # FAT_CIGAM
|
|
]
|
|
|
|
|
|
def is_library_file(filename):
|
|
if sys.platform == "darwin":
|
|
return is_mach_o(filename)
|
|
else:
|
|
return is_elf(filename)
|
|
|
|
|
|
def extract_or_load(filename):
|
|
import libcudacxx.sym_check.extract
|
|
|
|
if is_library_file(filename):
|
|
return libcudacxx.sym_check.extract.extract_symbols(filename)
|
|
return read_syms_from_file(filename)
|
|
|
|
|
|
def adjust_mangled_name(name):
|
|
if not name.startswith("__Z"):
|
|
return name
|
|
return name[1:]
|
|
|
|
|
|
new_delete_std_symbols = ["_Znam", "_Znwm", "_ZdaPv", "_ZdaPvm", "_ZdlPv", "_ZdlPvm"]
|
|
|
|
cxxabi_symbols = [
|
|
"___dynamic_cast",
|
|
"___gxx_personality_v0",
|
|
"_ZTIDi",
|
|
"_ZTIDn",
|
|
"_ZTIDs",
|
|
"_ZTIPDi",
|
|
"_ZTIPDn",
|
|
"_ZTIPDs",
|
|
"_ZTIPKDi",
|
|
"_ZTIPKDn",
|
|
"_ZTIPKDs",
|
|
"_ZTIPKa",
|
|
"_ZTIPKb",
|
|
"_ZTIPKc",
|
|
"_ZTIPKd",
|
|
"_ZTIPKe",
|
|
"_ZTIPKf",
|
|
"_ZTIPKh",
|
|
"_ZTIPKi",
|
|
"_ZTIPKj",
|
|
"_ZTIPKl",
|
|
"_ZTIPKm",
|
|
"_ZTIPKs",
|
|
"_ZTIPKt",
|
|
"_ZTIPKv",
|
|
"_ZTIPKw",
|
|
"_ZTIPKx",
|
|
"_ZTIPKy",
|
|
"_ZTIPa",
|
|
"_ZTIPb",
|
|
"_ZTIPc",
|
|
"_ZTIPd",
|
|
"_ZTIPe",
|
|
"_ZTIPf",
|
|
"_ZTIPh",
|
|
"_ZTIPi",
|
|
"_ZTIPj",
|
|
"_ZTIPl",
|
|
"_ZTIPm",
|
|
"_ZTIPs",
|
|
"_ZTIPt",
|
|
"_ZTIPv",
|
|
"_ZTIPw",
|
|
"_ZTIPx",
|
|
"_ZTIPy",
|
|
"_ZTIa",
|
|
"_ZTIb",
|
|
"_ZTIc",
|
|
"_ZTId",
|
|
"_ZTIe",
|
|
"_ZTIf",
|
|
"_ZTIh",
|
|
"_ZTIi",
|
|
"_ZTIj",
|
|
"_ZTIl",
|
|
"_ZTIm",
|
|
"_ZTIs",
|
|
"_ZTIt",
|
|
"_ZTIv",
|
|
"_ZTIw",
|
|
"_ZTIx",
|
|
"_ZTIy",
|
|
"_ZTSDi",
|
|
"_ZTSDn",
|
|
"_ZTSDs",
|
|
"_ZTSPDi",
|
|
"_ZTSPDn",
|
|
"_ZTSPDs",
|
|
"_ZTSPKDi",
|
|
"_ZTSPKDn",
|
|
"_ZTSPKDs",
|
|
"_ZTSPKa",
|
|
"_ZTSPKb",
|
|
"_ZTSPKc",
|
|
"_ZTSPKd",
|
|
"_ZTSPKe",
|
|
"_ZTSPKf",
|
|
"_ZTSPKh",
|
|
"_ZTSPKi",
|
|
"_ZTSPKj",
|
|
"_ZTSPKl",
|
|
"_ZTSPKm",
|
|
"_ZTSPKs",
|
|
"_ZTSPKt",
|
|
"_ZTSPKv",
|
|
"_ZTSPKw",
|
|
"_ZTSPKx",
|
|
"_ZTSPKy",
|
|
"_ZTSPa",
|
|
"_ZTSPb",
|
|
"_ZTSPc",
|
|
"_ZTSPd",
|
|
"_ZTSPe",
|
|
"_ZTSPf",
|
|
"_ZTSPh",
|
|
"_ZTSPi",
|
|
"_ZTSPj",
|
|
"_ZTSPl",
|
|
"_ZTSPm",
|
|
"_ZTSPs",
|
|
"_ZTSPt",
|
|
"_ZTSPv",
|
|
"_ZTSPw",
|
|
"_ZTSPx",
|
|
"_ZTSPy",
|
|
"_ZTSa",
|
|
"_ZTSb",
|
|
"_ZTSc",
|
|
"_ZTSd",
|
|
"_ZTSe",
|
|
"_ZTSf",
|
|
"_ZTSh",
|
|
"_ZTSi",
|
|
"_ZTSj",
|
|
"_ZTSl",
|
|
"_ZTSm",
|
|
"_ZTSs",
|
|
"_ZTSt",
|
|
"_ZTSv",
|
|
"_ZTSw",
|
|
"_ZTSx",
|
|
"_ZTSy",
|
|
]
|
|
|
|
|
|
def is_stdlib_symbol_name(name, sym):
|
|
name = adjust_mangled_name(name)
|
|
if re.search("@GLIBC|@GCC", name):
|
|
# Only when symbol is defined do we consider it ours
|
|
return sym["is_defined"]
|
|
if re.search("(St[0-9])|(__cxa)|(__cxxabi)", name):
|
|
return True
|
|
if name in new_delete_std_symbols:
|
|
return True
|
|
if name in cxxabi_symbols:
|
|
return True
|
|
if name.startswith("_Z"):
|
|
return True
|
|
return False
|
|
|
|
|
|
def filter_stdlib_symbols(syms):
|
|
stdlib_symbols = []
|
|
other_symbols = []
|
|
for s in syms:
|
|
canon_name = adjust_mangled_name(s["name"])
|
|
if not is_stdlib_symbol_name(canon_name, s):
|
|
other_symbols += [s]
|
|
else:
|
|
stdlib_symbols += [s]
|
|
return stdlib_symbols, other_symbols
|