> On Aug 26, 2016, at 6:12 PM, Zachary Turner via lldb-dev 
> <lldb-dev@lists.llvm.org> wrote:
> 
> Back to the formatting issue, there's a lot of code that's going to look bad 
> after the reformat, because we have some DEEPLY indented code.  LLVM has 
> adopted the early return model for this reason.  A huge amount of our deeply 
> nested code could be solved by using early returns.  For example, here's some 
> code in a function I was just looking at:
> 
>     // The 'A' packet is the most over designed packet ever here with
>     // redundant argument indexes, redundant argument lengths and needed hex
>     // encoded argument string values. Really all that is needed is a comma
>     // separated hex encoded argument value list, but we will stay true to the
>     // documented version of the 'A' packet here...
> 
>     Log *log (GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS));
>     int actual_arg_index = 0;
> 
>     packet.SetFilePos(1); // Skip the 'A'
>     bool success = true;
>     while (success && packet.GetBytesLeft() > 0)
>     {
>         // Decode the decimal argument string length. This length is the
>         // number of hex nibbles in the argument string value.
>         const uint32_t arg_len = packet.GetU32(UINT32_MAX);
>         if (arg_len == UINT32_MAX)
>             success = false;
>         else
>         {
>             // Make sure the argument hex string length is followed by a comma
>             if (packet.GetChar() != ',')
>                 success = false;
>             else
>             {
>                 // Decode the argument index. We ignore this really because
>                 // who would really send down the arguments in a random 
> order???
>                 const uint32_t arg_idx = packet.GetU32(UINT32_MAX);
>                 if (arg_idx == UINT32_MAX)
>                     success = false;
>                 else
>                 {
>                     // Make sure the argument index is followed by a comma
>                     if (packet.GetChar() != ',')
>                         success = false;
>                     else
>                     {
>                         // Decode the argument string value from hex bytes
>                         // back into a UTF8 string and make sure the length
>                         // matches the one supplied in the packet
>                         std::string arg;
>                         if (packet.GetHexByteStringFixedLength(arg, arg_len) 
> != (arg_len / 2))
>                             success = false;
>                         else
>                         {
>                             // If there are any bytes left
>                             if (packet.GetBytesLeft())
>                             {
>                                 if (packet.GetChar() != ',')
>                                     success = false;
>                             }
> 
>                             if (success)
>                             {
>                                 if (arg_idx == 0)
>                                     
> m_process_launch_info.GetExecutableFile().SetFile(arg.c_str(), false);
>                                 
> m_process_launch_info.GetArguments().AppendArgument(arg.c_str());
>                                 if (log)
>                                     log->Printf ("LLGSPacketHandler::%s added 
> arg %d: \"%s\"", __FUNCTION__, actual_arg_index, arg.c_str ());
>                                 ++actual_arg_index;
>                             }
>                         }
>                     }
>                 }
>             }
>         }
>     }
> 
> 
> 
> Whether we like early return or not, it is the LLVM Style, and when you have 
> to deal with an 80 column wrapping limitation, it definitely helps.  For 
> example, the above function becomes:

Since you’re going with the LLVM style, just a few notes (maybe you quickly 
added the early return without clang-formatting): 

> 
>     // The 'A' packet is the most over designed packet ever here with
>     // redundant argument indexes, redundant argument lengths and needed hex
>     // encoded argument string values. Really all that is needed is a comma
>     // separated hex encoded argument value list, but we will stay true to the
>     // documented version of the 'A' packet here...
> 
>     Log *log (GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS));
>     int actual_arg_index = 0;
> 
>     packet.SetFilePos(1); // Skip the 'A'
>     while (packet.GetBytesLeft() > 0)
>     {

Actually I believe the opening bracket here should be on the same line as the 
while.

>         // Decode the decimal argument string length. This length is the
>         // number of hex nibbles in the argument string value.
>         const uint32_t arg_len = packet.GetU32(UINT32_MAX);
>               if (arg_len == UINT32_MAX)

Any reason the if isn’t on the same indentation as the previous line? (As for 
almost every other if apparently)

>                       return false;
>         // Make sure the argument hex string length is followed by a comma
>               if (packet.GetChar() != ',')
>                       return false;
> 
>         // Decode the argument index. We ignore this really because
>         // who would really send down the arguments in a random order???
>         const uint32_t arg_idx = packet.GetU32(UINT32_MAX);
>               if (arg_idx == UINT32_MAX)
>                       return false;
> 
>         // Make sure the argument index is followed by a comma
>               if (packet.GetChar() != ',')
>                       return false;
>         // Decode the argument string value from hex bytes
>         // back into a UTF8 string and make sure the length
>         // matches the one supplied in the packet
>         std::string arg;
>               if (packet.GetHexByteStringFixedLength(arg, arg_len) != 
> (arg_len / 2))
>                       return false;
>         // If there are any bytes left
>         if (packet.GetBytesLeft())
>         {
>           if (packet.GetChar() != ',')
>               return false;
>         }

No brackets.

> 
>         if (arg_idx == 0)
>             m_process_launch_info.GetExecutableFile().SetFile(arg.c_str(), 
> false);
>         m_process_launch_info.GetArguments().AppendArgument(arg.c_str());
>         if (log)
>             log->Printf ("LLGSPacketHandler::%s added arg %d: \"%s\"", 
> __FUNCTION__, actual_arg_index, arg.c_str ());
>         ++actual_arg_index;
>     }
> 
> This saves 24 columns!, which is 30% of the usable screen space in an 
> 80-column environment.

That’s a great motivating example to illustrate the “early return” motivation 
in llvm.

— 
Mehdi


> 
> On Thu, Aug 25, 2016 at 1:05 PM Zachary Turner <ztur...@google.com 
> <mailto:ztur...@google.com>> wrote:
> Definitely agree we can't map everything to that model. I can imagine a first 
> step towards lit being where all our tests are literally exactly the same as 
> they are today, with Makefiles and all, but where lit is used purely to 
> recurse the directory tree, run things in multiple processes, and spawn 
> workers.
> 
> Lit should be flexible enough to support this.
> 
> As a further step, imagine rewriting most tests as inline tests like 
> lldbinline. Lit can support this too, the parsing and file commands are all 
> up to the implementation. So the existing model of run tool and grep output 
> is just one implementation of that, but you could design one that has build 
> commands, c++ source, and Python all in one file, or even intermingled like 
> in an lldbinline test
> 
> 
> On Thu, Aug 25, 2016 at 12:54 PM Todd Fiala <todd.fi...@gmail.com 
> <mailto:todd.fi...@gmail.com>> wrote:
> On Mon, Aug 8, 2016 at 2:57 PM, Zachary Turner via lldb-dev 
> <lldb-dev@lists.llvm.org <mailto:lldb-dev@lists.llvm.org>> wrote:
> 
> 
> On Mon, Aug 8, 2016 at 2:40 PM Kate Stone via lldb-dev 
> <lldb-dev@lists.llvm.org <mailto:lldb-dev@lists.llvm.org>> wrote:
> LLDB has come a long way since the project was first announced.  As a robust 
> debugger for C-family languages and Swift, LLDB is constantly in use by 
> millions of developers.  It has also become a foundation for bringing up 
> debugger support for other languages like Go and RenderScript.  In addition 
> to the original macOS implementation the Linux LLDB port is in active use and 
> Windows support has made significant strides.  IDE and editor integration via 
> both SB APIs and MI have made LLDB available to even more users.  It’s 
> definitely a project every contributor can be proud of and I’d like to take a 
> moment to thank everyone who has been involved in one way or another.
> 
> It’s also a project that shows some signs of strain due to its rapid growth.  
> We’ve accumulated some technical debt that must be paid off, and in general 
> it seems like a good time to reflect on where we'll be headed next.  We’ve 
> outlined a few goals for discussion below as well as one more short-term 
> action.  Discussion is very much encouraged.
> 
> Forward-Looking Goals
> 
>    1. Testing Strategy Evaluation
> 
> Keeping our code base healthy is next to impossible without a robust testing 
> strategy.  Our existing suite of tests is straightforward to run locally, and 
> serves as a foundation for continuous integration.  That said, it is 
> definitely not exhaustive.  Obvious priorities for improvement include 
> gathering coverage information, investing in more conventional unit tests in 
> addition to the suite of end-to-end tests, and introducing tests in code 
> bases where we depend on debugger-specific behavior (e.g.: for expression 
> evaluation.)
> I know this is going to be controversial, but I think we should at least do a 
> serious evaluation of whether using the lit infrastructure would work for 
> LLDB.  Conventional wisdom is that it won't work because LLDB tests are 
> fundamentally different than LLVM tests.  I actually completely agree with 
> the latter part.  They are fundamentally different.
> 
> However, we've seen some effort to move towards lldb inline tests, and in a 
> sense that's conceptually exactly what lit tests are.  My concern is that 
> nobody with experience working on LLDB has a sufficient understanding of what 
> lit is capable of to really figure this out.
> 
> I know when I mentioned this some months ago Jonathan Roelofs chimed in and 
> said that he believes lit is extensible enough to support LLDB's use case.  
> The argument -- if I remember it correctly -- is that the traditional view of 
> what a lit test (i.e. a sequence of commands that checks the output of a 
> program against expected output) is one particular implementation of a 
> lit-style test.  But that you can make your own which do whatever you want.
> 
> 
> I have some interest in looking into this.  Kate and I had talked about it as 
> a possible investigation back a few months ago.  I'd be happy if we could 
> reduce the overall complexity of building high quality tests.  I'd be 
> particularly interested in learning more about the alternative workflow that 
> isn't just "run/check/run/check", as I don't think we can map everything to 
> that model.  I may take an action item on this in the near future.
>  
> This would not just be busy work either.  I think everyone involved with LLDB 
> has experienced flakiness in the test suite.  Sometimes it's flakiness in 
> LLDB itself, but sometimes it is flakiness in the test infrastructure.  It 
> would be nice to completely eliminate one source of flakiness.
> 
> I think it would be worth having some LLDB experts sit down in person with 
> some lit experts and brainstorm ways to make LLDB use lit.  
> 
> Certainly it's worth a serious look, even if nothing comes of it.
> 
>  
>    4. Good Citizenship in the LLVM Community
> 
> Last, but definitely not least, LLDB should endeavor to be a good citizen of 
> the LLVM community.  We should encourage developers to think of the 
> technology stack as a coherent effort, where common code should be introduced 
> at an appropriate level in the stack.  Opportunities to factor reusable 
> aspects of the LLDB code base up the stack into LLVM will be pursued.
> 
> One arbitrary source of inconsistency at present is LLDB’s coding standard.  
> That brings us to…
> 
> Near-Term Goal: Standardizing on LLVM-style clang-format Rules
> 
> We’ve heard from several in the community that would prefer to have a single 
> code formatting style to further unify the two code bases.  Using 
> clang-format with the default LLVM conventions would simplify code migration, 
> editor configuration, and coding habits for developers who work in multiple 
> LLVM projects.  There are non-trivial implications to reformatting a code 
> base with this much history.  It can obfuscate history and impact downstream 
> projects by complicating merges.  Ideally, it should be done once with as 
> much advance notice as is practical.  Here’s the timeline we’re proposing:
> 
> Today - mechanical reformatting proposed, comment period begins
> 
> To get a preview of what straightforward reformatting of the code looks like, 
> just follow these steps to get a clean copy of the repository and reformat it:
> Check out a clean copy of the existing repository
> Edit .clang-format in the root of the tree, remove all but the line 
> “BasedOnStyle: LLVM”
> Change your current working directory to the root of the tree to reformat
> Double-check to make sure you did step 3 ;-)
> Run the following shell command: "find . -name "*.[c,cpp,h] -exec 
> clang-format -i {} +"
> Very excited about this one, personally.  While I have my share of qualms 
> with LLVM's style, the benefit of having consistency is hard to overstate.  
> It greatly reduces the effort to switch between codebases, a direct 
> consequence of which is that it encourages people with LLVM expertise to jump 
> into the LLDB codebase, which hopefully can help to tear down the invisible 
> wall between the two.
> 
> As a personal aside, this allows me to go back to my normal workflow of 
> having 3 edit source files opened simultaneously and tiled horizontally, 
> which is very nice. 
> 
> 
> _______________________________________________
> lldb-dev mailing list
> lldb-dev@lists.llvm.org <mailto:lldb-dev@lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev 
> <http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev>
> 
> 
> 
> 
> -- 
> -Todd
> _______________________________________________
> lldb-dev mailing list
> lldb-dev@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to