arg.opt.matches(optionC)):
yield arg
- def getLastArg(self, option):
- return self.lastArgs.get(option)
+ def getLastArgAndPosition(self, option):
+ return self.lastArgs.get(option, (None,-1))
+ def getLastArg(self, option):
+ return self.getLastArgAndPosition(option)[0]
+
+ def hasFFlag(self, option, negativeOption, default):
+ """hasFFlag - Given an option and its corresponding negative
+ option, return True if the option is present, False if the
+ negation is present, and default if neither option is
+ given. If both the option and its negation are present, the
+ last one wins.
+ """
+ arg,argPos = self.getLastArgAndPosition(option)
+ neg,negPos = self.getLastArgAndPosition(negativeOption)
+ if arg and neg:
+ return negPos < argPos
+ elif arg:
+ return True
+ elif neg:
+ return False
+ else:
+ return default
+
def getInputString(self, index, offset=0):
# Source 0 is argv.
if index.sourceId == 0:
opt = arg.opt
if opt.alias:
opt = opt.alias
- self.lastArgs[opt] = arg
+ self.lastArgs[opt] = (arg, len(self.args) - 1)
if opt.group is not None:
- self.lastArgs[opt.group] = arg
+ self.lastArgs[opt.group] = (arg, len(self.args) - 1)
# Forwarding methods.
#
self.f_indirectVirtualCallsOption = self.addOption(FlagOption('-findirect-virtual-calls', self.fGroup))
self.f_laxVectorConversionsOption = self.addOption(FlagOption('-flax-vector-conversions', self.Clang_fGroup))
self.f_limitedPrecisionOption = self.addOption(JoinedOption('-flimited-precision=', self.fGroup))
+ self.f_mathErrnoOption = self.addOption(FlagOption('-fmath-errno', self.fGroup))
+ self.f_noMathErrnoOption = self.addOption(FlagOption('-fno-math-errno', self.fGroup))
self.f_msExtensionsOption = self.addOption(FlagOption('-fms-extensions', self.Clang_fGroup))
self.f_mudflapOption = self.addOption(FlagOption('-fmudflap', self.fGroup))
self.f_mudflapthOption = self.addOption(FlagOption('-fmudflapth', self.fGroup))
return True
+ def isMathErrnoDefault(self):
+ return True
+
class Darwin_X86_ToolChain(ToolChain):
def __init__(self, driver, darwinVersion, gccVersion, archName):
super(Darwin_X86_ToolChain, self).__init__(driver)
return al
+ def isMathErrnoDefault(self):
+ return False
+
class Generic_GCC_ToolChain(ToolChain):
"""Generic_GCC_ToolChain - A tool chain using the 'gcc' command to
perform all subcommands; this relies on gcc translating the
if arglist.getLastArg(arglist.parser.f_unwindTablesOption):
cmd_args.append('--unwind-tables')
+ if arglist.hasFFlag(arglist.parser.f_mathErrnoOption,
+ arglist.parser.f_noMathErrnoOption,
+ self.toolChain.isMathErrnoDefault()):
+ cmd_args.append('--fmath-errno=1')
+ else:
+ cmd_args.append('--fmath-errno=0')
+
arg = arglist.getLastArg(arglist.parser.f_limitedPrecisionOption)
if arg:
cmd_args.append('--limit-float-precision')
--- /dev/null
+// RUN: xcc -ccc-host-system unknown -### %s -S 2>&1 | grep -- "--fmath-errno=1" | count 1 &&
+// RUN: xcc -ccc-host-system unknown -### %s -S -fno-math-errno 2>&1 | grep -- "--fmath-errno=0" | count 1 &&
+// RUN: xcc -ccc-host-system unknown -### %s -S -fmath-errno -fno-math-errno 2>&1 | grep -- "--fmath-errno=0" | count 1 &&
+// RUN: xcc -ccc-host-bits 32 -ccc-host-machine i386 -ccc-host-system darwin -ccc-host-release 10.5.0 -### %s -S 2>&1 | grep -- "--fmath-errno=0" | count 1 &&
+// RUN: xcc -ccc-host-bits 32 -ccc-host-machine i386 -ccc-host-system darwin -ccc-host-release 10.5.0 -### %s -S -fmath-errno 2>&1 | grep -- "--fmath-errno=1" | count 1