Support of Big archive (AIX archive)

Hello,

I implement support of AIX archive (big archive / XCOFF) on LLVM.

I have done a prototype available here : https://github.com/EGuesnet/llvm-project/commit/1db5ddbdfea5614d0b91a8a6a1920ac630163ec0 .

This prototype replaces support of GNU/BSD/… archive by big archive, but you can switch changing the include. I have implemented only read operation (t, x, p).

I want advices, especially to merge correctly support of Big archive and other archive. Main troubles to merge is big archive has a different header than other archive.

Moreover, big archives have a fix length header, and one header for each object; fix and object headers are different (they are the same structure for non-big archive). Big archives have member table and symbol table at the end of the archive, so you must stop to read it before the end; the location of these table are given with absolute offset, hard to take into account in current code.

Big archive documentation is here : IBM Documentation .

Thanks.

+Fangrui Song +James Henderson +Jordan Rupprecht

Can't say I know too much about the architecture here, but perhaps
these folks have some ideas.

Haven’t heard of this archive format, but the documentation linked seems straightforward, thanks. Seems like a useful addition to LLVM tools. I’d be willing to review/help out with some patches here.

Conceptually, it seems like the current archive parsing logic could be adapted for this format. But as you note, it will take some refactoring, as the current code assumes GNU/BSD/COFF variants of the standard ar file format.

The first thing I’d probably start with is seeing if it makes sense to have ArchiveMemberHeader be an abstract class, with subclasses for the standard ar file format, and one for AIX w/ the different header struct. I’d also not try to force the fixed-length header format to fit in ArchiveMemberHeader, but make that parsed just once during archive initialization – it doesn’t seem to fit the idiom very well.