> On Feb 3, 2016, at 1:58 PM, Zachary Turner <ztur...@google.com> wrote:
> 
> 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 :)

I’m not saying that it is impossible to find such a function, but keep in mind 
that even the size of int is baked into the IR.

-- adrian

> 
> 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 
> <mailto:apra...@apple.com>> wrote:
> For context, here are the relevant LLVM discussions:
> http://reviews.llvm.org/D16569 <http://reviews.llvm.org/D16569> (D16569: Emit 
> line 0 line information for interesting 'orphan’ instructions)
> http://reviews.llvm.org/D9887 <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 
>> <mailto: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 
>> <mailto: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 
>> <mailto: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 
>> > <mailto: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 <mailto: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 
>> > <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
>> >  
>> > <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
>> >  
>> > <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 <mailto:lldb-commits@lists.llvm.org>
>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits 
>> > <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

Reply via email to