Blame nptl_db/db_info.c

Packit 6c4009
/* This file is included by pthread_create.c to define in libpthread
Packit 6c4009
   all the magic symbols required by libthread_db.
Packit 6c4009
Packit 6c4009
   Copyright (C) 2003-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <stdint.h>
Packit 6c4009
#include "thread_dbP.h"
Packit 6c4009
#include <tls.h>
Packit 6c4009
#include <ldsodefs.h>
Packit 6c4009
Packit 6c4009
typedef struct pthread pthread;
Packit 6c4009
typedef struct pthread_key_struct pthread_key_struct;
Packit 6c4009
typedef struct pthread_key_data pthread_key_data;
Packit 6c4009
typedef struct
Packit 6c4009
{
Packit 6c4009
  struct pthread_key_data data[PTHREAD_KEY_2NDLEVEL_SIZE];
Packit 6c4009
}
Packit 6c4009
pthread_key_data_level2;
Packit 6c4009
Packit 6c4009
typedef struct
Packit 6c4009
{
Packit 6c4009
  union dtv dtv[UINT32_MAX / 2 / sizeof (union dtv)]; /* No constant bound.  */
Packit 6c4009
} dtv;
Packit 6c4009
Packit 6c4009
typedef struct link_map link_map;
Packit 6c4009
typedef struct rtld_global rtld_global;
Packit 6c4009
typedef struct dtv_slotinfo_list dtv_slotinfo_list;
Packit 6c4009
typedef struct dtv_slotinfo dtv_slotinfo;
Packit 6c4009
Packit 6c4009
/* Actually static in nptl/init.c, but we only need it for typeof.  */
Packit 6c4009
extern bool __nptl_initial_report_events;
Packit 6c4009
Packit 6c4009
#define schedparam_sched_priority schedparam.sched_priority
Packit 6c4009
Packit 6c4009
#define eventbuf_eventmask eventbuf.eventmask
Packit 6c4009
#define eventbuf_eventmask_event_bits eventbuf.eventmask.event_bits
Packit 6c4009
Packit 6c4009
#define DESC(name, offset, obj) \
Packit 6c4009
  DB_DEFINE_DESC (name, 8 * sizeof (obj), 1, offset);
Packit 6c4009
#define ARRAY_DESC(name, offset, obj) \
Packit 6c4009
  DB_DEFINE_DESC (name, \
Packit 6c4009
		  8 * sizeof (obj)[0], sizeof (obj) / sizeof (obj)[0], \
Packit 6c4009
		  offset);
Packit 6c4009
Packit 6c4009
#if TLS_TCB_AT_TP
Packit 6c4009
# define dtvp header.dtv
Packit 6c4009
#elif TLS_DTV_AT_TP
Packit 6c4009
/* Special case hack.  If TLS_TCB_SIZE == 0 (on PowerPC), there is no TCB
Packit 6c4009
   containing the DTV at the TP, but actually the TCB lies behind the TP,
Packit 6c4009
   i.e. at the very end of the area covered by TLS_PRE_TCB_SIZE.  */
Packit 6c4009
DESC (_thread_db_pthread_dtvp,
Packit 6c4009
      TLS_PRE_TCB_SIZE + offsetof (tcbhead_t, dtv)
Packit 6c4009
      - (TLS_TCB_SIZE == 0 ? sizeof (tcbhead_t) : 0), union dtv *)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
Packit 6c4009
#define DB_STRUCT(type) \
Packit 6c4009
  const uint32_t _thread_db_sizeof_##type = sizeof (type);
Packit 6c4009
#define DB_STRUCT_FIELD(type, field) \
Packit 6c4009
  DESC (_thread_db_##type##_##field, \
Packit 6c4009
	offsetof (type, field), ((type *) 0)->field)
Packit 6c4009
#define DB_STRUCT_ARRAY_FIELD(type, field) \
Packit 6c4009
  ARRAY_DESC (_thread_db_##type##_##field, \
Packit 6c4009
	      offsetof (type, field), ((type *) 0)->field)
Packit 6c4009
#define DB_VARIABLE(name) DESC (_thread_db_##name, 0, name)
Packit 6c4009
#define DB_ARRAY_VARIABLE(name) ARRAY_DESC (_thread_db_##name, 0, name)
Packit 6c4009
#define DB_SYMBOL(name)	/* Nothing.  */
Packit 6c4009
#define DB_FUNCTION(name) /* Nothing.  */
Packit 6c4009
#include "structs.def"
Packit 6c4009
#undef DB_STRUCT
Packit 6c4009
#undef DB_STRUCT_FIELD
Packit 6c4009
#undef DB_SYMBOL
Packit 6c4009
#undef DB_FUNCTION
Packit 6c4009
#undef DB_VARIABLE
Packit 6c4009
#undef DESC
Packit 6c4009
Packit 6c4009
Packit 6c4009
Packit 6c4009
#ifdef DB_THREAD_SELF
Packit 6c4009
# ifdef DB_THREAD_SELF_INCLUDE
Packit 6c4009
#  include DB_THREAD_SELF_INCLUDE
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
/* This macro is defined in the machine's tls.h using the three below.  */
Packit 6c4009
# define CONST_THREAD_AREA(bits, value) \
Packit 6c4009
  const uint32_t _thread_db_const_thread_area = (value);
Packit 6c4009
# define REGISTER_THREAD_AREA(bits, regofs, scale) \
Packit 6c4009
  DB_DEFINE_DESC (_thread_db_register##bits##_thread_area, \
Packit 6c4009
		  bits, (scale), (regofs));
Packit 6c4009
# define REGISTER(bits, size, regofs, bias) \
Packit 6c4009
  DB_DEFINE_DESC (_thread_db_register##bits, size, (uint32_t)(bias), (regofs));
Packit 6c4009
Packit 6c4009
DB_THREAD_SELF
Packit 6c4009
#endif