blob: c802d76096ec1276b2a61a4b6a7fc53b29804a27 [file] [log] [blame]
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#ifndef GO_SYSTEM_H
#define GO_SYSTEM_H
#include <algorithm>
#include <string>
#include <list>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <climits>
#include <ctype.h>
#include <stdarg.h>
# include <unordered_map>
# include <unordered_set>
# define Unordered_map(KEYTYPE, VALTYPE) \
std::unordered_map<KEYTYPE, VALTYPE>
# define Unordered_map_hash(KEYTYPE, VALTYPE, HASHFN, EQFN) \
std::unordered_map<KEYTYPE, VALTYPE, HASHFN, EQFN>
# define Unordered_set(KEYTYPE) \
std::unordered_set<KEYTYPE>
# define Unordered_set_hash(KEYTYPE, HASHFN, EQFN) \
std::unordered_set<KEYTYPE, HASHFN, EQFN>
#include <iostream>
#include <assert.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#define _(x) x
// In a previous version of this file, go_assert was simply #define'd to
// 'assert', meaning that gofrontend assertions would be compiled away for
// release builds, which was problematic. This version of go_assert applies for
// all build flavors, meaning that we'll get assertion checking for release
// builds. FWIW turning on assertions for all of LLVM can be very expensive from
// a compile time perspective, but keeping the assertion checks in gofrontend
// comes with more modest overhead.
extern void go_assert_fail(const char *expr, const char *filename,
int line, const char *function);
#define go_assert(expr) \
(static_cast <bool> (expr) \
? void (0) \
: go_assert_fail (#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__))
#include "llvm-includes.h"
#define go_unreachable() llvm_unreachable("unreachable")
#define ARRAY_SIZE(A) (sizeof (A) / sizeof ((A)[0]))
#define IS_ABSOLUTE_PATH(x) \
llvm::sys::path::is_absolute(llvm::Twine(x))
#define HOST_BITS_PER_WIDE_INT 64
#define HOST_WIDE_INT long
#define ISALNUM(x) isalnum(x)
extern const char *lbasename(const char *);
extern const char *xstrerror(int);
extern bool IS_DIR_SEPARATOR(char);
extern bool ISXDIGIT(char);
#define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
#endif // !defined(GO_SYSTEM_H)