Skip to content

Commit

Permalink
[llvm-objdump] Fix alignment issues when dumping offloading sections
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
jhuber6 committed Jul 8, 2022
1 parent 22c7a6d commit e0fb9f5
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 2 deletions.
22 changes: 22 additions & 0 deletions llvm/test/tools/llvm-objdump/Offloading/alignment.test
@@ -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
10 changes: 8 additions & 2 deletions llvm/tools/llvm-objdump/OffloadDump.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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()));
Expand Down

0 comments on commit e0fb9f5

Please sign in to comment.