From: Daniel Dunbar Date: Tue, 6 Jan 2009 06:12:13 +0000 (+0000) Subject: ccc: Track last actual argument instance for each option & change X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ba6e323fd66f1e091329e7863281f1a17e18e850;p=clang 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/Arguments.py b/tools/ccc/ccclib/Arguments.py index 5b5dbfec61..486af4f1fb 100644 --- a/tools/ccc/ccclib/Arguments.py +++ b/tools/ccc/ccclib/Arguments.py @@ -111,7 +111,7 @@ class Arg(object): assert opt is not None self.index = index self.opt = opt - + def __repr__(self): return '<%s index=%r opt=%r>' % (self.__class__.__name__, self.index, @@ -239,6 +239,10 @@ class ArgList: def __init__(self, argv): self.argv = list(argv) self.args = [] + self.lastArgs = {} + + def getLastArg(self, option): + return self.lastArgs.get(option) # Support use as a simple arg list. @@ -247,6 +251,7 @@ class ArgList: def append(self, arg): self.args.append(arg) + self.lastArgs[arg.opt] = arg # Forwarding methods. @@ -268,8 +273,198 @@ class OptionParser: self.inputOption = InputOption() self.unknownOption = UnknownOption() + # Driver driver options + self.archOption = self.addOption(SeparateOption('-arch')) + + # Misc driver options + self.addOption(FlagOption('-pass-exit-codes')) + self.addOption(FlagOption('--help')) + self.addOption(FlagOption('--target-help')) + + self.dumpspecsOption = self.addOption(FlagOption('-dumpspecs')) + self.dumpversionOption = self.addOption(FlagOption('-dumpversion')) + self.dumpmachineOption = self.addOption(FlagOption('-dumpmachine')) + self.printSearchDirsOption = self.addOption(FlagOption('-print-search-dirs')) + self.printLibgccFilenameOption = self.addOption(FlagOption('-print-libgcc-file-name')) + # FIXME: Hrm, where does this come from? It isn't always true that + # we take both - and --. For example, gcc --S ... ends up sending + # -fS to cc1. Investigate. + # + # FIXME: Need to implement some form of alias support inside + # getLastOption to handle this. + self.printLibgccFileNameOption2 = self.addOption(FlagOption('--print-libgcc-file-name')) + self.printFileNameOption = self.addOption(JoinedOption('-print-file-name=')) + self.printProgNameOption = self.addOption(JoinedOption('-print-prog-name=')) + self.printProgNameOption2 = self.addOption(JoinedOption('--print-prog-name=')) + self.printMultiDirectoryOption = self.addOption(FlagOption('-print-multi-directory')) + self.printMultiLibOption = self.addOption(FlagOption('-print-multi-lib')) + self.addOption(FlagOption('-print-multi-os-directory')) + + # Hmmm, who really takes this? + self.addOption(FlagOption('--version')) + + # Pipeline control + self.hashHashHashOption = self.addOption(FlagOption('-###')) + self.EOption = self.addOption(FlagOption('-E')) + self.SOption = self.addOption(FlagOption('-S')) + self.cOption = self.addOption(FlagOption('-c')) + self.combineOption = self.addOption(FlagOption('-combine')) + self.noIntegratedCPPOption = self.addOption(FlagOption('-no-integrated-cpp')) + self.pipeOption = self.addOption(FlagOption('-pipe')) + self.saveTempsOption = self.addOption(FlagOption('-save-temps')) + self.saveTempsOption2 = self.addOption(FlagOption('--save-temps')) + self.addOption(JoinedOption('-specs=')) + self.addOption(FlagOption('-time')) + self.addOption(FlagOption('-v')) + + # Input/output stuff + self.oOption = self.addOption(JoinedOrSeparateOption('-o')) + self.xOption = self.addOption(JoinedOrSeparateOption('-x')) + + # FIXME: What do these actually do? The documentation is less than + # clear. + self.addOption(FlagOption('-ObjC')) + self.addOption(FlagOption('-ObjC++')) + + # FIXME: Weird, gcc claims this here in help but I'm not sure why; + # perhaps interaction with preprocessor? Investigate. + self.addOption(JoinedOption('-std=')) + self.addOption(JoinedOrSeparateOption('--sysroot')) + + # Version control + self.addOption(JoinedOrSeparateOption('-B')) + self.addOption(JoinedOrSeparateOption('-V')) + self.addOption(JoinedOrSeparateOption('-b')) + + # Blanket pass-through options. + + self.addOption(JoinedOption('-Wa,')) + self.addOption(SeparateOption('-Xassembler')) + + self.addOption(JoinedOption('-Wp,')) + self.addOption(SeparateOption('-Xpreprocessor')) + + self.addOption(JoinedOption('-Wl,')) + self.addOption(SeparateOption('-Xlinker')) + + #### + # Bring on the random garbage. + + self.addOption(FlagOption('-MD')) + self.addOption(FlagOption('-MP')) + self.addOption(FlagOption('-MM')) + self.addOption(JoinedOrSeparateOption('-MF')) + self.addOption(JoinedOrSeparateOption('-MT')) + self.addOption(FlagOption('-undef')) + + self.addOption(FlagOption('-w')) + self.addOption(JoinedOrSeparateOption('-allowable_client')) + self.addOption(JoinedOrSeparateOption('-client_name')) + self.addOption(JoinedOrSeparateOption('-compatibility_version')) + self.addOption(JoinedOrSeparateOption('-current_version')) + self.addOption(JoinedOrSeparateOption('-exported_symbols_list')) + self.addOption(JoinedOrSeparateOption('-idirafter')) + self.addOption(JoinedOrSeparateOption('-iquote')) + self.addOption(JoinedOrSeparateOption('-isysroot')) + self.addOption(JoinedOrSeparateOption('-keep_private_externs')) + self.addOption(JoinedOrSeparateOption('-seg1addr')) + self.addOption(JoinedOrSeparateOption('-segprot')) + self.addOption(JoinedOrSeparateOption('-sub_library')) + self.addOption(JoinedOrSeparateOption('-sub_umbrella')) + self.addOption(JoinedOrSeparateOption('-umbrella')) + self.addOption(JoinedOrSeparateOption('-undefined')) + self.addOption(JoinedOrSeparateOption('-unexported_symbols_list')) + self.addOption(JoinedOrSeparateOption('-weak_framework')) + self.addOption(JoinedOption('-headerpad_max_install_names')) + self.addOption(FlagOption('-twolevel_namespace')) + self.addOption(FlagOption('-prebind')) + self.addOption(FlagOption('-prebind_all_twolevel_modules')) + self.addOption(FlagOption('-single_module')) + self.addOption(FlagOption('-nomultidefs')) + self.addOption(FlagOption('-nostdlib')) + self.addOption(FlagOption('-nostdinc')) + self.addOption(FlagOption('-static')) + self.addOption(FlagOption('-shared')) + self.addOption(FlagOption('-C')) + self.addOption(FlagOption('-CC')) + self.addOption(FlagOption('-R')) + self.addOption(FlagOption('-P')) + self.addOption(FlagOption('-all_load')) + self.addOption(FlagOption('--constant-cfstrings')) + self.addOption(FlagOption('-traditional')) + self.addOption(FlagOption('--traditional')) + self.addOption(FlagOption('-no_dead_strip_inits_and_terms')) + self.addOption(MultiArgOption('-sectalign', numArgs=3)) + self.addOption(MultiArgOption('-sectcreate', numArgs=3)) + self.addOption(MultiArgOption('-sectorder', numArgs=3)) + + # I dunno why these don't end up working when joined. Maybe + # because of translation? + self.filelistOption = self.addOption(SeparateOption('-filelist')) + self.addOption(SeparateOption('-framework')) + self.addOption(SeparateOption('-install_name')) + self.addOption(SeparateOption('-seg_addr_table')) + self.addOption(SeparateOption('-seg_addr_table_filename')) + + # Where are these coming from? I can't find them... + self.addOption(JoinedOrSeparateOption('-e')) # Gets forwarded to linker + self.addOption(JoinedOrSeparateOption('-r')) + + # Is this actually declared anywhere? I can only find it in a + # spec. :( + self.addOption(FlagOption('-pg')) + + doNotReallySupport = 1 + if doNotReallySupport: + # Archaic gcc option. + self.addOption(FlagOption('-cpp-precomp')) + self.addOption(FlagOption('-no-cpp-precomp')) + + # C options for testing + + self.addOption(JoinedOrSeparateOption('-include')) + self.addOption(JoinedOrSeparateOption('-A')) + self.addOption(JoinedOrSeparateOption('-D')) + self.addOption(JoinedOrSeparateOption('-F')) + self.addOption(JoinedOrSeparateOption('-I')) + self.addOption(JoinedOrSeparateOption('-L')) + self.addOption(JoinedOrSeparateOption('-U')) + self.addOption(JoinedOrSeparateOption('-l')) + self.addOption(JoinedOrSeparateOption('-u')) + + # FIXME: What is going on here? '-X' goes to linker, and -X ... goes nowhere? + self.addOption(FlagOption('-X')) + # Not exactly sure how to decompose this. I split out -Xarch_ + # because we need to recognize that in the driver driver part. + # FIXME: Man, this is lame it needs its own option. + self.XarchOption = self.addOption(JoinedAndSeparateOption('-Xarch_')) + self.addOption(JoinedOption('-X')) + + # The driver needs to know about this flag. + self.syntaxOnlyOption = self.addOption(FlagOption('-fsyntax-only')) + + # FIXME: Wrong? + # FIXME: What to do about the ambiguity of options like + # -dumpspecs? How is this handled in gcc? + self.addOption(JoinedOption('-d')) + self.addOption(JoinedOption('-g')) + self.addOption(JoinedOption('-f')) + self.addOption(JoinedOption('-m')) + self.addOption(JoinedOption('-i')) + self.addOption(JoinedOption('-O')) + self.addOption(JoinedOption('-W')) + # FIXME: Weird. This option isn't really separate, --param=a=b + # works. An alias somewhere? + self.addOption(SeparateOption('--param')) + + # FIXME: What is this? Seems to do something on Linux. I think + # only one is valid, but have a log that uses both. + self.addOption(FlagOption('-pthread')) + self.addOption(FlagOption('-pthreads')) + def addOption(self, opt): self.options.append(opt) + return opt def parseArgs(self, argv): """ @@ -302,194 +497,3 @@ class OptionParser: if arg is not None: return arg return PositionalArg(i, self.unknownOption) - -def createOptionParser(): - op = OptionParser() - - # Driver driver options - op.addOption(SeparateOption('-arch')) - - # Misc driver options - op.addOption(FlagOption('-pass-exit-codes')) - op.addOption(FlagOption('--help')) - op.addOption(FlagOption('--target-help')) - - op.addOption(FlagOption('-dumpspecs')) - op.addOption(FlagOption('-dumpversion')) - op.addOption(FlagOption('-dumpmachine')) - op.addOption(FlagOption('-print-search-dirs')) - op.addOption(FlagOption('-print-libgcc-file-name')) - # FIXME: Hrm, where does this come from? It isn't always true that - # we take both - and --. For example, gcc --S ... ends up sending - # -fS to cc1. Investigate. - op.addOption(FlagOption('--print-libgcc-file-name')) - op.addOption(JoinedOption('-print-file-name=')) - op.addOption(JoinedOption('-print-prog-name=')) - op.addOption(JoinedOption('--print-prog-name=')) - op.addOption(FlagOption('-print-multi-directory')) - op.addOption(FlagOption('-print-multi-lib')) - op.addOption(FlagOption('-print-multi-os-directory')) - - # Hmmm, who really takes this? - op.addOption(FlagOption('--version')) - - # Pipeline control - op.addOption(FlagOption('-###')) - op.addOption(FlagOption('-E')) - op.addOption(FlagOption('-S')) - op.addOption(FlagOption('-c')) - op.addOption(FlagOption('-combine')) - op.addOption(FlagOption('-no-integrated-cpp')) - op.addOption(FlagOption('-pipe')) - op.addOption(FlagOption('-save-temps')) - op.addOption(FlagOption('--save-temps')) - op.addOption(JoinedOption('-specs=')) - op.addOption(FlagOption('-time')) - op.addOption(FlagOption('-v')) - - # Input/output stuff - op.addOption(JoinedOrSeparateOption('-o')) - op.addOption(JoinedOrSeparateOption('-x')) - - # FIXME: What do these actually do? The documentation is less than - # clear. - op.addOption(FlagOption('-ObjC')) - op.addOption(FlagOption('-ObjC++')) - - # FIXME: Weird, gcc claims this here in help but I'm not sure why; - # perhaps interaction with preprocessor? Investigate. - op.addOption(JoinedOption('-std=')) - op.addOption(JoinedOrSeparateOption('--sysroot')) - - # Version control - op.addOption(JoinedOrSeparateOption('-B')) - op.addOption(JoinedOrSeparateOption('-V')) - op.addOption(JoinedOrSeparateOption('-b')) - - # Blanket pass-through options. - - op.addOption(JoinedOption('-Wa,')) - op.addOption(SeparateOption('-Xassembler')) - - op.addOption(JoinedOption('-Wp,')) - op.addOption(SeparateOption('-Xpreprocessor')) - - op.addOption(JoinedOption('-Wl,')) - op.addOption(SeparateOption('-Xlinker')) - - #### - # Bring on the random garbage. - - op.addOption(FlagOption('-MD')) - op.addOption(FlagOption('-MP')) - op.addOption(FlagOption('-MM')) - op.addOption(JoinedOrSeparateOption('-MF')) - op.addOption(JoinedOrSeparateOption('-MT')) - op.addOption(FlagOption('-undef')) - - op.addOption(FlagOption('-w')) - op.addOption(JoinedOrSeparateOption('-allowable_client')) - op.addOption(JoinedOrSeparateOption('-client_name')) - op.addOption(JoinedOrSeparateOption('-compatibility_version')) - op.addOption(JoinedOrSeparateOption('-current_version')) - op.addOption(JoinedOrSeparateOption('-exported_symbols_list')) - op.addOption(JoinedOrSeparateOption('-idirafter')) - op.addOption(JoinedOrSeparateOption('-iquote')) - op.addOption(JoinedOrSeparateOption('-isysroot')) - op.addOption(JoinedOrSeparateOption('-keep_private_externs')) - op.addOption(JoinedOrSeparateOption('-seg1addr')) - op.addOption(JoinedOrSeparateOption('-segprot')) - op.addOption(JoinedOrSeparateOption('-sub_library')) - op.addOption(JoinedOrSeparateOption('-sub_umbrella')) - op.addOption(JoinedOrSeparateOption('-umbrella')) - op.addOption(JoinedOrSeparateOption('-undefined')) - op.addOption(JoinedOrSeparateOption('-unexported_symbols_list')) - op.addOption(JoinedOrSeparateOption('-weak_framework')) - op.addOption(JoinedOption('-headerpad_max_install_names')) - op.addOption(FlagOption('-twolevel_namespace')) - op.addOption(FlagOption('-prebind')) - op.addOption(FlagOption('-prebind_all_twolevel_modules')) - op.addOption(FlagOption('-single_module')) - op.addOption(FlagOption('-nomultidefs')) - op.addOption(FlagOption('-nostdlib')) - op.addOption(FlagOption('-nostdinc')) - op.addOption(FlagOption('-static')) - op.addOption(FlagOption('-shared')) - op.addOption(FlagOption('-C')) - op.addOption(FlagOption('-CC')) - op.addOption(FlagOption('-R')) - op.addOption(FlagOption('-P')) - op.addOption(FlagOption('-all_load')) - op.addOption(FlagOption('--constant-cfstrings')) - op.addOption(FlagOption('-traditional')) - op.addOption(FlagOption('--traditional')) - op.addOption(FlagOption('-no_dead_strip_inits_and_terms')) - op.addOption(MultiArgOption('-sectalign', numArgs=3)) - op.addOption(MultiArgOption('-sectcreate', numArgs=3)) - op.addOption(MultiArgOption('-sectorder', numArgs=3)) - - # I dunno why these don't end up working when joined. Maybe - # because of translation? - op.addOption(SeparateOption('-filelist')) - op.addOption(SeparateOption('-framework')) - op.addOption(SeparateOption('-install_name')) - op.addOption(SeparateOption('-seg_addr_table')) - op.addOption(SeparateOption('-seg_addr_table_filename')) - - # Where are these coming from? I can't find them... - op.addOption(JoinedOrSeparateOption('-e')) # Gets forwarded to linker - op.addOption(JoinedOrSeparateOption('-r')) - - # Is this actually declared anywhere? I can only find it in a - # spec. :( - op.addOption(FlagOption('-pg')) - - doNotReallySupport = 1 - if doNotReallySupport: - # Archaic gcc option. - op.addOption(FlagOption('-cpp-precomp')) - op.addOption(FlagOption('-no-cpp-precomp')) - - # C options for testing - - op.addOption(JoinedOrSeparateOption('-include')) - op.addOption(JoinedOrSeparateOption('-A')) - op.addOption(JoinedOrSeparateOption('-D')) - op.addOption(JoinedOrSeparateOption('-F')) - op.addOption(JoinedOrSeparateOption('-I')) - op.addOption(JoinedOrSeparateOption('-L')) - op.addOption(JoinedOrSeparateOption('-U')) - op.addOption(JoinedOrSeparateOption('-l')) - op.addOption(JoinedOrSeparateOption('-u')) - - # FIXME: What is going on here? '-X' goes to linker, and -X ... goes nowhere? - op.addOption(FlagOption('-X')) - # Not exactly sure how to decompose this. I split out -Xarch_ - # because we need to recognize that in the driver driver part. - # FIXME: Man, this is lame it needs its own option. - op.addOption(JoinedAndSeparateOption('-Xarch_')) - op.addOption(JoinedOption('-X')) - - # The driver needs to know about this flag. - op.addOption(FlagOption('-fsyntax-only')) - - # FIXME: Wrong? - # FIXME: What to do about the ambiguity of options like - # -dumpspecs? How is this handled in gcc? - op.addOption(JoinedOption('-d')) - op.addOption(JoinedOption('-g')) - op.addOption(JoinedOption('-f')) - op.addOption(JoinedOption('-m')) - op.addOption(JoinedOption('-i')) - op.addOption(JoinedOption('-O')) - op.addOption(JoinedOption('-W')) - # FIXME: Weird. This option isn't really separate, --param=a=b - # works. An alias somewhere? - op.addOption(SeparateOption('--param')) - - # FIXME: What is this? Seems to do something on Linux. I think - # only one is valid, but have a log that uses both. - op.addOption(FlagOption('-pthread')) - op.addOption(FlagOption('-pthreads')) - - return op diff --git a/tools/ccc/ccclib/Driver.py b/tools/ccc/ccclib/Driver.py index 0133c34e08..aa617c611e 100644 --- a/tools/ccc/ccclib/Driver.py +++ b/tools/ccc/ccclib/Driver.py @@ -25,7 +25,7 @@ class MissingArgumentError(ValueError): 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 @@ class Driver(object): # 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 @@ class Driver(object): # 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 == '': + 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 @@ class Driver(object): 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 @@ class Driver(object): # 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 @@ class Driver(object): # 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 @@ class Driver(object): 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 == '': + 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 @@ class Driver(object): 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 @@ class Driver(object): 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 @@ class Driver(object): 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) diff --git a/tools/ccc/ccclib/Tools.py b/tools/ccc/ccclib/Tools.py index ddfb02916e..1468fe899c 100644 --- a/tools/ccc/ccclib/Tools.py +++ b/tools/ccc/ccclib/Tools.py @@ -3,7 +3,7 @@ import Jobs import Types class Tool(object): - """Tool - A concrete implementation of a phase.""" + """Tool - A concrete implementation of an action.""" eFlagsPipedInput = 1 << 0 eFlagsPipedOutput = 1 << 1