[flang][flang-driver] Support flag -finstrument-functions (#137996)
This commit is contained in:
committed by
GitHub
parent
04e32b8a33
commit
580da48a93
@@ -2824,10 +2824,12 @@ def finput_charset_EQ : Joined<["-"], "finput-charset=">,
|
||||
Visibility<[ClangOption, FlangOption, FC1Option]>, Group<f_Group>,
|
||||
HelpText<"Specify the default character set for source files">;
|
||||
def fexec_charset_EQ : Joined<["-"], "fexec-charset=">, Group<f_Group>;
|
||||
def finstrument_functions : Flag<["-"], "finstrument-functions">, Group<f_Group>,
|
||||
Visibility<[ClangOption, CC1Option]>,
|
||||
HelpText<"Generate calls to instrument function entry and exit">,
|
||||
MarshallingInfoFlag<CodeGenOpts<"InstrumentFunctions">>;
|
||||
def finstrument_functions
|
||||
: Flag<["-"], "finstrument-functions">,
|
||||
Group<f_Group>,
|
||||
Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
|
||||
HelpText<"Generate calls to instrument function entry and exit">,
|
||||
MarshallingInfoFlag<CodeGenOpts<"InstrumentFunctions">>;
|
||||
def finstrument_functions_after_inlining : Flag<["-"], "finstrument-functions-after-inlining">, Group<f_Group>,
|
||||
Visibility<[ClangOption, CC1Option]>,
|
||||
HelpText<"Like -finstrument-functions, but insert the calls after inlining">,
|
||||
|
||||
@@ -128,7 +128,8 @@ void Flang::addOtherOptions(const ArgList &Args, ArgStringList &CmdArgs) const {
|
||||
options::OPT_std_EQ, options::OPT_W_Joined,
|
||||
options::OPT_fconvert_EQ, options::OPT_fpass_plugin_EQ,
|
||||
options::OPT_funderscoring, options::OPT_fno_underscoring,
|
||||
options::OPT_funsigned, options::OPT_fno_unsigned});
|
||||
options::OPT_funsigned, options::OPT_fno_unsigned,
|
||||
options::OPT_finstrument_functions});
|
||||
|
||||
llvm::codegenoptions::DebugInfoKind DebugInfoKind;
|
||||
if (Args.hasArg(options::OPT_gN_Group)) {
|
||||
|
||||
@@ -24,6 +24,8 @@ CODEGENOPT(OptimizationLevel, 2, 0) ///< The -O[0-3] option specified.
|
||||
CODEGENOPT(DebugPassManager, 1, 0) ///< Prints debug information for the new
|
||||
///< pass manager.
|
||||
|
||||
CODEGENOPT(InstrumentFunctions, 1, 0) ///< Set when -finstrument_functions is
|
||||
///< enabled on the compile step.
|
||||
CODEGENOPT(IsPIE, 1, 0) ///< PIE level is the same as PIC Level.
|
||||
CODEGENOPT(PICLevel, 2, 0) ///< PIC level of the LLVM module.
|
||||
CODEGENOPT(PrepareForFullLTO , 1, 0) ///< Set when -flto is enabled on the
|
||||
|
||||
@@ -393,6 +393,14 @@ def FunctionAttr : Pass<"function-attr", "mlir::func::FuncOp"> {
|
||||
clEnumValN(mlir::LLVM::framePointerKind::FramePointerKind::All, "All", ""),
|
||||
clEnumValN(mlir::LLVM::framePointerKind::FramePointerKind::Reserved, "Reserved", "")
|
||||
)}]>,
|
||||
Option<"instrumentFunctionEntry", "instrument-function-entry",
|
||||
"std::string", /*default=*/"",
|
||||
"Sets the name of the profiling function called during function "
|
||||
"entry">,
|
||||
Option<"instrumentFunctionExit", "instrument-function-exit",
|
||||
"std::string", /*default=*/"",
|
||||
"Sets the name of the profiling function called during function "
|
||||
"exit">,
|
||||
Option<"noInfsFPMath", "no-infs-fp-math", "bool", /*default=*/"false",
|
||||
"Set the no-infs-fp-math attribute on functions in the module.">,
|
||||
Option<"noNaNsFPMath", "no-nans-fp-math", "bool", /*default=*/"false",
|
||||
|
||||
@@ -102,13 +102,17 @@ struct MLIRToLLVMPassPipelineConfig : public FlangEPCallBacks {
|
||||
UnsafeFPMath = mathOpts.getAssociativeMath() &&
|
||||
mathOpts.getReciprocalMath() && NoSignedZerosFPMath &&
|
||||
ApproxFuncFPMath && mathOpts.getFPContractEnabled();
|
||||
if (opts.InstrumentFunctions) {
|
||||
InstrumentFunctionEntry = "__cyg_profile_func_enter";
|
||||
InstrumentFunctionExit = "__cyg_profile_func_exit";
|
||||
}
|
||||
}
|
||||
|
||||
llvm::OptimizationLevel OptLevel; ///< optimisation level
|
||||
bool StackArrays = false; ///< convert memory allocations to alloca.
|
||||
bool Underscoring = true; ///< add underscores to function names.
|
||||
bool LoopVersioning = false; ///< Run the version loop pass.
|
||||
bool AliasAnalysis = false; ///< Add TBAA tags to generated LLVMIR
|
||||
bool AliasAnalysis = false; ///< Add TBAA tags to generated LLVMIR.
|
||||
llvm::codegenoptions::DebugInfoKind DebugInfo =
|
||||
llvm::codegenoptions::NoDebugInfo; ///< Debug info generation.
|
||||
llvm::FramePointerKind FramePointerKind =
|
||||
@@ -124,6 +128,12 @@ struct MLIRToLLVMPassPipelineConfig : public FlangEPCallBacks {
|
||||
bool UnsafeFPMath = false; ///< Set unsafe-fp-math attribute for functions.
|
||||
bool NSWOnLoopVarInc = true; ///< Add nsw flag to loop variable increments.
|
||||
bool EnableOpenMP = false; ///< Enable OpenMP lowering.
|
||||
std::string InstrumentFunctionEntry =
|
||||
""; ///< Name of the instrument-function that is called on each
|
||||
///< function-entry
|
||||
std::string InstrumentFunctionExit =
|
||||
""; ///< Name of the instrument-function that is called on each
|
||||
///< function-exit
|
||||
};
|
||||
|
||||
struct OffloadModuleOpts {
|
||||
|
||||
@@ -310,6 +310,9 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
|
||||
args.filtered(clang::driver::options::OPT_fembed_offload_object_EQ))
|
||||
opts.OffloadObjects.push_back(a->getValue());
|
||||
|
||||
if (args.hasArg(clang::driver::options::OPT_finstrument_functions))
|
||||
opts.InstrumentFunctions = 1;
|
||||
|
||||
// -flto=full/thin option.
|
||||
if (const llvm::opt::Arg *a =
|
||||
args.getLastArg(clang::driver::options::OPT_flto_EQ)) {
|
||||
|
||||
@@ -349,7 +349,8 @@ void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
|
||||
framePointerKind = mlir::LLVM::framePointerKind::FramePointerKind::None;
|
||||
|
||||
pm.addPass(fir::createFunctionAttr(
|
||||
{framePointerKind, config.NoInfsFPMath, config.NoNaNsFPMath,
|
||||
{framePointerKind, config.InstrumentFunctionEntry,
|
||||
config.InstrumentFunctionExit, config.NoInfsFPMath, config.NoNaNsFPMath,
|
||||
config.ApproxFuncFPMath, config.NoSignedZerosFPMath, config.UnsafeFPMath,
|
||||
""}));
|
||||
|
||||
|
||||
@@ -28,6 +28,8 @@ namespace {
|
||||
class FunctionAttrPass : public fir::impl::FunctionAttrBase<FunctionAttrPass> {
|
||||
public:
|
||||
FunctionAttrPass(const fir::FunctionAttrOptions &options) {
|
||||
instrumentFunctionEntry = options.instrumentFunctionEntry;
|
||||
instrumentFunctionExit = options.instrumentFunctionExit;
|
||||
framePointerKind = options.framePointerKind;
|
||||
noInfsFPMath = options.noInfsFPMath;
|
||||
noNaNsFPMath = options.noNaNsFPMath;
|
||||
@@ -72,6 +74,14 @@ void FunctionAttrPass::runOnOperation() {
|
||||
|
||||
auto llvmFuncOpName =
|
||||
mlir::OperationName(mlir::LLVM::LLVMFuncOp::getOperationName(), context);
|
||||
if (!instrumentFunctionEntry.empty())
|
||||
func->setAttr(mlir::LLVM::LLVMFuncOp::getInstrumentFunctionEntryAttrName(
|
||||
llvmFuncOpName),
|
||||
mlir::StringAttr::get(context, instrumentFunctionEntry));
|
||||
if (!instrumentFunctionExit.empty())
|
||||
func->setAttr(mlir::LLVM::LLVMFuncOp::getInstrumentFunctionExitAttrName(
|
||||
llvmFuncOpName),
|
||||
mlir::StringAttr::get(context, instrumentFunctionExit));
|
||||
if (noInfsFPMath)
|
||||
func->setAttr(
|
||||
mlir::LLVM::LLVMFuncOp::getNoInfsFpMathAttrName(llvmFuncOpName),
|
||||
|
||||
9
flang/test/Driver/func-attr-instrument-functions.f90
Normal file
9
flang/test/Driver/func-attr-instrument-functions.f90
Normal file
@@ -0,0 +1,9 @@
|
||||
! RUN: %flang -O1 -finstrument-functions -emit-llvm -S -o - %s 2>&1| FileCheck %s
|
||||
|
||||
subroutine func
|
||||
end subroutine func
|
||||
|
||||
! CHECK: define void @func_()
|
||||
! CHECK: {{.*}}call void @__cyg_profile_func_enter(ptr {{.*}}@func_, ptr {{.*}})
|
||||
! CHECK: {{.*}}call void @__cyg_profile_func_exit(ptr {{.*}}@func_, ptr {{.*}})
|
||||
! CHECK-NEXT: ret {{.*}}
|
||||
Reference in New Issue
Block a user