Skip to content

Commit fee98af

Browse files
committed
Reuse emitOffloadingEntry in SYCL Offload Wrapping.
1 parent 262e39a commit fee98af

File tree

5 files changed

+32
-45
lines changed

5 files changed

+32
-45
lines changed

clang/test/Driver/linker-wrapper-image.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,9 +280,10 @@
280280
// SYCL-NEXT: @.sycl_offloading.opts.compile.0 = internal unnamed_addr constant [1 x i8] zeroinitializer
281281
// SYCL-NEXT: @.sycl_offloading.opts.link.0 = internal unnamed_addr constant [1 x i8] zeroinitializer
282282
// SYCL-NEXT: @.sycl_offloading.0.data = internal unnamed_addr constant [0 x i8] zeroinitializer
283+
// SYCL-NEXT: @__sycl_offload_entries_arr = internal constant [0 x %struct.__tgt_offload_entry] zeroinitializer
283284
// SYCL-NEXT: @.sycl_offloading.0.info = internal local_unnamed_addr constant [2 x i64] [i64 ptrtoint (ptr @.sycl_offloading.0.data to i64), i64 0], section ".tgtimg", align 16
284285
// SYCL-NEXT: @llvm.used = appending global [1 x ptr] [ptr @.sycl_offloading.0.info], section "llvm.metadata"
285-
// SYCL-NEXT: @.sycl_offloading.device_images = internal unnamed_addr constant [1 x %__sycl.tgt_device_image] [%__sycl.tgt_device_image { i16 3, i8 8, i8 0, ptr @.sycl_offloading.target.0, ptr @.sycl_offloading.opts.compile.0, ptr @.sycl_offloading.opts.link.0, ptr @.sycl_offloading.0.data, ptr @.sycl_offloading.0.data, ptr null, ptr null, ptr null, ptr null }]
286+
// SYCL-NEXT: @.sycl_offloading.device_images = internal unnamed_addr constant [1 x %__sycl.tgt_device_image] [%__sycl.tgt_device_image { i16 3, i8 8, i8 0, ptr @.sycl_offloading.target.0, ptr @.sycl_offloading.opts.compile.0, ptr @.sycl_offloading.opts.link.0, ptr @.sycl_offloading.0.data, ptr @.sycl_offloading.0.data, ptr @__sycl_offload_entries_arr, ptr @__sycl_offload_entries_arr, ptr null, ptr null }]
286287
// SYCL-NEXT: @.sycl_offloading.descriptor = internal constant %__sycl.tgt_bin_desc { i16 1, i16 1, ptr @.sycl_offloading.device_images, ptr null, ptr null }
287288
// SYCL-NEXT: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 1, ptr @sycl.descriptor_reg, ptr null }]
288289
// SYCL-NEXT: @llvm.global_dtors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 1, ptr @sycl.descriptor_unreg, ptr null }]

clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,7 @@ wrapDeviceImages(ArrayRef<std::unique_ptr<MemoryBuffer>> Buffers,
722722
offloading::SYCLWrappingOptions WrappingOptions;
723723
if (Error Err =
724724
offloading::wrapSYCLBinaries(M, BuffersToWrap, WrappingOptions))
725-
return Err;
725+
return std::move(Err);
726726
break;
727727
}
728728
default:

llvm/include/llvm/Frontend/Offloading/Utility.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ LLVM_ABI StructType *getEntryTy(Module &M);
8282
/// \param Data Extra data storage associated with the entry.
8383
/// \param SectionName The section this entry will be placed at.
8484
/// \param AuxAddr An extra pointer if needed.
85-
LLVM_ABI void
85+
/// \return The emitted global variable containing the offloading entry.
86+
LLVM_ABI GlobalVariable *
8687
emitOffloadingEntry(Module &M, object::OffloadKind Kind, Constant *Addr,
8788
StringRef Name, uint64_t Size, uint32_t Flags,
8889
uint64_t Data, Constant *AuxAddr = nullptr,

llvm/lib/Frontend/Offloading/OffloadWrapper.cpp

Lines changed: 21 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -806,30 +806,15 @@ struct SYCLWrapper {
806806
/// \returns Pair of Constants that point at entries content.
807807
std::pair<Constant *, Constant *>
808808
addOffloadEntriesToModule(StringRef Entries) {
809-
if (Entries.empty()) {
810-
auto *NullPtr = Constant::getNullValue(PointerType::getUnqual(C));
811-
return std::pair<Constant *, Constant *>(NullPtr, NullPtr);
812-
}
813-
814-
auto *I64Zero = ConstantInt::get(Type::getInt64Ty(C), 0);
815-
auto *I32Zero = ConstantInt::get(Type::getInt32Ty(C), 0);
816-
auto *NullPtr = Constant::getNullValue(PointerType::getUnqual(C));
817-
818809
SmallVector<Constant *> EntriesInits;
819810
std::unique_ptr<MemoryBuffer> MB = MemoryBuffer::getMemBuffer(Entries);
820811
for (line_iterator LI(*MB); !LI.is_at_eof(); ++LI) {
821-
Constant *EntryData[] = {
822-
ConstantExpr::getNullValue(Type::getInt64Ty(C)),
823-
ConstantInt::get(Type::getInt16Ty(C), 1),
824-
ConstantInt::get(Type::getInt16Ty(C), object::OffloadKind::OFK_SYCL),
825-
I32Zero,
826-
NullPtr,
827-
addStringToModule(*LI, "__sycl_offload_entry_name"),
828-
I64Zero,
829-
I64Zero,
830-
NullPtr};
831-
832-
EntriesInits.push_back(ConstantStruct::get(EntryTy, EntryData));
812+
Constant *C = addStringToModule(*LI, "__sycl_offload_entry_name");
813+
GlobalVariable *GV =
814+
emitOffloadingEntry(M, /*Kind*/ OffloadKind::OFK_SYCL, C,
815+
/*Name*/ "__sycl_offload_entry_name", /*Size*/ 0,
816+
/*Flags*/ 0, /*Data*/ 0);
817+
EntriesInits.push_back(GV);
833818
}
834819

835820
auto *Arr = ConstantArray::get(ArrayType::get(EntryTy, EntriesInits.size()),
@@ -951,10 +936,10 @@ struct SYCLWrapper {
951936
///
952937
/// \code
953938
/// __attribute__((visibility("hidden")))
954-
/// extern __tgt_offload_entry *__start_offloading_entries0;
955-
/// __attribute__((visibility("hidden")))
956-
/// extern __tgt_offload_entry *__stop_offloading_entries0;
939+
/// __tgt_offload_entry *__sycl_offload_entries_arr0[];
957940
/// ...
941+
/// __attribute__((visibility("hidden")))
942+
/// __tgt_offload_entry *__sycl_offload_entries_arrN[];
958943
///
959944
/// __attribute__((visibility("hidden")))
960945
/// extern const char *CompileOptions = "...";
@@ -969,19 +954,18 @@ struct SYCLWrapper {
969954
///
970955
/// static const __sycl.tgt_device_image Images[] = {
971956
/// {
972-
/// Version, // Version
973-
/// OffloadKind, // OffloadKind
974-
/// Format, // format of the image - SPIRV, LLVMIR
975-
/// // bc, etc
976-
// TripleString, // Arch
977-
/// CompileOptions0, // CompileOptions
978-
/// LinkOptions0, // LinkOptions
979-
/// Image0, // ImageStart
980-
/// Image0 + N, // ImageEnd
981-
/// __start_offloading_entries0, // EntriesBegin
982-
/// __stop_offloading_entries0, // EntriesEnd
983-
/// NULL, // PropertiesBegin
984-
/// NULL, // PropertiesEnd
957+
/// Version, // Version
958+
/// OffloadKind, // OffloadKind
959+
/// Format, // Format of the image.
960+
// TripleString, // Arch
961+
/// CompileOptions, // CompileOptions
962+
/// LinkOptions, // LinkOptions
963+
/// Image0, // ImageStart
964+
/// Image0 + IMAGE0_SIZE, // ImageEnd
965+
/// __sycl_offload_entries_arr0, // EntriesBegin
966+
/// __sycl_offload_entries_arr0 + ENTRIES0_SIZE, // EntriesEnd
967+
/// NULL, // PropertiesBegin
968+
/// NULL, // PropertiesEnd
985969
/// },
986970
/// ...
987971
/// };

llvm/lib/Frontend/Offloading/Utility.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,11 @@ offloading::getOffloadingEntryInitializer(Module &M, object::OffloadKind Kind,
8282
return {EntryInitializer, Str};
8383
}
8484

85-
void offloading::emitOffloadingEntry(Module &M, object::OffloadKind Kind,
86-
Constant *Addr, StringRef Name,
87-
uint64_t Size, uint32_t Flags,
88-
uint64_t Data, Constant *AuxAddr,
89-
StringRef SectionName) {
85+
GlobalVariable *
86+
offloading::emitOffloadingEntry(Module &M, object::OffloadKind Kind,
87+
Constant *Addr, StringRef Name, uint64_t Size,
88+
uint32_t Flags, uint64_t Data,
89+
Constant *AuxAddr, StringRef SectionName) {
9090
const llvm::Triple &Triple = M.getTargetTriple();
9191

9292
auto [EntryInitializer, NameGV] = getOffloadingEntryInitializer(
@@ -106,6 +106,7 @@ void offloading::emitOffloadingEntry(Module &M, object::OffloadKind Kind,
106106
else
107107
Entry->setSection(SectionName);
108108
Entry->setAlignment(Align(object::OffloadBinary::getAlignment()));
109+
return Entry;
109110
}
110111

111112
std::pair<GlobalVariable *, GlobalVariable *>

0 commit comments

Comments
 (0)