diff options
Diffstat (limited to 'polly/lib/External/isl/cpp/cpp.h.pre')
| -rw-r--r-- | polly/lib/External/isl/cpp/cpp.h.pre | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/polly/lib/External/isl/cpp/cpp.h.pre b/polly/lib/External/isl/cpp/cpp.h.pre new file mode 100644 index 00000000000..0e72c2b064c --- /dev/null +++ b/polly/lib/External/isl/cpp/cpp.h.pre @@ -0,0 +1,249 @@ + +#include <isl/ctx.h> +#include <isl/options.h> + +#include <functional> +#include <memory> +#include <stdexcept> +#include <string> + +/* ISL_USE_EXCEPTIONS should be defined to 1 if exceptions are available. + * gcc and clang define __cpp_exceptions; MSVC and xlC define _CPPUNWIND. + * If exceptions are not available, any error condition will result + * in an abort. + */ +#ifndef ISL_USE_EXCEPTIONS +#if defined(__cpp_exceptions) || defined(_CPPUNWIND) +#define ISL_USE_EXCEPTIONS 1 +#else +#define ISL_USE_EXCEPTIONS 0 +#endif +#endif + +namespace isl { + +class ctx { + isl_ctx *ptr; +public: + /* implicit */ ctx(isl_ctx *ctx) : ptr(ctx) {} + isl_ctx *release() { + auto tmp = ptr; + ptr = nullptr; + return tmp; + } + isl_ctx *get() { + return ptr; + } +}; + +/* Macros hiding try/catch. + * If exceptions are not available, then no exceptions will be thrown and + * there is nothing to catch. + */ +#if ISL_USE_EXCEPTIONS +#define ISL_CPP_TRY try +#define ISL_CPP_CATCH_ALL catch (...) +#else +#define ISL_CPP_TRY if (1) +#define ISL_CPP_CATCH_ALL if (0) +#endif + +#if ISL_USE_EXCEPTIONS + +/* Class capturing isl errors. + * + * The what() return value is stored in a reference counted string + * to ensure that the copy constructor and the assignment operator + * do not throw any exceptions. + */ +class exception : public std::exception { + std::shared_ptr<std::string> what_str; + +protected: + inline exception(const char *what_arg, const char *msg, + const char *file, int line); +public: + exception() {} + exception(const char *what_arg) { + what_str = std::make_shared<std::string>(what_arg); + } + static inline exception create(enum isl_error error, const char *msg, + const char *file, int line); + static inline exception create_from_last_error(ctx ctx); + virtual const char *what() const noexcept { + return what_str->c_str(); + } + + /* Default behavior on error conditions that occur inside isl calls + * performed from inside the bindings. + * In the case exceptions are available, isl should continue + * without printing a warning since the warning message + * will be included in the exception thrown from inside the bindings. + */ + static constexpr auto on_error = ISL_ON_ERROR_CONTINUE; + /* Wrapper for throwing an exception on NULL input. + */ + static void throw_NULL_input(const char *file, int line) { + throw create(isl_error_invalid, "NULL input", file, line); + } + /* Wrapper for throwing an exception corresponding to the last + * error on "ctx". + */ + static void throw_last_error(ctx ctx) { + throw create_from_last_error(ctx); + } +}; + +/* Create an exception of a type described by "what_arg", with + * error message "msg" in line "line" of file "file". + * + * Create a string holding the what() return value that + * corresponds to what isl would have printed. + * If no error message or no error file was set, then use "what_arg" instead. + */ +exception::exception(const char *what_arg, const char *msg, const char *file, + int line) +{ + if (!msg || !file) + what_str = std::make_shared<std::string>(what_arg); + else + what_str = std::make_shared<std::string>(std::string(file) + + ":" + std::to_string(line) + ": " + msg); +} + +class exception_abort : public exception { + friend exception; + exception_abort(const char *msg, const char *file, int line) : + exception("execution aborted", msg, file, line) {} +}; + +class exception_alloc : public exception { + friend exception; + exception_alloc(const char *msg, const char *file, int line) : + exception("memory allocation failure", msg, file, line) {} +}; + +class exception_unknown : public exception { + friend exception; + exception_unknown(const char *msg, const char *file, int line) : + exception("unknown failure", msg, file, line) {} +}; + +class exception_internal : public exception { + friend exception; + exception_internal(const char *msg, const char *file, int line) : + exception("internal error", msg, file, line) {} +}; + +class exception_invalid : public exception { + friend exception; + exception_invalid(const char *msg, const char *file, int line) : + exception("invalid argument", msg, file, line) {} +}; + +class exception_quota : public exception { + friend exception; + exception_quota(const char *msg, const char *file, int line) : + exception("quota exceeded", msg, file, line) {} +}; + +class exception_unsupported : public exception { + friend exception; + exception_unsupported(const char *msg, const char *file, int line) : + exception("unsupported operation", msg, file, line) {} +}; + +/* Create an exception of the class that corresponds to "error", with + * error message "msg" in line "line" of file "file". + * + * isl_error_none is treated as an invalid error type. + */ +exception exception::create(enum isl_error error, const char *msg, + const char *file, int line) +{ + switch (error) { + case isl_error_none: + break; + case isl_error_abort: return exception_abort(msg, file, line); + case isl_error_alloc: return exception_alloc(msg, file, line); + case isl_error_unknown: return exception_unknown(msg, file, line); + case isl_error_internal: return exception_internal(msg, file, line); + case isl_error_invalid: return exception_invalid(msg, file, line); + case isl_error_quota: return exception_quota(msg, file, line); + case isl_error_unsupported: + return exception_unsupported(msg, file, line); + } + + throw exception_invalid("invalid error type", file, line); +} + +/* Create an exception from the last error that occurred on "ctx" and + * reset the error. + * + * If "ctx" is NULL or if it is not in an error state at the start, + * then an invalid argument exception is thrown. + */ +exception exception::create_from_last_error(ctx ctx) +{ + enum isl_error error; + const char *msg, *file; + int line; + + error = isl_ctx_last_error(ctx.get()); + msg = isl_ctx_last_error_msg(ctx.get()); + file = isl_ctx_last_error_file(ctx.get()); + line = isl_ctx_last_error_line(ctx.get()); + isl_ctx_reset_error(ctx.get()); + + return create(error, msg, file, line); +} + +#else + +#include <stdio.h> +#include <stdlib.h> + +class exception { +public: + /* Default behavior on error conditions that occur inside isl calls + * performed from inside the bindings. + * In the case exceptions are not available, isl should abort. + */ + static constexpr auto on_error = ISL_ON_ERROR_ABORT; + /* Wrapper for throwing an exception on NULL input. + * In the case exceptions are not available, print an error and abort. + */ + static void throw_NULL_input(const char *file, int line) { + fprintf(stderr, "%s:%d: NULL input\n", file, line); + abort(); + } + /* Wrapper for throwing an exception corresponding to the last + * error on "ctx". + * isl should already abort when an error condition occurs, + * so this function should never be called. + */ + static void throw_last_error(ctx ctx) { + abort(); + } +}; + +#endif + +/* Helper class for setting the on_error and resetting the option + * to the original value when leaving the scope. + */ +class options_scoped_set_on_error { + isl_ctx *ctx; + int saved_on_error; +public: + options_scoped_set_on_error(class ctx ctx, int on_error) { + this->ctx = ctx.get(); + saved_on_error = isl_options_get_on_error(this->ctx); + isl_options_set_on_error(this->ctx, on_error); + } + ~options_scoped_set_on_error() { + isl_options_set_on_error(ctx, saved_on_error); + } +}; + +} // namespace isl |

