[clang] d4bcb45 - [MC][re-land] Omit DWARF unwind info if compact unwind is present where eligible

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Mon Jun 13 14:01:32 PDT 2022


Please include details of what changed between one commit and a recommit of
a patch - helpful for reviewers checking what's changed since the last
commit, double-checking that the patch fully addresses the issues, etc.

On Sun, Jun 12, 2022 at 2:24 PM Jez Ng via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

>
> Author: Jez Ng
> Date: 2022-06-12T17:24:19-04:00
> New Revision: d4bcb45db78dc7ca371224cb01bea8dcb14e0698
>
> URL:
> https://github.com/llvm/llvm-project/commit/d4bcb45db78dc7ca371224cb01bea8dcb14e0698
> DIFF:
> https://github.com/llvm/llvm-project/commit/d4bcb45db78dc7ca371224cb01bea8dcb14e0698.diff
>
> LOG: [MC][re-land] Omit DWARF unwind info if compact unwind is present
> where eligible
>
> This reverts commit d941d597837d9e1405086f008c9bd6a71e7263c9.
>
> Differential Revision: https://reviews.llvm.org/D122258
>
> Added:
>     clang/test/Driver/femit-dwarf-unwind.c
>     clang/test/Driver/femit-dwarf-unwind.s
>     llvm/test/MC/MachO/AArch64/emit-dwarf-unwind.s
>     llvm/test/MC/X86/compact-unwind-mode-dwarf.s
>
> Modified:
>     clang/include/clang/Basic/CodeGenOptions.def
>     clang/include/clang/Driver/Options.td
>     clang/lib/CodeGen/BackendUtil.cpp
>     clang/lib/Driver/ToolChains/Clang.cpp
>     clang/tools/driver/cc1as_main.cpp
>     llvm/include/llvm/MC/MCContext.h
>     llvm/include/llvm/MC/MCTargetOptions.h
>     llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h
>     llvm/lib/CodeGen/LLVMTargetMachine.cpp
>     llvm/lib/CodeGen/MachineModuleInfo.cpp
>     llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp
>     llvm/lib/ExecutionEngine/Orc/CompileUtils.cpp
>     llvm/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp
>     llvm/lib/MC/MCContext.cpp
>     llvm/lib/MC/MCDwarf.cpp
>     llvm/lib/MC/MCObjectFileInfo.cpp
>     llvm/lib/MC/MCTargetOptions.cpp
>     llvm/lib/MC/MCTargetOptionsCommandFlags.cpp
>     llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
>
> Removed:
>
>
>
>
> ################################################################################
> diff  --git a/clang/include/clang/Basic/CodeGenOptions.def
> b/clang/include/clang/Basic/CodeGenOptions.def
> index d8f667dc387bb..8e89106993c26 100644
> --- a/clang/include/clang/Basic/CodeGenOptions.def
> +++ b/clang/include/clang/Basic/CodeGenOptions.def
> @@ -114,6 +114,10 @@ CODEGENOPT(StackSizeSection  , 1, 0) ///< Set when
> -fstack-size-section is enabl
>  CODEGENOPT(ForceDwarfFrameSection , 1, 0) ///< Set when
> -fforce-dwarf-frame is
>                                            ///< enabled.
>
> +///< Set when -femit-dwarf-unwind is passed.
> +ENUM_CODEGENOPT(EmitDwarfUnwind, llvm::EmitDwarfUnwindType, 2,
> +                llvm::EmitDwarfUnwindType::Default)
> +
>  ///< Set when -fxray-always-emit-customevents is enabled.
>  CODEGENOPT(XRayAlwaysEmitCustomEvents , 1, 0)
>
>
> diff  --git a/clang/include/clang/Driver/Options.td
> b/clang/include/clang/Driver/Options.td
> index 95840760f7746..002cd6cc8cb17 100644
> --- a/clang/include/clang/Driver/Options.td
> +++ b/clang/include/clang/Driver/Options.td
> @@ -3044,6 +3044,13 @@ def fmacro_prefix_map_EQ
>  defm force_dwarf_frame : BoolFOption<"force-dwarf-frame",
>    CodeGenOpts<"ForceDwarfFrameSection">, DefaultFalse,
>    PosFlag<SetTrue, [CC1Option], "Always emit a debug frame section">,
> NegFlag<SetFalse>>;
> +def femit_dwarf_unwind_EQ : Joined<["-"], "femit-dwarf-unwind=">,
> +  Group<f_Group>, Flags<[CC1Option, CC1AsOption]>,
> +  HelpText<"When to emit DWARF unwind (EH frame) info">,
> +  Values<"always,no-compact-unwind,default">,
> +  NormalizedValues<["Always", "NoCompactUnwind", "Default"]>,
> +  NormalizedValuesScope<"llvm::EmitDwarfUnwindType">,
> +  MarshallingInfoEnum<CodeGenOpts<"EmitDwarfUnwind">, "Default">;
>  def g_Flag : Flag<["-"], "g">, Group<g_Group>,
>    HelpText<"Generate source-level debug information">;
>  def gline_tables_only : Flag<["-"], "gline-tables-only">, Group<gN_Group>,
>
> diff  --git a/clang/lib/CodeGen/BackendUtil.cpp
> b/clang/lib/CodeGen/BackendUtil.cpp
> index 0de15b1e48078..4b294c254e476 100644
> --- a/clang/lib/CodeGen/BackendUtil.cpp
> +++ b/clang/lib/CodeGen/BackendUtil.cpp
> @@ -453,6 +453,7 @@ static bool initTargetOptions(DiagnosticsEngine &Diags,
>    }
>
>    Options.MCOptions.SplitDwarfFile = CodeGenOpts.SplitDwarfFile;
> +  Options.MCOptions.EmitDwarfUnwind = CodeGenOpts.getEmitDwarfUnwind();
>    Options.MCOptions.MCRelaxAll = CodeGenOpts.RelaxAll;
>    Options.MCOptions.MCSaveTempLabels = CodeGenOpts.SaveTempLabels;
>    Options.MCOptions.MCUseDwarfDirectory =
>
> diff  --git a/clang/lib/Driver/ToolChains/Clang.cpp
> b/clang/lib/Driver/ToolChains/Clang.cpp
> index ceac142653ebe..62e891ce38c49 100644
> --- a/clang/lib/Driver/ToolChains/Clang.cpp
> +++ b/clang/lib/Driver/ToolChains/Clang.cpp
> @@ -2518,6 +2518,8 @@ static void
> CollectArgsForIntegratedAssembler(Compilation &C,
>                     DefaultIncrementalLinkerCompatible))
>      CmdArgs.push_back("-mincremental-linker-compatible");
>
> +  Args.AddLastArg(CmdArgs, options::OPT_femit_dwarf_unwind_EQ);
> +
>    // If you add more args here, also add them to the block below that
>    // starts with "// If CollectArgsForIntegratedAssembler() isn't called
> below".
>
> @@ -4622,6 +4624,7 @@ void Clang::ConstructJob(Compilation &C, const
> JobAction &JA,
>      }
>      Args.ClaimAllArgs(options::OPT_Wa_COMMA);
>      Args.ClaimAllArgs(options::OPT_Xassembler);
> +    Args.ClaimAllArgs(options::OPT_femit_dwarf_unwind_EQ);
>    }
>
>    if (isa<AnalyzeJobAction>(JA)) {
>
> diff  --git a/clang/test/Driver/femit-dwarf-unwind.c
> b/clang/test/Driver/femit-dwarf-unwind.c
> new file mode 100644
> index 0000000000000..6057c5e0e5348
> --- /dev/null
> +++ b/clang/test/Driver/femit-dwarf-unwind.c
> @@ -0,0 +1,14 @@
> +// REQUIRES: x86-registered-target
> +
> +// RUN: rm -rf %t; mkdir %t
> +// RUN: %clang -target x86_64-apple-macos11.0 -c %s -o %t/x86_64.o
> +// RUN: %clang -target x86_64-apple-macos11.0
> -femit-dwarf-unwind=no-compact-unwind -c %s -o %t/x86_64-no-dwarf.o
> +// RUN: llvm-objdump --macho --dwarf=frames %t/x86_64.o | FileCheck %s
> --check-prefix=WITH-FDE
> +// RUN: llvm-objdump --macho --dwarf=frames %t/x86_64-no-dwarf.o |
> FileCheck %s --check-prefix=NO-FDE
> +
> +// WITH-FDE: FDE
> +// NO-FDE-NOT: FDE
> +
> +int foo() {
> +  return 1;
> +}
>
> diff  --git a/clang/test/Driver/femit-dwarf-unwind.s
> b/clang/test/Driver/femit-dwarf-unwind.s
> new file mode 100644
> index 0000000000000..f2aa821b0cd5a
> --- /dev/null
> +++ b/clang/test/Driver/femit-dwarf-unwind.s
> @@ -0,0 +1,17 @@
> +// REQUIRES: x86-registered-target
> +
> +// RUN: rm -rf %t; mkdir %t
> +// RUN: %clang -target x86_64-apple-macos11.0 -c %s -o %t/x86_64.o
> +// RUN: %clang -target x86_64-apple-macos11.0
> -femit-dwarf-unwind=no-compact-unwind -c %s -o %t/x86_64-no-dwarf.o
> +// RUN: llvm-objdump --macho --dwarf=frames %t/x86_64.o | FileCheck %s
> --check-prefix=WITH-FDE
> +// RUN: llvm-objdump --macho --dwarf=frames %t/x86_64-no-dwarf.o |
> FileCheck %s --check-prefix=NO-FDE
> +
> +// WITH-FDE: FDE
> +// NO-FDE-NOT: FDE
> +
> +.text
> +_foo:
> +  .cfi_startproc
> +  .cfi_def_cfa_offset 8
> +  ret
> +  .cfi_endproc
>
> diff  --git a/clang/tools/driver/cc1as_main.cpp
> b/clang/tools/driver/cc1as_main.cpp
> index 6a11c25553ba3..264f747d6d740 100644
> --- a/clang/tools/driver/cc1as_main.cpp
> +++ b/clang/tools/driver/cc1as_main.cpp
> @@ -137,6 +137,9 @@ struct AssemblerInvocation {
>    unsigned IncrementalLinkerCompatible : 1;
>    unsigned EmbedBitcode : 1;
>
> +  /// Whether to emit DWARF unwind info.
> +  EmitDwarfUnwindType EmitDwarfUnwind;
> +
>    /// The name of the relocation model to use.
>    std::string RelocationModel;
>
> @@ -317,6 +320,14 @@ bool
> AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
>                              .Default(0);
>    }
>
> +  if (auto *A = Args.getLastArg(OPT_femit_dwarf_unwind_EQ)) {
> +    Opts.EmitDwarfUnwind =
> +        llvm::StringSwitch<EmitDwarfUnwindType>(A->getValue())
> +            .Case("always", EmitDwarfUnwindType::Always)
> +            .Case("no-compact-unwind",
> EmitDwarfUnwindType::NoCompactUnwind)
> +            .Case("default", EmitDwarfUnwindType::Default);
> +  }
> +
>    return Success;
>  }
>
> @@ -367,6 +378,8 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation
> &Opts,
>    assert(MRI && "Unable to create target register info!");
>
>    MCTargetOptions MCOptions;
> +  MCOptions.EmitDwarfUnwind = Opts.EmitDwarfUnwind;
> +
>    std::unique_ptr<MCAsmInfo> MAI(
>        TheTarget->createMCAsmInfo(*MRI, Opts.Triple, MCOptions));
>    assert(MAI && "Unable to create target asm info!");
>
> diff  --git a/llvm/include/llvm/MC/MCContext.h
> b/llvm/include/llvm/MC/MCContext.h
> index 5b81ba31b83c5..c3a4e57fdd753 100644
> --- a/llvm/include/llvm/MC/MCContext.h
> +++ b/llvm/include/llvm/MC/MCContext.h
> @@ -67,6 +67,7 @@ template <typename T> class SmallVectorImpl;
>  class SMDiagnostic;
>  class SMLoc;
>  class SourceMgr;
> +enum class EmitDwarfUnwindType;
>
>  /// Context object for machine code objects.  This class owns all of the
>  /// sections that it creates.
> @@ -772,6 +773,7 @@ class MCContext {
>    bool getGenDwarfForAssembly() { return GenDwarfForAssembly; }
>    void setGenDwarfForAssembly(bool Value) { GenDwarfForAssembly = Value; }
>    unsigned getGenDwarfFileNumber() { return GenDwarfFileNumber; }
> +  EmitDwarfUnwindType emitDwarfUnwindInfo() const;
>
>    void setGenDwarfFileNumber(unsigned FileNumber) {
>      GenDwarfFileNumber = FileNumber;
>
> diff  --git a/llvm/include/llvm/MC/MCTargetOptions.h
> b/llvm/include/llvm/MC/MCTargetOptions.h
> index 93712a6b7d44b..9c906cdc90d02 100644
> --- a/llvm/include/llvm/MC/MCTargetOptions.h
> +++ b/llvm/include/llvm/MC/MCTargetOptions.h
> @@ -31,6 +31,12 @@ enum class DebugCompressionType {
>    Z,    ///< zlib style complession
>  };
>
> +enum class EmitDwarfUnwindType {
> +  Always,          // Always emit dwarf unwind
> +  NoCompactUnwind, // Only emit if compact unwind isn't available
> +  Default,         // Default behavior is based on the target
> +};
> +
>  class StringRef;
>
>  class MCTargetOptions {
> @@ -56,6 +62,9 @@ class MCTargetOptions {
>    bool PreserveAsmComments : 1;
>
>    bool Dwarf64 : 1;
> +
> +  EmitDwarfUnwindType EmitDwarfUnwind;
> +
>    int DwarfVersion = 0;
>
>    enum DwarfDirectory {
>
> diff  --git a/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h
> b/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h
> index 1894841989166..d51e740177f77 100644
> --- a/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h
> +++ b/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h
> @@ -20,6 +20,7 @@
>  namespace llvm {
>
>  class MCTargetOptions;
> +enum class EmitDwarfUnwindType;
>
>  namespace mc {
>
> @@ -32,6 +33,8 @@ int getDwarfVersion();
>
>  bool getDwarf64();
>
> +EmitDwarfUnwindType getEmitDwarfUnwind();
> +
>  bool getShowMCInst();
>
>  bool getFatalWarnings();
>
> diff  --git a/llvm/lib/CodeGen/LLVMTargetMachine.cpp
> b/llvm/lib/CodeGen/LLVMTargetMachine.cpp
> index af05dbced04e1..3192dcadb5f5e 100644
> --- a/llvm/lib/CodeGen/LLVMTargetMachine.cpp
> +++ b/llvm/lib/CodeGen/LLVMTargetMachine.cpp
> @@ -264,6 +264,9 @@ bool
> LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx,
>           "Cannot emit MC with limited codegen pipeline");
>
>    Ctx = &MMIWP->getMMI().getContext();
> +  // libunwind is unable to load compact unwind dynamically, so we must
> generate
> +  // DWARF unwind info for the JIT.
> +  Options.MCOptions.EmitDwarfUnwind = EmitDwarfUnwindType::Always;
>    if (Options.MCOptions.MCSaveTempLabels)
>      Ctx->setAllowTemporaryLabels(false);
>
>
> diff  --git a/llvm/lib/CodeGen/MachineModuleInfo.cpp
> b/llvm/lib/CodeGen/MachineModuleInfo.cpp
> index 07ada255eb83d..23d55a5df9f57 100644
> --- a/llvm/lib/CodeGen/MachineModuleInfo.cpp
> +++ b/llvm/lib/CodeGen/MachineModuleInfo.cpp
> @@ -60,7 +60,7 @@ MachineModuleInfo::MachineModuleInfo(MachineModuleInfo
> &&MMI)
>      : TM(std::move(MMI.TM)),
>        Context(MMI.TM.getTargetTriple(), MMI.TM.getMCAsmInfo(),
>                MMI.TM.getMCRegisterInfo(), MMI.TM.getMCSubtargetInfo(),
> nullptr,
> -              nullptr, false),
> +              &MMI.TM.Options.MCOptions, false),
>        MachineFunctions(std::move(MMI.MachineFunctions)) {
>    Context.setObjectFileInfo(MMI.TM.getObjFileLowering());
>    ObjFileMMI = MMI.ObjFileMMI;
> @@ -72,7 +72,7 @@ MachineModuleInfo::MachineModuleInfo(MachineModuleInfo
> &&MMI)
>  MachineModuleInfo::MachineModuleInfo(const LLVMTargetMachine *TM)
>      : TM(*TM), Context(TM->getTargetTriple(), TM->getMCAsmInfo(),
>                         TM->getMCRegisterInfo(), TM->getMCSubtargetInfo(),
> -                       nullptr, nullptr, false) {
> +                       nullptr, &TM->Options.MCOptions, false) {
>    Context.setObjectFileInfo(TM->getObjFileLowering());
>    initialize();
>  }
> @@ -81,7 +81,7 @@ MachineModuleInfo::MachineModuleInfo(const
> LLVMTargetMachine *TM,
>                                       MCContext *ExtContext)
>      : TM(*TM), Context(TM->getTargetTriple(), TM->getMCAsmInfo(),
>                         TM->getMCRegisterInfo(), TM->getMCSubtargetInfo(),
> -                       nullptr, nullptr, false),
> +                       nullptr, &TM->Options.MCOptions, false),
>        ExternalContext(ExtContext) {
>    Context.setObjectFileInfo(TM->getObjFileLowering());
>    initialize();
>
> diff  --git a/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> b/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> index ed912280ac826..4ac901daa5c83 100644
> --- a/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> +++ b/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> @@ -19,6 +19,7 @@
>  #include "llvm/IR/LegacyPassManager.h"
>  #include "llvm/IR/Mangler.h"
>  #include "llvm/IR/Module.h"
> +#include "llvm/MC/MCContext.h"
>  #include "llvm/Object/Archive.h"
>  #include "llvm/Object/ObjectFile.h"
>  #include "llvm/Support/DynamicLibrary.h"
>
> diff  --git a/llvm/lib/ExecutionEngine/Orc/CompileUtils.cpp
> b/llvm/lib/ExecutionEngine/Orc/CompileUtils.cpp
> index f342470052581..fad7428e1f906 100644
> --- a/llvm/lib/ExecutionEngine/Orc/CompileUtils.cpp
> +++ b/llvm/lib/ExecutionEngine/Orc/CompileUtils.cpp
> @@ -12,6 +12,7 @@
>  #include "llvm/ExecutionEngine/ObjectCache.h"
>  #include "llvm/IR/LegacyPassManager.h"
>  #include "llvm/IR/Module.h"
> +#include "llvm/MC/MCContext.h"
>  #include "llvm/Object/ObjectFile.h"
>  #include "llvm/Support/Error.h"
>  #include "llvm/Support/ErrorHandling.h"
>
> diff  --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp
> b/llvm/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp
> index 820d1dbad8f20..bc42eebf3fec9 100644
> --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp
> +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp
> @@ -95,18 +95,16 @@ void
> RTDyldMemoryManager::registerEHFramesInProcess(uint8_t *Addr,
>    // and projects/libunwind/src/UnwindLevel1-gcc-ext.c.
>    const char *P = (const char *)Addr;
>    const char *End = P + Size;
> -  do  {
> +  while (P != End)
>      P = processFDE(P, false);
> -  } while(P != End);
>  }
>
>  void RTDyldMemoryManager::deregisterEHFramesInProcess(uint8_t *Addr,
>                                                        size_t Size) {
>    const char *P = (const char *)Addr;
>    const char *End = P + Size;
> -  do  {
> +  while (P != End)
>      P = processFDE(P, true);
> -  } while(P != End);
>  }
>
>  #else
>
> diff  --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp
> index 887969fcd8410..52bf48b6d242b 100644
> --- a/llvm/lib/MC/MCContext.cpp
> +++ b/llvm/lib/MC/MCContext.cpp
> @@ -877,6 +877,12 @@ void MCContext::RemapDebugPaths() {
>  // Dwarf Management
>
>  //===----------------------------------------------------------------------===//
>
> +EmitDwarfUnwindType MCContext::emitDwarfUnwindInfo() const {
> +  if (!TargetOptions)
> +    return EmitDwarfUnwindType::Default;
> +  return TargetOptions->EmitDwarfUnwind;
> +}
> +
>  void MCContext::setGenDwarfRootFile(StringRef InputFileName, StringRef
> Buffer) {
>    // MCDwarf needs the root file as well as the compilation directory.
>    // If we find a '.file 0' directive that will supersede these values.
>
> diff  --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp
> index 6152b3e5210e2..d151b8b3f89a6 100644
> --- a/llvm/lib/MC/MCDwarf.cpp
> +++ b/llvm/lib/MC/MCDwarf.cpp
> @@ -1842,8 +1842,6 @@ template <> struct DenseMapInfo<CIEKey> {
>
>  void MCDwarfFrameEmitter::Emit(MCObjectStreamer &Streamer, MCAsmBackend
> *MAB,
>                                 bool IsEH) {
> -  Streamer.generateCompactUnwindEncodings(MAB);
> -
>    MCContext &Context = Streamer.getContext();
>    const MCObjectFileInfo *MOFI = Context.getObjectFileInfo();
>    const MCAsmInfo *AsmInfo = Context.getAsmInfo();
> @@ -1853,6 +1851,7 @@ void MCDwarfFrameEmitter::Emit(MCObjectStreamer
> &Streamer, MCAsmBackend *MAB,
>    // Emit the compact unwind info if available.
>    bool NeedsEHFrameSection =
> !MOFI->getSupportsCompactUnwindWithoutEHFrame();
>    if (IsEH && MOFI->getCompactUnwindSection()) {
> +    Streamer.generateCompactUnwindEncodings(MAB);
>      bool SectionEmitted = false;
>      for (const MCDwarfFrameInfo &Frame : FrameArray) {
>        if (Frame.CompactUnwindEncoding == 0) continue;
>
> diff  --git a/llvm/lib/MC/MCObjectFileInfo.cpp
> b/llvm/lib/MC/MCObjectFileInfo.cpp
> index 0d08976d98942..bb39e5aaad7f4 100644
> --- a/llvm/lib/MC/MCObjectFileInfo.cpp
> +++ b/llvm/lib/MC/MCObjectFileInfo.cpp
> @@ -64,8 +64,18 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(const
> Triple &T) {
>        (T.getArch() == Triple::aarch64 || T.getArch() ==
> Triple::aarch64_32))
>      SupportsCompactUnwindWithoutEHFrame = true;
>
> -  if (T.isWatchABI())
> +  switch (Ctx->emitDwarfUnwindInfo()) {
> +  case EmitDwarfUnwindType::Always:
> +    OmitDwarfIfHaveCompactUnwind = false;
> +    break;
> +  case EmitDwarfUnwindType::NoCompactUnwind:
>      OmitDwarfIfHaveCompactUnwind = true;
> +    break;
> +  case EmitDwarfUnwindType::Default:
> +    OmitDwarfIfHaveCompactUnwind =
> +        T.isWatchABI() || SupportsCompactUnwindWithoutEHFrame;
> +    break;
> +  }
>
>    FDECFIEncoding = dwarf::DW_EH_PE_pcrel;
>
>
> diff  --git a/llvm/lib/MC/MCTargetOptions.cpp
> b/llvm/lib/MC/MCTargetOptions.cpp
> index bb48182c6622b..c2946da3ee66f 100644
> --- a/llvm/lib/MC/MCTargetOptions.cpp
> +++ b/llvm/lib/MC/MCTargetOptions.cpp
> @@ -17,6 +17,7 @@ MCTargetOptions::MCTargetOptions()
>        MCSaveTempLabels(false), MCIncrementalLinkerCompatible(false),
>        ShowMCEncoding(false), ShowMCInst(false), AsmVerbose(false),
>        PreserveAsmComments(true), Dwarf64(false),
> +      EmitDwarfUnwind(EmitDwarfUnwindType::Default),
>        MCUseDwarfDirectory(DefaultDwarfDirectory) {}
>
>  StringRef MCTargetOptions::getABIName() const {
>
> diff  --git a/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp
> b/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp
> index 762c8d43063c7..a310dc894021f 100644
> --- a/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp
> +++ b/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp
> @@ -1,5 +1,4 @@
> -//===-- MCTargetOptionsCommandFlags.cpp --------------------------*- C++
> -//-*-===//
> +//===-- MCTargetOptionsCommandFlags.cpp -----------------------*- C++
> //-*-===//
>  //
>  // Part of the LLVM Project, under the Apache License v2.0 with LLVM
> Exceptions.
>  // See https://llvm.org/LICENSE.txt for license information.
> @@ -39,6 +38,7 @@ MCOPT_EXP(bool, RelaxAll)
>  MCOPT(bool, IncrementalLinkerCompatible)
>  MCOPT(int, DwarfVersion)
>  MCOPT(bool, Dwarf64)
> +MCOPT(EmitDwarfUnwindType, EmitDwarfUnwind)
>  MCOPT(bool, ShowMCInst)
>  MCOPT(bool, FatalWarnings)
>  MCOPT(bool, NoWarn)
> @@ -73,6 +73,19 @@
> llvm::mc::RegisterMCTargetOptionsFlags::RegisterMCTargetOptionsFlags() {
>        cl::desc("Generate debugging info in the 64-bit DWARF format"));
>    MCBINDOPT(Dwarf64);
>
> +  static cl::opt<EmitDwarfUnwindType> EmitDwarfUnwind(
> +      "emit-dwarf-unwind", cl::desc("Whether to emit DWARF EH frame
> entries."),
> +      cl::init(EmitDwarfUnwindType::Default),
> +      cl::values(clEnumValN(EmitDwarfUnwindType::Always, "always",
> +                            "Always emit EH frame entries"),
> +                 clEnumValN(EmitDwarfUnwindType::NoCompactUnwind,
> +                            "no-compact-unwind",
> +                            "Only emit EH frame entries when compact
> unwind is "
> +                            "not available"),
> +                 clEnumValN(EmitDwarfUnwindType::Default, "default",
> +                            "Use target platform default")));
> +  MCBINDOPT(EmitDwarfUnwind);
> +
>    static cl::opt<bool> ShowMCInst(
>        "asm-show-inst",
>        cl::desc("Emit internal instruction representation to assembly
> file"));
> @@ -116,5 +129,7 @@ MCTargetOptions
> llvm::mc::InitMCTargetOptionsFromFlags() {
>    Options.MCNoWarn = getNoWarn();
>    Options.MCNoDeprecatedWarn = getNoDeprecatedWarn();
>    Options.MCNoTypeCheck = getNoTypeCheck();
> +  Options.EmitDwarfUnwind = getEmitDwarfUnwind();
> +
>    return Options;
>  }
>
> diff  --git a/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
> b/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
> index f09c3b36ff3a8..2d92b8d5b574b 100644
> --- a/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
> +++ b/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
> @@ -1377,7 +1377,7 @@ class DarwinX86AsmBackend : public X86AsmBackend {
>        default:
>          // Any other CFI directives indicate a frame that we aren't
> prepared
>          // to represent via compact unwind, so just bail out.
> -        return 0;
> +        return CU::UNWIND_MODE_DWARF;
>        case MCCFIInstruction::OpDefCfaRegister: {
>          // Defines a frame pointer. E.g.
>          //
> @@ -1391,7 +1391,7 @@ class DarwinX86AsmBackend : public X86AsmBackend {
>          // generate a compact unwinding representation, so bail out.
>          if (*MRI.getLLVMRegNum(Inst.getRegister(), true) !=
>              (Is64Bit ? X86::RBP : X86::EBP))
> -          return 0;
> +          return CU::UNWIND_MODE_DWARF;
>
>          // Reset the counts.
>          memset(SavedRegs, 0, sizeof(SavedRegs));
>
> diff  --git a/llvm/test/MC/MachO/AArch64/emit-dwarf-unwind.s
> b/llvm/test/MC/MachO/AArch64/emit-dwarf-unwind.s
> new file mode 100644
> index 0000000000000..89dc56b8aa87f
> --- /dev/null
> +++ b/llvm/test/MC/MachO/AArch64/emit-dwarf-unwind.s
> @@ -0,0 +1,33 @@
> +// RUN: rm -rf %t; mkdir %t
> +// RUN: llvm-mc -triple x86_64-apple-macos11.0 %s -filetype=obj -o
> %t/x86_64.o
> +// RUN: llvm-objdump --macho --dwarf=frames %t/x86_64.o | FileCheck %s
> --check-prefix TWO-FDES
> +// RUN: llvm-mc -triple arm64-apple-macos11.0 %s -filetype=obj -o
> %t/arm64.o
> +// RUN: llvm-objdump --macho --dwarf=frames %t/arm64.o | FileCheck %s
> --check-prefix ONE-FDE
> +// RUN: llvm-mc -triple x86_64-apple-macos11.0 %s -filetype=obj
> --emit-dwarf-unwind no-compact-unwind -o %t/x86_64-no-dwarf.o
> +// RUN: llvm-objdump --macho --dwarf=frames %t/x86_64-no-dwarf.o |
> FileCheck %s --check-prefix ONE-FDE
> +// RUN: llvm-mc -triple arm64-apple-macos11.0 %s -filetype=obj
> --emit-dwarf-unwind always -o %t/arm64-dwarf.o
> +// RUN: llvm-objdump --macho --dwarf=frames %t/arm64-dwarf.o | FileCheck
> %s --check-prefix TWO-FDES
> +
> +// TWO-FDES: FDE
> +// TWO-FDES: FDE
> +
> +// ONE-FDE-NOT: FDE
> +// ONE-FDE:     FDE
> +// ONE-FDE-NOT: FDE
> +
> +_main:
> +  .cfi_startproc
> +  .cfi_def_cfa_offset 16
> +  ret
> +  .cfi_endproc
> +
> +_foo:
> +  .cfi_startproc
> +  .cfi_def_cfa_offset 16
> +  /// This encodes DW_CFA_GNU_args_size which cannot be expressed using
> compact
> +  /// unwind, so we must use DWARf unwind for this function.
> +  .cfi_escape 0x2e, 0x10
> +  ret
> +  .cfi_endproc
> +
> +.subsections_via_symbols
>
> diff  --git a/llvm/test/MC/X86/compact-unwind-mode-dwarf.s
> b/llvm/test/MC/X86/compact-unwind-mode-dwarf.s
> new file mode 100644
> index 0000000000000..ca051b07b59ef
> --- /dev/null
> +++ b/llvm/test/MC/X86/compact-unwind-mode-dwarf.s
> @@ -0,0 +1,50 @@
> +// RUN: llvm-mc -triple x86_64-apple-macos10.6 -filetype=obj %s -o %t.o
> +// RUN: llvm-objdump --macho --unwind-info --dwarf=frames %t.o |
> FileCheck %s
> +
> +/// For functions whose unwind info cannot be encoded with compact
> unwind, make
> +/// sure that we encode them using DWARF unwind, and make sure we emit a
> compact
> +/// unwind entry that indicates that a DWARF encoding is being used.
> +
> +_f:
> +  .cfi_startproc
> +  ## This encodes DW_CFA_GNU_args_size which cannot be expressed using
> compact
> +  ## unwind, so we must use DWARF unwind instead.
> +  .cfi_escape 0x2e, 0x10
> +  ret
> +  .cfi_endproc
> +
> +_g:
> +  .cfi_startproc
> +  ## This encodes DW_CFA_GNU_args_size which cannot be expressed using
> compact
> +  ## unwind, so we must use DWARF unwind instead.
> +  .cfi_escape 0x2e, 0x10
> +  ret
> +  .cfi_endproc
> +
> +// CHECK: Contents of __compact_unwind section:
> +// CHECK:   Entry at offset 0x0:
> +// CHECK:     start:                0x[[#%x,F:]] _f
> +// CHECK:     length:               0x1
> +// CHECK:     compact encoding:     0x04000000
> +// CHECK:   Entry at offset 0x20:
> +// CHECK:     start:                0x[[#%x,G:]] _g
> +// CHECK:     length:               0x1
> +// CHECK:     compact encoding:     0x04000000
> +
> +// CHECK: .eh_frame contents:
> +// CHECK: 00000000 00000014 00000000 CIE
> +// CHECK:   Format:                DWARF32
> +// CHECK:   Version:               1
> +// CHECK:   Augmentation:          "zR"
> +// CHECK:   Code alignment factor: 1
> +// CHECK:   Data alignment factor: -8
> +// CHECK:   Return address column: 16
> +// CHECK:   Augmentation data:     10
> +
> +// CHECK: FDE cie=00000000 pc=[[#%.8x,F]]...
> +// CHECK:   Format:       DWARF32
> +// CHECK:   DW_CFA_GNU_args_size: +16
> +
> +// CHECK: FDE cie=00000000 pc=[[#%.8x,G]]...
> +// CHECK:   Format:       DWARF32
> +// CHECK:   DW_CFA_GNU_args_size: +16
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220613/13f1611d/attachment-0001.html>


More information about the cfe-commits mailing list