aleksandr.urakov marked 4 inline comments as done.
aleksandr.urakov added a comment.

Hi Jason, thanks for the review!

Initially, the reason of these changes was to reuse the code that works with 
`eh_frame`, because on Windows we have a very similar compiler generated info 
designed to help with unwinding stacks during exception handling. That's why I 
have chosen `DWARFCallFrameInfo` and have extracted its interface (`I` in 
`ICallFrameInfo` stands for `Interface`, but I've renamed it to `CallFrameInfo` 
in the last patch, because this notation doesn't look common in LLVM).

But there is one more reason that makes it very difficult to just create 
`PECallFrameInfo` in `UnwindTable` like we do with `DWARFCallFrameInfo`: 
`PECallFrameInfo` is coupled very tight with `ObjectFilePECOFF` and can't work 
over plain `ObjectFile`. First of all, it uses several functions for work with 
relative virtual addresses (RVA), and they are implemented with the use of 
`ObjectFilePECOFF`'s private variable `m_image_base` (however, may be it is 
possible to implement these methods over the `ObjectFile` interface, I'm not 
sure about that). The second, it requires information about exception directory 
location, but it is an inner mechanics of `ObjectFilePECOFF`. So its relations 
with `ObjectFilePECOFF` are not the same as between `DWARFCallFrameInfo` and 
ELF or Mach-O.

To resolve the situation we can:

- use something like a `dynamic_cast` to `ObjectFilePECOFF` in `UnwindTable` 
and create `PECallFrameInfo` with it. But in this case `lldbSymbol` becomes 
dependent on `lldbPluginObjectFilePECOFF` (and we get a circular dependency);
- extend `ObjectFile`'s interface to make it possible for `PECallFrameInfo` to 
work with required PE abstractions. In this case we can just create 
`PECallFrameInfo` in `UnwindTable` like we do with `DWARFCallFrameInfo`, but it 
adds weird operations to `ObjectFile`'s interface, which are not related to 
other object file formats;
- allow `ObjectFile` to create its own unwind infos by himself.

I've found the last idea good, and decided to redo things in this way (because 
`DWARFCallFrameInfo` etc. are working over object files too). But you are 
right, it also has a negative impact on `ObjectFile`: it becomes knowing of the 
things it shouldn't. So in the last patch I have left only a most abstract 
method, which only allows to get some unwind info from an object file, and 
introduced corresponding entities in `UnwindTable` and `FuncUnwinders`. I think 
it can be a good start for moving in the direction that Greg suggests.

What do you think of this?



================
Comment at: lldb/include/lldb/Symbol/DWARFCallFrameInfo.h:74
 
-  void ForEachFDEEntries(
-      const std::function<bool(lldb::addr_t, uint32_t, dw_offset_t)> 
&callback);
+  void ForEachEntries(const std::function<bool(lldb::addr_t, uint32_t)> 
&callback) override;
 
----------------
amccarth wrote:
> I find the name `ForEachEntries` confusing.  I know this is a leftover from 
> the original code that you're modifying, but I wonder if it can get a better 
> name.  In particular, I don't know why it's plural, so I'd expect 
> `ForEachEntry`, but even that is pretty vague.  I realize `FDE` is 
> DWARF-specific, but at least it gives a clue as to what type of entries are 
> involved.
I just have removed it from the new version.


================
Comment at: lldb/source/Plugins/ObjectFile/PECOFF/PECallFrameInfo.cpp:541
+const RuntimeFunction *PECallFrameInfo::FindRuntimeFunctionItersectsWithRange(
+    const AddressRange &range) const {
+  uint32_t rva = m_object_file.GetRVA(range.GetBaseAddress());
----------------
amccarth wrote:
> Isn't it possible for more than one RuntimeFunction to intersect with an 
> address range?  In normal use, it might not happen because it's being called 
> with constrained ranges, so maybe it's nothing to worry about.  I suppose if 
> the range were too large and it encompassed several functions, returning any 
> one of them is acceptable.
Yes, it is possible. The problem here is that `FuncUnwinders` requests the plan 
with an `AddressRange`, not with an `Address`, and the information about  the 
original requested address is lost to that moment. The required `AddressRange` 
is calculated in `UnwindTable::GetAddressRange`, that's why the order of 
querying unwind infos is important in that function. I think that this logic 
requires some rework, but it seems that it is not a good idea to do it in this 
patch.


================
Comment at: lldb/source/Symbol/ObjectFile.cpp:687
+  return std::make_unique<DWARFCallFrameInfo>(*this, sect,
+                                              DWARFCallFrameInfo::EH);
+}
----------------
amccarth wrote:
> It seems a bit weird for DWARF-specific code to be here, when there are 
> ObjectFile plugins for PECOFF, ELF, and Mach-O.  Obviously the 
> PECOFFCallFrameInfo is instantiated in the PECOFF plugin.  The ELF and Mach-O 
> versions instantiate DWARFCallFrameInfos.  Does the generic ObjectFile need 
> to do the same?
I just have made a default implementation to avoid duplication of the code in 
ELF and Mach-O plugins, but I agree, it looks weird here. It was removed in the 
new implementation.


Repository:
  rLLDB LLDB

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D67347/new/

https://reviews.llvm.org/D67347



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

Reply via email to