Page MenuHomePhabricator

[llvm] Add a test for debug info generated with split functions.

Authored by snehasish on Nov 3 2020, 2:28 PM.



This commit adds a test for debug info generated when the machine
function splitter pass is enabled. We check that the line numbers for
the hot and cold parts of the split function are what we expect them to

Diff Detail

Unit TestsFailed

380 mslinux > HWAddressSanitizer-x86_64.TestCases::sizes.cpp
Script: -- : 'RUN: at line 3'; /mnt/disks/ssd0/agent/llvm-project/build/./bin/clang --driver-mode=g++ -m64 -gline-tables-only -fsanitize=hwaddress -fuse-ld=lld -mcmodel=large -mllvm -hwasan-globals -mllvm -hwasan-use-short-granules -mllvm -hwasan-instrument-landing-pads=0 -mllvm -hwasan-instrument-personality-functions /mnt/disks/ssd0/agent/llvm-project/compiler-rt/test/hwasan/TestCases/sizes.cpp -nostdlib++ -lstdc++ -o /mnt/disks/ssd0/agent/llvm-project/build/projects/compiler-rt/test/hwasan/X86_64/TestCases/Output/sizes.cpp.tmp
510 mswindows > LLVM.CodeGen/AMDGPU::ds_read2.ll
Script: -- : 'RUN: at line 2'; c:\ws\w1\llvm-project\premerge-checks\build\bin\llc.exe -march=amdgcn -mcpu=bonaire -verify-machineinstrs -mattr=+load-store-opt < C:\ws\w1\llvm-project\premerge-checks\llvm\test\CodeGen\AMDGPU\ds_read2.ll | c:\ws\w1\llvm-project\premerge-checks\build\bin\filecheck.exe -enable-var-scope -check-prefixes=GCN,CI C:\ws\w1\llvm-project\premerge-checks\llvm\test\CodeGen\AMDGPU\ds_read2.ll

Event Timeline

snehasish created this revision.Nov 3 2020, 2:28 PM
Herald added a project: Restricted Project. · View Herald TranscriptNov 3 2020, 2:29 PM
snehasish requested review of this revision.Nov 3 2020, 2:29 PM
saugustine accepted this revision.Nov 3 2020, 2:53 PM

I can't speak to its technical correctness, but this is exactly the test I requested and it looks good at a high level.

This revision is now accepted and ready to land.Nov 3 2020, 2:53 PM
snehasish updated this revision to Diff 302704.Nov 3 2020, 3:34 PM

Add UNSUPPORTED tag for windows and mac os.

Thanks for the quick review @saugustine , I'll wait for @tmsriram take a look.

tmsriram added inline comments.Nov 3 2020, 10:59 PM

What does this correspond to?


Isn't this the cold basic block? What is split out here?


Do we need a -gsplit-dwarf fission test too?

MaskRay added inline comments.

The current test only checks -g1 line table. If it targets -g2 (and I think it probably should), I expect that more stuff should be tested.
Adding @dblaikie who knows better how to construct an interesting test.

MaskRay added a comment.EditedNov 3 2020, 11:12 PM

In addition, I wonder where this is layering issue for the testing. This patch adds llvm-objdump -l which is not common in test/DebugInfo. In fact, there is only one test using -S/--source/-l/--line-numbers, so I wonder whether it is the most appropriate testing approach here.

Perhaps this patch should test .loc instead.

dblaikie added inline comments.Nov 4 2020, 3:44 PM

This doesn't sound right - we can run ELF tests on non-ELF platforms. (I assume that's what's trying to be avoided/addressed by this?) Note all the other tests in this directory that don't have such UNSUPPORTED tagging.


If this is a general discussion of "What debug info related things should we test for bb-sections in the LLVM project" it'd be good to get a quick summary of what testing already exists.

But otherwise, broad testing I'd think:

  • llvm-symbolizer testing (check a couple of addresses in different bb sections, covering an inlined function)
  • llvm-dwarfdump of a linked executable showing bb section line table, DW_AT_ranges on the DW_TAG_subprogram

But maybe both of these tests are already checked in/implemented?

I don't think there's much need for Split DWARF-specific testing, as the Split DWARF handling of ranges is fairly orthogonal to where they appear (shouldn't be interesting to Split DWARF that the ranges appear on a DW_TAG_subprogram, I don't think).

tmsriram added inline comments.Nov 4 2020, 3:55 PM

Yes the llvm-dwarfdump and the split dwarf testing of DW_AT_ranges is already there: test/DebugInfo/X86/basic-block-sections_1.ll
I didnt add a llvm-symbolizer test, only did lldb tests. I can add a symbolizer test.

dblaikie added inline comments.Nov 4 2020, 4:01 PM

Could the coverage this new test is adding be added to the existing test? Looks like this new test is intended to cover the line table - which could be added to expanded coverage in the basic-block-sections_1.ll by dumping debug_line as well as debug_info (adding "-debug-line" to those existing dwarfdump commands)

snehasish updated this revision to Diff 303278.Nov 5 2020, 3:32 PM

Updates based on review comments.

  • Use llvm-dwarfdump --debug-line instead of llvm-objdump -l
  • Updated the checks, added line numbers to the source.
  • Removed unsupported tag, should no longer be required since we don't use llvm-objdump anymore.

Thanks for the review all. I've updated the test to use llvm-dwarfdump to check that the line table is as expected for the hot and cold parts.

PTAL @dblaikie @MaskRay


Removed, I think this was failing on windows due to the use of llvm-objdump. I'll keep an eye on the windows bot and double check.


The cold block is the one below, the modulus yields the remainder which is interpreted as true for the if condition.


I think there is value in having a simple test for the line table which many downstream tools rely on. We should add a line table test for basic block sections too.

dblaikie added inline comments.Nov 5 2020, 5:23 PM

Generally we'd test all the things related to a feature/new/interesting output in the same place. Sometimes worth splitting into multiple files, but there's some benefits to keeping it all together (can page in the context for one feature area, less test process overhead, etc). Admittedly, the tests aren't especially rigorously laid out by any means.

And I see I got this jumbled up between split-machine-functions and bb-sections. What's the difference between those two features? I /guess/ that split-machine-functions is a specific application of/builds on top of bb-sections?

snehasish added inline comments.Nov 5 2020, 6:15 PM

Yes, split-machine-functions is a specific application of basic block sections. The key difference here is the type of profile consumed to drive the layout decisions (FDO/AFDO vs Propeller). From the perspective of the machine function splitting pass this test ensures that the underlying mechanism, i.e. basic block sections updates debug information correctly. Thus I added an independent test. There is some duplication here and if you feel strongly we can just test the line table in the existing basic block sections. WDYT?

dblaikie added inline comments.Nov 5 2020, 7:39 PM

Yeah, seems like it's probably better to test this functionality down at the bb-sections level, since that's the functionality it's really testing/relying on. If several features are built on top of bb-sections, we don't want the fundamental testing to only be done via one of those features (if we then remove that feature - might lose the testing), and makes it clearer what testing covers what functionality/implementation code.

Looks like the debug info functionality being tested isn't specific to split-machine-functions, so I'd generally favor not testing it here and instead testing it with bb-sections. (if there's specific DWARF code/functionality only reachable through split-machine-functions, that should be tested here)

snehasish abandoned this revision.Nov 6 2020, 4:31 PM
snehasish added inline comments.

Sent out to check the line table for basic block sections.