VirtualBox

Changeset 40558 in vbox


Ignore:
Timestamp:
Mar 21, 2012 1:54:03 AM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76951
Message:

generated the header, working on the assembly.

Location:
trunk/src/bldprogs
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bldprogs/VBoxTpG.cpp

    r40557 r40558  
    3131#include <iprt/mem.h>
    3232#include <iprt/message.h>
     33#include <iprt/path.h>
    3334#include <iprt/process.h>
    3435#include <iprt/stream.h>
     
    211212}
    212213
     214static 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
     228static 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
    213237
    214238static RTEXITCODE generateAssembly(PSCMSTREAM pStrm)
     
    217241        RTMsgInfo("Generating assembly code...");
    218242
    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
    220323    return RTEXITCODE_SUCCESS;
    221324}
     
    226329    if (!pszTempAsm)
    227330    {
    228         size_t cch = strlen(pszTempAsm);
     331        size_t cch = strlen(pszOutput);
    229332        char  *psz = (char *)alloca(cch + sizeof(".asm"));
    230333        memcpy(psz, pszOutput, cch);
     
    241344
    242345
     346static 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
    243368static RTEXITCODE generateHeaderInner(PSCMSTREAM pStrm)
    244369{
    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"));
    246496    return RTEXITCODE_SUCCESS;
    247497}
  • trunk/src/bldprogs/scmstream.cpp

    r40557 r40558  
    994994
    995995            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);
    997998            if (!pchLF)
    998999            {
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette