summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/tools/ccc/ccclib/Arguments.py31
-rw-r--r--clang/tools/ccc/ccclib/ToolChain.py6
-rw-r--r--clang/tools/ccc/ccclib/Tools.py7
-rw-r--r--clang/tools/ccc/test/ccc/math-errno.c5
4 files changed, 45 insertions, 4 deletions
diff --git a/clang/tools/ccc/ccclib/Arguments.py b/clang/tools/ccc/ccclib/Arguments.py
index 5d20feaae1c..6cda01ba340 100644
--- a/clang/tools/ccc/ccclib/Arguments.py
+++ b/clang/tools/ccc/ccclib/Arguments.py
@@ -364,9 +364,30 @@ class ArgList(object):
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:
@@ -457,9 +478,9 @@ class ArgList(object):
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.
#
@@ -793,6 +814,8 @@ class OptionParser:
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))
diff --git a/clang/tools/ccc/ccclib/ToolChain.py b/clang/tools/ccc/ccclib/ToolChain.py
index 2fd500ce18e..f2f22a064d5 100644
--- a/clang/tools/ccc/ccclib/ToolChain.py
+++ b/clang/tools/ccc/ccclib/ToolChain.py
@@ -76,6 +76,9 @@ class ToolChain(object):
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)
@@ -224,6 +227,9 @@ class Darwin_X86_ToolChain(ToolChain):
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
diff --git a/clang/tools/ccc/ccclib/Tools.py b/clang/tools/ccc/ccclib/Tools.py
index d3ba30e8bd4..5da2de28f91 100644
--- a/clang/tools/ccc/ccclib/Tools.py
+++ b/clang/tools/ccc/ccclib/Tools.py
@@ -280,6 +280,13 @@ class Clang_CompileTool(Tool):
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')
diff --git a/clang/tools/ccc/test/ccc/math-errno.c b/clang/tools/ccc/test/ccc/math-errno.c
new file mode 100644
index 00000000000..4f440a34380
--- /dev/null
+++ b/clang/tools/ccc/test/ccc/math-errno.c
@@ -0,0 +1,5 @@
+// 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
OpenPOWER on IntegriCloud