Questions about llvm/Object/COFF.h

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 ? ]

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?

BTW - patch attached to add pre-increment to llvm::content_iterator (which is the template base for section_iterator, etc)

-- Marshall

section-iter.patch (453 Bytes)

If you haven’t already found it, you should look inside tools/llvm-objdump/llvm-objdump.cpp, which is an easy-to-follow example of how these APIs work

–Sean Silva.

If you haven’t already found it, you should look inside tools/llvm-objdump/llvm-objdump.cpp, which is an easy-to-follow example of how these APIs work

I had found that - and sadly, it doesn’t do what I need to do.
In particular, I don’t see how to get a coff_section from a section_iterator (and llvm-objdump doesn’t do that, either)

At the moment, I want to read the section characteristics and the raw data.
I guess I can use the index-based calls rather than the iterator-based ones. (One-based? Really?)

Seems like a shame, though. Why have two different sets of functionality here?

Thanks, though.

– Marshall

–Sean Silva.

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 ? ]

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?

BTW - patch attached to add pre-increment to llvm::content_iterator (which is the template base for section_iterator, etc)

– Marshall

Marshall Clow Idio Software <mailto:mclow.lists@gmail.com>

A.D. 1517: Martin Luther nails his 95 Theses to the church door and is promptly moderated down to (-1, Flamebait).
– Yu Suzuki

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

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

As I said to Michael in private email - this is at least as wrong, since it throws away the position in the sequence where the error occurs.

– Marshall

Marshall Clow Idio Software <mailto:mclow.lists@gmail.com>

A.D. 1517: Martin Luther nails his 95 Theses to the church door and is promptly moderated down to (-1, Flamebait).
– Yu Suzuki