[cfe-commits] r62149 - in /cfe/trunk/tools/ccc/ccclib: Arguments.py Tools.py
Daniel Dunbar
daniel at zuster.org
Mon Jan 12 21:54:38 PST 2009
Author: ddunbar
Date: Mon Jan 12 23:54:38 2009
New Revision: 62149
URL: http://llvm.org/viewvc/llvm-project?rev=62149&view=rev
Log:
ccc: Add option groups.
- Simple mechanism for group together sets of options so the driver
can efficiently deal with them as a group (i.e., for forwarding -i*
to cc1).
- Use to finish off the major missing pieces of Darwin/CC1 support.
Modified:
cfe/trunk/tools/ccc/ccclib/Arguments.py
cfe/trunk/tools/ccc/ccclib/Tools.py
Modified: cfe/trunk/tools/ccc/ccclib/Arguments.py
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/ccc/ccclib/Arguments.py?rev=62149&r1=62148&r2=62149&view=diff
==============================================================================
--- cfe/trunk/tools/ccc/ccclib/Arguments.py (original)
+++ cfe/trunk/tools/ccc/ccclib/Arguments.py Mon Jan 12 23:54:38 2009
@@ -1,11 +1,25 @@
class Option(object):
- """Root option class."""
+ """Option - Root option class."""
- def __init__(self, name, isLinkerInput=False, noOptAsInput=False):
+ def __init__(self, name, group=None, isLinkerInput=False, noOptAsInput=False):
+ assert group is None or isinstance(group, OptionGroup)
self.name = name
+ self.group = group
self.isLinkerInput = isLinkerInput
self.noOptAsInput = noOptAsInput
+ def matches(self, opt):
+ """matches(opt) -> bool
+
+ Predicate for whether this option is part of the given option
+ (which may be a group)."""
+ if self is opt:
+ return True
+ elif self.group:
+ return self.group.matches(opt)
+ else:
+ return False
+
def accept(self, index, arg, it):
"""accept(index, arg, iterator) -> Arg or None
@@ -20,6 +34,16 @@
return '<%s name=%r>' % (self.__class__.__name__,
self.name)
+class OptionGroup(Option):
+ """OptionGroup - A fake option class used to group options so that
+ the driver can efficiently refer to an entire set of options."""
+
+ def __init__(self, name):
+ super(OptionGroup, self).__init__(name)
+
+ def accept(self, index, arg, it):
+ raise RuntimeError,"accept() should never be called on an OptionGroup"
+
# Dummy options
class InputOption(Option):
@@ -253,6 +277,7 @@
self.argv = list(argv)
self.syntheticArgv = []
self.lastArgs = {}
+ self.lastGroupArgs = {}
self.args = []
def getArgs(self, option):
@@ -262,7 +287,7 @@
# tail). This gives us efficient access to the (first, last,
# all) arg(s) with little overhead.
for arg in self.args:
- if arg.opt is option:
+ if arg.opt.matches(option):
yield arg
def getArgs2(self, optionA, optionB):
@@ -272,14 +297,17 @@
# efficient by iterating both at once and always taking the
# earlier arg.
for arg in self.args:
- if arg.opt in (optionA, optionB):
+ if (arg.opt.matches(optionA) or
+ arg.opt.matches(optionB)):
yield arg
def getArgs3(self, optionA, optionB, optionC):
"""getArgs3 - Iterate over all arguments for three options, in
the order they were specified."""
for arg in self.args:
- if arg.opt in (optionA, optionB, optionC):
+ if (arg.opt.matches(optionA) or
+ arg.opt.matches(optionB) or
+ arg.opt.matches(optionC)):
yield arg
def getLastArg(self, option):
@@ -365,6 +393,8 @@
def append(self, arg):
self.args.append(arg)
self.lastArgs[arg.opt] = arg
+ if arg.opt.group is not None:
+ self.lastArgs[arg.opt.group] = arg
# Forwarding methods.
#
@@ -497,9 +527,14 @@
self.dylinkerOption = self.addOption(FlagOption('-dylinker'))
self.dylinker_install_nameOption = self.addOption(JoinedOrSeparateOption('-dylinker_install_name'))
self.addOption(JoinedOrSeparateOption('-exported_symbols_list'))
- self.addOption(JoinedOrSeparateOption('-idirafter'))
- self.addOption(JoinedOrSeparateOption('-iquote'))
- self.isysrootOption = self.addOption(JoinedOrSeparateOption('-isysroot'))
+
+ self.iGroup = OptionGroup('-i')
+ self.addOption(JoinedOrSeparateOption('-idirafter', self.iGroup))
+ self.addOption(JoinedOrSeparateOption('-iquote', self.iGroup))
+ self.isysrootOption = self.addOption(JoinedOrSeparateOption('-isysroot', self.iGroup))
+ self.addOption(JoinedOrSeparateOption('-include', self.iGroup))
+ self.addOption(JoinedOption('-i', self.iGroup))
+
self.keep_private_externsOption = self.addOption(JoinedOrSeparateOption('-keep_private_externs'))
self.private_bundleOption = self.addOption(FlagOption('-private_bundle'))
self.seg1addrOption = self.addOption(JoinedOrSeparateOption('-seg1addr'))
@@ -612,7 +647,6 @@
# C options for testing
- self.addOption(JoinedOrSeparateOption('-include'))
# FIXME: This is broken, we need -A as a single option to send
# stuff to cc1, but the way the ld spec is constructed it
# wants to see -A options but only as a separate arg.
@@ -646,52 +680,63 @@
# -dumpspecs? How is this handled in gcc?
# FIXME: Naming convention.
self.dOption = self.addOption(FlagOption('-d'))
- self.addOption(JoinedOption('-d'))
- # Take care on extension, the Darwin assembler wants to add a
- # flag for any -g* option.
- self.g3Option = self.addOption(JoinedOption('-g3'))
- self.gOption = self.addOption(JoinedOption('-g'))
-
- self.fastOption = self.addOption(FlagOption('-fast'))
- self.fastfOption = self.addOption(FlagOption('-fastf'))
- self.fastcpOption = self.addOption(FlagOption('-fastcp'))
-
- self.f_appleKextOption = self.addOption(FlagOption('-fapple-kext'))
- self.f_noEliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-fno-eliminate-unused-debug-symbols'))
- self.f_exceptionsOption = self.addOption(FlagOption('-fexceptions'))
- self.f_objcOption = self.addOption(FlagOption('-fobjc'))
- self.f_openmpOption = self.addOption(FlagOption('-fopenmp'))
- self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime'))
- self.f_mudflapOption = self.addOption(FlagOption('-fmudflap'))
- self.f_mudflapthOption = self.addOption(FlagOption('-fmudflapth'))
- self.f_nestedFunctionsOption = self.addOption(FlagOption('-fnested-functions'))
- self.f_pieOption = self.addOption(FlagOption('-fpie'))
- self.f_profileArcsOption = self.addOption(FlagOption('-fprofile-arcs'))
- self.f_profileGenerateOption = self.addOption(FlagOption('-fprofile-generate'))
- self.f_createProfileOption = self.addOption(FlagOption('-fcreate-profile'))
- self.f_traditionalOption = self.addOption(FlagOption('-ftraditional'))
+ # Use a group for this in anticipation of adding more -d
+ # options explicitly. Note that we don't put many -d things in
+ # the -d group (like -dylinker, or '-d' by itself) because it
+ # is really a gcc bug that it ships these to cc1.
+ self.dGroup = OptionGroup('-d')
+ self.addOption(JoinedOption('-d', group=self.dGroup))
+
+ self.gGroup = OptionGroup('-g')
+ self.g3Option = self.addOption(JoinedOption('-g3', self.gGroup))
+ self.gOption = self.addOption(JoinedOption('-g', self.gGroup))
+
+ self.fGroup = OptionGroup('-f')
+ self.fastOption = self.addOption(FlagOption('-fast', self.fGroup))
+ self.fastfOption = self.addOption(FlagOption('-fastf', self.fGroup))
+ self.fastcpOption = self.addOption(FlagOption('-fastcp', self.fGroup))
+
+ self.f_appleKextOption = self.addOption(FlagOption('-fapple-kext', self.fGroup))
+ self.f_noEliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-fno-eliminate-unused-debug-symbols', self.fGroup))
+ self.f_exceptionsOption = self.addOption(FlagOption('-fexceptions', self.fGroup))
+ self.f_objcOption = self.addOption(FlagOption('-fobjc', self.fGroup))
+ self.f_openmpOption = self.addOption(FlagOption('-fopenmp', self.fGroup))
+ self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup))
+ self.f_mudflapOption = self.addOption(FlagOption('-fmudflap', self.fGroup))
+ self.f_mudflapthOption = self.addOption(FlagOption('-fmudflapth', self.fGroup))
+ self.f_nestedFunctionsOption = self.addOption(FlagOption('-fnested-functions', self.fGroup))
+ self.f_pieOption = self.addOption(FlagOption('-fpie', self.fGroup))
+ self.f_profileArcsOption = self.addOption(FlagOption('-fprofile-arcs', self.fGroup))
+ self.f_profileGenerateOption = self.addOption(FlagOption('-fprofile-generate', self.fGroup))
+ self.f_createProfileOption = self.addOption(FlagOption('-fcreate-profile', self.fGroup))
+ self.f_traditionalOption = self.addOption(FlagOption('-ftraditional', self.fGroup))
self.coverageOption = self.addOption(FlagOption('-coverage'))
self.coverageOption2 = self.addOption(FlagOption('--coverage'))
self.addOption(JoinedOption('-f'))
- self.m_32Option = self.addOption(FlagOption('-m32'))
- self.m_64Option = self.addOption(FlagOption('-m64'))
- self.m_dynamicNoPicOption = self.addOption(JoinedOption('-mdynamic-no-pic'))
- self.m_iphoneosVersionMinOption = self.addOption(JoinedOption('-miphoneos-version-min='))
- self.m_macosxVersionMinOption = self.addOption(JoinedOption('-mmacosx-version-min='))
- self.m_kernelOption = self.addOption(FlagOption('-mkernel'))
+ self.mGroup = OptionGroup('-m')
+ self.m_32Option = self.addOption(FlagOption('-m32', self.mGroup))
+ self.m_64Option = self.addOption(FlagOption('-m64', self.mGroup))
+ self.m_dynamicNoPicOption = self.addOption(JoinedOption('-mdynamic-no-pic', self.mGroup))
+ self.m_iphoneosVersionMinOption = self.addOption(JoinedOption('-miphoneos-version-min=', self.mGroup))
+ self.m_kernelOption = self.addOption(FlagOption('-mkernel', self.mGroup))
+ self.m_macosxVersionMinOption = self.addOption(JoinedOption('-mmacosx-version-min=', self.mGroup))
+ self.m_tuneOption = self.addOption(JoinedOption('-mtune=', self.mGroup))
# Ugh. Need to disambiguate our naming convetion. -m x goes to
# the linker sometimes, wheres -mxxxx is used for a variety of
# other things.
self.mOption = self.addOption(SeparateOption('-m'))
- self.addOption(JoinedOption('-m'))
+ self.addOption(JoinedOption('-m', self.mGroup))
+
+ # FIXME: Why does Darwin send -a* to cc1?
+ self.aGroup = OptionGroup('-a')
+ self.ansiOption = self.addOption(FlagOption('-ansi', self.aGroup))
+ self.aOption = self.addOption(JoinedOption('-a', self.aGroup))
- self.ansiOption = self.addOption(FlagOption('-ansi'))
self.trigraphsOption = self.addOption(FlagOption('-trigraphs'))
self.pedanticOption = self.addOption(FlagOption('-pedantic'))
- self.addOption(JoinedOption('-i'))
self.OOption = self.addOption(JoinedOption('-O'))
self.WOption = self.addOption(JoinedOption('-W'))
# FIXME: Weird. This option isn't really separate, --param=a=b
Modified: cfe/trunk/tools/ccc/ccclib/Tools.py
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/ccc/ccclib/Tools.py?rev=62149&r1=62148&r2=62149&view=diff
==============================================================================
--- cfe/trunk/tools/ccc/ccclib/Tools.py (original)
+++ cfe/trunk/tools/ccc/ccclib/Tools.py Mon Jan 12 23:54:38 2009
@@ -115,8 +115,7 @@
cmd_args = []
- if (arglist.getLastArg(arglist.parser.gOption) or
- arglist.getLastArg(arglist.parser.g3Option)):
+ if arglist.getLastArg(arglist.parser.gGroup):
cmd_args.append('--gstabs')
# Derived from asm spec.
@@ -332,7 +331,7 @@
arglist.parser.UOption,
arglist.parser.AOption)
- # FIXME: Add i*
+ arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
for input in inputs:
if isinstance(input.source, Jobs.PipedJob):
@@ -383,24 +382,24 @@
cmd_args.append('-dumpbase')
cmd_args.append(self.getBaseInputName(inputs, arglist))
- # FIXME: d*
+ arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
# FIXME: Figure out where these are coming from and
# dehardcode.
- arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
- if arg:
- cmd_args.extend(arglist.render(arg))
- else:
+ if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
cmd_args.append('-mmacosx-version-min=' +
self.toolChain.getMacosxVersionMin())
- if arglist.getValue(arch) == 'x86_64':
- cmd_args.append('-m64')
- else:
- cmd_args.append('-m32')
- cmd_args.append('-mtune=core2')
+ if (not arglist.getLastArg(arglist.parser.m_32Option) and
+ not arglist.getLastArg(arglist.parser.m_64Option)):
+ if arglist.getValue(arch) == 'x86_64':
+ cmd_args.append('-m64')
+ else:
+ cmd_args.append('-m32')
+ if not arglist.getLastArg(arglist.parser.m_tuneOption):
+ cmd_args.append('-mtune=core2')
- # FIXME: m*
- # FIXME: a*
+ arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
+ arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
# FIXME: The goal is to use the user provided -o if that is
# our final output, otherwise to drive from the original input
@@ -418,7 +417,7 @@
cmd_args.append('-auxbase')
cmd_args.append(self.getBaseInputStem(inputs, arglist))
- # FIXME: g*
+ arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
arglist.addAllArgs(cmd_args, arglist.parser.OOption)
# FIXME: -Wall is getting some special treatment. Investigate.
@@ -431,7 +430,9 @@
cmd_args.append('-p')
arglist.addLastArg(cmd_args, arglist.parser.pOption)
- # FIXME: f*
+ # ccc treats -fsyntax-only specially.
+ arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
+ arglist.parser.syntaxOnlyOption)
arglist.addLastArg(cmd_args, arglist.parser.undefOption)
if arglist.getLastArg(arglist.parser.QnOption):
More information about the cfe-commits
mailing list