Skip to content

Commit 700fd4a

Browse files
committed
Remove unnecessary copy of OffloadBinary in Offload Wrapper.
1 parent f6e98a0 commit 700fd4a

File tree

1 file changed

+16
-32
lines changed

1 file changed

+16
-32
lines changed

llvm/lib/Frontend/Offloading/OffloadWrapper.cpp

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,7 @@ struct SYCLWrapper {
807807
///
808808
/// \returns Pointers to the beginning and end of the array.
809809
std::pair<Constant *, Constant *>
810-
initOffloadEntriesPerImage(StringRef Entries) {
810+
initOffloadEntriesPerImage(StringRef Entries, const Twine &OffloadKindTag) {
811811
SmallVector<Constant *> EntriesInits;
812812
std::unique_ptr<MemoryBuffer> MB = MemoryBuffer::getMemBuffer(
813813
Entries, /*BufferName*/ "", /*RequiresNullTerminator*/ false);
@@ -824,7 +824,7 @@ struct SYCLWrapper {
824824
EntriesInits);
825825
auto *EntriesGV = new GlobalVariable(M, Arr->getType(), /*isConstant*/ true,
826826
GlobalVariable::InternalLinkage, Arr,
827-
".sycl_offloading.entries_arr");
827+
OffloadKindTag + "entries_arr");
828828

829829
auto *EntriesB = ConstantExpr::getGetElementPtr(
830830
EntriesGV->getValueType(), EntriesGV, getSizetConstPair(0, 0));
@@ -857,7 +857,7 @@ struct SYCLWrapper {
857857
appendToUsed(M, ImgInfoVar);
858858
}
859859

860-
Constant *wrapImage(const OffloadingImage &OI, const Twine &ImageID,
860+
Constant *wrapImage(const OffloadBinary &OB, const Twine &ImageID,
861861
StringRef OffloadKindTag) {
862862
// Note: Intel DPC++ compiler had 2 versions of this structure
863863
// and clang++ has a third different structure. To avoid ABI incompatibility
@@ -866,10 +866,10 @@ struct SYCLWrapper {
866866
Constant *Version =
867867
ConstantInt::get(Type::getInt16Ty(C), DeviceImageStructVersion);
868868
Constant *OffloadKindConstant = ConstantInt::get(
869-
Type::getInt8Ty(C), static_cast<uint8_t>(OI.TheOffloadKind));
869+
Type::getInt8Ty(C), static_cast<uint8_t>(OB.getOffloadKind()));
870870
Constant *ImageKindConstant = ConstantInt::get(
871-
Type::getInt8Ty(C), static_cast<uint8_t>(OI.TheImageKind));
872-
StringRef Triple = OI.StringData.lookup("triple");
871+
Type::getInt8Ty(C), static_cast<uint8_t>(OB.getImageKind()));
872+
StringRef Triple = OB.getString("triple");
873873
Constant *TripleConstant =
874874
addStringToModule(Triple, Twine(OffloadKindTag) + "target." + ImageID);
875875
Constant *CompileOptions =
@@ -883,21 +883,21 @@ struct SYCLWrapper {
883883
Constant::getNullValue(PointerType::getUnqual(C)),
884884
Constant::getNullValue(PointerType::getUnqual(C))};
885885

886-
const MemoryBuffer &RawImage = *OI.Image;
886+
StringRef RawImage = OB.getImage();
887887
std::pair<Constant *, Constant *> Binary = addArrayToModule(
888-
ArrayRef<char>(RawImage.getBufferStart(), RawImage.getBufferEnd()),
888+
ArrayRef<char>(RawImage.begin(), RawImage.end()),
889889
Twine(OffloadKindTag) + ImageID + ".data", ".llvm.offloading");
890890

891891
// For SYCL images offload entries are defined here per image.
892892
std::pair<Constant *, Constant *> ImageEntriesPtrs =
893-
initOffloadEntriesPerImage(OI.StringData.lookup("symbols"));
893+
initOffloadEntriesPerImage(OB.getString("symbols"), OffloadKindTag);
894894
Constant *WrappedBinary = ConstantStruct::get(
895895
SyclDeviceImageTy, Version, OffloadKindConstant, ImageKindConstant,
896896
TripleConstant, CompileOptions, LinkOptions, Binary.first,
897897
Binary.second, ImageEntriesPtrs.first, ImageEntriesPtrs.second,
898898
PropertiesConstants.first, PropertiesConstants.second);
899899

900-
emitRegistrationFunctions(Binary.first, RawImage.getBufferSize(), ImageID,
900+
emitRegistrationFunctions(Binary.first, RawImage.size(), ImageID,
901901
OffloadKindTag);
902902

903903
return WrappedBinary;
@@ -983,12 +983,13 @@ struct SYCLWrapper {
983983
/// \endcode
984984
///
985985
/// \returns Global variable that represents FatbinDesc.
986-
GlobalVariable *createFatbinDesc(ArrayRef<OffloadingImage> Images) {
986+
GlobalVariable *createFatbinDesc(ArrayRef<OffloadFile> OffloadFiles) {
987987
StringRef OffloadKindTag = ".sycl_offloading.";
988988
SmallVector<Constant *> WrappedImages;
989-
WrappedImages.reserve(Images.size());
990-
for (size_t I = 0, E = Images.size(); I != E; ++I)
991-
WrappedImages.push_back(wrapImage(Images[I], Twine(I), OffloadKindTag));
989+
WrappedImages.reserve(OffloadFiles.size());
990+
for (size_t I = 0, E = OffloadFiles.size(); I != E; ++I)
991+
WrappedImages.push_back(
992+
wrapImage(*OffloadFiles[I].getBinary(), Twine(I), OffloadKindTag));
992993

993994
return combineWrappedImages(WrappedImages, OffloadKindTag);
994995
}
@@ -1088,24 +1089,7 @@ Error llvm::offloading::wrapSYCLBinaries(llvm::Module &M, ArrayRef<char> Buffer,
10881089
if (Error E = extractOffloadBinaries(MBR, OffloadFiles))
10891090
return E;
10901091

1091-
SmallVector<OffloadingImage> Images;
1092-
Images.reserve(OffloadFiles.size());
1093-
for (OffloadFile &File : OffloadFiles) {
1094-
OffloadBinary &Binary = *File.getBinary();
1095-
OffloadingImage OI;
1096-
OI.TheImageKind = Binary.getImageKind();
1097-
OI.TheOffloadKind = Binary.getOffloadKind();
1098-
OI.Flags = Binary.getFlags();
1099-
OI.StringData["arch"] = Binary.getString("arch");
1100-
OI.StringData["triple"] = Binary.getString("triple");
1101-
OI.StringData["symbols"] = Binary.getString("symbols");
1102-
OI.Image = MemoryBuffer::getMemBuffer(
1103-
MemoryBufferRef(Binary.getImage(), /*Identifier*/ ""),
1104-
/*RequiresNullTerminator*/ false);
1105-
Images.emplace_back(std::move(OI));
1106-
}
1107-
1108-
GlobalVariable *Desc = W.createFatbinDesc(Images);
1092+
GlobalVariable *Desc = W.createFatbinDesc(OffloadFiles);
11091093
if (!Desc)
11101094
return createStringError(inconvertibleErrorCode(),
11111095
"No binary descriptors created.");

0 commit comments

Comments
 (0)