debugserver and llvm

What is the status of using LLVM from debugserver? AFAICT, it doesn’t use llvm, but it DOES use some lldb private libraries, in which case it is already implicitly linking against LLVM anyway.

So why can’t LLVM headers be included and used from debugserver? Just now I was changing the signature of an LLDB function to include an llvm header, and I got everything working and ready to go but searched through code that doesn’t compile on Windows, and I noticed that debugserver includes some headers from lldb, and since those lldb headers are including llvm headers, I’m assuming this is not going to work. But I think I’m missing something, because AFAICT this will already cause a link dependency from debugserver to llvm, and has been for some time. So I’m not entirely sure what the status is of this.

In any case, I know the easy way out is to just say don’t include an llvm header from that lldb header, but I don’t think that’s a great idea as I think the patch I’m working on is a big win for performance, code readability, and simplicity.

It looks like there is already precedent for debugserver to copy some code from lldb and keep a local copy in debugserver, for example JSON.h and JSON.cpp seem to be copies of the code from lldb/Utility. Can this be done for StringExtractor.h as well so that I can reference llvm from within StringExtractor.h in lldb?

debugserver currently doesn't link against any of the llvm .a files so I don't think it can be using any llvm stuff unless it uses header file only inlined functions. We aren't going to spend any time on this and we have builds of debugserver that link against even less (debugserver-mini) that the normal debugserver. So I advise you don't change debugserver's link requirements as we build it in many different places and we don't always build llvm when we build, so debugserver can't have requirements to link against llvm or clang .a files.

For one I would prefer to leave StringExtractor alone. It uses the std::string to store the packet content and we want that the remain as is. I am fine with coming up with a replacement StringRefExtractor.h/.cpp that uses an llvm::StringRef that we cut over to using internally in LLDB, but again, for anyone needing the data to stay stored somewhere, they should use StringExtractor.cpp.

I don’t plan to change debugserver’s link requirements. What I’m saying is that debugserver is including StringExtractor.h cross-project from LLDB, and so even something as simple as including an LLVM header from StringExtractor.h will (if I understand correctly) break debugserver. If I’m correct, then I don’t think this is an acceptable limitation for an LLDB project header.

I have a patch locally which changes GetNameColonValue() to return two StringRefs instead of two std::strings, eliminating hundreds of string copies and is perfectly safe. So I don’t see this as a particularly controversial change to get into LLDB, but it will require debugserver to keep its own local copy of StringExtractor.h, similar to how it already does with JSON.h and JSON.cpp. I hoping to get this change in today since it is a strict improvement over the current StringExtractor.

There are still some additional improvements I would like to make independently of this initial change, and they do culminate in changing StringExtractor to store an llvm::StringRef. It turns out that while yes, it uses an std::string, I cannot find one single user (and I have looked at all of them) that depends on this. In every single case, it can use a StringRef with no ownership issues, and the number of string copies is further reduced. So I don’t see a convincing argument to keep this as storing a std::string. But maybe there is something I’m not aware of?

I don't plan to change debugserver's link requirements. What I'm saying is that debugserver is including StringExtractor.h cross-project from LLDB, and so even something as simple as including an LLVM header from StringExtractor.h will (if I understand correctly) break debugserver. If I'm correct, then I don't think this is an acceptable limitation for an LLDB project header.

Feel free to fix it and fixup the debugserver use. The intention was to be able to use StringExtractor in both LLDB and debugserver and to not require LLVM headers for this file only. I was trying to make sure we don't have two copies of a very similar class and have to fix bugs in two places, but I see your point about the file being in LLDB.

I have a patch locally which changes GetNameColonValue() to return two StringRefs instead of two std::strings, eliminating hundreds of string copies and is perfectly safe. So I don't see this as a particularly controversial change to get into LLDB, but it will require debugserver to keep its own local copy of StringExtractor.h, similar to how it already does with JSON.h and JSON.cpp. I hoping to get this change in today since it is a strict improvement over the current StringExtractor.

Feel free to do it all. I don't like having two copies of code and the original change where I started to use that was to avoid this, but I guess it will be back.

There are still some additional improvements I would like to make independently of this initial change, and they do culminate in changing StringExtractor to store an llvm::StringRef. It turns out that while yes, it uses an std::string, I cannot find one single user (and I have looked at all of them) that depends on this. In every single case, it can use a StringRef with no ownership issues, and the number of string copies is further reduced. So I don't see a convincing argument to keep this as storing a std::string. But maybe there is something I'm not aware of?

Just every packet handler for the GDB remote stuff. StringExtractorGDBRemote inherits from StringExtractor and uses the std::string to store the packet. Not to say that this can't be fixed with software.

I still vote to just make a StringRefExtractor.h/.cpp that completely cuts over to using llvm::StringRef only. We can cut over to using it everywhere. If nothing is left inside of LLDB, we can move StringExtractor.cpp/.h over into the debugserver code and have it gone from LLDB.

Making a StringRefExtractor, switching everything over to that, and then moving StringExtractor to debugserver once everything else is using StringRefExtractor seems like a reasonable approach

I think the easiest way to do this is to copy the current implementation to StdStringExtractor and then have debugserver use that. That only requires 1-2 lines of code change in debugserver, and no code change in LLDB. That way existing code all picks up the new llvm-based implementation, and I can work on it iteratively so I don’t have to go full StringRef right from the start (which turns into a massive changelist and makes bisecting a regression next to impossible).

That is fine.