29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync/* $Id$ */
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync/** @file
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync * VBox Build Tool - VBox Tracepoint Generator.
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync */
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync/*
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * Copyright (C) 2012 Oracle Corporation
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync *
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync * available from http://www.virtualbox.org. This file is free software;
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync * you can redistribute it and/or modify it under the terms of the GNU
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync * General Public License (GPL) as published by the Free Software
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync */
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync/*******************************************************************************
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync* Header Files *
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync*******************************************************************************/
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync#include <VBox/VBoxTpG.h>
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync#include <iprt/alloca.h>
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync#include <iprt/assert.h>
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync#include <iprt/ctype.h>
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync#include <iprt/env.h>
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync#include <iprt/err.h>
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync#include <iprt/file.h>
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync#include <iprt/getopt.h>
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync#include <iprt/initterm.h>
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync#include <iprt/list.h>
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync#include <iprt/mem.h>
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync#include <iprt/message.h>
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync#include <iprt/path.h>
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync#include <iprt/process.h>
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync#include <iprt/stream.h>
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync#include <iprt/string.h>
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync#include <iprt/uuid.h>
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync#include "scmstream.h"
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync/*******************************************************************************
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync* Structures and Typedefs *
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync*******************************************************************************/
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsynctypedef struct VTGATTRS
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync{
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync kVTGStability enmCode;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync kVTGStability enmData;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync kVTGClass enmDataDep;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync} VTGATTRS;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsynctypedef VTGATTRS *PVTGATTRS;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsynctypedef struct VTGARG
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync{
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync RTLISTNODE ListEntry;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync /** The argument name. (heap) */
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync char *pszName;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync /** The type presented to the tracer (in string table). */
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync const char *pszTracerType;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync /** The argument type used in the probe method in that context. (heap) */
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync char *pszCtxType;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync /** Argument passing format string. First and only argument is the name.
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync * (const string) */
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync const char *pszArgPassingFmt;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync /** The type flags. */
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync uint32_t fType;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync} VTGARG;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsynctypedef VTGARG *PVTGARG;
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsynctypedef struct VTGPROBE
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTLISTNODE ListEntry;
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync char *pszMangledName;
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync const char *pszUnmangledName;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync RTLISTANCHOR ArgHead;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync uint32_t cArgs;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync bool fHaveLargeArgs;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync uint32_t offArgList;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync uint32_t iProbe;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync} VTGPROBE;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsynctypedef VTGPROBE *PVTGPROBE;
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsynctypedef struct VTGPROVIDER
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync{
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTLISTNODE ListEntry;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync const char *pszName;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync uint16_t iFirstProbe;
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync uint16_t cProbes;
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync VTGATTRS AttrSelf;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync VTGATTRS AttrModules;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync VTGATTRS AttrFunctions;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync VTGATTRS AttrName;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync VTGATTRS AttrArguments;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTLISTANCHOR ProbeHead;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync} VTGPROVIDER;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsynctypedef VTGPROVIDER *PVTGPROVIDER;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c94a8282c9042b02f022302a3d987746140eab9vboxsync/**
0c94a8282c9042b02f022302a3d987746140eab9vboxsync * A string table string.
0c94a8282c9042b02f022302a3d987746140eab9vboxsync */
0c94a8282c9042b02f022302a3d987746140eab9vboxsynctypedef struct VTGSTRING
0c94a8282c9042b02f022302a3d987746140eab9vboxsync{
0c94a8282c9042b02f022302a3d987746140eab9vboxsync /** The string space core. */
0c94a8282c9042b02f022302a3d987746140eab9vboxsync RTSTRSPACECORE Core;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync /** The string table offset. */
0c94a8282c9042b02f022302a3d987746140eab9vboxsync uint32_t offStrTab;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync /** The actual string. */
0c94a8282c9042b02f022302a3d987746140eab9vboxsync char szString[1];
0c94a8282c9042b02f022302a3d987746140eab9vboxsync} VTGSTRING;
0c94a8282c9042b02f022302a3d987746140eab9vboxsynctypedef VTGSTRING *PVTGSTRING;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync/*******************************************************************************
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync* Global Variables *
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync*******************************************************************************/
0c94a8282c9042b02f022302a3d987746140eab9vboxsync/** The string space organizing the string table strings. Each node is a VTGSTRING. */
0c94a8282c9042b02f022302a3d987746140eab9vboxsyncstatic RTSTRSPACE g_StrSpace = NULL;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync/** Used by the string table enumerator to set VTGSTRING::offStrTab. */
0c94a8282c9042b02f022302a3d987746140eab9vboxsyncstatic uint32_t g_offStrTab;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync/** List of providers created by the parser. */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic RTLISTANCHOR g_ProviderHead;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync/** The number of type errors. */
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsyncstatic uint32_t g_cTypeErrors = 0;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync/** @name Options
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * @{ */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic enum
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync kVBoxTpGAction_Nothing,
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync kVBoxTpGAction_GenerateHeader,
56970d3a1944c7c073d66266cd52449835221badvboxsync kVBoxTpGAction_GenerateWrapperHeader,
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync kVBoxTpGAction_GenerateObject
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync} g_enmAction = kVBoxTpGAction_Nothing;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsyncstatic uint32_t g_cBits = HC_ARCH_BITS;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsyncstatic uint32_t g_cHostBits = HC_ARCH_BITS;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsyncstatic uint32_t g_fTypeContext = VTG_TYPE_CTX_R0;
56970d3a1944c7c073d66266cd52449835221badvboxsyncstatic const char *g_pszContextDefine = "IN_RING0";
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsyncstatic const char *g_pszContextDefine2 = NULL;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic bool g_fApplyCpp = false;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic uint32_t g_cVerbosity = 0;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char *g_pszOutput = NULL;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char *g_pszScript = NULL;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char *g_pszTempAsm = NULL;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync#ifdef RT_OS_DARWIN
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char *g_pszAssembler = "yasm";
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsyncstatic const char *g_pszAssemblerFmtOpt = "-f";
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char g_szAssemblerFmtVal32[] = "macho32";
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char g_szAssemblerFmtVal64[] = "macho64";
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsyncstatic const char g_szAssemblerOsDef[] = "RT_OS_DARWIN";
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync#elif defined(RT_OS_OS2)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char *pszAssembler = "nasm.exe";
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char *pszAssemblerFmtOpt = "-f";
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char g_szAssemblerFmtVal32[] = "obj";
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char g_szAssemblerFmtVal64[] = "elf64";
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsyncstatic const char g_szAssemblerOsDef[] = "RT_OS_OS2";
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync#elif defined(RT_OS_WINDOWS)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char *g_pszAssembler = "yasm.exe";
f9cdd92d151d9c28eb0f1aed25863fc04f85691dvboxsyncstatic const char *g_pszAssemblerFmtOpt = "-f";
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char g_szAssemblerFmtVal32[] = "win32";
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char g_szAssemblerFmtVal64[] = "win64";
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsyncstatic const char g_szAssemblerOsDef[] = "RT_OS_WINDOWS";
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync#else
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char *g_pszAssembler = "yasm";
f9cdd92d151d9c28eb0f1aed25863fc04f85691dvboxsyncstatic const char *g_pszAssemblerFmtOpt = "-f";
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char g_szAssemblerFmtVal32[] = "elf32";
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char g_szAssemblerFmtVal64[] = "elf64";
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync# ifdef RT_OS_FREEBSD
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsyncstatic const char g_szAssemblerOsDef[] = "RT_OS_FREEBSD";
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync# elif defined(RT_OS_NETBSD)
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsyncstatic const char g_szAssemblerOsDef[] = "RT_OS_NETBSD";
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync# elif defined(RT_OS_OPENBSD)
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsyncstatic const char g_szAssemblerOsDef[] = "RT_OS_OPENBSD";
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync# elif defined(RT_OS_LINUX)
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsyncstatic const char g_szAssemblerOsDef[] = "RT_OS_LINUX";
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync# elif defined(RT_OS_SOLARIS)
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsyncstatic const char g_szAssemblerOsDef[] = "RT_OS_SOLARIS";
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync# else
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync# error "Port me!"
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync# endif
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync#endif
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsyncstatic const char *g_pszAssemblerFmtVal = RT_CONCAT(g_szAssemblerFmtVal, HC_ARCH_BITS);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsyncstatic const char *g_pszAssemblerDefOpt = "-D";
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsyncstatic const char *g_pszAssemblerIncOpt = "-I";
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsyncstatic char g_szAssemblerIncVal[RTPATH_MAX];
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsyncstatic const char *g_pszAssemblerIncVal = __FILE__ "/../../../include/";
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char *g_pszAssemblerOutputOpt = "-o";
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic unsigned g_cAssemblerOptions = 0;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic const char *g_apszAssemblerOptions[32];
1969e98a26e5b56b67fbe3b6bfa007f8f09e86ebvboxsyncstatic const char *g_pszProbeFnName = "SUPR0TracerFireProbe";
44372afb953dc9f1f1ec71943f5f561a607c0307vboxsyncstatic bool g_fProbeFnImported = true;
81614fc60e096e714022d10d38b70a36b9b21d48vboxsyncstatic bool g_fPic = false;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync/** @} */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
0c94a8282c9042b02f022302a3d987746140eab9vboxsync/**
0c94a8282c9042b02f022302a3d987746140eab9vboxsync * Inserts a string into the string table, reusing any matching existing string
0c94a8282c9042b02f022302a3d987746140eab9vboxsync * if possible.
0c94a8282c9042b02f022302a3d987746140eab9vboxsync *
0c94a8282c9042b02f022302a3d987746140eab9vboxsync * @returns Read only string.
0c94a8282c9042b02f022302a3d987746140eab9vboxsync * @param pch The string to insert (need not be terminated).
0c94a8282c9042b02f022302a3d987746140eab9vboxsync * @param cch The length of the string.
0c94a8282c9042b02f022302a3d987746140eab9vboxsync */
0c94a8282c9042b02f022302a3d987746140eab9vboxsyncstatic const char *strtabInsertN(const char *pch, size_t cch)
0c94a8282c9042b02f022302a3d987746140eab9vboxsync{
0c94a8282c9042b02f022302a3d987746140eab9vboxsync PVTGSTRING pStr = (PVTGSTRING)RTStrSpaceGetN(&g_StrSpace, pch, cch);
0c94a8282c9042b02f022302a3d987746140eab9vboxsync if (pStr)
0c94a8282c9042b02f022302a3d987746140eab9vboxsync return pStr->szString;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync
0c94a8282c9042b02f022302a3d987746140eab9vboxsync /*
0c94a8282c9042b02f022302a3d987746140eab9vboxsync * Create a new entry.
0c94a8282c9042b02f022302a3d987746140eab9vboxsync */
0c94a8282c9042b02f022302a3d987746140eab9vboxsync pStr = (PVTGSTRING)RTMemAlloc(RT_OFFSETOF(VTGSTRING, szString[cch + 1]));
0c94a8282c9042b02f022302a3d987746140eab9vboxsync if (!pStr)
0c94a8282c9042b02f022302a3d987746140eab9vboxsync return NULL;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync
0c94a8282c9042b02f022302a3d987746140eab9vboxsync pStr->Core.pszString = pStr->szString;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync memcpy(pStr->szString, pch, cch);
0c94a8282c9042b02f022302a3d987746140eab9vboxsync pStr->szString[cch] = '\0';
0c94a8282c9042b02f022302a3d987746140eab9vboxsync pStr->offStrTab = UINT32_MAX;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync
0c94a8282c9042b02f022302a3d987746140eab9vboxsync bool fRc = RTStrSpaceInsert(&g_StrSpace, &pStr->Core);
0c94a8282c9042b02f022302a3d987746140eab9vboxsync Assert(fRc); NOREF(fRc);
0c94a8282c9042b02f022302a3d987746140eab9vboxsync return pStr->szString;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync}
0c94a8282c9042b02f022302a3d987746140eab9vboxsync
0c94a8282c9042b02f022302a3d987746140eab9vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync/**
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync * Retrieves the string table offset of the given string table string.
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync *
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync * @returns String table offset.
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync * @param pszStrTabString The string table string.
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync */
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsyncstatic uint32_t strtabGetOff(const char *pszStrTabString)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync{
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync PVTGSTRING pStr = RT_FROM_MEMBER(pszStrTabString, VTGSTRING, szString[0]);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync Assert(pStr->Core.pszString == pszStrTabString);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync return pStr->offStrTab;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync}
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync/**
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * Invokes the assembler.
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync *
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * @returns Exit code.
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * @param pszOutput The output file.
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * @param pszTempAsm The source file.
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic RTEXITCODE generateInvokeAssembler(const char *pszOutput, const char *pszTempAsm)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync const char *apszArgs[64];
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync unsigned iArg = 0;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = g_pszAssembler;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = g_pszAssemblerFmtOpt;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = g_pszAssemblerFmtVal;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = g_pszAssemblerDefOpt;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync if (!strcmp(g_pszAssemblerFmtVal, "macho32") || !strcmp(g_pszAssemblerFmtVal, "macho64"))
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = "ASM_FORMAT_MACHO";
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync else if (!strcmp(g_pszAssemblerFmtVal, "obj") || !strcmp(g_pszAssemblerFmtVal, "omf"))
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = "ASM_FORMAT_OMF";
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync else if ( !strcmp(g_pszAssemblerFmtVal, "win32")
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync || !strcmp(g_pszAssemblerFmtVal, "win64")
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync || !strcmp(g_pszAssemblerFmtVal, "pe32")
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync || !strcmp(g_pszAssemblerFmtVal, "pe64")
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync || !strcmp(g_pszAssemblerFmtVal, "pe") )
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = "ASM_FORMAT_PE";
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync else if ( !strcmp(g_pszAssemblerFmtVal, "elf32")
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync || !strcmp(g_pszAssemblerFmtVal, "elf64")
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync || !strcmp(g_pszAssemblerFmtVal, "elf"))
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = "ASM_FORMAT_ELF";
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync else
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync return RTMsgErrorExit(RTEXITCODE_FAILURE, "Unknown assembler format '%s'", g_pszAssemblerFmtVal);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = g_pszAssemblerDefOpt;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync if (g_cBits == 32)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = "ARCH_BITS=32";
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync else
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = "ARCH_BITS=64";
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = g_pszAssemblerDefOpt;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync if (g_cHostBits == 32)
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync apszArgs[iArg++] = "HC_ARCH_BITS=32";
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync else
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync apszArgs[iArg++] = "HC_ARCH_BITS=64";
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync apszArgs[iArg++] = g_pszAssemblerDefOpt;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync if (g_cBits == 32)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = "RT_ARCH_X86";
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync else
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = "RT_ARCH_AMD64";
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync apszArgs[iArg++] = g_pszAssemblerDefOpt;
56970d3a1944c7c073d66266cd52449835221badvboxsync apszArgs[iArg++] = g_pszContextDefine;
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync if (g_pszContextDefine2)
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync {
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync apszArgs[iArg++] = g_pszAssemblerDefOpt;
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync apszArgs[iArg++] = g_pszContextDefine2;
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync }
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync if (g_szAssemblerOsDef[0])
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync {
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync apszArgs[iArg++] = g_pszAssemblerDefOpt;
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync apszArgs[iArg++] = g_szAssemblerOsDef;
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync }
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = g_pszAssemblerIncOpt;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = g_pszAssemblerIncVal;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = g_pszAssemblerOutputOpt;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = pszOutput;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync for (unsigned i = 0; i < g_cAssemblerOptions; i++)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = g_apszAssemblerOptions[i];
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg++] = pszTempAsm;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync apszArgs[iArg] = NULL;
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync Assert(iArg <= RT_ELEMENTS(apszArgs));
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync if (g_cVerbosity > 1)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync {
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync RTMsgInfo("Starting assmbler '%s' with arguments:\n", g_pszAssembler);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync for (unsigned i = 0; i < iArg; i++)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync RTMsgInfo(" #%02u: '%s'\n", i, apszArgs[i]);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync }
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync RTPROCESS hProc;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync int rc = RTProcCreate(apszArgs[0], apszArgs, RTENV_DEFAULT, RTPROC_FLAGS_SEARCH_PATH, &hProc);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync if (RT_FAILURE(rc))
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to start '%s' (assembler): %Rrc", apszArgs[0], rc);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync RTPROCSTATUS Status;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync rc = RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &Status);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync if (RT_FAILURE(rc))
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync {
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync RTProcTerminate(hProc);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTProcWait failed: %Rrc", rc);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync }
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync if (Status.enmReason == RTPROCEXITREASON_SIGNAL)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync return RTMsgErrorExit(RTEXITCODE_FAILURE, "The assembler failed: signal %d", Status.iStatus);
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync if (Status.enmReason != RTPROCEXITREASON_NORMAL)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync return RTMsgErrorExit(RTEXITCODE_FAILURE, "The assembler failed: abend");
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync if (Status.iStatus != 0)
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync return RTMsgErrorExit((RTEXITCODE)Status.iStatus, "The assembler failed: exit code %d", Status.iStatus);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync return RTEXITCODE_SUCCESS;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync/**
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * Worker that does the boring bits when generating a file.
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync *
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * @returns Exit code.
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * @param pszOutput The name of the output file.
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * @param pszWhat What kind of file it is.
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * @param pfnGenerator The callback function that provides the contents
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * of the file.
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic RTEXITCODE generateFile(const char *pszOutput, const char *pszWhat,
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTEXITCODE (*pfnGenerator)(PSCMSTREAM))
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync SCMSTREAM Strm;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync int rc = ScmStreamInitForWriting(&Strm, NULL);
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync if (RT_FAILURE(rc))
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTMsgErrorExit(RTEXITCODE_FAILURE, "ScmStreamInitForWriting returned %Rrc when generating the %s file",
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rc, pszWhat);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTEXITCODE rcExit = pfnGenerator(&Strm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (RT_FAILURE(ScmStreamGetStatus(&Strm)))
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "Stream error %Rrc generating the %s file",
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync ScmStreamGetStatus(&Strm), pszWhat);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (rcExit == RTEXITCODE_SUCCESS)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rc = ScmStreamWriteToFile(&Strm, "%s", pszOutput);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (RT_FAILURE(rc))
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "ScmStreamWriteToFile returned %Rrc when writing '%s' (%s)",
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rc, pszOutput, pszWhat);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (rcExit == RTEXITCODE_SUCCESS)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (g_cVerbosity > 0)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTMsgInfo("Successfully generated '%s'.", pszOutput);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (g_cVerbosity > 1)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTMsgInfo("================ %s - start ================", pszWhat);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync ScmStreamRewindForReading(&Strm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync const char *pszLine;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync size_t cchLine;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync SCMEOL enmEol;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync while ((pszLine = ScmStreamGetLine(&Strm, &cchLine, &enmEol)) != NULL)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTPrintf("%.*s\n", cchLine, pszLine);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTMsgInfo("================ %s - end ================", pszWhat);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync ScmStreamDelete(&Strm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return rcExit;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync
0c94a8282c9042b02f022302a3d987746140eab9vboxsync/**
0c94a8282c9042b02f022302a3d987746140eab9vboxsync * @callback_method_impl{FNRTSTRSPACECALLBACK, Writes the string table strings.}
0c94a8282c9042b02f022302a3d987746140eab9vboxsync */
0c94a8282c9042b02f022302a3d987746140eab9vboxsyncstatic DECLCALLBACK(int) generateAssemblyStrTabCallback(PRTSTRSPACECORE pStr, void *pvUser)
0c94a8282c9042b02f022302a3d987746140eab9vboxsync{
0c94a8282c9042b02f022302a3d987746140eab9vboxsync PVTGSTRING pVtgStr = (PVTGSTRING)pStr;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync PSCMSTREAM pStrm = (PSCMSTREAM)pvUser;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync
0c94a8282c9042b02f022302a3d987746140eab9vboxsync pVtgStr->offStrTab = g_offStrTab;
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync g_offStrTab += (uint32_t)pVtgStr->Core.cchString + 1;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync
0c94a8282c9042b02f022302a3d987746140eab9vboxsync ScmStreamPrintf(pStrm,
0c94a8282c9042b02f022302a3d987746140eab9vboxsync " db '%s', 0 ; off=%u len=%zu\n",
0c94a8282c9042b02f022302a3d987746140eab9vboxsync pVtgStr->szString, pVtgStr->offStrTab, pVtgStr->Core.cchString);
0c94a8282c9042b02f022302a3d987746140eab9vboxsync return VINF_SUCCESS;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync}
0c94a8282c9042b02f022302a3d987746140eab9vboxsync
0c94a8282c9042b02f022302a3d987746140eab9vboxsync
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync/**
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * Generate assembly source that can be turned into an object file.
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync *
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * (This is a generateFile callback.)
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync *
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * @returns Exit code.
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * @param pStrm The output stream.
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic RTEXITCODE generateAssembly(PSCMSTREAM pStrm)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync PVTGPROVIDER pProvider;
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync PVTGPROBE pProbe;
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync PVTGARG pArg;
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (g_cVerbosity > 0)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTMsgInfo("Generating assembly code...");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync /*
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync * Write the file header.
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync */
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ScmStreamPrintf(pStrm,
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "; $Id$ \n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ";; @file\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "; Automatically generated from %s. Do NOT edit!\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ";\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync "%%include \"iprt/asmdefs.mac\"\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync "\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync "\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync ";"
f9cdd92d151d9c28eb0f1aed25863fc04f85691dvboxsync "; We put all the data in a dedicated section / segment.\n"
f9cdd92d151d9c28eb0f1aed25863fc04f85691dvboxsync ";\n"
f9cdd92d151d9c28eb0f1aed25863fc04f85691dvboxsync "; In order to find the probe location specifiers, we do the necessary\n"
f9cdd92d151d9c28eb0f1aed25863fc04f85691dvboxsync "; trickery here, ASSUMING that this object comes in first in the link\n"
f9cdd92d151d9c28eb0f1aed25863fc04f85691dvboxsync "; editing process.\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync ";\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync "%%ifdef ASM_FORMAT_OMF\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " %%macro VTG_GLOBAL 2\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " global NAME(%%1)\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " NAME(%%1):\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " %%endmacro\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " segment VTG.Obj public CLASS=VTG align=4096 use32\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync "%%elifdef ASM_FORMAT_MACHO\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " %%macro VTG_GLOBAL 2\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " global NAME(%%1)\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " NAME(%%1):\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " %%endmacro\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " %%ifdef IN_RING3\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " %%define VTG_NEW_MACHO_LINKER\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " %%elif ARCH_BITS == 64\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " %%define VTG_NEW_MACHO_LINKER\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " %%elifdef IN_RING0_AGNOSTIC\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " %%define VTG_NEW_MACHO_LINKER\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " %%endif\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " %%ifdef VTG_NEW_MACHO_LINKER\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " ; Section order hack!\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " ; With the ld64-97.17 linker there was a problem with it determining the section\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " ; order based on symbol references. The references to the start and end of the\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " ; __VTGPrLc section forced it in front of __VTGObj, we want __VTGObj first.\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " extern section$start$__VTG$__VTGObj\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " extern section$end$__VTG$__VTGObj\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " %%else\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " ; Creating 32-bit kext of the type MH_OBJECT. No fancy section end/start symbols handy.\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " [section __VTG __VTGObj align=16]\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync "VTG_GLOBAL g_aVTGObj_LinkerPleaseNoticeMe, data\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " [section __VTG __VTGPrLc.Begin align=16]\n"
76ccd5a42aa97d57bda00c87b7f5896e83a2d5a3vboxsync " dq 0, 0 ; Paranoia, related to the fudge below.\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync "VTG_GLOBAL g_aVTGPrLc, data\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " [section __VTG __VTGPrLc align=16]\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync "VTG_GLOBAL g_aVTGPrLc_LinkerPleaseNoticeMe, data\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " [section __VTG __VTGPrLc.End align=16]\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync "VTG_GLOBAL g_aVTGPrLc_End, data\n"
76ccd5a42aa97d57bda00c87b7f5896e83a2d5a3vboxsync " dq 0, 0 ; Fudge to work around unidentified linker where it would otherwise generate\n"
76ccd5a42aa97d57bda00c87b7f5896e83a2d5a3vboxsync " ; a fix up of the first dword in __VTGPrLc.Begin despite the fact that it were\n"
76ccd5a42aa97d57bda00c87b7f5896e83a2d5a3vboxsync " ; an empty section with nothing whatsoever to fix up.\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " %%endif\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " [section __VTG __VTGObj]\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync "%%elifdef ASM_FORMAT_PE\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " %%macro VTG_GLOBAL 2\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " global NAME(%%1)\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " NAME(%%1):\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " %%endmacro\n"
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync " [section VTGPrLc.Begin data align=64]\n"
1379dfd407ada5fab15655776896f13b61a951fdvboxsync /*" times 16 db 0xcc\n"*/
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync "VTG_GLOBAL g_aVTGPrLc, data\n"
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync " [section VTGPrLc.Data data align=4]\n"
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync " [section VTGPrLc.End data align=4]\n"
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync "VTG_GLOBAL g_aVTGPrLc_End, data\n"
1379dfd407ada5fab15655776896f13b61a951fdvboxsync /*" times 16 db 0xcc\n"*/
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync " [section VTGObj data align=32]\n"
f9cdd92d151d9c28eb0f1aed25863fc04f85691dvboxsync "\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync "%%elifdef ASM_FORMAT_ELF\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " %%macro VTG_GLOBAL 2\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " global NAME(%%1):%%2 hidden\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " NAME(%%1):\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " %%endmacro\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " [section .VTGData progbits alloc noexec write align=4096]\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " [section .VTGPrLc.Begin progbits alloc noexec write align=32]\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd 0,0,0,0, 0,0,0,0\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "VTG_GLOBAL g_aVTGPrLc, data\n"
1379dfd407ada5fab15655776896f13b61a951fdvboxsync " [section .VTGPrLc progbits alloc noexec write align=1]\n"
1379dfd407ada5fab15655776896f13b61a951fdvboxsync " [section .VTGPrLc.End progbits alloc noexec write align=1]\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "VTG_GLOBAL g_aVTGPrLc_End, data\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd 0,0,0,0, 0,0,0,0\n"
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync " [section .VTGData]\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync "%%else\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync " %%error \"ASM_FORMAT_XXX is not defined\"\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync "%%endif\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "VTG_GLOBAL g_VTGObjHeader, data\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " ;0 1 2 3\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " ;012345678901234567890123456789012\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " db 'VTG Object Header v1.5', 0, 0\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " dd %u\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd NAME(g_acVTGProbeEnabled_End) - NAME(g_VTGObjHeader)\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd NAME(g_achVTGStringTable) - NAME(g_VTGObjHeader)\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd NAME(g_achVTGStringTable_End) - NAME(g_achVTGStringTable)\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd NAME(g_aVTGArgLists) - NAME(g_VTGObjHeader)\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd NAME(g_aVTGArgLists_End) - NAME(g_aVTGArgLists)\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd NAME(g_aVTGProbes) - NAME(g_VTGObjHeader)\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd NAME(g_aVTGProbes_End) - NAME(g_aVTGProbes)\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd NAME(g_aVTGProviders) - NAME(g_VTGObjHeader)\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd NAME(g_aVTGProviders_End) - NAME(g_aVTGProviders)\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd NAME(g_acVTGProbeEnabled) - NAME(g_VTGObjHeader)\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd NAME(g_acVTGProbeEnabled_End) - NAME(g_acVTGProbeEnabled)\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd 0\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " dd 0\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync "%%ifdef VTG_NEW_MACHO_LINKER\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " extern section$start$__VTG$__VTGPrLc\n"
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync " RTCCPTR_DEF section$start$__VTG$__VTGPrLc\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " %%if ARCH_BITS == 32\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd 0\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " %%endif\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync " extern section$end$__VTG$__VTGPrLc\n"
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync " RTCCPTR_DEF section$end$__VTG$__VTGPrLc\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " %%if ARCH_BITS == 32\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd 0\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " %%endif\n"
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync "%%else\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " RTCCPTR_DEF NAME(g_aVTGPrLc)\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " %%if ARCH_BITS == 32\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd 0\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " %%endif\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " RTCCPTR_DEF NAME(g_aVTGPrLc_End)\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " %%if ARCH_BITS == 32\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd 0\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " %%endif\n"
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync "%%endif\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ,
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync g_pszScript, g_cBits);
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync RTUUID Uuid;
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync int rc = RTUuidCreate(&Uuid);
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync if (RT_FAILURE(rc))
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTUuidCreate failed: %Rrc", rc);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync ScmStreamPrintf(pStrm,
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd 0%08xh, 0%08xh, 0%08xh, 0%08xh\n"
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync "%%ifdef VTG_NEW_MACHO_LINKER\n"
a66ec044d2a64d926996cd24da5faadccb070be3vboxsync " RTCCPTR_DEF section$start$__VTG$__VTGObj\n"
a66ec044d2a64d926996cd24da5faadccb070be3vboxsync " %%if ARCH_BITS == 32\n"
a66ec044d2a64d926996cd24da5faadccb070be3vboxsync " dd 0\n"
a66ec044d2a64d926996cd24da5faadccb070be3vboxsync " %%endif\n"
a66ec044d2a64d926996cd24da5faadccb070be3vboxsync "%%else\n"
a66ec044d2a64d926996cd24da5faadccb070be3vboxsync " dd 0, 0\n"
a66ec044d2a64d926996cd24da5faadccb070be3vboxsync "%%endif\n"
a66ec044d2a64d926996cd24da5faadccb070be3vboxsync " dd 0, 0\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync , Uuid.au32[0], Uuid.au32[1], Uuid.au32[2], Uuid.au32[3]);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync /*
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync * Dump the string table before we start using the strings.
0c94a8282c9042b02f022302a3d987746140eab9vboxsync */
0c94a8282c9042b02f022302a3d987746140eab9vboxsync ScmStreamPrintf(pStrm,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync "\n"
0c94a8282c9042b02f022302a3d987746140eab9vboxsync ";\n"
0c94a8282c9042b02f022302a3d987746140eab9vboxsync "; The string table.\n"
0c94a8282c9042b02f022302a3d987746140eab9vboxsync ";\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "VTG_GLOBAL g_achVTGStringTable, data\n");
0c94a8282c9042b02f022302a3d987746140eab9vboxsync g_offStrTab = 0;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync RTStrSpaceEnumerate(&g_StrSpace, generateAssemblyStrTabCallback, pStrm);
0c94a8282c9042b02f022302a3d987746140eab9vboxsync ScmStreamPrintf(pStrm,
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "VTG_GLOBAL g_achVTGStringTable_End, data\n");
0c94a8282c9042b02f022302a3d987746140eab9vboxsync
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync /*
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync * Write out the argument lists before we use them.
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync */
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ScmStreamPrintf(pStrm,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync "\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ";\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync "; The argument lists.\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ";\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync "ALIGNDATA(16)\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "VTG_GLOBAL g_aVTGArgLists, data\n");
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync uint32_t off = 0;
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync RTListForEach(&g_ProviderHead, pProvider, VTGPROVIDER, ListEntry)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync {
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync RTListForEach(&pProvider->ProbeHead, pProbe, VTGPROBE, ListEntry)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync {
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync if (pProbe->offArgList != UINT32_MAX)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync continue;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync /* Write it. */
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync pProbe->offArgList = off;
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ScmStreamPrintf(pStrm,
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync " ; off=%u\n"
20f21077abf35d7b7b618acb159267933907407fvboxsync " db %2u ; Argument count\n"
20f21077abf35d7b7b618acb159267933907407fvboxsync " db %u ; fHaveLargeArgs\n"
20f21077abf35d7b7b618acb159267933907407fvboxsync " db 0, 0 ; Reserved\n"
0d8c2135d15345cc68111eea91052cdf5518d7e3vboxsync , off, pProbe->cArgs, (int)pProbe->fHaveLargeArgs);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync off += 4;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync {
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync ScmStreamPrintf(pStrm,
20f21077abf35d7b7b618acb159267933907407fvboxsync " dd %8u ; type '%s' (name '%s')\n"
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync " dd 0%08xh ; type flags\n",
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync strtabGetOff(pArg->pszTracerType), pArg->pszTracerType, pArg->pszName,
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync pArg->fType);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync off += 8;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync }
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync /* Look for matching argument lists (lazy bird walks the whole list). */
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync PVTGPROVIDER pProv2;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync RTListForEach(&g_ProviderHead, pProv2, VTGPROVIDER, ListEntry)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync {
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync PVTGPROBE pProbe2;
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync RTListForEach(&pProvider->ProbeHead, pProbe2, VTGPROBE, ListEntry)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync {
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync if (pProbe2->offArgList != UINT32_MAX)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync continue;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync if (pProbe2->cArgs != pProbe->cArgs)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync continue;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync PVTGARG pArg2;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync pArg = RTListNodeGetNext(&pProbe->ArgHead, VTGARG, ListEntry);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync pArg2 = RTListNodeGetNext(&pProbe2->ArgHead, VTGARG, ListEntry);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync int32_t cArgs = pProbe->cArgs;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync while ( cArgs-- > 0
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync && pArg2->pszTracerType == pArg->pszTracerType
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync && pArg2->fType == pArg->fType)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync {
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync pArg = RTListNodeGetNext(&pArg->ListEntry, VTGARG, ListEntry);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync pArg2 = RTListNodeGetNext(&pArg2->ListEntry, VTGARG, ListEntry);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync }
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync if (cArgs >= 0)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync continue;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync pProbe2->offArgList = pProbe->offArgList;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync }
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync }
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync }
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync }
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync ScmStreamPrintf(pStrm,
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "VTG_GLOBAL g_aVTGArgLists_End, data\n");
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync /*
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * Probe definitions.
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync */
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ScmStreamPrintf(pStrm,
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ";\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync "; Prob definitions.\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ";\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync "ALIGNDATA(16)\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "VTG_GLOBAL g_aVTGProbes, data\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "\n");
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync uint32_t iProvider = 0;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync uint32_t iProbe = 0;
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync RTListForEach(&g_ProviderHead, pProvider, VTGPROVIDER, ListEntry)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync {
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync pProvider->iFirstProbe = iProbe;
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync RTListForEach(&pProvider->ProbeHead, pProbe, VTGPROBE, ListEntry)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync {
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync ScmStreamPrintf(pStrm,
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "VTG_GLOBAL g_VTGProbeData_%s_%s, data ; idx=#%4u\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd %6u ; offName\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd %6u ; offArgList\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dw (NAME(g_cVTGProbeEnabled_%s_%s) - NAME(g_acVTGProbeEnabled)) / 4 ; idxEnabled\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dw %6u ; idxProvider\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd NAME(g_VTGObjHeader) - NAME(g_VTGProbeData_%s_%s) ; offObjHdr\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync ,
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync pProvider->pszName, pProbe->pszMangledName, iProbe,
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync strtabGetOff(pProbe->pszUnmangledName),
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync pProbe->offArgList,
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync pProvider->pszName, pProbe->pszMangledName,
20f21077abf35d7b7b618acb159267933907407fvboxsync iProvider,
20f21077abf35d7b7b618acb159267933907407fvboxsync pProvider->pszName, pProbe->pszMangledName
20f21077abf35d7b7b618acb159267933907407fvboxsync );
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync pProbe->iProbe = iProbe;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync iProbe++;
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync }
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync pProvider->cProbes = iProbe - pProvider->iFirstProbe;
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync iProvider++;
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync }
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync ScmStreamPrintf(pStrm, "VTG_GLOBAL g_aVTGProbes_End, data\n");
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync /*
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync * The provider data.
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync */
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync ScmStreamPrintf(pStrm,
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync "\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync ";\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync "; Provider data.\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync ";\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync "ALIGNDATA(16)\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "VTG_GLOBAL g_aVTGProviders, data\n");
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync iProvider = 0;
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync RTListForEach(&g_ProviderHead, pProvider, VTGPROVIDER, ListEntry)
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync {
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync ScmStreamPrintf(pStrm,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " ; idx=#%4u - %s\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync " dd %6u ; name\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " dw %6u ; index of first probe\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " dw %6u ; count of probes\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " db %d, %d, %d ; AttrSelf\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " db %d, %d, %d ; AttrModules\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " db %d, %d, %d ; AttrFunctions\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " db %d, %d, %d ; AttrName\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " db %d, %d, %d ; AttrArguments\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " db 0 ; reserved\n"
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync ,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync iProvider, pProvider->pszName,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync strtabGetOff(pProvider->pszName),
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync pProvider->iFirstProbe,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync pProvider->cProbes,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync pProvider->AttrSelf.enmCode, pProvider->AttrSelf.enmData, pProvider->AttrSelf.enmDataDep,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync pProvider->AttrModules.enmCode, pProvider->AttrModules.enmData, pProvider->AttrModules.enmDataDep,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync pProvider->AttrFunctions.enmCode, pProvider->AttrFunctions.enmData, pProvider->AttrFunctions.enmDataDep,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync pProvider->AttrName.enmCode, pProvider->AttrName.enmData, pProvider->AttrName.enmDataDep,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync pProvider->AttrArguments.enmCode, pProvider->AttrArguments.enmData, pProvider->AttrArguments.enmDataDep);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync iProvider++;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync }
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync ScmStreamPrintf(pStrm, "VTG_GLOBAL g_aVTGProviders_End, data\n");
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync /*
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync * Declare the probe enable flags.
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync *
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync * These must be placed at the end so they'll end up adjacent to the probe
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync * locations. This is important for reducing the amount of memory we need
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync * to lock down for user mode modules.
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync */
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync ScmStreamPrintf(pStrm,
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync ";\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync "; Probe enabled flags.\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync ";\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync "ALIGNDATA(16)\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync "VTG_GLOBAL g_acVTGProbeEnabled, data\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync );
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync uint32_t cProbes = 0;
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync RTListForEach(&g_ProviderHead, pProvider, VTGPROVIDER, ListEntry)
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync {
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync RTListForEach(&pProvider->ProbeHead, pProbe, VTGPROBE, ListEntry)
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync {
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync ScmStreamPrintf(pStrm,
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync "VTG_GLOBAL g_cVTGProbeEnabled_%s_%s, data\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " dd 0\n",
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync pProvider->pszName, pProbe->pszMangledName);
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync cProbes++;
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync }
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync }
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync ScmStreamPrintf(pStrm, "VTG_GLOBAL g_acVTGProbeEnabled_End, data\n");
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync if (cProbes >= _32K)
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync return RTMsgErrorExit(RTEXITCODE_FAILURE, "Too many probes: %u (max %u)", cProbes, _32K - 1);
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync /*
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync * Emit code for the stub functions.
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync */
9b1d52365befbce1af8f32d53c2e563ee9169501vboxsync bool const fWin64 = g_cBits == 64 && (!strcmp(g_pszAssemblerFmtVal, "win64") || !strcmp(g_pszAssemblerFmtVal, "pe64"));
76f3a3817b6b96f5beb30b76efebdf2d87090cf0vboxsync bool const fElf = !strcmp(g_pszAssemblerFmtVal, "elf32") || !strcmp(g_pszAssemblerFmtVal, "elf64");
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync ScmStreamPrintf(pStrm,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync "\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync ";\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync "; Prob stubs.\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync ";\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync "BEGINCODE\n"
76f3a3817b6b96f5beb30b76efebdf2d87090cf0vboxsync );
76f3a3817b6b96f5beb30b76efebdf2d87090cf0vboxsync if (g_fProbeFnImported)
9b1d52365befbce1af8f32d53c2e563ee9169501vboxsync ScmStreamPrintf(pStrm,
76f3a3817b6b96f5beb30b76efebdf2d87090cf0vboxsync "EXTERN_IMP2 %s\n"
76f3a3817b6b96f5beb30b76efebdf2d87090cf0vboxsync "BEGINCODE ; EXTERN_IMP2 changes section\n",
9b1d52365befbce1af8f32d53c2e563ee9169501vboxsync g_pszProbeFnName);
76f3a3817b6b96f5beb30b76efebdf2d87090cf0vboxsync else
76f3a3817b6b96f5beb30b76efebdf2d87090cf0vboxsync ScmStreamPrintf(pStrm, "extern NAME(%s)\n", g_pszProbeFnName);
9b1d52365befbce1af8f32d53c2e563ee9169501vboxsync
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync RTListForEach(&g_ProviderHead, pProvider, VTGPROVIDER, ListEntry)
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync {
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync RTListForEach(&pProvider->ProbeHead, pProbe, VTGPROBE, ListEntry)
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync {
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync ScmStreamPrintf(pStrm,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync "\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "VTG_GLOBAL VTGProbeStub_%s_%s, function; (VBOXTPGPROBELOC pVTGProbeLoc",
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync pProvider->pszName, pProbe->pszMangledName);
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync {
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync ScmStreamPrintf(pStrm, ", %s %s", pArg->pszTracerType, pArg->pszName);
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync }
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync ScmStreamPrintf(pStrm,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync ");\n");
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync /*
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync * Check if the probe in question is enabled.
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync */
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync if (g_cBits == 32)
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync ScmStreamPrintf(pStrm,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " mov eax, [esp + 4]\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " test byte [eax+3], 0x80 ; fEnabled == true?\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " jz .return ; jump on false\n");
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync else if (fWin64)
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync ScmStreamPrintf(pStrm,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " test byte [rcx+3], 0x80 ; fEnabled == true?\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " jz .return ; jump on false\n");
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync else
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync ScmStreamPrintf(pStrm,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " test byte [rdi+3], 0x80 ; fEnabled == true?\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " jz .return ; jump on false\n");
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync
8865793e4f3435f5e2c728d9e6739cd24d08c0devboxsync /*
8865793e4f3435f5e2c728d9e6739cd24d08c0devboxsync * Jump to the fire-probe function.
8865793e4f3435f5e2c728d9e6739cd24d08c0devboxsync */
8865793e4f3435f5e2c728d9e6739cd24d08c0devboxsync if (g_cBits == 32)
76f3a3817b6b96f5beb30b76efebdf2d87090cf0vboxsync ScmStreamPrintf(pStrm, g_fPic && fElf ?
2346cab03e0c9fba1765c8e21ef98f03c8564cd8vboxsync " jmp %s wrt ..plt\n"
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync : g_fProbeFnImported ?
8865793e4f3435f5e2c728d9e6739cd24d08c0devboxsync " mov ecx, IMP2(%s)\n"
8865793e4f3435f5e2c728d9e6739cd24d08c0devboxsync " jmp ecx\n"
8865793e4f3435f5e2c728d9e6739cd24d08c0devboxsync :
8865793e4f3435f5e2c728d9e6739cd24d08c0devboxsync " jmp NAME(%s)\n"
44372afb953dc9f1f1ec71943f5f561a607c0307vboxsync , g_pszProbeFnName);
8865793e4f3435f5e2c728d9e6739cd24d08c0devboxsync else
76f3a3817b6b96f5beb30b76efebdf2d87090cf0vboxsync ScmStreamPrintf(pStrm, g_fPic && fElf ?
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync " jmp [rel %s wrt ..got]\n"
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync : g_fProbeFnImported ?
a655881be920ead6948994168c5ee09e5798aa05vboxsync " jmp IMP2(%s)\n"
8865793e4f3435f5e2c728d9e6739cd24d08c0devboxsync :
8865793e4f3435f5e2c728d9e6739cd24d08c0devboxsync " jmp NAME(%s)\n"
8865793e4f3435f5e2c728d9e6739cd24d08c0devboxsync , g_pszProbeFnName);
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync ScmStreamPrintf(pStrm,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync ".return:\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " ret ; The probe was disabled, return\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync "\n");
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync }
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync }
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTEXITCODE_SUCCESS;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic RTEXITCODE generateObject(const char *pszOutput, const char *pszTempAsm)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (!pszTempAsm)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync size_t cch = strlen(pszOutput);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync char *psz = (char *)alloca(cch + sizeof(".asm"));
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync memcpy(psz, pszOutput, cch);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync memcpy(psz + cch, ".asm", sizeof(".asm"));
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync pszTempAsm = psz;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTEXITCODE rcExit = generateFile(pszTempAsm, "assembly", generateAssembly);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (rcExit == RTEXITCODE_SUCCESS)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rcExit = generateInvokeAssembler(pszOutput, pszTempAsm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTFileDelete(pszTempAsm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return rcExit;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
66b58af085e22ee26be57f98127fb49ee2e91790vboxsyncstatic RTEXITCODE generateProbeDefineName(char *pszBuf, size_t cbBuf, const char *pszProvider, const char *pszProbe)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync{
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync size_t cbMax = strlen(pszProvider) + 1 + strlen(pszProbe) + 1;
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync if (cbMax > cbBuf || cbMax > 80)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync return RTMsgErrorExit(RTEXITCODE_FAILURE, "Probe '%s' in provider '%s' ends up with a too long defined\n", pszProbe, pszProvider);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync while (*pszProvider)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync *pszBuf++ = RT_C_TO_UPPER(*pszProvider++);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync *pszBuf++ = '_';
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync while (*pszProbe)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync {
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync if (pszProbe[0] == '_' && pszProbe[1] == '_')
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync pszProbe++;
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync *pszBuf++ = RT_C_TO_UPPER(*pszProbe++);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync }
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync *pszBuf = '\0';
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync return RTEXITCODE_SUCCESS;
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync}
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync
56970d3a1944c7c073d66266cd52449835221badvboxsync
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync/**
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync * Called via generateFile to generate the header file.
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync *
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync * @returns Exit code status.
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync * @param pStrm The output stream.
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync */
56970d3a1944c7c073d66266cd52449835221badvboxsyncstatic RTEXITCODE generateHeader(PSCMSTREAM pStrm)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync /*
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync * Calc the double inclusion blocker define and then write the file header.
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync */
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync char szTmp[4096];
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync const char *pszName = RTPathFilename(g_pszScript);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync size_t cchName = strlen(pszName);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync if (cchName >= sizeof(szTmp) - 64)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync return RTMsgErrorExit(RTEXITCODE_FAILURE, "File name is too long '%s'", pszName);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync szTmp[0] = '_';
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync szTmp[1] = '_';
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync szTmp[2] = '_';
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync memcpy(&szTmp[3], pszName, cchName);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync szTmp[3 + cchName + 0] = '_';
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync szTmp[3 + cchName + 1] = '_';
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync szTmp[3 + cchName + 2] = '_';
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync szTmp[3 + cchName + 3] = '\0';
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync char *psz = &szTmp[3];
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync while (*psz)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync {
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync if (!RT_C_IS_ALNUM(*psz) && *psz != '_')
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync *psz = '_';
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync psz++;
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync }
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ScmStreamPrintf(pStrm,
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "/* $Id$ */\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "/** @file\n"
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync " * Automatically generated from %s. Do NOT edit!\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync " */\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "#ifndef %s\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "#define %s\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "#include <VBox/VBoxTpG.h>\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "\n"
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync "#ifndef %s\n"
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync "# error \"Expected '%s' to be defined\"\n"
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync "#endif\n"
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync "\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "RT_C_DECLS_BEGIN\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "#ifdef VBOX_WITH_DTRACE\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "\n"
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync "# ifdef _MSC_VER\n"
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync "# pragma data_seg(VTG_LOC_SECT)\n"
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync "# pragma data_seg()\n"
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync "# endif\n"
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync "\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ,
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync g_pszScript,
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync szTmp,
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync szTmp,
56970d3a1944c7c073d66266cd52449835221badvboxsync g_pszContextDefine,
56970d3a1944c7c073d66266cd52449835221badvboxsync g_pszContextDefine);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync /*
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync * Declare data, code and macros for each probe.
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync */
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync PVTGPROVIDER pProv;
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync PVTGPROBE pProbe;
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync PVTGARG pArg;
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync RTListForEach(&g_ProviderHead, pProv, VTGPROVIDER, ListEntry)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync {
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync RTListForEach(&pProv->ProbeHead, pProbe, VTGPROBE, ListEntry)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync {
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync PVTGARG const pFirstArg = RTListGetFirst(&pProbe->ArgHead, VTGARG, ListEntry);
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ScmStreamPrintf(pStrm,
2d66abeefb9716ed570bb5714884d3fe08629452vboxsync "extern uint32_t g_cVTGProbeEnabled_%s_%s;\n"
2d66abeefb9716ed570bb5714884d3fe08629452vboxsync "extern VTGDESCPROBE g_VTGProbeData_%s_%s;\n"
2d66abeefb9716ed570bb5714884d3fe08629452vboxsync "DECLASM(void) VTGProbeStub_%s_%s(PVTGPROBELOC",
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync pProv->pszName, pProbe->pszMangledName,
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync pProv->pszName, pProbe->pszMangledName,
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync pProv->pszName, pProbe->pszMangledName);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync {
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync ScmStreamPrintf(pStrm, ", %s", pArg->pszCtxType);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync }
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync generateProbeDefineName(szTmp, sizeof(szTmp), pProv->pszName, pProbe->pszMangledName);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ScmStreamPrintf(pStrm,
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ");\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "# define %s_ENABLED() \\\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " (RT_UNLIKELY(g_cVTGProbeEnabled_%s_%s)) \n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "# define %s("
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync , szTmp,
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync pProv->pszName, pProbe->pszMangledName,
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync szTmp);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync {
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync if (RTListNodeIsFirst(&pProbe->ArgHead, &pArg->ListEntry))
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ScmStreamPrintf(pStrm, "%s", pArg->pszName);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync else
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ScmStreamPrintf(pStrm, ", %s", pArg->pszName);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync }
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ScmStreamPrintf(pStrm,
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ") \\\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync " do { \\\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " if (RT_UNLIKELY(g_cVTGProbeEnabled_%s_%s)) \\\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync " { \\\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync " VTG_DECL_VTGPROBELOC(s_VTGProbeLoc) = \\\n"
23d8f7aff045c2bade1b168fee79a3e4749e2345vboxsync " { __LINE__, 0, 0, __FUNCTION__, &g_VTGProbeData_%s_%s }; \\\n"
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync " VTGProbeStub_%s_%s(&s_VTGProbeLoc",
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync pProv->pszName, pProbe->pszMangledName,
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync pProv->pszName, pProbe->pszMangledName,
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync pProv->pszName, pProbe->pszMangledName);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync {
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync ScmStreamPrintf(pStrm, pArg->pszArgPassingFmt, pArg->pszName);
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync }
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ScmStreamPrintf(pStrm,
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync "); \\\n"
e70bda5438c3582164d26f171a8bc8d3d7da1e12vboxsync " } \\\n"
e70bda5438c3582164d26f171a8bc8d3d7da1e12vboxsync " { \\\n" );
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync uint32_t iArg = 0;
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync {
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync if ((pArg->fType & (VTG_TYPE_FIXED_SIZED | VTG_TYPE_AUTO_CONV_PTR)) == VTG_TYPE_FIXED_SIZED)
20f21077abf35d7b7b618acb159267933907407fvboxsync ScmStreamPrintf(pStrm,
20f21077abf35d7b7b618acb159267933907407fvboxsync " AssertCompile(sizeof(%s) == %u); \\\n"
20f21077abf35d7b7b618acb159267933907407fvboxsync " AssertCompile(sizeof(%s) <= %u); \\\n",
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->pszTracerType, pArg->fType & VTG_TYPE_SIZE_MASK,
20f21077abf35d7b7b618acb159267933907407fvboxsync pArg->pszName, pArg->fType & VTG_TYPE_SIZE_MASK);
20f21077abf35d7b7b618acb159267933907407fvboxsync else if (pArg->fType & (VTG_TYPE_POINTER | VTG_TYPE_HC_ARCH_SIZED))
20f21077abf35d7b7b618acb159267933907407fvboxsync ScmStreamPrintf(pStrm,
20f21077abf35d7b7b618acb159267933907407fvboxsync " AssertCompile(sizeof(%s) <= sizeof(uintptr_t)); \\\n"
20f21077abf35d7b7b618acb159267933907407fvboxsync " AssertCompile(sizeof(%s) <= sizeof(uintptr_t)); \\\n",
20f21077abf35d7b7b618acb159267933907407fvboxsync pArg->pszName,
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->pszTracerType);
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync iArg++;
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync }
c66c4413faa5a72ce047742f9acfa85e94dec8afvboxsync ScmStreamPrintf(pStrm,
e70bda5438c3582164d26f171a8bc8d3d7da1e12vboxsync " } \\\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync " } while (0)\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "\n");
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync }
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync }
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync ScmStreamPrintf(pStrm,
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "#else\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "\n");
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync RTListForEach(&g_ProviderHead, pProv, VTGPROVIDER, ListEntry)
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync {
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync RTListForEach(&pProv->ProbeHead, pProbe, VTGPROBE, ListEntry)
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync {
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync generateProbeDefineName(szTmp, sizeof(szTmp), pProv->pszName, pProbe->pszMangledName);
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync ScmStreamPrintf(pStrm,
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "# define %s_ENABLED() (false)\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "# define %s("
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync , szTmp, szTmp);
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync {
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync if (RTListNodeIsFirst(&pProbe->ArgHead, &pArg->ListEntry))
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync ScmStreamPrintf(pStrm, "%s", pArg->pszName);
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync else
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync ScmStreamPrintf(pStrm, ", %s", pArg->pszName);
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync }
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync ScmStreamPrintf(pStrm,
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync ") do { } while (0)\n");
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync }
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync }
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync ScmStreamWrite(pStrm, RT_STR_TUPLE("\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "#endif\n"
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync "\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "RT_C_DECLS_END\n"
66b58af085e22ee26be57f98127fb49ee2e91790vboxsync "#endif\n"));
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTEXITCODE_SUCCESS;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
56970d3a1944c7c073d66266cd52449835221badvboxsync/**
56970d3a1944c7c073d66266cd52449835221badvboxsync * Called via generateFile to generate the wrapper header file.
56970d3a1944c7c073d66266cd52449835221badvboxsync *
56970d3a1944c7c073d66266cd52449835221badvboxsync * @returns Exit code status.
56970d3a1944c7c073d66266cd52449835221badvboxsync * @param pStrm The output stream.
56970d3a1944c7c073d66266cd52449835221badvboxsync */
56970d3a1944c7c073d66266cd52449835221badvboxsyncstatic RTEXITCODE generateWrapperHeader(PSCMSTREAM pStrm)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
56970d3a1944c7c073d66266cd52449835221badvboxsync /*
56970d3a1944c7c073d66266cd52449835221badvboxsync * Calc the double inclusion blocker define and then write the file header.
56970d3a1944c7c073d66266cd52449835221badvboxsync */
56970d3a1944c7c073d66266cd52449835221badvboxsync char szTmp[4096];
56970d3a1944c7c073d66266cd52449835221badvboxsync const char *pszName = RTPathFilename(g_pszScript);
56970d3a1944c7c073d66266cd52449835221badvboxsync size_t cchName = strlen(pszName);
56970d3a1944c7c073d66266cd52449835221badvboxsync if (cchName >= sizeof(szTmp) - 64)
56970d3a1944c7c073d66266cd52449835221badvboxsync return RTMsgErrorExit(RTEXITCODE_FAILURE, "File name is too long '%s'", pszName);
56970d3a1944c7c073d66266cd52449835221badvboxsync szTmp[0] = '_';
56970d3a1944c7c073d66266cd52449835221badvboxsync szTmp[1] = '_';
56970d3a1944c7c073d66266cd52449835221badvboxsync szTmp[2] = '_';
56970d3a1944c7c073d66266cd52449835221badvboxsync memcpy(&szTmp[3], pszName, cchName);
56970d3a1944c7c073d66266cd52449835221badvboxsync strcpy(&szTmp[3 + cchName ], "___WRAPPER___");
56970d3a1944c7c073d66266cd52449835221badvboxsync char *psz = &szTmp[3];
56970d3a1944c7c073d66266cd52449835221badvboxsync while (*psz)
56970d3a1944c7c073d66266cd52449835221badvboxsync {
56970d3a1944c7c073d66266cd52449835221badvboxsync if (!RT_C_IS_ALNUM(*psz) && *psz != '_')
56970d3a1944c7c073d66266cd52449835221badvboxsync *psz = '_';
56970d3a1944c7c073d66266cd52449835221badvboxsync psz++;
56970d3a1944c7c073d66266cd52449835221badvboxsync }
56970d3a1944c7c073d66266cd52449835221badvboxsync
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm,
56970d3a1944c7c073d66266cd52449835221badvboxsync "/* $Id$ */\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "/** @file\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync " * Automatically generated from %s. Do NOT edit!\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync " */\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "#ifndef %s\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "#define %s\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "#include <VBox/VBoxTpG.h>\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "#ifndef %s\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "# error \"Expected '%s' to be defined\"\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "#endif\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "#ifdef VBOX_WITH_DTRACE\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync ,
56970d3a1944c7c073d66266cd52449835221badvboxsync g_pszScript,
56970d3a1944c7c073d66266cd52449835221badvboxsync szTmp,
56970d3a1944c7c073d66266cd52449835221badvboxsync szTmp,
56970d3a1944c7c073d66266cd52449835221badvboxsync g_pszContextDefine,
56970d3a1944c7c073d66266cd52449835221badvboxsync g_pszContextDefine);
56970d3a1944c7c073d66266cd52449835221badvboxsync
56970d3a1944c7c073d66266cd52449835221badvboxsync /*
56970d3a1944c7c073d66266cd52449835221badvboxsync * Declare macros for each probe.
56970d3a1944c7c073d66266cd52449835221badvboxsync */
56970d3a1944c7c073d66266cd52449835221badvboxsync PVTGPROVIDER pProv;
56970d3a1944c7c073d66266cd52449835221badvboxsync PVTGPROBE pProbe;
56970d3a1944c7c073d66266cd52449835221badvboxsync PVTGARG pArg;
56970d3a1944c7c073d66266cd52449835221badvboxsync RTListForEach(&g_ProviderHead, pProv, VTGPROVIDER, ListEntry)
56970d3a1944c7c073d66266cd52449835221badvboxsync {
56970d3a1944c7c073d66266cd52449835221badvboxsync RTListForEach(&pProv->ProbeHead, pProbe, VTGPROBE, ListEntry)
56970d3a1944c7c073d66266cd52449835221badvboxsync {
56970d3a1944c7c073d66266cd52449835221badvboxsync PVTGARG const pFirstArg = RTListGetFirst(&pProbe->ArgHead, VTGARG, ListEntry);
56970d3a1944c7c073d66266cd52449835221badvboxsync
56970d3a1944c7c073d66266cd52449835221badvboxsync generateProbeDefineName(szTmp, sizeof(szTmp), pProv->pszName, pProbe->pszMangledName);
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm,
56970d3a1944c7c073d66266cd52449835221badvboxsync "# define %s("
56970d3a1944c7c073d66266cd52449835221badvboxsync , szTmp);
56970d3a1944c7c073d66266cd52449835221badvboxsync RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
56970d3a1944c7c073d66266cd52449835221badvboxsync {
56970d3a1944c7c073d66266cd52449835221badvboxsync if (RTListNodeIsFirst(&pProbe->ArgHead, &pArg->ListEntry))
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm, "%s", pArg->pszName);
56970d3a1944c7c073d66266cd52449835221badvboxsync else
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm, ", %s", pArg->pszName);
56970d3a1944c7c073d66266cd52449835221badvboxsync }
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm,
56970d3a1944c7c073d66266cd52449835221badvboxsync ") \\\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync " do { \\\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync " if (RT_UNLIKELY(%s_ENABLED())) \\\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync " { \\\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync " %s_ORIGINAL("
56970d3a1944c7c073d66266cd52449835221badvboxsync , szTmp, szTmp);
56970d3a1944c7c073d66266cd52449835221badvboxsync RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
56970d3a1944c7c073d66266cd52449835221badvboxsync {
56970d3a1944c7c073d66266cd52449835221badvboxsync const char *pszFmt = pArg->pszArgPassingFmt;
56970d3a1944c7c073d66266cd52449835221badvboxsync if (pArg->fType & VTG_TYPE_AUTO_CONV_PTR)
56970d3a1944c7c073d66266cd52449835221badvboxsync {
56970d3a1944c7c073d66266cd52449835221badvboxsync /* Casting is required. ASSUMES sizeof(RTR0PTR) == sizeof(RTR3PTR) - safe! */
56970d3a1944c7c073d66266cd52449835221badvboxsync pszFmt += sizeof(", ") - 1;
56970d3a1944c7c073d66266cd52449835221badvboxsync if (RTListNodeIsFirst(&pProbe->ArgHead, &pArg->ListEntry))
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm, "(%s)%M", pArg->pszTracerType, pszFmt, pArg->pszName);
56970d3a1944c7c073d66266cd52449835221badvboxsync else
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm, ", (%s)%M", pArg->pszTracerType, pszFmt, pArg->pszName);
56970d3a1944c7c073d66266cd52449835221badvboxsync }
3f36036e0f97beceb779965c55711de4bad60523vboxsync else if (pArg->fType & VTG_TYPE_CONST_CHAR_PTR)
3f36036e0f97beceb779965c55711de4bad60523vboxsync {
3f36036e0f97beceb779965c55711de4bad60523vboxsync /* Casting from 'const char *' (probe) to 'char *' (dtrace) is required to shut up warnings. */
3f36036e0f97beceb779965c55711de4bad60523vboxsync pszFmt += sizeof(", ") - 1;
3f36036e0f97beceb779965c55711de4bad60523vboxsync if (RTListNodeIsFirst(&pProbe->ArgHead, &pArg->ListEntry))
3f36036e0f97beceb779965c55711de4bad60523vboxsync ScmStreamPrintf(pStrm, "(char *)%M", pszFmt, pArg->pszName);
3f36036e0f97beceb779965c55711de4bad60523vboxsync else
3f36036e0f97beceb779965c55711de4bad60523vboxsync ScmStreamPrintf(pStrm, ", (char *)%M", pszFmt, pArg->pszName);
3f36036e0f97beceb779965c55711de4bad60523vboxsync }
56970d3a1944c7c073d66266cd52449835221badvboxsync else
56970d3a1944c7c073d66266cd52449835221badvboxsync {
56970d3a1944c7c073d66266cd52449835221badvboxsync if (RTListNodeIsFirst(&pProbe->ArgHead, &pArg->ListEntry))
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm, pArg->pszArgPassingFmt + sizeof(", ") - 1, pArg->pszName);
56970d3a1944c7c073d66266cd52449835221badvboxsync else
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm, pArg->pszArgPassingFmt, pArg->pszName);
56970d3a1944c7c073d66266cd52449835221badvboxsync }
56970d3a1944c7c073d66266cd52449835221badvboxsync }
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm,
56970d3a1944c7c073d66266cd52449835221badvboxsync "); \\\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync " } \\\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync " } while (0)\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "\n");
56970d3a1944c7c073d66266cd52449835221badvboxsync }
56970d3a1944c7c073d66266cd52449835221badvboxsync }
56970d3a1944c7c073d66266cd52449835221badvboxsync
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm,
56970d3a1944c7c073d66266cd52449835221badvboxsync "\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "#else\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "\n");
56970d3a1944c7c073d66266cd52449835221badvboxsync RTListForEach(&g_ProviderHead, pProv, VTGPROVIDER, ListEntry)
56970d3a1944c7c073d66266cd52449835221badvboxsync {
56970d3a1944c7c073d66266cd52449835221badvboxsync RTListForEach(&pProv->ProbeHead, pProbe, VTGPROBE, ListEntry)
56970d3a1944c7c073d66266cd52449835221badvboxsync {
56970d3a1944c7c073d66266cd52449835221badvboxsync generateProbeDefineName(szTmp, sizeof(szTmp), pProv->pszName, pProbe->pszMangledName);
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm,
56970d3a1944c7c073d66266cd52449835221badvboxsync "# define %s("
56970d3a1944c7c073d66266cd52449835221badvboxsync , szTmp);
56970d3a1944c7c073d66266cd52449835221badvboxsync RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
56970d3a1944c7c073d66266cd52449835221badvboxsync {
56970d3a1944c7c073d66266cd52449835221badvboxsync if (RTListNodeIsFirst(&pProbe->ArgHead, &pArg->ListEntry))
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm, "%s", pArg->pszName);
56970d3a1944c7c073d66266cd52449835221badvboxsync else
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm, ", %s", pArg->pszName);
56970d3a1944c7c073d66266cd52449835221badvboxsync }
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamPrintf(pStrm,
56970d3a1944c7c073d66266cd52449835221badvboxsync ") do { } while (0)\n");
56970d3a1944c7c073d66266cd52449835221badvboxsync }
56970d3a1944c7c073d66266cd52449835221badvboxsync }
56970d3a1944c7c073d66266cd52449835221badvboxsync
56970d3a1944c7c073d66266cd52449835221badvboxsync ScmStreamWrite(pStrm, RT_STR_TUPLE("\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "#endif\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "\n"
56970d3a1944c7c073d66266cd52449835221badvboxsync "#endif\n"));
56970d3a1944c7c073d66266cd52449835221badvboxsync return RTEXITCODE_SUCCESS;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync/**
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * Parser error with line and position.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync *
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * @returns RTEXITCODE_FAILURE.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * @param pStrm The stream.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * @param cb The offset from the current position to the
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * point of failure.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * @param pszMsg The message to display.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic RTEXITCODE parseError(PSCMSTREAM pStrm, size_t cb, const char *pszMsg)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (cb)
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync ScmStreamSeekRelative(pStrm, -(ssize_t)cb);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync size_t const off = ScmStreamTell(pStrm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync size_t const iLine = ScmStreamTellLine(pStrm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync ScmStreamSeekByLine(pStrm, iLine);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync size_t const offLine = ScmStreamTell(pStrm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync RTPrintf("%s:%d:%zd: error: %s.\n", g_pszScript, iLine + 1, off - offLine + 1, pszMsg);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync size_t cchLine;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync SCMEOL enmEof;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync const char *pszLine = ScmStreamGetLineByNo(pStrm, iLine, &cchLine, &enmEof);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (pszLine)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTPrintf(" %.*s\n"
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync " %*s^\n",
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync cchLine, pszLine, off - offLine, "");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTEXITCODE_FAILURE;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync/**
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync * Parser error with line and position.
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync *
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync * @returns RTEXITCODE_FAILURE.
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync * @param pStrm The stream.
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync * @param cb The offset from the current position to the
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync * point of failure.
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync * @param pszMsg The message to display.
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync */
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsyncstatic RTEXITCODE parseErrorAbs(PSCMSTREAM pStrm, size_t off, const char *pszMsg)
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync{
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync ScmStreamSeekAbsolute(pStrm, off);
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync return parseError(pStrm, 0, pszMsg);
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync}
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync/**
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * Handles a C++ one line comment.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync *
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * @returns Exit code.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * @param pStrm The stream.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic RTEXITCODE parseOneLineComment(PSCMSTREAM pStrm)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync ScmStreamSeekByLine(pStrm, ScmStreamTellLine(pStrm) + 1);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTEXITCODE_SUCCESS;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync/**
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * Handles a multi-line C/C++ comment.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync *
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * @returns Exit code.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * @param pStrm The stream.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic RTEXITCODE parseMultiLineComment(PSCMSTREAM pStrm)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync unsigned ch;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync while ((ch = ScmStreamGetCh(pStrm)) != ~(unsigned)0)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (ch == '*')
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync do
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync ch = ScmStreamGetCh(pStrm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync while (ch == '*');
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (ch == '/')
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTEXITCODE_SUCCESS;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync parseError(pStrm, 1, "Expected end of comment, got end of file");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTEXITCODE_FAILURE;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync/**
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * Skips spaces and comments.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync *
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * @returns RTEXITCODE_SUCCESS or RTEXITCODE_FAILURE.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * @param pStrm The stream..
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic RTEXITCODE parseSkipSpacesAndComments(PSCMSTREAM pStrm)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync unsigned ch;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync while ((ch = ScmStreamPeekCh(pStrm)) != ~(unsigned)0)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (!RT_C_IS_SPACE(ch) && ch != '/')
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTEXITCODE_SUCCESS;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync unsigned ch2 = ScmStreamGetCh(pStrm); AssertBreak(ch == ch2); NOREF(ch2);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (ch == '/')
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync ch = ScmStreamGetCh(pStrm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTEXITCODE rcExit;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (ch == '*')
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rcExit = parseMultiLineComment(pStrm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync else if (ch == '/')
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rcExit = parseOneLineComment(pStrm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync else
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rcExit = parseError(pStrm, 2, "Unexpected character");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (rcExit != RTEXITCODE_SUCCESS)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return rcExit;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return parseError(pStrm, 0, "Unexpected end of file");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync/**
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync * Skips spaces and comments, returning the next character.
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync *
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync * @returns Next non-space-non-comment character. ~(unsigned)0 on EOF or
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync * failure.
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync * @param pStrm The stream.
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync */
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsyncstatic unsigned parseGetNextNonSpaceNonCommentCh(PSCMSTREAM pStrm)
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync{
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync unsigned ch;
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync while ((ch = ScmStreamGetCh(pStrm)) != ~(unsigned)0)
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync {
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync if (!RT_C_IS_SPACE(ch) && ch != '/')
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync return ch;
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync if (ch == '/')
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync {
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync ch = ScmStreamGetCh(pStrm);
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync RTEXITCODE rcExit;
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync if (ch == '*')
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync rcExit = parseMultiLineComment(pStrm);
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync else if (ch == '/')
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync rcExit = parseOneLineComment(pStrm);
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync else
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync rcExit = parseError(pStrm, 2, "Unexpected character");
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync if (rcExit != RTEXITCODE_SUCCESS)
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync return ~(unsigned)0;
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync }
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync }
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync parseError(pStrm, 0, "Unexpected end of file");
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync return ~(unsigned)0;
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync}
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync/**
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * Get the next non-space-non-comment character on a preprocessor line.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync *
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * @returns The next character. On error message and ~(unsigned)0.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * @param pStrm The stream.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync */
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsyncstatic unsigned parseGetNextNonSpaceNonCommentChOnPpLine(PSCMSTREAM pStrm)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync{
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync size_t off = ScmStreamTell(pStrm) - 1;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync unsigned ch;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync while ((ch = ScmStreamGetCh(pStrm)) != ~(unsigned)0)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (RT_C_IS_SPACE(ch))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ch == '\n' || ch == '\r')
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync parseErrorAbs(pStrm, off, "Invalid preprocessor statement");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync }
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync }
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync else if (ch == '\\')
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync size_t off2 = ScmStreamTell(pStrm) - 1;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync ch = ScmStreamGetCh(pStrm);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ch == '\r')
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync ch = ScmStreamGetCh(pStrm);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ch != '\n')
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync parseErrorAbs(pStrm, off2, "Expected new line");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync }
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync }
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync else
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return ch;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync }
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return ~(unsigned)0;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync}
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync/**
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync * Skips spaces and comments.
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync *
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync * @returns Same as ScmStreamCGetWord
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync * @param pStrm The stream..
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync * @param pcchWord Where to return the length.
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync */
88e56f700a3b8dfdf1646f96320f335e22339caavboxsyncstatic const char *parseGetNextCWord(PSCMSTREAM pStrm, size_t *pcchWord)
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync{
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync if (parseSkipSpacesAndComments(pStrm) != RTEXITCODE_SUCCESS)
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync return NULL;
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync return ScmStreamCGetWord(pStrm, pcchWord);
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync/**
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * Parses interface stability.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync *
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * @returns Interface stability if parsed correctly, otherwise error message and
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * kVTGStability_Invalid.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * @param pStrm The stream.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * @param ch The first character in the stability spec.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync */
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsyncstatic kVTGStability parseStability(PSCMSTREAM pStrm, unsigned ch)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync{
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync switch (ch)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync case 'E':
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("External")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGStability_External;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("Evolving")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGStability_Evolving;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync case 'I':
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("Internal")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGStability_Internal;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync case 'O':
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("Obsolete")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGStability_Obsolete;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync case 'P':
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("Private")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGStability_Private;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync case 'S':
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("Stable")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGStability_Stable;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("Standard")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGStability_Standard;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync case 'U':
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("Unstable")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGStability_Unstable;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync }
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync parseError(pStrm, 1, "Unknown stability specifier");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGStability_Invalid;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync}
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync/**
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * Parses data depndency class.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync *
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * @returns Data dependency class if parsed correctly, otherwise error message
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * and kVTGClass_Invalid.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * @param pStrm The stream.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * @param ch The first character in the stability spec.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync */
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsyncstatic kVTGClass parseDataDepClass(PSCMSTREAM pStrm, unsigned ch)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync{
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync switch (ch)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync case 'C':
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("Common")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGClass_Common;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("Cpu")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGClass_Cpu;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync case 'G':
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("Group")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGClass_Group;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync case 'I':
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("Isa")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGClass_Isa;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync case 'P':
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("Platform")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGClass_Platform;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync case 'U':
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("Unknown")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGClass_Unknown;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync }
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync parseError(pStrm, 1, "Unknown data dependency class specifier");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return kVTGClass_Invalid;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync}
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync/**
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * Parses a pragma D attributes statement.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync *
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * @returns Suitable exit code, errors message already written on failure.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * @param pStrm The stream.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync */
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsyncstatic RTEXITCODE parsePragmaDAttributes(PSCMSTREAM pStrm)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync{
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync /*
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * "CodeStability/DataStability/DataDepClass" - no spaces allowed.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync */
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync unsigned ch = parseGetNextNonSpaceNonCommentChOnPpLine(pStrm);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ch == ~(unsigned)0)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return RTEXITCODE_FAILURE;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync kVTGStability enmCode = parseStability(pStrm, ch);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (enmCode == kVTGStability_Invalid)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return RTEXITCODE_FAILURE;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync ch = ScmStreamGetCh(pStrm);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ch != '/')
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return parseError(pStrm, 1, "Expected '/' following the code stability specifier");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync kVTGStability enmData = parseStability(pStrm, ScmStreamGetCh(pStrm));
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (enmData == kVTGStability_Invalid)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return RTEXITCODE_FAILURE;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync ch = ScmStreamGetCh(pStrm);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ch != '/')
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return parseError(pStrm, 1, "Expected '/' following the data stability specifier");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync kVTGClass enmDataDep = parseDataDepClass(pStrm, ScmStreamGetCh(pStrm));
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (enmDataDep == kVTGClass_Invalid)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return RTEXITCODE_FAILURE;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync /*
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * Expecting 'provider' followed by the name of an provider defined earlier.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync */
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync ch = parseGetNextNonSpaceNonCommentChOnPpLine(pStrm);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ch == ~(unsigned)0)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return RTEXITCODE_FAILURE;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ch != 'p' || !ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("provider")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return parseError(pStrm, 1, "Expected 'provider'");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync size_t cchName;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync const char *pszName = parseGetNextCWord(pStrm, &cchName);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (!pszName)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return parseError(pStrm, 1, "Expected provider name");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync PVTGPROVIDER pProv;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync RTListForEach(&g_ProviderHead, pProv, VTGPROVIDER, ListEntry)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if ( !strncmp(pProv->pszName, pszName, cchName)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync && pProv->pszName[cchName] == '\0')
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync }
661bfa5aae55ac2f94fa1cb131ea2323e5f6e633vboxsync if (RTListNodeIsDummy(&g_ProviderHead, pProv, VTGPROVIDER, ListEntry))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return parseError(pStrm, cchName, "Provider not found");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync /*
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * Which aspect of the provider?
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync */
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync size_t cchAspect;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync const char *pszAspect = parseGetNextCWord(pStrm, &cchAspect);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (!pszAspect)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return parseError(pStrm, 1, "Expected provider aspect");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync PVTGATTRS pAttrs;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (cchAspect == 8 && !memcmp(pszAspect, "provider", 8))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync pAttrs = &pProv->AttrSelf;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync else if (cchAspect == 8 && !memcmp(pszAspect, "function", 8))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync pAttrs = &pProv->AttrFunctions;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync else if (cchAspect == 6 && !memcmp(pszAspect, "module", 6))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync pAttrs = &pProv->AttrModules;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync else if (cchAspect == 4 && !memcmp(pszAspect, "name", 4))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync pAttrs = &pProv->AttrName;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync else if (cchAspect == 4 && !memcmp(pszAspect, "args", 4))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync pAttrs = &pProv->AttrArguments;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync else
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return parseError(pStrm, cchAspect, "Unknown aspect");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (pAttrs->enmCode != kVTGStability_Invalid)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return parseError(pStrm, cchAspect, "You have already specified these attributes");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync pAttrs->enmCode = enmCode;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync pAttrs->enmData = enmData;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync pAttrs->enmDataDep = enmDataDep;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return RTEXITCODE_SUCCESS;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync}
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync/**
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * Parses a D pragma statement.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync *
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * @returns Suitable exit code, errors message already written on failure.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * @param pStrm The stream.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync */
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsyncstatic RTEXITCODE parsePragma(PSCMSTREAM pStrm)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync{
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync RTEXITCODE rcExit;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync unsigned ch = parseGetNextNonSpaceNonCommentChOnPpLine(pStrm);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ch == ~(unsigned)0)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync rcExit = RTEXITCODE_FAILURE;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync else if (ch == 'D' && ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("D")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync ch = parseGetNextNonSpaceNonCommentChOnPpLine(pStrm);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ch == ~(unsigned)0)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync rcExit = RTEXITCODE_FAILURE;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync else if (ch == 'a' && ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("attributes")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync rcExit = parsePragmaDAttributes(pStrm);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync else
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync rcExit = parseError(pStrm, 1, "Unknown pragma D");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync }
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync else
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync rcExit = parseError(pStrm, 1, "Unknown pragma");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return rcExit;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync}
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync/**
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync * Classifies the given type expression.
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync *
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync * @return Type flags.
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync * @param pszType The type expression.
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync */
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsyncstatic uint32_t parseTypeExpression(const char *pszType)
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync{
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync size_t cchType = strlen(pszType);
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync#define MY_STRMATCH(a_sz) (cchType == sizeof(a_sz) - 1 && !memcmp(a_sz, pszType, sizeof(a_sz) - 1))
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync /*
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync * Try detect pointers.
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync */
3f36036e0f97beceb779965c55711de4bad60523vboxsync if (pszType[cchType - 1] == '*')
3f36036e0f97beceb779965c55711de4bad60523vboxsync {
3f36036e0f97beceb779965c55711de4bad60523vboxsync if (MY_STRMATCH("const char *")) return VTG_TYPE_POINTER | VTG_TYPE_CONST_CHAR_PTR;
3f36036e0f97beceb779965c55711de4bad60523vboxsync return VTG_TYPE_POINTER;
3f36036e0f97beceb779965c55711de4bad60523vboxsync }
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (pszType[cchType - 1] == '&')
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync {
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync RTMsgWarning("Please avoid using references like '%s' for probe arguments!", pszType);
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync return VTG_TYPE_POINTER;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync }
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync /*
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync * Standard integer types and IPRT variants.
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync * It's important that we catch all types larger than 32-bit here or we'll
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync * screw up the probe argument handling.
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync */
f40cc8247b1da75ce42e73e6c557ec29b8f830a5vboxsync if (MY_STRMATCH("int")) return VTG_TYPE_FIXED_SIZED | sizeof(int) | VTG_TYPE_SIGNED;
f40cc8247b1da75ce42e73e6c557ec29b8f830a5vboxsync if (MY_STRMATCH("uintptr_t")) return VTG_TYPE_HC_ARCH_SIZED | VTG_TYPE_UNSIGNED;
f40cc8247b1da75ce42e73e6c557ec29b8f830a5vboxsync if (MY_STRMATCH("intptr_t")) return VTG_TYPE_HC_ARCH_SIZED | VTG_TYPE_SIGNED;
f40cc8247b1da75ce42e73e6c557ec29b8f830a5vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync //if (MY_STRMATCH("uint128_t")) return VTG_TYPE_FIXED_SIZED | sizeof(uint128_t) | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("uint64_t")) return VTG_TYPE_FIXED_SIZED | sizeof(uint64_t) | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("uint32_t")) return VTG_TYPE_FIXED_SIZED | sizeof(uint32_t) | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("uint16_t")) return VTG_TYPE_FIXED_SIZED | sizeof(uint16_t) | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("uint8_t")) return VTG_TYPE_FIXED_SIZED | sizeof(uint8_t) | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync //if (MY_STRMATCH("int128_t")) return VTG_TYPE_FIXED_SIZED | sizeof(int128_t) | VTG_TYPE_SIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("int64_t")) return VTG_TYPE_FIXED_SIZED | sizeof(int64_t) | VTG_TYPE_SIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("int32_t")) return VTG_TYPE_FIXED_SIZED | sizeof(int32_t) | VTG_TYPE_SIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("int16_t")) return VTG_TYPE_FIXED_SIZED | sizeof(int16_t) | VTG_TYPE_SIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("int8_t")) return VTG_TYPE_FIXED_SIZED | sizeof(int8_t) | VTG_TYPE_SIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTUINT64U")) return VTG_TYPE_FIXED_SIZED | sizeof(uint64_t) | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTUINT32U")) return VTG_TYPE_FIXED_SIZED | sizeof(uint32_t) | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTUINT16U")) return VTG_TYPE_FIXED_SIZED | sizeof(uint16_t) | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTMSINTERVAL")) return VTG_TYPE_FIXED_SIZED | sizeof(RTMSINTERVAL) | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTTIMESPEC")) return VTG_TYPE_FIXED_SIZED | sizeof(RTTIMESPEC) | VTG_TYPE_SIGNED;
f40cc8247b1da75ce42e73e6c557ec29b8f830a5vboxsync if (MY_STRMATCH("RTPROCESS")) return VTG_TYPE_FIXED_SIZED | sizeof(RTPROCESS) | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTHCPHYS")) return VTG_TYPE_FIXED_SIZED | sizeof(RTHCPHYS) | VTG_TYPE_UNSIGNED | VTG_TYPE_PHYS;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTR3PTR")) return VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_R3;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTR0PTR")) return VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_R0;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTRCPTR")) return VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_RC;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTHCPTR")) return VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_R3 | VTG_TYPE_CTX_R0;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTR3UINTPTR")) return VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_R3 | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTR0UINTPTR")) return VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_R0 | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTRCUINTPTR")) return VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_RC | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTHCUINTPTR")) return VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_R3 | VTG_TYPE_CTX_R0 | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTR3INTPTR")) return VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_R3 | VTG_TYPE_SIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTR0INTPTR")) return VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_R0 | VTG_TYPE_SIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTRCINTPTR")) return VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_RC | VTG_TYPE_SIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTHCINTPTR")) return VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_R3 | VTG_TYPE_CTX_R0 | VTG_TYPE_SIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTUINTPTR")) return VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_R3 | VTG_TYPE_CTX_R0 | VTG_TYPE_CTX_RC | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTINTPTR")) return VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_R3 | VTG_TYPE_CTX_R0 | VTG_TYPE_CTX_RC | VTG_TYPE_SIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTHCUINTREG")) return VTG_TYPE_HC_ARCH_SIZED | VTG_TYPE_CTX_R3 | VTG_TYPE_CTX_R0 | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTR3UINTREG")) return VTG_TYPE_HC_ARCH_SIZED | VTG_TYPE_CTX_R3 | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTR0UINTREG")) return VTG_TYPE_HC_ARCH_SIZED | VTG_TYPE_CTX_R3 | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTGCUINTREG")) return VTG_TYPE_FIXED_SIZED | sizeof(RTGCUINTREG) | VTG_TYPE_UNSIGNED | VTG_TYPE_CTX_GST;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTGCPTR")) return VTG_TYPE_FIXED_SIZED | sizeof(RTGCPTR) | VTG_TYPE_UNSIGNED | VTG_TYPE_CTX_GST;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTGCINTPTR")) return VTG_TYPE_FIXED_SIZED | sizeof(RTGCUINTPTR) | VTG_TYPE_SIGNED | VTG_TYPE_CTX_GST;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTGCPTR32")) return VTG_TYPE_FIXED_SIZED | sizeof(RTGCPTR32) | VTG_TYPE_SIGNED | VTG_TYPE_CTX_GST;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTGCPTR64")) return VTG_TYPE_FIXED_SIZED | sizeof(RTGCPTR64) | VTG_TYPE_SIGNED | VTG_TYPE_CTX_GST;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTGCPHYS")) return VTG_TYPE_FIXED_SIZED | sizeof(RTGCPHYS) | VTG_TYPE_UNSIGNED | VTG_TYPE_PHYS | VTG_TYPE_CTX_GST;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTGCPHYS32")) return VTG_TYPE_FIXED_SIZED | sizeof(RTGCPHYS32) | VTG_TYPE_UNSIGNED | VTG_TYPE_PHYS | VTG_TYPE_CTX_GST;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("RTGCPHYS64")) return VTG_TYPE_FIXED_SIZED | sizeof(RTGCPHYS64) | VTG_TYPE_UNSIGNED | VTG_TYPE_PHYS | VTG_TYPE_CTX_GST;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync /*
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync * The special VBox types.
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync */
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync if (MY_STRMATCH("PVM")) return VTG_TYPE_POINTER;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync if (MY_STRMATCH("PVMCPU")) return VTG_TYPE_POINTER;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync if (MY_STRMATCH("PCPUMCTX")) return VTG_TYPE_POINTER;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync /*
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync * Preaching time.
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync */
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if ( MY_STRMATCH("unsigned long")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("unsigned long long")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("signed long")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("signed long long")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("long")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("long long")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("char")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("signed char")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("unsigned char")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("double")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("long double")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("float")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync )
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync {
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync RTMsgError("Please do NOT use the type '%s' for probe arguments!", pszType);
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync g_cTypeErrors++;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync return 0;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync }
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if ( MY_STRMATCH("unsigned")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("signed")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("signed int")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("unsigned int")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("short")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("signed short")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync || MY_STRMATCH("unsigned short")
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync )
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync RTMsgWarning("Please avoid using the type '%s' for probe arguments!", pszType);
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("unsigned")) return VTG_TYPE_FIXED_SIZED | sizeof(int) | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("unsigned int")) return VTG_TYPE_FIXED_SIZED | sizeof(int) | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("signed")) return VTG_TYPE_FIXED_SIZED | sizeof(int) | VTG_TYPE_SIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("signed int")) return VTG_TYPE_FIXED_SIZED | sizeof(int) | VTG_TYPE_SIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("short")) return VTG_TYPE_FIXED_SIZED | sizeof(short) | VTG_TYPE_SIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("signed short")) return VTG_TYPE_FIXED_SIZED | sizeof(short) | VTG_TYPE_SIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (MY_STRMATCH("unsigned short")) return VTG_TYPE_FIXED_SIZED | sizeof(short) | VTG_TYPE_UNSIGNED;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync /*
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync * What we haven't caught by now is either unknown to us or wrong.
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync */
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (pszType[0] == 'P')
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync {
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync RTMsgError("Type '%s' looks like a pointer typedef, please do NOT use those "
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync "but rather the non-pointer typedef or struct with '*'",
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync pszType);
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync g_cTypeErrors++;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync return VTG_TYPE_POINTER;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync }
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync RTMsgError("Don't know '%s' - please change or fix VBoxTpG", pszType);
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync g_cTypeErrors++;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync#undef MY_STRCMP
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync return 0;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync}
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync/**
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync * Initializes the members of an argument.
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync *
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync * @returns RTEXITCODE_SUCCESS or RTEXITCODE_FAILURE+msg.
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync * @param pProbe The probe.
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync * @param pArg The argument.
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync * @param pStrm The input stream (for errors).
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync * @param pchType The type.
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync * @param cchType The type length.
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync * @param pchName The name.
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync * @param cchName The name length.
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync */
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsyncstatic RTEXITCODE parseInitArgument(PVTGPROBE pProbe, PVTGARG pArg, PSCMSTREAM pStrm,
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync char *pchType, size_t cchType, char *pchName, size_t cchName)
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync{
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync Assert(!pArg->pszName); Assert(!pArg->pszTracerType); Assert(!pArg->pszCtxType); Assert(!pArg->fType);
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->pszArgPassingFmt = ", %s";
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->pszName = RTStrDupN(pchName, cchName);
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->pszTracerType = strtabInsertN(pchType, cchType);
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync if (!pArg->pszTracerType || !pArg->pszName)
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync return parseError(pStrm, 1, "Out of memory");
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->fType = parseTypeExpression(pArg->pszTracerType);
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync if ( (pArg->fType & VTG_TYPE_POINTER)
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync && !(g_fTypeContext & VTG_TYPE_CTX_R0) )
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync {
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->fType &= ~VTG_TYPE_POINTER;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync if ( !strcmp(pArg->pszTracerType, "struct VM *") || !strcmp(pArg->pszTracerType, "PVM")
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync || !strcmp(pArg->pszTracerType, "struct VMCPU *") || !strcmp(pArg->pszTracerType, "PVMCPU")
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync || !strcmp(pArg->pszTracerType, "struct CPUMCTX *") || !strcmp(pArg->pszTracerType, "PCPUMCTX")
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync )
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync {
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->fType |= VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_R0
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync | VTG_TYPE_FIXED_SIZED | (g_cHostBits / 8)
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync | VTG_TYPE_AUTO_CONV_PTR;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->pszCtxType = RTStrDup("RTR0PTR");
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync if (!strcmp(pArg->pszTracerType, "struct VM *") || !strcmp(pArg->pszTracerType, "PVM"))
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->pszArgPassingFmt = ", VTG_VM_TO_R0(%s)";
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync else if (!strcmp(pArg->pszTracerType, "struct VMCPU *") || !strcmp(pArg->pszTracerType, "PVMCPU"))
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->pszArgPassingFmt = ", VTG_VMCPU_TO_R0(%s)";
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync else
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync {
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync PVTGARG pFirstArg = RTListGetFirst(&pProbe->ArgHead, VTGARG, ListEntry);
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync if ( !pFirstArg
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync || pFirstArg == pArg
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync || strcmp(pFirstArg->pszName, "a_pVCpu")
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync || ( strcmp(pFirstArg->pszTracerType, "struct VMCPU *")
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync && strcmp(pFirstArg->pszTracerType, "PVMCPU *")) )
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync return parseError(pStrm, 1, "The automatic ring-0 pointer conversion requires 'a_pVCpu' with type 'struct VMCPU *' as the first argument");
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync if (!strcmp(pArg->pszTracerType, "struct CPUMCTX *")|| !strcmp(pArg->pszTracerType, "PCPUMCTX"))
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->pszArgPassingFmt = ", VTG_CPUMCTX_TO_R0(a_pVCpu, %s)";
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync else
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->pszArgPassingFmt = ", VBoxTpG-Is-Buggy!!";
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync }
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync }
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync else
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync {
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->fType |= VTG_TYPE_CTX_POINTER | g_fTypeContext | VTG_TYPE_FIXED_SIZED | (g_cBits / 8);
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->pszCtxType = RTStrDupN(pchType, cchType);
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync }
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync }
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync else
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync pArg->pszCtxType = RTStrDupN(pchType, cchType);
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync if (!pArg->pszCtxType)
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync return parseError(pStrm, 1, "Out of memory");
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync return RTEXITCODE_SUCCESS;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync}
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync/**
8f7ee9e453c60b3b699799538a45950b35266665vboxsync * Unmangles the probe name.
8f7ee9e453c60b3b699799538a45950b35266665vboxsync *
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync * This involves translating double underscore to dash.
8f7ee9e453c60b3b699799538a45950b35266665vboxsync *
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync * @returns Pointer to the unmangled name in the string table.
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync * @param pszMangled The mangled name.
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync */
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsyncstatic const char *parseUnmangleProbeName(const char *pszMangled)
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync{
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync size_t cchMangled = strlen(pszMangled);
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync char *pszTmp = (char *)alloca(cchMangled + 2);
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync const char *pszSrc = pszMangled;
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync char *pszDst = pszTmp;
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync while (*pszSrc)
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync {
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync if (pszSrc[0] == '_' && pszSrc[1] == '_' && pszSrc[2] != '_')
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync {
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync *pszDst++ = '-';
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync pszSrc += 2;
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync }
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync else
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync *pszDst++ = *pszSrc++;
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync }
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync *pszDst = '\0';
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync return strtabInsertN(pszTmp, pszDst - pszTmp);
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync}
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync/**
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync * Parses a D probe statement.
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync *
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync * @returns Suitable exit code, errors message already written on failure.
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync * @param pStrm The stream.
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * @param pProv The provider being parsed.
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync */
88e56f700a3b8dfdf1646f96320f335e22339caavboxsyncstatic RTEXITCODE parseProbe(PSCMSTREAM pStrm, PVTGPROVIDER pProv)
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync{
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync /*
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync * Next up is a name followed by an opening parenthesis.
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync */
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync size_t cchProbe;
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync const char *pszProbe = parseGetNextCWord(pStrm, &cchProbe);
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync if (!pszProbe)
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync return parseError(pStrm, 1, "Expected a probe name starting with an alphabetical character");
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync unsigned ch = parseGetNextNonSpaceNonCommentCh(pStrm);
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync if (ch != '(')
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync return parseError(pStrm, 1, "Expected '(' after the probe name");
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync /*
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync * Create a probe instance.
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync */
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync PVTGPROBE pProbe = (PVTGPROBE)RTMemAllocZ(sizeof(*pProbe));
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync if (!pProbe)
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync return parseError(pStrm, 0, "Out of memory");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync RTListInit(&pProbe->ArgHead);
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync RTListAppend(&pProv->ProbeHead, &pProbe->ListEntry);
0d8c2135d15345cc68111eea91052cdf5518d7e3vboxsync pProbe->offArgList = UINT32_MAX;
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync pProbe->pszMangledName = RTStrDupN(pszProbe, cchProbe);
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync if (!pProbe->pszMangledName)
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync return parseError(pStrm, 0, "Out of memory");
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync pProbe->pszUnmangledName = parseUnmangleProbeName(pProbe->pszMangledName);
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync if (!pProbe->pszUnmangledName)
fdb40b7d2efa84fc6f03b7a695cb4b2e035c30c7vboxsync return parseError(pStrm, 0, "Out of memory");
8f7ee9e453c60b3b699799538a45950b35266665vboxsync
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync /*
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync * Parse loop for the argument.
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync */
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync PVTGARG pArg = NULL;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync size_t cchName = 0;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync size_t cchArg = 0;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync char szArg[4096];
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync for (;;)
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync {
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync ch = parseGetNextNonSpaceNonCommentCh(pStrm);
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync switch (ch)
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync {
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync case ')':
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync case ',':
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync /* commit the argument */
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (pArg)
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (!cchName)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return parseError(pStrm, 1, "Argument has no name");
9c9db71d639cf066ed41d49629d46d48bff4be2fvboxsync if (cchArg - cchName - 1 >= 128)
9c9db71d639cf066ed41d49629d46d48bff4be2fvboxsync return parseError(pStrm, 1, "Argument type too long");
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync RTEXITCODE rcExit = parseInitArgument(pProbe, pArg, pStrm,
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync szArg, cchArg - cchName - 1,
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync &szArg[cchArg - cchName], cchName);
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync if (rcExit != RTEXITCODE_SUCCESS)
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync return rcExit;
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (VTG_TYPE_IS_LARGE(pArg->fType))
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync pProbe->fHaveLargeArgs = true;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync pArg = NULL;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync cchName = cchArg = 0;
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync }
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ch == ')')
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync size_t off = ScmStreamTell(pStrm);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync ch = parseGetNextNonSpaceNonCommentCh(pStrm);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ch != ';')
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return parseErrorAbs(pStrm, off, "Expected ';'");
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync return RTEXITCODE_SUCCESS;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync }
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync break;
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync }
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync default:
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync {
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync size_t cchWord;
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync const char *pszWord = ScmStreamCGetWordM1(pStrm, &cchWord);
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync if (!pszWord)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return parseError(pStrm, 0, "Expected argument");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (!pArg)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync pArg = (PVTGARG)RTMemAllocZ(sizeof(*pArg));
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (!pArg)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return parseError(pStrm, 1, "Out of memory");
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync RTListAppend(&pProbe->ArgHead, &pArg->ListEntry);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync pProbe->cArgs++;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync
0c94a8282c9042b02f022302a3d987746140eab9vboxsync if (cchWord + 1 > sizeof(szArg))
0c94a8282c9042b02f022302a3d987746140eab9vboxsync return parseError(pStrm, 1, "Too long parameter declaration");
0c94a8282c9042b02f022302a3d987746140eab9vboxsync memcpy(szArg, pszWord, cchWord);
0c94a8282c9042b02f022302a3d987746140eab9vboxsync szArg[cchWord] = '\0';
0c94a8282c9042b02f022302a3d987746140eab9vboxsync cchArg = cchWord;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync cchName = 0;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync }
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync else
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync {
0c94a8282c9042b02f022302a3d987746140eab9vboxsync if (cchArg + 1 + cchWord + 1 > sizeof(szArg))
0c94a8282c9042b02f022302a3d987746140eab9vboxsync return parseError(pStrm, 1, "Too long parameter declaration");
0c94a8282c9042b02f022302a3d987746140eab9vboxsync
0c94a8282c9042b02f022302a3d987746140eab9vboxsync szArg[cchArg++] = ' ';
0c94a8282c9042b02f022302a3d987746140eab9vboxsync memcpy(&szArg[cchArg], pszWord, cchWord);
0c94a8282c9042b02f022302a3d987746140eab9vboxsync cchArg += cchWord;
0c94a8282c9042b02f022302a3d987746140eab9vboxsync szArg[cchArg] = '\0';
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync cchName = cchWord;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync }
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync break;
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync }
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync case '*':
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (!pArg)
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return parseError(pStrm, 1, "A parameter type does not start with an asterix");
0c94a8282c9042b02f022302a3d987746140eab9vboxsync if (cchArg + sizeof(" *") >= sizeof(szArg))
0c94a8282c9042b02f022302a3d987746140eab9vboxsync return parseError(pStrm, 1, "Too long parameter declaration");
0c94a8282c9042b02f022302a3d987746140eab9vboxsync szArg[cchArg++] = ' ';
0c94a8282c9042b02f022302a3d987746140eab9vboxsync szArg[cchArg++] = '*';
0c94a8282c9042b02f022302a3d987746140eab9vboxsync szArg[cchArg ] = '\0';
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync cchName = 0;
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync }
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync case ~(unsigned)0:
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync return parseError(pStrm, 0, "Missing closing ')' on probe");
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync }
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync }
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync}
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync/**
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync * Parses a D provider statement.
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync *
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync * @returns Suitable exit code, errors message already written on failure.
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync * @param pStrm The stream.
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic RTEXITCODE parseProvider(PSCMSTREAM pStrm)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync /*
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync * Next up is a name followed by a curly bracket. Ignore comments.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTEXITCODE rcExit = parseSkipSpacesAndComments(pStrm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (rcExit != RTEXITCODE_SUCCESS)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return parseError(pStrm, 1, "Expected a provider name starting with an alphabetical character");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync size_t cchName;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync const char *pszName = ScmStreamCGetWord(pStrm, &cchName);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (!pszName)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return parseError(pStrm, 0, "Bad provider name");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (RT_C_IS_DIGIT(pszName[cchName - 1]))
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return parseError(pStrm, 1, "A provider name cannot end with digit");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync unsigned ch = parseGetNextNonSpaceNonCommentCh(pStrm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (ch != '{')
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return parseError(pStrm, 1, "Expected '{' after the provider name");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync /*
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * Create a provider instance.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync PVTGPROVIDER pProv = (PVTGPROVIDER)RTMemAllocZ(sizeof(*pProv));
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (!pProv)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return parseError(pStrm, 0, "Out of memory");
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync RTListInit(&pProv->ProbeHead);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTListAppend(&g_ProviderHead, &pProv->ListEntry);
0c94a8282c9042b02f022302a3d987746140eab9vboxsync pProv->pszName = strtabInsertN(pszName, cchName);
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync if (!pProv->pszName)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return parseError(pStrm, 0, "Out of memory");
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync /*
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync * Parse loop.
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync */
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync for (;;)
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync {
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync ch = parseGetNextNonSpaceNonCommentCh(pStrm);
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync switch (ch)
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync {
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync case 'p':
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync if (ScmStreamCMatchingWordM1(pStrm, RT_STR_TUPLE("probe")))
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync rcExit = parseProbe(pStrm, pProv);
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync else
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync rcExit = parseError(pStrm, 1, "Unexpected character");
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync break;
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync case '}':
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync {
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync size_t off = ScmStreamTell(pStrm);
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync ch = parseGetNextNonSpaceNonCommentCh(pStrm);
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync if (ch == ';')
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync return RTEXITCODE_SUCCESS;
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync rcExit = parseErrorAbs(pStrm, off, "Expected ';'");
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync break;
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync case ~(unsigned)0:
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync rcExit = parseError(pStrm, 0, "Missing closing '}' on provider");
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync default:
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync rcExit = parseError(pStrm, 1, "Unexpected character");
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync break;
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync }
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync if (rcExit != RTEXITCODE_SUCCESS)
88e56f700a3b8dfdf1646f96320f335e22339caavboxsync return rcExit;
49a6b09abb20015b0af3e618a1f92b7e26785e90vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic RTEXITCODE parseScript(const char *pszScript)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync SCMSTREAM Strm;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync int rc = ScmStreamInitForReading(&Strm, pszScript);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (RT_FAILURE(rc))
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to open & read '%s' into memory: %Rrc", pszScript, rc);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (g_cVerbosity > 0)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTMsgInfo("Parsing '%s'...", pszScript);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync unsigned ch;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync while ((ch = ScmStreamGetCh(&Strm)) != ~(unsigned)0)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (RT_C_IS_SPACE(ch))
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync continue;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync switch (ch)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case '/':
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync ch = ScmStreamGetCh(&Strm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (ch == '*')
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rcExit = parseMultiLineComment(&Strm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync else if (ch == '/')
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rcExit = parseOneLineComment(&Strm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync else
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rcExit = parseError(&Strm, 2, "Unexpected character");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case 'p':
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (ScmStreamCMatchingWordM1(&Strm, RT_STR_TUPLE("provider")))
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rcExit = parseProvider(&Strm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync else
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rcExit = parseError(&Strm, 1, "Unexpected character");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case '#':
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync {
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync ch = parseGetNextNonSpaceNonCommentChOnPpLine(&Strm);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync if (ch == ~(unsigned)0)
38745c55f37c31ba8b78cc728d2f08ea6eec38d6vboxsync rcExit = RTEXITCODE_FAILURE;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync else if (ch == 'p' && ScmStreamCMatchingWordM1(&Strm, RT_STR_TUPLE("pragma")))
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync rcExit = parsePragma(&Strm);
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync else
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync rcExit = parseError(&Strm, 1, "Unsupported preprocessor directive");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
5c4d7e2aae42bbf39793dfa686925f076a56b4d5vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync default:
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync rcExit = parseError(&Strm, 1, "Unexpected character");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (rcExit != RTEXITCODE_SUCCESS)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return rcExit;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync ScmStreamDelete(&Strm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (g_cVerbosity > 0 && rcExit == RTEXITCODE_SUCCESS)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTMsgInfo("Successfully parsed '%s'.", pszScript);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return rcExit;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync/**
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * Parses the arguments.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncstatic RTEXITCODE parseArguments(int argc, char **argv)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync /*
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync * Set / Adjust defaults.
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync */
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync int rc = RTPathAbs(g_pszAssemblerIncVal, g_szAssemblerIncVal, sizeof(g_szAssemblerIncVal) - 1);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync if (RT_FAILURE(rc))
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTPathAbs failed: %Rrc", rc);
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync strcat(g_szAssemblerIncVal, "/");
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync g_pszAssemblerIncVal = g_szAssemblerIncVal;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync /*
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync * Option config.
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync enum
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync kVBoxTpGOpt_32Bit = 1000,
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync kVBoxTpGOpt_64Bit,
56970d3a1944c7c073d66266cd52449835221badvboxsync kVBoxTpGOpt_GenerateWrapperHeader,
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync kVBoxTpGOpt_Assembler,
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync kVBoxTpGOpt_AssemblerFmtOpt,
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync kVBoxTpGOpt_AssemblerFmtVal,
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync kVBoxTpGOpt_AssemblerOutputOpt,
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync kVBoxTpGOpt_AssemblerOption,
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync kVBoxTpGOpt_Pic,
44372afb953dc9f1f1ec71943f5f561a607c0307vboxsync kVBoxTpGOpt_ProbeFnName,
44372afb953dc9f1f1ec71943f5f561a607c0307vboxsync kVBoxTpGOpt_ProbeFnImported,
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync kVBoxTpGOpt_ProbeFnNotImported,
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync kVBoxTpGOpt_Host32Bit,
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync kVBoxTpGOpt_Host64Bit,
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync kVBoxTpGOpt_RawModeContext,
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync kVBoxTpGOpt_Ring0Context,
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync kVBoxTpGOpt_Ring0ContextAgnostic,
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync kVBoxTpGOpt_Ring3Context,
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync kVBoxTpGOpt_End
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync };
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync static RTGETOPTDEF const s_aOpts[] =
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync /* dtrace w/ long options */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync { "-32", kVBoxTpGOpt_32Bit, RTGETOPT_REQ_NOTHING },
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync { "-64", kVBoxTpGOpt_64Bit, RTGETOPT_REQ_NOTHING },
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync { "--apply-cpp", 'C', RTGETOPT_REQ_NOTHING },
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync { "--generate-obj", 'G', RTGETOPT_REQ_NOTHING },
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync { "--generate-header", 'h', RTGETOPT_REQ_NOTHING },
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync { "--output", 'o', RTGETOPT_REQ_STRING },
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync { "--script", 's', RTGETOPT_REQ_STRING },
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync { "--verbose", 'v', RTGETOPT_REQ_NOTHING },
d7cf060b16385dd6e5af7c74cd49c9ef8ffb3b22vboxsync /* our stuff */
56970d3a1944c7c073d66266cd52449835221badvboxsync { "--generate-wrapper-header", kVBoxTpGOpt_GenerateWrapperHeader, RTGETOPT_REQ_NOTHING },
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync { "--assembler", kVBoxTpGOpt_Assembler, RTGETOPT_REQ_STRING },
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync { "--assembler-fmt-opt", kVBoxTpGOpt_AssemblerFmtOpt, RTGETOPT_REQ_STRING },
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync { "--assembler-fmt-val", kVBoxTpGOpt_AssemblerFmtVal, RTGETOPT_REQ_STRING },
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync { "--assembler-output-opt", kVBoxTpGOpt_AssemblerOutputOpt, RTGETOPT_REQ_STRING },
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync { "--assembler-option", kVBoxTpGOpt_AssemblerOption, RTGETOPT_REQ_STRING },
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync { "--pic", kVBoxTpGOpt_Pic, RTGETOPT_REQ_NOTHING },
44372afb953dc9f1f1ec71943f5f561a607c0307vboxsync { "--probe-fn-name", kVBoxTpGOpt_ProbeFnName, RTGETOPT_REQ_STRING },
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync { "--probe-fn-imported", kVBoxTpGOpt_ProbeFnImported, RTGETOPT_REQ_NOTHING },
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync { "--probe-fn-not-imported", kVBoxTpGOpt_ProbeFnNotImported, RTGETOPT_REQ_NOTHING },
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync { "--host-32-bit", kVBoxTpGOpt_Host32Bit, RTGETOPT_REQ_NOTHING },
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync { "--host-64-bit", kVBoxTpGOpt_Host64Bit, RTGETOPT_REQ_NOTHING },
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync { "--raw-mode-context", kVBoxTpGOpt_RawModeContext, RTGETOPT_REQ_NOTHING },
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync { "--ring-0-context", kVBoxTpGOpt_Ring0Context, RTGETOPT_REQ_NOTHING },
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync { "--ring-0-context-agnostic", kVBoxTpGOpt_Ring0ContextAgnostic, RTGETOPT_REQ_NOTHING },
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync { "--ring-3-context", kVBoxTpGOpt_Ring3Context, RTGETOPT_REQ_NOTHING },
82e3a4017d20f44c30ff909e6b825ff78139cbbbvboxsync /** @todo We're missing a bunch of assembler options! */
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync };
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync RTGETOPTUNION ValueUnion;
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync RTGETOPTSTATE GetOptState;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync rc = RTGetOptInit(&GetOptState, argc, argv, &s_aOpts[0], RT_ELEMENTS(s_aOpts), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync AssertReleaseRCReturn(rc, RTEXITCODE_FAILURE);
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync /*
d7cf060b16385dd6e5af7c74cd49c9ef8ffb3b22vboxsync * Process the options.
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync */
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync while ((rc = RTGetOpt(&GetOptState, &ValueUnion)) != 0)
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync {
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync switch (rc)
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync /*
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * DTrace compatible options.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case kVBoxTpGOpt_32Bit:
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync g_cHostBits = g_cBits = 32;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync g_pszAssemblerFmtVal = g_szAssemblerFmtVal32;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case kVBoxTpGOpt_64Bit:
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync g_cHostBits = g_cBits = 64;
19320d55d1417c39b3b5673a53aaa5ef177242c8vboxsync g_pszAssemblerFmtVal = g_szAssemblerFmtVal64;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case 'C':
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync g_fApplyCpp = true;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTMsgWarning("Ignoring the -C option - no preprocessing of the D script will be performed");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case 'G':
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if ( g_enmAction != kVBoxTpGAction_Nothing
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync && g_enmAction != kVBoxTpGAction_GenerateObject)
56970d3a1944c7c073d66266cd52449835221badvboxsync return RTMsgErrorExit(RTEXITCODE_SYNTAX, "-G does not mix with -h or --generate-wrapper-header");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync g_enmAction = kVBoxTpGAction_GenerateObject;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync case 'h':
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (!strcmp(GetOptState.pDef->pszLong, "--generate-header"))
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if ( g_enmAction != kVBoxTpGAction_Nothing
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync && g_enmAction != kVBoxTpGAction_GenerateHeader)
56970d3a1944c7c073d66266cd52449835221badvboxsync return RTMsgErrorExit(RTEXITCODE_SYNTAX, "-h does not mix with -G or --generate-wrapper-header");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync g_enmAction = kVBoxTpGAction_GenerateHeader;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync else
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync /* --help or similar */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTPrintf("VirtualBox Tracepoint Generator\n"
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync "\n"
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync "Usage: %s [options]\n"
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync "\n"
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync "Options:\n", RTProcShortName());
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync for (size_t i = 0; i < RT_ELEMENTS(s_aOpts); i++)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if ((unsigned)s_aOpts[i].iShort < 128)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTPrintf(" -%c,%s\n", s_aOpts[i].iShort, s_aOpts[i].pszLong);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync else
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTPrintf(" %s\n", s_aOpts[i].pszLong);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTEXITCODE_SUCCESS;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case 'o':
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (g_pszOutput)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Output file is already set to '%s'", g_pszOutput);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync g_pszOutput = ValueUnion.psz;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case 's':
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (g_pszScript)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Script file is already set to '%s'", g_pszScript);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync g_pszScript = ValueUnion.psz;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case 'v':
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync g_cVerbosity++;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync case 'V':
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync {
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync /* The following is assuming that svn does it's job here. */
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync static const char s_szRev[] = "$Revision$";
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync const char *psz = RTStrStripL(strchr(s_szRev, ' '));
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync RTPrintf("r%.*s\n", strchr(psz, ' ') - psz, psz);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTEXITCODE_SUCCESS;
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync }
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync case VINF_GETOPT_NOT_OPTION:
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (g_enmAction == kVBoxTpGAction_GenerateObject)
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync break; /* object files, ignore them. */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTGetOptPrintError(rc, &ValueUnion);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync /*
44372afb953dc9f1f1ec71943f5f561a607c0307vboxsync * Our options.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync */
56970d3a1944c7c073d66266cd52449835221badvboxsync case kVBoxTpGOpt_GenerateWrapperHeader:
56970d3a1944c7c073d66266cd52449835221badvboxsync if ( g_enmAction != kVBoxTpGAction_Nothing
56970d3a1944c7c073d66266cd52449835221badvboxsync && g_enmAction != kVBoxTpGAction_GenerateWrapperHeader)
56970d3a1944c7c073d66266cd52449835221badvboxsync return RTMsgErrorExit(RTEXITCODE_SYNTAX, "--generate-wrapper-header does not mix with -h or -G");
56970d3a1944c7c073d66266cd52449835221badvboxsync g_enmAction = kVBoxTpGAction_GenerateWrapperHeader;
56970d3a1944c7c073d66266cd52449835221badvboxsync break;
56970d3a1944c7c073d66266cd52449835221badvboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case kVBoxTpGOpt_Assembler:
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync g_pszAssembler = ValueUnion.psz;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case kVBoxTpGOpt_AssemblerFmtOpt:
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync g_pszAssemblerFmtOpt = ValueUnion.psz;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case kVBoxTpGOpt_AssemblerFmtVal:
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync g_pszAssemblerFmtVal = ValueUnion.psz;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case kVBoxTpGOpt_AssemblerOutputOpt:
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync g_pszAssemblerOutputOpt = ValueUnion.psz;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync case kVBoxTpGOpt_AssemblerOption:
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (g_cAssemblerOptions >= RT_ELEMENTS(g_apszAssemblerOptions))
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Too many assembly options (max %u)", RT_ELEMENTS(g_apszAssemblerOptions));
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync g_apszAssemblerOptions[g_cAssemblerOptions] = ValueUnion.psz;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync g_cAssemblerOptions++;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync break;
9c9db71d639cf066ed41d49629d46d48bff4be2fvboxsync
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync case kVBoxTpGOpt_Pic:
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync g_fPic = true;
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync break;
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync
44372afb953dc9f1f1ec71943f5f561a607c0307vboxsync case kVBoxTpGOpt_ProbeFnName:
44372afb953dc9f1f1ec71943f5f561a607c0307vboxsync g_pszProbeFnName = ValueUnion.psz;
44372afb953dc9f1f1ec71943f5f561a607c0307vboxsync break;
44372afb953dc9f1f1ec71943f5f561a607c0307vboxsync
44372afb953dc9f1f1ec71943f5f561a607c0307vboxsync case kVBoxTpGOpt_ProbeFnImported:
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync g_fProbeFnImported = true;
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync break;
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync case kVBoxTpGOpt_ProbeFnNotImported:
81614fc60e096e714022d10d38b70a36b9b21d48vboxsync g_fProbeFnImported = false;
44372afb953dc9f1f1ec71943f5f561a607c0307vboxsync break;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync case kVBoxTpGOpt_Host32Bit:
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync g_cHostBits = 32;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync break;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync case kVBoxTpGOpt_Host64Bit:
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync g_cHostBits = 64;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync break;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync case kVBoxTpGOpt_RawModeContext:
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync g_fTypeContext = VTG_TYPE_CTX_RC;
56970d3a1944c7c073d66266cd52449835221badvboxsync g_pszContextDefine = "IN_RC";
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync g_pszContextDefine2 = NULL;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync break;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync case kVBoxTpGOpt_Ring0Context:
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync g_fTypeContext = VTG_TYPE_CTX_R0;
56970d3a1944c7c073d66266cd52449835221badvboxsync g_pszContextDefine = "IN_RING0";
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync g_pszContextDefine2 = NULL;
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync break;
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync case kVBoxTpGOpt_Ring0ContextAgnostic:
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync g_fTypeContext = VTG_TYPE_CTX_R0;
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync g_pszContextDefine = "IN_RING0_AGNOSTIC";
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync g_pszContextDefine2 = "IN_RING0";
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync break;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync case kVBoxTpGOpt_Ring3Context:
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync g_fTypeContext = VTG_TYPE_CTX_R3;
56970d3a1944c7c073d66266cd52449835221badvboxsync g_pszContextDefine = "IN_RING3";
4f4cb69bca6bfda8f4d911759d1f3c6f528a173dvboxsync g_pszContextDefine2 = NULL;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync break;
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
9540ab73f6cd0c76f44f6bbfe73f89ac145390b8vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync /*
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * Errors and bugs.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync */
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync default:
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync return RTGetOptPrintError(rc, &ValueUnion);
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync }
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync }
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync /*
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * Check that we've got all we need.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync */
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (g_enmAction == kVBoxTpGAction_Nothing)
56970d3a1944c7c073d66266cd52449835221badvboxsync return RTMsgErrorExit(RTEXITCODE_SYNTAX, "No action specified (-h, -G or --generate-wrapper-header)");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (!g_pszScript)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTMsgErrorExit(RTEXITCODE_SYNTAX, "No script file specified (-s)");
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (!g_pszOutput)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTMsgErrorExit(RTEXITCODE_SYNTAX, "No output file specified (-o)");
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return RTEXITCODE_SUCCESS;
29099c2d04b11e614f1fa399fab9e9162f2788b9vboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsyncint main(int argc, char **argv)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync{
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync int rc = RTR3InitExe(argc, &argv, 0);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (RT_FAILURE(rc))
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return 1;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync RTEXITCODE rcExit = parseArguments(argc, argv);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync if (rcExit == RTEXITCODE_SUCCESS)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync /*
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync * Parse the script.
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync */
0c94a8282c9042b02f022302a3d987746140eab9vboxsync RTListInit(&g_ProviderHead);
0c94a8282c9042b02f022302a3d987746140eab9vboxsync rcExit = parseScript(g_pszScript);
0c94a8282c9042b02f022302a3d987746140eab9vboxsync if (rcExit == RTEXITCODE_SUCCESS)
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync {
0c94a8282c9042b02f022302a3d987746140eab9vboxsync /*
0c94a8282c9042b02f022302a3d987746140eab9vboxsync * Take action.
0c94a8282c9042b02f022302a3d987746140eab9vboxsync */
0c94a8282c9042b02f022302a3d987746140eab9vboxsync if (g_enmAction == kVBoxTpGAction_GenerateHeader)
56970d3a1944c7c073d66266cd52449835221badvboxsync rcExit = generateFile(g_pszOutput, "header", generateHeader);
56970d3a1944c7c073d66266cd52449835221badvboxsync else if (g_enmAction == kVBoxTpGAction_GenerateWrapperHeader)
56970d3a1944c7c073d66266cd52449835221badvboxsync rcExit = generateFile(g_pszOutput, "wrapper header", generateWrapperHeader);
0c94a8282c9042b02f022302a3d987746140eab9vboxsync else
0c94a8282c9042b02f022302a3d987746140eab9vboxsync rcExit = generateObject(g_pszOutput, g_pszTempAsm);
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync }
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync if (rcExit == RTEXITCODE_SUCCESS && g_cTypeErrors > 0)
e250515922582e0410c9bcb6d24b0f17bef083a0vboxsync rcExit = RTEXITCODE_FAILURE;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync return rcExit;
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync}
0c69348b58bb8eabb1bea8867ee932b667bd0d34vboxsync