15cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj
25cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj/*---------------------------------------------------------------*/
3752f90673ebbb6b2f55fc5e46606dea371313713sewardj/*--- begin                                       main_util.h ---*/
45cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj/*---------------------------------------------------------------*/
55cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj
6f8ed9d874a7b8651654591c68c6d431c758d787csewardj/*
7752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This file is part of Valgrind, a dynamic binary instrumentation
8752f90673ebbb6b2f55fc5e46606dea371313713sewardj   framework.
9f8ed9d874a7b8651654591c68c6d431c758d787csewardj
10785952d4bf502fa756b2ac58595fd31fe0f88559sewardj   Copyright (C) 2004-2015 OpenWorks LLP
11752f90673ebbb6b2f55fc5e46606dea371313713sewardj      info@open-works.net
127bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
13752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This program is free software; you can redistribute it and/or
14752f90673ebbb6b2f55fc5e46606dea371313713sewardj   modify it under the terms of the GNU General Public License as
15752f90673ebbb6b2f55fc5e46606dea371313713sewardj   published by the Free Software Foundation; either version 2 of the
16752f90673ebbb6b2f55fc5e46606dea371313713sewardj   License, or (at your option) any later version.
177bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
18752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This program is distributed in the hope that it will be useful, but
19752f90673ebbb6b2f55fc5e46606dea371313713sewardj   WITHOUT ANY WARRANTY; without even the implied warranty of
20752f90673ebbb6b2f55fc5e46606dea371313713sewardj   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21752f90673ebbb6b2f55fc5e46606dea371313713sewardj   General Public License for more details.
22752f90673ebbb6b2f55fc5e46606dea371313713sewardj
23752f90673ebbb6b2f55fc5e46606dea371313713sewardj   You should have received a copy of the GNU General Public License
24752f90673ebbb6b2f55fc5e46606dea371313713sewardj   along with this program; if not, write to the Free Software
25752f90673ebbb6b2f55fc5e46606dea371313713sewardj   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
267bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   02110-1301, USA.
277bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
28752f90673ebbb6b2f55fc5e46606dea371313713sewardj   The GNU General Public License is contained in the file COPYING.
29f8ed9d874a7b8651654591c68c6d431c758d787csewardj
30f8ed9d874a7b8651654591c68c6d431c758d787csewardj   Neither the names of the U.S. Department of Energy nor the
31f8ed9d874a7b8651654591c68c6d431c758d787csewardj   University of California nor the names of its contributors may be
32f8ed9d874a7b8651654591c68c6d431c758d787csewardj   used to endorse or promote products derived from this software
33f8ed9d874a7b8651654591c68c6d431c758d787csewardj   without prior written permission.
34f8ed9d874a7b8651654591c68c6d431c758d787csewardj*/
35f8ed9d874a7b8651654591c68c6d431c758d787csewardj
36cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#ifndef __VEX_MAIN_UTIL_H
37cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#define __VEX_MAIN_UTIL_H
385cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj
39887a11a609f3e61d2ae8fe4e67f176207715da7esewardj#include "libvex_basictypes.h"
405cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj
415cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj
4235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* Misc. */
4335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
4435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj#define NULL ((void*)0)
4535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
467ee9752b2f79d54cbf2f8b1f36d239380b0799cdsewardj#define LIKELY(x)       __builtin_expect(!!(x), 1)
477ee9752b2f79d54cbf2f8b1f36d239380b0799cdsewardj#define UNLIKELY(x)     __builtin_expect(!!(x), 0)
4835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
49a0ef1def1c11c280e38f327407a131b23ae59fb6florian#if !defined(offsetof)
50a0ef1def1c11c280e38f327407a131b23ae59fb6florian#   define offsetof(type,memb) ((SizeT)(HWord)&((type*)0)->memb)
51a0ef1def1c11c280e38f327407a131b23ae59fb6florian#endif
52a0ef1def1c11c280e38f327407a131b23ae59fb6florian
531996df05303b3d6d53cc44513725bf53c560e7f0florian// Poor man's static assert
54a2cdc9f40d3bd7c3630b9cb51d2aba6556fb03f0florian#define STATIC_ASSERT(x)  extern int vex__unused_array[(x) ? 1 : -1] \
55a2cdc9f40d3bd7c3630b9cb51d2aba6556fb03f0florian                                     __attribute__((unused))
565cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj
571996df05303b3d6d53cc44513725bf53c560e7f0florian/* Stuff for panicking and assertion. */
585cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj
5935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj#define vassert(expr)                                           \
607ee9752b2f79d54cbf2f8b1f36d239380b0799cdsewardj  ((void) (LIKELY(expr) ? 0 :                                   \
611996df05303b3d6d53cc44513725bf53c560e7f0florian           (vex_assert_fail (#expr,                             \
625cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj                             __FILE__, __LINE__,                \
635cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj                             __PRETTY_FUNCTION__), 0)))
645cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj
655cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj__attribute__ ((__noreturn__))
665827784e6bb74e2a032b66ec310776c24fd88729sewardjextern void vex_assert_fail ( const HChar* expr, const HChar* file,
675827784e6bb74e2a032b66ec310776c24fd88729sewardj                              Int line, const HChar* fn );
685cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj__attribute__ ((__noreturn__))
6976714fdcf200b71609ab5b79aaef11c37c7b8912florianextern void vpanic ( const HChar* str );
7035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
71eebdb2b9c85a2b925e4725657a2db9805f3fcde0florian__attribute__ ((__noreturn__)) __attribute__ ((format (printf, 1, 2)))
72eebdb2b9c85a2b925e4725657a2db9805f3fcde0florianextern void vfatal ( const HChar* format, ... );
73eebdb2b9c85a2b925e4725657a2db9805f3fcde0florian
7435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
7535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* Printing */
7635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
7735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj__attribute__ ((format (printf, 1, 2)))
7876714fdcf200b71609ab5b79aaef11c37c7b8912florianextern UInt vex_printf ( const HChar *format, ... );
795cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj
8041f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj__attribute__ ((format (printf, 2, 3)))
8176714fdcf200b71609ab5b79aaef11c37c7b8912florianextern UInt vex_sprintf ( HChar* buf, const HChar *format, ... );
825cf515f521a92c78f81b8c940479fed6b96e6bcbsewardj
8336ca51378f8851635df814230fa23f2c409b9eddsewardj
8436ca51378f8851635df814230fa23f2c409b9eddsewardj/* String ops */
8536ca51378f8851635df814230fa23f2c409b9eddsewardj
865827784e6bb74e2a032b66ec310776c24fd88729sewardjextern Bool vex_streq ( const HChar* s1, const HChar* s2 );
8704fc6b1eab791c7387b81b9fd820f4ae6aaf90a2florianextern SizeT vex_strlen ( const HChar* str );
8804fc6b1eab791c7387b81b9fd820f4ae6aaf90a2florianextern void vex_bzero ( void* s, SizeT n );
8936ca51378f8851635df814230fa23f2c409b9eddsewardj
9036ca51378f8851635df814230fa23f2c409b9eddsewardj
91d887b8634b2c2685f528bd968459c628e8f86a34sewardj/* Storage management: clear the area, and allocate from it. */
92d887b8634b2c2685f528bd968459c628e8f86a34sewardj
93d887b8634b2c2685f528bd968459c628e8f86a34sewardj/* By default allocation occurs in the temporary area.  However, it is
94d887b8634b2c2685f528bd968459c628e8f86a34sewardj   possible to switch to permanent area allocation if that's what you
95d887b8634b2c2685f528bd968459c628e8f86a34sewardj   want.  Permanent area allocation is very limited, tho. */
96d887b8634b2c2685f528bd968459c628e8f86a34sewardj
97d887b8634b2c2685f528bd968459c628e8f86a34sewardjtypedef
98d887b8634b2c2685f528bd968459c628e8f86a34sewardj   enum {
99d887b8634b2c2685f528bd968459c628e8f86a34sewardj      VexAllocModeTEMP,
100d887b8634b2c2685f528bd968459c628e8f86a34sewardj      VexAllocModePERM
101d887b8634b2c2685f528bd968459c628e8f86a34sewardj   }
102d887b8634b2c2685f528bd968459c628e8f86a34sewardj   VexAllocMode;
103d887b8634b2c2685f528bd968459c628e8f86a34sewardj
104d887b8634b2c2685f528bd968459c628e8f86a34sewardjextern void         vexSetAllocMode ( VexAllocMode );
105d887b8634b2c2685f528bd968459c628e8f86a34sewardjextern VexAllocMode vexGetAllocMode ( void );
1062d6b14aa64df2ff85f8da143516779d5d43574cbsewardjextern void         vexAllocSanityCheck ( void );
107d887b8634b2c2685f528bd968459c628e8f86a34sewardj
1082d6b14aa64df2ff85f8da143516779d5d43574cbsewardjextern void vexSetAllocModeTEMP_and_clear ( void );
109d887b8634b2c2685f528bd968459c628e8f86a34sewardj
110d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian/* Allocate in Vex's temporary allocation area.  Be careful with this.
111d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   You can only call it inside an instrumentation or optimisation
112d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   callback that you have previously specified in a call to
113d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   LibVEX_Translate.  The storage allocated will only stay alive until
114d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   translation of the current basic block is complete.
115d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian */
116d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florianextern HChar* private_LibVEX_alloc_first;
117d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florianextern HChar* private_LibVEX_alloc_curr;
118d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florianextern HChar* private_LibVEX_alloc_last;
119d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florianextern void   private_LibVEX_alloc_OOM(void) __attribute__((noreturn));
120d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian
121d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian/* Allocated memory as returned by LibVEX_Alloc will be aligned on this
122d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   boundary. */
123d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian#define REQ_ALIGN 8
124d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian
125d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florianstatic inline void* LibVEX_Alloc_inline ( SizeT nbytes )
126d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian{
127d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   struct align {
128d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian      char c;
129d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian      union {
130d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian         char c;
131d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian         short s;
132d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian         int i;
133d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian         long l;
134d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian         long long ll;
135d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian         float f;
136d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian         double d;
137d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian         /* long double is currently not used and would increase alignment
138d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian            unnecessarily. */
139d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian         /* long double ld; */
140d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian         void *pto;
141d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian         void (*ptf)(void);
142d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian      } x;
143d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   };
144d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian
145d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   /* Make sure the compiler does no surprise us */
146d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   vassert(offsetof(struct align,x) <= REQ_ALIGN);
147d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian
148d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian#if 0
149d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian  /* Nasty debugging hack, do not use. */
150d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian  return malloc(nbytes);
151d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian#else
152d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   HChar* curr;
153d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   HChar* next;
154d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   SizeT  ALIGN;
155d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   ALIGN  = offsetof(struct align,x) - 1;
156d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   nbytes = (nbytes + ALIGN) & ~ALIGN;
157d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   curr   = private_LibVEX_alloc_curr;
158d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   next   = curr + nbytes;
159d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   if (next >= private_LibVEX_alloc_last)
160d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian      private_LibVEX_alloc_OOM();
161d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   private_LibVEX_alloc_curr = next;
162d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian   return curr;
163d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian#endif
164d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian}
165d8e3ecaede8eccf5bc7be2a55d99a188a07b0a34florian
16648729060949c3c8e2cfdd9aae20df000dac279c0sewardj/* Misaligned memory access support. */
16748729060949c3c8e2cfdd9aae20df000dac279c0sewardj
16848729060949c3c8e2cfdd9aae20df000dac279c0sewardjextern UInt  read_misaligned_UInt_LE  ( void* addr );
16948729060949c3c8e2cfdd9aae20df000dac279c0sewardjextern ULong read_misaligned_ULong_LE ( void* addr );
17048729060949c3c8e2cfdd9aae20df000dac279c0sewardj
17148729060949c3c8e2cfdd9aae20df000dac279c0sewardjextern void  write_misaligned_UInt_LE  ( void* addr, UInt  w );
17248729060949c3c8e2cfdd9aae20df000dac279c0sewardjextern void  write_misaligned_ULong_LE ( void* addr, ULong w );
17348729060949c3c8e2cfdd9aae20df000dac279c0sewardj
174cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#endif /* ndef __VEX_MAIN_UTIL_H */
175ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj
176ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj/*---------------------------------------------------------------*/
177cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj/*---                                             main_util.h ---*/
178ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj/*---------------------------------------------------------------*/
179