Changeset 40558 in vbox
- Timestamp:
- Mar 21, 2012 1:54:03 AM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 76951
- Location:
- trunk/src/bldprogs
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/bldprogs/VBoxTpG.cpp
r40557 r40558 31 31 #include <iprt/mem.h> 32 32 #include <iprt/message.h> 33 #include <iprt/path.h> 33 34 #include <iprt/process.h> 34 35 #include <iprt/stream.h> … … 211 212 } 212 213 214 static ssize_t ScmStreamPrintfV(PSCMSTREAM pStream, const char *pszFormat, va_list va) 215 { 216 char *psz; 217 ssize_t cch = RTStrAPrintfV(&psz, pszFormat, va); 218 if (cch) 219 { 220 int rc = ScmStreamWrite(pStream, psz, cch); 221 RTStrFree(psz); 222 if (RT_FAILURE(rc)) 223 cch = rc; 224 } 225 return cch; 226 } 227 228 static ssize_t ScmStreamPrintf(PSCMSTREAM pStream, const char *pszFormat, ...) 229 { 230 va_list va; 231 va_start(va, pszFormat); 232 ssize_t cch = ScmStreamPrintfV(pStream, pszFormat, va); 233 va_end(va); 234 return cch; 235 } 236 213 237 214 238 static RTEXITCODE generateAssembly(PSCMSTREAM pStrm) … … 217 241 RTMsgInfo("Generating assembly code..."); 218 242 219 RTPrintf("Todo generate the assembly code\n"); 243 /* 244 * Write the file header. 245 */ 246 ScmStreamPrintf(pStrm, 247 "; $Id$ \n" 248 ";; @file\n" 249 "; Automatically generated from %s. Do NOT edit!\n" 250 ";\n" 251 "\n" 252 "%include \"iprt/asmdefs.h\"\n" 253 "\n" 254 , 255 g_pszScript); 256 257 /* 258 * Declare the probe enable flags. 259 */ 260 ScmStreamPrintf(pStrm, 261 ";\n" 262 "; Probe enabled flags. Since these will be accessed all the time\n" 263 "; they are placed together to get some more cache and TLB hits when\n" 264 "; the probes are disabled." 265 ";\n" 266 "BEGINDATA\n" 267 "ALIGNDATA(16)\n" 268 "GLOBALNAME g_afVTGProbeEnabled\n" 269 ); 270 PVTGPROVIDER pProv; 271 RTListForEach(&g_ProviderHead, pProv, VTGPROVIDER, ListEntry) 272 { 273 PVTGPROBE pProbe; 274 RTListForEach(&pProv->ProbeHead, pProbe, VTGPROBE, ListEntry) 275 { 276 ScmStreamPrintf(pStrm, 277 "GLOBALNAME g_fVTGProbeEnabled_%s_%s\n" 278 " db 0\n", 279 pProv->pszName, pProbe->pszName); 280 } 281 } 282 ScmStreamPrintf(pStrm, "GLOBALNAME g_afVTGProbeEnabled_End\n"); 283 284 /* 285 * Declare the probe data. 286 */ 287 ScmStreamPrintf(pStrm, 288 "\n" 289 ";\n" 290 "; Prob data.\n" 291 ";\n" 292 "BEGINDATA\n" 293 "GLOBALNAME g_aVTGProbeData\n" 294 "\n"); 295 RTListForEach(&g_ProviderHead, pProv, VTGPROVIDER, ListEntry) 296 { 297 PVTGPROBE pProbe; 298 RTListForEach(&pProv->ProbeHead, pProbe, VTGPROBE, ListEntry) 299 { 300 /** @todo */ 301 //ScmStreamPrintf(pStrm, 302 // "GLOBALNAME g_fVTGProbeEnabled_%s_%s\n" 303 // " db 0\n", 304 // pProv->pszName, pProbe->pszName); 305 } 306 } 307 ScmStreamPrintf(pStrm, "GLOBALNAME g_aVTGProbeData_End\n"); 308 309 /* 310 * Write the string table. 311 */ 312 ScmStreamPrintf(pStrm, 313 "\n" 314 ";\n" 315 "; String table.\n" 316 ";\n" 317 "BEGINDATA\n" 318 "GLOBALNAME g_abVTGProbeStrings\n" 319 "\n"); 320 /** @todo */ 321 ScmStreamPrintf(pStrm, "GLOBALNAME g_abVTGProbeStrings_End\n"); 322 220 323 return RTEXITCODE_SUCCESS; 221 324 } … … 226 329 if (!pszTempAsm) 227 330 { 228 size_t cch = strlen(psz TempAsm);331 size_t cch = strlen(pszOutput); 229 332 char *psz = (char *)alloca(cch + sizeof(".asm")); 230 333 memcpy(psz, pszOutput, cch); … … 241 344 242 345 346 static RTEXITCODE generateProbeDefineName(char *pszBuf, size_t cbBuf, const char *pszProvider, const char *pszProbe) 347 { 348 size_t cbMax = strlen(pszProvider) + 1 + strlen(pszProbe) + 1; 349 if (cbMax > cbBuf || cbMax > 80) 350 return RTMsgErrorExit(RTEXITCODE_FAILURE, "Probe '%s' in provider '%s' ends up with a too long defined\n", pszProbe, pszProvider); 351 352 while (*pszProvider) 353 *pszBuf++ = RT_C_TO_UPPER(*pszProvider++); 354 355 *pszBuf++ = '_'; 356 357 while (*pszProbe) 358 { 359 if (pszProbe[0] == '_' && pszProbe[1] == '_') 360 pszProbe++; 361 *pszBuf++ = RT_C_TO_UPPER(*pszProbe++); 362 } 363 364 *pszBuf = '\0'; 365 return RTEXITCODE_SUCCESS; 366 } 367 243 368 static RTEXITCODE generateHeaderInner(PSCMSTREAM pStrm) 244 369 { 245 RTPrintf("Todo generate the header\n"); 370 /* 371 * Calc the double inclusion blocker define and then write the file header. 372 */ 373 char szTmp[4096]; 374 const char *pszName = RTPathFilename(g_pszScript); 375 size_t cchName = strlen(pszName); 376 if (cchName >= sizeof(szTmp) - 64) 377 return RTMsgErrorExit(RTEXITCODE_FAILURE, "File name is too long '%s'", pszName); 378 szTmp[0] = '_'; 379 szTmp[1] = '_'; 380 szTmp[2] = '_'; 381 memcpy(&szTmp[3], pszName, cchName); 382 szTmp[3 + cchName + 0] = '_'; 383 szTmp[3 + cchName + 1] = '_'; 384 szTmp[3 + cchName + 2] = '_'; 385 szTmp[3 + cchName + 3] = '\0'; 386 char *psz = &szTmp[3]; 387 while (*psz) 388 { 389 if (!RT_C_IS_ALNUM(*psz) && *psz != '_') 390 *psz = '_'; 391 psz++; 392 } 393 394 ScmStreamPrintf(pStrm, 395 "/* $Id$ */\n" 396 "/** @file\n" 397 " * Automatically generated from %s. Do NOT edit!\n" 398 " */\n" 399 "\n" 400 "#ifndef %s\n" 401 "#define %s\n" 402 "\n" 403 "#include <iprt/types.h>\n" 404 "\n" 405 "#ifdef _MSC_VER\n" 406 "# define DECL_DATA_SECT(scope, type, name, sect) __declspec(allocate(#sect)) scope type name\n" 407 "#elif defined(__GNUC__)\n" 408 "# ifdef RT_OS_DARWIN\n" 409 "# define DECL_DATA_SECT(scope, type, name, sect) scope type __attribute__((section(#sect \",\" #sect))) name\n" 410 "# else\n" 411 "# define DECL_DATA_SECT(scope, type, name, sect) scope type __attribute__((section(#sect))) name\n" 412 "# endif\n" 413 "#else\n" 414 "# error portme\n" 415 "#endif\n" 416 "\n" 417 "typedef struct VBOXTPGPROBELOC\n" 418 "{\n" 419 " uint32_t uLine : 31;\n" 420 " uint32_t fEnabled : 1;\n" 421 " uint32_t idProbe;\n" 422 " const char *pszFunction;\n" 423 " const char *pszFile;\n" 424 " uint8_t *pbProbe;\n" 425 "} VBOXTPGPROBELOC;\n" 426 "\n" 427 "RT_C_DECLS_BEGIN\n" 428 , 429 g_pszScript, 430 szTmp, 431 szTmp); 432 433 /* 434 * Declare data, code and macros for each probe. 435 */ 436 PVTGPROVIDER pProv; 437 RTListForEach(&g_ProviderHead, pProv, VTGPROVIDER, ListEntry) 438 { 439 PVTGPROBE pProbe; 440 RTListForEach(&pProv->ProbeHead, pProbe, VTGPROBE, ListEntry) 441 { 442 PVTGARG pArg; 443 ScmStreamPrintf(pStrm, 444 "extern bool g_fVTGProbeEnabled_%s_%s;\n" 445 "extern uint8_t g_VTGProbeData_%s_%s;\n" 446 "DECLASM(void) VTGProbeStub_%s_%s(VBOXTPGPROBELOC *", 447 pProv->pszName, pProbe->pszName, 448 pProv->pszName, pProbe->pszName, 449 pProv->pszName, pProbe->pszName); 450 RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry) 451 { 452 ScmStreamPrintf(pStrm, ", %s", pArg->pszType); 453 } 454 generateProbeDefineName(szTmp, sizeof(szTmp), pProv->pszName, pProbe->pszName); 455 ScmStreamPrintf(pStrm, 456 ");\n" 457 "#define %s_ENABLED() \\\n" 458 " (RT_UNLIKELY(g_fVTGProbeEnabled_%s_%s)) \n" 459 "#define %s(" 460 , szTmp, 461 pProv->pszName, pProbe->pszName, 462 szTmp); 463 RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry) 464 { 465 if (RTListNodeIsFirst(&pProbe->ArgHead, &pArg->ListEntry)) 466 ScmStreamPrintf(pStrm, "%s", pArg->pszName); 467 else 468 ScmStreamPrintf(pStrm, ", %s", pArg->pszName); 469 } 470 ScmStreamPrintf(pStrm, 471 ") \\\n" 472 " do { \\\n" 473 " if (RT_UNLIKELY(/*g_fVTGProbeEnabled_%s_%s*/ true)) \\\n" 474 " { \\\n" 475 " DECL_DATA_SECT(static, VBOXTPGPROBELOC, s_VTGProbeLoc, VTGPrLc) = \\\n" 476 " { __LINE__, 0, UINT32_MAX, __PRETTY_FUNCTION__, __FILE__, /*&g_VTGProbeData_%s_%s*/ NULL }; \\\n" 477 " /*VTGProbeStub_%s_%s(&s_VTGProbeLoc", 478 pProv->pszName, pProbe->pszName, 479 pProv->pszName, pProbe->pszName, 480 pProv->pszName, pProbe->pszName); 481 RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry) 482 { 483 ScmStreamPrintf(pStrm, ", %s", pArg->pszName); 484 } 485 ScmStreamPrintf(pStrm, 486 ");*/ RTAssertMsg2(\"%p\", &s_VTGProbeLoc); \\\n" 487 " } \\\n" 488 " } while (0)\n" 489 "\n"); 490 } 491 } 492 493 ScmStreamWrite(pStrm, RT_STR_TUPLE("\n" 494 "RT_C_DECLS_END\n" 495 "#endif\n")); 246 496 return RTEXITCODE_SUCCESS; 247 497 } -
trunk/src/bldprogs/scmstream.cpp
r40557 r40558 994 994 995 995 size_t cchLeft = cchBuf - offBuf; 996 pchLF = (const char *)memchr(pchLF + 1, '\n', cchLeft); 996 pchLine = pchLF + 1; 997 pchLF = (const char *)memchr(pchLine, '\n', cchLeft); 997 998 if (!pchLF) 998 999 {
Note:
See TracChangeset
for help on using the changeset viewer.