francii created this revision. Herald added a subscriber: ormris. Herald added a project: All. francii requested review of this revision. Herald added subscribers: cfe-commits, MaskRay. Herald added a project: clang.
This patch enables general, non-platform-specific `-p` functionality into Clang to create parity with GCC. Specifically, this patch creates a new CodeGen option for `-p` and allows it to be used as an instrument for profiling. A side effect of this change is that the CodeGen option for `-pg` was renamed from `InstrumentForProfiling` to `InstrumentForProfilingGraph`, as profiling with `-pg` provides call-graph information while `-p` does not. The purpose of the `-p` flag is similar to that of `-pg`, but the results are analyzed with the `prof` tool as opposed to the `gprof` tool. More details can be found in this RFC post: https://discourse.llvm.org/t/rfc-add-p-driver-support-to-clang/66013?u=francii It is up to each vendor to implement their specific behaviour of `-p`. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D137753 Files: clang/include/clang/Basic/CodeGenOptions.def clang/include/clang/Driver/Options.td clang/lib/CodeGen/BackendUtil.cpp clang/lib/CodeGen/CodeGenFunction.cpp clang/lib/Driver/ToolChains/Clang.cpp Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -521,7 +521,8 @@ static bool useFramePointerForTargetByDefault(const ArgList &Args, const llvm::Triple &Triple) { - if (Args.hasArg(options::OPT_pg) && !Args.hasArg(options::OPT_mfentry)) + if (Args.hasArg(options::OPT_p, options::OPT_pg) && + !Args.hasArg(options::OPT_mfentry)) return true; switch (Triple.getArch()) { @@ -6268,6 +6269,7 @@ Args.AddLastArg(CmdArgs, options::OPT_fms_hotpatch); if (TC.SupportsProfiling()) { + Args.AddLastArg(CmdArgs, options::OPT_p); Args.AddLastArg(CmdArgs, options::OPT_pg); llvm::Triple::ArchType Arch = TC.getArch(); @@ -7388,7 +7390,7 @@ C.getJobs().getJobs().back()->PrintInputFilenames = true; } - if (Arg *A = Args.getLastArg(options::OPT_pg)) + if (Arg *A = Args.getLastArg(options::OPT_p, options::OPT_pg)) if (FPKeepKind == CodeGenOptions::FramePointerKind::None && !Args.hasArg(options::OPT_mfentry)) D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer" Index: clang/lib/CodeGen/CodeGenFunction.cpp =================================================================== --- clang/lib/CodeGen/CodeGenFunction.cpp +++ clang/lib/CodeGen/CodeGenFunction.cpp @@ -1043,7 +1043,8 @@ // inlining, we just add an attribute to insert a mcount call in backend. // The attribute "counting-function" is set to mcount function name which is // architecture dependent. - if (CGM.getCodeGenOpts().InstrumentForProfiling) { + if (CGM.getCodeGenOpts().InstrumentForProfiling || + CGM.getCodeGenOpts().InstrumentForProfilingGraph) { // Calls to fentry/mcount should not be generated if function has // the no_instrument_function attribute. if (!CurFuncDecl || !CurFuncDecl->hasAttr<NoInstrumentFunctionAttr>()) { Index: clang/lib/CodeGen/BackendUtil.cpp =================================================================== --- clang/lib/CodeGen/BackendUtil.cpp +++ clang/lib/CodeGen/BackendUtil.cpp @@ -923,7 +923,8 @@ if (CodeGenOpts.InstrumentFunctions || CodeGenOpts.InstrumentFunctionEntryBare || CodeGenOpts.InstrumentFunctionsAfterInlining || - CodeGenOpts.InstrumentForProfiling) { + CodeGenOpts.InstrumentForProfiling || + CodeGenOpts.InstrumentForProfilingGraph) { PB.registerPipelineStartEPCallback( [](ModulePassManager &MPM, OptimizationLevel Level) { MPM.addPass(createModuleToFunctionPassAdaptor( Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -4094,8 +4094,10 @@ MarshallingInfoFlag<DiagnosticOpts<"PedanticErrors">>; def pedantic : Flag<["-", "--"], "pedantic">, Group<pedantic_Group>, Flags<[CC1Option,FlangOption,FC1Option]>, HelpText<"Warn on language extensions">, MarshallingInfoFlag<DiagnosticOpts<"Pedantic">>; -def pg : Flag<["-"], "pg">, HelpText<"Enable mcount instrumentation">, Flags<[CC1Option]>, +def p : Flag<["-"], "p">, HelpText<"Enable mcount instrumentation">, Flags<[CC1Option]>, MarshallingInfoFlag<CodeGenOpts<"InstrumentForProfiling">>; +def pg : Flag<["-"], "pg">, HelpText<"Enable mcount instrumentation">, Flags<[CC1Option]>, + MarshallingInfoFlag<CodeGenOpts<"InstrumentForProfilingGraph">>; def pipe : Flag<["-", "--"], "pipe">, HelpText<"Use pipes between commands, when possible">; def prebind__all__twolevel__modules : Flag<["-"], "prebind_all_twolevel_modules">; @@ -4140,7 +4142,6 @@ LangOpts<"POSIXThreads">, DefaultFalse, PosFlag<SetTrue, [], "Support POSIX threads in generated code">, NegFlag<SetFalse>, BothFlags<[CC1Option]>>; -def p : Flag<["-"], "p">; def pie : Flag<["-"], "pie">, Group<Link_Group>; def static_pie : Flag<["-"], "static-pie">, Group<Link_Group>; def read__only__relocs : Separate<["-"], "read_only_relocs">; Index: clang/include/clang/Basic/CodeGenOptions.def =================================================================== --- clang/include/clang/Basic/CodeGenOptions.def +++ clang/include/clang/Basic/CodeGenOptions.def @@ -150,7 +150,8 @@ ///< generates a 'patchable-function' attribute. CODEGENOPT(JMCInstrument, 1, 0) ///< Set when -fjmc is enabled. -CODEGENOPT(InstrumentForProfiling , 1, 0) ///< Set when -pg is enabled. +CODEGENOPT(InstrumentForProfiling , 1, 0) ///< Set when -p is enabled. +CODEGENOPT(InstrumentForProfilingGraph , 1, 0) ///< Set when -pg is enabled. CODEGENOPT(CallFEntry , 1, 0) ///< Set when -mfentry is enabled. CODEGENOPT(MNopMCount , 1, 0) ///< Set when -mnop-mcount is enabled. CODEGENOPT(RecordMCount , 1, 0) ///< Set when -mrecord-mcount is enabled.
Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -521,7 +521,8 @@ static bool useFramePointerForTargetByDefault(const ArgList &Args, const llvm::Triple &Triple) { - if (Args.hasArg(options::OPT_pg) && !Args.hasArg(options::OPT_mfentry)) + if (Args.hasArg(options::OPT_p, options::OPT_pg) && + !Args.hasArg(options::OPT_mfentry)) return true; switch (Triple.getArch()) { @@ -6268,6 +6269,7 @@ Args.AddLastArg(CmdArgs, options::OPT_fms_hotpatch); if (TC.SupportsProfiling()) { + Args.AddLastArg(CmdArgs, options::OPT_p); Args.AddLastArg(CmdArgs, options::OPT_pg); llvm::Triple::ArchType Arch = TC.getArch(); @@ -7388,7 +7390,7 @@ C.getJobs().getJobs().back()->PrintInputFilenames = true; } - if (Arg *A = Args.getLastArg(options::OPT_pg)) + if (Arg *A = Args.getLastArg(options::OPT_p, options::OPT_pg)) if (FPKeepKind == CodeGenOptions::FramePointerKind::None && !Args.hasArg(options::OPT_mfentry)) D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer" Index: clang/lib/CodeGen/CodeGenFunction.cpp =================================================================== --- clang/lib/CodeGen/CodeGenFunction.cpp +++ clang/lib/CodeGen/CodeGenFunction.cpp @@ -1043,7 +1043,8 @@ // inlining, we just add an attribute to insert a mcount call in backend. // The attribute "counting-function" is set to mcount function name which is // architecture dependent. - if (CGM.getCodeGenOpts().InstrumentForProfiling) { + if (CGM.getCodeGenOpts().InstrumentForProfiling || + CGM.getCodeGenOpts().InstrumentForProfilingGraph) { // Calls to fentry/mcount should not be generated if function has // the no_instrument_function attribute. if (!CurFuncDecl || !CurFuncDecl->hasAttr<NoInstrumentFunctionAttr>()) { Index: clang/lib/CodeGen/BackendUtil.cpp =================================================================== --- clang/lib/CodeGen/BackendUtil.cpp +++ clang/lib/CodeGen/BackendUtil.cpp @@ -923,7 +923,8 @@ if (CodeGenOpts.InstrumentFunctions || CodeGenOpts.InstrumentFunctionEntryBare || CodeGenOpts.InstrumentFunctionsAfterInlining || - CodeGenOpts.InstrumentForProfiling) { + CodeGenOpts.InstrumentForProfiling || + CodeGenOpts.InstrumentForProfilingGraph) { PB.registerPipelineStartEPCallback( [](ModulePassManager &MPM, OptimizationLevel Level) { MPM.addPass(createModuleToFunctionPassAdaptor( Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -4094,8 +4094,10 @@ MarshallingInfoFlag<DiagnosticOpts<"PedanticErrors">>; def pedantic : Flag<["-", "--"], "pedantic">, Group<pedantic_Group>, Flags<[CC1Option,FlangOption,FC1Option]>, HelpText<"Warn on language extensions">, MarshallingInfoFlag<DiagnosticOpts<"Pedantic">>; -def pg : Flag<["-"], "pg">, HelpText<"Enable mcount instrumentation">, Flags<[CC1Option]>, +def p : Flag<["-"], "p">, HelpText<"Enable mcount instrumentation">, Flags<[CC1Option]>, MarshallingInfoFlag<CodeGenOpts<"InstrumentForProfiling">>; +def pg : Flag<["-"], "pg">, HelpText<"Enable mcount instrumentation">, Flags<[CC1Option]>, + MarshallingInfoFlag<CodeGenOpts<"InstrumentForProfilingGraph">>; def pipe : Flag<["-", "--"], "pipe">, HelpText<"Use pipes between commands, when possible">; def prebind__all__twolevel__modules : Flag<["-"], "prebind_all_twolevel_modules">; @@ -4140,7 +4142,6 @@ LangOpts<"POSIXThreads">, DefaultFalse, PosFlag<SetTrue, [], "Support POSIX threads in generated code">, NegFlag<SetFalse>, BothFlags<[CC1Option]>>; -def p : Flag<["-"], "p">; def pie : Flag<["-"], "pie">, Group<Link_Group>; def static_pie : Flag<["-"], "static-pie">, Group<Link_Group>; def read__only__relocs : Separate<["-"], "read_only_relocs">; Index: clang/include/clang/Basic/CodeGenOptions.def =================================================================== --- clang/include/clang/Basic/CodeGenOptions.def +++ clang/include/clang/Basic/CodeGenOptions.def @@ -150,7 +150,8 @@ ///< generates a 'patchable-function' attribute. CODEGENOPT(JMCInstrument, 1, 0) ///< Set when -fjmc is enabled. -CODEGENOPT(InstrumentForProfiling , 1, 0) ///< Set when -pg is enabled. +CODEGENOPT(InstrumentForProfiling , 1, 0) ///< Set when -p is enabled. +CODEGENOPT(InstrumentForProfilingGraph , 1, 0) ///< Set when -pg is enabled. CODEGENOPT(CallFEntry , 1, 0) ///< Set when -mfentry is enabled. CODEGENOPT(MNopMCount , 1, 0) ///< Set when -mnop-mcount is enabled. CODEGENOPT(RecordMCount , 1, 0) ///< Set when -mrecord-mcount is enabled.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits