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


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • tools/checkers/vcc.py

    rf4057f5 red63298  
    3636import subprocess
    3737import jobfile
    38 import re
    3938
    4039jobs = [
    41         "kernel/kernel.job"
     40        "kernel/kernel.job",
     41        "uspace/srv/clip/clip.job"
    4242]
    43 
    44 re_attribute = re.compile("__attribute__\s*\(\(.*\)\)")
    45 re_va_list = re.compile("__builtin_va_list")
    46 
    47 specification = ""
    4843
    4944def usage(prname):
    5045        "Print usage syntax"
    51         print(prname + " <ROOT> [VCC_PATH]")
     46        print prname + " <ROOT>"
    5247
    5348def cygpath(upath):
     
    5954        "Preprocess source using GCC preprocessor and compatibility tweaks"
    6055       
    61         global specification
    62        
    6356        args = ['gcc', '-E']
    6457        args.extend(options.split())
    65         args.extend(['-DCONFIG_VERIFY_VCC=1', srcfname])
     58        args.append(srcfname)
    6659       
    6760        # Change working directory
     
    7265        preproc = subprocess.Popen(args, stdout = subprocess.PIPE).communicate()[0]
    7366       
    74         tmpf = open(tmpfname, "w")
    75         tmpf.write(specification)
     67        tmpf = file(tmpfname, "w")
    7668       
    7769        for line in preproc.splitlines():
    78                
    7970                # Ignore preprocessor directives
    80                
    8171                if (line.startswith('#')):
    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)
     72                        continue       
    9373               
    9474                tmpf.write("%s\n" % line)
     
    10080        return True
    10181
    102 def vcc(vcc_path, root, job):
     82def vcc(root, job):
    10383        "Run Vcc on a jobfile"
    10484       
     
    10888       
    10989        if (not os.path.isfile(inname)):
    110                 print("Unable to open %s" % inname)
    111                 print("Did you run \"make precheck\" on the source tree?")
     90                print "Unable to open %s" % inname
     91                print "Did you run \"make precheck\" on the source tree?"
    11292                return False
    11393       
    114         inf = open(inname, "r")
     94        inf = file(inname, "r")
    11595        records = inf.read().splitlines()
    11696        inf.close()
     
    122102               
    123103                if (len(arg) < 6):
    124                         print("Not enough jobfile record arguments")
     104                        print "Not enought jobfile record arguments"
    125105                        return False
    126106               
    127107                srcfname = arg[0]
    128108                tgtfname = arg[1]
    129                 tool = arg[2]
    130                 category = arg[3]
    131109                base = arg[4]
    132110                options = arg[5]
     
    134112                srcfqname = os.path.join(base, srcfname)
    135113                if (not os.path.isfile(srcfqname)):
    136                         print("Source %s not found" % srcfqname)
     114                        print "Source %s not found" % srcfqname
    137115                        return False
    138116               
     
    140118                tmpfqname = os.path.join(base, tmpfname)
    141119               
    142                 vccfname = "%s.i" % srcfname
    143                 vccfqname = os.path.join(base, vccfname);
    144                
    145120                # Only C files are interesting for us
    146                 if (tool != "cc"):
     121                if (arg[2] != "cc"):
    147122                        continue
    148123               
     
    153128               
    154129                # Run Vcc
    155                 print(" -- %s --" % srcfname)
    156                 retval = subprocess.Popen([vcc_path, '/pointersize:32', '/newsyntax', cygpath(tmpfqname)]).wait()
     130               
     131                retval = subprocess.Popen(['vcc', cygpath(tmpfqname)]).wait()
     132               
     133                # Cleanup
     134               
     135                if (os.path.isfile(tmpfqname)):
     136                        os.remove(tmpfqname)
    157137               
    158138                if (retval != 0):
    159139                        return False
    160                
    161                 # Cleanup, but only if verification was successful
    162                 # (to be able to examine the preprocessed file)
    163                
    164                 if (os.path.isfile(tmpfqname)):
    165                         os.remove(tmpfqname)
    166                         os.remove(vccfqname)
    167140       
    168141        return True
    169142
    170143def main():
    171         global specification
    172        
    173144        if (len(sys.argv) < 2):
    174145                usage(sys.argv[0])
     
    176147       
    177148        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        
    188149        config = os.path.join(rootdir, "HelenOS.config")
    189150       
    190151        if (not os.path.isfile(config)):
    191                 print("%s not found." % config)
    192                 print("Please specify the path to HelenOS build tree root as the first argument.")
     152                print "%s not found." % config
     153                print "Please specify the path to HelenOS build tree root as the first argument."
    193154                return
    194155       
    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()
    203        
    204156        for job in jobs:
    205                 if (not vcc(vcc_path, rootdir, job)):
     157                if (not vcc(rootdir, job)):
    206158                        print
    207                         print("Failed job: %s" % job)
     159                        print "Failed job: %s" % job
    208160                        return
    209161       
    210162        print
    211         print("All jobs passed")
     163        print "All jobs passed"
    212164
    213165if __name__ == '__main__':
Note: See TracChangeset for help on using the changeset viewer.