Skip to contentSkip to conversation

gen_compile_commands: handle multiple lines per .mod file

PATCH In review John Hubbard 3 participants 3 messages Jun 28, 2022 – Jun 29, 2022

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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.

Fixes 9413e7640564 ("kbuild: split the second line of *.mod into *.usyms")
Cc Masahiro Yamada <[email protected]>
Cc Nick Desaulniers <[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 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
index 1d1bde1fd45e..47da25b3ba7d 100755
@@ -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
reviewer Reviewed-by on v3 1/1
#1 lore raw
Quoted 17 lines · John Hubbard

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.

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

---

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 -4
index 1d1bde1fd45e..47da25b3ba7d 100755
@@ -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
#2 lore raw
Quoted 19 lines · Nick Desaulniers
Quoted 17 lines · John Hubbard

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.

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!

Applied to linux-kbuild/fixes with Nick's reviewed-by. Thanks.

Signature · 2 lines
Best Regards
Masahiro Yamada