summaryrefslogtreecommitdiffstats
path: root/scripts/clang-tools
diff options
context:
space:
mode:
authorJohn Hubbard <jhubbard@nvidia.com>2022-06-28 03:23:53 +0200
committerMasahiro Yamada <masahiroy@kernel.org>2022-06-29 04:43:13 +0200
commita4ab14e1d8fe83cc1ed8910b788117ec2ed25179 (patch)
treec9dbfeb46dfd1cd5466bcba27b442fc380251773 /scripts/clang-tools
parentLinux 5.19-rc4 (diff)
downloadlinux-a4ab14e1d8fe83cc1ed8910b788117ec2ed25179.tar.xz
linux-a4ab14e1d8fe83cc1ed8910b788117ec2ed25179.zip
gen_compile_commands: handle multiple lines per .mod file
scripts/clang-tools/gen_compile_commands.py incorrectly assumes that each .mod file only contains one line. That assumption was correct when the script was originally created, but commit 9413e7640564 ("kbuild: split the second line of *.mod into *.usyms") changed the .mod file format so that there is one entry per line, and potentially many lines. The problem can be reproduced by using Kbuild to generate compile_commands.json, like this: make CC=clang compile_commands.json In many cases, the problem might be overlooked because many subsystems only have one line anyway. However, in some subsystems (Nouveau, with 762 entries, is a notable example) it results in skipping most of the subsystem. Fix this by fully processing each .mod file. Fixes: 9413e7640564 ("kbuild: split the second line of *.mod into *.usyms") Signed-off-by: John Hubbard <jhubbard@nvidia.com> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Diffstat (limited to 'scripts/clang-tools')
-rwxr-xr-xscripts/clang-tools/gen_compile_commands.py6
1 files changed, 3 insertions, 3 deletions
diff --git a/scripts/clang-tools/gen_compile_commands.py b/scripts/clang-tools/gen_compile_commands.py
index 1d1bde1fd45e..47da25b3ba7d 100755
--- a/scripts/clang-tools/gen_compile_commands.py
+++ b/scripts/clang-tools/gen_compile_commands.py
@@ -157,10 +157,10 @@ def cmdfiles_for_modorder(modorder):
if ext != '.ko':
sys.exit('{}: module path must end with .ko'.format(ko))
mod = base + '.mod'
- # The first line of *.mod lists the objects that compose the module.
+ # Read from *.mod, to get a list of objects that compose the module.
with open(mod) as m:
- for obj in m.readline().split():
- yield to_cmdfile(obj)
+ for mod_line in m:
+ yield to_cmdfile(mod_line.rstrip())
def process_line(root_directory, command_prefix, file_path):