[llvm-objdump] Fix alignment issues when dumping offloading sections

Summary:
The `.llvm.offloading` section should always be aligned by `8`. However,
we may want to show the offloading data stored in a static library. In
this case, even though the section's alignment is correct, the offset
inside the archive will result in the memory buffer being misaligned. TO
combat this we simply check if the buffer does not have the proper
alignment and copies it to a new buffer if not. This copy should have
the proper alignment.
This commit is contained in:
Joseph Huber 2022-07-08 14:15:18 -04:00
parent 22c7a6dddd
commit e0fb9f55b6
2 changed files with 30 additions and 2 deletions

View File

@ -0,0 +1,22 @@
## Ensure we can read the contents even if the alignment is bad.
# RUN: yaml2obj %s -o %t.elf
# RUN: yaml2obj %S/Inputs/binary.yaml -o %t.bin
# RUN: llvm-objcopy --update-section .llvm.offloading=%t.bin %t.elf
# RUN: llvm-objdump --offloading %t.elf | FileCheck %s -DFILENAME=%t
!ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Sections:
- Name: .misaligned
Type: SHT_PROGBITS
AddressAlign: 0x0000000000000001
Content: "41424300"
- Name: .llvm.offloading
Type: SHT_LLVM_OFFLOADING
Flags: [ SHF_EXCLUDE ]
AddressAlign: 0x0000000000000001
# CHECK-NOT: error: '[[FILENAME]]': while extracting offloading files: Invalid data was encountered while parsing the file

View File

@ -13,6 +13,7 @@
#include "OffloadDump.h"
#include "llvm-objdump.h"
#include "llvm/Object/ELFObjectFile.h"
#include "llvm/Support/Alignment.h"
using namespace llvm;
using namespace llvm::object;
@ -79,8 +80,13 @@ void llvm::dumpOffloadBinary(const ObjectFile &O) {
if (!Contents)
reportError(Contents.takeError(), O.getFileName());
MemoryBufferRef Buffer = MemoryBufferRef(*Contents, O.getFileName());
auto BinaryOrErr = OffloadBinary::create(Buffer);
std::unique_ptr<MemoryBuffer> Buffer =
MemoryBuffer::getMemBuffer(*Contents, O.getFileName(), false);
if (!isAddrAligned(Align(OffloadBinary::getAlignment()),
Buffer->getBufferStart()))
Buffer = MemoryBuffer::getMemBufferCopy(Buffer->getBuffer(),
Buffer->getBufferIdentifier());
auto BinaryOrErr = OffloadBinary::create(*Buffer);
if (!BinaryOrErr)
reportError(O.getFileName(), "while extracting offloading files: " +
toString(BinaryOrErr.takeError()));