tfiala added a comment. In https://reviews.llvm.org/D26093#582659, @beanz wrote:
> In https://reviews.llvm.org/D26093#582618, @tfiala wrote: > > > The current usage of CommandLine via global static constructors in > > Debug.cpp seems like a poor choice, as it forces all users of llvm with > > NDEBUG not defined to get some command line behavior that they may never > > use. Maybe some aspect of that can be made lazy? > > > It can't be made lazy without completely re-designing how cl::opt works. > Which is something I've had lengthy discussions with Chandler about. > Currently the biggest issue with fixing it relates to how the new pass > manager works. Specifically in order to provide meaningful -help output we > need a way to register command line options in passes, which we have today, > but won't with the new pass manager. > > It is an open problem that we're trying to come up with a solution to. Cool - glad to see some thought is going into it. On other projects where there are firewalls between linkage domains, I've had one subsystem on one side to be initialized with a pointer to the storage location(s) on the other, by way of an init() routine that is called by a third party passing it over the barrier. Something like this, in terms of our problem here (pseudo-code and maybe wrong naming convention!): // in lldb-mi::main(), main binary int main() { // Ask lldb-mi's local llvm's CommandLine to return a handle to its internal data structures, // and pass that to the agent that controls the llvm embedded in liblldb. liblldbInitCommandLine(cl::CommandLine::GetHandle()); ... } // in liblldb so/dylib/dll, exported method: void liblldbInitCommandLine(void *commandLineHandle) { // Pass the given opaque handle to the LLVM CommandLine embedded in liblldb. cl::CommandLine::SetHandle(commandLineHandle); } // in CommandLine void *CommandLine::GetHandle() { return static_cast<void*>(my_internal_pimpl); } void CommandLine::SetHandle(void *external_pimpl_to_use_here) { // Make concurrency safe if desired... // Merge existing results with those present in the passed in version, if desired (see below) delete my_internal_pimpl; my_internal_pimpl = (some_type*)(external_pimpl_to_use_here); } The trick to this working, though, is to not have uncontrolled, global static initializers permuting these on both sides until after the dance of synchronizing their storage explicitly. And that isn't the case here. We can probably work around it with 'debug' since we know both sides will do it, and so there is no race to avoid. But if other clients on either side do the same thing, we can lose them. Unless, we have some kind of merge semantics on the SetHandle(void*) call, which I suppose could be done to collate any items that were initialized on either side. Anyways, food for thought... I'm not thrilled with the manual aspect of it, but I have used it in production. >> Unless there is strong opposition, I'd like to put this in. > > No objection from me. Okay - Pavel seemed alright enough with it for the time being as well, so I'll put this in, with the one wording correction I called out above. https://reviews.llvm.org/D26093 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits