in src/advisor/scanners/source_scanner.py [0:0]
def scan_file_object(self, filename, file_object, report):
continuation_parser = ContinuationParser()
naive_cpp = NaiveCpp()
comment_parser = NaiveCommentParser()
function_parser = NaiveFunctionParser()
found_aarch64_inline_asm = False
inline_asm_issues = []
preprocessor_errors = []
for lineno, line in enumerate(file_object, 1):
line = continuation_parser.parse_line(line)
if not line:
continue
is_comment = comment_parser.parse_line(line)
if is_comment:
continue
result = naive_cpp.parse_line(line)
if result.directive_type == PreprocessorDirective.TYPE_ERROR \
and naive_cpp.in_other_arch_else_code():
preprocessor_errors.append(PreprocessorErrorIssue(filename,
lineno,
line.strip(),
function=function_parser.current_function))
elif result.directive_type == PreprocessorDirective.TYPE_CONDITIONAL \
and result.is_compiler:
if_line = result.if_line or line
if if_line != line:
if_line = '%s /* %s */' % (line.strip(),
if_line.strip())
else:
if_line = if_line.strip()
report.add_issue(CompilerSpecificIssue(
filename, lineno, if_line.strip(),
function=function_parser.current_function))
elif result.directive_type == PreprocessorDirective.TYPE_PRAGMA \
and SourceScanner.PRAGMA_SIMD_RE_PROG.search(line):
report.add_issue(PragmaSimdIssue(
filename, lineno, line.strip(),
function=function_parser.current_function))
elif (result.directive_type == PreprocessorDirective.TYPE_DEFINE and result.body) \
or not result.directive_type:
if result.directive_type == PreprocessorDirective.TYPE_DEFINE:
line = result.body
function = result.macro_name
else:
function_parser.parse_line(line)
function = function_parser.current_function
if naive_cpp.in_aarch64_specific_code() or is_aarch64_specific_file_name(filename):
if function:
self.aarch64_functions.add(function)
if SourceScanner.INLINE_ASM_RE_PROG.search(line) and \
not '(""' in line and \
not '".symver ' in line:
if naive_cpp.in_aarch64_specific_code():
found_aarch64_inline_asm = True
else:
inline_asm_issues.append(
InlineAsmIssue(filename, lineno, function=function))
if naive_cpp.in_aarch64_specific_code() or is_aarch64_specific_file_name(filename):
self.aarch64_intrinsic_inline_asm_files.add(filename)
if function:
self.aarch64_intrinsic_inline_asm_functions.add(function)
else:
if not filename in self.other_arch_intrinsic_inline_asm_files:
self.other_arch_intrinsic_inline_asm_files[filename] = \
NoEquivalentInlineAsmIssue(filename, lineno)
if function and not function in self.other_arch_intrinsic_inline_asm_functions:
self.other_arch_intrinsic_inline_asm_functions[function] = \
NoEquivalentInlineAsmIssue(filename, lineno, function=function)
arm_match = SourceScanner.ARM_INTRINSICS_RE_PROG.search(line)
other_match = SourceScanner.OTHER_ARCH_INTRINSICS_RE_PROG.search(line)
avx_256_match = SourceScanner.AVX_256_ARCH_INTRINSICS_RE_PROG.search(line)
avx_512_match = SourceScanner.AVX_512_ARCH_INTRINSICS_RE_PROG.search(line)
if other_match and not arm_match:
intrinsic = other_match.group(1)
if not self.filter_ported_code or not naive_cpp.in_other_arch_specific_code():
if avx_256_match:
report.add_issue(Avx256IntrinsicIssue(
filename, lineno, intrinsic, function=function))
elif avx_512_match:
report.add_issue(Avx512IntrinsicIssue(
filename, lineno, intrinsic, function=function))
else:
report.add_issue(IntrinsicIssue(
filename, lineno, intrinsic, function=function))
if not filename in self.other_arch_intrinsic_inline_asm_files:
self.other_arch_intrinsic_inline_asm_files[filename] = \
NoEquivalentIntrinsicIssue(filename, lineno, intrinsic)
if function and not function in self.other_arch_intrinsic_inline_asm_functions:
self.other_arch_intrinsic_inline_asm_functions[function] = \
NoEquivalentIntrinsicIssue(filename, lineno, intrinsic, function=function)
if arm_match:
self.aarch64_intrinsic_inline_asm_files.add(filename)
if function:
self.aarch64_intrinsic_inline_asm_functions.add(function)
if not self.filter_ported_code or not found_aarch64_inline_asm:
for issue in inline_asm_issues:
if not self.filter_ported_code or not issue.function or not issue.function in self.aarch64_functions:
report.add_issue(issue)
for issue in preprocessor_errors:
report.add_issue(issue)