forked from OSchip/llvm-project
66d03af88c
Recently there has been renewed interest in improving debug-info for variables that (partially or otherwise) live on the stack in optimised code. At the moment instcombine speculates that stack slots are probably going to be promoted to registers, and prepares the debug-info accordingly. It runs a function called LowerDbgDeclare which converts dbg.declares to a set of dbg.values after loads, and before stores and calls. Sometimes the stack location remains (e.g. for escaped locals). If any dbg.values become undef where the stack location is still valid we end up unnecessarily reducing variable location coverage due to our inability to track multiple locations simultaneously. There is a flag to disable this feature (-instcombine-lower-dbg-declare=0), which prevents this conversion at the cost of sometimes providing incorrect location info in the face of DSE, DCE, GVN, CSE etc. This has been discussed fairly extensively on PR34136. The idea of these tests is to provide examples of situations that we should consider when designing a new system, to aid discussions and eventually help evaluate the implementation. Dexter isn't ideal for observing specific optimisation behaviour. Writing an exaustive test suite would be difficult, and the resultant suite would be fragile. However, I think having some concrete executable examples is useful at least as a reference. Differential Revision: https://reviews.llvm.org/D89543 |
||
---|---|---|
.. | ||
dexter | ||
dexter-tests | ||
llgdb-tests | ||
llvm-prettyprinters/gdb | ||
win_cdb-tests | ||
CMakeLists.txt | ||
README.txt | ||
lit.cfg.py | ||
lit.site.cfg.py.in |
README.txt
-*- rst -*- This is a collection of tests to check debugging information generated by compiler. This test suite can be checked out inside clang/test folder. This will enable 'make test' for clang to pick up these tests. Some tests (in the 'llgdb-tests' directory) are written with debugger commands and checks for the intended debugger output in the source file, using DEBUGGER: and CHECK: as prefixes respectively. For example:: define i32 @f1(i32 %i) nounwind ssp { ; DEBUGGER: break f1 ; DEBUGGER: r ; DEBUGGER: p i ; CHECK: $1 = 42 entry: } is a testcase where the debugger is asked to break at function 'f1' and print value of argument 'i'. The expected value of 'i' is 42 in this case. Other tests are written for use with the 'Dexter' tool (in the 'dexter-tests' and 'dexter' directories respectively). These use a domain specific language in comments to describe the intended debugger experience in a more abstract way than debugger commands. This allows for testing integration across multiple debuggers from one input language. For example:: void __attribute__((noinline, optnone)) bar(int *test) {} int main() { int test; test = 23; bar(&test); // DexLabel('before_bar') return test; // DexLabel('after_bar') } // DexExpectWatchValue('test', '23', on_line='before_bar') // DexExpectWatchValue('test', '23', on_line='after_bar') Labels two lines with the names 'before_bar' and 'after_bar', and records that the 'test' variable is expected to have the value 23 on both of them.