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