ccc: Use dummy InputOption and UnknownOption classes instead of

InputArg and UnknownArg.
 - Every argument now always corresponds to some option, which
   simplifies other code.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61783 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar 2009-01-06 02:30:10 +00:00
Родитель c16c208e85
Коммит 5039f211dd
2 изменённых файлов: 127 добавлений и 128 удалений

Просмотреть файл

@ -17,6 +17,24 @@ class Option(object):
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 JoinedAndSeparateOption(Option):
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 @@ class ValueArg(Arg):
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 @@ class UnknownArg(ValueArg):
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 @@ class JoinedValueArg(ValueArg):
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 @@ class SeparateValueArg(ValueArg):
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 @@ class JoinedAndSeparateValuesArg(Arg):
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 @@ class DerivedArg(ValueArg):
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 ArgList:
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 @@ class OptionParser:
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()

Просмотреть файл

@ -101,7 +101,7 @@ class Driver(object):
# 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 @@ class Driver(object):
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 @@ class Driver(object):
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 @@ class Driver(object):
# 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 @@ class Driver(object):
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 @@ class Driver(object):
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 @@ class Driver(object):
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 @@ class Driver(object):
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 @@ class Driver(object):
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_':