[llvm] 3075cd5 - Temporarily Revert "[Dsymutil][Debuginfo][NFC] Refactor dsymutil to separate DWARF optimizing part 2."
Eric Christopher via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 19 13:29:14 PST 2019
Author: Eric Christopher
Date: 2019-12-19T13:29:02-08:00
New Revision: 3075cd5c9fcc313701443a869e2d3a189311e919
URL: https://github.com/llvm/llvm-project/commit/3075cd5c9fcc313701443a869e2d3a189311e919
DIFF: https://github.com/llvm/llvm-project/commit/3075cd5c9fcc313701443a869e2d3a189311e919.diff
LOG: Temporarily Revert "[Dsymutil][Debuginfo][NFC] Refactor dsymutil to separate DWARF optimizing part 2."
as it causes a layering violation/dependency cycle:
llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp -> llvm/DebugInfo/DWARF/DWARFExpression.h
llvm/include/llvm/DebugInfo/DWARF/DWARFOptimizer.h -> llvm/CodeGen/NonRelocatableStringpool.h
This reverts commit abc7f6800df8a1f40e1e2c9ccce826abb0208284.
Added:
llvm/tools/dsymutil/CompileUnit.cpp
llvm/tools/dsymutil/CompileUnit.h
llvm/tools/dsymutil/DeclContext.cpp
llvm/tools/dsymutil/DeclContext.h
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/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
################################################################################
diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFOptimizer.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFOptimizer.h
deleted file mode 100644
index 5700c97a92fe..000000000000
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFOptimizer.h
+++ /dev/null
@@ -1,86 +0,0 @@
-//===- 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 d51fe2653631..3fe9904f221b 100644
--- a/llvm/lib/DebugInfo/DWARF/CMakeLists.txt
+++ b/llvm/lib/DebugInfo/DWARF/CMakeLists.txt
@@ -27,9 +27,6 @@ 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/lib/DebugInfo/DWARF/DWARFOptimizer.cpp b/llvm/lib/DebugInfo/DWARF/DWARFOptimizer.cpp
deleted file mode 100644
index 535d2a047076..000000000000
--- a/llvm/lib/DebugInfo/DWARF/DWARFOptimizer.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-//=== 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 e72360deaf88..182be10f0b4c 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 CodeGen
+required_libraries = BinaryFormat Object MC Support
diff --git a/llvm/tools/dsymutil/CMakeLists.txt b/llvm/tools/dsymutil/CMakeLists.txt
index e21215b2417d..b8466baa6346 100644
--- a/llvm/tools/dsymutil/CMakeLists.txt
+++ b/llvm/tools/dsymutil/CMakeLists.txt
@@ -22,7 +22,9 @@ 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/lib/DebugInfo/DWARF/DWARFOptCompileUnit.cpp b/llvm/tools/dsymutil/CompileUnit.cpp
similarity index 96%
rename from llvm/lib/DebugInfo/DWARF/DWARFOptCompileUnit.cpp
rename to llvm/tools/dsymutil/CompileUnit.cpp
index 6ca5f1289283..036c61a6b926 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFOptCompileUnit.cpp
+++ b/llvm/tools/dsymutil/CompileUnit.cpp
@@ -1,4 +1,4 @@
-//===- llvm/DebugInfo/DWARF/DWARFOptCompileUnit.cpp -----------------------===//
+//===- tools/dsymutil/CompileUnit.h - Dwarf compile unit ------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,10 +6,11 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/DebugInfo/DWARF/DWARFOptCompileUnit.h"
-#include "llvm/DebugInfo/DWARF/DWARFOptDeclContext.h"
+#include "CompileUnit.h"
+#include "DeclContext.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) {
@@ -141,4 +142,5 @@ void CompileUnit::addTypeAccelerator(const DIE *Die,
Pubtypes.emplace_back(Name, Die, QualifiedNameHash, ObjcClassImplementation);
}
+} // namespace dsymutil
} // namespace llvm
diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFOptCompileUnit.h b/llvm/tools/dsymutil/CompileUnit.h
similarity index 97%
rename from llvm/include/llvm/DebugInfo/DWARF/DWARFOptCompileUnit.h
rename to llvm/tools/dsymutil/CompileUnit.h
index 010862966846..e0f5d3bc65b2 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFOptCompileUnit.h
+++ b/llvm/tools/dsymutil/CompileUnit.h
@@ -1,4 +1,4 @@
-//===- DWARFOptCompileUnit.h ------------------------------------*- C++ -*-===//
+//===- tools/dsymutil/CompileUnit.h - Dwarf debug info linker ---*- 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_DEBUGINFO_DWARF_OPT_COMPILEUNIT_H
-#define LLVM_DEBUGINFO_DWARF_OPT_COMPILEUNIT_H
+#ifndef LLVM_TOOLS_DSYMUTIL_COMPILEUNIT_H
+#define LLVM_TOOLS_DSYMUTIL_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 generated DIE tree.
+/// instance in the object file to its brand new cloned and linked DIE tree.
class CompileUnit {
public:
/// Information gathered about a DIE in the object file.
@@ -325,6 +325,7 @@ class CompileUnit {
std::string ClangModuleName;
};
+} // end namespace dsymutil
} // end namespace llvm
-#endif // LLVM_DEBUGINFO_DWARF_OPT_COMPILEUNIT_H
+#endif // LLVM_TOOLS_DSYMUTIL_COMPILEUNIT_H
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFOptDeclContext.cpp b/llvm/tools/dsymutil/DeclContext.cpp
similarity index 98%
rename from llvm/lib/DebugInfo/DWARF/DWARFOptDeclContext.cpp
rename to llvm/tools/dsymutil/DeclContext.cpp
index 95cf58444e1a..1c33b672c26b 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFOptDeclContext.cpp
+++ b/llvm/tools/dsymutil/DeclContext.cpp
@@ -1,4 +1,4 @@
-//===- llvm/DebugInfo/DWARF/DWARFOptDeclContext.cpp -----------------------===//
+//===- tools/dsymutil/DeclContext.cpp - Declaration context ---------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,12 +6,13 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/DebugInfo/DWARF/DWARFOptDeclContext.h"
+#include "DeclContext.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.
@@ -205,5 +206,5 @@ PointerIntPair<DeclContext *, 1> DeclContextTree::getChildDeclContext(
return PointerIntPair<DeclContext *, 1>(*ContextIter);
}
-
+} // namespace dsymutil
} // namespace llvm
diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFOptDeclContext.h b/llvm/tools/dsymutil/DeclContext.h
similarity index 95%
rename from llvm/include/llvm/DebugInfo/DWARF/DWARFOptDeclContext.h
rename to llvm/tools/dsymutil/DeclContext.h
index 6045ed72b259..36ef50944083 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFOptDeclContext.h
+++ b/llvm/tools/dsymutil/DeclContext.h
@@ -1,4 +1,4 @@
-//===- llvm/DebugInfo/DWARF/DWARFOptDeclContext.h ---------------*- C++ -*-===//
+//===- tools/dsymutil/DeclContext.h - Dwarf debug info linker ---*- 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,19 +6,20 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_DEBUGINFO_DWARF_OPT_DECLCONTEXT_H
-#define LLVM_DEBUGINFO_DWARF_OPT_DECLCONTEXT_H
+#ifndef LLVM_TOOLS_DSYMUTIL_DECLCONTEXT_H
+#define LLVM_TOOLS_DSYMUTIL_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;
@@ -164,6 +165,7 @@ struct DeclMapInfo : private DenseMapInfo<DeclContext *> {
}
};
+} // end namespace dsymutil
} // end namespace llvm
-#endif // LLVM_DEBUGINFO_DWARF_OPT_DECLCONTEXT_H
+#endif // LLVM_TOOLS_DSYMUTIL_DECLCONTEXT_H
diff --git a/llvm/tools/dsymutil/DwarfLinker.cpp b/llvm/tools/dsymutil/DwarfLinker.cpp
index 521d3635dab2..64acab698434 100644
--- a/llvm/tools/dsymutil/DwarfLinker.cpp
+++ b/llvm/tools/dsymutil/DwarfLinker.cpp
@@ -9,6 +9,7 @@
#include "DwarfLinker.h"
#include "BinaryHolder.h"
#include "DebugMap.h"
+#include "DeclContext.h"
#include "DwarfStreamer.h"
#include "MachOUtils.h"
#include "dsymutil.h"
@@ -44,7 +45,6 @@
#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,6 +374,30 @@ 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) {
@@ -536,7 +560,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::hasValidRelocationAt(
+bool DwarfLinker::RelocationManager::hasValidRelocation(
uint64_t StartOffset, uint64_t EndOffset, CompileUnit::DIEInfo &Info) {
assert(NextValidReloc == 0 ||
StartOffset > ValidRelocs[NextValidReloc - 1].Offset);
@@ -627,8 +651,7 @@ 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.hasValidRelocationAt(LocationOffset, LocationEndOffset,
- MyInfo) ||
+ if (!RelocMgr.hasValidRelocation(LocationOffset, LocationEndOffset, MyInfo) ||
(Flags & TF_InFunctionScope))
return Flags;
@@ -666,7 +689,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.hasValidRelocationAt(LowPcOffset, LowPcEndOffset, MyInfo))
+ !RelocMgr.hasValidRelocation(LowPcOffset, LowPcEndOffset, MyInfo))
return Flags;
if (Options.Verbose) {
@@ -701,7 +724,7 @@ unsigned DwarfLinker::shouldKeepSubprogramDIE(
}
// Replace the debug map range with a more accurate one.
- Ranges[*LowPc] = ObjFileAddressRange(*HighPc, MyInfo.AddrAdjust);
+ Ranges[*LowPc] = DebugMapObjectRange(*HighPc, MyInfo.AddrAdjust);
Unit.addFunctionRange(*LowPc, *HighPc, MyInfo.AddrAdjust);
return Flags;
}
@@ -1628,8 +1651,7 @@ DIE *DwarfLinker::DIECloner::cloneDIE(
Data =
DWARFDataExtractor(DIECopy, Data.isLittleEndian(), Data.getAddressSize());
// Modify the copy with relocated addresses.
- if (RelocMgr.areRelocationsResolved() &&
- RelocMgr.applyValidRelocs(DIECopy, Offset, Data.isLittleEndian())) {
+ if (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
@@ -2371,7 +2393,7 @@ Error DwarfLinker::loadClangModule(
// Setup access to the debug info.
auto DwarfContext = DWARFContext::create(*ErrOrObj);
- RelocationManager RelocMgr(*this, *ErrOrObj, DMO);
+ RelocationManager RelocMgr(*this);
for (const auto &CU : DwarfContext->compile_units()) {
updateDwarfVersion(CU->getVersion());
@@ -2752,7 +2774,8 @@ bool DwarfLinker::link(const DebugMap &Map) {
// Look for relocations that correspond to debug map entries.
if (LLVM_LIKELY(!Options.Update) &&
- !LinkContext.RelocMgr->hasValidRelocs()) {
+ !LinkContext.RelocMgr.findValidRelocsInDebugInfo(
+ *LinkContext.ObjectFile, LinkContext.DMO)) {
if (Options.Verbose)
outs() << "No valid relocations found. Skipping.\n";
@@ -2869,7 +2892,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);
@@ -2878,9 +2901,10 @@ 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.
- if (LinkContext.RelocMgr->hasValidRelocs() || LLVM_UNLIKELY(Options.Update))
- DIECloner(*this, *LinkContext.RelocMgr, DIEAlloc,
- LinkContext.CompileUnits, Options)
+ LinkContext.RelocMgr.resetValidRelocs();
+ 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 748377f802b3..b8d8e9d02e32 100644
--- a/llvm/tools/dsymutil/DwarfLinker.h
+++ b/llvm/tools/dsymutil/DwarfLinker.h
@@ -10,17 +10,33 @@
#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.
@@ -73,7 +89,7 @@ class DwarfLinker {
OffsetsStringPool &StringPool);
/// Keeps track of relocations.
- class RelocationManager : public AddressesMap {
+ class RelocationManager {
struct ValidReloc {
uint64_t Offset;
uint32_t Size;
@@ -101,50 +117,13 @@ class DwarfLinker {
/// cheap lookup during the root DIE selection and during DIE cloning.
unsigned NextValidReloc = 0;
- RangesTy AddressRanges;
-
public:
- 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();
- }
+ RelocationManager(DwarfLinker &Linker) : Linker(Linker) {}
- virtual bool areRelocationsResolved() const override { return true; }
+ bool hasValidRelocs() const { return !ValidRelocs.empty(); }
- bool hasValidRelocs(bool resetRelocsPtr = true) override {
- if (resetRelocsPtr)
- NextValidReloc = 0;
- return !ValidRelocs.empty();
- }
+ /// Reset the NextValidReloc counter.
+ void resetValidRelocs() { NextValidReloc = 0; }
/// \defgroup FindValidRelocations Translate debug map into a list
/// of relevant relocations
@@ -162,43 +141,32 @@ class DwarfLinker {
const DebugMapObject &DMO);
/// @}
- bool hasValidRelocationAt(uint64_t StartOffset, uint64_t EndOffset,
- CompileUnit::DIEInfo &Info) override;
+ bool hasValidRelocation(uint64_t StartOffset, uint64_t EndOffset,
+ CompileUnit::DIEInfo &Info);
bool applyValidRelocs(MutableArrayRef<char> Data, uint64_t BaseOffset,
- bool IsLittleEndian) override;
-
- RangesTy &getValidAddressRanges() override { return AddressRanges; }
-
- void clear() override {
- AddressRanges.clear();
- ValidRelocs.clear();
- NextValidReloc = 0;
- }
+ bool IsLittleEndian);
};
/// Keeps track of data associated with one object during linking.
struct LinkContext {
- DwarfLinker &Linker;
DebugMapObject &DMO;
- const object::ObjectFile *ObjectFile = nullptr;
- std::unique_ptr<RelocationManager> RelocMgr;
+ const object::ObjectFile *ObjectFile;
+ RelocationManager RelocMgr;
std::unique_ptr<DWARFContext> DwarfContext;
RangesTy Ranges;
UnitListTy CompileUnits;
LinkContext(const DebugMap &Map, DwarfLinker &Linker, DebugMapObject &DMO)
- : Linker(Linker), DMO(DMO) {
+ : DMO(DMO), RelocMgr(Linker) {
// Swift ASTs are not object files.
if (DMO.getType() == MachO::N_AST) {
ObjectFile = nullptr;
return;
}
- if (auto ErrOrObj = Linker.loadObject(DMO, Map)) {
- ObjectFile = &*ErrOrObj;
- DwarfContext = DWARFContext::create(*ObjectFile);
- RelocMgr.reset(new RelocationManager(Linker, *ObjectFile, DMO));
- }
+ auto ErrOrObj = Linker.loadObject(DMO, Map);
+ ObjectFile = ErrOrObj ? &*ErrOrObj : nullptr;
+ DwarfContext = ObjectFile ? DWARFContext::create(*ObjectFile) : nullptr;
}
/// Clear part of the context that's no longer needed when we're done with
@@ -207,7 +175,6 @@ 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 33dc9fc850b5..8747aee458fd 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 85e3d48b7581..baf215ac1315 100644
--- a/llvm/tools/dsymutil/DwarfStreamer.h
+++ b/llvm/tools/dsymutil/DwarfStreamer.h
@@ -9,6 +9,7 @@
#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"
@@ -16,7 +17,6 @@
#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"
More information about the llvm-commits
mailing list