Changeset 3425 for trunk/src/kmk


Ignore:
Timestamp:
Aug 21, 2020, 2:45:06 PM (5 years ago)
Author:
bird
Message:

kmk: Optimized func_kbuild_source_one by caching the target level part of the result in $(target)_2_TTPROP_TYPE variables. We'll do this regardless of caller version (lazy bird).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/kbuild.c

    r3415 r3425  
    15191519}
    15201520
     1521/** Per variable struct used by kbuild_collect_source_prop and helpers. */
     1522struct kbuild_collect_variable
     1523{
     1524    struct variable    *pVar;
     1525    unsigned int        cchExp;
     1526    char               *pszExp;
     1527};
     1528
     1529/**
     1530 * Helper for kbuild_collect_source_prop.
     1531 * 
     1532 * Frees up any memory we've allocated for the variable values.
     1533 */
     1534static struct variable *
     1535kbuild_collect_source_prop_create_var(size_t cchTotal, int cVars, struct kbuild_collect_variable *paVars, int iDirection,
     1536                                      const char *pszVarName, size_t cchVarName, enum variable_origin enmVarOrigin)
     1537{
     1538    char *pszResult;
     1539    struct variable *pVar;
     1540    if (!cVars || !cchTotal)
     1541    {
     1542        pszResult = xmalloc(1);
     1543        *pszResult = '\0';
     1544    }
     1545    else
     1546    {
     1547        int iVar;
     1548        char *psz = pszResult = xmalloc(cchTotal + 1);
     1549        if (iDirection == 1)
     1550        {
     1551            for (iVar = 0; iVar < cVars; iVar++)
     1552            {
     1553                my_memcpy(psz, paVars[iVar].pszExp, paVars[iVar].cchExp);
     1554                psz += paVars[iVar].cchExp;
     1555                *psz++ = ' ';
     1556                if (paVars[iVar].pszExp != paVars[iVar].pVar->value)
     1557                    free(paVars[iVar].pszExp);
     1558            }
     1559        }
     1560        else
     1561        {
     1562            iVar = cVars;
     1563            while (iVar-- > 0)
     1564            {
     1565                my_memcpy(psz, paVars[iVar].pszExp, paVars[iVar].cchExp);
     1566                psz += paVars[iVar].cchExp;
     1567                *psz++ = ' ';
     1568                if (paVars[iVar].pszExp != paVars[iVar].pVar->value)
     1569                    free(paVars[iVar].pszExp);
     1570            }
     1571
     1572        }
     1573        assert(psz != pszResult);
     1574        assert(cchTotal == (size_t)(psz - pszResult));
     1575        psz[-1] = '\0';
     1576        cchTotal--;
     1577
     1578    }
     1579    if (enmVarOrigin == o_local)
     1580        pVar = define_variable_vl(pszVarName, cchVarName, pszResult, cchTotal,
     1581                                  0 /* take pszResult */ , enmVarOrigin, 0 /* !recursive */);
     1582    else
     1583        pVar = define_variable_vl_global(pszVarName, cchVarName, pszResult, cchTotal,
     1584                                         0 /* take pszResult */ , enmVarOrigin, 0 /* !recursive */, NILF);
     1585    return pVar;
     1586}
    15211587
    15221588/* this kind of stuff:
     
    16581724    int cVars, iVar;
    16591725    size_t cchTotal, cchBuf;
    1660     char *pszResult, *pszBuf, *psz, *psz2, *psz3;
    1661     struct
    1662     {
    1663         struct variable    *pVar;
    1664         unsigned int        cchExp;
    1665         char               *pszExp;
    1666     } *paVars;
     1726    char *pszBuf, *psz, *psz2, *psz3;
     1727    struct kbuild_collect_variable *paVars;
    16671728
    16681729    assert(iDirection == 1 || iDirection == -1);
     
    16801741           + pBldTrgArch->value_length + 1
    16811742           + pBldTrgCpu->value_length + 1
    1682            + pBldType->value_length + 1;
     1743           + pBldType->value_length + 1
     1744           + sizeof("_2_");
    16831745    pszBuf = xmalloc(cchBuf);
    16841746
     
    16891751     */
    16901752    cVars = 12 * (pSdks->c + 5);
    1691     paVars = alloca(cVars * sizeof(paVars[0]));
     1753    paVars = (struct kbuild_collect_variable *)alloca(cVars * sizeof(paVars[0]));
    16921754
    16931755    iVar = 0;
     
    17731835    } while (0)
    17741836
    1775     /* the tool (lowest priority). */
     1837    /*
     1838     * The first bunch part may be cached on the target already, check that first:
     1839     */
    17761840    psz = pszBuf;
    1777     ADD_CSTR("TOOL_");
    1778     ADD_VAR(pTool);
     1841    ADD_VAR(pTarget);
     1842    ADD_CSTR("_2_");
     1843    ADD_VAR(pType);
     1844    ADD_STR(pszProp, cchProp);
    17791845    ADD_CH('_');
    1780     DO_DOUBLE_PSZ2_VARIATION();
    1781 
    1782 
    1783     /* the global sdks. */
    1784     iSdkEnd = iDirection == 1 ? pSdks->iGlobal + pSdks->cGlobal : pSdks->iGlobal - 1;
    1785     for (iSdk = iDirection == 1 ? pSdks->iGlobal : pSdks->iGlobal + pSdks->cGlobal - 1;
    1786          iSdk != iSdkEnd;
    1787          iSdk += iDirection)
    1788     {
    1789         struct variable *pSdk = &pSdks->pa[iSdk];
     1846    ADD_VAR(pBldType);
     1847    *psz = '\0';
     1848    pVar = kbuild_lookup_variable_n(pszBuf, psz - pszBuf);
     1849    if (pVar)
     1850        assert(iVar == 0);
     1851    else
     1852    {
     1853        /* the tool (lowest priority). */
    17901854        psz = pszBuf;
    1791         ADD_CSTR("SDK_");
    1792         ADD_VAR(pSdk);
     1855        ADD_CSTR("TOOL_");
     1856        ADD_VAR(pTool);
    17931857        ADD_CH('_');
    17941858        DO_DOUBLE_PSZ2_VARIATION();
    1795     }
    1796 
    1797     /* the globals. */
    1798     psz = pszBuf;
    1799     DO_DOUBLE_PSZ2_VARIATION();
    1800 
    1801     /* the target sdks. */
    1802 /** @todo these can be cached in a type specific _2_ variable   */
    1803     iSdkEnd = iDirection == 1 ? pSdks->iTarget + pSdks->cTarget : pSdks->iTarget - 1;
    1804     for (iSdk = iDirection == 1 ? pSdks->iTarget : pSdks->iTarget + pSdks->cTarget - 1;
    1805          iSdk != iSdkEnd;
    1806          iSdk += iDirection)
    1807     {
    1808         struct variable *pSdk = &pSdks->pa[iSdk];
     1859
     1860        /* the global sdks. */
     1861        iSdkEnd = iDirection == 1 ? pSdks->iGlobal + pSdks->cGlobal : pSdks->iGlobal - 1;
     1862        for (iSdk = iDirection == 1 ? pSdks->iGlobal : pSdks->iGlobal + pSdks->cGlobal - 1;
     1863             iSdk != iSdkEnd;
     1864             iSdk += iDirection)
     1865        {
     1866            struct variable *pSdk = &pSdks->pa[iSdk];
     1867            psz = pszBuf;
     1868            ADD_CSTR("SDK_");
     1869            ADD_VAR(pSdk);
     1870            ADD_CH('_');
     1871            DO_DOUBLE_PSZ2_VARIATION();
     1872        }
     1873
     1874        /* the globals. */
    18091875        psz = pszBuf;
    1810         ADD_CSTR("SDK_");
    1811         ADD_VAR(pSdk);
     1876        DO_DOUBLE_PSZ2_VARIATION();
     1877
     1878        /* the target sdks. */
     1879        iSdkEnd = iDirection == 1 ? pSdks->iTarget + pSdks->cTarget : pSdks->iTarget - 1;
     1880        for (iSdk = iDirection == 1 ? pSdks->iTarget : pSdks->iTarget + pSdks->cTarget - 1;
     1881             iSdk != iSdkEnd;
     1882             iSdk += iDirection)
     1883        {
     1884            struct variable *pSdk = &pSdks->pa[iSdk];
     1885            psz = pszBuf;
     1886            ADD_CSTR("SDK_");
     1887            ADD_VAR(pSdk);
     1888            ADD_CH('_');
     1889            DO_DOUBLE_PSZ2_VARIATION();
     1890        }
     1891
     1892        /* the target. */
     1893        psz = pszBuf;
     1894        ADD_VAR(pTarget);
    18121895        ADD_CH('_');
    18131896        DO_DOUBLE_PSZ2_VARIATION();
    1814     }
    1815 
    1816 
    1817     /* the target. */
    1818 /** @todo these can be cached in a type specific _2_ variable   */
    1819     psz = pszBuf;
    1820     ADD_VAR(pTarget);
    1821     ADD_CH('_');
    1822     DO_DOUBLE_PSZ2_VARIATION();
     1897
     1898        /*
     1899         * Cache the result thus far (frees up anything we might've allocated above).
     1900         */
     1901        psz = pszBuf;
     1902        ADD_VAR(pTarget);
     1903        ADD_CSTR("_2_");
     1904        ADD_VAR(pType);
     1905        ADD_STR(pszProp, cchProp);
     1906        ADD_CH('_');
     1907        ADD_VAR(pBldType);
     1908        *psz = '\0';
     1909        assert(iVar <= cVars);
     1910        pVar = kbuild_collect_source_prop_create_var(cchTotal, iVar, paVars, iDirection, pszBuf, psz - pszBuf, o_file);
     1911        assert(pVar);
     1912    }
     1913
     1914    /* Now we use the cached target variable. */
     1915    paVars[0].pVar   = pVar;
     1916    paVars[0].pszExp = pVar->value;
     1917    paVars[0].cchExp = pVar->value_length;
     1918    cchTotal         = paVars[0].cchExp + 1;
     1919    iVar = 1;
    18231920
    18241921    /* the source sdks. */
     
    18661963    free(pszBuf);
    18671964
     1965    /*
     1966     * Construct the result value (frees up anything we might've allocated above).
     1967     */
    18681968    assert(iVar <= cVars);
    1869     cVars = iVar;
    1870 
    1871     /*
    1872      * Construct the result value.
    1873      */
    1874     if (!cVars || !cchTotal)
    1875         pVar = define_variable_vl(pszVarName, cchVarName, "", 0,
    1876                                   1 /* duplicate value */ , o_local, 0 /* !recursive */);
    1877     else
    1878     {
    1879         psz = pszResult = xmalloc(cchTotal + 1);
    1880         if (iDirection == 1)
    1881         {
    1882             for (iVar = 0; iVar < cVars; iVar++)
    1883             {
    1884                 my_memcpy(psz, paVars[iVar].pszExp, paVars[iVar].cchExp);
    1885                 psz += paVars[iVar].cchExp;
    1886                 *psz++ = ' ';
    1887                 if (paVars[iVar].pszExp != paVars[iVar].pVar->value)
    1888                     free(paVars[iVar].pszExp);
    1889             }
    1890         }
    1891         else
    1892         {
    1893             iVar = cVars;
    1894             while (iVar-- > 0)
    1895             {
    1896                 my_memcpy(psz, paVars[iVar].pszExp, paVars[iVar].cchExp);
    1897                 psz += paVars[iVar].cchExp;
    1898                 *psz++ = ' ';
    1899                 if (paVars[iVar].pszExp != paVars[iVar].pVar->value)
    1900                     free(paVars[iVar].pszExp);
    1901             }
    1902 
    1903         }
    1904         assert(psz != pszResult);
    1905         assert(cchTotal == (size_t)(psz - pszResult));
    1906         psz[-1] = '\0';
    1907         cchTotal--;
    1908 
    1909         pVar = define_variable_vl(pszVarName, cchVarName, pszResult, cchTotal,
    1910                                   0 /* take pszResult */ , o_local, 0 /* !recursive */);
    1911     }
    1912 
    1913     return pVar;
     1969    return kbuild_collect_source_prop_create_var(cchTotal, iVar, paVars, iDirection, pszVarName, cchVarName, o_local);
    19141970
    19151971#undef ADD_VAR
Note: See TracChangeset for help on using the changeset viewer.