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