2019-07-08 14:04:52 +00:00
|
|
|
/* EVMC: Ethereum Client-VM Connector API.
|
|
|
|
* Copyright 2018-2019 The EVMC Authors.
|
|
|
|
* Licensed under the Apache License, Version 2.0.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* EVMC Loader Library
|
|
|
|
*
|
|
|
|
* The EVMC Loader Library supports loading VMs implemented as Dynamically Loaded Libraries
|
|
|
|
* (DLLs, shared objects).
|
|
|
|
*
|
|
|
|
* @defgroup loader EVMC Loader
|
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#if __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/** The function pointer type for EVMC create functions. */
|
|
|
|
typedef struct evmc_instance* (*evmc_create_fn)(void);
|
|
|
|
|
|
|
|
/** Error codes for the EVMC loader. */
|
|
|
|
enum evmc_loader_error_code
|
|
|
|
{
|
|
|
|
/** The loader succeeded. */
|
|
|
|
EVMC_LOADER_SUCCESS = 0,
|
|
|
|
|
|
|
|
/** The loader cannot open the given file name. */
|
|
|
|
EVMC_LOADER_CANNOT_OPEN = 1,
|
|
|
|
|
|
|
|
/** The VM create function not found. */
|
|
|
|
EVMC_LOADER_SYMBOL_NOT_FOUND = 2,
|
|
|
|
|
|
|
|
/** The invalid argument value provided. */
|
|
|
|
EVMC_LOADER_INVALID_ARGUMENT = 3,
|
|
|
|
|
|
|
|
/** The creation of a VM instance has failed. */
|
|
|
|
EVMC_LOADER_INSTANCE_CREATION_FAILURE = 4,
|
|
|
|
|
|
|
|
/** The ABI version of the VM instance has mismatched. */
|
|
|
|
EVMC_LOADER_ABI_VERSION_MISMATCH = 5
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2019-06-26 21:22:42 +00:00
|
|
|
* Dynamically loads the EVMC module with a VM implementation.
|
2019-07-08 14:04:52 +00:00
|
|
|
*
|
2019-06-26 21:22:42 +00:00
|
|
|
* This function tries to open a dynamically loaded library (DLL) at the given `filename`.
|
|
|
|
* On UNIX-like systems dlopen() function is used. On Windows LoadLibrary() function is used.
|
2019-07-08 14:04:52 +00:00
|
|
|
*
|
|
|
|
* If the file does not exist or is not a valid shared library the ::EVMC_LOADER_CANNOT_OPEN error
|
|
|
|
* code is signaled and NULL is returned.
|
|
|
|
*
|
|
|
|
* After the DLL is successfully loaded the function tries to find the EVM create function in the
|
|
|
|
* library. The `filename` is used to guess the EVM name and the name of the create function.
|
|
|
|
* The create function name is constructed by the following rules. Consider example path:
|
|
|
|
* "/ethereum/libexample-interpreter.so".
|
|
|
|
* - the filename is taken from the path:
|
|
|
|
* "libexample-interpreter.so",
|
|
|
|
* - the "lib" prefix and file extension are stripped from the name:
|
|
|
|
* "example-interpreter"
|
|
|
|
* - all "-" are replaced with "_" to construct _base name_:
|
|
|
|
* "example_interpreter",
|
|
|
|
* - the function name "evmc_create_" + _base name_ is searched in the library:
|
|
|
|
* "evmc_create_example_interpreter",
|
|
|
|
* - if function not found, the _base name_ is shorten by skipping the first word separated by "_":
|
|
|
|
* "interpreter",
|
|
|
|
* - then, the function of the shorter name "evmc_create_" + _base name_ is searched in the library:
|
|
|
|
* "evmc_create_interpreter",
|
|
|
|
* - the name shortening continues until a function is found or the name cannot be shorten more,
|
|
|
|
* - lastly, when no function found, the function name "evmc_create" is searched in the library.
|
|
|
|
*
|
|
|
|
* If the create function is found in the library, the pointer to the function is returned.
|
|
|
|
* Otherwise, the ::EVMC_LOADER_SYMBOL_NOT_FOUND error code is signaled and NULL is returned.
|
|
|
|
*
|
|
|
|
* It is safe to call this function with the same filename argument multiple times
|
|
|
|
* (the DLL is not going to be loaded multiple times).
|
|
|
|
*
|
2019-06-26 21:22:42 +00:00
|
|
|
* @param filename The null terminated path (absolute or relative) to an EVMC module
|
|
|
|
* (dynamically loaded library) containing the VM implementation.
|
|
|
|
* If the value is NULL, an empty C-string or longer than the path maximum length
|
|
|
|
* the ::EVMC_LOADER_INVALID_ARGUMENT is signaled.
|
2019-07-08 14:04:52 +00:00
|
|
|
* @param error_code The pointer to the error code. If not NULL the value is set to
|
|
|
|
* ::EVMC_LOADER_SUCCESS on success or any other error code as described above.
|
2019-06-26 21:22:42 +00:00
|
|
|
* @return The pointer to the EVM create function or NULL in case of error.
|
2019-07-08 14:04:52 +00:00
|
|
|
*/
|
|
|
|
evmc_create_fn evmc_load(const char* filename, enum evmc_loader_error_code* error_code);
|
|
|
|
|
|
|
|
/**
|
2019-06-26 21:22:42 +00:00
|
|
|
* Dynamically loads the EVMC module and creates the VM instance.
|
2019-07-08 14:04:52 +00:00
|
|
|
*
|
|
|
|
* This is a macro for creating the VM instance with the function returned from evmc_load().
|
|
|
|
* The function signals the same errors as evmc_load() and additionally:
|
2019-06-26 21:22:42 +00:00
|
|
|
* - ::EVMC_LOADER_INSTANCE_CREATION_FAILURE when the create function returns NULL,
|
|
|
|
* - ::EVMC_LOADER_ABI_VERSION_MISMATCH when the created VM instance has ABI version different
|
|
|
|
* from the ABI version of this library (::EVMC_ABI_VERSION).
|
2019-07-08 14:04:52 +00:00
|
|
|
*
|
|
|
|
* It is safe to call this function with the same filename argument multiple times:
|
|
|
|
* the DLL is not going to be loaded multiple times, but the function will return new VM instance
|
|
|
|
* each time.
|
2019-06-26 21:22:42 +00:00
|
|
|
*
|
|
|
|
* @param filename The null terminated path (absolute or relative) to an EVMC module
|
|
|
|
* (dynamically loaded library) containing the VM implementation.
|
|
|
|
* If the value is NULL, an empty C-string or longer than the path maximum length
|
|
|
|
* the ::EVMC_LOADER_INVALID_ARGUMENT is signaled.
|
|
|
|
* @param error_code The pointer to the error code. If not NULL the value is set to
|
|
|
|
* ::EVMC_LOADER_SUCCESS on success or any other error code as described above.
|
|
|
|
* @return The pointer to the created VM or NULL in case of error.
|
2019-07-08 14:04:52 +00:00
|
|
|
*/
|
|
|
|
struct evmc_instance* evmc_load_and_create(const char* filename,
|
|
|
|
enum evmc_loader_error_code* error_code);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the human-readable message describing the most recent error
|
|
|
|
* that occurred in EVMC loading since the last call to this function.
|
|
|
|
*
|
|
|
|
* In case any loading function returned ::EVMC_LOADER_SUCCESS this function always returns NULL.
|
|
|
|
* In case of error code other than success returned, this function MAY return the error message.
|
|
|
|
* Calling this function "consumes" the error message and the function will return NULL
|
|
|
|
* from subsequent invocations.
|
|
|
|
* This function is not thread-safe.
|
|
|
|
*
|
|
|
|
* @return Error message or NULL if no additional information is available.
|
|
|
|
* The returned pointer MUST NOT be freed by the caller.
|
|
|
|
*/
|
|
|
|
const char* evmc_last_error_msg();
|
|
|
|
|
|
|
|
#if __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/** @} */
|