gen_compile_commands: handle multiple lines per .mod file
Subsystems (2)
PATCH v3 1/1 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.
---
Link to v2:
https://lore.kernel.org/all/[email protected]/
Changes since v2:
* Restored a blank line.
* Rewrote the commit description.
thanks,
John Hubbard
scripts/clang-tools/gen_compile_commands.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
scripts/clang-tools/gen_compile_commands.py +3 -3
@@ -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):
Signature · 1 line
2.36.1
Quoted 17 lines · John Hubbard
scripts/clang-tools/gen_compile_commands.pyincorrectly assumes that each .mod file only contains one line. That assumption was correct when the script was originally created, but commit9413e7640564("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
Kbuildto 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.
Quoted 5 lines
Fix this by fully processing each .mod file.
Fixes 9413e7640564 ("kbuild: split the second line of *.mod into *.usyms")Cc Masahiro Yamada <[email protected]>Cc Nick Desaulniers <[email protected]>
Thanks for the fix, John!
Quoted 40 lines
Signed-off-by John Hubbard <[email protected]>---
Link to v2:
https://lore.kernel.org/all/[email protected]/Changes since v2:
* Restored a blank line.
* Rewrote the commit description.
thanks,
John Hubbardscripts/clang-tools/gen_compile_commands.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)scripts/clang-tools/gen_compile_commands.py +3
-4@@ -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): --2.36.1
Signature · 2 lines
Thanks, ~Nick Desaulniers
Quoted 19 lines · Nick Desaulniers
Quoted 17 lines · John Hubbard
scripts/clang-tools/gen_compile_commands.pyincorrectly assumes that each .mod file only contains one line. That assumption was correct when the script was originally created, but commit9413e7640564("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
Kbuildto 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.
Quoted 8 lines
Quoted 5 lines
Fix this by fully processing each .mod file.
Fixes 9413e7640564 ("kbuild: split the second line of *.mod into *.usyms")Cc Masahiro Yamada <[email protected]>Cc Nick Desaulniers <[email protected]>Thanks for the fix, John!
Reviewed-by Nick Desaulniers <[email protected]>
Applied to linux-kbuild/fixes with Nick's reviewed-by. Thanks.
Signature · 2 lines
Best Regards Masahiro Yamada