Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gaoqiong
MIGraphX
Commits
df5f8c96
Unverified
Commit
df5f8c96
authored
Oct 11, 2023
by
Artur Wojcik
Committed by
GitHub
Oct 11, 2023
Browse files
port class 'dynamic_loader' to Windows (#2278)
parent
a50cb302
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
62 additions
and
1 deletion
+62
-1
src/dynamic_loader.cpp
src/dynamic_loader.cpp
+58
-0
src/include/migraphx/dynamic_loader.hpp
src/include/migraphx/dynamic_loader.hpp
+2
-0
src/include/migraphx/instruction_ref.hpp
src/include/migraphx/instruction_ref.hpp
+1
-1
src/include/migraphx/tmp_dir.hpp
src/include/migraphx/tmp_dir.hpp
+1
-0
No files found.
src/dynamic_loader.cpp
View file @
df5f8c96
...
@@ -27,11 +27,20 @@
...
@@ -27,11 +27,20 @@
#include <migraphx/file_buffer.hpp>
#include <migraphx/file_buffer.hpp>
#include <migraphx/tmp_dir.hpp>
#include <migraphx/tmp_dir.hpp>
#include <utility>
#include <utility>
#ifdef _WIN32
// cppcheck-suppress definePrefix
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#else
#include <dlfcn.h>
#include <dlfcn.h>
#endif
namespace
migraphx
{
namespace
migraphx
{
inline
namespace
MIGRAPHX_INLINE_NS
{
inline
namespace
MIGRAPHX_INLINE_NS
{
#ifndef _WIN32
void
check_load_error
(
bool
flush
=
false
)
void
check_load_error
(
bool
flush
=
false
)
{
{
char
*
error_msg
=
dlerror
();
char
*
error_msg
=
dlerror
();
...
@@ -81,6 +90,48 @@ fs::path dynamic_loader::path(void* address)
...
@@ -81,6 +90,48 @@ fs::path dynamic_loader::path(void* address)
return
p
;
return
p
;
}
}
#else
struct
dynamic_loader_impl
{
dynamic_loader_impl
()
=
default
;
dynamic_loader_impl
(
const
fs
::
path
&
p
,
tmp_dir
t
=
{})
:
handle
{
LoadLibrary
(
p
.
string
().
c_str
())},
temp
{
std
::
move
(
t
)}
{
if
(
handle
==
nullptr
)
{
MIGRAPHX_THROW
(
"Error loading DLL: "
+
p
.
string
()
+
" ("
+
std
::
to_string
(
GetLastError
())
+
")"
);
}
}
dynamic_loader_impl
(
const
dynamic_loader_impl
&
)
=
delete
;
dynamic_loader_impl
&
operator
=
(
const
dynamic_loader_impl
&
)
=
delete
;
dynamic_loader_impl
(
dynamic_loader_impl
&&
)
=
default
;
~
dynamic_loader_impl
()
{
if
(
handle
!=
nullptr
)
{
FreeLibrary
(
handle
);
}
}
static
std
::
shared_ptr
<
dynamic_loader_impl
>
from_buffer
(
const
char
*
image
,
std
::
size_t
size
)
{
auto
t
=
tmp_dir
{
"migx-dynload"
};
auto
f
=
t
.
path
/
"tmp.dll"
;
write_buffer
(
f
.
string
(),
image
,
size
);
return
std
::
make_shared
<
dynamic_loader_impl
>
(
f
,
std
::
move
(
t
));
}
HMODULE
handle
=
nullptr
;
tmp_dir
temp
;
};
#endif
optional
<
dynamic_loader
>
dynamic_loader
::
try_load
(
const
fs
::
path
&
p
)
optional
<
dynamic_loader
>
dynamic_loader
::
try_load
(
const
fs
::
path
&
p
)
{
{
try
try
...
@@ -109,12 +160,19 @@ dynamic_loader::dynamic_loader(const std::vector<char>& buffer)
...
@@ -109,12 +160,19 @@ dynamic_loader::dynamic_loader(const std::vector<char>& buffer)
std
::
shared_ptr
<
void
>
dynamic_loader
::
get_symbol
(
const
std
::
string
&
name
)
const
std
::
shared_ptr
<
void
>
dynamic_loader
::
get_symbol
(
const
std
::
string
&
name
)
const
{
{
#ifndef _WIN32
// flush any previous error messages
// flush any previous error messages
check_load_error
(
true
);
check_load_error
(
true
);
void
*
symbol
=
dlsym
(
impl
->
handle
.
get
(),
name
.
c_str
());
void
*
symbol
=
dlsym
(
impl
->
handle
.
get
(),
name
.
c_str
());
if
(
symbol
==
nullptr
)
if
(
symbol
==
nullptr
)
check_load_error
();
check_load_error
();
return
{
impl
,
symbol
};
return
{
impl
,
symbol
};
#else
FARPROC
addr
=
GetProcAddress
(
impl
->
handle
,
name
.
c_str
());
if
(
addr
==
nullptr
)
MIGRAPHX_THROW
(
"Symbol not found: "
+
name
+
" ("
+
std
::
to_string
(
GetLastError
())
+
")"
);
return
{
impl
,
reinterpret_cast
<
void
*>
(
addr
)};
#endif
}
}
}
// namespace MIGRAPHX_INLINE_NS
}
// namespace MIGRAPHX_INLINE_NS
...
...
src/include/migraphx/dynamic_loader.hpp
View file @
df5f8c96
...
@@ -38,12 +38,14 @@ struct dynamic_loader_impl;
...
@@ -38,12 +38,14 @@ struct dynamic_loader_impl;
struct
MIGRAPHX_EXPORT
dynamic_loader
struct
MIGRAPHX_EXPORT
dynamic_loader
{
{
#ifndef _WIN32
template
<
class
T
>
template
<
class
T
>
static
fs
::
path
path
(
T
*
address
)
static
fs
::
path
path
(
T
*
address
)
{
{
return
path
(
reinterpret_cast
<
void
*>
(
address
));
return
path
(
reinterpret_cast
<
void
*>
(
address
));
}
}
static
fs
::
path
path
(
void
*
address
);
static
fs
::
path
path
(
void
*
address
);
#endif
static
optional
<
dynamic_loader
>
try_load
(
const
fs
::
path
&
p
);
static
optional
<
dynamic_loader
>
try_load
(
const
fs
::
path
&
p
);
...
...
src/include/migraphx/instruction_ref.hpp
View file @
df5f8c96
...
@@ -57,7 +57,7 @@ struct instruction_ref : std::list<instruction>::iterator
...
@@ -57,7 +57,7 @@ struct instruction_ref : std::list<instruction>::iterator
std
::
is_same
<
U
,
instruction_ref
>
{})
>
std
::
is_same
<
U
,
instruction_ref
>
{})
>
friend
bool
operator
!=
(
const
T
&
x
,
const
U
&
y
)
friend
bool
operator
!=
(
const
T
&
x
,
const
U
&
y
)
{
{
return
!
(
x
==
y
);
return
not
(
x
==
y
);
}
}
};
};
#else
#else
...
...
src/include/migraphx/tmp_dir.hpp
View file @
df5f8c96
...
@@ -34,6 +34,7 @@ struct MIGRAPHX_EXPORT tmp_dir
...
@@ -34,6 +34,7 @@ struct MIGRAPHX_EXPORT tmp_dir
{
{
fs
::
path
path
;
fs
::
path
path
;
tmp_dir
(
const
std
::
string
&
prefix
=
""
);
tmp_dir
(
const
std
::
string
&
prefix
=
""
);
tmp_dir
(
tmp_dir
&&
)
=
default
;
void
execute
(
const
std
::
string
&
exe
,
const
std
::
string
&
args
)
const
;
void
execute
(
const
std
::
string
&
exe
,
const
std
::
string
&
args
)
const
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment