[cfe-commits] [PATCH] First OpenMP patch

Mahesha HS mahesha.llvm at gmail.com
Wed Nov 21 08:02:09 PST 2012


Hi Ben,

Though -fopenmp and -fno-openmp are mutually exclusive options,
underlying functionality, that we intended to implement differ a
little. In a nutshell, we, sometime back discussed in CFE DEV list to
implement OpenMP as follows. We thought that passing neither -fopenmp
nor -fno-openmp  is not same as passing only -fno-openmp.  Following
is the intended implementation. This forced me to add two lang options
as I could not handle it using only one lang option. If this was not
there, I guess, all your comments would not have araised.

if (source contains OpenMP statements) {
     if (neither -fopenmp nor -fno-openmp present) {
         Throw warning.
     }
     else if (only -fopenmp present) {
         Process OpenMP
     }
     else if (only -fno-openmp) {
        Silently ignore OpenMP. Do not throw warning.
     }
    else if (both -fopenmp and -fno-openmp are present) {
        Decide based on which one appears later in the command line.
    }
}

--
mahesha


On Wed, Nov 21, 2012 at 8:28 PM, Benjamin Kramer <benny.kra at gmail.com> wrote:
>
> On 21.11.2012, at 15:36, Mahesha HS <mahesha.llvm at gmail.com> wrote:
>
>> Hi all,
>>
>> Here is the first OpenMP patch.
>>
>> It supports options -fopenmp and -fno-openmp. When only -fopenmp is
>> passed, OpenMP is enabled. When only -fno-openmp is passed, OpenMP is
>> disabled. When both the options are passed, the one which appear later
>> in the command line wins.
>>
>> I am re-sending this patch third time. I am positively hoping that -
>> this time - this patch will get checked-in into trunk :)
>
>
>> Index: include/clang/Driver/Options.td
>> ===================================================================
>> --- include/clang/Driver/Options.td   (revision 168426)
>> +++ include/clang/Driver/Options.td   (working copy)
>> @@ -590,7 +590,8 @@
>>  def fobjc_sender_dependent_dispatch : Flag<["-"], "fobjc-sender-dependent-dispatch">, Group<f_Group>;
>>  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 fopenmp : Flag<["-"], "fopenmp">, Group<f_Group>, Flags<[CC1Option]>;
>> +def fno_openmp : Flag<["-"], "fno-openmp">, Group<f_Group>, Flags<[CC1Option]>;
>>  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">;
>> Index: include/clang/Basic/LangOptions.def
>> ===================================================================
>> --- include/clang/Basic/LangOptions.def       (revision 168426)
>> +++ include/clang/Basic/LangOptions.def       (working copy)
>> @@ -168,6 +168,10 @@
>>
>>  BENIGN_LANGOPT(RetainCommentsFromSystemHeaders, 1, 0, "retain documentation comments from system headers in the AST")
>>
>> +/// OpenMP
>> +LANGOPT(OpenMP, 1, 0, "Enables OpenMP support.")
>> +LANGOPT(NoOpenMP, 1, 0, "Disables OpenMP support.")
>> +
>
> Why do you need two lang options for a binary flag? They are mutually exclusive, no need for the negative form.
>
>>  /// Runtime sanitizers.
>>  #define SANITIZER(NAME, ID) \
>>  BENIGN_LANGOPT(Sanitize##ID, 1, 0, NAME " sanitizer")
>> Index: lib/Driver/Tools.cpp
>> ===================================================================
>> --- lib/Driver/Tools.cpp      (revision 168426)
>> +++ lib/Driver/Tools.cpp      (working copy)
>> @@ -2504,6 +2504,16 @@
>>
>>    Args.AddLastArg(CmdArgs, options::OPT_pthread);
>>
>> +  // When both -fopenmp and -fno-openmp options are present,
>> +  // later one wins.
>> +  if (Arg *A = Args.getLastArg(options::OPT_fopenmp,
>> +                               options::OPT_fno_openmp)) {
>> +    if (A->getOption().matches(options::OPT_fopenmp)) {
>> +      CmdArgs.push_back("-fopenmp");
>> +    } else {
>> +      CmdArgs.push_back("-fno-openmp");
>> +    }
>> +  }
>
> One of those two should be the default and the corresponding branch could be dropped.
>
>>
>>    // -stack-protector=0 is default.
>>    unsigned StackProtectorLevel = 0;
>> Index: lib/Frontend/CompilerInvocation.cpp
>> ===================================================================
>> --- lib/Frontend/CompilerInvocation.cpp       (revision 168426)
>> +++ lib/Frontend/CompilerInvocation.cpp       (working copy)
>> @@ -1239,6 +1239,11 @@
>>    Opts.ApplePragmaPack = Args.hasArg(OPT_fapple_pragma_pack);
>>    Opts.CurrentModule = Args.getLastArgValue(OPT_fmodule_name);
>>
>> +  // If -fopenmp enablement fails, then check, if -fno-openmp is need to be
>> +  // enabled.
>> +  if (!(Opts.OpenMP = Args.hasFlag(OPT_fopenmp, OPT_fno_openmp, false)))
>> +    Opts.NoOpenMP = Args.hasFlag(OPT_fno_openmp, OPT_fopenmp, false);
>> +
>
> Could be simplified if there is only one LangOption.
>
> - Ben
>
>>    // Record whether the __DEPRECATED define was requested.
>>    Opts.Deprecated = Args.hasFlag(OPT_fdeprecated_macro,
>>                                   OPT_fno_deprecated_macro,
>> Index: test/Driver/openmp-options.c
>> ===================================================================
>> --- test/Driver/openmp-options.c      (revision 0)
>> +++ test/Driver/openmp-options.c      (revision 0)
>> @@ -0,0 +1,14 @@
>> +// Neither -fopenmp nor -fno-openmp is passed.
>> +// RUN: %clang -### -S -o %t %s  2>&1 | not grep -w -- -fopenmp && not grep -w -- -fno-openmp
>> +
>> +// Only -fopenmp is passed.
>> +// RUN: %clang -### -S -o %t %s -fopenmp  2>&1 | grep -w -- -fopenmp && not grep -w -- -fno-openmp
>> +
>> +// Both -fopenmp and -fno-openmp are passed. But, -fopenmp wins as it appears after -fno-openmp.
>> +// RUN: %clang -### -S -o %t %s -fno-openmp -fopenmp  2>&1 | grep -w -- -fopenmp && not grep -w -- -fno-openmp
>> +
>> +// Only -fno-openmp is passed.
>> +// RUN: %clang -### -S -o %t %s -fno-openmp  2>&1 | grep -w -- -fno-openmp && not grep -w -- -fopenmp
>> +
>> +// Both -fopenmp and -fno-openmp are passed. But, -fno-openmp wins as it appears after -fopenmp.
>> +// RUN: %clang -### -S -o %t %s -fopenmp -fno-openmp  2>&1 | grep -w -- -fno-openmp && not grep -w -- -fopenmp
>
>
>
>



-- 
mahesha



More information about the cfe-commits mailing list