Merge pull request #117 from riscv/multicore_debug
[riscv-isa-sim.git] / riscv / extensions.cc
1 // See LICENSE for license details.
2
3 #include "extension.h"
4 #include <string>
5 #include <map>
6 #include <dlfcn.h>
7
8 static std::map<std::string, std::function<extension_t*()>>& extensions()
9 {
10 static std::map<std::string, std::function<extension_t*()>> v;
11 return v;
12 }
13
14 void register_extension(const char* name, std::function<extension_t*()> f)
15 {
16 extensions()[name] = f;
17 }
18
19 std::function<extension_t*()> find_extension(const char* name)
20 {
21 if (!extensions().count(name)) {
22 // try to find extension xyz by loading libxyz.so
23 std::string libname = std::string("lib") + name + ".so";
24 if (!dlopen(libname.c_str(), RTLD_LAZY)) {
25 fprintf(stderr, "couldn't find extension '%s' (or library '%s')\n",
26 name, libname.c_str());
27 exit(-1);
28 }
29 if (!extensions().count(name)) {
30 fprintf(stderr, "couldn't find extension '%s' in shared library '%s'\n",
31 name, libname.c_str());
32 exit(-1);
33 }
34 }
35
36 return extensions()[name];
37 }