int Labels_GeneratePCFfile (char *name, long long options) { FILE *fd; fd = fopen (name, "w"); if (fd == NULL) return -1; Paraver_default_options (fd); Paraver_state_labels (fd); Paraver_state_colors (fd); MPITEvent_WriteEnabled_MPI_Operations (fd); SoftCountersEvent_WriteEnabled_MPI_Operations (fd); OMPEvent_WriteEnabledOperations (fd); WriteEnabled_pthread_Operations (fd); MISCEvent_WriteEnabledOperations (fd, options); CUDAEvent_WriteEnabledOperations (fd); #if USE_HARDWARE_COUNTERS HWC_PARAVER_Labels (fd); #endif Paraver_gradient_colors (fd); Paraver_gradient_names (fd); #ifdef HAVE_BFD Address2Info_Write_LibraryIDs (fd); Address2Info_Write_MPI_Labels (fd, get_option_merge_UniqueCallerID()); Address2Info_Write_UF_Labels (fd, get_option_merge_UniqueCallerID()); Address2Info_Write_Sample_Labels (fd, get_option_merge_UniqueCallerID()); Address2Info_Write_CUDA_Labels (fd, get_option_merge_UniqueCallerID()); Address2Info_Write_OTHERS_Labels (fd, get_option_merge_UniqueCallerID(), num_labels_codelocation, labels_codelocation); # if defined(BFD_MANAGER_GENERATE_ADDRESSES) if (get_option_dump_Addresses()) ObjectTable_dumpAddresses (fd, ADDRESSES_FOR_BINARY_EV); # endif #endif Write_rusage_Labels (fd); Write_memusage_Labels (fd); Write_MPI_Stats_Labels (fd); Write_Trace_Mode_Labels (fd); Write_Clustering_Labels (fd); Write_Spectral_Labels (fd); WriteEnabled_OpenCL_Operations (fd); WriteEnabled_OPENSHMEM_Operations (fd); Write_UserDefined_Labels(fd); Write_BasickBlock_Labels(fd); Concat_User_Labels (fd); fclose(fd); return 0; }
void WriteEnabled_pthread_Operations (FILE * fd) { unsigned u; int anypresent = FALSE; #if defined(HAVE_BFD) int createpresent = FALSE; #endif for (u = 0; u < MAX_PTHREAD_TYPE_ENTRIES; u++) { anypresent = anypresent || pthread_event_presency_label[u].present; #if defined(HAVE_BFD) if (pthread_event_presency_label[u].eventtype == PTHREAD_CREATE_EV) createpresent = TRUE; #endif } if (anypresent) { fprintf (fd, "EVENT_TYPE\n"); fprintf (fd, "%d %d %s\n", 0, PTHREAD_BASE_EV, "pthread call"); fprintf (fd, "VALUES\n"); fprintf (fd, "0 Outside pthread call\n"); for (u = 0; u < MAX_PTHREAD_TYPE_ENTRIES; u++) if (pthread_event_presency_label[u].present) fprintf (fd, "%d %s\n", pthread_event_presency_label[u].eventval, pthread_event_presency_label[u].description); LET_SPACES(fd); } #if defined(HAVE_BFD) /* Hey, pthread & OpenMP share the same labels? */ if (createpresent) Address2Info_Write_OMP_Labels (fd, PTHREAD_FUNC_EV, "pthread function", PTHREAD_FUNC_LINE_EV, "pthread function line and file", get_option_merge_UniqueCallerID()); #endif }
void OMPEvent_WriteEnabledOperations (FILE * fd) { if (inuse[JOIN_OMP_INDEX]) { fprintf (fd, "EVENT_TYPE\n"); fprintf (fd, "0 %d OpenMP Worksharing join\n", JOIN_EV); fprintf (fd, "VALUES\n" "0 End\n" "%d Join (w wait)\n" "%d Join (w/o wait)\n\n", JOIN_WAIT_VAL, JOIN_NOWAIT_VAL); } if (inuse[WRK_OMP_INDEX]) { fprintf (fd, "EVENT_TYPE\n"); fprintf (fd, "0 %d OpenMP Worksharing work dispatcher\n", WORK_EV); fprintf (fd, "VALUES\n" "0 End\n" "1 Begin\n\n"); } if (inuse[PAR_OMP_INDEX]) { fprintf (fd, "EVENT_TYPE\n"); fprintf (fd, "0 %d Parallel (OMP)\n", PAR_EV); fprintf (fd, "VALUES\n" "0 close\n" "1 DO (open)\n" "2 SECTIONS (open)\n" "3 REGION (open)\n\n"); } if (inuse[WSH_OMP_INDEX]) { fprintf (fd, "EVENT_TYPE\n"); fprintf (fd, "0 %d Worksharing (OMP)\n", WSH_EV); fprintf (fd, "VALUES\n" "0 End\n" "4 DO \n" "5 SECTIONS\n" "6 SINGLE\n\n"); } #if defined(HAVE_BFD) if (inuse[FNC_OMP_INDEX]) { Address2Info_Write_OMP_Labels (fd, OMPFUNC_EV, "Executed OpenMP parallel function", OMPFUNC_LINE_EV, "Executed OpenMP parallel function line and file", get_option_merge_UniqueCallerID()); Address2Info_Write_OMP_Labels (fd, TASKFUNC_EV, "Executed OpenMP task function", TASKFUNC_LINE_EV, "Executed OpenMP task function line and file", get_option_merge_UniqueCallerID()); Address2Info_Write_OMP_Labels (fd, TASKFUNC_INST_EV, "Instantiated OpenMP task function", TASKFUNC_INST_LINE_EV, "Instantiated OpenMP task function line and file", get_option_merge_UniqueCallerID()); } #endif if (inuse[LCK_OMP_INDEX]) { fprintf (fd, "EVENT_TYPE\n"); fprintf (fd, "0 %d OpenMP named-Lock\n", NAMEDCRIT_EV); fprintf (fd, "VALUES\n" "%d Unlocked status\n" "%d Lock\n" "%d Unlock\n" "%d Locked status\n\n", UNLOCKED_VAL, LOCK_VAL, UNLOCK_VAL, LOCKED_VAL); fprintf (fd, "EVENT_TYPE\n"); fprintf (fd, "0 %d OpenMP named-Lock address name\n", NAMEDCRIT_NAME_EV); } if (inuse[ULCK_OMP_INDEX]) { fprintf (fd, "EVENT_TYPE\n"); fprintf (fd, "0 %d OpenMP unnamed-Lock\n", UNNAMEDCRIT_EV); fprintf (fd, "VALUES\n" "%d Unlocked status\n" "%d Lock\n" "%d Unlock\n" "%d Locked status\n\n", UNLOCKED_VAL, LOCK_VAL, UNLOCK_VAL, LOCKED_VAL); } if (inuse[BARRIER_OMP_INDEX]) { fprintf (fd, "EVENT_TYPE\n"); fprintf (fd, "0 %d OpenMP barrier\n", BARRIEROMP_EV); fprintf (fd, "VALUES\n0 End\n1 Begin\n"); } if (inuse[GETSETNUMTHREADS_INDEX]) { fprintf (fd, "EVENT_TYPE\n"); fprintf (fd, "0 %d OpenMP set num threads\n", OMPSETNUMTHREADS_EV); fprintf (fd, "0 %d OpenMP get num threads\n", OMPGETNUMTHREADS_EV); fprintf (fd, "VALUES\n" "0 End\n" "1 Begin\n"); } if (inuse[TASKWAIT_INDEX]) { fprintf (fd, "EVENT_TYPE\n"); fprintf (fd, "0 %d OMP taskwait\n", TASKWAIT_EV); fprintf (fd, "VALUES\n0 End\n1 Begin\n\n"); } if (inuse[TASKLOOP_INDEX]) { fprintf (fd, "EVENT_TYPE\n" "0 %d Taskloop Identifier\n\n", TASKLOOPID_EV); fprintf (fd, "EVENT_TYPE\n"); fprintf (fd, "0 %d OMP taskloop\n", TASKLOOP_EV); fprintf (fd, "VALUES\n0 End\n1 Begin\n\n"); } if (inuse[ORDERED_INDEX]) { fprintf (fd, "EVENT_TYPE\n"); fprintf (fd, "0 %d OpenMP ordered section\n", ORDERED_EV); fprintf (fd, "VALUES\n" "%d Outside ordered\n" "%d Waiting to enter\n" "%d Signaling the exit\n" "%d Inside ordered\n\n", OUTORDERED_VAL, WAITORDERED_VAL, POSTORDERED_VAL, INORDERED_VAL); } if (inuse[OMPT_CRITICAL_INDEX]) { fprintf (fd, "EVENT_TYPE\n" "0 %d OMP critical\n" "VALUES\n0 End\n1 Begin\n\n", OMPT_CRITICAL_EV); } if (inuse[OMPT_ATOMIC_INDEX]) { fprintf (fd, "EVENT_TYPE\n" "0 %d OMP atomic\n" "VALUES\n0 End\n1 Begin\n\n", OMPT_ATOMIC_EV); } if (inuse[OMPT_LOOP_INDEX]) { fprintf (fd, "EVENT_TYPE\n" "0 %d OMP loop\n" "VALUES\n0 End\n1 Begin\n\n", OMPT_LOOP_EV); } if (inuse[OMPT_WORKSHARE_INDEX]) { fprintf (fd, "EVENT_TYPE\n" "0 %d OMP workshare\n" "VALUES\n0 End\n1 Begin\n\n", OMPT_WORKSHARE_EV); } if (inuse[OMPT_SECTIONS_INDEX]) { fprintf (fd, "EVENT_TYPE\n" "0 %d OMP sections\n" "VALUES\n0 End\n1 Begin\n\n", OMPT_SECTIONS_EV); } if (inuse[OMPT_SINGLE_INDEX]) { fprintf (fd, "EVENT_TYPE\n" "0 %d OMP single\n" "VALUES\n0 End\n1 Begin\n\n", OMPT_SINGLE_EV); } if (inuse[OMPT_MASTER_INDEX]) { fprintf (fd, "EVENT_TYPE\n" "0 %d OMP master\n" "VALUES\n0 End\n1 Begin\n\n", OMPT_MASTER_EV); } if (inuse[TASKGROUP_START_INDEX]) { fprintf (fd, "EVENT_TYPE\n" "0 %d Taskgroup calls\n" "VALUES\n0 Outside\n1 Start\n2 End\n", TASKGROUP_START_EV); fprintf (fd, "EVENT_TYPE\n" "0 %d Within Taskgroup region\n" "VALUES\n0 End\n1 Begin\n\n", TASKGROUP_INGROUP_DEEP_EV); } if (inuse[TASK_INDEX]) { fprintf (fd, "EVENT_TYPE\n" "0 %d Task Identifier\n\n", TASKID_EV); } if (inuse[OMP_STATS_INDEX]) { fprintf (fd, "EVENT_TYPE\n" "0 %d Number of OpenMP instantiated tasks\n" "0 %d Number of OpenMP executed tasks\n\n", OMP_STATS_BASE+OMP_NUM_TASKS_INSTANTIATED, OMP_STATS_BASE+OMP_NUM_TASKS_EXECUTED); } }
static UINT64 paraver_translate_bfd_event (unsigned ptask, unsigned task, unsigned eventtype, UINT64 eventvalue) { if (eventtype == USRFUNC_EV) return Address2Info_Translate (ptask, task, eventvalue, ADDR2UF_FUNCTION, get_option_merge_UniqueCallerID()); else if (eventtype == USRFUNC_LINE_EV) return Address2Info_Translate (ptask, task, eventvalue, ADDR2UF_LINE, get_option_merge_UniqueCallerID()); else if (eventtype >= CALLER_EV && eventtype < CALLER_EV + MAX_CALLERS) return Address2Info_Translate (ptask, task, eventvalue, ADDR2MPI_FUNCTION, get_option_merge_UniqueCallerID()); else if (eventtype >= CALLER_LINE_EV && eventtype < CALLER_LINE_EV + MAX_CALLERS) return Address2Info_Translate (ptask, task, eventvalue, ADDR2MPI_LINE, get_option_merge_UniqueCallerID()); else if (eventtype >= SAMPLING_EV && eventtype < SAMPLING_EV + MAX_CALLERS) return Address2Info_Translate (ptask, task, eventvalue, ADDR2SAMPLE_FUNCTION, get_option_merge_UniqueCallerID()); else if (eventtype >= SAMPLING_LINE_EV && eventtype < SAMPLING_LINE_EV + MAX_CALLERS) return Address2Info_Translate (ptask, task, eventvalue, ADDR2SAMPLE_LINE, get_option_merge_UniqueCallerID()); else if (eventtype == OMPFUNC_EV || eventtype == TASKFUNC_INST_EV || eventtype == TASKFUNC_EV) return Address2Info_Translate (ptask, task, eventvalue, ADDR2OMP_FUNCTION, get_option_merge_UniqueCallerID()); else if (eventtype == OMPFUNC_LINE_EV || eventtype == TASKFUNC_INST_LINE_EV || eventtype == TASKFUNC_LINE_EV) return Address2Info_Translate (ptask, task, eventvalue, ADDR2OMP_LINE, get_option_merge_UniqueCallerID()); else if (eventtype == PTHREAD_FUNC_EV) return Address2Info_Translate (ptask, task, eventvalue, ADDR2OMP_FUNCTION, get_option_merge_UniqueCallerID()); else if (eventtype == PTHREAD_FUNC_LINE_EV) return Address2Info_Translate (ptask, task, eventvalue, ADDR2OMP_LINE, get_option_merge_UniqueCallerID()); else if (eventtype == CUDAFUNC_EV) return Address2Info_Translate (ptask, task, eventvalue, ADDR2CUDA_FUNCTION, get_option_merge_UniqueCallerID()); else if (eventtype == CUDAFUNC_LINE_EV) return Address2Info_Translate (ptask, task, eventvalue, ADDR2CUDA_LINE, get_option_merge_UniqueCallerID()); else { if (Extrae_Vector_Count (&RegisteredCodeLocationTypes) > 0) { unsigned u; unsigned umax = Extrae_Vector_Count (&RegisteredCodeLocationTypes); for (u = 0; u < umax; u++) { Extrae_Addr2Type_t *element = Extrae_Vector_Get (&RegisteredCodeLocationTypes, u); if (element->FunctionType == eventtype) return Address2Info_Translate (ptask, task, eventvalue, element->FunctionType_lbl, get_option_merge_UniqueCallerID()); else if (element->LineType == eventtype) return Address2Info_Translate (ptask, task, eventvalue, element->LineType_lbl, get_option_merge_UniqueCallerID()); } } } return eventvalue; }
void MISCEvent_WriteEnabledOperations (FILE * fd, long long options) { if (options & TRACEOPTION_BG_ARCH) { fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, BG_PERSONALITY_PROCESSOR_ID, BG_PROCESSOR_ID); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, BG_PERSONALITY_TORUS_A, BG_TORUS_A); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, BG_PERSONALITY_TORUS_B, BG_TORUS_B); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, BG_PERSONALITY_TORUS_C, BG_TORUS_C); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, BG_PERSONALITY_TORUS_D, BG_TORUS_D); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, BG_PERSONALITY_TORUS_E, BG_TORUS_E); LET_SPACES (fd); } if (inuse[GETCPU_INDEX]) { fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, GETCPU_EV, GETCPU_LBL); LET_SPACES(fd); } if (inuse[APPL_INDEX]) { fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, APPL_EV, APPL_LBL); fprintf (fd, "%s\n", VALUES_LABEL); fprintf (fd, "%d %s\n", EVT_END, EVT_END_LBL); fprintf (fd, "%d %s\n", EVT_BEGIN, EVT_BEGIN_LBL); LET_SPACES (fd); fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, CLOCK_FROM_SYSTEM_EV, CLOCK_FROM_SYSTEM_LBL); LET_SPACES (fd); } if (inuse[FLUSH_INDEX]) { fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, FLUSH_EV, FLUSH_LBL); fprintf (fd, "%s\n", VALUES_LABEL); fprintf (fd, "%d %s\n", EVT_END, EVT_END_LBL); fprintf (fd, "%d %s\n", EVT_BEGIN, EVT_BEGIN_LBL); LET_SPACES (fd); } if (inuse[TRACING_INDEX]) { fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, TRACING_EV, TRACING_LBL); fprintf (fd, "%s\n", VALUES_LABEL); fprintf (fd, "%d %s\n", EVT_END, TRAC_DISABLED_LBL); fprintf (fd, "%d %s\n", EVT_BEGIN, TRAC_ENABLED_LBL); LET_SPACES (fd); } if (inuse[TRACE_INIT_INDEX]) { fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, TRACE_INIT_EV, TRACE_INIT_LBL); fprintf (fd, "%s\n", VALUES_LABEL); fprintf (fd, "%d %s\n", EVT_END, EVT_END_LBL); fprintf (fd, "%d %s\n", EVT_BEGIN, EVT_BEGIN_LBL); LET_SPACES (fd); } if (inuse[INOUT_INDEX]) { fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, IO_EV, IO_LBL); fprintf (fd, "%s\n", VALUES_LABEL); fprintf (fd, "%d %s\n", EVT_END, EVT_END_LBL); fprintf (fd, "%d %s\n", READ_VAL_EV, READ_LBL); fprintf (fd, "%d %s\n", WRITE_VAL_EV, WRITE_LBL); LET_SPACES (fd); fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, IO_SIZE_EV, IO_SIZE_LBL); LET_SPACES (fd); fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, IO_DESCRIPTOR_EV, IO_DESCRIPTOR_LBL); LET_SPACES (fd); } if (inuse[FORK_SYSCALL_INDEX]) { fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, FORK_SYSCALL_EV, FORK_SYSCALL_LBL); fprintf (fd, "%s\n", VALUES_LABEL); fprintf (fd, "%d %s\n", EVT_END, EVT_END_LBL); fprintf (fd, "%d %s\n", PRV_FORK_VALUE, FORK_LBL); fprintf (fd, "%d %s\n", PRV_WAIT_VALUE, WAIT_LBL); fprintf (fd, "%d %s\n", PRV_WAITPID_VALUE, WAITPID_LBL); fprintf (fd, "%d %s\n", PRV_EXEC_VALUE, EXEC_LBL); fprintf (fd, "%d %s\n", PRV_SYSTEM_VALUE, SYSTEM_LBL); LET_SPACES (fd); } if (inuse[DYNAMIC_MEM_INDEX]) { fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, DYNAMIC_MEM_EV, DYNAMIC_MEM_LBL); fprintf (fd, "%s\n", VALUES_LABEL); fprintf (fd, "%d %s\n", EVT_END, EVT_END_LBL); fprintf (fd, "%d %s\n", PRV_MALLOC_VALUE, MALLOC_LBL); fprintf (fd, "%d %s\n", PRV_FREE_VALUE, FREE_LBL); fprintf (fd, "%d %s\n", PRV_REALLOC_VALUE, REALLOC_LBL); fprintf (fd, "%d %s\n", PRV_CALLOC_VALUE, CALLOC_LBL); LET_SPACES (fd); fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, DYNAMIC_MEM_REQUESTED_SIZE_EV, DYNAMIC_MEM_REQUESTED_SIZE_LBL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, DYNAMIC_MEM_POINTER_IN_EV, DYNAMIC_MEM_POINTER_IN_LBL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, DYNAMIC_MEM_POINTER_OUT_EV, DYNAMIC_MEM_POINTER_OUT_LBL); LET_SPACES (fd); } if (inuse[SAMPLING_MEM_INDEX]) { fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, SAMPLING_ADDRESS_LD_EV, SAMPLING_ADDRESS_LD_LBL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, SAMPLING_ADDRESS_ST_EV, SAMPLING_ADDRESS_ST_LBL); LET_SPACES (fd); fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, SAMPLING_ADDRESS_MEM_LEVEL_EV, SAMPLING_ADDRESS_MEM_LEVEL_LBL); fprintf (fd, "%s\n", VALUES_LABEL); fprintf (fd, "0 other (uncacheable or I/O)\n"); fprintf (fd, "1 L1 cache\n"); fprintf (fd, "2 Line Fill Buffer (LFB)\n"); fprintf (fd, "3 L2 cache\n"); fprintf (fd, "4 L3 cache\n"); fprintf (fd, "5 Remote (1 or 2 hop) cache\n"); fprintf (fd, "6 DRAM (either local or remote)\n"); LET_SPACES(fd); fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, SAMPLING_ADDRESS_MEM_HITORMISS_EV, SAMPLING_ADDRESS_MEM_HITORMISS_LBL); fprintf (fd, "%s\n", VALUES_LABEL); fprintf (fd, "0 N/A\n"); fprintf (fd, "1 hit\n"); fprintf (fd, "2 miss\n"); LET_SPACES (fd); fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, SAMPLING_ADDRESS_TLB_LEVEL_EV, SAMPLING_ADDRESS_TLB_LEVEL_LBL); fprintf (fd, "%s\n", VALUES_LABEL); fprintf (fd, "0 other (hw walker or OS fault handler)\n"); fprintf (fd, "1 L1 TLB\n"); fprintf (fd, "2 L2 TLB\n"); LET_SPACES (fd); fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, SAMPLING_ADDRESS_TLB_HITORMISS_EV, SAMPLING_ADDRESS_TLB_HITORMISS_LBL); fprintf (fd, "%s\n", VALUES_LABEL); fprintf (fd, "0 N/A\n"); fprintf (fd, "1 hit\n"); fprintf (fd, "2 miss\n"); LET_SPACES (fd); fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, SAMPLING_ADDRESS_REFERENCE_COST_EV, SAMPLING_ADDRESS_REFERENCE_COST_LBL); LET_SPACES (fd); Address2Info_Write_MemReferenceCaller_Labels (fd, get_option_merge_UniqueCallerID()); } /* These events are always emitted */ fprintf (fd, "%s\n", TYPE_LABEL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, PID_EV, PID_LBL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, PPID_EV, PPID_LBL); fprintf (fd, "%d %d %s\n", MISC_GRADIENT, FORK_DEPTH_EV, FORK_DEPTH_LBL); LET_SPACES (fd); }
/****************************************************************************** *** Labels_loadSYMfile ******************************************************************************/ void Labels_loadSYMfile (int taskid, int allobjects, unsigned ptask, unsigned task, char *name, int report) { #ifndef HAVE_BFD static int shown_BFD_missing = FALSE; #endif static int Labels_loadSYMfile_init = FALSE; FILE *FD; char LINE[1024], Type; unsigned function_count = 0, hwc_count = 0, other_count = 0; if (!Labels_loadSYMfile_init) { Extrae_Vector_Init (&defined_user_event_types); Extrae_Vector_Init (&defined_basic_block_labels); Labels_loadSYMfile_init = TRUE; } event_type_t * last_event_type_used = NULL; if (!name) return; if (strlen(name) == 0) return; if (!file_exists(name)) return; FD = (FILE *) fopen (name, "r"); if (FD == NULL) { fprintf (stderr, "mpi2prv: WARNING: Task %d Can\'t open symbols file %s\n", taskid, name); return; } while (!feof (FD)) { int args_assigned; if (fgets (LINE, 1024, FD) == NULL) break; args_assigned = sscanf (LINE, "%c %[^\n]", &Type, LINE); if (args_assigned == 2) { switch (Type) { case 'B': { unsigned long start, end, offset; char module[1024]; int res = sscanf (LINE, "0 \"%lx-%lx %lx %[^\n\"]\"", &start, &end, &offset, module); if (res == 4) { #ifdef HAVE_BFD ObjectTable_AddBinaryObject (allobjects, ptask, task, start, end, offset, module); #else if (!shown_BFD_missing) fprintf (stdout, "mpi2prv: Ignoring symbols from the application execution because mpi2prv does not support BFD\n"); shown_BFD_missing = TRUE; UNREFERENCED_PARAMETER(allobjects); UNREFERENCED_PARAMETER(ptask); UNREFERENCED_PARAMETER(task); #endif } else fprintf (stderr, PACKAGE_NAME": Error! Invalid line ('%s') in %s\n", LINE, name); } break; case 'O': case 'U': case 'P': { #ifdef HAVE_BFD /* Example of line: U 0x100016d4 fA mpi_test.c 0 */ char fname[1024], modname[1024]; int line; int type; int res; UINT64 address; res = sscanf (LINE, "%lx \"%[^\"]\" \"%[^\"]\" %d", &address, fname, modname, &line); if (res != 4) fprintf (stderr, PACKAGE_NAME": Error! Invalid line ('%s') in %s\n", LINE, name); if (!get_option_merge_UniqueCallerID()) { if (Type == 'O') type = OTHER_FUNCTION_TYPE; else if (Type == 'U') type = USER_FUNCTION_TYPE; else /* if (Type == 'P') */ type = OUTLINED_OPENMP_TYPE; } else type = UNIQUE_TYPE; Address2Info_AddSymbol (address, type, fname, modname, line); function_count++; #endif /* HAVE_BFD */ } break; case 'H': { int res, eventcode; char hwc_description[1024]; res = sscanf (LINE, "%d \"%[^\"]\"", &eventcode, hwc_description); if (res != 2) fprintf (stderr, PACKAGE_NAME": Error! Invalid line ('%s') in %s\n", LINE, name); Labels_AddHWCounter_Code_Description (eventcode, hwc_description); hwc_count++; } break; case 'c': case 'C': { int res, eventcode; char code_description[1024]; res = sscanf (LINE, "%d \"%[^\"]\"", &eventcode, code_description); if (res != 2) fprintf (stderr, PACKAGE_NAME": Error! Invalid line ('%s') in %s\n", LINE, name); Labels_Add_CodeLocation_Label (eventcode, Type=='C'?CODELOCATION_FUNCTION:CODELOCATION_FILELINE, code_description); other_count++; } break; case 'd': { int res, eventvalue; char value_description[1024]; value_t * evt_value = NULL; unsigned i, max = Extrae_Vector_Count (&last_event_type_used->event_values); res = sscanf (LINE, "%d \"%[^\"]\"", &eventvalue, value_description); if (res != 2) fprintf (stderr, PACKAGE_NAME": Error! Invalid line ('%s') in %s\n", LINE, name); for (i = 0; i < max; i++) { value_t * evt = Extrae_Vector_Get (&last_event_type_used->event_values, i); if(evt->value == eventvalue) { if(strcmp(evt->label, value_description)) { fprintf(stderr, PACKAGE_NAME"(%s,%d): Warning! Ignoring duplicate definition \"%s\" for value type %d,%d!\n",__FILE__, __LINE__, value_description,last_event_type_used->event_type.type, eventvalue); } evt_value = evt; break; } } if (!evt_value) { evt_value = (value_t*) malloc (sizeof (value_t)); if (evt_value == NULL) { fprintf (stderr, PACKAGE_NAME"(%s,%d): Fatal error! Cannot allocate memory to store the 'd' symbol in TRACE.sym file\n", __FILE__, __LINE__); exit(-1); } evt_value->value = eventvalue; strcpy(evt_value->label, value_description); Extrae_Vector_Append (&last_event_type_used->event_values, evt_value); other_count++; } } break; case 'D': { int res, eventcode; char code_description[1024]; unsigned i, max = Extrae_Vector_Count (&defined_user_event_types); event_type_t * evt_type = NULL; res = sscanf (LINE, "%d \"%[^\"]\"", &eventcode, code_description); if (res != 2) fprintf (stderr, PACKAGE_NAME": Error! Invalid line ('%s') in %s\n", LINE, name); for (i = 0; i < max; i++) { event_type_t * evt = Extrae_Vector_Get (&defined_user_event_types, i); if (evt->event_type.type == eventcode) { if(strcmp(evt->event_type.label, code_description)) { fprintf(stderr, PACKAGE_NAME"(%s,%d): Warning! Ignoring duplicate definition \"%s\" for type %d!\n", __FILE__, __LINE__, code_description, eventcode); } evt_type = evt; break; } } if (!evt_type) { evt_type = (event_type_t*) malloc (sizeof (event_type_t)); if (evt_type == NULL) { fprintf (stderr, "Extrae (%s,%d): Fatal error! Cannot allocate memory to store the 'D' symbol in TRACE.sym file\n", __FILE__, __LINE__); exit(-1); } evt_type->event_type.type = eventcode; strcpy(evt_type->event_type.label, code_description); Extrae_Vector_Init(&evt_type->event_values); Extrae_Vector_Append(&defined_user_event_types, evt_type); other_count++; } last_event_type_used = evt_type; } break; case 'b': // BasicBlocks symbol { int res, eventvalue; char bb_description[1024]; unsigned i, max = Extrae_Vector_Count (&defined_basic_block_labels); event_type_t * evt_type = NULL; value_t * evt_value = NULL; res = sscanf (LINE, "%d \"%[^\"]\"", &eventvalue, bb_description); if (res != 2) fprintf (stderr, PACKAGE_NAME": Error! Invalid line ('%s') in %s\n", LINE, name); if (max==0){ evt_type = (event_type_t*) malloc (sizeof (event_type_t)); if (evt_type == NULL) { fprintf (stderr, "Extrae (%s,%d): Fatal error! Cannot allocate memory to store the 'B' symbol in TRACE.sym file\n", __FILE__, __LINE__); exit(-1); } evt_type->event_type.type = USRFUNC_EV_BB; strcpy(evt_type->event_type.label, "BASIC_BLOCKS"); Extrae_Vector_Init(&evt_type->event_values); Extrae_Vector_Append(&defined_basic_block_labels, evt_type); } else { evt_type = Extrae_Vector_Get (&defined_basic_block_labels, 0); // There is only one event type in the vector } max = Extrae_Vector_Count (&evt_type->event_values); for(i = 0; i < max; i++) { value_t * evt = Extrae_Vector_Get (&evt_type->event_values, i); if(evt->value == eventvalue) { if(strcmp(evt->label, bb_description)) { fprintf(stderr, "Extrae (%s,%d): Warning! Ignoring duplicate definition \"%s\" for value type %d,%d!\n",__FILE__, __LINE__, bb_description,evt_type->event_type.type, eventvalue); } evt_value = evt; break; } } if (!evt_value) { evt_value = (value_t*) malloc (sizeof (value_t)); if (evt_value == NULL) { fprintf (stderr, "Extrae (%s,%d): Fatal error! Cannot allocate memory to store the 'B' symbol in TRACE.sym file\n", __FILE__, __LINE__); exit(-1); } evt_value->value = eventvalue; strcpy(evt_value->label, bb_description); Extrae_Vector_Append (&evt_type->event_values, evt_value); other_count++; } } break; default: fprintf (stderr, PACKAGE_NAME" mpi2prv: Error! Task %d found unexpected line in symbol file '%s'\n", taskid, LINE); break; } } } if (taskid == 0 && report) { fprintf (stdout, "mpi2prv: A total of %u symbols were imported from %s file\n", function_count+hwc_count+other_count, name); fprintf (stdout, "mpi2prv: %u function symbols imported\n", function_count); fprintf (stdout, "mpi2prv: %u HWC counter descriptions imported\n", hwc_count); } fclose (FD); }