[LLVMdev] Questions about llvm/Object/COFF.h

Sean Silva silvas at purdue.edu
Tue Jun 12 19:05:18 PDT 2012


Michael, would it be possible for you to plant a strategically placed block
comment explaining the situation with the "pointless" error_code stuff,
like you explained to me? I'm not sure where is best, but it is worth
having written down somewhere.

--Sean Silva

On Tue, Jun 12, 2012 at 1:08 PM, Michael Spencer <bigcheesegs at gmail.com>wrote:

> On Mon, Jun 11, 2012 at 5:41 PM, Marshall Clow <mclow.lists at gmail.com>
> wrote:
> > So, I'm trying to use this file to look inside COFF files.
> > Got the header. OK.
> >
> > Now I want to look at the sections.
> > Look, there's a section iterator. I can use that!
> >
> > So, I write:
> >        for (llvm::object::section_iterator iter = Obj.begin_sections ();
> iter != Obj.end_sections(); ++iter )
> >
> > and it doesn't compile. There's no ++ for section iterators.
> > Apparently, you're supposed to write.
> >        for (llvm::object::section_iterator iter = Obj.begin_sections ();
> iter != Obj.end_sections(); iter.increment(ec))
> > Srsly?
> > [ And - how do I go from a section_iterator to a coff_section ? ]
>
> That part of the interface is private to COFFObject. COFFObject itself
> isn't really designed to be used with the generic interface, although
> I'm very open to a better design that allows this in a sane way.
>
> > While I'm puzzling over that, I look some more, and I see:
> >        error_code getSection(int32_t index, const coff_section *&Res)
> const;
> >
> > Cool. (A bit weird; why a signed index?, but whatever)
> > So I write:
> >        const llvm::object::coff_section *sect;
> >        for (std::size_t i = 0; i < NumSections; ++i)
> >                Obj.getSection(i, sect);
> >
> > And my program dies with a segmentation fault.
> > Turns out that sect == NULL.
> > More looking, I see that the sections are numbered 1 … N, not 0 ... N-1
> >
> > Now I'm really really confused.  Why?
>
> This is because that is how they are numbered in COFF. -2, -1, and 0
> are special section indices.
>
> > BTW - patch attached to add pre-increment to llvm::content_iterator
> (which is the template base for section_iterator, etc)
> >
> > -- Marshall
>
>
> Index: include/llvm/Object/ObjectFile.h
> ===================================================================
> --- include/llvm/Object/ObjectFile.h    (revision 158307)
> +++ include/llvm/Object/ObjectFile.h    (working copy)
> +  content_iterator& operator++() {
> +       error_code ec;
> +       return this->increment (ec);
> +  }
>
> This is wrong. It ignores the error. operator ++ should be implemented
> the same way as ++ is in include/llvm/Support/YAMLParser.h. If
> iteration fails, turn the iterator into an end iterator and set a
> failed flag and allow the user to access the error_code.
>
> - Michael Spencer
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120612/3b0c7bd6/attachment.html>


More information about the llvm-dev mailing list