Skip to content

Fix prologue debug line info pointing to decorator instead of def line#746

Merged
gmarkall merged 1 commit intoNVIDIA:mainfrom
jiel-nv:lineinfo-prologue
Jan 26, 2026
Merged

Fix prologue debug line info pointing to decorator instead of def line#746
gmarkall merged 1 commit intoNVIDIA:mainfrom
jiel-nv:lineinfo-prologue

Conversation

@jiel-nv
Copy link
Contributor

@jiel-nv jiel-nv commented Jan 24, 2026

Fixes nvbug5811746.

The root cause is that, when a kernel function has decorator, the code object's co_firstlineno points to the decorator line rather than the def line. During IR lowering, prologue code has no explicit source location, so co_firstlineno is used as the default line number. This caused prologue code to incorrectly reference the decorator line in DWARF debug information.

The problem can be reproduced with the following code example,

@cuda.jit("void(int64[:])", debug=True, opt=False)  # Line 270
def hybrid_loop_kernel(output):                     # Line 271
    idx = cuda.grid(1)                              # Line 272

This PR added _adjust_line_if_prologue() method in lowering.py that redirects any line number less than the def line to the def line. This ensures prologue instructions are associated with the function definition rather than decorators.

Before Fix - .debug_line table:

Address              Line
0x0000000000000000    271   ← def line
0x0000000000001c30    270   ← BUG: decorator line appears here
0x0000000000001f20    272   ← first statement

After Fix - .debug_line table:

Address              Line
0x0000000000000000    271   ← def line
0x0000000000001f20    272   ← first statement (no spurious 270!)

Also added a new test test_prologue_line_number which passes with the fix, fails without.

@copy-pr-bot
Copy link

copy-pr-bot bot commented Jan 24, 2026

Auto-sync is disabled for ready for review pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Jan 24, 2026

Greptile Summary

Fixed debug line information for function prologues when decorators are present. Previously, prologue instructions incorrectly pointed to decorator lines instead of the def line because co_firstlineno references the first decorator. The new _adjust_line_if_prologue() helper redirects any line numbers before the actual function definition to the def line itself.

Key changes:

  • Added _adjust_line_if_prologue() method in lowering.py:141-149 that returns defn_loc.line when line < defn_loc.line
  • Applied the adjustment to three call sites: lower_inst() (line 516), mark_variable() (line 1674), and storevar() (line 1762)
  • The change at line 1762 also simplifies conditional logic that previously used argidx to determine line selection
  • Added test test_prologue_line_number() that verifies DILocation entries use def line or statement lines, with CHECK-NOT ensuring decorator line is absent

Confidence Score: 5/5

  • This PR is safe to merge with minimal risk
  • The fix is well-scoped, addresses a specific bug in debug information generation, includes a comprehensive test that validates the fix, and the implementation is sound - the helper method correctly redirects prologue line numbers while preserving actual source line numbers for non-prologue code
  • No files require special attention

Important Files Changed

Filename Overview
numba_cuda/numba/cuda/lowering.py Adds _adjust_line_if_prologue() method and applies it consistently to fix debug line info for decorated functions
numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py Adds comprehensive test verifying prologue uses def line instead of decorator line in debug info

@jiel-nv
Copy link
Contributor Author

jiel-nv commented Jan 24, 2026

/ok to test 9deb359

@jiel-nv jiel-nv added the 3 - Ready for Review Ready for review by team label Jan 24, 2026
@gmarkall gmarkall added 5 - Ready to merge Testing and reviews complete, ready to merge and removed 3 - Ready for Review Ready for review by team labels Jan 26, 2026
@gmarkall gmarkall merged commit bcb07eb into NVIDIA:main Jan 26, 2026
105 checks passed
gmarkall added a commit to gmarkall/numba-cuda that referenced this pull request Jan 27, 2026
- Add Python 3.14 to the wheel publishing matrix (NVIDIA#750)
- feat: swap out internal device array usage with `StridedMemoryView` (NVIDIA#703)
- Fix max block size computation in `forall` (NVIDIA#744)
- Fix prologue debug line info pointing to decorator instead of def line (NVIDIA#746)
- Fix kernel return type in DISubroutineType debug metadata (NVIDIA#745)
- Fix missing line info in Jupyter notebooks (NVIDIA#742)
- Fix: Pass correct flags to linker when debugging in the presence of LTOIR code (NVIDIA#698)
- chore(deps): add cuda-pathfinder to pixi deps (NVIDIA#741)
- fix: enable flake8-bugbear lints and fix found problems (NVIDIA#708)
- fix: Fix race condition in CUDA Simulator (NVIDIA#690)
- ci: run tests in parallel (NVIDIA#740)
- feat: users can pass `shared_memory_carveout` to @cuda.jit (NVIDIA#642)
- Fix compatibility with NumPy 2.4: np.trapz and np.in1d removed (NVIDIA#739)
- Pass the -numba-debug flag to libnvvm (NVIDIA#681)
- ci: remove rapids containers from conda ci (NVIDIA#737)
- Use `pathfinder` for dynamic libraries (NVIDIA#308)
- CI: Add CUDA 13.1 testing support (NVIDIA#705)
- Adding `pixi run test` and `pixi run test-par` support (NVIDIA#724)
- Disable per-PR nvmath tests + follow same test practice (NVIDIA#723)
- chore(deps): regenerate pixi lockfile (NVIDIA#722)
- Fix DISubprogram line number to point to function definition line (NVIDIA#695)
- revert: chore(dev): build pixi using rattler (NVIDIA#713) (NVIDIA#719)
- [feat] Initial version of the Numba CUDA GDB pretty-printer (NVIDIA#692)
- chore(dev): build pixi using rattler (NVIDIA#713)
- build(deps): bump the actions-monthly group across 1 directory with 8 updates (NVIDIA#704)
@gmarkall gmarkall mentioned this pull request Jan 27, 2026
kkraus14 pushed a commit that referenced this pull request Jan 28, 2026
- Add Python 3.14 to the wheel publishing matrix (#750)
- feat: swap out internal device array usage with `StridedMemoryView`
(#703)
- Fix max block size computation in `forall` (#744)
- Fix prologue debug line info pointing to decorator instead of def line
(#746)
- Fix kernel return type in DISubroutineType debug metadata (#745)
- Fix missing line info in Jupyter notebooks (#742)
- Fix: Pass correct flags to linker when debugging in the presence of
LTOIR code (#698)
- chore(deps): add cuda-pathfinder to pixi deps (#741)
- fix: enable flake8-bugbear lints and fix found problems (#708)
- fix: Fix race condition in CUDA Simulator (#690)
- ci: run tests in parallel (#740)
- feat: users can pass `shared_memory_carveout` to @cuda.jit (#642)
- Fix compatibility with NumPy 2.4: np.trapz and np.in1d removed (#739)
- Pass the -numba-debug flag to libnvvm (#681)
- ci: remove rapids containers from conda ci (#737)
- Use `pathfinder` for dynamic libraries (#308)
- CI: Add CUDA 13.1 testing support (#705)
- Adding `pixi run test` and `pixi run test-par` support (#724)
- Disable per-PR nvmath tests + follow same test practice (#723)
- chore(deps): regenerate pixi lockfile (#722)
- Fix DISubprogram line number to point to function definition line
(#695)
- revert: chore(dev): build pixi using rattler (#713) (#719)
- [feat] Initial version of the Numba CUDA GDB pretty-printer (#692)
- chore(dev): build pixi using rattler (#713)
- build(deps): bump the actions-monthly group across 1 directory with 8
updates (#704)

<!--

Thank you for contributing to numba-cuda :)

Here are some guidelines to help the review process go smoothly.

1. Please write a description in this text box of the changes that are
being
   made.

2. Please ensure that you have written units tests for the changes
made/features
   added.

3. If you are closing an issue please use one of the automatic closing
words as
noted here:
https://help.github.com/articles/closing-issues-using-keywords/

4. If your pull request is not ready for review but you want to make use
of the
continuous integration testing facilities please label it with `[WIP]`.

5. If your pull request is ready to be reviewed without requiring
additional
work on top of it, then remove the `[WIP]` label (if present) and
replace
it with `[REVIEW]`. If assistance is required to complete the
functionality,
for example when the C/C++ code of a feature is complete but Python
bindings
are still required, then add the label `[HELP-REQ]` so that others can
triage
and assist. The additional changes then can be implemented on top of the
same PR. If the assistance is done by members of the rapidsAI team, then
no
additional actions are required by the creator of the original PR for
this,
otherwise the original author of the PR needs to give permission to the
person(s) assisting to commit to their personal fork of the project. If
that
doesn't happen then a new PR based on the code of the original PR can be
opened by the person assisting, which then will be the PR that will be
   merged.

6. Once all work has been done and review has taken place please do not
add
features or make changes out of the scope of those requested by the
reviewer
(doing this just add delays as already reviewed code ends up having to
be
re-reviewed/it is hard to tell what is new etc!). Further, please do not
rebase your branch on main/force push/rewrite history, doing any of
these
   causes the context of any comments made by reviewers to be lost. If
   conflicts occur against main they should be resolved by merging main
   into the branch used for making the pull request.

Many thanks in advance for your cooperation!

-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

5 - Ready to merge Testing and reviews complete, ready to merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants