3
0
Fork 0
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:
Jakob Rath 2024-05-11 23:30:53 +02:00
commit 94955e3fae
67 changed files with 2698 additions and 806 deletions

View file

@ -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)) {

View file

@ -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() {

View file

@ -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_)

View file

@ -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;
}

View file

@ -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
}