> On Feb 15, 2017, at 11:22 AM, Zachary Turner <ztur...@google.com> wrote: > > Yea, the flag seems like one you would want to use almost always, so I'm not > opposed to having it. I'll see about making the changes in LLVM, even if we > end up not using it in LLDB, they seem useful in LLVM independently. > > BTW, one difference in LLVM's mmap code is that in LLDB we always use > MAP_PRIVATE, but in LLVM if you are opening for readwrite it uses MAP_SHARED. > Are you against using MAP_SHARED when mmaping with readwrite privileges?
You will need to do some testing. If you do MAP_SHARED and the file goes away, you might crash as it won't keep the file around as long as it needs it. I could be wrong on this. But I do remember explicitly picking MAP_PRIVATE for some reason in the past... > On Wed, Feb 15, 2017 at 11:19 AM Greg Clayton <gclay...@apple.com > <mailto:gclay...@apple.com>> wrote: >> On Feb 15, 2017, at 11:07 AM, Zachary Turner <ztur...@google.com >> <mailto:ztur...@google.com>> wrote: >> >> If you only ever call MemoryMapContentsIfLocal, then is that first flag even >> doing anything? And if you are passing that flag, then can you just mmap it >> always even if non-local? > > If that is the only call people are using, then we don't really need the > flag. Not sure how else as local file could go away such that the backing > store wouldn't be available. mmap() on unix will keep the file around as long > as its needed AFAIK, so even if someone deletes it, it would be kept around. > So if those are our only clients we should be ok. The code signing bit would > need to be added for Mac though. > >> I searched the code and only in the windows minidump plugin are we >> unconditionally mmaping, and that could be changed to a conditional-on-local >> just like everywhere else. If we do that, then nobody is ever mmaping any >> non-local file AFAICT > > That currently is true, but it would be shame to lose the ability to be > resilient in cases where you do want to mmap. If a file is too large, we > really should probably have an upper end cutoff on file size that would mmap > even if remote. If we have a 4 GB file that we want to access, probably not a > great thing to just pop into a heap based memory buffer... > > Greg > >> >> On Wed, Feb 15, 2017 at 11:02 AM Greg Clayton <gclay...@apple.com >> <mailto:gclay...@apple.com>> wrote: >> >>> On Feb 15, 2017, at 10:58 AM, Zachary Turner <ztur...@google.com >>> <mailto:ztur...@google.com>> wrote: >>> >>> >>> On Wed, Feb 15, 2017 at 10:47 AM Reid Kleckner <r...@google.com >>> <mailto:r...@google.com>> wrote: >>> On Wed, Feb 15, 2017 at 10:35 AM, Greg Clayton via lldb-dev >>> <lldb-dev@lists.llvm.org <mailto:lldb-dev@lists.llvm.org>> wrote: >>> 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. >>> >>> LLVM's MemoryBuffer API already serves too many different use cases. >>> Initially it was designed to be a utility for efficiently reading source >>> file inputs. It has a bunch of functionality around ensuring that the >>> buffer is null terminated, and a boolean to avoid using mmap when the user >>> might modify the file concurrently. It's too complicated. I wouldn't >>> recommend using it without a good reason beyond just reusing a platform >>> abstraction. mmap and MapViewOfFile are not that complicated. LLDB is >>> probably better off doing its own thing unless it needs to pass mapped file >>> contents to other parts of LLVM, like maybe clang's VFS. >>> >>> I just took a look and it seems like almost a drop in replacement. Only >>> thing that would need changing is updating shouldUseMmap() to return false >>> if a file is on a network share. But this seems like a good change >>> independently of lldb. >>> >>> After that all lldb has to do is say MemoryBuffer::getOpenFile() and >>> everything works. >>> >>> Is there a good reason *not* to use it? Evenif internally the >>> implementation is complex, the external interface is not >> >> The other thing is on Mac we add new flags to mmap that allow us not to >> crash if the backing store (network mount) goes away. There is also a flag >> that says "if code signature is borked, please still allow me to read the >> file without crashing. That functionality will need to be ported into the >> LLVM code somehow so we don't start crashing again. Previously we would >> crash if someone would do: >> >> (lldb) file /tmp/invalid_codesig_app >> >> And also if the network mounted share would go away on something that was >> mmap'ed and someone would touch any byte within it. Our version of mmap >> works around this and we need that to be in any version we adopt. >> >> Greg >
_______________________________________________ lldb-dev mailing list lldb-dev@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev