MaskRay updated this revision to Diff 236730. MaskRay marked 2 inline comments as done. MaskRay retitled this revision from "[Driver][CodeGen] Add -fpatchable-function-entry=N[,M]" to "[Driver][CodeGen] Add -fpatchable-function-entry=N[,0]". MaskRay added reviewers: ostannard, peter.smith. MaskRay removed a subscriber: ostannard. MaskRay added a comment.
Address review comments Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D72222/new/ https://reviews.llvm.org/D72222 Files: clang/include/clang/Basic/CodeGenOptions.def clang/include/clang/Basic/DiagnosticDriverKinds.td clang/include/clang/Driver/Options.td clang/lib/CodeGen/CodeGenFunction.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/lib/Driver/XRayArgs.cpp clang/lib/Frontend/CompilerInvocation.cpp clang/test/CodeGen/patchable-function-entry.c clang/test/Driver/fpatchable-function-entry.c
Index: clang/test/Driver/fpatchable-function-entry.c =================================================================== --- /dev/null +++ clang/test/Driver/fpatchable-function-entry.c @@ -0,0 +1,17 @@ +// RUN: %clang -target i386 %s -fpatchable-function-entry=1 -c -### 2>&1 | FileCheck %s +// RUN: %clang -target x86_64 %s -fpatchable-function-entry=1 -c -### 2>&1 | FileCheck %s +// RUN: %clang -target aarch64 %s -fpatchable-function-entry=1 -c -### 2>&1 | FileCheck %s +// RUN: %clang -target aarch64 %s -fpatchable-function-entry=1,0 -c -### 2>&1 | FileCheck %s +// CHECK: "-fpatchable-function-entry=1" + +// RUN: not %clang -target ppc64 -fsyntax-only %s -fpatchable-function-entry=1 2>&1 | FileCheck --check-prefix=TARGET %s +// TARGET: error: unsupported option '-fpatchable-function-entry=1' for target 'ppc64' + +// RUN: not %clang -target i386 -fsyntax-only %s -fpatchable-function-entry=1,1 2>&1 | FileCheck --check-prefix=NONZERO %s +// NONZERO: error: the second argument of '-fpatchable-function-entry' must be 0 or omitted + +// RUN: not %clang -target x86_64 -fsyntax-only %s -fpatchable-function-entry=1,0, 2>&1 | FileCheck --check-prefix=EXCESS %s +// EXCESS: error: invalid argument '1,0,' to -fpatchable-function-entry= + +// RUN: not %clang -target aarch64-linux -fsyntax-only %s -fxray-instrument -fpatchable-function-entry=1 2>&1 | FileCheck --check-prefix=XRAY %s +// XRAY: error: invalid argument '-fxray-instrument' not allowed with '-fpatchable-function-entry=' Index: clang/test/CodeGen/patchable-function-entry.c =================================================================== --- clang/test/CodeGen/patchable-function-entry.c +++ clang/test/CodeGen/patchable-function-entry.c @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -triple aarch64 -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple x86_64 -emit-llvm %s -fpatchable-function-entry=1 -o - | FileCheck --check-prefixes=CHECK,OPT %s // CHECK: define void @f0() #0 __attribute__((patchable_function_entry(0))) void f0() {} @@ -16,6 +17,10 @@ __attribute__((patchable_function_entry(2, 0))) void f20decl(); void f20decl() {} +// OPT: define void @f() #2 +void f() {} + /// M in patchable_function_entry(N,M) is currently ignored. // CHECK: attributes #0 = { {{.*}} "patchable-function-entry"="0" // CHECK: attributes #1 = { {{.*}} "patchable-function-entry"="2" +// OPT: attributes #2 = { {{.*}} "patchable-function-entry"="1" Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -1101,6 +1101,8 @@ parseXRayInstrumentationBundle("-fxray-instrumentation-bundle=", A, Args, Diags, Opts.XRayInstrumentationBundle); + Opts.PatchableFunctionEntryCount = + getLastArgIntValue(Args, OPT_fpatchable_function_entry_EQ, 0, Diags); Opts.InstrumentForProfiling = Args.hasArg(OPT_pg); Opts.CallFEntry = Args.hasArg(OPT_mfentry); Opts.MNopMCount = Args.hasArg(OPT_mnop_mcount); Index: clang/lib/Driver/XRayArgs.cpp =================================================================== --- clang/lib/Driver/XRayArgs.cpp +++ clang/lib/Driver/XRayArgs.cpp @@ -70,6 +70,13 @@ D.Diag(diag::err_drv_clang_unsupported) << (std::string(XRayInstrumentOption) + " on " + Triple.str()); } + + // Both XRay and -fpatchable-function-entry use + // TargetOpcode::PATCHABLE_FUNCTION_ENTER. + if (Arg *A = Args.getLastArg(options::OPT_fpatchable_function_entry_EQ)) + D.Diag(diag::err_drv_argument_not_allowed_with) + << "-fxray-instrument" << A->getSpelling(); + XRayInstrument = true; if (const Arg *A = Args.getLastArg(options::OPT_fxray_instruction_threshold_, Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -5002,6 +5002,24 @@ const XRayArgs &XRay = TC.getXRayArgs(); XRay.addArgs(TC, Args, CmdArgs, InputType); + if (Arg *A = Args.getLastArg(options::OPT_fpatchable_function_entry_EQ)) { + StringRef S0 = A->getValue(), S = S0; + unsigned Size, Start = 0; + if (!Triple.isAArch64() && Triple.getArch() != llvm::Triple::x86 && + Triple.getArch() != llvm::Triple::x86_64) + D.Diag(diag::err_drv_unsupported_opt_for_target) + << A->getAsString(Args) << TripleStr; + else if (S.consumeInteger(10, Size) || + (!S.empty() && (!S.consume_front(",") || + S.consumeInteger(10, Start) || !S.empty()))) + D.Diag(diag::err_drv_invalid_argument_to_option) + << S0 << A->getOption().getName(); + else if (Start) + D.Diag(diag::err_drv_unsupported_fpatchable_function_entry_argument); + else + CmdArgs.push_back(Args.MakeArgString(A->getSpelling() + Twine(Size))); + } + if (TC.SupportsProfiling()) { Args.AddLastArg(CmdArgs, options::OPT_pg); Index: clang/lib/CodeGen/CodeGenFunction.cpp =================================================================== --- clang/lib/CodeGen/CodeGenFunction.cpp +++ clang/lib/CodeGen/CodeGenFunction.cpp @@ -824,6 +824,9 @@ // Attr->getStart is currently ignored. Fn->addFnAttr("patchable-function-entry", std::to_string(Attr->getCount())); + } else if (unsigned Count = CGM.getCodeGenOpts().PatchableFunctionEntryCount) { + Fn->addFnAttr("patchable-function-entry", + std::to_string(Count)); } } Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -1703,6 +1703,8 @@ def fno_max_type_align : Flag<["-"], "fno-max-type-align">, Group<f_Group>; def fpascal_strings : Flag<["-"], "fpascal-strings">, Group<f_Group>, Flags<[CC1Option]>, HelpText<"Recognize and construct Pascal-style string literals">; +def fpatchable_function_entry_EQ : Joined<["-"], "fpatchable-function-entry=">, Group<f_Group>, Flags<[CC1Option]>, + HelpText<"Generate N NOPs at function entry">; def fpcc_struct_return : Flag<["-"], "fpcc-struct-return">, Group<f_Group>, Flags<[CC1Option]>, HelpText<"Override the default ABI to return all structs on the stack">; def fpch_preprocess : Flag<["-"], "fpch-preprocess">, Group<f_Group>; Index: clang/include/clang/Basic/DiagnosticDriverKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticDriverKinds.td +++ clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -404,6 +404,8 @@ "'-mindirect-jump=%0' is unsupported with the '%1' architecture">; def err_drv_unknown_indirect_jump_opt : Error< "unknown '-mindirect-jump=' option '%0'">; +def err_drv_unsupported_fpatchable_function_entry_argument : Error< + "the second argument of '-fpatchable-function-entry' must be 0 or omitted">; def warn_drv_unable_to_find_directory_expected : Warning< "unable to find %0 directory, expected to be in '%1'">, Index: clang/include/clang/Basic/CodeGenOptions.def =================================================================== --- clang/include/clang/Basic/CodeGenOptions.def +++ clang/include/clang/Basic/CodeGenOptions.def @@ -110,6 +110,8 @@ ///< XRay instrumentation. VALUE_CODEGENOPT(XRayInstructionThreshold , 32, 200) +VALUE_CODEGENOPT(PatchableFunctionEntryCount , 32, 0) ///< Number of NOPs at function entry + CODEGENOPT(InstrumentForProfiling , 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.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits