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.<div>
<br></div><div>--Sean Silva<br><br><div class="gmail_quote">On Tue, Jun 12, 2012 at 1:08 PM, Michael Spencer <span dir="ltr"><<a href="mailto:bigcheesegs@gmail.com" target="_blank">bigcheesegs@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On Mon, Jun 11, 2012 at 5:41 PM, Marshall Clow <<a href="mailto:mclow.lists@gmail.com">mclow.lists@gmail.com</a>> wrote:<br>

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