ccc: Track last actual argument instance for each option & change
driver to lookup this way instead of manually scanning arguments in
multiple places.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61793 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/ccc/ccclib/Driver.py b/tools/ccc/ccclib/Driver.py
index 0133c34..aa617c6 100644
--- a/tools/ccc/ccclib/Driver.py
+++ b/tools/ccc/ccclib/Driver.py
@@ -25,7 +25,7 @@
class Driver(object):
def __init__(self):
- self.parser = Arguments.createOptionParser()
+ self.parser = Arguments.OptionParser()
def run(self, argv):
# FIXME: Things to support from environment: GCC_EXEC_PREFIX,
@@ -99,11 +99,7 @@
# can turn it off in Release-Asserts builds).
# Print in -### syntax.
- hasHashHashHash = None
- for arg in args:
- if arg.opt.name == '-###':
- hasHashHashHash = arg
-
+ hasHashHashHash = args.getLastArg(self.parser.hashHashHashOption)
if hasHashHashHash:
self.claim(hasHashHashHash)
for j in jobs.iterjobs():
@@ -192,45 +188,63 @@
# FIXME: Do we want to report "argument unused" type errors in the
# presence of things like -dumpmachine and -print-search-dirs?
# Probably not.
- for arg in args:
- 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)
+ arg = args.getLastArg(self.parser.dumpmachineOption)
+ if arg:
+ print 'FIXME: %s' % arg.opt.name
+ sys.exit(1)
+
+ arg = args.getLastArg(self.parser.dumpspecsOption)
+ if arg:
+ print 'FIXME: %s' % arg.opt.name
+ sys.exit(1)
+
+ arg = args.getLastArg(self.parser.dumpversionOption)
+ if arg:
+ print 'FIXME: %s' % arg.opt.name
+ sys.exit(1)
+
+ arg = args.getLastArg(self.parser.printFileNameOption)
+ if arg:
+ print 'FIXME: %s' % arg.opt.name
+ sys.exit(1)
+
+ arg = args.getLastArg(self.parser.printMultiDirectoryOption)
+ if arg:
+ print 'FIXME: %s' % arg.opt.name
+ sys.exit(1)
+
+ arg = args.getLastArg(self.parser.printMultiLibOption)
+ if arg:
+ print 'FIXME: %s' % arg.opt.name
+ sys.exit(1)
+
+ arg = args.getLastArg(self.parser.printProgNameOption)
+ if arg:
+ print 'FIXME: %s' % arg.opt.name
+ sys.exit(1)
+
+ arg = args.getLastArg(self.parser.printLibgccFilenameOption)
+ if arg:
+ print 'FIXME: %s' % arg.opt.name
+ sys.exit(1)
+
+ arg = args.getLastArg(self.parser.printSearchDirsOption)
+ if arg:
+ print 'FIXME: %s' % arg.opt.name
+ sys.exit(1)
def buildNormalPipeline(self, args):
- hasCombine = None
- hasSyntaxOnly = None
- hasDashC = hasDashE = hasDashS = None
+ hasCombine = args.getLastArg(self.parser.combineOption)
+ hasSyntaxOnly = args.getLastArg(self.parser.syntaxOnlyOption)
+ hasDashC = args.getLastArg(self.parser.cOption)
+ hasDashE = args.getLastArg(self.parser.EOption)
+ hasDashS = args.getLastArg(self.parser.SOption)
inputType = None
inputTypeOpt = None
inputs = []
for a in args:
- if a.opt.name == '<input>':
+ if a.opt is self.parser.inputOption:
if inputType is None:
base,ext = os.path.splitext(args.getValue(a))
if ext and ext in Types.kTypeSuffixMap:
@@ -246,18 +260,9 @@
self.claim(inputTypeOpt)
klass = inputType
inputs.append((klass, a))
- 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.
+ elif a.opt is self.parser.filelistOption:
+ # Treat as a linker input. Investigate how gcc is
+ # handling this.
#
# FIXME: This might not be good enough. We may
# need to introduce another type for this case, so
@@ -265,7 +270,7 @@
# handles this properly. Best not to try and lipo
# this, for example.
inputs.append((Types.ObjectType, a))
- elif a.opt.name == '-x':
+ elif a.opt is self.parser.xOption:
self.claim(a)
inputTypeOpt = a
value = args.getValue(a)
@@ -400,15 +405,14 @@
# FIXME: We need to handle canonicalization of the specified arch.
archs = []
- hasOutput = None
- hasDashM = hasSaveTemps = None
+ hasDashM = None
+ hasSaveTemps = (args.getLastArg(self.parser.saveTempsOption) or
+ args.getLastArg(self.parser.saveTempsOption2))
for arg in args:
- if arg.opt.name == '-arch':
+ if arg.opt is self.parser.archOption:
archs.append(arg)
elif arg.opt.name.startswith('-M'):
hasDashM = arg
- elif arg.opt.name in ('-save-temps','--save-temps'):
- hasSaveTemps = arg
if not archs:
# FIXME: Need to infer arch so that we sub -Xarch
@@ -477,24 +481,22 @@
def bindPhases(self, phases, args):
jobs = Jobs.JobList()
- finalOutput = None
- hasSaveTemps = hasNoIntegratedCPP = hasPipe = None
+ finalOutput = args.getLastArg(self.parser.oOption)
+ hasSaveTemps = (args.getLastArg(self.parser.saveTempsOption) or
+ args.getLastArg(self.parser.saveTempsOption2))
+ hasNoIntegratedCPP = args.getLastArg(self.parser.noIntegratedCPPOption)
+ hasPipe = args.getLastArg(self.parser.pipeOption)
forward = []
for a in args:
- if a.opt.name == '<input>':
+ if a.opt is self.parser.inputOption:
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
+
+ # FIXME: Needs to be part of option.
elif a.opt.name in ('-E', '-S', '-c',
'-arch', '-fsyntax-only', '-combine', '-x',
'-###'):
pass
+
else:
forward.append(a)
@@ -538,10 +540,10 @@
archName = args.getValue(phase.arch)
filteredArgs = []
for arg in forwardArgs:
- if arg.opt.name == '-arch':
+ if arg.opt is self.parser.archOption:
if arg is phase.arch:
filteredArgs.append(arg)
- elif arg.opt.name == '-Xarch_':
+ elif arg.opt is self.parser.XarchOption:
# FIXME: gcc-dd has another conditional for passing
# through, when the arch conditional array has an empty
# string. Why?
@@ -617,7 +619,7 @@
else:
base,_ = os.path.splitext(inputName)
assert phase.type.tempSuffix is not None
- namedOutput = base + phase.type.tempSuffix
+ namedOutput = base + '.' + phase.type.tempSuffix
# Output to user requested destination?
if atTopLevel and finalOutput:
@@ -627,7 +629,7 @@
output = Arguments.DerivedArg(namedOutput)
else:
# Output to temp file...
- fd,filename = tempfile.mkstemp(suffix=phase.type.tempSuffix)
+ fd,filename = tempfile.mkstemp(suffix='.'+phase.type.tempSuffix)
output = Arguments.DerivedArg(filename)
tool.constructJob(phase, arch, jobList, inputs, output, phase.type, forwardArgs)