Changeset 41342 in vbox for trunk/src/bldprogs
- Timestamp:
- May 16, 2012 7:42:16 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 78017
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/bldprogs/VBoxTpG.cpp
r41339 r41342 137 137 kVBoxTpGAction_Nothing, 138 138 kVBoxTpGAction_GenerateHeader, 139 kVBoxTpGAction_GenerateWrapperHeader, 139 140 kVBoxTpGAction_GenerateObject 140 141 } g_enmAction = kVBoxTpGAction_Nothing; … … 142 143 static uint32_t g_cHostBits = HC_ARCH_BITS; 143 144 static uint32_t g_fTypeContext = VTG_TYPE_CTX_R0; 145 static const char *g_pszContextDefine = "IN_RING0"; 144 146 static bool g_fApplyCpp = false; 145 147 static uint32_t g_cVerbosity = 0; … … 294 296 apszArgs[iArg++] = "RT_ARCH_AMD64"; 295 297 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; 304 299 if (g_szAssemblerOsDef[0]) 305 300 { … … 902 897 } 903 898 899 904 900 /** 905 901 * Called via generateFile to generate the header file. … … 908 904 * @param pStrm The output stream. 909 905 */ 910 static RTEXITCODE generateHeader Inner(PSCMSTREAM pStrm)906 static RTEXITCODE generateHeader(PSCMSTREAM pStrm) 911 907 { 912 908 /* … … 934 930 } 935 931 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 else944 AssertFailed();945 946 932 ScmStreamPrintf(pStrm, 947 933 "/* $Id$ */\n" … … 972 958 szTmp, 973 959 szTmp, 974 pszCtxDefine,975 pszCtxDefine);960 g_pszContextDefine, 961 g_pszContextDefine); 976 962 977 963 /* … … 1091 1077 1092 1078 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 */ 1085 static 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; 1096 1220 } 1097 1221 … … 2048 2172 kVBoxTpGOpt_32Bit = 1000, 2049 2173 kVBoxTpGOpt_64Bit, 2174 kVBoxTpGOpt_GenerateWrapperHeader, 2050 2175 kVBoxTpGOpt_Assembler, 2051 2176 kVBoxTpGOpt_AssemblerFmtOpt, … … 2077 2202 { "--verbose", 'v', RTGETOPT_REQ_NOTHING }, 2078 2203 /* our stuff */ 2204 { "--generate-wrapper-header", kVBoxTpGOpt_GenerateWrapperHeader, RTGETOPT_REQ_NOTHING }, 2079 2205 { "--assembler", kVBoxTpGOpt_Assembler, RTGETOPT_REQ_STRING }, 2080 2206 { "--assembler-fmt-opt", kVBoxTpGOpt_AssemblerFmtOpt, RTGETOPT_REQ_STRING }, … … 2127 2253 if ( g_enmAction != kVBoxTpGAction_Nothing 2128 2254 && 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"); 2130 2256 g_enmAction = kVBoxTpGAction_GenerateObject; 2131 2257 break; … … 2136 2262 if ( g_enmAction != kVBoxTpGAction_Nothing 2137 2263 && 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"); 2139 2265 g_enmAction = kVBoxTpGAction_GenerateHeader; 2140 2266 } … … 2190 2316 * Our options. 2191 2317 */ 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 2192 2325 case kVBoxTpGOpt_Assembler: 2193 2326 g_pszAssembler = ValueUnion.psz; … … 2239 2372 case kVBoxTpGOpt_RawModeContext: 2240 2373 g_fTypeContext = VTG_TYPE_CTX_RC; 2374 g_pszContextDefine = "IN_RC"; 2241 2375 break; 2242 2376 2243 2377 case kVBoxTpGOpt_Ring0Context: 2244 2378 g_fTypeContext = VTG_TYPE_CTX_R0; 2379 g_pszContextDefine = "IN_RING0"; 2245 2380 break; 2246 2381 2247 2382 case kVBoxTpGOpt_Ring3Context: 2248 2383 g_fTypeContext = VTG_TYPE_CTX_R3; 2384 g_pszContextDefine = "IN_RING3"; 2249 2385 break; 2250 2386 … … 2262 2398 */ 2263 2399 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)"); 2265 2401 if (!g_pszScript) 2266 2402 return RTMsgErrorExit(RTEXITCODE_SYNTAX, "No script file specified (-s)"); … … 2292 2428 */ 2293 2429 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); 2295 2433 else 2296 2434 rcExit = generateObject(g_pszOutput, g_pszTempAsm);
Note:
See TracChangeset
for help on using the changeset viewer.