--- /dev/null
+## 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
#include "OffloadDump.h"
#include "llvm-objdump.h"
#include "llvm/Object/ELFObjectFile.h"
+#include "llvm/Support/Alignment.h"
using namespace llvm;
using namespace llvm::object;
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()));