diff options
Diffstat (limited to 'lib')
l--------- | lib/spack/env/aocc/clang | 1 | ||||
l--------- | lib/spack/env/aocc/clang++ | 1 | ||||
l--------- | lib/spack/env/aocc/flang | 1 | ||||
-rwxr-xr-x | lib/spack/env/cc | 2 | ||||
-rw-r--r-- | lib/spack/spack/compilers/__init__.py | 2 | ||||
-rw-r--r-- | lib/spack/spack/compilers/aocc.py | 116 | ||||
-rw-r--r-- | lib/spack/spack/compilers/clang.py | 2 | ||||
-rw-r--r-- | lib/spack/spack/test/compilers/basics.py | 24 | ||||
-rw-r--r-- | lib/spack/spack/test/compilers/detection.py | 16 |
9 files changed, 162 insertions, 3 deletions
diff --git a/lib/spack/env/aocc/clang b/lib/spack/env/aocc/clang new file mode 120000 index 0000000000..82c2b8e90a --- /dev/null +++ b/lib/spack/env/aocc/clang @@ -0,0 +1 @@ +../cc
\ No newline at end of file diff --git a/lib/spack/env/aocc/clang++ b/lib/spack/env/aocc/clang++ new file mode 120000 index 0000000000..abf4cd45c7 --- /dev/null +++ b/lib/spack/env/aocc/clang++ @@ -0,0 +1 @@ +../cpp
\ No newline at end of file diff --git a/lib/spack/env/aocc/flang b/lib/spack/env/aocc/flang new file mode 120000 index 0000000000..b6c64233b0 --- /dev/null +++ b/lib/spack/env/aocc/flang @@ -0,0 +1 @@ +../fc
\ No newline at end of file diff --git a/lib/spack/env/cc b/lib/spack/env/cc index 6de7df3576..e826cabca4 100755 --- a/lib/spack/env/cc +++ b/lib/spack/env/cc @@ -125,7 +125,7 @@ case "$command" in comp="FC" lang_flags=F ;; - f77|xlf|xlf_r|pgf77|frt) + f77|xlf|xlf_r|pgf77|frt|flang) command="$SPACK_F77" language="Fortran 77" comp="F77" diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index c11bafe47d..452dc384a5 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -739,7 +739,7 @@ def is_mixed_toolchain(compiler): toolchains.add(compiler_cls.__name__) if len(toolchains) > 1: - if toolchains == set(['Clang', 'AppleClang']): + if toolchains == set(['Clang', 'AppleClang', 'Aocc']): return False tty.debug("[TOOLCHAINS] {0}".format(toolchains)) return True diff --git a/lib/spack/spack/compilers/aocc.py b/lib/spack/spack/compilers/aocc.py new file mode 100644 index 0000000000..5c9e885490 --- /dev/null +++ b/lib/spack/spack/compilers/aocc.py @@ -0,0 +1,116 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +import re +import sys + +import llnl.util.lang + +from spack.compiler import Compiler + + +class Aocc(Compiler): + # Subclasses use possible names of C compiler + cc_names = ['clang'] + + # Subclasses use possible names of C++ compiler + cxx_names = ['clang++'] + + # Subclasses use possible names of Fortran 77 compiler + f77_names = ['flang'] + + # Subclasses use possible names of Fortran 90 compiler + fc_names = ['flang'] + + version_argument = '--version' + + @property + def debug_flags(self): + return ['-gcodeview', '-gdwarf-2', '-gdwarf-3', '-gdwarf-4', + '-gdwarf-5', '-gline-tables-only', '-gmodules', '-gz', '-g'] + + @property + def opt_flags(self): + return ['-O0', '-O1', '-O2', '-O3', '-Ofast', '-Os', '-Oz', '-Og', + '-O', '-O4'] + + @property + def link_paths(self): + link_paths = {'cc': 'aocc/clang', + 'cxx': 'aocc/clang++', + 'f77': 'aocc/flang', + 'fc': 'aocc/flang'} + + return link_paths + + @property + def verbose_flag(self): + return "-v" + + @property + def openmp_flag(self): + return "-fopenmp" + + @property + def cxx11_flag(self): + return "-std=c++11" + + @property + def cxx14_flag(self): + return "-std=c++14" + + @property + def cxx17_flag(self): + return "-std=c++17" + + @property + def c99_flag(self): + return '-std=c99' + + @property + def c11_flag(self): + return "-std=c11" + + @property + def cc_pic_flag(self): + return "-fPIC" + + @property + def cxx_pic_flag(self): + return "-fPIC" + + @property + def f77_pic_flag(self): + return "-fPIC" + + @property + def fc_pic_flag(self): + return "-fPIC" + + required_libs = ['libclang'] + + @classmethod + @llnl.util.lang.memoized + def extract_version_from_output(cls, output): + loc_ver = 'unknown' + + match = re.search( + r'AMD clang version ([^ )]+)', + output + ) + if match: + loc_ver = output.split('AOCC_')[1].split('-')[0] + return loc_ver + + @classmethod + def fc_version(cls, fortran_compiler): + if sys.platform == 'darwin': + return cls.default_version('clang') + + return cls.default_version(fortran_compiler) + + @classmethod + def f77_version(cls, f77): + return cls.fc_version(f77) diff --git a/lib/spack/spack/compilers/clang.py b/lib/spack/spack/compilers/clang.py index 2f8c7d43e3..5eb08cbf0a 100644 --- a/lib/spack/spack/compilers/clang.py +++ b/lib/spack/spack/compilers/clang.py @@ -154,7 +154,7 @@ class Clang(Compiler): @llnl.util.lang.memoized def extract_version_from_output(cls, output): ver = 'unknown' - if 'Apple' in output: + if ('Apple' in output) or ('AMD' in output): return ver match = re.search( diff --git a/lib/spack/spack/test/compilers/basics.py b/lib/spack/spack/test/compilers/basics.py index 9af416dd7b..22099bdb63 100644 --- a/lib/spack/spack/test/compilers/basics.py +++ b/lib/spack/spack/test/compilers/basics.py @@ -442,6 +442,30 @@ def test_clang_flags(): 'clang@3.3') +def test_aocc_flags(): + supported_flag_test("debug_flags", + ['-gcodeview', '-gdwarf-2', '-gdwarf-3', + '-gdwarf-4', '-gdwarf-5', '-gline-tables-only', + '-gmodules', '-gz', '-g'], + 'aocc@2.2.0') + supported_flag_test("opt_flags", + ['-O0', '-O1', '-O2', '-O3', '-Ofast', + '-Os', '-Oz', '-Og', + '-O', '-O4'], + 'aocc@2.2.0') + supported_flag_test("openmp_flag", "-fopenmp", "aocc@2.2.0") + supported_flag_test("cxx11_flag", "-std=c++11", "aocc@2.2.0") + supported_flag_test("cxx14_flag", "-std=c++14", "aocc@2.2.0") + supported_flag_test("cxx17_flag", "-std=c++17", "aocc@2.2.0") + supported_flag_test("c99_flag", "-std=c99", "aocc@2.2.0") + supported_flag_test("c11_flag", "-std=c11", "aocc@2.2.0") + supported_flag_test("cc_pic_flag", "-fPIC", "aocc@2.2.0") + supported_flag_test("cxx_pic_flag", "-fPIC", "aocc@2.2.0") + supported_flag_test("f77_pic_flag", "-fPIC", "aocc@2.2.0") + supported_flag_test("fc_pic_flag", "-fPIC", "aocc@2.2.0") + supported_flag_test("version_argument", "--version", "aocc@2.2.0") + + def test_fj_flags(): supported_flag_test("openmp_flag", "-Kopenmp", "fj@4.0.0") supported_flag_test("cxx98_flag", "-std=c++98", "fj@4.0.0") diff --git a/lib/spack/spack/test/compilers/detection.py b/lib/spack/spack/test/compilers/detection.py index 4cb80090b5..cf2f7a057a 100644 --- a/lib/spack/spack/test/compilers/detection.py +++ b/lib/spack/spack/test/compilers/detection.py @@ -19,6 +19,7 @@ import spack.compilers.nvhpc import spack.compilers.pgi import spack.compilers.xl import spack.compilers.xl_r +import spack.compilers.aocc from spack.operating_systems.cray_frontend import CrayFrontend import spack.util.module_cmd @@ -288,3 +289,18 @@ def test_cray_frontend_compiler_detection( paths = cray_fe_os.compiler_search_paths assert paths == [str(compiler_dir)] + + +@pytest.mark.parametrize('version_str,expected_version', [ + # This applies to C,C++ and FORTRAN compiler + ('AMD clang version 10.0.0 (CLANG: AOCC_2.2.0-Build#93 2020_06_25)' + '(based on LLVM Mirror.Version.10.0.0)\n' + 'Target: x86_64-unknown-linux-gnu\n' + 'Thread model: posix\n', '2.2.0' + ) +]) +def test_aocc_version_detection(version_str, expected_version): + version = spack.compilers.aocc.Aocc.extract_version_from_output( + version_str + ) + assert version == expected_version |