Skip to content

Commit

Permalink
Support for AmpereOne family (#6)
Browse files Browse the repository at this point in the history
* add detect software built for the Arm Neoverse series of processors and recommend options for AmpereOne support.

* detects build files for missing AmpereOne support

* update UT cases for neoverse/ampere1 build flag detection

* support scanning makefiles with arm64/aarch64 as file extension in filename

* extend other arch list to reduce noise during assembly code detection
  • Loading branch information
binh-ampere authored May 14, 2024
1 parent d7f069a commit 510aa13
Show file tree
Hide file tree
Showing 11 changed files with 269 additions and 17 deletions.
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

0 comments on commit 510aa13

Please sign in to comment.