On Mon, Feb 12, 2018 at 4:01 PM, David Blaikie <dblai...@gmail.com> wrote:
> ah, sweet :) > > On Mon, Feb 12, 2018 at 2:59 PM Eric Fiselier <e...@efcs.ca> wrote: > >> 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 :-) >> > After further investigation, the `asserts` feature isn't suitable for use here, in Clang. The value is determined by `llvm-config --assertion-mode`, which may be different from the assertion mode of the Clang in standalone builds. > >>> >>>> >>>> >>>>> >>>>> >>>>>> +// 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