Changes in tools/checkers/vcc.py [ed63298:f4057f5] in mainline


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • tools/checkers/vcc.py

    red63298 rf4057f5  
    3636import subprocess
    3737import jobfile
     38import re
    3839
    3940jobs = [
    40         "kernel/kernel.job",
    41         "uspace/srv/clip/clip.job"
     41        "kernel/kernel.job"
    4242]
     43
     44re_attribute = re.compile("__attribute__\s*\(\(.*\)\)")
     45re_va_list = re.compile("__builtin_va_list")
     46
     47specification = ""
    4348
    4449def usage(prname):
    4550        "Print usage syntax"
    46         print prname + " <ROOT>"
     51        print(prname + " <ROOT> [VCC_PATH]")
    4752
    4853def cygpath(upath):
     
    5459        "Preprocess source using GCC preprocessor and compatibility tweaks"
    5560       
     61        global specification
     62       
    5663        args = ['gcc', '-E']
    5764        args.extend(options.split())
    58         args.append(srcfname)
     65        args.extend(['-DCONFIG_VERIFY_VCC=1', srcfname])
    5966       
    6067        # Change working directory
     
    6572        preproc = subprocess.Popen(args, stdout = subprocess.PIPE).communicate()[0]
    6673       
    67         tmpf = file(tmpfname, "w")
     74        tmpf = open(tmpfname, "w")
     75        tmpf.write(specification)
    6876       
    6977        for line in preproc.splitlines():
     78               
    7079                # Ignore preprocessor directives
     80               
    7181                if (line.startswith('#')):
    72                         continue       
     82                        continue
     83               
     84                # Remove __attribute__((.*)) GCC extension
     85               
     86                line = re.sub(re_attribute, "", line)
     87               
     88                # Ignore unsupported __builtin_va_list type
     89                # (a better solution replacing __builrin_va_list with
     90                # an emulated implementation is needed)
     91               
     92                line = re.sub(re_va_list, "void *", line)
    7393               
    7494                tmpf.write("%s\n" % line)
     
    80100        return True
    81101
    82 def vcc(root, job):
     102def vcc(vcc_path, root, job):
    83103        "Run Vcc on a jobfile"
    84104       
     
    88108       
    89109        if (not os.path.isfile(inname)):
    90                 print "Unable to open %s" % inname
    91                 print "Did you run \"make precheck\" on the source tree?"
     110                print("Unable to open %s" % inname)
     111                print("Did you run \"make precheck\" on the source tree?")
    92112                return False
    93113       
    94         inf = file(inname, "r")
     114        inf = open(inname, "r")
    95115        records = inf.read().splitlines()
    96116        inf.close()
     
    102122               
    103123                if (len(arg) < 6):
    104                         print "Not enought jobfile record arguments"
     124                        print("Not enough jobfile record arguments")
    105125                        return False
    106126               
    107127                srcfname = arg[0]
    108128                tgtfname = arg[1]
     129                tool = arg[2]
     130                category = arg[3]
    109131                base = arg[4]
    110132                options = arg[5]
     
    112134                srcfqname = os.path.join(base, srcfname)
    113135                if (not os.path.isfile(srcfqname)):
    114                         print "Source %s not found" % srcfqname
     136                        print("Source %s not found" % srcfqname)
    115137                        return False
    116138               
     
    118140                tmpfqname = os.path.join(base, tmpfname)
    119141               
     142                vccfname = "%s.i" % srcfname
     143                vccfqname = os.path.join(base, vccfname);
     144               
    120145                # Only C files are interesting for us
    121                 if (arg[2] != "cc"):
     146                if (tool != "cc"):
    122147                        continue
    123148               
     
    128153               
    129154                # Run Vcc
    130                
    131                 retval = subprocess.Popen(['vcc', cygpath(tmpfqname)]).wait()
    132                
    133                 # Cleanup
     155                print(" -- %s --" % srcfname)
     156                retval = subprocess.Popen([vcc_path, '/pointersize:32', '/newsyntax', cygpath(tmpfqname)]).wait()
     157               
     158                if (retval != 0):
     159                        return False
     160               
     161                # Cleanup, but only if verification was successful
     162                # (to be able to examine the preprocessed file)
    134163               
    135164                if (os.path.isfile(tmpfqname)):
    136165                        os.remove(tmpfqname)
    137                
    138                 if (retval != 0):
    139                         return False
     166                        os.remove(vccfqname)
    140167       
    141168        return True
    142169
    143170def main():
     171        global specification
     172       
    144173        if (len(sys.argv) < 2):
    145174                usage(sys.argv[0])
     
    147176       
    148177        rootdir = os.path.abspath(sys.argv[1])
     178        if (len(sys.argv) > 2):
     179                vcc_path = sys.argv[2]
     180        else:
     181                vcc_path = "/cygdrive/c/Program Files (x86)/Microsoft Research/Vcc/Binaries/vcc"
     182       
     183        if (not os.path.isfile(vcc_path)):
     184                print("%s is not a binary." % vcc_path)
     185                print("Please supply the full Cygwin path to Vcc as the second argument.")
     186                return
     187       
    149188        config = os.path.join(rootdir, "HelenOS.config")
    150189       
    151190        if (not os.path.isfile(config)):
    152                 print "%s not found." % config
    153                 print "Please specify the path to HelenOS build tree root as the first argument."
    154                 return
     191                print("%s not found." % config)
     192                print("Please specify the path to HelenOS build tree root as the first argument.")
     193                return
     194       
     195        specpath = os.path.join(rootdir, "tools/checkers/vcc.h")
     196        if (not os.path.isfile(specpath)):
     197                print("%s not found." % config)
     198                return
     199       
     200        specfile = file(specpath, "r")
     201        specification = specfile.read()
     202        specfile.close()
    155203       
    156204        for job in jobs:
    157                 if (not vcc(rootdir, job)):
     205                if (not vcc(vcc_path, rootdir, job)):
    158206                        print
    159                         print "Failed job: %s" % job
     207                        print("Failed job: %s" % job)
    160208                        return
    161209       
    162210        print
    163         print "All jobs passed"
     211        print("All jobs passed")
    164212
    165213if __name__ == '__main__':
Note: See TracChangeset for help on using the changeset viewer.