This revision was automatically updated to reflect the committed changes. Closed by commit rGc9b36a041fd7: Support GCC's -fstack-usage flag (authored by pzheng).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D100509/new/ https://reviews.llvm.org/D100509 Files: clang/docs/ReleaseNotes.rst clang/include/clang/Basic/CodeGenOptions.h clang/include/clang/Driver/Options.td clang/lib/CodeGen/BackendUtil.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/lib/Frontend/CompilerInvocation.cpp clang/test/CodeGen/stack-usage.c clang/test/Driver/stack-usage.c llvm/include/llvm/CodeGen/AsmPrinter.h llvm/include/llvm/Target/TargetOptions.h llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
Index: llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp =================================================================== --- llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -1185,6 +1185,37 @@ OutStreamer->PopSection(); } +void AsmPrinter::emitStackUsage(const MachineFunction &MF) { + const std::string &OutputFilename = MF.getTarget().Options.StackUsageOutput; + + // OutputFilename empty implies -fstack-usage is not passed. + if (OutputFilename.empty()) + return; + + const MachineFrameInfo &FrameInfo = MF.getFrameInfo(); + uint64_t StackSize = FrameInfo.getStackSize(); + + if (StackUsageStream == nullptr) { + std::error_code EC; + StackUsageStream = + std::make_unique<raw_fd_ostream>(OutputFilename, EC, sys::fs::OF_Text); + if (EC) { + errs() << "Could not open file: " << EC.message(); + return; + } + } + + *StackUsageStream << MF.getFunction().getParent()->getName(); + if (const DISubprogram *DSP = MF.getFunction().getSubprogram()) + *StackUsageStream << ':' << DSP->getLine(); + + *StackUsageStream << ':' << MF.getName() << '\t' << StackSize << '\t'; + if (FrameInfo.hasVarSizedObjects()) + *StackUsageStream << "dynamic\n"; + else + *StackUsageStream << "static\n"; +} + static bool needFuncLabelsForEHOrDebugInfo(const MachineFunction &MF) { MachineModuleInfo &MMI = MF.getMMI(); if (!MF.getLandingPads().empty() || MF.hasEHFunclets() || MMI.hasDebugInfo()) @@ -1469,6 +1500,9 @@ // Emit section containing stack size metadata. emitStackSizeSection(*MF); + // Emit .su file containing function stack size information. + emitStackUsage(*MF); + emitPatchableFunctionEntries(); if (isVerbose()) Index: llvm/include/llvm/Target/TargetOptions.h =================================================================== --- llvm/include/llvm/Target/TargetOptions.h +++ llvm/include/llvm/Target/TargetOptions.h @@ -342,6 +342,11 @@ /// Stack protector guard reg to use, e.g. usually fs or gs in X86. std::string StackProtectorGuardReg = "None"; + /// Name of the stack usage file (i.e., .su file) if user passes + /// -fstack-usage. If empty, it can be implied that -fstack-usage is not + /// passed on the command line. + std::string StackUsageOutput; + /// FloatABIType - This setting is set by -float-abi=xxx option is specfied /// on the command line. This setting may either be Default, Soft, or Hard. /// Default selects the target's default behavior. Soft selects the ABI for Index: llvm/include/llvm/CodeGen/AsmPrinter.h =================================================================== --- llvm/include/llvm/CodeGen/AsmPrinter.h +++ llvm/include/llvm/CodeGen/AsmPrinter.h @@ -182,6 +182,9 @@ /// Emit comments in assembly output if this is true. bool VerboseAsm; + /// Output stream for the stack usage file (i.e., .su file). + std::unique_ptr<raw_fd_ostream> StackUsageStream; + static char ID; protected: @@ -358,6 +361,8 @@ void emitStackSizeSection(const MachineFunction &MF); + void emitStackUsage(const MachineFunction &MF); + void emitBBAddrMapSection(const MachineFunction &MF); void emitPseudoProbe(const MachineInstr &MI); Index: clang/test/Driver/stack-usage.c =================================================================== --- /dev/null +++ clang/test/Driver/stack-usage.c @@ -0,0 +1,7 @@ +// RUN: %clang -target aarch64-unknown %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ABSENT +// CHECK-ABSENT-NOT: "-stack-usage-file" + +// RUN: %clang -target aarch64-unknown -fstack-usage %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PRESENT +// CHECK-PRESENT: "-stack-usage-file" + +int foo() { return 42; } Index: clang/test/CodeGen/stack-usage.c =================================================================== --- /dev/null +++ clang/test/CodeGen/stack-usage.c @@ -0,0 +1,19 @@ +// REQUIRES: aarch64-registered-target + +// RUN: rm -rf %t && mkdir %t && cd %t +// RUN: %clang_cc1 -triple aarch64-unknown -stack-usage-file b.su -emit-obj %s -o b.o +// RUN: FileCheck %s < b.su + +// CHECK: stack-usage.c:[[#@LINE+1]]:foo {{[0-9]+}} static +int foo() { + char a[8]; + + return 0; +} + +// CHECK: stack-usage.c:[[#@LINE+1]]:bar {{[0-9]+}} dynamic +int bar(int len) { + char a[len]; + + return 1; +} Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -1931,6 +1931,9 @@ if (UsingSampleProfile) NeedLocTracking = true; + if (!Opts.StackUsageOutput.empty()) + NeedLocTracking = true; + // If the user requested a flag that requires source locations available in // the backend, make sure that the backend tracks source location information. if (NeedLocTracking && Opts.getDebugInfo() == codegenoptions::NoDebugInfo) Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -5492,6 +5492,18 @@ options::OPT_fno_stack_size_section, RawTriple.isPS4())) CmdArgs.push_back("-fstack-size-section"); + if (Args.hasArg(options::OPT_fstack_usage)) { + CmdArgs.push_back("-stack-usage-file"); + + if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { + SmallString<128> OutputFilename(OutputOpt->getValue()); + llvm::sys::path::replace_extension(OutputFilename, "su"); + CmdArgs.push_back(Args.MakeArgString(OutputFilename)); + } else + CmdArgs.push_back( + Args.MakeArgString(Twine(getBaseInputStem(Args, Inputs)) + ".su")); + } + CmdArgs.push_back("-ferror-limit"); if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ)) CmdArgs.push_back(A->getValue()); Index: clang/lib/CodeGen/BackendUtil.cpp =================================================================== --- clang/lib/CodeGen/BackendUtil.cpp +++ clang/lib/CodeGen/BackendUtil.cpp @@ -567,6 +567,7 @@ Options.ExplicitEmulatedTLS = CodeGenOpts.ExplicitEmulatedTLS; Options.DebuggerTuning = CodeGenOpts.getDebuggerTuning(); Options.EmitStackSizeSection = CodeGenOpts.StackSizeSection; + Options.StackUsageOutput = CodeGenOpts.StackUsageOutput; Options.EmitAddrsig = CodeGenOpts.Addrsig; Options.ForceDwarfFrameSection = CodeGenOpts.ForceDwarfFrameSection; Options.EmitCallSiteInfo = CodeGenOpts.EmitCallSiteInfo; Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -2709,6 +2709,12 @@ CodeGenOpts<"StackSizeSection">, DefaultFalse, PosFlag<SetTrue, [CC1Option], "Emit section containing metadata on function stack sizes">, NegFlag<SetFalse>>; +def fstack_usage : Flag<["-"], "fstack-usage">, Group<f_Group>, + HelpText<"Emit .su file containing information on function stack sizes">; +def stack_usage_file : Separate<["-"], "stack-usage-file">, + Flags<[CC1Option, NoDriverOption]>, + HelpText<"Filename (or -) to write stack usage output to">, + MarshallingInfoString<CodeGenOpts<"StackUsageOutput">>; defm unique_basic_block_section_names : BoolFOption<"unique-basic-block-section-names", CodeGenOpts<"UniqueBasicBlockSectionNames">, DefaultFalse, Index: clang/include/clang/Basic/CodeGenOptions.h =================================================================== --- clang/include/clang/Basic/CodeGenOptions.h +++ clang/include/clang/Basic/CodeGenOptions.h @@ -372,6 +372,11 @@ /// coverage pass should actually not be instrumented. std::vector<std::string> SanitizeCoverageIgnorelistFiles; + /// Name of the stack usage file (i.e., .su file) if user passes + /// -fstack-usage. If empty, it can be implied that -fstack-usage is not + /// passed on the command line. + std::string StackUsageOutput; + /// Executable and command-line used to create a given CompilerInvocation. /// Most of the time this will be the full -cc1 command. const char *Argv0 = nullptr; Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -70,6 +70,10 @@ - ``-Wreserved-identifier`` emits warning when user code uses reserved identifiers. +- ``-fstack-usage`` generates an extra .su file per input source file. The .su + file contains frame size information for each function defined in the source + file. + Deprecated Compiler Flags -------------------------
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits