From: Jan Svoboda Date: Mon, 16 Nov 2020 11:17:29 +0000 (+0100) Subject: [clang][cli] Add ability to make fixups to CompilerInvocation after option parsing X-Git-Tag: llvmorg-13-init~5773 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2be569870486a2068667f4625723c0a7409f4c97;p=platform%2Fupstream%2Fllvm.git [clang][cli] Add ability to make fixups to CompilerInvocation after option parsing Depends on D83211 Reviewed By: Bigcheese Original patch by Daniel Grumberg. Differential Revision: https://reviews.llvm.org/D83298 --- diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index feae813..b850f64 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1347,7 +1347,7 @@ def fcf_protection : Flag<["-"], "fcf-protection">, Group, Flags<[CoreO Alias, AliasArgs<["full"]>, HelpText<"Enable cf-protection in 'full' mode">; -defm xray_instrument : OptInFFlag<"xray-instrument", "Generate XRay instrumentation sleds on function entry and exit">; +defm xray_instrument : OptInFFlag<"xray-instrument", "Generate XRay instrumentation sleds on function entry and exit", "", "", [], "LangOpts->XRayInstrument">; def fxray_instruction_threshold_EQ : JoinedOrSeparate<["-"], "fxray-instruction-threshold=">, @@ -1375,15 +1375,15 @@ def fxray_modes : HelpText<"List of modes to link in by default into XRay instrumented binaries.">; defm xray_always_emit_customevents : OptInFFlag<"xray-always-emit-customevents", - "Always emit __xray_customevent(...) calls even if the containing function is not always instrumented">; + "Always emit __xray_customevent(...) calls even if the containing function is not always instrumented", "", "", [], "LangOpts->XRayAlwaysEmitCustomEvents">; defm xray_always_emit_typedevents : OptInFFlag<"xray-always-emit-typedevents", - "Always emit __xray_typedevent(...) calls even if the containing function is not always instrumented">; + "Always emit __xray_typedevent(...) calls even if the containing function is not always instrumented", "", "", [], "LangOpts->XRayAlwaysEmitTypedEvents">; defm xray_ignore_loops : OptInFFlag<"xray-ignore-loops", - "Don't instrument functions with loops unless they also meet the minimum function size">; + "Don't instrument functions with loops unless they also meet the minimum function size", "", "", [], "CodeGenOpts.XRayIgnoreLoops">; defm xray_function_index : OptOutFFlag<"xray-function-index", "", - "Omit function index section at the expense of single-function patching performance">; + "Omit function index section at the expense of single-function patching performance", "", [], "CodeGenOpts.XRayOmitFunctionIndex">; def fxray_link_deps : Flag<["-"], "fxray-link-deps">, Group, Flags<[CC1Option]>, diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index a9bc48f..2ea1027 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -245,6 +245,17 @@ static T extractMaskValue(T KeyPath) { return KeyPath & Value; } +static void FixupInvocation(CompilerInvocation &Invocation) { + LangOptions &LangOpts = *Invocation.getLangOpts(); + DiagnosticOptions &DiagOpts = Invocation.getDiagnosticOpts(); + CodeGenOptions &CodeGenOpts = Invocation.getCodeGenOpts(); + CodeGenOpts.XRayInstrumentFunctions = LangOpts.XRayInstrument; + CodeGenOpts.XRayAlwaysEmitCustomEvents = LangOpts.XRayAlwaysEmitCustomEvents; + CodeGenOpts.XRayAlwaysEmitTypedEvents = LangOpts.XRayAlwaysEmitTypedEvents; + + llvm::sys::Process::UseANSIEscapeCodes(DiagOpts.UseANSIEscapeCodes); +} + //===----------------------------------------------------------------------===// // Deserialization (from args) //===----------------------------------------------------------------------===// @@ -1189,16 +1200,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, Opts.InstrumentFunctionEntryBare = Args.hasArg(OPT_finstrument_function_entry_bare); - Opts.XRayInstrumentFunctions = - Args.hasArg(OPT_fxray_instrument); - Opts.XRayAlwaysEmitCustomEvents = - Args.hasArg(OPT_fxray_always_emit_customevents); - Opts.XRayAlwaysEmitTypedEvents = - Args.hasArg(OPT_fxray_always_emit_typedevents); Opts.XRayInstructionThreshold = getLastArgIntValue(Args, OPT_fxray_instruction_threshold_EQ, 200, Diags); - Opts.XRayIgnoreLoops = Args.hasArg(OPT_fxray_ignore_loops); - Opts.XRayOmitFunctionIndex = Args.hasArg(OPT_fno_xray_function_index); Opts.XRayTotalFunctionGroups = getLastArgIntValue(Args, OPT_fxray_function_groups, 1, Diags); Opts.XRaySelectedFunctionGroup = @@ -3447,13 +3450,6 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, systemBlacklists.begin(), systemBlacklists.end()); - // -fxray-instrument - Opts.XRayInstrument = Args.hasArg(OPT_fxray_instrument); - Opts.XRayAlwaysEmitCustomEvents = - Args.hasArg(OPT_fxray_always_emit_customevents); - Opts.XRayAlwaysEmitTypedEvents = - Args.hasArg(OPT_fxray_always_emit_typedevents); - // -fxray-{always,never}-instrument= filenames. Opts.XRayAlwaysInstrumentFiles = Args.getAllArgValues(OPT_fxray_always_instrument); @@ -3827,9 +3823,7 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res, } Success &= Res.parseSimpleArgs(Args, Diags); - - llvm::sys::Process::UseANSIEscapeCodes( - Res.DiagnosticOpts->UseANSIEscapeCodes); + FixupInvocation(Res); Success &= ParseAnalyzerArgs(*Res.getAnalyzerOpts(), Args, Diags); Success &= ParseMigratorArgs(Res.getMigratorOpts(), Args);