ccc: Darwin/X86: Implement remainder of (non -Z...) generic argument
translation.
 - As is my general strategy, this is initially pedantically
   compatible with gcc and can be cleaned up later. So, for example,
   we still pass -static to collect2 4 times if you say '-mkernel
   -fapple-kext'. ;)


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62353 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/ccc/ccclib/ToolChain.py b/tools/ccc/ccclib/ToolChain.py
index 8511328..7ca1257 100644
--- a/tools/ccc/ccclib/ToolChain.py
+++ b/tools/ccc/ccclib/ToolChain.py
@@ -95,12 +95,46 @@
         if not arch:
             return args
 
+        # FIXME: We really want to get out of the tool chain level
+        # argument translation business, as it makes the driver
+        # functionality much more opaque. For now, we follow gcc
+        # closely solely for the purpose of easily achieving feature
+        # parity & testability. Once we have something that works, we
+        # should reevaluate each translation and try to push it down
+        # into tool specific logic.
+
         al = Arguments.DerivedArgList(args)
         if not args.getLastArg(args.parser.m_macosxVersionMinOption):
             al.append(al.makeJoinedArg(self.getMacosxVersionMin(),
                                        args.parser.m_macosxVersionMinOption))
         for arg in args:
-            if arg.opt is args.parser.f_constantCfstringsOption:
+            # Sob. These is strictly gcc compatible for the time
+            # being. Apple gcc translates options twice, which means
+            # that self-expanding options add duplicates.
+            if arg.opt is args.parser.m_kernelOption:
+                al.append(arg)
+                al.append(al.makeFlagArg(args.parser.staticOption))
+                al.append(al.makeFlagArg(args.parser.staticOption))
+            elif arg.opt is args.parser.dependencyFileOption:
+                al.append(al.makeSeparateArg(args.getValue(arg),
+                                             args.parser.MFOption))
+            elif arg.opt is args.parser.gfullOption:
+                al.append(al.makeFlagArg(args.parser.gOption))
+                al.append(al.makeFlagArg(args.parser.f_noEliminateUnusedDebugSymbolsOption))
+            elif arg.opt is args.parser.gusedOption:
+                al.append(al.makeFlagArg(args.parser.gOption))
+                al.append(al.makeFlagArg(args.parser.f_eliminateUnusedDebugSymbolsOption))
+            elif arg.opt is args.parser.f_appleKextOption:
+                al.append(arg)
+                al.append(al.makeFlagArg(args.parser.staticOption))
+                al.append(al.makeFlagArg(args.parser.staticOption))
+            elif arg.opt is args.parser.f_terminatedVtablesOption:
+                al.append(al.makeFlagArg(args.parser.f_appleKextOption))
+                al.append(al.makeFlagArg(args.parser.staticOption))
+            elif arg.opt is args.parser.f_indirectVirtualCallsOption:
+                al.append(al.makeFlagArg(args.parser.f_appleKextOption))
+                al.append(al.makeFlagArg(args.parser.staticOption))
+            elif arg.opt is args.parser.f_constantCfstringsOption:
                 al.append(al.makeFlagArg(args.parser.m_constantCfstringsOption))
             elif arg.opt is args.parser.f_noConstantCfstringsOption:
                 al.append(al.makeFlagArg(args.parser.m_noConstantCfstringsOption))