mstorsjo marked an inline comment as done.
mstorsjo added inline comments.

================
Comment at: lldb/source/Symbol/ObjectFile.cpp:480-486
+  size_t ret = data.SetData(m_data, offset, length);
+  // DataExtractor::SetData copies the address byte size from m_data, but
+  // m_data's address byte size is only set from sizeof(void*), and we can't
+  // access subclasses GetAddressByteSize() when setting up m_data in the
+  // constructor.
+  data.SetAddressByteSize(GetAddressByteSize());
+  return ret;
----------------
labath wrote:
> mstorsjo wrote:
> > mstorsjo wrote:
> > > labath wrote:
> > > > mstorsjo wrote:
> > > > > clayborg wrote:
> > > > > > I would vote to make this happen within 
> > > > > > DataExtractor::SetData(const DataExtractor &...)
> > > > > Do you mean that we'd extend `DataExtractor::SetData(const 
> > > > > DataExtractor &...)` to take a byte address size parameter, or that 
> > > > > we'd update `m_data`'s byte address size before doing 
> > > > > `data.SetData()` here?
> > > > > 
> > > > > Ideally I'd set the right byte address size in `m_data` as soon as it 
> > > > > is known and available. It's not possible to do this in 
> > > > > `ObjectFile`'s constructor, as that is called before the subclass is 
> > > > > constructed and its virtual methods are available, but is there a 
> > > > > better point in the lifetime where we could update it?
> > > > I too would prefer that, but I couldn't see a way to achieve that 
> > > > (which is why I stamped this version).
> > > > 
> > > > Today, with a fresh set of eyes, I think it may be reasonable to have 
> > > > this happen in `ObjectFile::ParseHeader`. After the header has been 
> > > > parsed, all object formats (I hope) should be able to determine their 
> > > > address size and endianness, and the operating invariant would be that 
> > > > the address size is only valid after the ParseHeader has been called. 
> > > > WDYT?
> > > Sounds sensible! I'll give it a shot.
> > `ObjectFile::ParseHeader` is currently pure virtual, and thus the subclass 
> > concrete implementations of it don't call the base class version of the 
> > method. Do you want me to make the base class method non-pure and add calls 
> > to it in the subclasses, or add calls to 
> > `m_data.SetAddressByteSize(GetAddressByteSize());` in all of the subclasses 
> > `ParseHeader`?
> Yeah.. I don't know... I am starting to wonder if this really is a good 
> idea.. From the looks of it, there doesn't seem to be anyone (outside of the 
> object file classes themselves) who is calling this method, so it's not clear 
> to me why is it even present on the base class...
> 
> Overall, the scheme that I think I'd like the most would be something like:
> ```
> class ObjectFile {
>   /*nonvirtual*/ uint32_t GetAddressByteSize() { ParseHeader(); return 
> m_data.GetAddressByteSize(); }
>   // same for byte order
>   
>   /*nonvirtual*/ void ParseHeader() { std::tie(address_size, byte_order) = 
> DoParseHeader(); m_data.SetAddressByteSize(address_size); 
> m_data.SetByteOrder(byte_order); }
>   virtual ??? DoParseHeader() = 0;
> };
> ```
> 
> However, I don't know how hard would it be to get to that point, so I think 
> I'd settle for just making sure that each subclass calls 
> `m_data.SetByteOrder` internally. It looks like ObjectFileELF does that 
> already. I haven't checked, but I wouldn't be surprised if MachO does the 
> same...
I checked, and both MachO and ELF seem to be calling both 
`m_data.SetByteOrder()` and `m_data.SetAddressByteSize()`, while PECOFF only 
calls `m_data.SetByteOrder()`. So that makes the fix rather straightforward.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D70848



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

Reply via email to