@@ -25,29 +25,14 @@ using namespace omp;
25
25
using namespace target ;
26
26
using namespace plugin ;
27
27
28
- const ELF64LEObjectFile *
29
- GenericGlobalHandlerTy::getOrCreateELFObjectFile (const GenericDeviceTy &Device,
30
- DeviceImageTy &Image) {
28
+ Expected<ELF64LEObjectFile>
29
+ GenericGlobalHandlerTy::getELFObjectFile (DeviceImageTy &Image) {
30
+ assert (utils::elf::isELF (Image.getMemoryBuffer ().getBuffer ()) &&
31
+ " Input is not an ELF file" );
31
32
32
- auto Search = ELFObjectFiles.find (Image.getId ());
33
- if (Search != ELFObjectFiles.end ())
34
- // The ELF object file was already there.
35
- return &Search->second ;
36
-
37
- // The ELF object file we are checking is not created yet.
38
33
Expected<ELF64LEObjectFile> ElfOrErr =
39
34
ELF64LEObjectFile::create (Image.getMemoryBuffer ());
40
- if (!ElfOrErr) {
41
- consumeError (ElfOrErr.takeError ());
42
- return nullptr ;
43
- }
44
-
45
- auto Result =
46
- ELFObjectFiles.try_emplace (Image.getId (), std::move (ElfOrErr.get ()));
47
- assert (Result.second && " Map insertion failed" );
48
- assert (Result.first != ELFObjectFiles.end () && " Map insertion failed" );
49
-
50
- return &Result.first ->second ;
35
+ return ElfOrErr;
51
36
}
52
37
53
38
Error GenericGlobalHandlerTy::moveGlobalBetweenDeviceAndHost (
@@ -83,7 +68,8 @@ Error GenericGlobalHandlerTy::moveGlobalBetweenDeviceAndHost(
83
68
return Err;
84
69
}
85
70
86
- DP (" Succesfully %s %u bytes associated with global symbol '%s' %s the device "
71
+ DP (" Succesfully %s %u bytes associated with global symbol '%s' %s the "
72
+ " device "
87
73
" (%p -> %p).\n " ,
88
74
Device2Host ? " read" : " write" , HostGlobal.getSize (),
89
75
HostGlobal.getName ().data (), Device2Host ? " from" : " to" ,
@@ -98,12 +84,14 @@ bool GenericGlobalHandlerTy::isSymbolInImage(GenericDeviceTy &Device,
98
84
// Get the ELF object file for the image. Notice the ELF object may already
99
85
// be created in previous calls, so we can reuse it. If this is unsuccessful
100
86
// just return false as we couldn't find it.
101
- const ELF64LEObjectFile *ELFObj = getOrCreateELFObjectFile (Device, Image);
102
- if (!ELFObj)
87
+ auto ELFObjOrErr = getELFObjectFile (Image);
88
+ if (!ELFObjOrErr) {
89
+ consumeError (ELFObjOrErr.takeError ());
103
90
return false ;
91
+ }
104
92
105
93
// Search the ELF symbol using the symbol name.
106
- auto SymOrErr = utils::elf::getSymbol (*ELFObj , SymName);
94
+ auto SymOrErr = utils::elf::getSymbol (*ELFObjOrErr , SymName);
107
95
if (!SymOrErr) {
108
96
consumeError (SymOrErr.takeError ());
109
97
return false ;
@@ -117,10 +105,9 @@ Error GenericGlobalHandlerTy::getGlobalMetadataFromImage(
117
105
118
106
// Get the ELF object file for the image. Notice the ELF object may already
119
107
// be created in previous calls, so we can reuse it.
120
- const ELF64LEObjectFile * ELFObj = getOrCreateELFObjectFile (Device, Image);
108
+ auto ELFObj = getELFObjectFile ( Image);
121
109
if (!ELFObj)
122
- return Plugin::error (" Unable to create ELF object for image %p" ,
123
- Image.getStart ());
110
+ return ELFObj.takeError ();
124
111
125
112
// Search the ELF symbol using the symbol name.
126
113
auto SymOrErr = utils::elf::getSymbol (*ELFObj, ImageGlobal.getName ());
0 commit comments