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

Eric Christopher via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 20 12:51:15 PST 2019


That part is a little harder. I'm not sure if gn can notice this or not. We
noticed it using bazel as a set of builds. Nico?

On Fri, Dec 20, 2019, 2:00 AM Alexey Lapshin <a.v.lapshin at mail.ru> wrote:

> 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> 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
>> 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/c038e335/attachment.html>


More information about the llvm-commits mailing list