VirtualBox

Changeset 41342 in vbox for trunk/src/bldprogs


Ignore:
Timestamp:
May 16, 2012 7:42:16 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
78017
Message:

VBoxTpG: --generate-wrapper-header.

File:
1 edited

Legend:

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

    r41339 r41342  
    137137    kVBoxTpGAction_Nothing,
    138138    kVBoxTpGAction_GenerateHeader,
     139    kVBoxTpGAction_GenerateWrapperHeader,
    139140    kVBoxTpGAction_GenerateObject
    140141}                           g_enmAction                 = kVBoxTpGAction_Nothing;
     
    142143static uint32_t             g_cHostBits                 = HC_ARCH_BITS;
    143144static uint32_t             g_fTypeContext              = VTG_TYPE_CTX_R0;
     145static const char          *g_pszContextDefine          = "IN_RING0";
    144146static bool                 g_fApplyCpp                 = false;
    145147static uint32_t             g_cVerbosity                = 0;
     
    294296        apszArgs[iArg++] = "RT_ARCH_AMD64";
    295297    apszArgs[iArg++] = g_pszAssemblerDefOpt;
    296     if (g_fTypeContext == VTG_TYPE_CTX_R0)
    297         apszArgs[iArg++] = "IN_RING0";
    298     else if (g_fTypeContext == VTG_TYPE_CTX_R3)
    299         apszArgs[iArg++] = "IN_RING3";
    300     else if (g_fTypeContext == VTG_TYPE_CTX_RC)
    301         apszArgs[iArg++] = "IN_RC";
    302     else
    303         apszArgs[iArg++] = "IN_UNKNOWN";
     298    apszArgs[iArg++] = g_pszContextDefine;
    304299    if (g_szAssemblerOsDef[0])
    305300    {
     
    902897}
    903898
     899
    904900/**
    905901 * Called via generateFile to generate the header file.
     
    908904 * @param   pStrm               The output stream.
    909905 */
    910 static RTEXITCODE generateHeaderInner(PSCMSTREAM pStrm)
     906static RTEXITCODE generateHeader(PSCMSTREAM pStrm)
    911907{
    912908    /*
     
    934930    }
    935931
    936     const char *pszCtxDefine = "UNKNOWN_DEFINE";
    937     if (g_fTypeContext == VTG_TYPE_CTX_R0)
    938         pszCtxDefine = "IN_RING0";
    939     else if (g_fTypeContext == VTG_TYPE_CTX_R3)
    940         pszCtxDefine = "IN_RING3";
    941     else if (g_fTypeContext == VTG_TYPE_CTX_RC)
    942         pszCtxDefine = "IN_RC";
    943     else
    944         AssertFailed();
    945 
    946932    ScmStreamPrintf(pStrm,
    947933                    "/* $Id$ */\n"
     
    972958                    szTmp,
    973959                    szTmp,
    974                     pszCtxDefine,
    975                     pszCtxDefine);
     960                    g_pszContextDefine,
     961                    g_pszContextDefine);
    976962
    977963    /*
     
    10911077
    10921078
    1093 static RTEXITCODE generateHeader(const char *pszHeader)
    1094 {
    1095     return generateFile(pszHeader, "header", generateHeaderInner);
     1079/**
     1080 * Called via generateFile to generate the wrapper header file.
     1081 *
     1082 * @returns Exit code status.
     1083 * @param   pStrm               The output stream.
     1084 */
     1085static RTEXITCODE generateWrapperHeader(PSCMSTREAM pStrm)
     1086{
     1087    /*
     1088     * Calc the double inclusion blocker define and then write the file header.
     1089     */
     1090    char szTmp[4096];
     1091    const char *pszName = RTPathFilename(g_pszScript);
     1092    size_t      cchName = strlen(pszName);
     1093    if (cchName >= sizeof(szTmp) - 64)
     1094        return RTMsgErrorExit(RTEXITCODE_FAILURE, "File name is too long '%s'", pszName);
     1095    szTmp[0] = '_';
     1096    szTmp[1] = '_';
     1097    szTmp[2] = '_';
     1098    memcpy(&szTmp[3], pszName, cchName);
     1099    strcpy(&szTmp[3 + cchName ], "___WRAPPER___");
     1100    char *psz = &szTmp[3];
     1101    while (*psz)
     1102    {
     1103        if (!RT_C_IS_ALNUM(*psz) && *psz != '_')
     1104            *psz = '_';
     1105        psz++;
     1106    }
     1107
     1108    ScmStreamPrintf(pStrm,
     1109                    "/* $Id$ */\n"
     1110                    "/** @file\n"
     1111                    " * Automatically generated from %s.  Do NOT edit!\n"
     1112                    " */\n"
     1113                    "\n"
     1114                    "#ifndef %s\n"
     1115                    "#define %s\n"
     1116                    "\n"
     1117                    "#include <VBox/VBoxTpG.h>\n"
     1118                    "\n"
     1119                    "#ifndef %s\n"
     1120                    "# error \"Expected '%s' to be defined\"\n"
     1121                    "#endif\n"
     1122                    "\n"
     1123                    "#ifdef VBOX_WITH_DTRACE\n"
     1124                    "\n"
     1125                    ,
     1126                    g_pszScript,
     1127                    szTmp,
     1128                    szTmp,
     1129                    g_pszContextDefine,
     1130                    g_pszContextDefine);
     1131
     1132    /*
     1133     * Declare macros for each probe.
     1134     */
     1135    PVTGPROVIDER pProv;
     1136    PVTGPROBE    pProbe;
     1137    PVTGARG      pArg;
     1138    RTListForEach(&g_ProviderHead, pProv, VTGPROVIDER, ListEntry)
     1139    {
     1140        RTListForEach(&pProv->ProbeHead, pProbe, VTGPROBE, ListEntry)
     1141        {
     1142            PVTGARG const pFirstArg = RTListGetFirst(&pProbe->ArgHead, VTGARG, ListEntry);
     1143
     1144            generateProbeDefineName(szTmp, sizeof(szTmp), pProv->pszName, pProbe->pszMangledName);
     1145            ScmStreamPrintf(pStrm,
     1146                            ");\n"
     1147                            "# define %s("
     1148                            , szTmp);
     1149            RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
     1150            {
     1151                if (RTListNodeIsFirst(&pProbe->ArgHead, &pArg->ListEntry))
     1152                    ScmStreamPrintf(pStrm, "%s", pArg->pszName);
     1153                else
     1154                    ScmStreamPrintf(pStrm, ", %s", pArg->pszName);
     1155            }
     1156            ScmStreamPrintf(pStrm,
     1157                            ") \\\n"
     1158                            "    do { \\\n"
     1159                            "        if (RT_UNLIKELY(%s_ENABLED())) \\\n"
     1160                            "        { \\\n"
     1161                            "            %s_ORIGINAL("
     1162                            , szTmp, szTmp);
     1163            RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
     1164            {
     1165                const char *pszFmt = pArg->pszArgPassingFmt;
     1166                if (pArg->fType & VTG_TYPE_AUTO_CONV_PTR)
     1167                {
     1168                    /* Casting is required.  ASSUMES sizeof(RTR0PTR) == sizeof(RTR3PTR) - safe! */
     1169                    pszFmt += sizeof(", ") - 1;
     1170                    if (RTListNodeIsFirst(&pProbe->ArgHead, &pArg->ListEntry))
     1171                        ScmStreamPrintf(pStrm, "(%s)%M", pArg->pszTracerType, pszFmt, pArg->pszName);
     1172                    else
     1173                        ScmStreamPrintf(pStrm, ", (%s)%M", pArg->pszTracerType, pszFmt, pArg->pszName);
     1174                }
     1175                else
     1176                {
     1177                    if (RTListNodeIsFirst(&pProbe->ArgHead, &pArg->ListEntry))
     1178                        ScmStreamPrintf(pStrm, pArg->pszArgPassingFmt + sizeof(", ") - 1, pArg->pszName);
     1179                    else
     1180                        ScmStreamPrintf(pStrm, pArg->pszArgPassingFmt, pArg->pszName);
     1181                }
     1182            }
     1183            ScmStreamPrintf(pStrm,
     1184                            "); \\\n"
     1185                            "        } \\\n"
     1186                            "    } while (0)\n"
     1187                            "\n");
     1188        }
     1189    }
     1190
     1191    ScmStreamPrintf(pStrm,
     1192                    "\n"
     1193                    "#else\n"
     1194                    "\n");
     1195    RTListForEach(&g_ProviderHead, pProv, VTGPROVIDER, ListEntry)
     1196    {
     1197        RTListForEach(&pProv->ProbeHead, pProbe, VTGPROBE, ListEntry)
     1198        {
     1199            generateProbeDefineName(szTmp, sizeof(szTmp), pProv->pszName, pProbe->pszMangledName);
     1200            ScmStreamPrintf(pStrm,
     1201                            "# define %s("
     1202                            , szTmp);
     1203            RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
     1204            {
     1205                if (RTListNodeIsFirst(&pProbe->ArgHead, &pArg->ListEntry))
     1206                    ScmStreamPrintf(pStrm, "%s", pArg->pszName);
     1207                else
     1208                    ScmStreamPrintf(pStrm, ", %s", pArg->pszName);
     1209            }
     1210            ScmStreamPrintf(pStrm,
     1211                            ") do { } while (0)\n");
     1212        }
     1213    }
     1214
     1215    ScmStreamWrite(pStrm, RT_STR_TUPLE("\n"
     1216                                       "#endif\n"
     1217                                       "\n"
     1218                                       "#endif\n"));
     1219    return RTEXITCODE_SUCCESS;
    10961220}
    10971221
     
    20482172        kVBoxTpGOpt_32Bit = 1000,
    20492173        kVBoxTpGOpt_64Bit,
     2174        kVBoxTpGOpt_GenerateWrapperHeader,
    20502175        kVBoxTpGOpt_Assembler,
    20512176        kVBoxTpGOpt_AssemblerFmtOpt,
     
    20772202        { "--verbose",                          'v',                                    RTGETOPT_REQ_NOTHING },
    20782203        /* our stuff */
     2204        { "--generate-wrapper-header",          kVBoxTpGOpt_GenerateWrapperHeader,      RTGETOPT_REQ_NOTHING },
    20792205        { "--assembler",                        kVBoxTpGOpt_Assembler,                  RTGETOPT_REQ_STRING  },
    20802206        { "--assembler-fmt-opt",                kVBoxTpGOpt_AssemblerFmtOpt,            RTGETOPT_REQ_STRING  },
     
    21272253                if (   g_enmAction != kVBoxTpGAction_Nothing
    21282254                    && g_enmAction != kVBoxTpGAction_GenerateObject)
    2129                     return RTMsgErrorExit(RTEXITCODE_SYNTAX, "-G and -h does not mix");
     2255                    return RTMsgErrorExit(RTEXITCODE_SYNTAX, "-G does not mix with -h or --generate-wrapper-header");
    21302256                g_enmAction = kVBoxTpGAction_GenerateObject;
    21312257                break;
     
    21362262                    if (   g_enmAction != kVBoxTpGAction_Nothing
    21372263                        && g_enmAction != kVBoxTpGAction_GenerateHeader)
    2138                         return RTMsgErrorExit(RTEXITCODE_SYNTAX, "-h and -G does not mix");
     2264                        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "-h does not mix with -G or --generate-wrapper-header");
    21392265                    g_enmAction = kVBoxTpGAction_GenerateHeader;
    21402266                }
     
    21902316             * Our options.
    21912317             */
     2318            case kVBoxTpGOpt_GenerateWrapperHeader:
     2319                if (   g_enmAction != kVBoxTpGAction_Nothing
     2320                    && g_enmAction != kVBoxTpGAction_GenerateWrapperHeader)
     2321                    return RTMsgErrorExit(RTEXITCODE_SYNTAX, "--generate-wrapper-header does not mix with -h or -G");
     2322                g_enmAction = kVBoxTpGAction_GenerateWrapperHeader;
     2323                break;
     2324
    21922325            case kVBoxTpGOpt_Assembler:
    21932326                g_pszAssembler = ValueUnion.psz;
     
    22392372            case kVBoxTpGOpt_RawModeContext:
    22402373                g_fTypeContext = VTG_TYPE_CTX_RC;
     2374                g_pszContextDefine = "IN_RC";
    22412375                break;
    22422376
    22432377            case kVBoxTpGOpt_Ring0Context:
    22442378                g_fTypeContext = VTG_TYPE_CTX_R0;
     2379                g_pszContextDefine = "IN_RING0";
    22452380                break;
    22462381
    22472382            case kVBoxTpGOpt_Ring3Context:
    22482383                g_fTypeContext = VTG_TYPE_CTX_R3;
     2384                g_pszContextDefine = "IN_RING3";
    22492385                break;
    22502386
     
    22622398     */
    22632399    if (g_enmAction == kVBoxTpGAction_Nothing)
    2264         return RTMsgErrorExit(RTEXITCODE_SYNTAX, "No action specified (-h or -G)");
     2400        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "No action specified (-h, -G or --generate-wrapper-header)");
    22652401    if (!g_pszScript)
    22662402        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "No script file specified (-s)");
     
    22922428             */
    22932429            if (g_enmAction == kVBoxTpGAction_GenerateHeader)
    2294                 rcExit = generateHeader(g_pszOutput);
     2430                rcExit = generateFile(g_pszOutput, "header", generateHeader);
     2431            else if (g_enmAction == kVBoxTpGAction_GenerateWrapperHeader)
     2432                rcExit = generateFile(g_pszOutput, "wrapper header", generateWrapperHeader);
    22952433            else
    22962434                rcExit = generateObject(g_pszOutput, g_pszTempAsm);
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