On Mon, Feb 12, 2018 at 3:35 PM, David Blaikie <dblai...@gmail.com> wrote:

>
>
> On Mon, Feb 12, 2018 at 2:25 PM Eric Fiselier <e...@efcs.ca> wrote:
>
>> On Mon, Feb 12, 2018 at 9:15 AM, David Blaikie <dblai...@gmail.com>
>> wrote:
>>
>>>
>>>
>>> On Wed, Feb 7, 2018 at 10:38 AM Eric Fiselier via cfe-commits <
>>> cfe-commits@lists.llvm.org> wrote:
>>>
>>>> Author: ericwf
>>>> Date: Wed Feb  7 10:36:51 2018
>>>> New Revision: 324498
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=324498&view=rev
>>>> Log:
>>>> [Driver] Add option to manually control discarding value names in LLVM
>>>> IR.
>>>>
>>>> Summary:
>>>> Currently, assertion-disabled Clang builds emit value names when
>>>> generating LLVM IR. This is controlled by the `NDEBUG` macro, and is not
>>>> easily overridable. In order to get IR output containing names from a
>>>> release build of Clang, the user must manually construct the CC1 invocation
>>>> w/o the `-discard-value-names` option. This is less than ideal.
>>>>
>>>> For example, Godbolt uses a release build of Clang, and so when asked
>>>> to emit LLVM IR the result lacks names, making it harder to read. Manually
>>>> invoking CC1 on Compiler Explorer is not feasible.
>>>>
>>>
>>> It wouldn't necessarily have to invoke CC1, it could use "-Xclang
>>> -discard-value-names".
>>>
>>
>> If you were using an assertion build, and wanted to disable value names,
>> then yes -- that would work. However it's the opposite case that is of
>> interest:
>> When you're using a non-assertion build and want to keep value names. In
>> that case invoking CC1 directly is required; otherwise the driver would pass
>> "-discard-value-names".
>>
>
> Ah, thanks for explaining!
>
>
>>
>>
>>>
>>>
>>>>
>>>> This patch adds the driver options `-fdiscard-value-names` and
>>>> `-fno-discard-value-names` which allow the user to override the default
>>>> behavior. If neither is specified, the old behavior remains.
>>>>
>>>> Reviewers: erichkeane, aaron.ballman, lebedev.ri
>>>>
>>>> Reviewed By: aaron.ballman
>>>>
>>>> Subscribers: bogner, cfe-commits
>>>>
>>>> Differential Revision: https://reviews.llvm.org/D42887
>>>>
>>>> Modified:
>>>>     cfe/trunk/docs/UsersManual.rst
>>>>     cfe/trunk/include/clang/Driver/Options.td
>>>>     cfe/trunk/lib/Driver/ToolChains/Clang.cpp
>>>>     cfe/trunk/test/Driver/clang_f_opts.c
>>>>
>>>> Modified: cfe/trunk/docs/UsersManual.rst
>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/
>>>> UsersManual.rst?rev=324498&r1=324497&r2=324498&view=diff
>>>> ============================================================
>>>> ==================
>>>> --- cfe/trunk/docs/UsersManual.rst (original)
>>>> +++ cfe/trunk/docs/UsersManual.rst Wed Feb  7 10:36:51 2018
>>>> @@ -1855,6 +1855,27 @@ features. You can "tune" the debug info
>>>>    must come first.)
>>>>
>>>>
>>>> +Controlling LLVM IR Output
>>>> +--------------------------
>>>> +
>>>> +Controlling Value Names in LLVM IR
>>>> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>> +
>>>> +Emitting value names in LLVM IR increases the size and verbosity of
>>>> the IR.
>>>> +By default, value names are only emitted in assertion-enabled builds
>>>> of Clang.
>>>> +However, when reading IR it can be useful to re-enable the emission of
>>>> value
>>>> +names to improve readability.
>>>> +
>>>> +.. option:: -fdiscard-value-names
>>>> +
>>>> +  Discard value names when generating LLVM IR.
>>>> +
>>>> +.. option:: -fno-discard-value-names
>>>> +
>>>> +  Do not discard value names when generating LLVM IR. This option can
>>>> be used
>>>> +  to re-enable names for release builds of Clang.
>>>> +
>>>> +
>>>>  Comment Parsing Options
>>>>  -----------------------
>>>>
>>>>
>>>> Modified: cfe/trunk/include/clang/Driver/Options.td
>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
>>>> clang/Driver/Options.td?rev=324498&r1=324497&r2=324498&view=diff
>>>> ============================================================
>>>> ==================
>>>> --- cfe/trunk/include/clang/Driver/Options.td (original)
>>>> +++ cfe/trunk/include/clang/Driver/Options.td Wed Feb  7 10:36:51 2018
>>>> @@ -790,6 +790,10 @@ def fdiagnostics_show_template_tree : Fl
>>>>      HelpText<"Print a template comparison tree for differing
>>>> templates">;
>>>>  def fdeclspec : Flag<["-"], "fdeclspec">, Group<f_clang_Group>,
>>>>    HelpText<"Allow __declspec as a keyword">, Flags<[CC1Option]>;
>>>> +def fdiscard_value_names : Flag<["-"], "fdiscard-value-names">,
>>>> Group<f_clang_Group>,
>>>> +  HelpText<"Discard value names in LLVM IR">, Flags<[DriverOption]>;
>>>> +def fno_discard_value_names : Flag<["-"], "fno-discard-value-names">,
>>>> Group<f_clang_Group>,
>>>> +  HelpText<"Do not discard value names in LLVM IR">,
>>>> Flags<[DriverOption]>;
>>>>  def fdollars_in_identifiers : Flag<["-"], "fdollars-in-identifiers">,
>>>> Group<f_Group>,
>>>>    HelpText<"Allow '$' in identifiers">, Flags<[CC1Option]>;
>>>>  def fdwarf2_cfi_asm : Flag<["-"], "fdwarf2-cfi-asm">,
>>>> Group<clang_ignored_f_Group>;
>>>>
>>>> Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp
>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/
>>>> ToolChains/Clang.cpp?rev=324498&r1=324497&r2=324498&view=diff
>>>> ============================================================
>>>> ==================
>>>> --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original)
>>>> +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Wed Feb  7 10:36:51 2018
>>>> @@ -3266,13 +3266,24 @@ void Clang::ConstructJob(Compilation &C,
>>>>    if (!C.isForDiagnostics())
>>>>      CmdArgs.push_back("-disable-free");
>>>>
>>>> -// Disable the verification pass in -asserts builds.
>>>>  #ifdef NDEBUG
>>>> -  CmdArgs.push_back("-disable-llvm-verifier");
>>>> -  // Discard LLVM value names in -asserts builds.
>>>> -  CmdArgs.push_back("-discard-value-names");
>>>> +  const bool IsAssertBuild = false;
>>>> +#else
>>>> +  const bool IsAssertBuild = true;
>>>>  #endif
>>>>
>>>> +  // Disable the verification pass in -asserts builds.
>>>> +  if (!IsAssertBuild)
>>>> +    CmdArgs.push_back("disable-llvm-verifier");
>>>> +
>>>> +  // Discard value names in assert builds unless otherwise specified.
>>>> +  if (const Arg *A = Args.getLastArg(options::OPT_
>>>> fdiscard_value_names,
>>>> +                                     
>>>> options::OPT_fno_discard_value_names))
>>>> {
>>>> +    if (A->getOption().matches(options::OPT_fdiscard_value_names))
>>>>
>>>
>>> Should this ^ be:
>>>
>>>   if (Args.hasFlag(options::OPT_fdiscard_value_names,
>>> options::OPT_fno_discard_value_names, false))
>>>
>>
>> Yeah, that looks better, but perhaps this would be even cleaner:
>>
>> if (Args.hasFlag(options::OPT_fdiscard_value_names,
>> options::OPT_fno_discard_value_names, !IsAssertBuild))
>>
>
> *nod* Looks pretty good to me.
>
>
>>
>>
>>>
>>> instead? (simpler, one operation instead of two, etc)
>>>
>>>
>>>> +      CmdArgs.push_back("-discard-value-names");
>>>> +  } else if (!IsAssertBuild)
>>>> +    CmdArgs.push_back("-discard-value-names");
>>>> +
>>>>    // Set the main file name, so that debug info works even with
>>>>    // -save-temps.
>>>>    CmdArgs.push_back("-main-file-name");
>>>>
>>>> Modified: cfe/trunk/test/Driver/clang_f_opts.c
>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/
>>>> clang_f_opts.c?rev=324498&r1=324497&r2=324498&view=diff
>>>> ============================================================
>>>> ==================
>>>> --- cfe/trunk/test/Driver/clang_f_opts.c (original)
>>>> +++ cfe/trunk/test/Driver/clang_f_opts.c Wed Feb  7 10:36:51 2018
>>>> @@ -517,3 +517,8 @@
>>>>  // RUN: %clang -### -S %s 2>&1 | FileCheck 
>>>> -check-prefix=CHECK-NO-CF-PROTECTION-BRANCH
>>>> %s
>>>>  // CHECK-CF-PROTECTION-BRANCH: -fcf-protection=branch
>>>>  // CHECK-NO-CF-PROTECTION-BRANCH-NOT: -fcf-protection=branch
>>>> +
>>>> +// RUN: %clang -### -S -fdiscard-value-names %s 2>&1 | FileCheck
>>>> -check-prefix=CHECK-DISCARD-NAMES %s
>>>>
>>>
>>> Should there also be a RUN line here for the default behavior, when no
>>> arg is specified?
>>>
>>
>> AFAIK it is not currently testable, since the result of the test depends
>> on the build configuration, and AFAIK that information
>> isn't available in the LIT test suite.
>>
>> I'm sure with a bit of messy CMake I could find a way to transmit if
>> assertions are enabled to LIT, add it to the set of available
>> features, and write two different tests that have REQUIRE/UNSUPPORTED
>> lines which turn them on/off depending on
>> the build type.
>>
>> However, this behavior has gone untested for years, so I wasn't sure a
>> test was required now.
>>
>
> Generally good to try to raise the bar a bit where it's been dropped in
> parts of the codebase.
>
> But, yes, since the default changes - you should be able to test the
> default in an asserts build correctly (since there's a REQUIRES: Asserts)
> but we've deliberately avoided putting in a REQUIRES: NoAsserts, because
> generally there should be no functionality behind an assertion failure -
> but this sort of behavior slips through the cracks. Meh.
>

Ah, OK. I didn't see that when I went looking.  I'll add tests then.
Thankfully I don't need `NoAsserts` since I can write `// UNSUPPORTED:
Asserts` instead :-)

>
>
>>
>>
>>>
>>>
>>>> +// RUN: %clang -### -S -fno-discard-value-names %s 2>&1 | FileCheck
>>>> -check-prefix=CHECK-NO-DISCARD-NAMES %s
>>>> +// CHECK-DISCARD-NAMES: "-discard-value-names"
>>>> +// CHECK-NO-DISCARD-NAMES-NOT: "-discard-value-names"
>>>>
>>>>
>>>> _______________________________________________
>>>> cfe-commits mailing list
>>>> cfe-commits@lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>
>>>
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to