blob: affbe4e5dadda43e634bc435a706b0eaa99f1e60 [file] [log] [blame]
robert.swiecki3bb518c2010-10-14 00:48:24 +00001/*
robert.swiecki@gmail.com3b630b42015-02-16 10:53:53 +00002 *
robert.swiecki@gmail.com97c77332015-02-14 23:06:58 +00003 * honggfuzz - utilities
4 * -----------------------------------------
robert.swiecki@gmail.com3b630b42015-02-16 10:53:53 +00005 *
robert.swiecki@gmail.com772b33d2015-02-14 20:35:00 +00006 * Author: Robert Swiecki <swiecki@google.com>
robert.swiecki@gmail.com3b630b42015-02-16 10:53:53 +00007 *
robert.swiecki@gmail.com772b33d2015-02-14 20:35:00 +00008 * Copyright 2010-2015 by Google Inc. All Rights Reserved.
robert.swiecki@gmail.com3b630b42015-02-16 10:53:53 +00009 *
10 * Licensed under the Apache License, Version 2.0 (the "License"); you may
11 * not use this file except in compliance with the License. You may obtain
robert.swiecki@gmail.com772b33d2015-02-14 20:35:00 +000012 * a copy of the License at
robert.swiecki@gmail.com3b630b42015-02-16 10:53:53 +000013 *
robert.swiecki@gmail.com772b33d2015-02-14 20:35:00 +000014 * http://www.apache.org/licenses/LICENSE-2.0
robert.swiecki@gmail.com3b630b42015-02-16 10:53:53 +000015 *
robert.swiecki@gmail.com772b33d2015-02-14 20:35:00 +000016 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
19 * implied. See the License for the specific language governing
20 * permissions and limitations under the License.
robert.swiecki@gmail.com3b630b42015-02-16 10:53:53 +000021 *
robert.swiecki@gmail.com772b33d2015-02-14 20:35:00 +000022 */
robert.swiecki3bb518c2010-10-14 00:48:24 +000023
Jagger876a74c2016-02-09 22:09:11 +010024#ifndef _HF_UTIL_H_
25#define _HF_UTIL_H_
robert.swiecki3bb518c2010-10-14 00:48:24 +000026
robert.swiecki@gmail.com36700b52015-02-22 05:03:16 +000027#include <stdarg.h>
Jaggerc8b6eda2016-09-01 03:52:35 +020028#ifdef __clang__
29#include <stdatomic.h>
30#endif
robert.swiecki3bb518c2010-10-14 00:48:24 +000031#include <stdint.h>
32
Jagger6caced32016-03-10 21:42:23 +010033#define MX_LOCK(m) util_mutexLock(m, __func__, __LINE__)
34#define MX_UNLOCK(m) util_mutexUnlock(m, __func__, __LINE__)
Jagger4fe18692016-04-22 23:15:07 +020035#define MX_SCOPED_LOCK(m) MX_LOCK(m); defer { MX_UNLOCK(m); }
Jagger6caced32016-03-10 21:42:23 +010036
Jagger7d4f3fd2016-09-01 03:48:17 +020037/* Atomics */
38#define ATOMIC_GET(x) __atomic_load_n(&(x), __ATOMIC_SEQ_CST)
39#define ATOMIC_SET(x, y) __atomic_store_n(&(x), y, __ATOMIC_SEQ_CST)
40#define ATOMIC_CLEAR(x) __atomic_store_n(&(x), 0, __ATOMIC_SEQ_CST)
41#define ATOMIC_XCHG(x, y) __atomic_exchange_n(&(x), y, __ATOMIC_SEQ_CST)
42
43#define ATOMIC_PRE_INC(x) __atomic_add_fetch(&(x), 1, __ATOMIC_SEQ_CST)
44#define ATOMIC_POST_INC(x) __atomic_fetch_add(&(x), 1, __ATOMIC_SEQ_CST)
45
46#define ATOMIC_PRE_DEC(x) __atomic_sub_fetch(&(x), 1, __ATOMIC_SEQ_CST)
47#define ATOMIC_POST_DEC(x) __atomic_fetch_sub(&(x), 1, __ATOMIC_SEQ_CST)
48
49#define ATOMIC_PRE_ADD(x, y) __atomic_add_fetch(&(x), y, __ATOMIC_SEQ_CST)
50#define ATOMIC_POST_ADD(x, y) __atomic_fetch_add(&(x), y, __ATOMIC_SEQ_CST)
51
52#define ATOMIC_PRE_SUB(x, y) __atomic_sub_fetch(&(x), y, __ATOMIC_SEQ_CST)
53#define ATOMIC_POST_SUB(x, y) __atomic_fetch_sub(&(x), y, __ATOMIC_SEQ_CST)
54
55#define ATOMIC_PRE_AND(x, y) __atomic_and_fetch(&(x), y, __ATOMIC_SEQ_CST)
56#define ATOMIC_POST_AND(x, y) __atomic_fetch_and(&(x), y, __ATOMIC_SEQ_CST)
57
58#define ATOMIC_PRE_OR(x, y) __atomic_or_fetch(&(x), y, __ATOMIC_SEQ_CST)
59#define ATOMIC_POST_OR(x, y) __atomic_fetch_or(&(x), y, __ATOMIC_SEQ_CST)
60
61#define ATOMIC_PRE_INC_RELAXED(x) __atomic_add_fetch(&(x), 1, __ATOMIC_RELAXED)
62#define ATOMIC_POST_OR_RELAXED(x, y) __atomic_fetch_or(&(x), y, __ATOMIC_RELAXED)
63
Jagger2ed5b732016-09-04 17:45:59 +020064__attribute__ ((always_inline))
Jagger7d4f3fd2016-09-01 03:48:17 +020065static inline uint8_t ATOMIC_BTS(uint8_t * addr, size_t offset)
66{
67 uint8_t oldbit;
68 addr += (offset / 8);
69#if defined(__x86_64__)
70 /* *INDENT-OFF* */
71 __asm__("lock btsq %2, %1\n"
72 "sbb %0, %0\n"
73 :"=r"(oldbit), "+m"(*addr)
74 :"Ir"(offset % 8)
75 );
76 /* *INDENT-ON* */
77#else
78 oldbit = ATOMIC_POST_OR(*addr, ((uint8_t) 1U << (offset % 8)));
79#endif
80 return oldbit;
81}
82
Robert Swiecki3bfc33c2016-03-14 18:12:41 +010083extern void *util_Malloc(size_t sz);
84
Robert Swieckiac56a502016-03-17 18:59:46 +010085extern void *util_Calloc(size_t sz);
86
87extern void *util_MMap(size_t sz);
88
Jaggerf49962d2016-07-21 22:49:54 +020089extern void *util_Realloc(void *ptr, size_t sz);
90
Jagger6539b3a2016-04-06 02:32:50 +020091extern char *util_StrDup(const char *s);
92
robert.swiecki@gmail.com90e99112015-02-15 02:05:14 +000093extern uint64_t util_rndGet(uint64_t min, uint64_t max);
robert.swiecki3bb518c2010-10-14 00:48:24 +000094
robert.swiecki@gmail.com89cc38c2015-02-23 02:52:08 +000095extern void util_rndBuf(uint8_t * buf, size_t sz);
96
Jaggerc44a89a2016-09-25 16:42:44 +020097extern uint64_t util_rnd64(void);
98
robert.swiecki@gmail.com9e2d43d2015-02-16 12:17:39 +000099extern int util_ssnprintf(char *str, size_t size, const char *format, ...);
100
101extern int util_vssnprintf(char *str, size_t size, const char *format, va_list ap);
robert.swiecki@gmail.come7190b92015-02-14 23:05:42 +0000102
Robert Swiecki81c6a0d2015-09-08 15:43:20 +0200103extern void util_getLocalTime(const char *fmt, char *buf, size_t len, time_t tm);
robert.swiecki3bb518c2010-10-14 00:48:24 +0000104
robert.swieckiaac72e02010-12-13 19:49:15 +0000105extern void util_nullifyStdio(void);
robert.swiecki3bb518c2010-10-14 00:48:24 +0000106
Robert Swiecki1e1b3532016-03-10 18:43:28 +0100107extern bool util_redirectStdin(const char *inputFile);
robert.swiecki3bb518c2010-10-14 00:48:24 +0000108
groebert@google.com1bd4c212013-06-19 11:13:56 +0000109extern uint64_t util_hash(const char *buf, size_t len);
110
robert.swiecki@gmail.com3213a112015-03-12 01:42:02 +0000111extern int64_t util_timeNowMillis(void);
112
Anestis Bechtsoudisa16f70f2016-01-03 13:03:21 +0200113extern uint64_t util_getUINT32(const uint8_t * buf);
Anestis Bechtsoudisbe0ac7b2015-12-26 15:38:47 +0200114extern uint64_t util_getUINT64(const uint8_t * buf);
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000115
Jagger6caced32016-03-10 21:42:23 +0100116extern void util_mutexLock(pthread_mutex_t * mutex, const char *func, int line);
117extern void util_mutexUnlock(pthread_mutex_t * mutex, const char *func, int line);
Jagger421aca82015-09-05 14:09:47 +0200118
Anestis Bechtsoudisd59af692015-09-21 15:15:05 +0300119extern int64_t fastArray64Search(uint64_t * array, size_t arraySz, uint64_t key);
120
Anestis Bechtsoudis413cb132016-02-07 12:59:00 +0200121extern bool util_isANumber(const char *s);
122
Jaggerd619ed12016-09-22 04:08:49 +0200123extern size_t util_decodeCString(char *s);
Robert Swieckife8d2892016-09-13 17:57:27 +0200124
robert.swiecki3bb518c2010-10-14 00:48:24 +0000125#endif