diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2015-04-03 21:53:22 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2015-04-03 21:53:22 -0700 |
commit | c4350ef6ef6259e48509e125fd2d051969dc6efa (patch) | |
tree | 7f6b0900717eea640d687fc677d2cd39c97a9dd2 /riscv/extensions.cc | |
parent | d9d73d80c1b738b3b30eb40d192f61cbdb0e201f (diff) | |
download | riscv-isa-sim-c4350ef6ef6259e48509e125fd2d051969dc6efa.zip riscv-isa-sim-c4350ef6ef6259e48509e125fd2d051969dc6efa.tar.gz riscv-isa-sim-c4350ef6ef6259e48509e125fd2d051969dc6efa.tar.bz2 |
Support setting ISA/subsets with --isa flag
Default is RV64IMAFDC. Can do things like
--isa=RV32 (which implies IMAFDC)
--isa=IM (which implies RV64)
--isa=RV64IMAFDXhwacha
Diffstat (limited to 'riscv/extensions.cc')
-rw-r--r-- | riscv/extensions.cc | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/riscv/extensions.cc b/riscv/extensions.cc new file mode 100644 index 0000000..315621f --- /dev/null +++ b/riscv/extensions.cc @@ -0,0 +1,35 @@ +#include "extension.h" +#include <string> +#include <map> +#include <dlfcn.h> + +static std::map<std::string, std::function<extension_t*()>>& extensions() +{ + static std::map<std::string, std::function<extension_t*()>> v; + return v; +} + +void register_extension(const char* name, std::function<extension_t*()> f) +{ + extensions()[name] = f; +} + +std::function<extension_t*()> find_extension(const char* name) +{ + if (!extensions().count(name)) { + // try to find extension xyz by loading libxyz.so + std::string libname = std::string("lib") + name + ".so"; + if (!dlopen(libname.c_str(), RTLD_LAZY)) { + fprintf(stderr, "couldn't find extension '%s' (or library '%s')\n", + name, libname.c_str()); + exit(-1); + } + if (!extensions().count(name)) { + fprintf(stderr, "couldn't find extension '%s' in shared library '%s'\n", + name, libname.c_str()); + exit(-1); + } + } + + return extensions()[name]; +} |