Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for AmpereOne family #6

Merged
merged 7 commits into from
May 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions src/advisor/constants/arch_specific_options.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
"""
SPDX-License-Identifier: Apache-2.0
Copyright (c) 2023, Ampere Computing LLC
Copyright (c) 2024, Ampere Computing LLC
"""

ARCH_SPECIFIC_OPTS = ['mmx', 'sse', 'sse2', 'sse3', 'ssse3', 'sse4', 'sse4a', 'sse4.1', 'sse4.2', 'avx', 'avx2', 'avx512f', 'avx512pf', 'avx512er', 'avx512cd', 'avx512vl', 'avx512bw', 'avx512dq', 'avx512ifma', 'avx512vbmi', 'sha', 'aes', 'pclmul', 'clflushopt', 'clwb', 'fsgsbase', 'ptwrite', 'rdrnd', 'f16c', 'fma', 'pconfig', 'wbnoinvd', 'fma4', 'prfchw', 'rdpid', 'prefetchwt1', 'rdseed', 'sgx', 'xop', 'lwp', '3dnow', '3dnowa', 'popcnt', 'abm', 'adx', 'bmi', 'bmi2', 'lzcnt', 'fxsr', 'xsave', 'xsaveopt', 'xsavec', 'xsaves', 'rtm', 'hle', 'tbm', 'mwaitx', 'clzero', 'pku', 'avx512vbmi2', 'avx512bf16', 'avx512fp16', 'gfni', 'vaes', 'waitpkg', 'vpclmulqdq', 'avx512bitalg', 'movdiri', 'movdir64b', 'enqcmd', 'uintr', 'tsxldtrk', 'avx512vpopcntdq', 'avx512vp2intersect', 'avx5124fmaps', 'avx512vnni', 'avxvnni', 'avx5124vnniw', 'cldemote', 'serialize', 'amx-tile', 'amx-int8', 'amx-bf16', 'hreset', 'kl', 'widekl', 'avxifma', 'avxvnniint8', 'avxneconvert', 'cmpccxadd', 'amx-fp16', 'prefetchi', 'raoint', 'amx-complex']
X86_SPECIFIC_OPTS = ['mmx', 'sse', 'sse2', 'sse3', 'ssse3', 'sse4', 'sse4a', 'sse4.1', 'sse4.2', 'avx', 'avx2', 'avx512f', 'avx512pf', 'avx512er', 'avx512cd', 'avx512vl', 'avx512bw', 'avx512dq', 'avx512ifma', 'avx512vbmi', 'sha', 'aes', 'pclmul', 'clflushopt', 'clwb', 'fsgsbase', 'ptwrite', 'rdrnd', 'f16c', 'fma', 'pconfig', 'wbnoinvd', 'fma4', 'prfchw', 'rdpid', 'prefetchwt1', 'rdseed', 'sgx', 'xop', 'lwp', '3dnow', '3dnowa', 'popcnt', 'abm', 'adx', 'bmi', 'bmi2', 'lzcnt', 'fxsr', 'xsave', 'xsaveopt', 'xsavec', 'xsaves', 'rtm', 'hle', 'tbm', 'mwaitx', 'clzero', 'pku', 'avx512vbmi2', 'avx512bf16', 'avx512fp16', 'gfni', 'vaes', 'waitpkg', 'vpclmulqdq', 'avx512bitalg', 'movdiri', 'movdir64b', 'enqcmd', 'uintr', 'tsxldtrk', 'avx512vpopcntdq', 'avx512vp2intersect', 'avx5124fmaps', 'avx512vnni', 'avxvnni', 'avx5124vnniw', 'cldemote', 'serialize', 'amx-tile', 'amx-int8', 'amx-bf16', 'hreset', 'kl', 'widekl', 'avxifma', 'avxvnniint8', 'avxneconvert', 'cmpccxadd', 'amx-fp16', 'prefetchi', 'raoint', 'amx-complex']
"""Options that are not available on aarch64."""

NEOVERSE_SPECIFIC_OPTS = ['neoverse-']
"""Options for Arm Neoverse are not appropriate for AmpereOne family."""

AMPEREONE_SPECIFIC_OPTS = ['ampere1', 'ampere1a', 'ampere1b']
"""Options for AmpereOne family."""

ARCH_SPECIFIC_IN_BUILD_FILES = ['meson.build', 'CMakeLists.txt', 'Makefile.in', 'Makefile.am', 'Makefile.arm64', 'Makefile.aarch64']
"""Build files in aarch64 port dir can't be filter out as they might missing support for ampere1."""
10 changes: 5 additions & 5 deletions src/advisor/constants/arch_strings.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@
AARCH64_ARCHS = ['arm', 'aarch64', 'arm64', 'neon', 'sve']

NON_AARCH64_ARCHS = ['alpha', 'altivec', 'amd64', 'avx', 'avx512', 'hppa',
'i386', 'i586', 'i686', 'ia64', 'intel', 'intel64', 'ix86',
'm68k', 'microblaze', 'mips', 'nios2', 'otherarch', 'power',
'powerpc', 'powerpc32', 'powerpc64', 'ppc', 'ppc64',
'ppc64le', 's390', 'sh', 'sparc', 'sse', 'sse2', 'sse3',
'tile', 'x64', 'x86', 'x86_64']
'i386', 'i586', 'i686', 'ia64', 'intel', 'intel64', 'ix86', 'loongarch64',
'm68k', 'microblaze', 'mips', 'nios2', 'otherarch', 'penryn', 'power',
'powerpc', 'powerpc32', 'powerpc64', 'ppc', 'ppc64', 'ppc64le', 'riscv64',
'sandybridge', 's390', 'sh', 'sifive_x280', 'sparc', 'sse', 'sse2', 'sse3',
'tile', 'x64', 'x86', 'x86_64', 'zarch', 'zen', 'zen2', 'zen3']

COMPILERS = ['clang', 'cray', 'flang', 'gcc', 'gfortran', 'gnuc', 'gnug', 'ibmcpp', 'ibmxl', 'icc', 'ifort',
'intel', 'intel_compiler', 'llvm', 'pathscale', 'pgi', 'pgic', 'sunpro', 'xlc', 'xlf']
5 changes: 3 additions & 2 deletions src/advisor/helpers/find_port.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import os
import re
from ..constants.arch_strings import AARCH64_ARCHS, NON_AARCH64_ARCHS
from ..constants.arch_specific_options import ARCH_SPECIFIC_IN_BUILD_FILES


def port_filenames(filename):
Expand All @@ -41,7 +42,7 @@ def port_filenames(filename):
filename = ''.join(parts[:i]) + \
arm_arch + ''.join(parts[(i + 1):])
ret.append(filename)
elif part in AARCH64_ARCHS:
elif part in AARCH64_ARCHS and filename not in ARCH_SPECIFIC_IN_BUILD_FILES:
ret.append(filename)
return ret

Expand Down Expand Up @@ -105,7 +106,7 @@ def find_port_file(filename, other_files, other_files_dirs=None):
for file in other_files:
other_files_dirs.add(os.path.dirname(file))
port_dir = find_port_dir(head, other_files_dirs)
if port_dir:
if port_dir and tail not in ARCH_SPECIFIC_IN_BUILD_FILES:
return os.path.join(port_dir, tail)
return None

Expand Down
18 changes: 17 additions & 1 deletion src/advisor/reports/issues/arch_specific_build_option_issue.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
"""
SPDX-License-Identifier: Apache-2.0
Copyright (c) 2023, Ampere Computing LLC
Copyright (c) 2024, Ampere Computing LLC
"""

from .issue import Issue
from ..localization import _
from ..report_item import ReportItem


class ArchSpecificBuildOptionIssue(Issue):
Expand All @@ -13,3 +14,18 @@ def __init__(self, filename, lineno, opt_name):
opt_name
super().__init__(description=description, filename=filename,
lineno=lineno)

class NeoverseSpecificBuildOptionIssue(Issue):
def __init__(self, filename, lineno, opt_name, opt_value):
description = (_("neoverse-specific build option may not appropriate for AmpereOne: "
"-m%s=%s, see https://amperecomputing.com/tutorials/gcc-guide-ampere-processors for more details.") \
% (opt_name, opt_value))
super().__init__(description=description, filename=filename,
lineno=lineno, item_type=ReportItem.NEUTRAL)

class AmpereoneSpecificBuildOptionIssue(Issue):
def __init__(self, filename, lineno):
description = (_("Missing build option for AmpereOne, see "
"https://amperecomputing.com/tutorials/gcc-guide-ampere-processors for more details."))
super().__init__(description=description, filename=filename,
lineno=lineno, item_type=ReportItem.NEUTRAL)
34 changes: 29 additions & 5 deletions src/advisor/scanners/cmake_scanner.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
"""
SPDX-License-Identifier: Apache-2.0
Copyright (c) 2023, Ampere Computing LLC
Copyright (c) 2024, Ampere Computing LLC
"""

import os
import re
from ..constants.arch_strings import AARCH64_ARCHS, NON_AARCH64_ARCHS
from ..constants.arch_specific_libs import ARCH_SPECIFIC_LIBS
from ..constants.arch_specific_options import ARCH_SPECIFIC_OPTS
from ..constants.arch_specific_options import X86_SPECIFIC_OPTS
from ..constants.arch_specific_options import NEOVERSE_SPECIFIC_OPTS
from ..constants.arch_specific_options import AMPEREONE_SPECIFIC_OPTS
from ..parsers.continuation_parser import ContinuationParser
from ..reports.issues.arch_specific_library_issue import ArchSpecificLibraryIssue
from ..reports.issues.arch_specific_build_option_issue import ArchSpecificBuildOptionIssue
from ..reports.issues.arch_specific_build_option_issue import NeoverseSpecificBuildOptionIssue
from ..reports.issues.arch_specific_build_option_issue import AmpereoneSpecificBuildOptionIssue
from ..reports.issues.define_other_arch_issue import DefineOtherArchIssue
from .scanner import Scanner

Expand All @@ -20,10 +24,14 @@ class CMakeScanner(Scanner):

CMAKE_NAMES = ['CMakeLists.txt']

ARCH_SPECIFIC_OPTS_RE_PROG = re.compile(r'-m(%s)' %
'|'.join([(r'%s\b' % x) for x in ARCH_SPECIFIC_OPTS]))
X86_SPECIFIC_OPTS_RE_PROG = re.compile(r'-m(%s)' %
'|'.join([(r'%s\b' % x) for x in X86_SPECIFIC_OPTS]))
ARCH_SPECIFIC_LIBS_RE_PROG = re.compile(r'(?:find_package|find_library)\((%s)' %
'|'.join([(r'%s\b' % x) for x in ARCH_SPECIFIC_LIBS]))
NEOVERSE_SPECIFIC_OPTS_RE_PROG = re.compile(r'-m(cpu|tune)=(%s)' %
'|'.join([(r'%s\b' % x) for x in NEOVERSE_SPECIFIC_OPTS]))
AMPEREONE_SPECIFIC_OPTS_RE_PROG = re.compile(r'-m(cpu|tune)=(%s)' %
'|'.join([(r'%s\b' % x) for x in AMPEREONE_SPECIFIC_OPTS]))
OTHER_ARCH_CPU_LINE_RE_PROG = re.compile(r'(?:CMAKE_SYSTEM_PROCESSOR).*(%s)' %
'|'.join(NON_AARCH64_ARCHS))
AARCH64_CPU_LINE_RE_PROG = re.compile(r'(?:CMAKE_SYSTEM_PROCESSOR).*(%s)' %
Expand All @@ -37,6 +45,8 @@ def scan_file_object(self, filename, file, report):
continuation_parser = ContinuationParser()
other_arch_cpu_condition = None
seen_aarch64_cpu_condition = False
seen_neoverse_build_flag = False
seen_ampere1_build_flag = False

for lineno, line in enumerate(file, 1):
line = continuation_parser.parse_line(line)
Expand All @@ -49,11 +59,23 @@ def scan_file_object(self, filename, file, report):
lib_name = match.group(1)
report.add_issue(ArchSpecificLibraryIssue(
filename, lineno + 1, lib_name))
match = CMakeScanner.ARCH_SPECIFIC_OPTS_RE_PROG.search(line)
match = CMakeScanner.X86_SPECIFIC_OPTS_RE_PROG.search(line)
if match:
opt_name = match.group(1)
report.add_issue(ArchSpecificBuildOptionIssue(
filename, lineno + 1, opt_name))
match = CMakeScanner.NEOVERSE_SPECIFIC_OPTS_RE_PROG.search(line)
if match:
seen_aarch64_cpu_condition = True
seen_neoverse_build_flag = True
opt_name = match.group(1)
opt_value = match.group(2)
report.add_issue(NeoverseSpecificBuildOptionIssue(
filename, lineno + 1, opt_name, opt_value))
match = CMakeScanner.AMPEREONE_SPECIFIC_OPTS_RE_PROG.search(line)
if match:
seen_aarch64_cpu_condition = True
seen_ampere1_build_flag = True
match = CMakeScanner.OTHER_ARCH_CPU_LINE_RE_PROG.search(line)
if match:
other_arch_cpu_condition = line
Expand All @@ -62,3 +84,5 @@ def scan_file_object(self, filename, file, report):
seen_aarch64_cpu_condition = True
if other_arch_cpu_condition and not seen_aarch64_cpu_condition:
report.add_issue(DefineOtherArchIssue(filename, lineno + 1, other_arch_cpu_condition))
if seen_neoverse_build_flag and not seen_ampere1_build_flag:
report.add_issue(AmpereoneSpecificBuildOptionIssue(filename, lineno + 1))
36 changes: 35 additions & 1 deletion src/advisor/scanners/makefile_scanner.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,36 @@
import re
from ..constants.arch_strings import AARCH64_ARCHS, NON_AARCH64_ARCHS
from ..constants.arch_specific_libs import ARCH_SPECIFIC_LIBS
from ..constants.arch_specific_options import X86_SPECIFIC_OPTS
from ..constants.arch_specific_options import NEOVERSE_SPECIFIC_OPTS
from ..constants.arch_specific_options import AMPEREONE_SPECIFIC_OPTS
from ..parsers.continuation_parser import ContinuationParser
from ..reports.issues.arch_specific_library_issue import ArchSpecificLibraryIssue
from ..reports.issues.build_command_issue import BuildCommandIssue
from ..reports.issues.define_other_arch_issue import DefineOtherArchIssue
from ..reports.issues.host_cpu_detection_issue import HostCpuDetectionIssue
from ..reports.issues.arch_specific_build_option_issue import ArchSpecificBuildOptionIssue
from ..reports.issues.arch_specific_build_option_issue import NeoverseSpecificBuildOptionIssue
from ..reports.issues.arch_specific_build_option_issue import AmpereoneSpecificBuildOptionIssue
from ..reports.issues.old_crt_issue import OldCrtIssue

from .scanner import Scanner


class MakefileScanner(Scanner):
"""Scanner that scans Makefiles."""

MAKEFILE_NAMES = ['Makefile.in', 'Makefile.am']
MAKEFILE_NAMES = ['Makefile.in', 'Makefile.am', 'Makefile.arm64', 'Makefile.aarch64']
MAKEFILE_NAMES_CASE_INSENSITIVE = ['makefile', 'nmakefile', 'makefile.mk']

ARCH_SPECIFIC_LIBS_RE_PROG = re.compile(r'-l(%s)' %
'|'.join([(r'%s\b' % x) for x in ARCH_SPECIFIC_LIBS]))
X86_SPECIFIC_OPTS_RE_PROG = re.compile(r'-m(%s)' %
'|'.join([(r'%s\b' % x) for x in X86_SPECIFIC_OPTS]))
NEOVERSE_SPECIFIC_OPTS_RE_PROG = re.compile(r'-m(cpu|tune)=(%s)' %
'|'.join([(r'%s\b' % x) for x in NEOVERSE_SPECIFIC_OPTS]))
AMPEREONE_SPECIFIC_OPTS_RE_PROG = re.compile(r'-m(cpu|tune)=(%s)' %
'|'.join([(r'%s\b' % x) for x in AMPEREONE_SPECIFIC_OPTS]))
OLD_CRT_RE_PROG = re.compile(r'(libcmt[a-z]*\.lib)', re.IGNORECASE)
UCRT_RE_PROG = re.compile(r'(libucrt[a-z]*\.lib)', re.IGNORECASE)
OTHER_ARCH_CPU_LINE_RE_PROG = re.compile(r'\$\((?:CPU|PROCESSOR_ARCHITECTURE)\).*(%s)' %
Expand Down Expand Up @@ -72,6 +85,8 @@ def scan_file_object(self, filename, file, report):
seen_ucrt = False
other_arch_cpu_condition = None
seen_aarch64_cpu_condition = False
seen_neoverse_build_flag = False
seen_ampere1_build_flag = False
d_other_arch = None
seen_d_aarch64 = False
targets = set()
Expand All @@ -90,6 +105,23 @@ def scan_file_object(self, filename, file, report):
lib_name = match.group(1)
report.add_issue(ArchSpecificLibraryIssue(
filename, lineno + 1, lib_name))
match = MakefileScanner.X86_SPECIFIC_OPTS_RE_PROG.search(line)
if match:
opt_name = match.group(1)
report.add_issue(ArchSpecificBuildOptionIssue(
filename, lineno + 1, opt_name))
match = MakefileScanner.NEOVERSE_SPECIFIC_OPTS_RE_PROG.search(line)
if match:
seen_aarch64_cpu_condition = True
seen_neoverse_build_flag = True
opt_name = match.group(1)
opt_value = match.group(2)
report.add_issue(NeoverseSpecificBuildOptionIssue(
filename, lineno + 1, opt_name, opt_value))
match = MakefileScanner.AMPEREONE_SPECIFIC_OPTS_RE_PROG.search(line)
if match:
seen_aarch64_cpu_condition = True
seen_ampere1_build_flag = True
match = MakefileScanner.OLD_CRT_RE_PROG.search(line)
if match:
old_crt_lib_name = match.group(1)
Expand Down Expand Up @@ -139,3 +171,5 @@ def scan_file_object(self, filename, file, report):
report.add_issue(BuildCommandIssue(filename, lineno + 1, command))
if d_other_arch and not seen_d_aarch64:
report.add_issue(DefineOtherArchIssue(filename, lineno + 1, d_other_arch))
if seen_neoverse_build_flag and not seen_ampere1_build_flag:
report.add_issue(AmpereoneSpecificBuildOptionIssue(filename, lineno + 1))
72 changes: 72 additions & 0 deletions src/advisor/scanners/meson_scanner.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
"""
SPDX-License-Identifier: Apache-2.0
Copyright (c) 2024, Ampere Computing LLC
"""

import os
import re
from ..constants.arch_strings import AARCH64_ARCHS, NON_AARCH64_ARCHS
from ..constants.arch_specific_libs import ARCH_SPECIFIC_LIBS
from ..constants.arch_specific_options import X86_SPECIFIC_OPTS
from ..constants.arch_specific_options import NEOVERSE_SPECIFIC_OPTS
from ..constants.arch_specific_options import AMPEREONE_SPECIFIC_OPTS
from ..parsers.continuation_parser import ContinuationParser
from ..reports.issues.arch_specific_library_issue import ArchSpecificLibraryIssue
from ..reports.issues.arch_specific_build_option_issue import ArchSpecificBuildOptionIssue
from ..reports.issues.arch_specific_build_option_issue import NeoverseSpecificBuildOptionIssue
from ..reports.issues.arch_specific_build_option_issue import AmpereoneSpecificBuildOptionIssue
from ..reports.issues.define_other_arch_issue import DefineOtherArchIssue
from .scanner import Scanner


class MesonScanner(Scanner):
"""Scanner that scans Meson builds"""

MESON_NAMES = ['meson.build']

X86_SPECIFIC_OPTS_RE_PROG = re.compile(r'-m(%s)' %
'|'.join([(r'%s\b' % x) for x in X86_SPECIFIC_OPTS]))
ARCH_SPECIFIC_LIBS_RE_PROG = re.compile(r'(?:find_library)\(\'(%s)' %
'|'.join([(r'%s\b' % x) for x in ARCH_SPECIFIC_LIBS]))
NEOVERSE_SPECIFIC_OPTS_RE_PROG = re.compile(r'-m(cpu|tune)=(%s)' %
'|'.join([(r'%s\b' % x) for x in NEOVERSE_SPECIFIC_OPTS]))
AMPEREONE_SPECIFIC_OPTS_RE_PROG = re.compile(r'-m(cpu|tune)=(%s)' %
'|'.join([(r'%s\b' % x) for x in AMPEREONE_SPECIFIC_OPTS]))

def accepts_file(self, filename):
basename = os.path.basename(filename)
return basename in MesonScanner.MESON_NAMES

def scan_file_object(self, filename, file, report):
continuation_parser = ContinuationParser()
seen_neoverse_build_flag = False
seen_ampere1_build_flag = False

for lineno, line in enumerate(file, 1):
line = continuation_parser.parse_line(line)

if not line:
continue

match = MesonScanner.ARCH_SPECIFIC_LIBS_RE_PROG.search(line)
if match:
lib_name = match.group(1)
report.add_issue(ArchSpecificLibraryIssue(
filename, lineno + 1, lib_name))
match = MesonScanner.X86_SPECIFIC_OPTS_RE_PROG.search(line)
if match:
opt_name = match.group(1)
report.add_issue(ArchSpecificBuildOptionIssue(
filename, lineno + 1, opt_name))
match = MesonScanner.NEOVERSE_SPECIFIC_OPTS_RE_PROG.search(line)
if match:
seen_neoverse_build_flag = True
opt_name = match.group(1)
opt_value = match.group(2)
report.add_issue(NeoverseSpecificBuildOptionIssue(
filename, lineno + 1, opt_name, opt_value))
match = MesonScanner.AMPEREONE_SPECIFIC_OPTS_RE_PROG.search(line)
if match:
seen_ampere1_build_flag = True
if seen_neoverse_build_flag and not seen_ampere1_build_flag:
report.add_issue(AmpereoneSpecificBuildOptionIssue(filename, lineno + 1))
4 changes: 3 additions & 1 deletion src/advisor/scanners/scanners.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from .java_scanner import JavaScanner
from .makefile_scanner import MakefileScanner
from .cmake_scanner import CMakeScanner
from .meson_scanner import MesonScanner
from .python_scanner import PythonScanner
from .source_scanner import SourceScanner

Expand All @@ -49,7 +50,8 @@ def __init__(self, issue_type_config, filter_ported_code=True):
AsmSourceScanner(),
ConfigGuessScanner(),
MakefileScanner(),
CMakeScanner()]
CMakeScanner(),
MesonScanner()]
self.filters = [PortFilter()] if filter_ported_code else []
self.filters += [IssueTypeFilter(issue_type_config),
TargetOsFilter(),
Expand Down
12 changes: 12 additions & 0 deletions unittest/test_cmake_scanner.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,15 @@ def test_continuation(self):
cmake_scanner.scan_file_object(
'CMakeLists.txt', io_object, report)
self.assertEqual(len(report.issues), 1)

def test_neoverse_specific_opts_line_re(self):
match = CMakeScanner.NEOVERSE_SPECIFIC_OPTS_RE_PROG.search('ADD_CXX_FLAGS("-mtune=ampere1a")')
self.assertIsNone(match)
match = CMakeScanner.NEOVERSE_SPECIFIC_OPTS_RE_PROG.search('ADD_CXX_FLAGS("-mtune=neoverse-n2")')
self.assertIsNotNone(match)

def test_ampereone_specific_opts_line_re(self):
match = CMakeScanner.AMPEREONE_SPECIFIC_OPTS_RE_PROG.search('ADD_CXX_FLAGS("-mcpu=neoverse-v2")')
self.assertIsNone(match)
match = CMakeScanner.AMPEREONE_SPECIFIC_OPTS_RE_PROG.search('ADD_CXX_FLAGS("-mcpu=ampere1b")')
self.assertIsNotNone(match)
Loading
Loading