[Lldb-commits] [PATCH] D31172: Move stop info override callback code from ArchSpec into Process

Zachary Turner via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Tue Oct 24 14:47:53 PDT 2017


zturner added inline comments.


================
Comment at: source/Core/PluginManager.cpp:281
+struct ArchitectureInstance {
+  ConstString name;
+  std::string description;
----------------
zturner wrote:
> labath wrote:
> > clayborg wrote:
> > > zturner wrote:
> > > > Why do we need a `ConstString` and a `std::string` here?  I don't think any plugin ever has a dynamically generated name or description, they exclusively originate from string literals.  So, with that in mind, can both of these just be `StringRef`?
> > > ConstString makes for faster lookups. Many plugins can ask for a plug-in by name, so ConstString works well in that regard.
> > They, could be, but I don't see a way to enforce that the names come from string literals, which makes me wonder if the usage of StringRef is a win in this case...
> > 
> > IIRC, the main reason I made this ConstString (instead of std::string, like the description), is that this name eventually makes it's way to the PluginInterface virtual method (which cannot be changed without touching every plugin).
> I don't think we need to enforce it.  Documentation is good enough.  If someone accepts a `StringRef` to a function, you, as the caller of the function, cannot enforce what they do with it.  They could store a pointer to it.  That doesn't mean you should never pass in a `std::string` and let the implicit conversion happen, it just means you have to follow the contract.  Same could happen if your function took a `const std::string&`. 
>  Documenting the top level interface to say "The  memory for this string is assumed to live for the life of the program" should be sufficient.
> 
> If someone needs to do something funky and construct a name dynamically, they can make their plugin contain an `llvm::StringSaver` and get a stable pointer that way.
I'm not convinced it makes for faster lookups, because while true that it is "just" a pointer comparison, it is a pointer comparison that involves taking a global mutex.

In the case of `StringRef` constructed from a string literal (which as I mentioned, is I believe 100% of usage today), `StringRef` will be faster, because it will pass an unguarded pointer comparison.  Only if the pointer comparisons fail does `StringRef` fall back to `memcmp`  (or at least, it *should* work that way, if it doesn't we can make it)


================
Comment at: source/Core/PluginManager.cpp:282
+  ConstString name;
+  std::string description;
+  PluginManager::ArchitectureCreateInstance create_callback;
----------------
clayborg wrote:
> We need "std::string" since it owns the storage. Most people do init this with a const string, but they don't need to. ConstString doesn't work here because we never will search for a description. StringRef doesn't own the storage, so I would rather avoid StringRef unless you can guarantee no one can construct a StringRef with local data.
But why do you need to own the storage of a string literal?  The binary already owns that storage.  Just document in the API that it needs to be stable storage, since that covers 100% of existing use cases.  And if someone needs something else they can use an `llvm::StringSaver`


https://reviews.llvm.org/D31172





More information about the lldb-commits mailing list