[cfe-commits] r61783 - in /cfe/trunk/tools/ccc/ccclib: Arguments.py Driver.py

Daniel Dunbar daniel at zuster.org
Mon Jan 5 18:30:11 PST 2009


Author: ddunbar
Date: Mon Jan  5 20:30:10 2009
New Revision: 61783

URL: http://llvm.org/viewvc/llvm-project?rev=61783&view=rev
Log:
ccc: Use dummy InputOption and UnknownOption classes instead of
InputArg and UnknownArg.
 - Every argument now always corresponds to some option, which
   simplifies other code.

Modified:
    cfe/trunk/tools/ccc/ccclib/Arguments.py
    cfe/trunk/tools/ccc/ccclib/Driver.py

Modified: cfe/trunk/tools/ccc/ccclib/Arguments.py
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/ccc/ccclib/Arguments.py?rev=61783&r1=61782&r2=61783&view=diff

==============================================================================
--- cfe/trunk/tools/ccc/ccclib/Arguments.py (original)
+++ cfe/trunk/tools/ccc/ccclib/Arguments.py Mon Jan  5 20:30:10 2009
@@ -17,6 +17,24 @@
         return '<%s name=%r>' % (self.__class__.__name__,
                                  self.name)
 
+# Dummy options
+
+class InputOption(Option):
+    def __init__(self):
+        super(InputOption, self).__init__('<input>')
+
+    def accept(self):
+        raise RuntimeError,"accept() should never be used on InputOption instance."
+
+class UnknownOption(Option):
+    def __init__(self):
+        super(UnknownOption, self).__init__('<unknown>')
+
+    def accept(self):
+        raise RuntimeError,"accept() should never be used on UnknownOption instance."        
+
+# Normal options
+
 class FlagOption(Option):
     """An option which takes no arguments."""
 
@@ -90,6 +108,7 @@
 class Arg(object):
     """Arg - Base class for actual driver arguments."""
     def __init__(self, index, opt):
+        assert opt is not None
         self.index = index
         self.opt = opt
 
@@ -115,9 +134,8 @@
     def setValue(self, args, value):
         abstract
 
-class UnknownArg(ValueArg):
-    def __init__(self, index):
-        super(UnknownArg, self).__init__(index, None)
+class PositionalArg(ValueArg):
+    """PositionalArg - A simple positional argument."""
 
     def getValue(self, args):
         return args[self.index]
@@ -129,6 +147,9 @@
         return [args[self.index]]
 
 class JoinedValueArg(ValueArg):
+    """JoinedValueArg - A single value argument where the value is
+    joined (suffixed) to the option."""
+
     def getValue(self, args):
         return args[self.index][len(self.opt.name):]
 
@@ -140,6 +161,9 @@
         return [self.opt.name + self.getValue(args)]
 
 class SeparateValueArg(ValueArg):
+    """SeparateValueArg - A single value argument where the value
+    follows the option in the argument vector."""
+
     def getValue(self, args):
         return args[self.index+1]
 
@@ -150,6 +174,11 @@
         return [self.opt.name, self.getValue(args)]
 
 class MultipleValuesArg(Arg):
+    """MultipleValuesArg - An argument with multiple values which
+    follow the option in the argument vector."""
+
+    # FIXME: Should we unify this with SeparateValueArg?
+
     def getValues(self, args):
         return args[self.index + 1:self.index + 1 + self.opt.numArgs]
 
@@ -183,27 +212,15 @@
         return ([self.opt.name + self.getJoinedValue(args)] + 
                 [self.getSeparateValue(args)])
 
-class InputArg(ValueArg):
-    """InputArg - An input file (positional) argument."""
-
-    def __init__(self, index):
-        super(ValueArg, self).__init__(index, None)
-
-    def getValue(self, args):
-        return args[self.index]
-
-    def setValue(self, args, value):
-        args[self.index] = value
- 
-    def render(self, args):
-        return [self.getValue(args)]
-
 class DerivedArg(ValueArg):
     """DerivedArg - A synthesized argument which does not correspend
-    to the actual input arguments array."""
+    to an item in the argument vector."""
 
     def __init__(self, value):
-        super(ValueArg, self).__init__(-1, None)
+        # FIXME: The UnknownOption() here is a total hack so we can
+        # rely on arg.opt not being nil. Ok for now since DerivedArg
+        # is dying.
+        super(DerivedArg, self).__init__(-1, UnknownOption())
         self.value = value
 
     def getValue(self, args):
@@ -216,7 +233,7 @@
         return [self.value]
 
 class ArgList:
-    """ArgList - Collect an input argv along with a set of parsed Args
+    """ArgList - Collect an input argument vector along with a set of parsed Args
     and supporting information."""
 
     def __init__(self, argv):
@@ -248,7 +265,9 @@
 class OptionParser:
     def __init__(self):
         self.options = []
-        
+        self.inputOption = InputOption()
+        self.unknownOption = UnknownOption()
+
     def addOption(self, opt):
         self.options.append(opt)
 
@@ -274,15 +293,15 @@
             elif a[0] == '-' and a != '-':
                 args.append(self.lookupOptForArg(i, a, it))
             else:
-                args.append(InputArg(i))
+                args.append(PositionalArg(i, self.inputOption))
         return args
     
-    def lookupOptForArg(self, i, arg, it):
-        for op in self.options:
-            opt = op.accept(i, arg, it)
-            if opt is not None:
-                return opt
-        return UnknownArg(i)
+    def lookupOptForArg(self, i, string, it):
+        for o in self.options:
+            arg = o.accept(i, string, it)
+            if arg is not None:
+                return arg
+        return PositionalArg(i, self.unknownOption)
 
 def createOptionParser():
     op = OptionParser()

Modified: cfe/trunk/tools/ccc/ccclib/Driver.py
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/ccc/ccclib/Driver.py?rev=61783&r1=61782&r2=61783&view=diff

==============================================================================
--- cfe/trunk/tools/ccc/ccclib/Driver.py (original)
+++ cfe/trunk/tools/ccc/ccclib/Driver.py Mon Jan  5 20:30:10 2009
@@ -101,7 +101,7 @@
         # Print in -### syntax.
         hasHashHashHash = None
         for arg in args:
-            if arg.opt and arg.opt.name == '-###':
+            if arg.opt.name == '-###':
                 hasHashHashHash = arg
 
         if hasHashHashHash:
@@ -137,13 +137,6 @@
 
     def printOptions(self, args):
         for i,arg in enumerate(args):
-            if isinstance(arg, Arguments.InputArg):
-                name = "<input>"
-            elif isinstance(arg, Arguments.UnknownArg):
-                name = "<unknown>"
-            else:
-                assert arg.opt
-                name = arg.opt.name
             if isinstance(arg, Arguments.MultipleValuesArg):
                 values = list(args.getValues(arg))
             elif isinstance(arg, Arguments.ValueArg):
@@ -152,7 +145,7 @@
                 values = [args.getJoinedValue(arg), args.getSeparateValue(arg)]
             else:
                 values = []
-            print 'Option %d - Name: "%s", Values: {%s}' % (i, name, 
+            print 'Option %d - Name: "%s", Values: {%s}' % (i, arg.opt.name, 
                                                             ', '.join(['"%s"' % v 
                                                                        for v in values]))
 
@@ -200,34 +193,33 @@
         # presence of things like -dumpmachine and -print-search-dirs?
         # Probably not.
         for arg in args:
-            if arg.opt is not None:
-                if arg.opt.name == '-dumpmachine':
-                    print 'FIXME: %s' % arg.opt.name
-                    sys.exit(1)
-                elif arg.opt.name == '-dumpspecs':
-                    print 'FIXME: %s' % arg.opt.name
-                    sys.exit(1)
-                elif arg.opt.name == '-dumpversion':
-                    print 'FIXME: %s' % arg.opt.name
-                    sys.exit(1)
-                elif arg.opt.name == '-print-file-name=':
-                    print 'FIXME: %s' % arg.opt.name
-                    sys.exit(1)
-                elif arg.opt.name == '-print-multi-directory':
-                    print 'FIXME: %s' % arg.opt.name
-                    sys.exit(1)
-                elif arg.opt.name == '-print-multi-lib':
-                    print 'FIXME: %s' % arg.opt.name
-                    sys.exit(1)
-                elif arg.opt.name == '-print-prog-name=':
-                    print 'FIXME: %s' % arg.opt.name
-                    sys.exit(1)
-                elif arg.opt.name == '-print-libgcc-file-name':
-                    print 'FIXME: %s' % arg.opt.name
-                    sys.exit(1)
-                elif arg.opt.name == '-print-search-dirs':
-                    print 'FIXME: %s' % arg.opt.name
-                    sys.exit(1)
+            if arg.opt.name == '-dumpmachine':
+                print 'FIXME: %s' % arg.opt.name
+                sys.exit(1)
+            elif arg.opt.name == '-dumpspecs':
+                print 'FIXME: %s' % arg.opt.name
+                sys.exit(1)
+            elif arg.opt.name == '-dumpversion':
+                print 'FIXME: %s' % arg.opt.name
+                sys.exit(1)
+            elif arg.opt.name == '-print-file-name=':
+                print 'FIXME: %s' % arg.opt.name
+                sys.exit(1)
+            elif arg.opt.name == '-print-multi-directory':
+                print 'FIXME: %s' % arg.opt.name
+                sys.exit(1)
+            elif arg.opt.name == '-print-multi-lib':
+                print 'FIXME: %s' % arg.opt.name
+                sys.exit(1)
+            elif arg.opt.name == '-print-prog-name=':
+                print 'FIXME: %s' % arg.opt.name
+                sys.exit(1)
+            elif arg.opt.name == '-print-libgcc-file-name':
+                print 'FIXME: %s' % arg.opt.name
+                sys.exit(1)
+            elif arg.opt.name == '-print-search-dirs':
+                print 'FIXME: %s' % arg.opt.name
+                sys.exit(1)
 
     def buildNormalPipeline(self, args):
         hasCombine = None
@@ -238,7 +230,7 @@
         inputTypeOpt = None
         inputs = []
         for a in args:
-            if isinstance(a, Arguments.InputArg):
+            if a.opt.name == '<input>':
                 if inputType is None:
                     base,ext = os.path.splitext(args.getValue(a))
                     if ext and ext in Types.kTypeSuffixMap:
@@ -254,43 +246,40 @@
                     self.claim(inputTypeOpt)
                     klass = inputType
                 inputs.append((klass, a))
-            elif a.opt is not None:
-                # FIXME: We should warn about inconsistent and duplicate
-                # usage of these flags.
-                if a.opt.name == '-E':
-                    hasDashE = a
-                elif a.opt.name == '-S':
-                    hasDashS = a
-                elif a.opt.name == '-c':
-                    hasDashC = a
-                elif a.opt.name == '-fsyntax-only':
-                    hasSyntaxOnly = a
-                elif a.opt.name == '-combine':
-                    hasCombine = a
-                elif a.opt.name == '-filelist':
-                    # FIXME: This might not be good enough. We may
-                    # need to introduce another type of InputArg for
-                    # this case, so that other code which needs to
-                    # know the inputs handles this properly. Best not
-                    # to try and lipo this, for example.
-                    #
-                    # Treat as a linker input.
-                    inputs.append((Types.ObjectType, a))
-                elif a.opt.name == '-x':
-                    self.claim(a)
-                    inputTypeOpt = a
-                    value = args.getValue(a)
-                    if value in Types.kTypeSpecifierMap:
-                        inputType = Types.kTypeSpecifierMap[value]
-                    else:
-                        # FIXME: How are we going to handle diagnostics.
-                        self.warning("language %s not recognized" % value)
+            elif a.opt.name == '-E':
+                hasDashE = a
+            elif a.opt.name == '-S':
+                hasDashS = a
+            elif a.opt.name == '-c':
+                hasDashC = a
+            elif a.opt.name == '-fsyntax-only':
+                hasSyntaxOnly = a
+            elif a.opt.name == '-combine':
+                hasCombine = a
+            elif a.opt.name == '-filelist':
+                # Treat as a linker input.
+                #
+                # FIXME: This might not be good enough. We may
+                # need to introduce another type for this case, so
+                # that other code which needs to know the inputs
+                # handles this properly. Best not to try and lipo
+                # this, for example.
+                inputs.append((Types.ObjectType, a))
+            elif a.opt.name == '-x':
+                self.claim(a)
+                inputTypeOpt = a
+                value = args.getValue(a)
+                if value in Types.kTypeSpecifierMap:
+                    inputType = Types.kTypeSpecifierMap[value]
+                else:
+                    # FIXME: How are we going to handle diagnostics.
+                    self.warning("language %s not recognized" % value)
 
-                        # FIXME: Its not clear why we shouldn't just
-                        # revert to unknown. I think this is more likely a
-                        # bug / unintended behavior in gcc. Not very
-                        # important though.
-                        inputType = ObjectType
+                    # FIXME: Its not clear why we shouldn't just
+                    # revert to unknown. I think this is more likely a
+                    # bug / unintended behavior in gcc. Not very
+                    # important though.
+                    inputType = ObjectType
 
         # We claim things here so that options for which we silently allow
         # override only ever claim the used option.
@@ -414,12 +403,8 @@
         hasOutput = None
         hasDashM = hasSaveTemps = None
         for arg in args:
-            if arg.opt is None:
-                continue
-
-            if isinstance(arg, Arguments.ValueArg):
-                if arg.opt.name == '-arch':
-                    archs.append(arg)
+            if arg.opt.name == '-arch':
+                archs.append(arg)
             elif arg.opt.name.startswith('-M'):
                 hasDashM = arg
             elif arg.opt.name in ('-save-temps','--save-temps'):
@@ -496,23 +481,20 @@
         hasSaveTemps = hasNoIntegratedCPP = hasPipe = None
         forward = []
         for a in args:
-            if isinstance(a, Arguments.InputArg):
+            if a.opt.name == '<input>':
+                pass
+            elif a.opt.name == '-save-temps':
+                hasSaveTemps = a
+            elif a.opt.name == '-no-integrated-cpp':
+                hasNoIntegratedCPP = a
+            elif a.opt.name == '-o':
+                finalOutput = a
+            elif a.opt.name == '-pipe':
+                hasPipe = a
+            elif a.opt.name in ('-E', '-S', '-c',
+                                '-arch', '-fsyntax-only', '-combine', '-x',
+                                '-###'):
                 pass
-            elif a.opt is not None:
-                if a.opt.name == '-save-temps':
-                    hasSaveTemps = a
-                elif a.opt.name == '-no-integrated-cpp':
-                    hasNoIntegratedCPP = a
-                elif a.opt.name == '-o':
-                    finalOutput = a
-                elif a.opt.name == '-pipe':
-                    hasPipe = a
-                elif a.opt.name in ('-E', '-S', '-c',
-                                    '-arch', '-fsyntax-only', '-combine', '-x',
-                                    '-###'):
-                    pass
-                else:
-                    forward.append(a)
             else:
                 forward.append(a)
 
@@ -556,9 +538,7 @@
                 archName = args.getValue(phase.arch)
                 filteredArgs = []
                 for arg in forwardArgs:
-                    if arg.opt is None:
-                        filteredArgs.append(arg)
-                    elif arg.opt.name == '-arch':
+                    if arg.opt.name == '-arch':
                         if arg is phase.arch:
                             filteredArgs.append(arg)
                     elif arg.opt.name == '-Xarch_':





More information about the cfe-commits mailing list