> On Feb 15, 2017, at 10:30 AM, Zachary Turner <ztur...@google.com> wrote:
> 
> Yes.  In some cases I want to try deleting LLDB's implementation and seeing 
> if we can fall back on LLVM.  For example, MemoryMapFileContents comes to 
> mind.  LLVM has some code to memory map files as well.  I've spent 0 time 
> looking into how widely FileSpec::MemoryMapFileContents is used, so it's 
> possible that after 1 minute I realize it's not possible / too much work.  
> But I'd like to at least do due diligence and see if there's any parts of the 
> FileSpec interface that can be removed in favor of LLVM classes first.

I am fine with switching mmap over to llvm if it works. One important thing to 
LLDB is we have a "mmap if not on remote file system" that must continue to 
work. If you mmap something from a network drive and then it gets disconnected, 
you can crash LLDB. So we have a function we used that implements mmap if 
local, read all contents if remote, that must work to avoid crashes.

Greg

> 
> On Wed, Feb 15, 2017 at 10:20 AM Greg Clayton <gclay...@apple.com 
> <mailto:gclay...@apple.com>> wrote:
>> On Feb 15, 2017, at 10:14 AM, Zachary Turner <ztur...@google.com 
>> <mailto:ztur...@google.com>> wrote:
>> 
>> I think the main improvement that it provides is that you need *something* 
>> which represents only a path.  Because we use FileSpecs to refer to paths on 
>> remote machines, and then what does it mean to call Exists or Resolve?  So, 
>> we could have something like PathSpec and then have FileSpec contain a 
>> PathSpec, and PathSpec's only purpose would be to know about the grammar of 
>> a path.
> 
> Agreed. Are you ok with starting with moving as much stuff from FileSpec over 
> into File to start with?
> 
>> 
>> I agree though, in the spirit of doing things incrementally, purely moving 
>> things around and not making major substantive changes is a good starting 
>> point and reduces the scope of the problem.
> 
> Agreed.
> 
>> 
>> On Wed, Feb 15, 2017 at 10:07 AM Greg Clayton <gclay...@apple.com 
>> <mailto:gclay...@apple.com>> wrote:
>> I would prefer things stay object oriented when possible. I don't think it 
>> adds anything by making everything a static function. It is ok where it 
>> makes sense, but I would vote to add static functions in the FileSpec class 
>> over making purely stand alone functions as they indicate that it should be 
>> used on a FileSpec object. It is also ok to have both methods and static 
>> functions where the methods (like AppendPathComponent() can call through to 
>> the static versions if needed.
>> 
>> We also have the "File.h" class that defines lldb_private::File. This is the 
>> object that wraps the access to the data in the file (the file descriptor 
>> integers and the "FILE *" abstraction. It would be interesting to move any 
>> functions in lldb_private::FileSpec, like the mmap functions, over into 
>> lldb_private::File where needed. And then see if there is even a need for 
>> the FileSystem class at all. If there is we can divvy it up as needed.
>> 
>> I would say lets start with purely moving things around and get the file 
>> locations all set and the correct abstractions where FileSpec is for 
>> representing a file specification efficiently and all operations on that 
>> affect file spec mutations, moving anything that is accessing file contents 
>> over into lldb_private::File, and then seeing if we have any functions left 
>> over and if we even need FileSystem.
>> 
>> That being said I generally find it useful to do something like:
>> 
>> FileSpec f("/tmp/a.txt");
>> if (f.Exists())
>>    ...
>> 
>> 
>> It seems like the suggestions would be to move to something like:
>> 
>> FileSpec f("/tmp/a.txt");
>> if (File::Exists(f))
>>    ...
>> 
>> Both are fine, but the latter is much less discoverable. Think about when 
>> you use IDEs with auto completion. So while it might be cleaner from a code 
>> linking standpoint, I don't think it actually improves the code for users. I 
>> much prefer the object oriented methodology and I would prefer code linking 
>> considerations don't override the clean API we currently have.
>> 
>> > On Feb 15, 2017, at 8:05 AM, Pavel Labath via lldb-dev 
>> > <lldb-dev@lists.llvm.org <mailto:lldb-dev@lists.llvm.org>> wrote:
>> >
>> > I prefer free functions as well, but I think switching FileSpec to
>> > that would be a non-trivial task. If you want to try it out I would
>> > encourage it, but I don't think it's a requirement.
>> >
>> > On 15 February 2017 at 15:41, Zachary Turner <ztur...@google.com 
>> > <mailto:ztur...@google.com>> wrote:
>> >> Having FileSpec in Utility and FileSystem in Host would work for now.
>> >>
>> >> Any opinions on the FileSpec interface? Llvm's path and file system
>> >> libraries use free functions for everything. in a perfect world I feel
>> >> that's the best design, and with lldb we could even do slightly better and
>> >> make all functions pure (returning copies instead of mutating) since
>> >> everything is ConstString.
>> >>
>> >> If we were starting over from scratch this would definitely be the way to 
>> >> go
>> >> imo, but I'm not sure if it's worth the effort now. What do you think?
>> >>
>> >> On Wed, Feb 15, 2017 at 7:34 AM Pavel Labath <lab...@google.com 
>> >> <mailto:lab...@google.com>> wrote:
>> >>>
>> >>> Right, I see. In that case, I guess my response would be "let's wait
>> >>> and see how things look like after FileSpec is moved".
>> >>>
>> >>> I kinda like how we have the all the host code in a separate module (I
>> >>> expect we will have a lot more of it than llvm), but I am not against
>> >>> it if it turns out there is no other way to organize dependencies. I
>> >>> just don't think we've reached that point yet -- right now I don't see
>> >>> why we couldn't have FileSpec in Utility and FileSystem in Host.
>> >>>
>> >>> Or have you thought ahead and found a problem already?
>> >>>
>> >>>
>> >>> On 15 February 2017 at 15:17, Zachary Turner <ztur...@google.com 
>> >>> <mailto:ztur...@google.com>> wrote:
>> >>>> Yes, in fact that mirrors how i had planned to tackle this.
>> >>>>
>> >>>> The question is, can we put in Utility code that is separated by
>> >>>> platform,
>> >>>> which typically has been for Host? This mirrors what llvm does
>> >>>> On Wed, Feb 15, 2017 at 6:29 AM Pavel Labath <lab...@google.com 
>> >>>> <mailto:lab...@google.com>> wrote:
>> >>>>>
>> >>>>> I agree that the next module that needs figuring on is the host one.
>> >>>>> However I am not sure if the decision on what to put in what module
>> >>>>> should be motivated by the FileSpec class, as I think it's current
>> >>>>> interface has a some issues, and our choice on how to resolve them can
>> >>>>> greatly affect what things it depends on.
>> >>>>>
>> >>>>> The main thing that bugs me with FileSpec is that it is used for a two
>> >>>>> distinct purposes:
>> >>>>> - manipulations on abstract path names (e.g. PrependPathComponent)
>> >>>>> - manipulations of actual files present on the host (e.g.
>> >>>>> MemoryMapFileContents)
>> >>>>> For the first one you don't need the files to exist on the host (in
>> >>>>> fact they may not even use the same path syntax as the host). For the
>> >>>>> other one, they *must* exist and *must* use the same path syntax. This
>> >>>>> is currently not very well separated and enforced, and I think it
>> >>>>> should be. I believe this is the reason the FileSystem pseudo-class
>> >>>>> was created.
>> >>>>>
>> >>>>> So, my counter-proposal would be to finish moving the host-specific
>> >>>>> things out of the FileSpec class (basically just replace
>> >>>>> file_spec.Foo(...) with FileSystem::Foo(file_spec, ...). At that point
>> >>>>> FileSpec should only depend on string manipulation functions, and we
>> >>>>> should be able to move it without much hassle. After that, we can take
>> >>>>> another look and decide what to do next.
>> >>>>>
>> >>>>> The thing I really like about this idea is that we will end up with
>> >>>>> two classes that very closely mirror llvm functionality (FileSpec is a
>> >>>>> version of Support/Path.h that does not assume host path syntax,
>> >>>>> FileSystem is similar to Support/FileSystem.h, but it supports some
>> >>>>> more fancy operations like mmap()). Then we could proceed to merge
>> >>>>> this functionality with llvm pretty much independently of any other
>> >>>>> refactoring we will be doing.
>> >>>>>
>> >>>>> What do you think?
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>> On 15 February 2017 at 01:48, Zachary Turner via lldb-dev
>> >>>>> <lldb-dev@lists.llvm.org <mailto:lldb-dev@lists.llvm.org>> wrote:
>> >>>>>> After https://reviews.llvm.org/D29964 
>> >>>>>> <https://reviews.llvm.org/D29964>, we finally have a starting
>> >>>>>> point
>> >>>>>> at
>> >>>>>> which we can begin unravelling the cross-project cyclic dependencies
>> >>>>>> in
>> >>>>>> LLDB.  lldb/Utility now is very similar in spirit to llvm/Support.
>> >>>>>>
>> >>>>>> But llvmSupport goes one step further and includes what lldb would
>> >>>>>> normally
>> >>>>>> put under Host.  I think this makes some sense.  Practically all
>> >>>>>> parts
>> >>>>>> of a
>> >>>>>> codebase have need of a single OS abstraction layer.  So, I think
>> >>>>>> that a
>> >>>>>> lot
>> >>>>>> of the functionality currently in lldbHost is in fact needed by the
>> >>>>>> rest
>> >>>>>> of
>> >>>>>> LLDB.
>> >>>>>>
>> >>>>>> So, I wonder if it makes sense to follow the path that LLVM has
>> >>>>>> taken,
>> >>>>>> and
>> >>>>>> start moving some of this code from Host down to Utility.  Doing so
>> >>>>>> would
>> >>>>>> allow us to break one of the biggest links in the dependency cycle in
>> >>>>>> the
>> >>>>>> entire codebase, which is that Host depends on everything, and
>> >>>>>> everything
>> >>>>>> depends on Host.
>> >>>>>>
>> >>>>>> Of course, it can't just be a straight move.  Some things in Host
>> >>>>>> interact
>> >>>>>> with Target, with CommandInterpreter, and with many other things.
>> >>>>>> And
>> >>>>>> stuff
>> >>>>>> going into Utility can't take a dependency.
>> >>>>>>
>> >>>>>> So there will be some splitting, some moving, some refactoring, etc.
>> >>>>>> But to
>> >>>>>> me tackling Host seems like the logical next step, in large part
>> >>>>>> because
>> >>>>>> Host is where FileSpec is, and it's going to be hard to break any
>> >>>>>> dependencies without first addressing FileSpec.
>> >>>>>>
>> >>>>>> The way LLVM handles cross-platform differences in Support is that
>> >>>>>> you
>> >>>>>> include a single header and it does conditional includes into a
>> >>>>>> platform
>> >>>>>> specific subdirectory for the parts that differ.
>> >>>>>>
>> >>>>>> I'm thinking to follow the same pattern here in lldb/Utility, and
>> >>>>>> begin
>> >>>>>> looking for ways to get pieces of Host down into Utility this way,
>> >>>>>> until
>> >>>>>> ultimately I can get FileSpec down there.
>> >>>>>>
>> >>>>>> Thoughts?
>> >>>>>>
>> >>>>>> _______________________________________________
>> >>>>>> 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>
>> >>>>>>
>> > _______________________________________________
>> > 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>
>> 
> 

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

Reply via email to