I was thinking of a really trivial function that just returned an int or something. But then again, I don't really know how to write LLVM IR myself so I was just going off of what other people told me would be possible. I could be wrong :)
Maybe not worth worrying about if clang never generates this type of code anyway, just an idea. On Wed, Feb 3, 2016 at 1:35 PM Adrian Prantl <apra...@apple.com> wrote: > For context, here are the relevant LLVM discussions: > http://reviews.llvm.org/D16569 (D16569: Emit line 0 line information for > interesting 'orphan’ instructions) > http://reviews.llvm.org/D9887 [DebugInfo][FastISel] Prevent using debug > location from previous block for local values > > On Feb 3, 2016, at 12:56 PM, Zachary Turner <ztur...@google.com> wrote: > > (Also, if clang is not generating code like this currently, maybe it's not > a priority, but seems worth mentioning the technique anyway, since it could > have a lot of use for these types of scenarios) > > On Wed, Feb 3, 2016 at 12:54 PM Zachary Turner <ztur...@google.com> wrote: > >> I asked around a little bit, and it seems like you do this by >> hand-writing some LLVM IR (limiting yourself to a subset that is >> sufficiently platform independent) and having clang link that in alongside >> a regular executable. Then call your LLVM IR function from C++ and step >> over it. Would that work? >> > > LLVM IR is nowhere near platform independent enough for this to be > portable. Of course having a test for a single target is probably still > better than having no test. I’m not sure if the effort of maintaining > textual IR (which tends to change a lot) in the LLDB testsuite is worth it. > Another option (not any less messy) would be to compile the test to > assembler with -S insert a .loc 0 before assembling the file. > > -- adrian > > >> You'd probably need to talk to one of the LLVM guys to figure out how to >> do that, but it seems like it should work. >> >> Assuming it does, this technique would also open the door to writing a >> lot of test cases that have historically been very difficult to write (such >> as unwinder tests that need frames to be constructed a specific way, etc). >> >> >> >> On Tue, Feb 2, 2016 at 5:31 PM Jim Ingham <jing...@apple.com> wrote: >> >>> I don't think Clang does this right now, but Adrian says they are >>> considering doing it to solve some problems they have with keeping track of >>> nested inlines. >>> >>> Swift does it, but the compiler makes no guarantees as to when this will >>> happen. It isn't controlled by some pragma, builtin or whatever. So I >>> know some places where it will happen today, but there's no guarantee it >>> will continue to happen in the future. So I'll have to write a test that >>> works with the current compiler, and fails if the compiler changes so the >>> relevant function no longer has line number 0 code right after the >>> prologue. Yuck! >>> >>> I don't think it will be any different with clang when/if it starts >>> doing this. >>> >>> Jim >>> >>> >>> > On Feb 2, 2016, at 4:14 PM, Zachary Turner <ztur...@google.com> wrote: >>> > >>> > Shouldn't it be possible to force clang to generate code like this? >>> If so couldn't you write a test for this by stepping over a function call >>> which has this kind of code in it? >>> > >>> > On Tue, Feb 2, 2016 at 4:11 PM Jim Ingham via lldb-commits < >>> lldb-commits@lists.llvm.org> wrote: >>> > Author: jingham >>> > Date: Tue Feb 2 18:07:23 2016 >>> > New Revision: 259611 >>> > >>> > URL: http://llvm.org/viewvc/llvm-project?rev=259611&view=rev >>> > Log: >>> > The compiler may use "line number 0" to indicate compiler generated >>> goo that it can't >>> > track a source for. When we are pushing breakpoints and stepping past >>> function prologues, >>> > also push past code from line 0 immediately following the prologue end. >>> > >>> > <rdar://problem/23730696> >>> > >>> > Modified: >>> > lldb/trunk/include/lldb/Symbol/Function.h >>> > lldb/trunk/source/Symbol/Function.cpp >>> > >>> > Modified: lldb/trunk/include/lldb/Symbol/Function.h >>> > URL: >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Function.h?rev=259611&r1=259610&r2=259611&view=diff >>> > >>> ============================================================================== >>> > --- lldb/trunk/include/lldb/Symbol/Function.h (original) >>> > +++ lldb/trunk/include/lldb/Symbol/Function.h Tue Feb 2 18:07:23 2016 >>> > @@ -574,6 +574,14 @@ public: >>> > CompilerType >>> > GetCompilerType (); >>> > >>> > + >>> //------------------------------------------------------------------ >>> > + /// Get the size of the prologue instructions for this function. >>> The "prologue" >>> > + /// instructions include any instructions given line number 0 >>> immediately following >>> > + /// the prologue end. >>> > + /// >>> > + /// @return >>> > + /// The size of the prologue. >>> > + >>> //------------------------------------------------------------------ >>> > uint32_t >>> > GetPrologueByteSize (); >>> > >>> > >>> > Modified: lldb/trunk/source/Symbol/Function.cpp >>> > URL: >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Function.cpp?rev=259611&r1=259610&r2=259611&view=diff >>> > >>> ============================================================================== >>> > --- lldb/trunk/source/Symbol/Function.cpp (original) >>> > +++ lldb/trunk/source/Symbol/Function.cpp Tue Feb 2 18:07:23 2016 >>> > @@ -570,6 +570,8 @@ Function::GetPrologueByteSize () >>> > { >>> > m_flags.Set(flagsCalculatedPrologueSize); >>> > LineTable* line_table = m_comp_unit->GetLineTable (); >>> > + uint32_t prologue_end_line_idx = 0; >>> > + >>> > if (line_table) >>> > { >>> > LineEntry first_line_entry; >>> > @@ -578,9 +580,12 @@ Function::GetPrologueByteSize () >>> > { >>> > // Make sure the first line entry isn't already the >>> end of the prologue >>> > addr_t prologue_end_file_addr = LLDB_INVALID_ADDRESS; >>> > + addr_t line_zero_end_file_addr = LLDB_INVALID_ADDRESS; >>> > + >>> > if (first_line_entry.is_prologue_end) >>> > { >>> > prologue_end_file_addr = >>> first_line_entry.range.GetBaseAddress().GetFileAddress(); >>> > + prologue_end_line_idx = first_line_entry_idx; >>> > } >>> > else >>> > { >>> > @@ -595,6 +600,7 @@ Function::GetPrologueByteSize () >>> > if (line_entry.is_prologue_end) >>> > { >>> > prologue_end_file_addr = >>> line_entry.range.GetBaseAddress().GetFileAddress(); >>> > + prologue_end_line_idx = idx; >>> > break; >>> > } >>> > } >>> > @@ -607,7 +613,7 @@ Function::GetPrologueByteSize () >>> > { >>> > // Check the first few instructions and look for >>> one that has >>> > // a line number that's different than the first >>> entry. >>> > - const uint32_t last_line_entry_idx = >>> first_line_entry_idx + 6; >>> > + uint32_t last_line_entry_idx = >>> first_line_entry_idx + 6; >>> > for (uint32_t idx = first_line_entry_idx + 1; idx >>> < last_line_entry_idx; ++idx) >>> > { >>> > LineEntry line_entry; >>> > @@ -616,6 +622,7 @@ Function::GetPrologueByteSize () >>> > if (line_entry.line != >>> first_line_entry.line) >>> > { >>> > prologue_end_file_addr = >>> line_entry.range.GetBaseAddress().GetFileAddress(); >>> > + prologue_end_line_idx = idx; >>> > break; >>> > } >>> > } >>> > @@ -624,10 +631,37 @@ Function::GetPrologueByteSize () >>> > if (prologue_end_file_addr == >>> LLDB_INVALID_ADDRESS) >>> > { >>> > prologue_end_file_addr = >>> first_line_entry.range.GetBaseAddress().GetFileAddress() + >>> first_line_entry.range.GetByteSize(); >>> > + prologue_end_line_idx = first_line_entry_idx; >>> > } >>> > } >>> > + >>> > const addr_t func_start_file_addr = >>> m_range.GetBaseAddress().GetFileAddress(); >>> > const addr_t func_end_file_addr = >>> func_start_file_addr + m_range.GetByteSize(); >>> > + >>> > + // Now calculate the offset to pass the subsequent >>> line 0 entries. >>> > + uint32_t first_non_zero_line = prologue_end_line_idx; >>> > + while (1) >>> > + { >>> > + LineEntry line_entry; >>> > + if >>> (line_table->GetLineEntryAtIndex(first_non_zero_line, line_entry)) >>> > + { >>> > + if (line_entry.line != 0) >>> > + break; >>> > + } >>> > + if >>> (line_entry.range.GetBaseAddress().GetFileAddress() >= func_end_file_addr) >>> > + break; >>> > + >>> > + first_non_zero_line++; >>> > + } >>> > + >>> > + if (first_non_zero_line > prologue_end_line_idx) >>> > + { >>> > + LineEntry first_non_zero_entry; >>> > + if >>> (line_table->GetLineEntryAtIndex(first_non_zero_line, first_non_zero_entry)) >>> > + { >>> > + line_zero_end_file_addr = >>> first_non_zero_entry.range.GetBaseAddress().GetFileAddress(); >>> > + } >>> > + } >>> > >>> > // Verify that this prologue end file address in the >>> function's >>> > // address range just to be sure >>> > @@ -635,10 +669,16 @@ Function::GetPrologueByteSize () >>> > { >>> > m_prologue_byte_size = prologue_end_file_addr - >>> func_start_file_addr; >>> > } >>> > + >>> > + if (prologue_end_file_addr < line_zero_end_file_addr >>> && line_zero_end_file_addr < func_end_file_addr) >>> > + { >>> > + m_prologue_byte_size += line_zero_end_file_addr - >>> prologue_end_file_addr; >>> > + } >>> > } >>> > } >>> > } >>> > - return m_prologue_byte_size; >>> > + >>> > + return m_prologue_byte_size; >>> > } >>> > >>> > lldb::LanguageType >>> > >>> > >>> > _______________________________________________ >>> > lldb-commits mailing list >>> > lldb-commits@lists.llvm.org >>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits >>> >>>
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits