Blob Blame History Raw
/* -*- 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;
}