00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <stdio.h>
00029 #include <memory.h>
00030 #include <malloc.h>
00031 #include <assert.h>
00032 #include <locale.h>
00033 #include "kapi_internal.h"
00034 #include "kapi_util.h"
00035 #include "kapi_parse.h"
00036 #include "kapi_error.h"
00037 #include "kapi_symbol.h"
00038 #include "kapi_ia64.h"
00039
00040 void KDebug_DumpKnobs( FILE *fp, knobs_t *pknobs, int nTab );
00041 int kapi_fEnableIA64Calls( knobs_t *pknobs );
00042
00043
00044 int KAPI_error_attribute = 0;
00045 int kapi_fTrace_Msgs_On = 0;
00046
00047
00048 void kapi_ReadKnobsfile( FILE *fp, knobs_t *pknobs );
00049 static int fCheckExpectedValues( knobs_t *pknobs );
00050 static void RestructureAttributes( knobs_t *pknobs );
00051 static void kapi_InitClusterPortDatastructures( knobs_t *pknobs );
00052 static void kapi_free_ia64_mem(knobs_t *pknobs);
00053 extern int yydebug;
00054 void *
00055 KAPI_Initialize( FILE *fpDelta, FILE *fpBaseline, char *pchToolname)
00056 {
00057 knobs_t *pknobs;
00058 int fExpectedOk;
00059 char *pchFN;
00060
00061
00062 KAPI_error_attribute = 0;
00063
00064 pknobs = (knobs_t *) malloc( sizeof( knobs_t ) );
00065 memset( pknobs, 0, sizeof( knobs_t ) );
00066
00067 pknobs->pchToolname = kapi_pchCopy( pchToolname );
00068 pknobs->fRestructuredAttributes = 0;
00069 pknobs->fImplicitNone = 0;
00070 pknobs->nclr = 1;
00071 pknobs->pfSaveHeaderFlags=NULL;
00072
00073 kapi_InitSymbolTable( pknobs );
00074
00075
00076
00077
00078
00079 kapi_InitClusterPortDatastructures( pknobs );
00080
00081 kapi_ParseFile( pknobs, fpBaseline );
00082 if ( kapi_cntSemanticError > 0 || kapi_cntSyntaxError > 0 ) {
00083 KAPI_error_attribute = 1;
00084 return( NULL );
00085 }
00086 #if YYDEBUG!=0
00087 yydebug=1;
00088 #endif
00089 kapi_ParseFile( pknobs, fpDelta );
00090
00091
00092 if ( kapi_cntSemanticError > 0 || kapi_cntSyntaxError > 0 ) {
00093 KAPI_error_attribute = 1;
00094 return( NULL );
00095 }
00096
00097
00098
00099
00100
00101 RestructureAttributes( pknobs );
00102
00103
00104 fExpectedOk = fCheckExpectedValues( pknobs );
00105 if ( !fExpectedOk ) {
00106 KAPI_error_attribute = 1;
00107 return( NULL );
00108 }
00109
00110
00111 if ( 1 == KAPI_GetIntegerVariable( pknobs, "ScheduleTraceMessages", 0 ) ) {
00112 kapi_fTrace_Msgs_On = 1;
00113 }
00114
00115
00116 pchFN = KAPI_GetStringVariable( pknobs, "DumpKnobsSummary", 0 );
00117 if ( NULL != pchFN ) {
00118 FILE *fp_local;
00119
00120 fp_local = fopen( pchFN, "w" );
00121 if ( fp_local ) {
00122 KDebug_DumpKnobs( fp_local, pknobs, 0 );
00123 fclose( fp_local );
00124 }
00125 }
00126
00127
00128 return( pknobs );
00129 }
00130
00131 void *
00132 KAPI_Initialize2( char *pchDelta, char *pchBaseline, char *pchToolname )
00133 {
00134 knobs_t *pknobs;
00135 FILE *fpDelta, *fpBaseline;
00136
00137
00138 if ( pchDelta != NULL ) {
00139 fpDelta = fopen( pchDelta, "r" );
00140 } else {
00141 fpDelta = NULL;
00142 }
00143 if ( pchBaseline != NULL ) {
00144 fpBaseline = fopen( pchBaseline, "r" );
00145 } else {
00146 fpBaseline = NULL;
00147 }
00148
00149 if ( fpDelta == NULL && fpBaseline == NULL ) {
00150 printf("KAPI ERROR: Files '%s' and '%s' do not exist\n", pchDelta, pchBaseline );
00151 return( NULL );
00152 }
00153
00154 pknobs = KAPI_Initialize( fpDelta, fpBaseline, pchToolname );
00155
00156 if ( kapi_fTrace_Msgs_On ) {
00157 fprintf( stderr, "+KAPI_Initialize2 < %s %s %s > %d\n",
00158 pchDelta ? pchDelta : "NULL",
00159 pchBaseline ? pchBaseline : "NULL",
00160 pchToolname, (int)(long)pknobs );
00161 }
00162
00163 if ( fpDelta ) {
00164 fclose( fpDelta );
00165 }
00166 if ( fpBaseline ) {
00167 fclose( fpBaseline );
00168 }
00169
00170 return( pknobs );
00171 }
00172
00173
00174
00175 void kapi_free_valn_string_list(valn_t *pvaln)
00176 {
00177 valn_t *pvalnNext;
00178 while (pvaln!=NULL)
00179 {
00180 pvalnNext=pvaln->pvalnNext;
00181 free(pvaln->val.pch);
00182 free(pvaln);
00183 pvaln=pvalnNext;
00184 }
00185 }
00186
00187
00188 static void kapi_free_stn_node(stn_t *pstn)
00189 {
00190 ed_t *ped,*pedNext;
00191 limp_t *plimp,*plimpNext;
00192 switch (pstn->ity)
00193 {
00194 case ityVARNAME:
00195 ped=pstn->u.vfi.pedList;
00196 while (ped!=NULL)
00197 {
00198 pedNext=ped->pedNext;
00199 free(ped);
00200 ped=pedNext;
00201 }
00202 break;
00203 }
00204 plimp=pstn->plimpListParse;
00205 while (plimp!=NULL)
00206 {
00207 plimpNext=plimp->plimpNext;
00208 free(plimp);
00209 plimp=plimpNext;
00210 }
00211 if (pstn->pchName!=NULL) free(pstn->pchName);
00212 }
00213
00214 void
00215 KAPI_Finalize( void *pConfig )
00216 {
00217 knobs_t *pknobs = pConfig;
00218 int i;
00219 stn_t *pstn,*pstnNext;
00220
00221 if ( kapi_fTrace_Msgs_On ) {
00222 fprintf( stderr, "+KAPI_Finalize < %d\n", (int)(long)pknobs );
00223 }
00224 if ( pConfig ) {
00225 kapi_free_ia64_mem(pknobs);
00226
00227 kapi_free_valn_string_list(pknobs->pvalnTypeList);
00228 kapi_free_valn_string_list(pknobs->pvalnVarList);
00229 kapi_free_valn_string_list(pknobs->pvalnAttrList);
00230
00231 for (i=0;i<pknobs->nstn;i++)
00232 {
00233 pstn=pknobs->dmpstn[i].pstnHashNext;
00234 while (pstn!=NULL)
00235 {
00236 kapi_free_stn_node(pstn);
00237 pstnNext=pstn->pstnHashNext;
00238 free(pstn);
00239 pstn=pstnNext;
00240 }
00241 }
00242 free(pknobs->dmpstn);
00243 free( pknobs );
00244 }
00245 }
00246
00247
00248
00249
00250
00251 static int
00252 fCheckExpectedValues( knobs_t *pknobs )
00253 {
00254 stn_t *pstnRun;
00255 int fPass;
00256 int i;
00257
00258 fPass = 1;
00259 for ( i=0; i<pknobs->nstn; i++ ) {
00260 pstnRun = pknobs->dmpstn[ i ].pstnHashNext;
00261 while ( pstnRun ) {
00262 if ( pstnRun->fExpected ) {
00263 kapi_Error_pch2( -1, 0, "%s not found in knobsfile, expected to be declared as a %s",
00264 pstnRun->pchName, ity2pchname( pstnRun->ity ) );
00265 fPass = 0;
00266 }
00267 pstnRun = pstnRun->pstnHashNext;
00268 }
00269 }
00270
00271 return( fPass );
00272 }
00273
00274
00275 static void
00276 RestructureAttributes( knobs_t *pknobs )
00277 {
00278 valn_t *pvalnRun;
00279
00280
00281 assert( pknobs->fRestructuredAttributes == 0 );
00282
00283
00284
00285
00286
00287
00288
00289 pvalnRun = pknobs->pvalnAttrList;
00290 while ( pvalnRun ) {
00291 stn_t *pstnTmp;
00292 afi_t *pafiList, *pafiRun;
00293 int idx;
00294
00295 pstnTmp = kapi_pstnLookup_noadd( pknobs, pvalnRun->val.pch );
00296 assert( pstnTmp->ity == ityATTRIBUTENAME );
00297
00298
00299 pafiList = pstnTmp->u.afih.u.pafi;
00300
00301
00302 pstnTmp->u.afih.u.dmppch = (char **)malloc(
00303 sizeof( char * ) * pstnTmp->u.afih.nAttr );
00304
00305
00306 pafiRun = pafiList;
00307 idx = pstnTmp->u.afih.nAttr - 1;
00308 while ( pafiRun ) {
00309 pstnTmp->u.afih.u.dmppch[ idx ] = pafiRun->pchAttrVal;
00310 pafiRun = pafiRun->pafiNext;
00311 idx--;
00312 }
00313
00314 pvalnRun = pvalnRun->pvalnNext;
00315 }
00316
00317
00318 pknobs->fRestructuredAttributes = 1;
00319 }
00320
00321
00322 static void
00323 kapi_InitClusterPortDatastructures( knobs_t *pknobs )
00324 {
00325 int clr;
00326
00327 pknobs->nclr = 1;
00328 for ( clr=0;clr<maxCLR;clr++ ) {
00329 clr_t *pclr;
00330
00331 pclr = &(pknobs->mpclrTable[ clr ]);
00332 pclr->idxclr = clr;
00333
00334 pclr = &(pknobs->mpclrTable[ clr ]);
00335 pclr->dmppcportinfoTable[ kapi_utI ]
00336 = (cportinfo_t *)malloc( sizeof(cportinfo_t)*maxICPORTS );
00337 memset( pclr->dmppcportinfoTable[ kapi_utI ], 0,
00338 sizeof(cportinfo_t)*maxICPORTS );
00339
00340 pclr->dmppcportinfoTable[ kapi_utM ]
00341 = (cportinfo_t *)malloc( sizeof(cportinfo_t)*maxMCPORTS );
00342 memset( pclr->dmppcportinfoTable[ kapi_utM ], 0,
00343 sizeof(cportinfo_t)*maxMCPORTS );
00344
00345 pclr->dmppcportinfoTable[ kapi_utB ]
00346 = (cportinfo_t *)malloc( sizeof(cportinfo_t)*maxBCPORTS );
00347 memset( pclr->dmppcportinfoTable[ kapi_utB ], 0,
00348 sizeof(cportinfo_t)*maxBCPORTS );
00349
00350 pclr->dmppcportinfoTable[ kapi_utF ]
00351 = (cportinfo_t *)malloc( sizeof(cportinfo_t)*maxFCPORTS );
00352 memset( pclr->dmppcportinfoTable[ kapi_utF ], 0,
00353 sizeof(cportinfo_t)*maxFCPORTS );
00354
00355 pclr->mpncutport[ kapi_utI ] = -1;
00356 pclr->mpncutport[ kapi_utM ] = -1;
00357 pclr->mpncutport[ kapi_utF ] = -1;
00358 pclr->mpncutport[ kapi_utB ] = -1;
00359 }
00360 }
00361
00362
00363
00364
00365 static void kapi_free_ia64_mem(knobs_t *pknobs)
00366 {
00367 int clr,i;
00368
00369
00370 if (pknobs->pfSaveHeaderFlags!=NULL)
00371 return;
00372
00373 for ( clr=0;clr<maxCLR;clr++ ) {
00374 clr_t *pclr;
00375
00376 pclr = &(pknobs->mpclrTable[ clr ]);
00377 free(pclr->dmppcportinfoTable[ kapi_utI ]);
00378 free(pclr->dmppcportinfoTable[ kapi_utM ]);
00379 free(pclr->dmppcportinfoTable[ kapi_utB ]);
00380 free(pclr->dmppcportinfoTable[ kapi_utF ]);
00381 }
00382 free(pknobs->dmpitinfoTable);
00383 free(pknobs->dmpsylinfoTable);
00384 free(pknobs->dmpbidinfoTable);
00385 free(pknobs->dmpfuinfoTable);
00386 free(pknobs->dmpebyInterTable);
00387 free(pknobs->dmpabyIntraTable);
00388 free(pknobs->dmpinstTable);
00389 for (i=0;i<cache_type_enum_size;i++)
00390 {
00391 free(pknobs->dmpcacheTable[i]);
00392 }
00393
00394 }