1f57743408d27fedf60a7b48d25339d51b1f8a055philippe 2f57743408d27fedf60a7b48d25339d51b1f8a055philippe/*--------------------------------------------------------------------*/ 3f57743408d27fedf60a7b48d25339d51b1f8a055philippe/*--- Address Description. ---*/ 4f57743408d27fedf60a7b48d25339d51b1f8a055philippe/*--- hg_addrdescr.c ---*/ 5f57743408d27fedf60a7b48d25339d51b1f8a055philippe/*--------------------------------------------------------------------*/ 6f57743408d27fedf60a7b48d25339d51b1f8a055philippe 7f57743408d27fedf60a7b48d25339d51b1f8a055philippe/* 8f57743408d27fedf60a7b48d25339d51b1f8a055philippe This file is part of Helgrind, a Valgrind tool for detecting errors 9f57743408d27fedf60a7b48d25339d51b1f8a055philippe in threaded programs. 10f57743408d27fedf60a7b48d25339d51b1f8a055philippe 11ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes Copyright (C) 2007-2017 OpenWorks Ltd 12f57743408d27fedf60a7b48d25339d51b1f8a055philippe info@open-works.co.uk 13f57743408d27fedf60a7b48d25339d51b1f8a055philippe 14f57743408d27fedf60a7b48d25339d51b1f8a055philippe This program is free software; you can redistribute it and/or 15f57743408d27fedf60a7b48d25339d51b1f8a055philippe modify it under the terms of the GNU General Public License as 16f57743408d27fedf60a7b48d25339d51b1f8a055philippe published by the Free Software Foundation; either version 2 of the 17f57743408d27fedf60a7b48d25339d51b1f8a055philippe License, or (at your option) any later version. 18f57743408d27fedf60a7b48d25339d51b1f8a055philippe 19f57743408d27fedf60a7b48d25339d51b1f8a055philippe This program is distributed in the hope that it will be useful, but 20f57743408d27fedf60a7b48d25339d51b1f8a055philippe WITHOUT ANY WARRANTY; without even the implied warranty of 21f57743408d27fedf60a7b48d25339d51b1f8a055philippe MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 22f57743408d27fedf60a7b48d25339d51b1f8a055philippe General Public License for more details. 23f57743408d27fedf60a7b48d25339d51b1f8a055philippe 24f57743408d27fedf60a7b48d25339d51b1f8a055philippe You should have received a copy of the GNU General Public License 25f57743408d27fedf60a7b48d25339d51b1f8a055philippe along with this program; if not, write to the Free Software 26f57743408d27fedf60a7b48d25339d51b1f8a055philippe Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 27f57743408d27fedf60a7b48d25339d51b1f8a055philippe 02111-1307, USA. 28f57743408d27fedf60a7b48d25339d51b1f8a055philippe 29f57743408d27fedf60a7b48d25339d51b1f8a055philippe The GNU General Public License is contained in the file COPYING. 30f57743408d27fedf60a7b48d25339d51b1f8a055philippe*/ 31f57743408d27fedf60a7b48d25339d51b1f8a055philippe#include "pub_tool_basics.h" 32f57743408d27fedf60a7b48d25339d51b1f8a055philippe#include "pub_tool_libcbase.h" 33f57743408d27fedf60a7b48d25339d51b1f8a055philippe#include "pub_tool_libcprint.h" 34f57743408d27fedf60a7b48d25339d51b1f8a055philippe#include "pub_tool_libcassert.h" 350c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe#include "pub_tool_wordfm.h" 36f57743408d27fedf60a7b48d25339d51b1f8a055philippe#include "pub_tool_xarray.h" 37f57743408d27fedf60a7b48d25339d51b1f8a055philippe#include "pub_tool_execontext.h" 38f57743408d27fedf60a7b48d25339d51b1f8a055philippe#include "pub_tool_debuginfo.h" 39f57743408d27fedf60a7b48d25339d51b1f8a055philippe#include "pub_tool_threadstate.h" 40f7ec77f53fd09a5682dbe6db049efe0746df7948philippe#include "pub_tool_aspacemgr.h" 4107c08527f05caeb0062b42ca9a58ee774ec5fba1philippe#include "pub_tool_addrinfo.h" 42f57743408d27fedf60a7b48d25339d51b1f8a055philippe 43f57743408d27fedf60a7b48d25339d51b1f8a055philippe#include "hg_basics.h" 440c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe#include "hg_wordset.h" 450c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe#include "hg_lock_n_thread.h" 46f57743408d27fedf60a7b48d25339d51b1f8a055philippe#include "hg_addrdescr.h" /* self */ 47f57743408d27fedf60a7b48d25339d51b1f8a055philippe 4807c08527f05caeb0062b42ca9a58ee774ec5fba1philippevoid HG_(describe_addr) ( Addr a, /*OUT*/AddrInfo* ai ) 49f57743408d27fedf60a7b48d25339d51b1f8a055philippe{ 5007c08527f05caeb0062b42ca9a58ee774ec5fba1philippe tl_assert(ai->tag == Addr_Undescribed); 5107c08527f05caeb0062b42ca9a58ee774ec5fba1philippe 520c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe /* hctxt/tnr/haddr/hszB describe the addr if it is a heap block. */ 5307c08527f05caeb0062b42ca9a58ee774ec5fba1philippe ExeContext* hctxt; 540c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe UInt tnr; 5507c08527f05caeb0062b42ca9a58ee774ec5fba1philippe Addr haddr; 5607c08527f05caeb0062b42ca9a58ee774ec5fba1philippe SizeT hszB; 57f57743408d27fedf60a7b48d25339d51b1f8a055philippe 58f57743408d27fedf60a7b48d25339d51b1f8a055philippe /* First, see if it's in any heap block. Unfortunately this 59f57743408d27fedf60a7b48d25339d51b1f8a055philippe means a linear search through all allocated heap blocks. The 60f57743408d27fedf60a7b48d25339d51b1f8a055philippe assertion says that if it's detected as a heap block, then we 61f57743408d27fedf60a7b48d25339d51b1f8a055philippe must have an allocation context for it, since all heap blocks 62f57743408d27fedf60a7b48d25339d51b1f8a055philippe should have an allocation context. */ 63f57743408d27fedf60a7b48d25339d51b1f8a055philippe Bool is_heapblock 64f57743408d27fedf60a7b48d25339d51b1f8a055philippe = HG_(mm_find_containing_block)( 6507c08527f05caeb0062b42ca9a58ee774ec5fba1philippe &hctxt, 660c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe &tnr, 6707c08527f05caeb0062b42ca9a58ee774ec5fba1philippe &haddr, 6807c08527f05caeb0062b42ca9a58ee774ec5fba1philippe &hszB, 69f57743408d27fedf60a7b48d25339d51b1f8a055philippe a 70f57743408d27fedf60a7b48d25339d51b1f8a055philippe ); 7107c08527f05caeb0062b42ca9a58ee774ec5fba1philippe if (is_heapblock) { 7207c08527f05caeb0062b42ca9a58ee774ec5fba1philippe tl_assert(is_heapblock == (hctxt != NULL)); 7307c08527f05caeb0062b42ca9a58ee774ec5fba1philippe ai->tag = Addr_Block; 7407c08527f05caeb0062b42ca9a58ee774ec5fba1philippe ai->Addr.Block.block_kind = Block_Mallocd; 7507c08527f05caeb0062b42ca9a58ee774ec5fba1philippe ai->Addr.Block.block_desc = "block"; 7607c08527f05caeb0062b42ca9a58ee774ec5fba1philippe ai->Addr.Block.block_szB = hszB; 7707c08527f05caeb0062b42ca9a58ee774ec5fba1philippe ai->Addr.Block.rwoffset = (Word)(a) - (Word)(haddr); 7807c08527f05caeb0062b42ca9a58ee774ec5fba1philippe ai->Addr.Block.allocated_at = hctxt; 790c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe VG_(initThreadInfo) (&ai->Addr.Block.alloc_tinfo); 800c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe ai->Addr.Block.alloc_tinfo.tnr = tnr; 8107c08527f05caeb0062b42ca9a58ee774ec5fba1philippe ai->Addr.Block.freed_at = VG_(null_ExeContext)();; 82f57743408d27fedf60a7b48d25339d51b1f8a055philippe } else { 8307c08527f05caeb0062b42ca9a58ee774ec5fba1philippe /* No block found. Search a non-heap block description. */ 8407c08527f05caeb0062b42ca9a58ee774ec5fba1philippe VG_(describe_addr) (a, ai); 850c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe 860c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe /* In case ai contains a tid, set tnr to the corresponding helgrind 870c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe thread number. */ 880c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe if (ai->tag == Addr_Stack) { 890c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe Thread* thr = get_admin_threads(); 900c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe 910c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe tl_assert(ai->Addr.Stack.tinfo.tid); 920c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe while (thr) { 930c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe if (thr->coretid == ai->Addr.Stack.tinfo.tid) { 940c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe ai->Addr.Stack.tinfo.tnr = thr->errmsg_index; 950c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe break; 960c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe } 970c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe thr = thr->admin; 980c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe } 990c9ac8d0deca2f2a552fb2b0cab24efe6191bac7philippe } 100f57743408d27fedf60a7b48d25339d51b1f8a055philippe } 101f57743408d27fedf60a7b48d25339d51b1f8a055philippe} 102f57743408d27fedf60a7b48d25339d51b1f8a055philippe 10307c08527f05caeb0062b42ca9a58ee774ec5fba1philippeBool HG_(get_and_pp_addrdescr) (Addr addr) 104f57743408d27fedf60a7b48d25339d51b1f8a055philippe{ 105f57743408d27fedf60a7b48d25339d51b1f8a055philippe 106f57743408d27fedf60a7b48d25339d51b1f8a055philippe Bool ret; 10707c08527f05caeb0062b42ca9a58ee774ec5fba1philippe AddrInfo glai; 108f57743408d27fedf60a7b48d25339d51b1f8a055philippe 10907c08527f05caeb0062b42ca9a58ee774ec5fba1philippe glai.tag = Addr_Undescribed; 11007c08527f05caeb0062b42ca9a58ee774ec5fba1philippe HG_(describe_addr) (addr, &glai); 11107c08527f05caeb0062b42ca9a58ee774ec5fba1philippe VG_(pp_addrinfo) (addr, &glai); 11207c08527f05caeb0062b42ca9a58ee774ec5fba1philippe ret = glai.tag != Addr_Unknown; 113f57743408d27fedf60a7b48d25339d51b1f8a055philippe 11407c08527f05caeb0062b42ca9a58ee774ec5fba1philippe VG_(clear_addrinfo) (&glai); 115f57743408d27fedf60a7b48d25339d51b1f8a055philippe 116f57743408d27fedf60a7b48d25339d51b1f8a055philippe return ret; 117f57743408d27fedf60a7b48d25339d51b1f8a055philippe} 118f57743408d27fedf60a7b48d25339d51b1f8a055philippe 119f57743408d27fedf60a7b48d25339d51b1f8a055philippe/*--------------------------------------------------------------------*/ 120f57743408d27fedf60a7b48d25339d51b1f8a055philippe/*--- end hg_addrdescr.c ---*/ 121f57743408d27fedf60a7b48d25339d51b1f8a055philippe/*--------------------------------------------------------------------*/ 122