mirror of
https://github.com/ziglang/zig.git
synced 2025-12-31 10:33:19 +00:00
- split util_base.hpp from util.hpp - new namespaces: `mem` and `heap` - new `mem::Allocator` interface - new `heap::CAllocator` impl with global `heap::c_allocator` - new `heap::ArenaAllocator` impl - new `mem::TypeInfo` extracts names without RTTI - name extraction is enabled w/ ZIG_ENABLE_MEM_PROFILE=1 - new `mem::List` takes explicit `Allocator&` parameter - new `mem::HashMap` takes explicit `Allocator&` parameter - add Codegen.pass1_arena and use for all `ZigValue` allocs - deinit Codegen.pass1_arena early in `zig_llvm_emit_output()`
68 lines
1.8 KiB
C++
68 lines
1.8 KiB
C++
/*
|
|
* Copyright (c) 2015 Andrew Kelley
|
|
*
|
|
* This file is part of zig, which is MIT licensed.
|
|
* See http://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#ifndef ZIG_UTIL_BASE_HPP
|
|
#define ZIG_UTIL_BASE_HPP
|
|
|
|
#include <assert.h>
|
|
|
|
#if defined(_MSC_VER)
|
|
|
|
#define ATTRIBUTE_COLD __declspec(noinline)
|
|
#define ATTRIBUTE_PRINTF(a, b)
|
|
#define ATTRIBUTE_RETURNS_NOALIAS __declspec(restrict)
|
|
#define ATTRIBUTE_NORETURN __declspec(noreturn)
|
|
#define ATTRIBUTE_MUST_USE
|
|
|
|
#define BREAKPOINT __debugbreak()
|
|
|
|
#else
|
|
|
|
#define ATTRIBUTE_COLD __attribute__((cold))
|
|
#define ATTRIBUTE_PRINTF(a, b) __attribute__((format(printf, a, b)))
|
|
#define ATTRIBUTE_RETURNS_NOALIAS __attribute__((__malloc__))
|
|
#define ATTRIBUTE_NORETURN __attribute__((noreturn))
|
|
#define ATTRIBUTE_MUST_USE __attribute__((warn_unused_result))
|
|
|
|
#if defined(__MINGW32__) || defined(__MINGW64__)
|
|
#define BREAKPOINT __debugbreak()
|
|
#elif defined(__i386__) || defined(__x86_64__)
|
|
#define BREAKPOINT __asm__ volatile("int $0x03");
|
|
#elif defined(__clang__)
|
|
#define BREAKPOINT __builtin_debugtrap()
|
|
#elif defined(__GNUC__)
|
|
#define BREAKPOINT __builtin_trap()
|
|
#else
|
|
#include <signal.h>
|
|
#define BREAKPOINT raise(SIGTRAP)
|
|
#endif
|
|
|
|
#endif
|
|
|
|
ATTRIBUTE_COLD
|
|
ATTRIBUTE_NORETURN
|
|
ATTRIBUTE_PRINTF(1, 2)
|
|
void zig_panic(const char *format, ...);
|
|
|
|
static inline void zig_assert(bool ok, const char *file, int line, const char *func) {
|
|
if (!ok) {
|
|
zig_panic("Assertion failed at %s:%d in %s. This is a bug in the Zig compiler.", file, line, func);
|
|
}
|
|
}
|
|
|
|
#ifdef _WIN32
|
|
#define __func__ __FUNCTION__
|
|
#endif
|
|
|
|
#define zig_unreachable() zig_panic("Unreachable at %s:%d in %s. This is a bug in the Zig compiler.", __FILE__, __LINE__, __func__)
|
|
|
|
// Assertions in stage1 are always on, and they call zig @panic.
|
|
#undef assert
|
|
#define assert(ok) zig_assert(ok, __FILE__, __LINE__, __func__)
|
|
|
|
#endif
|