mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 17:15:31 +00:00
Merge remote-tracking branch 'origin/master' into poly
This commit is contained in:
commit
94955e3fae
67 changed files with 2698 additions and 806 deletions
|
@ -21,7 +21,7 @@ Revision History:
|
|||
--*/
|
||||
#pragma once
|
||||
|
||||
#include <type_traits>
|
||||
#include <cstddef>
|
||||
#include "util/memory_manager.h"
|
||||
|
||||
template<typename T, bool CallDestructors=true, unsigned INITIAL_SIZE=16>
|
||||
|
@ -30,8 +30,7 @@ protected:
|
|||
T * m_buffer = reinterpret_cast<T*>(m_initial_buffer);
|
||||
unsigned m_pos = 0;
|
||||
unsigned m_capacity = INITIAL_SIZE;
|
||||
alignas(T) std::byte m_initial_buffer[sizeof(T)*INITIAL_SIZE];
|
||||
// typename std::aligned_storage<sizeof(T), alignof(T)>::type m_initial_buffer[INITIAL_SIZE];
|
||||
alignas(T) std::byte m_initial_buffer[INITIAL_SIZE * sizeof(T)];
|
||||
|
||||
void free_memory() {
|
||||
if (m_buffer != reinterpret_cast<T*>(m_initial_buffer)) {
|
||||
|
|
|
@ -75,6 +75,37 @@ bool is_debug_enabled(const char * tag) {
|
|||
return g_enabled_debug_tags->contains(tag);
|
||||
}
|
||||
|
||||
atomic<exit_action> g_default_exit_action(exit_action::exit);
|
||||
|
||||
exit_action get_default_exit_action() {
|
||||
return g_default_exit_action;
|
||||
}
|
||||
|
||||
void set_default_exit_action(exit_action a) {
|
||||
g_default_exit_action = a;
|
||||
}
|
||||
|
||||
void invoke_exit_action(unsigned int code) {
|
||||
exit_action a = get_default_exit_action();
|
||||
switch (a) {
|
||||
case exit_action::exit:
|
||||
exit(code);
|
||||
case exit_action::throw_exception:
|
||||
switch (code) {
|
||||
case ERR_INTERNAL_FATAL:
|
||||
throw default_exception("internal fatal");
|
||||
case ERR_UNREACHABLE:
|
||||
throw default_exception("unreachable");
|
||||
case ERR_NOT_IMPLEMENTED_YET:
|
||||
throw default_exception("not implemented yet");
|
||||
default:
|
||||
throw default_exception("unknown");
|
||||
}
|
||||
default:
|
||||
exit(code);
|
||||
}
|
||||
}
|
||||
|
||||
atomic<debug_action> g_default_debug_action(debug_action::ask);
|
||||
|
||||
debug_action get_default_debug_action() {
|
||||
|
|
|
@ -35,6 +35,14 @@ enum class debug_action {
|
|||
debug_action get_default_debug_action();
|
||||
void set_default_debug_action(debug_action a);
|
||||
|
||||
enum class exit_action {
|
||||
exit,
|
||||
throw_exception,
|
||||
};
|
||||
exit_action get_default_exit_action();
|
||||
void set_default_exit_action(exit_action a);
|
||||
void invoke_exit_action(unsigned int code);
|
||||
|
||||
#include "util/error_codes.h"
|
||||
#include "util/warning.h"
|
||||
|
||||
|
@ -56,7 +64,7 @@ void set_default_debug_action(debug_action a);
|
|||
#endif
|
||||
|
||||
#ifdef NO_Z3_DEBUGGER
|
||||
#define INVOKE_DEBUGGER() exit(ERR_INTERNAL_FATAL)
|
||||
#define INVOKE_DEBUGGER() invoke_exit_action(ERR_INTERNAL_FATAL)
|
||||
#else
|
||||
#ifdef _WINDOWS
|
||||
#define INVOKE_DEBUGGER() __debugbreak()
|
||||
|
@ -71,6 +79,7 @@ void enable_debug(const char * tag);
|
|||
void disable_debug(const char * tag);
|
||||
bool is_debug_enabled(const char * tag);
|
||||
|
||||
|
||||
#define SASSERT(COND) DEBUG_CODE(if (assertions_enabled() && !(COND)) { notify_assertion_violation(__FILE__, __LINE__, #COND); INVOKE_DEBUGGER(); })
|
||||
#define CASSERT(TAG, COND) DEBUG_CODE(if (assertions_enabled() && is_debug_enabled(TAG) && !(COND)) { notify_assertion_violation(__FILE__, __LINE__, #COND); INVOKE_DEBUGGER(); })
|
||||
#define XASSERT(COND, EXTRA_CODE) DEBUG_CODE(if (assertions_enabled() && !(COND)) { notify_assertion_violation(__FILE__, __LINE__, #COND); { EXTRA_CODE } INVOKE_DEBUGGER(); })
|
||||
|
@ -85,26 +94,25 @@ bool is_debug_enabled(const char * tag);
|
|||
#ifdef Z3DEBUG
|
||||
# define UNREACHABLE() DEBUG_CODE(notify_assertion_violation(__FILE__, __LINE__, "UNEXPECTED CODE WAS REACHED."); INVOKE_DEBUGGER();)
|
||||
#else
|
||||
# define UNREACHABLE() { notify_assertion_violation(__FILE__, __LINE__, "UNEXPECTED CODE WAS REACHED."); exit(ERR_UNREACHABLE); } ((void) 0)
|
||||
# define UNREACHABLE() { notify_assertion_violation(__FILE__, __LINE__, "UNEXPECTED CODE WAS REACHED."); invoke_exit_action(ERR_UNREACHABLE); } ((void) 0)
|
||||
#endif
|
||||
|
||||
#ifdef Z3DEBUG
|
||||
# define NOT_IMPLEMENTED_YET() DEBUG_CODE(notify_assertion_violation(__FILE__, __LINE__, "NOT IMPLEMENTED YET!"); INVOKE_DEBUGGER();)
|
||||
#else
|
||||
# define NOT_IMPLEMENTED_YET() { notify_assertion_violation(__FILE__, __LINE__, "NOT IMPLEMENTED YET!"); exit(ERR_NOT_IMPLEMENTED_YET); } ((void) 0)
|
||||
# define NOT_IMPLEMENTED_YET() { notify_assertion_violation(__FILE__, __LINE__, "NOT IMPLEMENTED YET!"); invoke_exit_action(ERR_NOT_IMPLEMENTED_YET); } ((void) 0)
|
||||
#endif
|
||||
|
||||
#define VERIFY(_x_) if (!(_x_)) { \
|
||||
notify_assertion_violation(__FILE__, __LINE__, "Failed to verify: " #_x_ "\n"); \
|
||||
exit(ERR_UNREACHABLE); \
|
||||
invoke_exit_action(ERR_UNREACHABLE); \
|
||||
}
|
||||
|
||||
#define VERIFY_EQ(LHS, RHS) \
|
||||
if (!((LHS) == (RHS))) { \
|
||||
notify_assertion_violation(__FILE__, __LINE__, "Failed to verify: " #LHS " == " #RHS "\n"); \
|
||||
std::cerr << "LHS value: " << (LHS) << "\nRHS value: " << (RHS) << "\n"; \
|
||||
DEBUG_CODE(INVOKE_DEBUGGER();); \
|
||||
exit(ERR_UNREACHABLE); \
|
||||
invoke_exit_action(ERR_UNREACHABLE); \
|
||||
}
|
||||
|
||||
#define ENSURE(_x_) VERIFY(_x_)
|
||||
|
|
|
@ -472,7 +472,7 @@ public:
|
|||
that was already in the table.
|
||||
*/
|
||||
data const & insert_if_not_there(data const & e) {
|
||||
entry * et;
|
||||
entry * et = nullptr;
|
||||
insert_if_not_there_core(e, et);
|
||||
return et->get_data();
|
||||
}
|
||||
|
@ -482,7 +482,7 @@ public:
|
|||
Return the entry that contains e.
|
||||
*/
|
||||
entry * insert_if_not_there2(data const & e) {
|
||||
entry * et;
|
||||
entry * et = nullptr;
|
||||
insert_if_not_there_core(e, et);
|
||||
return et;
|
||||
}
|
||||
|
|
|
@ -142,7 +142,7 @@ static inline unsigned get_num_1bits(uint64_t v) {
|
|||
v = (v + (v >> 4)) & 0x0F0F0F0F0F0F0F0F;
|
||||
uint64_t r = (v * 0x0101010101010101) >> 56;
|
||||
SASSERT(c == r);
|
||||
return (unsigned)r;
|
||||
return static_cast<unsigned>(r);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue