/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2001 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
/* style: allow:printf:13 sig:0 */
#include "mpiimpl.h"
/* These are pointers to the static variables in src/mpid/ch3/src/ch3u_recvq.c
that contains the *addresses* of the posted and unexpected queue head
pointers */
extern MPIR_Request **const MPID_Recvq_posted_head_ptr, **const MPID_Recvq_unexpected_head_ptr;
#include "mpi_interface.h"
/* This is from dbginit.c; it is not exported to other files */
typedef struct MPIR_Sendq {
MPIR_Request *sreq;
int tag, rank, context_id;
struct MPIR_Sendq *next;
} MPIR_Sendq;
extern MPIR_Sendq *MPIR_Sendq_head;
/* This is from dbginit.c; it is not exported to other files */
typedef struct MPIR_Comm_list {
int sequence_number; /* Used to detect changes in the list */
MPIR_Comm *head; /* Head of the list */
} MPIR_Comm_list;
extern MPIR_Comm_list MPIR_All_communicators;
/*
This file contains emulation routines for the methods and functions normally
provided by the debugger. This file is only used for testing the
dll_mpich.c debugger interface.
*/
/* These are mock-ups of the find type and find offset routines. Since
there are no portable routines to access the symbol table in an image,
we hand-code the specific types that we use in this code.
These routines (more precisely, the field_offset routine) need to
known the layout of the internal data structures */
enum { TYPE_UNKNOWN = 0,
TYPE_MPIR_COMM = 1,
TYPE_MPIR_COMM_LIST = 2,
TYPE_MPIDI_REQUEST = 3,
TYPE_MPIDI_MESSAGE_MATCH = 4,
TYPE_MPIR_REQUEST = 5,
TYPE_MPIR_SENDQ = 6,
TYPE_MPIDI_MESSAGE_MATCH_PARTS = 7,
} KnownTypes;
/* The dll_mpich.c has a few places where it doesn't always use the most
recent type, so a static current type will not work. Instead, we
have an example of each type, and return that value. */
static int knownTypesArray[] = { TYPE_UNKNOWN, TYPE_MPIR_COMM,
TYPE_MPIR_COMM_LIST, TYPE_MPIDI_REQUEST,
TYPE_MPIDI_MESSAGE_MATCH, TYPE_MPIR_REQUEST,
TYPE_MPIR_SENDQ,
TYPE_MPIDI_MESSAGE_MATCH_PARTS
};
mqs_type *dbgrI_find_type(mqs_image * image, char *name, mqs_lang_code lang)
{
int curType = TYPE_UNKNOWN;
if (strcmp(name, "MPIR_Comm") == 0) {
curType = TYPE_MPIR_COMM;
} else if (strcmp(name, "MPIR_Comm_list") == 0) {
curType = TYPE_MPIR_COMM_LIST;
} else if (strcmp(name, "MPIDI_Request") == 0) {
curType = TYPE_MPIDI_REQUEST;
} else if (strcmp(name, "MPIDI_Message_match") == 0) {
curType = TYPE_MPIDI_MESSAGE_MATCH;
} else if (strcmp(name, "MPIDI_Message_match_parts_t") == 0) {
curType = TYPE_MPIDI_MESSAGE_MATCH_PARTS;
} else if (strcmp(name, "MPIR_Request") == 0) {
curType = TYPE_MPIR_REQUEST;
} else if (strcmp(name, "MPIR_Sendq") == 0) {
curType = TYPE_MPIR_SENDQ;
} else {
curType = TYPE_UNKNOWN;
}
return (mqs_type *) & knownTypesArray[curType];
}
int dbgrI_field_offset(mqs_type * type, char *name)
{
int off = -1;
int curType = *(int *) type;
/* printf ("curtype is %d\n", curType); */
switch (curType) {
case TYPE_MPIR_COMM:
{
MPIR_Comm c;
if (strcmp(name, "name") == 0) {
off = ((char *) &(c.name[0]) - (char *) &c.handle);
} else if (strcmp(name, "comm_next") == 0) {
off = ((char *) &c.comm_next - (char *) &c.handle);
} else if (strcmp(name, "remote_size") == 0) {
off = ((char *) &c.remote_size - (char *) &c.handle);
} else if (strcmp(name, "rank") == 0) {
off = ((char *) &c.rank - (char *) &c.handle);
} else if (strcmp(name, "context_id") == 0) {
off = ((char *) &c.context_id - (char *) &c.handle);
} else if (strcmp(name, "recvcontext_id") == 0) {
off = ((char *) &c.recvcontext_id - (char *) &c.handle);
} else {
printf("Panic! Unrecognized COMM field %s\n", name);
}
}
break;
case TYPE_MPIR_COMM_LIST:
{
MPIR_Comm_list c;
if (strcmp(name, "sequence_number") == 0) {
off = ((char *) &c.sequence_number - (char *) &c);
} else if (strcmp(name, "head") == 0) {
off = ((char *) &c.head - (char *) &c);
} else {
printf("Panic! Unrecognized Comm List field %s\n", name);
}
}
break;
case TYPE_MPIDI_REQUEST:
{
struct MPIDI_Request c;
if (strcmp(name, "next") == 0) {
off = ((char *) &c.next - (char *) &c);
} else if (strcmp(name, "match") == 0) {
off = ((char *) &c.match - (char *) &c);
} else if (strcmp(name, "user_buf") == 0) {
off = ((char *) &c.user_buf - (char *) &c);
} else if (strcmp(name, "user_count") == 0) {
off = ((char *) &c.user_count - (char *) &c);
} else if (strcmp(name, "datatype") == 0) {
off = ((char *) &c.datatype - (char *) &c);
} else {
printf("Panic! Unrecognized mpidi request field %s\n", name);
}
}
break;
case TYPE_MPIDI_MESSAGE_MATCH:
{
if (strcmp(name, "parts") == 0) {
off = 0;
} else {
printf("Panic: Unrecognized mpidi_match fields %s\n", name);
}
}
break;
case TYPE_MPIDI_MESSAGE_MATCH_PARTS:
{
MPIDI_Message_match c;
if (strcmp(name, "tag") == 0) {
off = ((char *) &c.parts.tag - (char *) &c);
} else if (strcmp(name, "rank") == 0) {
off = ((char *) &c.parts.rank - (char *) &c);
} else if (strcmp(name, "context_id") == 0) {
off = ((char *) &c.parts.context_id - (char *) &c);
} else {
printf("Panic! Unrecognized message match parts field %s\n", name);
}
}
break;
case TYPE_MPIR_REQUEST:
{
MPIR_Request c;
if (strcmp(name, "dev") == 0) {
off = ((char *) &c.dev - (char *) &c);
} else if (strcmp(name, "status") == 0) {
off = ((char *) &c.status - (char *) &c);
} else if (strcmp(name, "cc") == 0) {
off = ((char *) &c.cc - (char *) &c);
}
/* else if (strcmp(name, "next") == 0) {
* off = ((char *)&c.next - (char *)&c);
* } */
else {
printf("Panic! Unrecognized request field %s\n", name);
}
}
break;
case TYPE_MPIR_SENDQ:
{
struct MPIR_Sendq c;
if (strcmp(name, "next") == 0) {
off = ((char *) &c.next - (char *) &c);
} else if (strcmp(name, "tag") == 0) {
off = ((char *) &c.tag - (char *) &c);
} else if (strcmp(name, "rank") == 0) {
off = ((char *) &c.rank - (char *) &c);
} else if (strcmp(name, "context_id") == 0) {
off = ((char *) &c.context_id - (char *) &c);
} else if (strcmp(name, "sreq") == 0) {
off = ((char *) &c.sreq - (char *) &c);
} else {
printf("Panic! Unrecognized Sendq field %s\n", name);
}
}
break;
case TYPE_UNKNOWN:
off = -1;
break;
default:
off = -1;
break;
}
return off;
}
/* Simulate converting name to the address of a variable/symbol */
int dbgrI_find_symbol(mqs_image * image, char *name, mqs_taddr_t * loc)
{
if (strcmp(name, "MPIR_All_communicators") == 0) {
*loc = (mqs_taddr_t) & MPIR_All_communicators;
/* The following printfs can help is diagnosing problems when the
* extern variable MPIR_All_communicators appears not to be
* correctly resolved. */
printf("all communicators head at %p\n", (void *) *loc);
printf("all communicators head as pointer %p\n", &MPIR_All_communicators);
printf("head is %p\n", MPIR_All_communicators.head);
return mqs_ok;
} else if (strcmp(name, "MPID_Recvq_posted_head_ptr") == 0) {
*loc = (mqs_taddr_t) & MPID_Recvq_posted_head_ptr;
printf("Address of ptr to posted head ptr = %p\n", &MPID_Recvq_posted_head_ptr);
printf("Address of posted head ptr = %p\n", MPID_Recvq_posted_head_ptr);
return mqs_ok;
} else if (strcmp(name, "MPID_Recvq_unexpected_head_ptr") == 0) {
*loc = (mqs_taddr_t) & MPID_Recvq_unexpected_head_ptr;
return mqs_ok;
} else if (strcmp(name, "MPIR_Sendq_head") == 0) {
*loc = (mqs_taddr_t) & MPIR_Sendq_head;
return mqs_ok;
} else {
printf("Panic! Unrecognized symbol %s\n", name);
}
return 1;
}