From 49c6748bdd10876e0b02fa9c5123473bf0058cbb Mon Sep 17 00:00:00 2001
From: Wei Pan <wei.pan@intel.com>
Date: Thu, 25 Oct 2012 12:13:19 -0400
Subject: [PATCH] Support -fcilkplus option

- Add gcc-compatible flag -fcilkplus to enable Cilk Plus extensions
- Add gcc-compatible flag -fno-cilkplus to disable Cilk Plus extensions
---
 include/clang/Basic/LangOptions.def |    2 ++
 include/clang/Driver/Options.td     |    3 +++
 lib/Driver/Tools.cpp                |    3 +++
 lib/Frontend/CompilerInvocation.cpp |    1 +
 test/Driver/clang_f_opts.c          |    9 +++++++++
 5 files changed, 18 insertions(+)

diff --git a/include/clang/Basic/LangOptions.def b/include/clang/Basic/LangOptions.def
index 20e4ca8..dd4d3e8 100644
--- a/include/clang/Basic/LangOptions.def
+++ b/include/clang/Basic/LangOptions.def
@@ -170,6 +170,8 @@ BENIGN_LANGOPT(EmitMicrosoftInlineAsm , 1, 0,
 
 BENIGN_LANGOPT(RetainCommentsFromSystemHeaders, 1, 0, "retain documentation comments from system headers in the AST")
 
+LANGOPT(CilkPlus, 1, 0, "Intel Cilk Plus extensions to C/C++")
+
 #undef LANGOPT
 #undef VALUE_LANGOPT
 #undef BENIGN_LANGOPT
diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td
index 3c39eb6..1024bda 100644
--- a/include/clang/Driver/Options.td
+++ b/include/clang/Driver/Options.td
@@ -587,6 +587,9 @@ def fobjc_sender_dependent_dispatch : Flag<["-"], "fobjc-sender-dependent-dispat
 def fobjc : Flag<["-"], "fobjc">, Group<f_Group>;
 def fomit_frame_pointer : Flag<["-"], "fomit-frame-pointer">, Group<f_Group>;
 def fopenmp : Flag<["-"], "fopenmp">, Group<f_Group>;
+def fcilkplus : Flag<["-"], "fcilkplus">, Group<f_Group>, Flags<[CC1Option]>,
+  HelpText<"Enable Cilk Plus extensions">;
+def fno_cilkplus : Flag<["-"], "fno-cilkplus">, Group<f_Group>;
 def fno_optimize_sibling_calls : Flag<["-"], "fno-optimize-sibling-calls">, Group<f_Group>;
 def foptimize_sibling_calls : Flag<["-"], "foptimize-sibling-calls">, Group<f_Group>;
 def force__cpusubtype__ALL : Flag<["-"], "force_cpusubtype_ALL">;
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index d85bc4a..2cd5d70 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -2603,6 +2603,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
                    options::OPT_fno_borland_extensions, false))
     CmdArgs.push_back("-fborland-extensions");
 
+  if (Args.hasFlag(options::OPT_fcilkplus, options::OPT_fno_cilkplus, false))
+    CmdArgs.push_back("-fcilkplus");
+
   // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
   // needs it.
   if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index 59133da..cdcdfa3 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -1171,6 +1171,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
   Opts.MicrosoftMode = Args.hasArg(OPT_fms_compatibility);
   Opts.MSCVersion = Args.getLastArgIntValue(OPT_fmsc_version, 0, Diags);
   Opts.Borland = Args.hasArg(OPT_fborland_extensions);
+  Opts.CilkPlus = Args.hasArg(OPT_fcilkplus);
   Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
   Opts.ConstStrings = Args.hasFlag(OPT_fconst_strings, OPT_fno_const_strings,
                                    Opts.ConstStrings);
diff --git a/test/Driver/clang_f_opts.c b/test/Driver/clang_f_opts.c
index 0ee7d2d..e775168 100644
--- a/test/Driver/clang_f_opts.c
+++ b/test/Driver/clang_f_opts.c
@@ -38,3 +38,12 @@
 
 // RUN: %clang -fms-extensions -fenable-experimental-ms-inline-asm %s -### 2>&1 | FileCheck -check-prefix=CHECK-OPTIONS3 %s
 // CHECK-OPTIONS3: -fenable-experimental-ms-inline-asm
+//
+// RUN: %clang %s -### 2>&1                          | FileCheck -check-prefix=CHECK-CILK1 %s
+// RUN: %clang %s -### 2>&1 -fcilkplus               | FileCheck -check-prefix=CHECK-CILK2 %s
+// RUN: %clang %s -### 2>&1 -fcilkplus -fno-cilkplus | FileCheck -check-prefix=CHECK-CILK3 %s
+// RUN: %clang %s -### 2>&1 -fno-cilkplus -fcilkplus | FileCheck -check-prefix=CHECK-CILK4 %s
+// CHECK-CILK1-NOT: -fcilkplus
+// CHECK-CILK2:     -fcilkplus
+// CHECK-CILK3-NOT: -fcilkplus
+// CHECK-CILK4:     -fcilkplus
-- 
1.7.9.5

