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

Michael Spencer bigcheesegs at gmail.com
Tue Jun 12 13:08:22 PDT 2012


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




More information about the llvm-dev mailing list