enable asan in remaining rocm packages (#45192)

* initial commit to enable asan in remaining rocm packages
* remove os import
* add rocm-opencl rocm-dbgapi rocm-debug-agent
* add libclang path to LD_LIBRARY_PATH
* enable asan for rocfft
* add f-string and add +asan dependencies for hip and rocm-opencl
* add conflicts for centos7/8 and rhel 9
This commit is contained in:
afzpatel 2024-08-14 11:46:04 -04:00 committed by GitHub
parent 29b50527a6
commit e01151a200
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 261 additions and 1 deletions

View File

@ -46,8 +46,14 @@ class Hip(CMakePackage):
variant("rocm", default=True, description="Enable ROCm support")
variant("cuda", default=False, description="Build with CUDA")
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+cuda +rocm", msg="CUDA and ROCm support are mutually exclusive")
conflicts("~cuda ~rocm", msg="CUDA or ROCm support is required")
conflicts("~rocm +asan", msg="ROCm must be enabled for asan")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
depends_on("cuda", when="+cuda")
@ -60,6 +66,8 @@ class Hip(CMakePackage):
with when("+rocm"):
depends_on("gl@4.5:")
depends_on("py-cppheaderparser", type="build", when="@5.3.3:")
depends_on("libx11", when="+asan")
depends_on("xproto", when="+asan")
for ver in [
"5.3.0",
"5.3.3",
@ -532,6 +540,24 @@ def cmake_args(self):
args.append(self.define("HIP_PLATFORM", "amd"))
if self.spec.satisfies("@5.6.0:"):
args.append(self.define("HIP_LLVM_ROOT", self.spec["llvm-amdgpu"].prefix))
if self.spec.satisfies("@6.1.0:") and self.spec.satisfies("+asan"):
args.append(self.define("ADDRESS_SANITIZER", "ON"))
args.append(
self.define("CMAKE_C_COMPILER", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
)
args.append(
self.define(
"CMAKE_CXX_COMPILER", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++"
)
)
args.append(
self.define(
"CMAKE_CXX_FLAGS",
f"-I{self.spec['libx11'].prefix.include} "
f"-I{self.spec['mesa'].prefix.include} "
f"-I{self.spec['xproto'].prefix.include}",
)
)
if self.spec.satisfies("+cuda"):
args.append(self.define("HIP_PLATFORM", "nvidia"))

View File

@ -275,3 +275,11 @@ def setup_run_environment(self, env):
def setup_dependent_run_environment(self, env, dependent_spec):
llvm_amdgpu_home = self.spec["llvm-amdgpu"].prefix
env.prepend_path("LD_LIBRARY_PATH", llvm_amdgpu_home + "/llvm/lib")
# Required for enabling asan on dependent packages
def setup_dependent_build_environment(self, env, dependent_spec):
for root, _, files in os.walk(self.spec["llvm-amdgpu"].prefix):
if "libclang_rt.asan-x86_64.so" in files:
asan_lib_path = root
env.prepend_path("LD_LIBRARY_PATH", asan_lib_path)
env.prune_duplicate_paths("LD_LIBRARY_PATH")

View File

@ -37,6 +37,12 @@ class Migraphx(CMakePackage):
version("5.3.3", sha256="91d91902bbedd5e1951a231e8e5c9a328360b128c731912ed17c8059df38e02a")
version("5.3.0", sha256="d0b7283f42e03fb38b612868b8c94f46f27a6e0b019ae95fde5b9086582a1c69")
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
depends_on("c", type="build") # generated
depends_on("cxx", type="build") # generated
@ -117,6 +123,15 @@ def determine_version(cls, lib):
ver = None
return ver
def setup_build_environment(self, env):
if self.spec.satisfies("+asan"):
env.set("CC", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
env.set("CXX", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
def cmake_args(self):
spec = self.spec
abspath = spec["abseil-cpp"].prefix.include
@ -134,6 +149,12 @@ def cmake_args(self):
args.append(
self.define("GPU_TARGETS", "gfx906;gfx908;gfx90a;gfx1030;gfx1100;gfx1101;gfx1102")
)
if self.spec.satisfies("@6.1:") and self.spec.satisfies("+asan"):
args.append(
self.define(
"CMAKE_CXX_FLAGS", "-fsanitize=address -shared-libasan -I{0}".format(abspath)
)
)
return args
def test_unit_tests(self):

View File

@ -38,6 +38,12 @@ class MiopenHip(CMakePackage):
version("5.3.3", sha256="7efc98215d23a2caaf212378c37e9a6484f54a4ed3e9660719286e4f287d3715")
version("5.3.0", sha256="c5819f593d71beeda2eb24b89182912240cc40f83b2b8f9de695a8e230aa4ea6")
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
depends_on("cxx", type="build") # generated
depends_on("cmake@3.5:", type="build")
@ -112,6 +118,13 @@ class MiopenHip(CMakePackage):
def setup_build_environment(self, env):
lib_dir = self.spec["zlib-api"].libs.directories[0]
env.prepend_path("LIBRARY_PATH", lib_dir)
if self.spec.satisfies("+asan"):
env.set("CC", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
env.set("CXX", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
if self.spec.satisfies("%gcc@8.0:8.9") and self.spec.satisfies("@6.1:"):
env.append_flags("LDFLAGS", "-lstdc++fs")

View File

@ -53,6 +53,11 @@ def url_for_version(self, version):
variant("opencl", default=False, description="Use OPENCL as the backend")
variant("hip", default=True, description="Use HIP as backend")
variant("add_tests", default=False, description="add tests and samples folder")
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
patch("0001-add-half-include-path.patch", when="@5.5")
patch("0001-add-half-include-path-5.6.patch", when="@5.6:")
@ -288,6 +293,15 @@ def setup_run_environment(self, env):
if self.spec.satisfies("@6.1:"):
env.prepend_path("LD_LIBRARY_PATH", self.spec["hsa-rocr-dev"].prefix.lib)
def setup_build_environment(self, env):
if self.spec.satisfies("+asan"):
env.set("CC", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
env.set("CXX", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
def flag_handler(self, name, flags):
spec = self.spec
protobuf = spec["protobuf"].prefix.include

View File

@ -54,6 +54,11 @@ class Rocalution(CMakePackage):
values=auto_or_any_combination_of(*amdgpu_targets),
sticky=True,
)
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
depends_on("cmake@3.5:", type="build")
@ -91,6 +96,13 @@ class Rocalution(CMakePackage):
def setup_build_environment(self, env):
env.set("CXX", self.spec["hip"].hipcc)
if self.spec.satisfies("+asan"):
env.set("CC", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
env.set("CXX", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
def patch(self):
with working_dir("src/base/hip"):

View File

@ -53,6 +53,11 @@ class Rocblas(CMakePackage):
sticky=True,
)
variant("tensile", default=True, description="Use Tensile as a backend")
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
# https://reviews.llvm.org/D124866
# https://github.com/ROCm/HIP/issues/2678
@ -144,6 +149,13 @@ class Rocblas(CMakePackage):
def setup_build_environment(self, env):
env.set("CXX", self.spec["hip"].hipcc)
if self.spec.satisfies("+asan"):
env.set("CC", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
env.set("CXX", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
@classmethod
def determine_version(cls, lib):

View File

@ -53,6 +53,11 @@ class Rocfft(CMakePackage):
values=auto_or_any_combination_of(*amdgpu_targets),
sticky=True,
)
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
depends_on("cmake@3.16:", type="build")
depends_on("python@3.6:", type="build")
@ -104,6 +109,13 @@ class Rocfft(CMakePackage):
def setup_build_environment(self, env):
env.set("CXX", self.spec["hip"].hipcc)
if self.spec.satisfies("+asan"):
env.set("CC", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
env.set("CXX", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
if self.spec.satisfies("%gcc@8.0:8.9") and self.spec.satisfies("@6.1:"):
env.append_flags("LDFLAGS", "-lstdc++fs")

View File

@ -32,8 +32,26 @@ class RocmCore(CMakePackage):
version("5.5.1", sha256="bc73060432ffdc2e210394835d383890b9652476074ef4708d447473f273ce76")
version("5.5.0", sha256="684d3312bb14f05dc280cf136f5eddff38ba340cd85c383d6a217d8e27d3d57d")
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
depends_on("cxx", type="build") # generated
for ver in ["6.1.0", "6.1.1", "6.1.2"]:
depends_on("llvm-amdgpu", when=f"@{ver}+asan")
def setup_build_environment(self, env):
if self.spec.satisfies("+asan"):
env.set("CC", self.spec["llvm-amdgpu"].prefix + "/bin/clang")
env.set("CXX", self.spec["llvm-amdgpu"].prefix + "/bin/clang++")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
def cmake_args(self):
args = [self.define("ROCM_VERSION", self.spec.version)]
return args

View File

@ -42,8 +42,13 @@ class RocmDbgapi(CMakePackage):
version("5.3.3", sha256="3c81cb23fe671d391557a63c13b6a13d4dc367db5cb5de55592a6758284d8a3f")
version("5.3.0", sha256="afffec78e34fe70952cd41efc3d7ba8f64e43acb2ad20aa35c9b8b591bed48ca")
depends_on("cxx", type="build") # generated
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
depends_on("cxx", type="build") # generated
depends_on("cmake@3:", type="build")
depends_on("hwdata", when="@5.5.0:")
@ -99,6 +104,15 @@ def patch(self):
"CMakeLists.txt",
)
def setup_build_environment(self, env):
if self.spec.satisfies("+asan"):
env.set("CC", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
env.set("CXX", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
def cmake_args(self):
args = []
if self.spec.satisfies("@5.3.0:"):

View File

@ -35,6 +35,12 @@ class RocmDebugAgent(CMakePackage):
version("5.3.3", sha256="7170312d08e91334ee03586aa1f23d67f33d9ec0df25a5556cbfa3f210b15b06")
version("5.3.0", sha256="8dfb6aa442ce136207c0c089321c8099042395977b4a488e4ca219661df0cd78")
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
depends_on("cxx", type="build") # generated
depends_on("cmake@3:", type="build")
@ -89,6 +95,15 @@ def determine_version(cls, lib):
)
return None
def setup_build_environment(self, env):
if self.spec.satisfies("+asan"):
env.set("CC", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
env.set("CXX", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
def cmake_args(self):
spec = self.spec
args = [self.define("CMAKE_MODULE_PATH", spec["hip"].prefix.lib.cmake.hip)]

View File

@ -53,12 +53,20 @@ def url_for_version(self, version):
version("5.3.3", sha256="cab394e6ef16c35bab8de29a66b96a7dc0e7d1297aaacba3718fa1d369233c9f")
version("5.3.0", sha256="d251e2efe95dc12f536ce119b2587bed64bbda013969fa72be58062788044a9e")
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
depends_on("c", type="build") # generated
depends_on("cxx", type="build") # generated
depends_on("cmake@3:", type="build")
depends_on("gl@4.5:", type="link")
depends_on("numactl", type="link")
depends_on("libx11", when="+asan")
depends_on("xproto", when="+asan")
for d_version, d_shasum in [
("5.6.1", "cc9a99c7e4de3d9360c0a471b27d626e84a39c9e60e0aff1e8e1500d82391819"),
@ -152,9 +160,27 @@ def cmake_args(self):
if self.spec.satisfies("@5.7:"):
args.append(self.define("CLR_BUILD_HIP", False))
args.append(self.define("CLR_BUILD_OCL", True))
if self.spec.satisfies("+asan"):
args.append(
self.define(
"CMAKE_CXX_FLAGS",
f"-I{self.spec['libx11'].prefix.include} "
f"-I{self.spec['mesa'].prefix.include} "
f"-I{self.spec['xproto'].prefix.include}",
)
)
return args
def setup_build_environment(self, env):
if self.spec.satisfies("+asan"):
env.set("CC", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
env.set("CXX", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
def setup_run_environment(self, env):
env.prepend_path("LD_LIBRARY_PATH", self.prefix.lib),
env.set("OCL_ICD_VENDORS", self.prefix.vendors + "/")

View File

@ -44,6 +44,11 @@ class Rocprim(CMakePackage):
values=auto_or_any_combination_of(*amdgpu_targets),
sticky=True,
)
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
depends_on("cmake@3.10.2:", type="build")
depends_on("numactl", type="link")
@ -77,6 +82,13 @@ class Rocprim(CMakePackage):
def setup_build_environment(self, env):
env.set("CXX", self.spec["hip"].hipcc)
if self.spec.satisfies("+asan"):
env.set("CC", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++")
env.set("CXX", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
def cmake_args(self):
args = [

View File

@ -54,6 +54,11 @@ class Rocrand(CMakePackage):
sticky=True,
)
variant("hiprand", default=True, when="@5.1.0:", description="Build the hiprand library")
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
depends_on("cmake@3.10.2:", type="build")
@ -126,6 +131,13 @@ def patch(self):
def setup_build_environment(self, env):
env.set("CXX", self.spec["hip"].hipcc)
if self.spec.satisfies("+asan"):
env.set("CC", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
env.set("CXX", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
@classmethod
def determine_version(cls, lib):

View File

@ -36,6 +36,11 @@ class Rocsolver(CMakePackage):
size and compile time by adding specialized kernels \
for small matrix sizes",
)
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
license("BSD-2-Clause")
@ -138,6 +143,13 @@ def cmake_args(self):
def setup_build_environment(self, env):
env.set("CXX", self.spec["hip"].hipcc)
if self.spec.satisfies("+asan"):
env.set("CC", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
env.set("CXX", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
@run_after("build")
@on_package_attributes(run_tests=True)

View File

@ -32,6 +32,11 @@ class Rocsparse(CMakePackage):
sticky=True,
)
variant("test", default=False, description="Build rocsparse-test client")
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
license("MIT")
version("6.1.2", sha256="e8989c28085275e7c044b19fd2bc86d8493ce6a1b8545126f787722c535fe6eb")
@ -244,6 +249,13 @@ def check_build(self):
def setup_build_environment(self, env):
env.set("CXX", self.spec["hip"].hipcc)
if self.spec.satisfies("+asan"):
env.set("CC", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
env.set("CXX", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
@classmethod
def determine_version(cls, lib):

View File

@ -60,6 +60,11 @@ def url_for_version(self, version):
default=False,
description="add utilities folder which contains rpp unit tests",
)
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
conflicts("+asan", when="os=rhel9")
conflicts("+asan", when="os=centos7")
conflicts("+asan", when="os=centos8")
patch("0001-include-half-openmp-through-spack-package.patch", when="@:5.7")
patch("0002-declare-handle-in-header.patch")
@ -75,6 +80,13 @@ def patch(self):
filter_file(
"${ROCM_PATH}/llvm", self.spec["llvm-amdgpu"].prefix, "CMakeLists.txt", string=True
)
if self.spec.satisfies("+asan"):
filter_file(
"CMAKE_CXX_COMPILER clang++",
"CMAKE_CXX_COMPILER {0}/bin/clang++".format(self.spec["llvm-amdgpu"].prefix),
"CMakeLists.txt",
string=True,
)
if self.spec.satisfies("+opencl"):
filter_file(
"${ROCM_PATH}",
@ -153,6 +165,15 @@ def setup_run_environment(self, env):
if self.spec.satisfies("@6.1:"):
env.prepend_path("LD_LIBRARY_PATH", self.spec["hsa-rocr-dev"].prefix.lib)
def setup_build_environment(self, env):
if self.spec.satisfies("+asan"):
env.set("CC", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
env.set("CXX", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang")
env.set("ASAN_OPTIONS", "detect_leaks=0")
env.set("CFLAGS", "-fsanitize=address -shared-libasan")
env.set("CXXFLAGS", "-fsanitize=address -shared-libasan")
env.set("LDFLAGS", "-fuse-ld=lld")
def cmake_args(self):
spec = self.spec
args = []