DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (409f3966645a)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
#!/usr/bin/python
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# Usage: pgomerge.py <binary basename> <dist/bin>
# Gathers .pgc files from dist/bin and merges them into
# $PWD/$basename.pgd using pgomgr, then deletes them.
# No errors if any of these files don't exist.

import sys
import os
import os.path
import subprocess
if not sys.platform == "win32":
    raise Exception("This script was only meant for Windows.")


def MergePGOFiles(basename, pgddir, pgcdir):
    """Merge pgc files produced from an instrumented binary
       into the pgd file for the second pass of profile-guided optimization
       with MSVC.  |basename| is the name of the DLL or EXE without the
       extension.  |pgddir| is the path that contains <basename>.pgd
       (should be the objdir it was built in).  |pgcdir| is the path
       containing basename!N.pgc files, which is probably dist/bin.
       Calls pgomgr to merge each pgc file into the pgd, then deletes
       the pgc files."""
    if not os.path.isdir(pgddir) or not os.path.isdir(pgcdir):
        return
    pgdfile = os.path.abspath(os.path.join(pgddir, basename + ".pgd"))
    if not os.path.isfile(pgdfile):
        return
    for file in os.listdir(pgcdir):
        if file.startswith(basename+"!") and file.endswith(".pgc"):
            try:
                pgcfile = os.path.normpath(os.path.join(pgcdir, file))
                subprocess.call(['pgomgr', '-merge',
                                 pgcfile,
                                 pgdfile])
                os.remove(pgcfile)
            except OSError:
                pass


if __name__ == '__main__':
    if len(sys.argv) != 3:
        print >>sys.stderr, "Usage: pgomerge.py <binary basename> <dist/bin>"
        sys.exit(1)
    MergePGOFiles(sys.argv[1], os.getcwd(), sys.argv[2])