via llvm-dev
2021-Nov-30 21:51 UTC
[llvm-dev] Question regarding correctness of debug information generated by LLC
> Sorry for the late reply, this is my first day back after a long > holiday weekend. The gist of your reply seems to be that it's a little > hard to determine what might be going wrong because there is no debug > information in the IR I shared. There was debug information in my > original IR, it's true, but I was still able to reproduce the issue I > was encountering whether or not the debug information was present, so > it got removed during the process of minimization. The reason I > considered this normal is because LLC still generates CFI/CFA > directives in the assembly even when no debug information is present > in the IR, and my understanding was that this was the information that > the debugger used in order to unwind the stack.Ah, okay, I misunderstood. The CFI/CFA directives are not what I normally think of as debug information, although of course they are used to build the unwind tables in the .debug_frame section (or in the .eh_frame section, if you're not producing debug info). I suspect you are not targeting an X86-family architecture? I was not able to persuade llc for x86_64 Ubuntu to emit the tail calls that you describe. Could you provide a complete llc command line (including triple) that demonstrates the problem for you? Thanks, --paulr
Dwight Guth via llvm-dev
2021-Nov-30 22:29 UTC
[llvm-dev] Question regarding correctness of debug information generated by LLC
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.3 LTS Release: 20.04 Codename: focal $ ~/llvm-project/build/bin/llc --version LLVM (http://llvm.org/): LLVM version 13.0.0 Optimized build. Default target: x86_64-unknown-linux-gnu Host CPU: znver1 Registered Targets: x86 - 32-bit X86: Pentium-Pro and above x86-64 - 64-bit X86: EM64T and AMD64 $ ~/llvm-project/build/bin/llc -mtriple=x86_64-unknown-linux-gnu -O0 debug.ll If you inspect the debug.s, you will see that all the `tail call tailcc` calls which are actually in tail position will be compiled to the `jmp` instruction, as expected. The other calls are either not `tailcc` calling convention, not marked as a tail call (because in the original unminimized source, they were not in tail position), or are not now in tail position (because they were in the original source, but the minimized version does not put them in that position). On Tue, Nov 30, 2021 at 3:51 PM <paul.robinson at sony.com> wrote:> > > Sorry for the late reply, this is my first day back after a long > > holiday weekend. The gist of your reply seems to be that it's a little > > hard to determine what might be going wrong because there is no debug > > information in the IR I shared. There was debug information in my > > original IR, it's true, but I was still able to reproduce the issue I > > was encountering whether or not the debug information was present, so > > it got removed during the process of minimization. The reason I > > considered this normal is because LLC still generates CFI/CFA > > directives in the assembly even when no debug information is present > > in the IR, and my understanding was that this was the information that > > the debugger used in order to unwind the stack. > > Ah, okay, I misunderstood. The CFI/CFA directives are not what I > normally think of as debug information, although of course they are > used to build the unwind tables in the .debug_frame section (or in > the .eh_frame section, if you're not producing debug info). > > I suspect you are not targeting an X86-family architecture? I was > not able to persuade llc for x86_64 Ubuntu to emit the tail calls > that you describe. Could you provide a complete llc command line > (including triple) that demonstrates the problem for you? > > Thanks, > --paulr >-- Dwight Guth Chief Information Officer Runtime Verification, Inc. Email: dwight.guth at runtimeverification.com
via llvm-dev
2021-Dec-01 18:18 UTC
[llvm-dev] Question regarding correctness of debug information generated by LLC
> $ ~/llvm-project/build/bin/llc -mtriple=x86_64-unknown-linux-gnu -O0 > debug.llThanks! That is very helpful. I see a `jmp` from sender12 to apply_rule_6300, from apply_rule_6300 to sender4, and from apply_rule_6299 to sender1. Does that match your expectations? I want to make sure I'm looking at what you're looking at.> > The issue I am having is that it would appear that the debug > > information generated for my program indicates a different value for > > the $rsp register within the `apply_rule_6870` call frame at each of > > the two different call sites of `scanStackRoots`. The value seems > > correct at the first call site. However, at the second call site, the > > value appears incorrect and gdb actually cannot find the `main` stack > > frame when it tries to do a backtrace.Looking at the paths to scanStackRoots, the call sequence and my take on where you're having the problem look like this: main apply_rule_6870 sender12 scanStackRoots // here, gdb can find apply_rule_6870 fine (jmp) apply_rule_6300 (jmp) sender4 apply_rule_6299 (jmp) sender1 apply_rule_6297 koreAllocAndCollect_p1s_blocks koreCollect scanStackRoots // here, there's a problem I'm not as fluent in x86 as perhaps I should be, but I do see one thing that makes me wonder if it's entirely correct. The end of apply_rule_6300 looks like this: popq %rax .cfi_def_cfa_offset 8 # so far so good addq $48, %rsp jmp sender4 My guess is that the code generator is adjusting the stack frame size because sender4 has a much shorter argument list than apply_rule_6300, and it's possible that the .cfi directives aren't describing that correctly. Truthfully, I don't know enough about .cfi directives to say whether they *can* describe that correctly. You could work around this by making sender4 not be tail-callable, perhaps? This is definitely worth filing a bug; unfortunately, the project is transitioning from Bugzilla to github issues, and the transition is not complete, which means there is literally no way to file a bug at the moment. When that opens up, though, if you could file it (calling it "unwind info" rather than "debug info" to avoid confusion) that would be very much appreciated! I'll leave a note to myself to ping this thread when the transition is done. Thanks, --paulr