[llvm] 8298f0b - [Binary] Support extracting offloading files from COFF

Joseph Huber via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 3 14:19:27 PDT 2022


Author: Joseph Huber
Date: 2022-11-03T16:19:14-05:00
New Revision: 8298f0b7b92e5e2ff8d547cd93863f094d13cb06

URL: https://github.com/llvm/llvm-project/commit/8298f0b7b92e5e2ff8d547cd93863f094d13cb06
DIFF: https://github.com/llvm/llvm-project/commit/8298f0b7b92e5e2ff8d547cd93863f094d13cb06.diff

LOG: [Binary] Support extracting offloading files from COFF

This patch adds initial support for extracting offloading binaries from
`COFF` objects. This is a first step to allow building offloading files
on Windows targets with the new driver.

Depends on D136796

Reviewed By: rnk

Differential Revision: https://reviews.llvm.org/D136855

Added: 
    llvm/test/tools/llvm-objdump/Offloading/coff.test

Modified: 
    llvm/lib/Object/OffloadBinary.cpp
    llvm/test/tools/llvm-objdump/Offloading/non-elf.test
    llvm/tools/llvm-objdump/OffloadDump.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Object/OffloadBinary.cpp b/llvm/lib/Object/OffloadBinary.cpp
index 3f7a60d89c27d..d8cdcdc21d39c 100644
--- a/llvm/lib/Object/OffloadBinary.cpp
+++ b/llvm/lib/Object/OffloadBinary.cpp
@@ -17,6 +17,7 @@
 #include "llvm/Object/Archive.h"
 #include "llvm/Object/ArchiveWriter.h"
 #include "llvm/Object/Binary.h"
+#include "llvm/Object/COFF.h"
 #include "llvm/Object/ELFObjectFile.h"
 #include "llvm/Object/Error.h"
 #include "llvm/Object/IRObjectFile.h"
@@ -66,12 +67,26 @@ Error extractOffloadFiles(MemoryBufferRef Contents,
 }
 
 // Extract offloading binaries from an Object file \p Obj.
-Error extractFromBinary(const ObjectFile &Obj,
+Error extractFromObject(const ObjectFile &Obj,
                         SmallVectorImpl<OffloadFile> &Binaries) {
-  for (ELFSectionRef Sec : Obj.sections()) {
-    if (Sec.getType() != ELF::SHT_LLVM_OFFLOADING)
+  assert((Obj.isELF() || Obj.isCOFF()) && "Invalid file type");
+
+  for (SectionRef Sec : Obj.sections()) {
+    // ELF files contain a section with the LLVM_OFFLOADING type.
+    if (Obj.isELF() &&
+        static_cast<ELFSectionRef>(Sec).getType() != ELF::SHT_LLVM_OFFLOADING)
       continue;
 
+    // COFF has no section types so we rely on the name of the section.
+    if (Obj.isCOFF()) {
+      Expected<StringRef> NameOrErr = Sec.getName();
+      if (!NameOrErr)
+        return NameOrErr.takeError();
+
+      if (!NameOrErr->equals(".llvm.offloading"))
+        continue;
+    }
+
     Expected<StringRef> Buffer = Sec.getContents();
     if (!Buffer)
       return Buffer.takeError();
@@ -260,12 +275,13 @@ Error object::extractOffloadBinaries(MemoryBufferRef Buffer,
     return extractFromBitcode(Buffer, Binaries);
   case file_magic::elf_relocatable:
   case file_magic::elf_executable:
-  case file_magic::elf_shared_object: {
+  case file_magic::elf_shared_object:
+  case file_magic::coff_object: {
     Expected<std::unique_ptr<ObjectFile>> ObjFile =
         ObjectFile::createObjectFile(Buffer, Type);
     if (!ObjFile)
       return ObjFile.takeError();
-    return extractFromBinary(*ObjFile->get(), Binaries);
+    return extractFromObject(*ObjFile->get(), Binaries);
   }
   case file_magic::archive: {
     Expected<std::unique_ptr<llvm::object::Archive>> LibFile =

diff  --git a/llvm/test/tools/llvm-objdump/Offloading/coff.test b/llvm/test/tools/llvm-objdump/Offloading/coff.test
new file mode 100644
index 0000000000000..022277d137bd4
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/Offloading/coff.test
@@ -0,0 +1,42 @@
+# RUN: yaml2obj %S/Inputs/binary.yaml -o %t.bin
+# RUN: yaml2obj %s -o %t.coff
+# RUN: llvm-objcopy --add-section .llvm.offloading=%t.bin %t.coff
+# RUN: llvm-objdump --offloading %t.coff | FileCheck %s --match-full-lines --strict-whitespace --implicit-check-not={{.}}
+
+--- !COFF
+header:
+  Machine:         IMAGE_FILE_MACHINE_AMD64
+  Characteristics: []
+sections:
+  - Name:            .rdata
+    Characteristics: []
+  - Name:            .llvm.offloading
+    Characteristics: [ IMAGE_SCN_LNK_REMOVE, IMAGE_SCN_MEM_DISCARDABLE ]
+    Alignment:       8
+symbols:
+
+#      CHECK:{{.*}}file format coff-x86-64
+# CHECK-EMPTY:
+# CHECK-NEXT:OFFLOADING IMAGE [0]:
+# CHECK-NEXT:kind            llvm ir
+# CHECK-NEXT:arch            gfx908
+# CHECK-NEXT:triple          amdgcn-amd-amdhsa
+# CHECK-NEXT:producer        openmp
+# CHECK-EMPTY:
+# CHECK-NEXT:OFFLOADING IMAGE [1]:
+# CHECK-NEXT:kind            llvm ir
+# CHECK-NEXT:arch            gfx90a
+# CHECK-NEXT:triple          amdgcn-amd-amdhsa
+# CHECK-NEXT:producer        openmp
+# CHECK-EMPTY:
+# CHECK-NEXT:OFFLOADING IMAGE [2]:
+# CHECK-NEXT:kind            cubin
+# CHECK-NEXT:arch            sm_52
+# CHECK-NEXT:triple          nvptx64-nvidia-cuda
+# CHECK-NEXT:producer        openmp
+# CHECK-EMPTY:
+# CHECK-NEXT:OFFLOADING IMAGE [3]:
+# CHECK-NEXT:kind            <none>
+# CHECK-NEXT:arch            sm_70
+# CHECK-NEXT:triple          nvptx64-nvidia-cuda
+# CHECK-NEXT:producer        none

diff  --git a/llvm/test/tools/llvm-objdump/Offloading/non-elf.test b/llvm/test/tools/llvm-objdump/Offloading/non-elf.test
index 955556f0567b5..a2eb377bb35d1 100644
--- a/llvm/test/tools/llvm-objdump/Offloading/non-elf.test
+++ b/llvm/test/tools/llvm-objdump/Offloading/non-elf.test
@@ -1,14 +1,14 @@
 # RUN: yaml2obj %s -o %t
 # RUN: llvm-objdump --offloading %t 2>&1 | FileCheck -DFILENAME=%t %s
 
---- !COFF
-header:
-  Machine:         IMAGE_FILE_MACHINE_AMD64
-  Characteristics: []
-sections:
-  - Name:            .rdata
-    Characteristics: []
-    SectionData:     00
-symbols:
+--- !mach-o
+FileHeader:
+  magic:      0xFEEDFACE
+  cputype:    0x00000007
+  cpusubtype: 0x00000003
+  filetype:   0x00000001
+  ncmds:      0
+  sizeofcmds: 0
+  flags:      0x00002000
 
-# CHECK: warning: '[[FILENAME]]': --offloading is currently only supported for ELF targets
+# CHECK: warning: '[[FILENAME]]': --offloading is currently only supported for COFF and ELF targets

diff  --git a/llvm/tools/llvm-objdump/OffloadDump.cpp b/llvm/tools/llvm-objdump/OffloadDump.cpp
index fdef373279b39..4ac6b99e79bbb 100644
--- a/llvm/tools/llvm-objdump/OffloadDump.cpp
+++ b/llvm/tools/llvm-objdump/OffloadDump.cpp
@@ -49,9 +49,10 @@ static void printBinary(const OffloadBinary &OB, uint64_t Index) {
 
 /// Print the embedded offloading contents of an ObjectFile \p O.
 void llvm::dumpOffloadBinary(const ObjectFile &O) {
-  if (!O.isELF()) {
-    reportWarning("--offloading is currently only supported for ELF targets",
-                  O.getFileName());
+  if (!O.isELF() && !O.isCOFF()) {
+    reportWarning(
+        "--offloading is currently only supported for COFF and ELF targets",
+        O.getFileName());
     return;
   }
 


        


More information about the llvm-commits mailing list