BTW, I'm interested to know if you have some analysis which leads you to think 
that propagating unchecked errors actually is a big problem in lldb, or are you 
just doing this to remove a spelling collision?  I see a lot of bugs for lldb 
come by, but I really haven't seen many that this sort of forced checking would 
have fixed.

Jim


> On May 1, 2017, at 12:36 PM, Jim Ingham <jing...@apple.com> wrote:
> 
>> 
>> On May 1, 2017, at 11:48 AM, Zachary Turner <ztur...@google.com> wrote:
>> 
>> 
>> 
>> On Mon, May 1, 2017 at 11:28 AM Jim Ingham <jing...@apple.com> wrote:
>> I'm mostly but not entirely tongue in cheek wondering why we aren't calling 
>> llvm::Error llvm::LLVMError, as the lldb error class much preceded it, but 
>> that's a minor point.
>> FWIW I think the naming chosen by LLVM is correct.  It's intended to be a 
>> generic utility class, extensible enough to be used by anything that links 
>> against LLVM.  As such, calling it LLVMError kind of gives off the false 
>> impression that it should only be used by errors that originate from LLVM, 
>> when in fact it's much more general purpose.
>> 
>> 
>> If it is actually causing confusion (I haven't experienced such yet) I don't 
>> mind typing some extra letters.
>> I think that's in part because llvm::Error isn't very prevalent inside of 
>> LLDB (yet).
>> 
>> 
>> As we've discussed several times in the past, we often use errors for 
>> informational purposes (for instance in the ValueObject system) with no 
>> programmatic requirement they be checked.  So the llvm::Error class is not a 
>> drop-in replacement for our uses of lldb_private::Error in subset of its 
>> uses.  More generally, the environment the debugger lives in is often pretty 
>> dirty, bad connections to devices, uncertain debug information, arguments 
>> with clang about what types mean, weird user input, etc.  But the job of the 
>> debugger is to keep going as well/long as it can in the face of this. For 
>> something like a compiler, if some operation goes bad that whole execution 
>> is likely rendered moot, and so bagging out early is the right thing to do.  
>> For lldb, if the debug info for a frame is all horked up, users can still 
>> resort to memory reading and casts, or some other workaround, provided the 
>> debugger stays alive.  This makes me a little leery of adopting an 
>> infrastructure whose default action is to abort on mishandling.
>> Just re-iterating from previous discussions, but it only does that in debug 
>> mode.  When you have a release build, it will happily continue on without 
>> aborting.  The point of all this is that you catch unhandled errors 
>> immediately the first time you run the test suite.
> 
> Yup, we do that for assertions.  But asserting isn't appropriate even in the 
> testsuite for cases where we don't require the errors be checked.
> 
>> 
>> Even if you have a bad connection, uncertain debug information, etc you 
>> still have to propagate that up the callstack some number of levels until 
>> someone knows what to do.  All this class does is make sure (when in debug 
>> mode) that you're doing that instead of silently ignoring some condition.
>> 
>> That said, it certainly seems plausible that we could come up with some kind 
>> of abstraction for informational status messages.  With that in mind, I'll 
>> change my original renaming proposal from LLDBError to Status.  This way we 
>> will have llvm::Error and lldb_private::Status.
> 
> That seems better.
> 
>> 
>> In the future, perhaps we can discuss with Lang and the larger community 
>> about whether such a class makes in LLVM as well.  Maybe there's a way to 
>> get both checked and unchecked errors into LLVM using a single consistent 
>> interface.  But at least then the person who generates the error is 
>> responsible for deciding how important it is.
>> 
> 
> It's not "how important it is" but "does this error need to be dealt with 
> programmatically proximate to the code that produces it."  For instance, if 
> an error makes it to the SB API level - something that is quite appropriate 
> for the SBValues for instance, we wouldn't want to use an llvm::Error.  After 
> all forcing everybody to check this at the Python layer would be really 
> annoying.  I guess you could work around this by hand-checking off any error 
> when you go from lldb_private -> SBError.  But that seems like now you're 
> just pretending to be doing something you aren't, which I don't think is 
> helpful.
> 
> Probably better as you say to make everything into lldb_private::Status 
> behaving as it does now, to side-step the name collision, and then start with 
> all the uses where the error doesn't propagate very far, and try converting 
> those to use llvm::Error and working judiciously out from there.  'Course you 
> can't change the SB API names, so there will always be a little twist there.  
> 
> Jim
> 
>> 
>> 
>> BTW, I don't think the comment Lang cited had to do with replacing the 
>> errors with some other error backend.  It was more intended to handle a 
>> problem that came up with gdb where we tried to multiplex all various system 
>> error numbers into one single error.  lldb errors have a flavor 
>> (eErrorTypePosix, eErrorTypeWin32, etc) which allows you to use each native 
>> error number by annotating it with the flavor.  
>> 
>> FWIW, using the llvm::Error model, the way this is handled is by doing 
>> something like this:
>> 
>> return make_error<WindowsError>(::GetLastError());
>> 
>> return make_error<ErrnoError>(errno);
>> 
>> but it is general enough to handle completely different categories of errors 
>> as well, so you can "namespace" out your command interpreter errors, debug 
>> info errors, etc.
>> 
>> return make_error<CommandInterpreterError>("Incorrect command usage");
>> 
>> return make_error<DWARFFormatError>("Invalid DIE specification");
>> 
>> etc 

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

Reply via email to