InstrProf: Do a better job of reading coverage mapping data.
authorJustin Bogner <mail@justinbogner.com>
Mon, 16 Mar 2015 06:55:45 +0000 (06:55 +0000)
committerJustin Bogner <mail@justinbogner.com>
Mon, 16 Mar 2015 06:55:45 +0000 (06:55 +0000)
commit7b33cc9dbc38b2748de6b6c34e8210fce6896781
treeabefe2e93bd27beb31c9bcc440c0547f46877ae2
parent0fc6c6762f46a19ba59a482d3fbe7440e084baa0
InstrProf: Do a better job of reading coverage mapping data.

This code was casting regions of a memory buffer to a couple of
different structs. This is wrong in a few ways:

1. It breaks aliasing rules.
2. If the buffer isn't aligned, it hits undefined behaviour.
3. It completely ignores endianness differences.
4. The structs being defined for this aren't specifying their padding
   properly, so this doesn't even represent the data properly on some
   platforms.

This commit is mostly NFC, except that it fixes reading coverage for
32 bit binaries as a side effect of getting rid of the mispadded
structs. I've included a test for that.

I've also baked in that we only handle little endian more explicitly,
since that was true in practice already. I'll fix this to handle
endianness properly in a followup commit.

llvm-svn: 232346
llvm/include/llvm/Support/Endian.h
llvm/lib/ProfileData/CoverageMappingReader.cpp
llvm/test/tools/llvm-cov/Inputs/binary-formats.macho32l [new file with mode: 0755]
llvm/test/tools/llvm-cov/Inputs/binary-formats.macho64l [new file with mode: 0755]
llvm/test/tools/llvm-cov/Inputs/binary-formats.proftext [new file with mode: 0644]
llvm/test/tools/llvm-cov/binary-formats.c [new file with mode: 0644]
llvm/test/tools/llvm-cov/lit.local.cfg