The "overlapping sections" thread reminding me I should reply here.. It also reminded me of another possible use case for multiply-mapped sections. Thread-local sections (.tbss, .tdata in elf) contain data which is somehow (the exact mechanisms are still quite opaque to me) mapped memory for each thread. I am not sure what we do about these things now, but this also sounds like a thing that could/should be modelled as a single section being loaded multiple times.

On 31/05/2019 00:23, Jim Ingham wrote:
I agree that the platform path has to be held by the target, not by the module. 
 In your example lldb would love to have a single local copy of the executable 
so it can do reads locally, which makes it clear that there are real cases 
where it would be obvious two targets should share the same Module, but would 
need to have different remote names for the it.

I don't see how extending the Platform Path in the module to be a vector can handle 
this situation.  We have tried to keep Modules from knowing about Targets, but the 
only way to make sense of all the platform paths associated with the Module is to 
know which one is used by a given Target.  So you'd really have to have a pair of 
Name & Target.  That argues that the Module was the wrong place for this 
information to begin with.

You could imagine doing this by having a map of platform path -> module in the 
target, but then there are all sorts of places you'd have to be careful to consult 
this, and that seems fallible.
Yes, this sounds pretty sub-optimal.


It really sounds like the Target should be dealing with TargetModules (a pair of Module & 
PlatformPath) and not straight Modules.  Probably for the sake of reducing changes we could 
have "CacheModules" which are what Modules are today, and Modules that are the pair 
of PlatformPath and Module.  I think this is what Greg was talking about with his BaseModule 
class.

I think I like the direction of this. This additional separation might also help with another I've been having with how modules work. Right now if we call Module::SetSymbolFileSpec, it will construct a new SymbolFile, but then still keep the old one around just in case somebody uses it. It would be cleaner if "TargetModule::SetSymbolFileSpec" could just create a new instace of "CacheModule" with the new symbol file, and just drop the reference to the old CacheModule.

And then we could avoid storing a vector of "platform paths" in the TargetModule by just creating two TargetModules -- since they would be sharing the same CacheModule, this wouldn't cost much.


Then if you want to support the same CacheModule being reused in a given 
target, the SectionLoadList  would have to hold a pair of Section/TargetModule 
- a TargetSection? - so it would know which instance of the module was meant.  
I think you also have to do the same thing with Address.  It currently holds a 
Section, but that isn't fully specified in the case where the Module can appear 
twice.  It would have to have a TargetSection instead.  Except that you can 
pull Address's out of Modules w/o going through a Target.  So again you might 
have to make a distinction between Address and TargetAddress, which might get 
messy.

This might get messy, but it also might enable us to clean some things up and/or strengthen some invariants. For instance, if we call the TargetSections "LoadedSections" and create them only when they are loaded into a target, then we can maintain the invariant that a LoadedSection can always resolve itself to a "load address" (right now we can do that only if a section happens to be loaded), and to a "CacheSection".

The Address class can now hold two kinds of addresses: a load address and a section+offset combo. For converting between the two one has to go through a target. I think it would make sense for the conversion process to return something of a different type, as then one would always know which kind of address he is talking about. This might also be interesting for the address space folks, as the address space may need to be represented differently for the two address kinds. for a "sectioned address" the address space can probably be given implicitly via the section, but a "load address" would need to store the address space explicitly.

pl
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to