[llvm] abc7f68 - [Dsymutil][Debuginfo][NFC] Refactor dsymutil to separate DWARF optimizing part 2.

Alexey Lapshin via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 20 02:00:03 PST 2019


Hi Eric,

     Thank you for taking care of this. Yes there is a dependency cycle 
in my patch: CodeGen->AsmPrinter->DebugInfoDWARF->CodeGen. I would fix 
it, Thanks! Do you know whether there is some machinery to detect such 
cases ? Usual "check-all" build did not report any problem.

Thank you, Alexey.

20.12.2019 0:31, Eric Christopher пишет:
> Hi Alexey,
>
> I've temporarily reverted this here:
>
> echristo at athyra ~/r/llvm-project> git push
> To github.com:llvm/llvm-project.git
>    918d3939722..3075cd5c9fc  master -> master
>
> as this caused a layering violation/dependency cycle in the build 
> graph. If you need any help looking into this let me or Tobias know :)
>
> Thanks and sorry for the inconvenience!
>
> -eric
>
> On Thu, Dec 19, 2019 at 4:42 AM Alexey Lapshin via llvm-commits 
> <llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>> wrote:
>
>
>     Author: Alexey Lapshin
>     Date: 2019-12-19T15:41:48+03:00
>     New Revision: abc7f6800df8a1f40e1e2c9ccce826abb0208284
>
>     URL:
>     https://github.com/llvm/llvm-project/commit/abc7f6800df8a1f40e1e2c9ccce826abb0208284
>     DIFF:
>     https://github.com/llvm/llvm-project/commit/abc7f6800df8a1f40e1e2c9ccce826abb0208284.diff
>
>     LOG: [Dsymutil][Debuginfo][NFC] Refactor dsymutil to separate
>     DWARF optimizing part 2.
>
>     That patch is extracted from the D70709. It moves CompileUnit,
>     DeclContext
>     into llvm/DebugInfo/DWARF. It also adds new file DWARFOptimizer with
>     AddressesMap class. AddressesMap generalizes functionality
>     from RelocationManager.
>
>     Differential Revision: https://reviews.llvm.org/D71271
>
>     Added:
>         llvm/include/llvm/DebugInfo/DWARF/DWARFOptCompileUnit.h
>         llvm/include/llvm/DebugInfo/DWARF/DWARFOptDeclContext.h
>         llvm/include/llvm/DebugInfo/DWARF/DWARFOptimizer.h
>         llvm/lib/DebugInfo/DWARF/DWARFOptCompileUnit.cpp
>         llvm/lib/DebugInfo/DWARF/DWARFOptDeclContext.cpp
>         llvm/lib/DebugInfo/DWARF/DWARFOptimizer.cpp
>
>     Modified:
>         llvm/lib/DebugInfo/DWARF/CMakeLists.txt
>         llvm/lib/DebugInfo/DWARF/LLVMBuild.txt
>         llvm/tools/dsymutil/CMakeLists.txt
>         llvm/tools/dsymutil/DwarfLinker.cpp
>         llvm/tools/dsymutil/DwarfLinker.h
>         llvm/tools/dsymutil/DwarfStreamer.cpp
>         llvm/tools/dsymutil/DwarfStreamer.h
>
>     Removed:
>         llvm/tools/dsymutil/CompileUnit.cpp
>         llvm/tools/dsymutil/CompileUnit.h
>         llvm/tools/dsymutil/DeclContext.cpp
>         llvm/tools/dsymutil/DeclContext.h
>
>
>     ################################################################################
>     diff  --git a/llvm/tools/dsymutil/CompileUnit.h
>     b/llvm/include/llvm/DebugInfo/DWARF/DWARFOptCompileUnit.h
>     similarity index 97%
>     rename from llvm/tools/dsymutil/CompileUnit.h
>     rename to llvm/include/llvm/DebugInfo/DWARF/DWARFOptCompileUnit.h
>     index e0f5d3bc65b2..010862966846 100644
>     --- a/llvm/tools/dsymutil/CompileUnit.h
>     +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFOptCompileUnit.h
>     @@ -1,4 +1,4 @@
>     -//===- tools/dsymutil/CompileUnit.h - Dwarf debug info linker
>     ---*- C++ -*-===//
>     +//===- DWARFOptCompileUnit.h
>     ------------------------------------*- C++ -*-===//
>      //
>      // Part of the LLVM Project, under the Apache License v2.0 with
>     LLVM Exceptions.
>      // See https://llvm.org/LICENSE.txt for license information.
>     @@ -6,15 +6,15 @@
>      //
>      //===----------------------------------------------------------------------===//
>
>     -#ifndef LLVM_TOOLS_DSYMUTIL_COMPILEUNIT_H
>     -#define LLVM_TOOLS_DSYMUTIL_COMPILEUNIT_H
>     +#ifndef LLVM_DEBUGINFO_DWARF_OPT_COMPILEUNIT_H
>     +#define LLVM_DEBUGINFO_DWARF_OPT_COMPILEUNIT_H
>
>      #include "llvm/ADT/IntervalMap.h"
>      #include "llvm/CodeGen/DIE.h"
>      #include "llvm/DebugInfo/DWARF/DWARFUnit.h"
>     +#include "llvm/Support/DataExtractor.h"
>
>      namespace llvm {
>     -namespace dsymutil {
>
>      class DeclContext;
>
>     @@ -46,7 +46,7 @@ struct PatchLocation {
>      };
>
>      /// Stores all information relating to a compile unit, be it in
>     its original
>     -/// instance in the object file to its brand new cloned and
>     linked DIE tree.
>     +/// instance in the object file to its brand new cloned and
>     generated DIE tree.
>      class CompileUnit {
>      public:
>        /// Information gathered about a DIE in the object file.
>     @@ -325,7 +325,6 @@ class CompileUnit {
>        std::string ClangModuleName;
>      };
>
>     -} // end namespace dsymutil
>      } // end namespace llvm
>
>     -#endif // LLVM_TOOLS_DSYMUTIL_COMPILEUNIT_H
>     +#endif // LLVM_DEBUGINFO_DWARF_OPT_COMPILEUNIT_H
>
>     diff  --git a/llvm/tools/dsymutil/DeclContext.h
>     b/llvm/include/llvm/DebugInfo/DWARF/DWARFOptDeclContext.h
>     similarity index 95%
>     rename from llvm/tools/dsymutil/DeclContext.h
>     rename to llvm/include/llvm/DebugInfo/DWARF/DWARFOptDeclContext.h
>     index 36ef50944083..6045ed72b259 100644
>     --- a/llvm/tools/dsymutil/DeclContext.h
>     +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFOptDeclContext.h
>     @@ -1,4 +1,4 @@
>     -//===- tools/dsymutil/DeclContext.h - Dwarf debug info linker
>     ---*- C++ -*-===//
>     +//===- llvm/DebugInfo/DWARF/DWARFOptDeclContext.h
>     ---------------*- C++ -*-===//
>      //
>      // Part of the LLVM Project, under the Apache License v2.0 with
>     LLVM Exceptions.
>      // See https://llvm.org/LICENSE.txt for license information.
>     @@ -6,20 +6,19 @@
>      //
>      //===----------------------------------------------------------------------===//
>
>     -#ifndef LLVM_TOOLS_DSYMUTIL_DECLCONTEXT_H
>     -#define LLVM_TOOLS_DSYMUTIL_DECLCONTEXT_H
>     +#ifndef LLVM_DEBUGINFO_DWARF_OPT_DECLCONTEXT_H
>     +#define LLVM_DEBUGINFO_DWARF_OPT_DECLCONTEXT_H
>
>     -#include "CompileUnit.h"
>      #include "llvm/ADT/DenseMap.h"
>      #include "llvm/ADT/DenseMapInfo.h"
>      #include "llvm/ADT/DenseSet.h"
>      #include "llvm/ADT/StringRef.h"
>      #include "llvm/CodeGen/NonRelocatableStringpool.h"
>      #include "llvm/DebugInfo/DWARF/DWARFDie.h"
>     +#include "llvm/DebugInfo/DWARF/DWARFOptCompileUnit.h"
>      #include "llvm/Support/Path.h"
>
>      namespace llvm {
>     -namespace dsymutil {
>
>      struct DeclMapInfo;
>
>     @@ -165,7 +164,6 @@ struct DeclMapInfo : private
>     DenseMapInfo<DeclContext *> {
>        }
>      };
>
>     -} // end namespace dsymutil
>      } // end namespace llvm
>
>     -#endif // LLVM_TOOLS_DSYMUTIL_DECLCONTEXT_H
>     +#endif // LLVM_DEBUGINFO_DWARF_OPT_DECLCONTEXT_H
>
>     diff  --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFOptimizer.h
>     b/llvm/include/llvm/DebugInfo/DWARF/DWARFOptimizer.h
>     new file mode 100644
>     index 000000000000..5700c97a92fe
>     --- /dev/null
>     +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFOptimizer.h
>     @@ -0,0 +1,86 @@
>     +//===- llvm/DebugInfo/DWARF/DWARFOptimizer.h
>     --------------------*- C++ -*-===//
>     +//
>     +// Part of the LLVM Project, under the Apache License v2.0 with
>     LLVM Exceptions.
>     +// See https://llvm.org/LICENSE.txt for license information.
>     +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
>     +//
>     +//===----------------------------------------------------------------------===//
>     +
>     +#ifndef LLVM_DEBUGINFO_DWARFOPTIMIZER_H
>     +#define LLVM_DEBUGINFO_DWARFOPTIMIZER_H
>     +
>     +#include "llvm/CodeGen/NonRelocatableStringpool.h"
>     +#include "llvm/DebugInfo/DWARF/DWARFCompileUnit.h"
>     +#include "llvm/DebugInfo/DWARF/DWARFContext.h"
>     +#include "llvm/DebugInfo/DWARF/DWARFOptDeclContext.h"
>     +#include <map>
>     +
>     +namespace llvm {
>     +
>     +enum class DwarfOptimizerClient { Dsymutil, LLD, General };
>     +
>     +/// Partial address range. Besides an offset, only the
>     +/// HighPC is stored. The structure is stored in a map where the
>     LowPC is the
>     +/// key.
>     +struct ObjFileAddressRange {
>     +  /// Function HighPC.
>     +  uint64_t HighPC;
>     +  /// Offset to apply to the linked address.
>     +  /// should be 0 for not-linked object file.
>     +  int64_t Offset;
>     +
>     +  ObjFileAddressRange(uint64_t EndPC, int64_t Offset)
>     +      : HighPC(EndPC), Offset(Offset) {}
>     +
>     +  ObjFileAddressRange() : HighPC(0), Offset(0) {}
>     +};
>     +
>     +/// Map LowPC to ObjFileAddressRange.
>     +using RangesTy = std::map<uint64_t, ObjFileAddressRange>;
>     +
>     +/// AddressesMap represents information about valid addresses used
>     +/// by debug information. Valid addresses are those which points to
>     +/// live code sections. i.e. relocations for these addresses point
>     +/// into sections which would be/are placed into resulting binary.
>     +class AddressesMap {
>     +public:
>     +  virtual ~AddressesMap();
>     +
>     +  /// Returns true if represented addresses are from linked file.
>     +  /// Returns false if represented addresses are from not-linked
>     +  /// object file.
>     +  virtual bool areRelocationsResolved() const = 0;
>     +
>     +  /// Checks that there are valid relocations against a .debug_info
>     +  /// section. Reset current relocation pointer if neccessary.
>     +  virtual bool hasValidRelocs(bool resetRelocsPtr = true) = 0;
>     +
>     +  /// Checks that there is a relocation against .debug_info
>     +  /// table between \p StartOffset and \p NextOffset.
>     +  ///
>     +  /// This function must be called with offsets in strictly ascending
>     +  /// order because it never looks back at relocations it already
>     'went past'.
>     +  /// \returns true and sets Info.InDebugMap if it is the case.
>     +  virtual bool hasValidRelocationAt(uint64_t StartOffset,
>     uint64_t EndOffset,
>     +                                    CompileUnit::DIEInfo &Info) = 0;
>     +
>     +  /// Apply the valid relocations to the buffer \p Data, taking into
>     +  /// account that Data is at \p BaseOffset in the debug_info
>     section.
>     +  ///
>     +  /// This function must be called with monotonic \p BaseOffset
>     values.
>     +  ///
>     +  /// \returns true whether any reloc has been applied.
>     +  virtual bool applyValidRelocs(MutableArrayRef<char> Data,
>     uint64_t BaseOffset,
>     +                                bool IsLittleEndian) = 0;
>     +
>     +  /// Returns all valid functions address ranges(i.e., those ranges
>     +  /// which points to sections with code).
>     +  virtual RangesTy &getValidAddressRanges() = 0;
>     +
>     +  /// Erases all data.
>     +  virtual void clear() = 0;
>     +};
>     +
>     +} // end namespace llvm
>     +
>     +#endif // LLVM_DEBUGINFO_DWARFOPTIMIZER_H
>
>     diff  --git a/llvm/lib/DebugInfo/DWARF/CMakeLists.txt
>     b/llvm/lib/DebugInfo/DWARF/CMakeLists.txt
>     index 3fe9904f221b..d51fe2653631 100644
>     --- a/llvm/lib/DebugInfo/DWARF/CMakeLists.txt
>     +++ b/llvm/lib/DebugInfo/DWARF/CMakeLists.txt
>     @@ -27,6 +27,9 @@ add_llvm_component_library(LLVMDebugInfoDWARF
>        DWARFUnitIndex.cpp
>        DWARFUnit.cpp
>        DWARFVerifier.cpp
>     +  DWARFOptCompileUnit.cpp
>     +  DWARFOptDeclContext.cpp
>     +  DWARFOptimizer.cpp
>
>        ADDITIONAL_HEADER_DIRS
>        ${LLVM_MAIN_INCLUDE_DIR}/llvm/DebugInfo/DWARF
>
>     diff  --git a/llvm/tools/dsymutil/CompileUnit.cpp
>     b/llvm/lib/DebugInfo/DWARF/DWARFOptCompileUnit.cpp
>     similarity index 96%
>     rename from llvm/tools/dsymutil/CompileUnit.cpp
>     rename to llvm/lib/DebugInfo/DWARF/DWARFOptCompileUnit.cpp
>     index 036c61a6b926..6ca5f1289283 100644
>     --- a/llvm/tools/dsymutil/CompileUnit.cpp
>     +++ b/llvm/lib/DebugInfo/DWARF/DWARFOptCompileUnit.cpp
>     @@ -1,4 +1,4 @@
>     -//===- tools/dsymutil/CompileUnit.h - Dwarf compile unit
>     ------------------===//
>     +//===- llvm/DebugInfo/DWARF/DWARFOptCompileUnit.cpp
>     -----------------------===//
>      //
>      // Part of the LLVM Project, under the Apache License v2.0 with
>     LLVM Exceptions.
>      // See https://llvm.org/LICENSE.txt for license information.
>     @@ -6,11 +6,10 @@
>      //
>      //===----------------------------------------------------------------------===//
>
>     -#include "CompileUnit.h"
>     -#include "DeclContext.h"
>     +#include "llvm/DebugInfo/DWARF/DWARFOptCompileUnit.h"
>     +#include "llvm/DebugInfo/DWARF/DWARFOptDeclContext.h"
>
>      namespace llvm {
>     -namespace dsymutil {
>
>      /// Check if the DIE at \p Idx is in the scope of a function.
>      static bool inFunctionScope(CompileUnit &U, unsigned Idx) {
>     @@ -142,5 +141,4 @@ void CompileUnit::addTypeAccelerator(const DIE
>     *Die,
>        Pubtypes.emplace_back(Name, Die, QualifiedNameHash,
>     ObjcClassImplementation);
>      }
>
>     -} // namespace dsymutil
>      } // namespace llvm
>
>     diff  --git a/llvm/tools/dsymutil/DeclContext.cpp
>     b/llvm/lib/DebugInfo/DWARF/DWARFOptDeclContext.cpp
>     similarity index 98%
>     rename from llvm/tools/dsymutil/DeclContext.cpp
>     rename to llvm/lib/DebugInfo/DWARF/DWARFOptDeclContext.cpp
>     index 1c33b672c26b..95cf58444e1a 100644
>     --- a/llvm/tools/dsymutil/DeclContext.cpp
>     +++ b/llvm/lib/DebugInfo/DWARF/DWARFOptDeclContext.cpp
>     @@ -1,4 +1,4 @@
>     -//===- tools/dsymutil/DeclContext.cpp - Declaration context
>     ---------------===//
>     +//===- llvm/DebugInfo/DWARF/DWARFOptDeclContext.cpp
>     -----------------------===//
>      //
>      // Part of the LLVM Project, under the Apache License v2.0 with
>     LLVM Exceptions.
>      // See https://llvm.org/LICENSE.txt for license information.
>     @@ -6,13 +6,12 @@
>      //
>      //===----------------------------------------------------------------------===//
>
>     -#include "DeclContext.h"
>     +#include "llvm/DebugInfo/DWARF/DWARFOptDeclContext.h"
>      #include "llvm/DebugInfo/DWARF/DWARFContext.h"
>      #include "llvm/DebugInfo/DWARF/DWARFDie.h"
>      #include "llvm/DebugInfo/DWARF/DWARFUnit.h"
>
>      namespace llvm {
>     -namespace dsymutil {
>
>      /// Set the last DIE/CU a context was seen in and, possibly
>     invalidate the
>      /// context if it is ambiguous.
>     @@ -206,5 +205,5 @@ PointerIntPair<DeclContext *, 1>
>     DeclContextTree::getChildDeclContext(
>
>        return PointerIntPair<DeclContext *, 1>(*ContextIter);
>      }
>     -} // namespace dsymutil
>     +
>      } // namespace llvm
>
>     diff  --git a/llvm/lib/DebugInfo/DWARF/DWARFOptimizer.cpp
>     b/llvm/lib/DebugInfo/DWARF/DWARFOptimizer.cpp
>     new file mode 100644
>     index 000000000000..535d2a047076
>     --- /dev/null
>     +++ b/llvm/lib/DebugInfo/DWARF/DWARFOptimizer.cpp
>     @@ -0,0 +1,15 @@
>     +//=== llvm/DebugInfo/DWARF/DWARFOptimizer.cpp
>     -----------------------------===//
>     +//
>     +// Part of the LLVM Project, under the Apache License v2.0 with
>     LLVM Exceptions.
>     +// See https://llvm.org/LICENSE.txt for license information.
>     +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
>     +//
>     +//===----------------------------------------------------------------------===//
>     +
>     +#include "llvm/DebugInfo/DWARF/DWARFOptimizer.h"
>     +
>     +namespace llvm {
>     +
>     +AddressesMap::~AddressesMap() {}
>     +
>     +} // namespace llvm
>
>     diff  --git a/llvm/lib/DebugInfo/DWARF/LLVMBuild.txt
>     b/llvm/lib/DebugInfo/DWARF/LLVMBuild.txt
>     index 182be10f0b4c..e72360deaf88 100644
>     --- a/llvm/lib/DebugInfo/DWARF/LLVMBuild.txt
>     +++ b/llvm/lib/DebugInfo/DWARF/LLVMBuild.txt
>     @@ -18,4 +18,4 @@
>      type = Library
>      name = DebugInfoDWARF
>      parent = DebugInfo
>     -required_libraries = BinaryFormat Object MC Support
>     +required_libraries = BinaryFormat Object MC Support CodeGen
>
>     diff  --git a/llvm/tools/dsymutil/CMakeLists.txt
>     b/llvm/tools/dsymutil/CMakeLists.txt
>     index b8466baa6346..e21215b2417d 100644
>     --- a/llvm/tools/dsymutil/CMakeLists.txt
>     +++ b/llvm/tools/dsymutil/CMakeLists.txt
>     @@ -22,9 +22,7 @@ add_llvm_tool(dsymutil
>        dsymutil.cpp
>        BinaryHolder.cpp
>        CFBundle.cpp
>     -  CompileUnit.cpp
>        DebugMap.cpp
>     -  DeclContext.cpp
>        DwarfLinker.cpp
>        DwarfStreamer.cpp
>        MachODebugMapParser.cpp
>
>     diff  --git a/llvm/tools/dsymutil/DwarfLinker.cpp
>     b/llvm/tools/dsymutil/DwarfLinker.cpp
>     index 64acab698434..521d3635dab2 100644
>     --- a/llvm/tools/dsymutil/DwarfLinker.cpp
>     +++ b/llvm/tools/dsymutil/DwarfLinker.cpp
>     @@ -9,7 +9,6 @@
>      #include "DwarfLinker.h"
>      #include "BinaryHolder.h"
>      #include "DebugMap.h"
>     -#include "DeclContext.h"
>      #include "DwarfStreamer.h"
>      #include "MachOUtils.h"
>      #include "dsymutil.h"
>     @@ -45,6 +44,7 @@
>      #include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h"
>      #include "llvm/DebugInfo/DWARF/DWARFDie.h"
>      #include "llvm/DebugInfo/DWARF/DWARFFormValue.h"
>     +#include "llvm/DebugInfo/DWARF/DWARFOptDeclContext.h"
>      #include "llvm/DebugInfo/DWARF/DWARFSection.h"
>      #include "llvm/DebugInfo/DWARF/DWARFUnit.h"
>      #include "llvm/MC/MCAsmBackend.h"
>     @@ -374,30 +374,6 @@ static bool
>     dieNeedsChildrenToBeMeaningful(uint32_t Tag) {
>      }
>
>      void DwarfLinker::startDebugObject(LinkContext &Context) {
>     -  // Iterate over the debug map entries and put all the ones that are
>     -  // functions (because they have a size) into the Ranges map.
>     This map is
>     -  // very similar to the FunctionRanges that are stored in each
>     unit, with 2
>     -  // notable
>     diff erences:
>     -  //
>     -  //  1. Obviously this one is global, while the other ones are
>     per-unit.
>     -  //
>     -  //  2. This one contains not only the functions described in
>     the DIE
>     -  //     tree, but also the ones that are only in the debug map.
>     -  //
>     -  // The latter information is required to reproduce dsymutil's
>     logic while
>     -  // linking line tables. The cases where this information
>     matters look like
>     -  // bugs that need to be investigated, but for now we need to
>     reproduce
>     -  // dsymutil's behavior.
>     -  // FIXME: Once we understood exactly if that information is needed,
>     -  // maybe totally remove this (or try to use it to do a real
>     -  // -gline-tables-only on Darwin.
>     -  for (const auto &Entry : Context.DMO.symbols()) {
>     -    const auto &Mapping = Entry.getValue();
>     -    if (Mapping.Size && Mapping.ObjectAddress)
>     -      Context.Ranges[*Mapping.ObjectAddress] = DebugMapObjectRange(
>     -          *Mapping.ObjectAddress + Mapping.Size,
>     -          int64_t(Mapping.BinaryAddress) - *Mapping.ObjectAddress);
>     -  }
>      }
>
>      void DwarfLinker::endDebugObject(LinkContext &Context) {
>     @@ -560,7 +536,7 @@ bool
>     DwarfLinker::RelocationManager::findValidRelocsInDebugInfo(
>      /// This function must be called with offsets in strictly ascending
>      /// order because it never looks back at relocations it already
>     'went past'.
>      /// \returns true and sets Info.InDebugMap if it is the case.
>     -bool DwarfLinker::RelocationManager::hasValidRelocation(
>     +bool DwarfLinker::RelocationManager::hasValidRelocationAt(
>          uint64_t StartOffset, uint64_t EndOffset,
>     CompileUnit::DIEInfo &Info) {
>        assert(NextValidReloc == 0 ||
>               StartOffset > ValidRelocs[NextValidReloc - 1].Offset);
>     @@ -651,7 +627,8 @@ unsigned
>     DwarfLinker::shouldKeepVariableDIE(RelocationManager &RelocMgr,
>        // always check if the variable has a valid relocation, so that the
>        // DIEInfo is filled. However, we don't want a static variable in a
>        // function to force us to keep the enclosing function.
>     -  if (!RelocMgr.hasValidRelocation(LocationOffset,
>     LocationEndOffset, MyInfo) ||
>     +  if (!RelocMgr.hasValidRelocationAt(LocationOffset,
>     LocationEndOffset,
>     +                                     MyInfo) ||
>            (Flags & TF_InFunctionScope))
>          return Flags;
>
>     @@ -689,7 +666,7 @@ unsigned DwarfLinker::shouldKeepSubprogramDIE(
>        auto LowPc = dwarf::toAddress(DIE.find(dwarf::DW_AT_low_pc));
>        assert(LowPc.hasValue() && "low_pc attribute is not an address.");
>        if (!LowPc ||
>     -      !RelocMgr.hasValidRelocation(LowPcOffset, LowPcEndOffset,
>     MyInfo))
>     +      !RelocMgr.hasValidRelocationAt(LowPcOffset, LowPcEndOffset,
>     MyInfo))
>          return Flags;
>
>        if (Options.Verbose) {
>     @@ -724,7 +701,7 @@ unsigned DwarfLinker::shouldKeepSubprogramDIE(
>        }
>
>        // Replace the debug map range with a more accurate one.
>     -  Ranges[*LowPc] = DebugMapObjectRange(*HighPc, MyInfo.AddrAdjust);
>     +  Ranges[*LowPc] = ObjFileAddressRange(*HighPc, MyInfo.AddrAdjust);
>        Unit.addFunctionRange(*LowPc, *HighPc, MyInfo.AddrAdjust);
>        return Flags;
>      }
>     @@ -1651,7 +1628,8 @@ DIE *DwarfLinker::DIECloner::cloneDIE(
>        Data =
>            DWARFDataExtractor(DIECopy, Data.isLittleEndian(),
>     Data.getAddressSize());
>        // Modify the copy with relocated addresses.
>     -  if (RelocMgr.applyValidRelocs(DIECopy, Offset,
>     Data.isLittleEndian())) {
>     +  if (RelocMgr.areRelocationsResolved() &&
>     +      RelocMgr.applyValidRelocs(DIECopy, Offset,
>     Data.isLittleEndian())) {
>          // If we applied relocations, we store the value of high_pc
>     that was
>          // potentially stored in the input DIE. If high_pc is an address
>          // (Dwarf version == 2), then it might have been relocated to a
>     @@ -2393,7 +2371,7 @@ Error DwarfLinker::loadClangModule(
>
>        // Setup access to the debug info.
>        auto DwarfContext = DWARFContext::create(*ErrOrObj);
>     -  RelocationManager RelocMgr(*this);
>     +  RelocationManager RelocMgr(*this, *ErrOrObj, DMO);
>
>        for (const auto &CU : DwarfContext->compile_units()) {
>          updateDwarfVersion(CU->getVersion());
>     @@ -2774,8 +2752,7 @@ bool DwarfLinker::link(const DebugMap &Map) {
>          // Look for relocations that correspond to debug map entries.
>
>          if (LLVM_LIKELY(!Options.Update) &&
>     -        !LinkContext.RelocMgr.findValidRelocsInDebugInfo(
>     -            *LinkContext.ObjectFile, LinkContext.DMO)) {
>     +        !LinkContext.RelocMgr->hasValidRelocs()) {
>            if (Options.Verbose)
>              outs() << "No valid relocations found. Skipping.\n";
>
>     @@ -2892,7 +2869,7 @@ bool DwarfLinker::link(const DebugMap &Map) {
>      Streamer->copyInvariantDebugSection(*LinkContext.ObjectFile);
>          } else {
>            for (auto &CurrentUnit : LinkContext.CompileUnits)
>     -        lookForDIEsToKeep(LinkContext.RelocMgr, LinkContext.Ranges,
>     +        lookForDIEsToKeep(*LinkContext.RelocMgr, LinkContext.Ranges,
>                                LinkContext.CompileUnits,
>      CurrentUnit->getOrigUnit().getUnitDIE(),
>                                LinkContext.DMO, *CurrentUnit, 0);
>     @@ -2901,10 +2878,9 @@ bool DwarfLinker::link(const DebugMap &Map) {
>          // The calls to applyValidRelocs inside cloneDIE will walk
>     the reloc
>          // array again (in the same way findValidRelocsInDebugInfo()
>     did). We
>          // need to reset the NextValidReloc index to the beginning.
>     -    LinkContext.RelocMgr.resetValidRelocs();
>     -    if (LinkContext.RelocMgr.hasValidRelocs() ||
>     LLVM_UNLIKELY(Options.Update))
>     -      DIECloner(*this, LinkContext.RelocMgr, DIEAlloc,
>     LinkContext.CompileUnits,
>     -                Options)
>     +    if (LinkContext.RelocMgr->hasValidRelocs() ||
>     LLVM_UNLIKELY(Options.Update))
>     +      DIECloner(*this, *LinkContext.RelocMgr, DIEAlloc,
>     +                LinkContext.CompileUnits, Options)
>                .cloneAllCompileUnits(*LinkContext.DwarfContext,
>     LinkContext.DMO,
>                                      LinkContext.Ranges,
>     OffsetsStringPool,
>      LinkContext.DwarfContext->isLittleEndian());
>
>     diff  --git a/llvm/tools/dsymutil/DwarfLinker.h
>     b/llvm/tools/dsymutil/DwarfLinker.h
>     index b8d8e9d02e32..748377f802b3 100644
>     --- a/llvm/tools/dsymutil/DwarfLinker.h
>     +++ b/llvm/tools/dsymutil/DwarfLinker.h
>     @@ -10,33 +10,17 @@
>      #define LLVM_TOOLS_DSYMUTIL_DWARFLINKER_H
>
>      #include "BinaryHolder.h"
>     -#include "CompileUnit.h"
>      #include "DebugMap.h"
>     -#include "DeclContext.h"
>      #include "DwarfStreamer.h"
>      #include "LinkUtils.h"
>      #include "llvm/DebugInfo/DWARF/DWARFContext.h"
>     +#include "llvm/DebugInfo/DWARF/DWARFOptCompileUnit.h"
>     +#include "llvm/DebugInfo/DWARF/DWARFOptDeclContext.h"
>     +#include "llvm/DebugInfo/DWARF/DWARFOptimizer.h"
>
>      namespace llvm {
>      namespace dsymutil {
>
>     -/// Partial address range for debug map objects. Besides an
>     offset, only the
>     -/// HighPC is stored. The structure is stored in a map where the
>     LowPC is the
>     -/// key.
>     -struct DebugMapObjectRange {
>     -  /// Function HighPC.
>     -  uint64_t HighPC;
>     -  /// Offset to apply to the linked address.
>     -  int64_t Offset;
>     -
>     -  DebugMapObjectRange(uint64_t EndPC, int64_t Offset)
>     -      : HighPC(EndPC), Offset(Offset) {}
>     -
>     -  DebugMapObjectRange() : HighPC(0), Offset(0) {}
>     -};
>     -
>     -/// Map LowPC to DebugMapObjectRange.
>     -using RangesTy = std::map<uint64_t, DebugMapObjectRange>;
>      using UnitListTy = std::vector<std::unique_ptr<CompileUnit>>;
>
>      /// The core of the Dwarf linking logic.
>     @@ -89,7 +73,7 @@ class DwarfLinker {
>                                    OffsetsStringPool &StringPool);
>
>        /// Keeps track of relocations.
>     -  class RelocationManager {
>     +  class RelocationManager : public AddressesMap {
>          struct ValidReloc {
>            uint64_t Offset;
>            uint32_t Size;
>     @@ -117,13 +101,50 @@ class DwarfLinker {
>          /// cheap lookup during the root DIE selection and during DIE
>     cloning.
>          unsigned NextValidReloc = 0;
>
>     +    RangesTy AddressRanges;
>     +
>        public:
>     -    RelocationManager(DwarfLinker &Linker) : Linker(Linker) {}
>     +    RelocationManager(DwarfLinker &Linker, const
>     object::ObjectFile &Obj,
>     +                      const DebugMapObject &DMO)
>     +        : Linker(Linker) {
>     +      findValidRelocsInDebugInfo(Obj, DMO);
>     +
>     +      // Iterate over the debug map entries and put all the ones
>     that are
>     +      // functions (because they have a size) into the Ranges
>     map. This map is
>     +      // very similar to the FunctionRanges that are stored in
>     each unit, with 2
>     +      // notable
>     diff erences:
>     +      //
>     +      //  1. Obviously this one is global, while the other ones
>     are per-unit.
>     +      //
>     +      //  2. This one contains not only the functions described
>     in the DIE
>     +      //     tree, but also the ones that are only in the debug map.
>     +      //
>     +      // The latter information is required to reproduce
>     dsymutil's logic while
>     +      // linking line tables. The cases where this information
>     matters look like
>     +      // bugs that need to be investigated, but for now we need
>     to reproduce
>     +      // dsymutil's behavior.
>     +      // FIXME: Once we understood exactly if that information is
>     needed,
>     +      // maybe totally remove this (or try to use it to do a real
>     +      // -gline-tables-only on Darwin.
>     +      for (const auto &Entry : DMO.symbols()) {
>     +        const auto &Mapping = Entry.getValue();
>     +        if (Mapping.Size && Mapping.ObjectAddress)
>     +          AddressRanges[*Mapping.ObjectAddress] =
>     ObjFileAddressRange(
>     +              *Mapping.ObjectAddress + Mapping.Size,
>     +              int64_t(Mapping.BinaryAddress) -
>     *Mapping.ObjectAddress);
>     +      }
>     +    }
>     +    virtual ~RelocationManager () override {
>     +        clear();
>     +    }
>
>     -    bool hasValidRelocs() const { return !ValidRelocs.empty(); }
>     +    virtual bool areRelocationsResolved() const override { return
>     true; }
>
>     -    /// Reset the NextValidReloc counter.
>     -    void resetValidRelocs() { NextValidReloc = 0; }
>     +    bool hasValidRelocs(bool resetRelocsPtr = true) override {
>     +      if (resetRelocsPtr)
>     +        NextValidReloc = 0;
>     +      return !ValidRelocs.empty();
>     +    }
>
>          /// \defgroup FindValidRelocations Translate debug map into a
>     list
>          /// of relevant relocations
>     @@ -141,32 +162,43 @@ class DwarfLinker {
>                                    const DebugMapObject &DMO);
>          /// @}
>
>     -    bool hasValidRelocation(uint64_t StartOffset, uint64_t EndOffset,
>     -                            CompileUnit::DIEInfo &Info);
>     +    bool hasValidRelocationAt(uint64_t StartOffset, uint64_t
>     EndOffset,
>     +                              CompileUnit::DIEInfo &Info) override;
>
>          bool applyValidRelocs(MutableArrayRef<char> Data, uint64_t
>     BaseOffset,
>     -                          bool IsLittleEndian);
>     +                          bool IsLittleEndian) override;
>     +
>     +    RangesTy &getValidAddressRanges() override { return
>     AddressRanges; }
>     +
>     +    void clear() override {
>     +      AddressRanges.clear();
>     +      ValidRelocs.clear();
>     +      NextValidReloc = 0;
>     +    }
>        };
>
>        /// Keeps track of data associated with one object during linking.
>        struct LinkContext {
>     +    DwarfLinker &Linker;
>          DebugMapObject &DMO;
>     -    const object::ObjectFile *ObjectFile;
>     -    RelocationManager RelocMgr;
>     +    const object::ObjectFile *ObjectFile = nullptr;
>     +    std::unique_ptr<RelocationManager> RelocMgr;
>          std::unique_ptr<DWARFContext> DwarfContext;
>          RangesTy Ranges;
>          UnitListTy CompileUnits;
>
>          LinkContext(const DebugMap &Map, DwarfLinker &Linker,
>     DebugMapObject &DMO)
>     -        : DMO(DMO), RelocMgr(Linker) {
>     +        : Linker(Linker), DMO(DMO) {
>            // Swift ASTs are not object files.
>            if (DMO.getType() == MachO::N_AST) {
>              ObjectFile = nullptr;
>              return;
>            }
>     -      auto ErrOrObj = Linker.loadObject(DMO, Map);
>     -      ObjectFile = ErrOrObj ? &*ErrOrObj : nullptr;
>     -      DwarfContext = ObjectFile ?
>     DWARFContext::create(*ObjectFile) : nullptr;
>     +      if (auto ErrOrObj = Linker.loadObject(DMO, Map)) {
>     +        ObjectFile = &*ErrOrObj;
>     +        DwarfContext = DWARFContext::create(*ObjectFile);
>     +        RelocMgr.reset(new RelocationManager(Linker, *ObjectFile,
>     DMO));
>     +      }
>          }
>
>          /// Clear part of the context that's no longer needed when
>     we're done with
>     @@ -175,6 +207,7 @@ class DwarfLinker {
>            DwarfContext.reset(nullptr);
>            CompileUnits.clear();
>            Ranges.clear();
>     +      RelocMgr->clear();
>          }
>        };
>
>
>     diff  --git a/llvm/tools/dsymutil/DwarfStreamer.cpp
>     b/llvm/tools/dsymutil/DwarfStreamer.cpp
>     index 8747aee458fd..33dc9fc850b5 100644
>     --- a/llvm/tools/dsymutil/DwarfStreamer.cpp
>     +++ b/llvm/tools/dsymutil/DwarfStreamer.cpp
>     @@ -7,11 +7,11 @@
>      //===----------------------------------------------------------------------===//
>
>      #include "DwarfStreamer.h"
>     -#include "CompileUnit.h"
>      #include "LinkUtils.h"
>      #include "MachOUtils.h"
>      #include "llvm/ADT/Triple.h"
>      #include "llvm/DebugInfo/DWARF/DWARFContext.h"
>     +#include "llvm/DebugInfo/DWARF/DWARFOptCompileUnit.h"
>      #include "llvm/MC/MCTargetOptions.h"
>      #include "llvm/MC/MCTargetOptionsCommandFlags.inc"
>      #include "llvm/Support/LEB128.h"
>
>     diff  --git a/llvm/tools/dsymutil/DwarfStreamer.h
>     b/llvm/tools/dsymutil/DwarfStreamer.h
>     index baf215ac1315..85e3d48b7581 100644
>     --- a/llvm/tools/dsymutil/DwarfStreamer.h
>     +++ b/llvm/tools/dsymutil/DwarfStreamer.h
>     @@ -9,7 +9,6 @@
>      #ifndef LLVM_TOOLS_DSYMUTIL_DWARFSTREAMER_H
>      #define LLVM_TOOLS_DSYMUTIL_DWARFSTREAMER_H
>
>     -#include "CompileUnit.h"
>      #include "DebugMap.h"
>      #include "LinkUtils.h"
>      #include "llvm/CodeGen/AccelTable.h"
>     @@ -17,6 +16,7 @@
>      #include "llvm/CodeGen/NonRelocatableStringpool.h"
>      #include "llvm/DebugInfo/DWARF/DWARFDebugLine.h"
>      #include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h"
>     +#include "llvm/DebugInfo/DWARF/DWARFOptCompileUnit.h"
>      #include "llvm/MC/MCAsmBackend.h"
>      #include "llvm/MC/MCAsmInfo.h"
>      #include "llvm/MC/MCCodeEmitter.h"
>
>
>
>     _______________________________________________
>     llvm-commits mailing list
>     llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
>     https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191220/c60fc55e/attachment-0001.html>


More information about the llvm-commits mailing list