[llvm] c074f52 - [DWARFLinker][NFC] Remove usages of "const object::ObjectFile" from DWARFLinker.
Alexey Lapshin via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 28 02:26:31 PST 2020
Author: Alexey Lapshin
Date: 2020-02-28T13:26:22+03:00
New Revision: c074f5234d29439116f0e0be6033ea9331e85394
URL: https://github.com/llvm/llvm-project/commit/c074f5234d29439116f0e0be6033ea9331e85394
DIFF: https://github.com/llvm/llvm-project/commit/c074f5234d29439116f0e0be6033ea9331e85394.diff
LOG: [DWARFLinker][NFC] Remove usages of "const object::ObjectFile" from DWARFLinker.
Summary:
DWARFContext has all the required information to access source debug info.
It is not necessary to use "const object::ObjectFile" to create DWARFContext.
Thus this patch removes all usages of "const object::ObjectFile"
from DWARFLinker. Instead, already created DWARFContext is passed
to DWARFLinker. The purpose is to not depend on "const object::ObjectFile".
The patch looks big, but most of changes are renamings and movements.
Testing: it passes "check-all" lit testing. MD5 checksum for clang .dSYM bundle
matches for the dsymutil with/without that patch.
Reviewers: JDevlieghere, friss, dblaikie, aprantl
Reviewed By: JDevlieghere
Subscribers: hiraditya, llvm-commits
Tags: #llvm, #debug-info
Differential Revision: https://reviews.llvm.org/D75029
Added:
Modified:
llvm/include/llvm/DWARFLinker/DWARFLinker.h
llvm/lib/DWARFLinker/DWARFLinker.cpp
llvm/tools/dsymutil/DwarfLinkerForBinary.cpp
llvm/tools/dsymutil/DwarfLinkerForBinary.h
llvm/tools/dsymutil/DwarfStreamer.cpp
llvm/tools/dsymutil/DwarfStreamer.h
Removed:
################################################################################
diff --git a/llvm/include/llvm/DWARFLinker/DWARFLinker.h b/llvm/include/llvm/DWARFLinker/DWARFLinker.h
index 31e8bccbf408..5b0108606ac9 100644
--- a/llvm/include/llvm/DWARFLinker/DWARFLinker.h
+++ b/llvm/include/llvm/DWARFLinker/DWARFLinker.h
@@ -98,10 +98,8 @@ class DwarfEmitter {
/// Emit DIE containing warnings.
virtual void emitPaperTrailWarningsDie(DIE &Die) = 0;
- /// Emit section named SecName with content equals to
- /// corresponding section in Obj.
- virtual void emitSectionContents(const object::ObjectFile &Obj,
- StringRef SecName) = 0;
+ /// Emit section named SecName with data SecData.
+ virtual void emitSectionContents(StringRef SecData, StringRef SecName) = 0;
/// Emit the abbreviation table \p Abbrevs to the debug_abbrev section.
virtual void
@@ -202,19 +200,21 @@ class DwarfEmitter {
using UnitListTy = std::vector<std::unique_ptr<CompileUnit>>;
-/// this class represents Object File and it`s additional info.
-class DwarfLinkerObjFile {
+/// this class represents DWARF information for source file
+/// and it`s address map.
+class DwarfFile {
public:
- DwarfLinkerObjFile(StringRef Name, const object::ObjectFile *File,
- const std::vector<std::string> &Warnings)
- : FileName(Name), ObjFile(File), Warnings(Warnings) {}
+ DwarfFile(StringRef Name, DWARFContext *Dwarf, AddressesMap *Addresses,
+ const std::vector<std::string> &Warnings)
+ : FileName(Name), Dwarf(Dwarf), Addresses(Addresses), Warnings(Warnings) {
+ }
/// object file name.
StringRef FileName;
- /// object file.
- const object::ObjectFile *ObjFile;
+ /// source DWARF information.
+ DWARFContext *Dwarf = nullptr;
/// helpful address information(list of valid address ranges, relocations).
- std::unique_ptr<AddressesMap> Addresses;
+ AddressesMap *Addresses = nullptr;
/// warnings for object file.
const std::vector<std::string> &Warnings;
};
@@ -222,8 +222,8 @@ class DwarfLinkerObjFile {
typedef std::function<void(const Twine &Warning, StringRef Context,
const DWARFDie *DIE)>
messageHandler;
-typedef std::function<ErrorOr<DwarfLinkerObjFile &>(StringRef ContainerName,
- StringRef Path)>
+typedef std::function<ErrorOr<DwarfFile &>(StringRef ContainerName,
+ StringRef Path)>
objFileLoader;
typedef std::map<std::string, std::string> swiftInterfacesMap;
@@ -248,7 +248,7 @@ class DWARFLinker {
: TheDwarfEmitter(Emitter), DwarfLinkerClientID(ClientID) {}
/// Add object file to be linked.
- void addObjectFile(DwarfLinkerObjFile &ObjFile);
+ void addObjectFile(DwarfFile &File);
/// Link debug info for added objFiles. Object
/// files are linked all together.
@@ -367,16 +367,16 @@ class DWARFLinker {
/// returns true if we need to translate strings.
bool needToTranslateStrings() { return StringsTranslator != nullptr; }
- void reportWarning(const Twine &Warning, const DwarfLinkerObjFile &OF,
+ void reportWarning(const Twine &Warning, const DwarfFile &File,
const DWARFDie *DIE = nullptr) const {
if (Options.WarningHandler != nullptr)
- Options.WarningHandler(Warning, OF.FileName, DIE);
+ Options.WarningHandler(Warning, File.FileName, DIE);
}
- void reportError(const Twine &Warning, const DwarfLinkerObjFile &OF,
+ void reportError(const Twine &Warning, const DwarfFile &File,
const DWARFDie *DIE = nullptr) const {
if (Options.ErrorHandler != nullptr)
- Options.ErrorHandler(Warning, OF.FileName, DIE);
+ Options.ErrorHandler(Warning, File.FileName, DIE);
}
/// Remembers the oldest and newest DWARF version we've seen in a unit.
@@ -389,30 +389,24 @@ class DWARFLinker {
void updateAccelKind(DWARFContext &Dwarf);
/// Emit warnings as Dwarf compile units to leave a trail after linking.
- bool emitPaperTrailWarnings(const DwarfLinkerObjFile &OF,
+ bool emitPaperTrailWarnings(const DwarfFile &File,
OffsetsStringPool &StringPool);
- void copyInvariantDebugSection(const object::ObjectFile &Obj);
+ void copyInvariantDebugSection(DWARFContext &Dwarf);
/// Keeps track of data associated with one object during linking.
struct LinkContext {
- DwarfLinkerObjFile &ObjectFile;
- std::unique_ptr<DWARFContext> DwarfContext;
+ DwarfFile &File;
UnitListTy CompileUnits;
bool Skip = false;
- LinkContext(DwarfLinkerObjFile &objFile) : ObjectFile(objFile) {
-
- if (ObjectFile.ObjFile)
- DwarfContext = DWARFContext::create(*ObjectFile.ObjFile);
- }
+ LinkContext(DwarfFile &File) : File(File) {}
/// Clear part of the context that's no longer needed when we're done with
/// the debug object.
void clear() {
- DwarfContext.reset(nullptr);
CompileUnits.clear();
- ObjectFile.Addresses->clear();
+ File.Addresses->clear();
}
};
@@ -435,7 +429,7 @@ class DWARFLinker {
/// kept. All DIEs referenced though attributes should be kept.
void lookForRefDIEsToKeep(const DWARFDie &Die, CompileUnit &CU,
unsigned Flags, const UnitListTy &Units,
- const DwarfLinkerObjFile &OF,
+ const DwarfFile &File,
SmallVectorImpl<WorklistItem> &Worklist);
/// \defgroup FindRootDIEs Find DIEs corresponding to Address map entries.
@@ -447,7 +441,7 @@ class DWARFLinker {
/// The return value indicates whether the DIE is incomplete.
void lookForDIEsToKeep(AddressesMap &RelocMgr, RangesTy &Ranges,
const UnitListTy &Units, const DWARFDie &DIE,
- const DwarfLinkerObjFile &OF, CompileUnit &CU,
+ const DwarfFile &File, CompileUnit &CU,
unsigned Flags);
/// If this compile unit is really a skeleton CU that points to a
@@ -457,7 +451,7 @@ class DWARFLinker {
/// pointing to the module, and a DW_AT_gnu_dwo_id with the module
/// hash.
bool registerModuleReference(DWARFDie CUDie, const DWARFUnit &Unit,
- const DwarfLinkerObjFile &OF,
+ const DwarfFile &File,
OffsetsStringPool &OffsetsStringPool,
UniquingStringPool &UniquingStringPoolStringPool,
DeclContextTree &ODRContexts,
@@ -470,7 +464,7 @@ class DWARFLinker {
/// to Units.
Error loadClangModule(DWARFDie CUDie, StringRef FilePath,
StringRef ModuleName, uint64_t DwoId,
- const DwarfLinkerObjFile &OF,
+ const DwarfFile &File,
OffsetsStringPool &OffsetsStringPool,
UniquingStringPool &UniquingStringPool,
DeclContextTree &ODRContexts, uint64_t ModulesEndOffset,
@@ -481,11 +475,11 @@ class DWARFLinker {
void keepDIEAndDependencies(AddressesMap &RelocMgr, RangesTy &Ranges,
const UnitListTy &Units, const DWARFDie &DIE,
CompileUnit::DIEInfo &MyInfo,
- const DwarfLinkerObjFile &OF, CompileUnit &CU,
+ const DwarfFile &File, CompileUnit &CU,
bool UseODR);
unsigned shouldKeepDIE(AddressesMap &RelocMgr, RangesTy &Ranges,
- const DWARFDie &DIE, const DwarfLinkerObjFile &OF,
+ const DWARFDie &DIE, const DwarfFile &File,
CompileUnit &Unit, CompileUnit::DIEInfo &MyInfo,
unsigned Flags);
@@ -496,8 +490,7 @@ class DWARFLinker {
CompileUnit::DIEInfo &MyInfo, unsigned Flags);
unsigned shouldKeepSubprogramDIE(AddressesMap &RelocMgr, RangesTy &Ranges,
- const DWARFDie &DIE,
- const DwarfLinkerObjFile &OF,
+ const DWARFDie &DIE, const DwarfFile &File,
CompileUnit &Unit,
CompileUnit::DIEInfo &MyInfo,
unsigned Flags);
@@ -506,8 +499,7 @@ class DWARFLinker {
/// RefValue. The resulting DIE might be in another CompileUnit which is
/// stored into \p ReferencedCU. \returns null if resolving fails for any
/// reason.
- DWARFDie resolveDIEReference(const DwarfLinkerObjFile &OF,
- const UnitListTy &Units,
+ DWARFDie resolveDIEReference(const DwarfFile &File, const UnitListTy &Units,
const DWARFFormValue &RefValue,
const DWARFDie &DIE, CompileUnit *&RefCU);
@@ -522,7 +514,7 @@ class DWARFLinker {
class DIECloner {
DWARFLinker &Linker;
DwarfEmitter *Emitter;
- DwarfLinkerObjFile &ObjFile;
+ DwarfFile &ObjFile;
/// Allocator used for all the DIEValue objects.
BumpPtrAllocator &DIEAlloc;
@@ -532,8 +524,8 @@ class DWARFLinker {
bool Update;
public:
- DIECloner(DWARFLinker &Linker, DwarfEmitter *Emitter,
- DwarfLinkerObjFile &ObjFile, BumpPtrAllocator &DIEAlloc,
+ DIECloner(DWARFLinker &Linker, DwarfEmitter *Emitter, DwarfFile &ObjFile,
+ BumpPtrAllocator &DIEAlloc,
std::vector<std::unique_ptr<CompileUnit>> &CompileUnits,
bool Update)
: Linker(Linker), Emitter(Emitter), ObjFile(ObjFile),
@@ -550,7 +542,7 @@ class DWARFLinker {
/// applied to the entry point of the function to get the linked address.
/// \param Die the output DIE to use, pass NULL to create one.
/// \returns the root of the cloned tree or null if nothing was selected.
- DIE *cloneDIE(const DWARFDie &InputDIE, const DwarfLinkerObjFile &OF,
+ DIE *cloneDIE(const DWARFDie &InputDIE, const DwarfFile &File,
CompileUnit &U, OffsetsStringPool &StringPool,
int64_t PCOffset, uint32_t OutOffset, unsigned Flags,
bool IsLittleEndian, DIE *Die = nullptr);
@@ -558,8 +550,7 @@ class DWARFLinker {
/// Construct the output DIE tree by cloning the DIEs we
/// chose to keep above. If there are no valid relocs, then there's
/// nothing to clone/emit.
- void cloneAllCompileUnits(DWARFContext &DwarfContext,
- const DwarfLinkerObjFile &OF,
+ void cloneAllCompileUnits(DWARFContext &DwarfContext, const DwarfFile &File,
OffsetsStringPool &StringPool,
bool IsLittleEndian);
@@ -602,7 +593,7 @@ class DWARFLinker {
/// Helper for cloneDIE.
unsigned cloneAttribute(DIE &Die, const DWARFDie &InputDIE,
- const DwarfLinkerObjFile &OF, CompileUnit &U,
+ const DwarfFile &File, CompileUnit &U,
OffsetsStringPool &StringPool,
const DWARFFormValue &Val,
const AttributeSpec AttrSpec, unsigned AttrSize,
@@ -623,18 +614,18 @@ class DWARFLinker {
AttributeSpec AttrSpec,
unsigned AttrSize,
const DWARFFormValue &Val,
- const DwarfLinkerObjFile &OF,
+ const DwarfFile &File,
CompileUnit &Unit);
/// Clone a DWARF expression that may be referencing another DIE.
void cloneExpression(DataExtractor &Data, DWARFExpression Expression,
- const DwarfLinkerObjFile &OF, CompileUnit &Unit,
+ const DwarfFile &File, CompileUnit &Unit,
SmallVectorImpl<uint8_t> &OutputBuffer);
/// Clone an attribute referencing another DIE and add
/// it to \p Die.
/// \returns the size of the new attribute.
- unsigned cloneBlockAttribute(DIE &Die, const DwarfLinkerObjFile &OF,
+ unsigned cloneBlockAttribute(DIE &Die, const DwarfFile &File,
CompileUnit &Unit, AttributeSpec AttrSpec,
const DWARFFormValue &Val, unsigned AttrSize,
bool IsLittleEndian);
@@ -650,7 +641,7 @@ class DWARFLinker {
/// Clone a scalar attribute and add it to \p Die.
/// \returns the size of the new attribute.
unsigned cloneScalarAttribute(DIE &Die, const DWARFDie &InputDIE,
- const DwarfLinkerObjFile &OF, CompileUnit &U,
+ const DwarfFile &File, CompileUnit &U,
AttributeSpec AttrSpec,
const DWARFFormValue &Val, unsigned AttrSize,
AttributesInfo &Info);
@@ -666,7 +657,7 @@ class DWARFLinker {
void copyAbbrev(const DWARFAbbreviationDeclaration &Abbrev, bool hasODR);
uint32_t hashFullyQualifiedName(DWARFDie DIE, CompileUnit &U,
- const DwarfLinkerObjFile &OF,
+ const DwarfFile &File,
int RecurseDepth = 0);
/// Helper for cloneDIE.
@@ -681,7 +672,7 @@ class DWARFLinker {
/// Compute and emit debug_ranges section for \p Unit, and
/// patch the attributes referencing it.
void patchRangesForUnit(const CompileUnit &Unit, DWARFContext &Dwarf,
- const DwarfLinkerObjFile &OF) const;
+ const DwarfFile &File) const;
/// Generate and emit the DW_AT_ranges attribute for a compile_unit if it had
/// one.
@@ -691,7 +682,7 @@ class DWARFLinker {
/// parts according to the linked function ranges and emit the result in the
/// debug_line section.
void patchLineTableForUnit(CompileUnit &Unit, DWARFContext &OrigDwarf,
- const DwarfLinkerObjFile &OF);
+ const DwarfFile &File);
/// Emit the accelerator entries for \p Unit.
void emitAcceleratorEntriesForUnit(CompileUnit &Unit);
@@ -699,7 +690,7 @@ class DWARFLinker {
void emitAppleAcceleratorEntriesForUnit(CompileUnit &Unit);
/// Patch the frame info for an object file and emit it.
- void patchFrameInfoForObject(const DwarfLinkerObjFile &, RangesTy &Ranges,
+ void patchFrameInfoForObject(const DwarfFile &, RangesTy &Ranges,
DWARFContext &, unsigned AddressSize);
/// FoldingSet that uniques the abbreviations.
diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp
index 25b61f5f5cec..2a957a2f82f1 100644
--- a/llvm/lib/DWARFLinker/DWARFLinker.cpp
+++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp
@@ -21,7 +21,6 @@
#include "llvm/DebugInfo/DWARF/DWARFFormValue.h"
#include "llvm/DebugInfo/DWARF/DWARFSection.h"
#include "llvm/DebugInfo/DWARF/DWARFUnit.h"
-#include "llvm/Object/ObjectFile.h"
#include "llvm/Support/DataExtractor.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
@@ -47,7 +46,7 @@ static CompileUnit *getUnitForOffset(const UnitListTy &Units, uint64_t Offset) {
/// Resolve the DIE attribute reference that has been extracted in \p RefValue.
/// The resulting DIE might be in another CompileUnit which is stored into \p
/// ReferencedCU. \returns null if resolving fails for any reason.
-DWARFDie DWARFLinker::resolveDIEReference(const DwarfLinkerObjFile &OF,
+DWARFDie DWARFLinker::resolveDIEReference(const DwarfFile &File,
const UnitListTy &Units,
const DWARFFormValue &RefValue,
const DWARFDie &DIE,
@@ -62,7 +61,7 @@ DWARFDie DWARFLinker::resolveDIEReference(const DwarfLinkerObjFile &OF,
return RefDie;
}
- reportWarning("could not find referenced DIE", OF, &DIE);
+ reportWarning("could not find referenced DIE", File, &DIE);
return DWARFDie();
}
@@ -373,8 +372,8 @@ unsigned DWARFLinker::shouldKeepVariableDIE(AddressesMap &RelocMgr,
/// \returns updated TraversalFlags.
unsigned DWARFLinker::shouldKeepSubprogramDIE(
AddressesMap &RelocMgr, RangesTy &Ranges, const DWARFDie &DIE,
- const DwarfLinkerObjFile &OF, CompileUnit &Unit,
- CompileUnit::DIEInfo &MyInfo, unsigned Flags) {
+ const DwarfFile &File, CompileUnit &Unit, CompileUnit::DIEInfo &MyInfo,
+ unsigned Flags) {
const auto *Abbrev = DIE.getAbbreviationDeclarationPtr();
Flags |= TF_InFunctionScope;
@@ -421,7 +420,7 @@ unsigned DWARFLinker::shouldKeepSubprogramDIE(
Optional<uint64_t> HighPc = DIE.getHighPC(*LowPc);
if (!HighPc) {
- reportWarning("Function without high_pc. Range will be discarded.\n", OF,
+ reportWarning("Function without high_pc. Range will be discarded.\n", File,
&DIE);
return Flags;
}
@@ -435,8 +434,7 @@ unsigned DWARFLinker::shouldKeepSubprogramDIE(
/// Check if a DIE should be kept.
/// \returns updated TraversalFlags.
unsigned DWARFLinker::shouldKeepDIE(AddressesMap &RelocMgr, RangesTy &Ranges,
- const DWARFDie &DIE,
- const DwarfLinkerObjFile &OF,
+ const DWARFDie &DIE, const DwarfFile &File,
CompileUnit &Unit,
CompileUnit::DIEInfo &MyInfo,
unsigned Flags) {
@@ -446,7 +444,7 @@ unsigned DWARFLinker::shouldKeepDIE(AddressesMap &RelocMgr, RangesTy &Ranges,
return shouldKeepVariableDIE(RelocMgr, DIE, Unit, MyInfo, Flags);
case dwarf::DW_TAG_subprogram:
case dwarf::DW_TAG_label:
- return shouldKeepSubprogramDIE(RelocMgr, Ranges, DIE, OF, Unit, MyInfo,
+ return shouldKeepSubprogramDIE(RelocMgr, Ranges, DIE, File, Unit, MyInfo,
Flags);
case dwarf::DW_TAG_base_type:
// DWARF Expressions may reference basic types, but scanning them
@@ -544,7 +542,7 @@ void DWARFLinker::lookForChildDIEsToKeep(
/// kept. All DIEs referenced though attributes should be kept.
void DWARFLinker::lookForRefDIEsToKeep(
const DWARFDie &Die, CompileUnit &CU, unsigned Flags,
- const UnitListTy &Units, const DwarfLinkerObjFile &OF,
+ const UnitListTy &Units, const DwarfFile &File,
SmallVectorImpl<WorklistItem> &Worklist) {
bool UseOdr = (Flags & DWARFLinker::TF_DependencyWalk)
? (Flags & DWARFLinker::TF_ODR)
@@ -566,7 +564,8 @@ void DWARFLinker::lookForRefDIEsToKeep(
Val.extractValue(Data, &Offset, Unit.getFormParams(), &Unit);
CompileUnit *ReferencedCU;
- if (auto RefDie = resolveDIEReference(OF, Units, Val, Die, ReferencedCU)) {
+ if (auto RefDie =
+ resolveDIEReference(File, Units, Val, Die, ReferencedCU)) {
uint32_t RefIdx = ReferencedCU->getOrigUnit().getDIEIndex(RefDie);
CompileUnit::DIEInfo &Info = ReferencedCU->getInfo(RefIdx);
bool IsModuleRef = Info.Ctxt && Info.Ctxt->getCanonicalDIEOffset() &&
@@ -653,8 +652,7 @@ void DWARFLinker::lookForParentDIEsToKeep(
/// The return value indicates whether the DIE is incomplete.
void DWARFLinker::lookForDIEsToKeep(AddressesMap &AddressesMap,
RangesTy &Ranges, const UnitListTy &Units,
- const DWARFDie &Die,
- const DwarfLinkerObjFile &OF,
+ const DWARFDie &Die, const DwarfFile &File,
CompileUnit &Cu, unsigned Flags) {
// LIFO work list.
SmallVector<WorklistItem, 4> Worklist;
@@ -676,7 +674,7 @@ void DWARFLinker::lookForDIEsToKeep(AddressesMap &AddressesMap,
lookForChildDIEsToKeep(Current.Die, Current.CU, Current.Flags, Worklist);
continue;
case WorklistItemType::LookForRefDIEsToKeep:
- lookForRefDIEsToKeep(Current.Die, Current.CU, Current.Flags, Units, OF,
+ lookForRefDIEsToKeep(Current.Die, Current.CU, Current.Flags, Units, File,
Worklist);
continue;
case WorklistItemType::LookForParentDIEsToKeep:
@@ -702,7 +700,7 @@ void DWARFLinker::lookForDIEsToKeep(AddressesMap &AddressesMap,
// We must not call shouldKeepDIE while called from keepDIEAndDependencies,
// because it would screw up the relocation finding logic.
if (!(Current.Flags & TF_DependencyWalk))
- Current.Flags = shouldKeepDIE(AddressesMap, Ranges, Current.Die, OF,
+ Current.Flags = shouldKeepDIE(AddressesMap, Ranges, Current.Die, File,
Current.CU, MyInfo, Current.Flags);
// Finish by looking for child DIEs. Because of the LIFO worklist we need
@@ -792,7 +790,7 @@ unsigned DWARFLinker::DIECloner::cloneStringAttribute(
unsigned DWARFLinker::DIECloner::cloneDieReferenceAttribute(
DIE &Die, const DWARFDie &InputDIE, AttributeSpec AttrSpec,
- unsigned AttrSize, const DWARFFormValue &Val, const DwarfLinkerObjFile &OF,
+ unsigned AttrSize, const DWARFFormValue &Val, const DwarfFile &File,
CompileUnit &Unit) {
const DWARFUnit &U = Unit.getOrigUnit();
uint64_t Ref = *Val.getAsReference();
@@ -802,7 +800,7 @@ unsigned DWARFLinker::DIECloner::cloneDieReferenceAttribute(
DeclContext *Ctxt = nullptr;
DWARFDie RefDie =
- Linker.resolveDIEReference(OF, CompileUnits, Val, InputDIE, RefUnit);
+ Linker.resolveDIEReference(File, CompileUnits, Val, InputDIE, RefUnit);
// If the referenced DIE is not found, drop the attribute.
if (!RefDie || AttrSpec.Attr == dwarf::DW_AT_sibling)
@@ -864,9 +862,8 @@ unsigned DWARFLinker::DIECloner::cloneDieReferenceAttribute(
}
void DWARFLinker::DIECloner::cloneExpression(
- DataExtractor &Data, DWARFExpression Expression,
- const DwarfLinkerObjFile &OF, CompileUnit &Unit,
- SmallVectorImpl<uint8_t> &OutputBuffer) {
+ DataExtractor &Data, DWARFExpression Expression, const DwarfFile &File,
+ CompileUnit &Unit, SmallVectorImpl<uint8_t> &OutputBuffer) {
using Encoding = DWARFExpression::Operation::Encoding;
uint64_t OpOffset = 0;
@@ -878,7 +875,7 @@ void DWARFLinker::DIECloner::cloneExpression(
auto Op1 = Description.Op[1];
if ((Op0 == Encoding::BaseTypeRef && Op1 != Encoding::SizeNA) ||
(Op1 == Encoding::BaseTypeRef && Op0 != Encoding::Size1))
- Linker.reportWarning("Unsupported DW_OP encoding.", OF);
+ Linker.reportWarning("Unsupported DW_OP encoding.", File);
if ((Op0 == Encoding::BaseTypeRef && Op1 == Encoding::SizeNA) ||
(Op1 == Encoding::BaseTypeRef && Op0 == Encoding::Size1)) {
@@ -904,13 +901,13 @@ void DWARFLinker::DIECloner::cloneExpression(
Offset = Clone->getOffset();
else
Linker.reportWarning("base type ref doesn't point to DW_TAG_base_type.",
- OF);
+ File);
uint8_t ULEB[16];
unsigned RealSize = encodeULEB128(Offset, ULEB, ULEBsize);
if (RealSize > ULEBsize) {
// Emit the generic type as a fallback.
RealSize = encodeULEB128(0, ULEB, ULEBsize);
- Linker.reportWarning("base type ref doesn't fit.", OF);
+ Linker.reportWarning("base type ref doesn't fit.", File);
}
assert(RealSize == ULEBsize && "padding failed");
ArrayRef<uint8_t> ULEBbytes(ULEB, ULEBsize);
@@ -925,9 +922,8 @@ void DWARFLinker::DIECloner::cloneExpression(
}
unsigned DWARFLinker::DIECloner::cloneBlockAttribute(
- DIE &Die, const DwarfLinkerObjFile &OF, CompileUnit &Unit,
- AttributeSpec AttrSpec, const DWARFFormValue &Val, unsigned AttrSize,
- bool IsLittleEndian) {
+ DIE &Die, const DwarfFile &File, CompileUnit &Unit, AttributeSpec AttrSpec,
+ const DWARFFormValue &Val, unsigned AttrSize, bool IsLittleEndian) {
DIEValueList *Attr;
DIEValue Value;
DIELoc *Loc = nullptr;
@@ -960,7 +956,7 @@ unsigned DWARFLinker::DIECloner::cloneBlockAttribute(
DataExtractor Data(StringRef((const char *)Bytes.data(), Bytes.size()),
IsLittleEndian, OrigUnit.getAddressByteSize());
DWARFExpression Expr(Data, OrigUnit.getAddressByteSize());
- cloneExpression(Data, Expr, OF, Unit, Buffer);
+ cloneExpression(Data, Expr, File, Unit, Buffer);
Bytes = Buffer;
}
for (auto Byte : Bytes)
@@ -1033,7 +1029,7 @@ unsigned DWARFLinker::DIECloner::cloneAddressAttribute(
}
unsigned DWARFLinker::DIECloner::cloneScalarAttribute(
- DIE &Die, const DWARFDie &InputDIE, const DwarfLinkerObjFile &OF,
+ DIE &Die, const DWARFDie &InputDIE, const DwarfFile &File,
CompileUnit &Unit, AttributeSpec AttrSpec, const DWARFFormValue &Val,
unsigned AttrSize, AttributesInfo &Info) {
uint64_t Value;
@@ -1047,7 +1043,7 @@ unsigned DWARFLinker::DIECloner::cloneScalarAttribute(
Value = *OptionalValue;
else {
Linker.reportWarning(
- "Unsupported scalar attribute form. Dropping attribute.", OF,
+ "Unsupported scalar attribute form. Dropping attribute.", File,
&InputDIE);
return 0;
}
@@ -1072,7 +1068,7 @@ unsigned DWARFLinker::DIECloner::cloneScalarAttribute(
Value = *OptionalValue;
else {
Linker.reportWarning(
- "Unsupported scalar attribute form. Dropping attribute.", OF,
+ "Unsupported scalar attribute form. Dropping attribute.", File,
&InputDIE);
return 0;
}
@@ -1101,7 +1097,7 @@ unsigned DWARFLinker::DIECloner::cloneScalarAttribute(
/// value \p Val, and add it to \p Die.
/// \returns the size of the cloned attribute.
unsigned DWARFLinker::DIECloner::cloneAttribute(
- DIE &Die, const DWARFDie &InputDIE, const DwarfLinkerObjFile &OF,
+ DIE &Die, const DWARFDie &InputDIE, const DwarfFile &File,
CompileUnit &Unit, OffsetsStringPool &StringPool, const DWARFFormValue &Val,
const AttributeSpec AttrSpec, unsigned AttrSize, AttributesInfo &Info,
bool IsLittleEndian) {
@@ -1117,13 +1113,13 @@ unsigned DWARFLinker::DIECloner::cloneAttribute(
case dwarf::DW_FORM_ref4:
case dwarf::DW_FORM_ref8:
return cloneDieReferenceAttribute(Die, InputDIE, AttrSpec, AttrSize, Val,
- OF, Unit);
+ File, Unit);
case dwarf::DW_FORM_block:
case dwarf::DW_FORM_block1:
case dwarf::DW_FORM_block2:
case dwarf::DW_FORM_block4:
case dwarf::DW_FORM_exprloc:
- return cloneBlockAttribute(Die, OF, Unit, AttrSpec, Val, AttrSize,
+ return cloneBlockAttribute(Die, File, Unit, AttrSpec, Val, AttrSize,
IsLittleEndian);
case dwarf::DW_FORM_addr:
return cloneAddressAttribute(Die, AttrSpec, Val, Unit, Info);
@@ -1136,11 +1132,11 @@ unsigned DWARFLinker::DIECloner::cloneAttribute(
case dwarf::DW_FORM_sec_offset:
case dwarf::DW_FORM_flag:
case dwarf::DW_FORM_flag_present:
- return cloneScalarAttribute(Die, InputDIE, OF, Unit, AttrSpec, Val,
+ return cloneScalarAttribute(Die, InputDIE, File, Unit, AttrSpec, Val,
AttrSize, Info);
default:
Linker.reportWarning(
- "Unsupported attribute form in cloneAttribute. Dropping.", OF,
+ "Unsupported attribute form in cloneAttribute. Dropping.", File,
&InputDIE);
}
@@ -1218,10 +1214,12 @@ shouldSkipAttribute(DWARFAbbreviationDeclaration::AttributeSpec AttrSpec,
}
}
-DIE *DWARFLinker::DIECloner::cloneDIE(
- const DWARFDie &InputDIE, const DwarfLinkerObjFile &OF, CompileUnit &Unit,
- OffsetsStringPool &StringPool, int64_t PCOffset, uint32_t OutOffset,
- unsigned Flags, bool IsLittleEndian, DIE *Die) {
+DIE *DWARFLinker::DIECloner::cloneDIE(const DWARFDie &InputDIE,
+ const DwarfFile &File, CompileUnit &Unit,
+ OffsetsStringPool &StringPool,
+ int64_t PCOffset, uint32_t OutOffset,
+ unsigned Flags, bool IsLittleEndian,
+ DIE *Die) {
DWARFUnit &U = Unit.getOrigUnit();
unsigned Idx = U.getDIEIndex(InputDIE);
CompileUnit::DIEInfo &Info = Unit.getInfo(Idx);
@@ -1331,7 +1329,7 @@ DIE *DWARFLinker::DIECloner::cloneDIE(
Val.extractValue(Data, &Offset, U.getFormParams(), &U);
AttrSize = Offset - AttrSize;
- OutOffset += cloneAttribute(*Die, InputDIE, OF, Unit, StringPool, Val,
+ OutOffset += cloneAttribute(*Die, InputDIE, File, Unit, StringPool, Val,
AttrSpec, AttrSize, AttrInfo, IsLittleEndian);
}
@@ -1365,7 +1363,7 @@ DIE *DWARFLinker::DIECloner::cloneDIE(
} else if (isTypeTag(Tag) && !AttrInfo.IsDeclaration &&
getDIENames(InputDIE, AttrInfo, StringPool) && AttrInfo.Name &&
AttrInfo.Name.getString()[0]) {
- uint32_t Hash = hashFullyQualifiedName(InputDIE, Unit, OF);
+ uint32_t Hash = hashFullyQualifiedName(InputDIE, Unit, File);
uint64_t RuntimeLang =
dwarf::toUnsigned(InputDIE.find(dwarf::DW_AT_APPLE_runtime_class))
.getValueOr(0);
@@ -1406,8 +1404,8 @@ DIE *DWARFLinker::DIECloner::cloneDIE(
// Recursively clone children.
for (auto Child : InputDIE.children()) {
- if (DIE *Clone = cloneDIE(Child, OF, Unit, StringPool, PCOffset, OutOffset,
- Flags, IsLittleEndian)) {
+ if (DIE *Clone = cloneDIE(Child, File, Unit, StringPool, PCOffset,
+ OutOffset, Flags, IsLittleEndian)) {
Die->addChild(Clone);
OutOffset = Clone->getOffset() + Clone->getSize();
}
@@ -1425,7 +1423,7 @@ DIE *DWARFLinker::DIECloner::cloneDIE(
/// to point at the new entries.
void DWARFLinker::patchRangesForUnit(const CompileUnit &Unit,
DWARFContext &OrigDwarf,
- const DwarfLinkerObjFile &OF) const {
+ const DwarfFile &File) const {
DWARFDebugRangeList RangeList;
const auto &FunctionRanges = Unit.getFunctionRanges();
unsigned AddressSize = Unit.getOrigUnit().getAddressByteSize();
@@ -1448,7 +1446,7 @@ void DWARFLinker::patchRangesForUnit(const CompileUnit &Unit,
RangeAttribute.set(TheDwarfEmitter->getRangesSectionSize());
if (Error E = RangeList.extract(RangeExtractor, &Offset)) {
llvm::consumeError(std::move(E));
- reportWarning("invalid range list ignored.", OF);
+ reportWarning("invalid range list ignored.", File);
RangeList.clear();
}
const auto &Entries = RangeList.getEntries();
@@ -1461,7 +1459,7 @@ void DWARFLinker::patchRangesForUnit(const CompileUnit &Unit,
CurrRange = FunctionRanges.find(First.StartAddress + OrigLowPc);
if (CurrRange == InvalidRange ||
CurrRange.start() > First.StartAddress + OrigLowPc) {
- reportWarning("no mapping for range.", OF);
+ reportWarning("no mapping for range.", File);
continue;
}
}
@@ -1532,7 +1530,7 @@ static void patchStmtList(DIE &Die, DIEInteger Offset) {
/// are present in the binary.
void DWARFLinker::patchLineTableForUnit(CompileUnit &Unit,
DWARFContext &OrigDwarf,
- const DwarfLinkerObjFile &OF) {
+ const DwarfFile &File) {
DWARFDie CUDie = Unit.getOrigUnit().getUnitDIE();
auto StmtList = dwarf::toSectionOffset(CUDie.find(dwarf::DW_AT_stmt_list));
if (!StmtList)
@@ -1543,7 +1541,7 @@ void DWARFLinker::patchLineTableForUnit(CompileUnit &Unit,
patchStmtList(*OutputDIE,
DIEInteger(TheDwarfEmitter->getLineSectionSize()));
- RangesTy &Ranges = OF.Addresses->getValidAddressRanges();
+ RangesTy &Ranges = File.Addresses->getValidAddressRanges();
// Parse the original line info for the unit.
DWARFDebugLine::LineTable LineTable;
@@ -1654,7 +1652,7 @@ void DWARFLinker::patchLineTableForUnit(CompileUnit &Unit,
LineTable.Prologue.getVersion() > 5 ||
LineTable.Prologue.DefaultIsStmt != DWARF2_LINE_DEFAULT_IS_STMT ||
LineTable.Prologue.OpcodeBase > 13)
- reportWarning("line table parameters mismatch. Cannot emit.", OF);
+ reportWarning("line table parameters mismatch. Cannot emit.", File);
else {
uint32_t PrologueEnd = *StmtList + 10 + LineTable.Prologue.PrologueLength;
// DWARF v5 has an extra 2 bytes of information before the header_length
@@ -1732,7 +1730,7 @@ void DWARFLinker::emitDwarfAcceleratorEntriesForUnit(CompileUnit &Unit) {
/// This is actually pretty easy as the data of the CIEs and FDEs can
/// be considered as black boxes and moved as is. The only thing to do
/// is to patch the addresses in the headers.
-void DWARFLinker::patchFrameInfoForObject(const DwarfLinkerObjFile &OF,
+void DWARFLinker::patchFrameInfoForObject(const DwarfFile &File,
RangesTy &Ranges,
DWARFContext &OrigDwarf,
unsigned AddrSize) {
@@ -1751,7 +1749,7 @@ void DWARFLinker::patchFrameInfoForObject(const DwarfLinkerObjFile &OF,
uint64_t EntryOffset = InputOffset;
uint32_t InitialLength = Data.getU32(&InputOffset);
if (InitialLength == 0xFFFFFFFF)
- return reportWarning("Dwarf64 bits no supported", OF);
+ return reportWarning("Dwarf64 bits no supported", File);
uint32_t CIEId = Data.getU32(&InputOffset);
if (CIEId == 0xFFFFFFFF) {
@@ -1783,7 +1781,7 @@ void DWARFLinker::patchFrameInfoForObject(const DwarfLinkerObjFile &OF,
// Have we already emitted a corresponding CIE?
StringRef CIEData = LocalCIES[CIEId];
if (CIEData.empty())
- return reportWarning("Inconsistent debug_frame content. Dropping.", OF);
+ return reportWarning("Inconsistent debug_frame content. Dropping.", File);
// Look if we already emitted a CIE that corresponds to the
// referenced one (the CIE data is the key of that lookup).
@@ -1827,10 +1825,10 @@ void DWARFLinker::DIECloner::copyAbbrev(
Linker.assignAbbrev(Copy);
}
-uint32_t
-DWARFLinker::DIECloner::hashFullyQualifiedName(DWARFDie DIE, CompileUnit &U,
- const DwarfLinkerObjFile &OF,
- int ChildRecurseDepth) {
+uint32_t DWARFLinker::DIECloner::hashFullyQualifiedName(DWARFDie DIE,
+ CompileUnit &U,
+ const DwarfFile &File,
+ int ChildRecurseDepth) {
const char *Name = nullptr;
DWARFUnit *OrigUnit = &U.getOrigUnit();
CompileUnit *CU = &U;
@@ -1849,7 +1847,7 @@ DWARFLinker::DIECloner::hashFullyQualifiedName(DWARFDie DIE, CompileUnit &U,
CompileUnit *RefCU;
if (auto RefDIE =
- Linker.resolveDIEReference(OF, CompileUnits, *Ref, DIE, RefCU)) {
+ Linker.resolveDIEReference(File, CompileUnits, *Ref, DIE, RefCU)) {
CU = RefCU;
OrigUnit = &RefCU->getOrigUnit();
DIE = RefDIE;
@@ -1870,7 +1868,7 @@ DWARFLinker::DIECloner::hashFullyQualifiedName(DWARFDie DIE, CompileUnit &U,
return djbHash(
(Name ? Name : ""),
djbHash((Name ? "::" : ""),
- hashFullyQualifiedName(Die, *CU, OF, ++ChildRecurseDepth)));
+ hashFullyQualifiedName(Die, *CU, File, ++ChildRecurseDepth)));
}
static uint64_t getDwoId(const DWARFDie &CUDie, const DWARFUnit &Unit) {
@@ -1882,7 +1880,7 @@ static uint64_t getDwoId(const DWARFDie &CUDie, const DWARFUnit &Unit) {
}
bool DWARFLinker::registerModuleReference(
- DWARFDie CUDie, const DWARFUnit &Unit, const DwarfLinkerObjFile &OF,
+ DWARFDie CUDie, const DWARFUnit &Unit, const DwarfFile &File,
OffsetsStringPool &StringPool, UniquingStringPool &UniquingStringPool,
DeclContextTree &ODRContexts, uint64_t ModulesEndOffset, unsigned &UnitID,
bool IsLittleEndian, unsigned Indent, bool Quiet) {
@@ -1897,7 +1895,7 @@ bool DWARFLinker::registerModuleReference(
std::string Name = dwarf::toString(CUDie.find(dwarf::DW_AT_name), "");
if (Name.empty()) {
if (!Quiet)
- reportWarning("Anonymous module skeleton CU for " + PCMfile, OF);
+ reportWarning("Anonymous module skeleton CU for " + PCMfile, File);
return true;
}
@@ -1915,7 +1913,7 @@ bool DWARFLinker::registerModuleReference(
reportWarning(Twine("hash mismatch: this object file was built against a "
"
diff erent version of the module ") +
PCMfile,
- OF);
+ File);
if (!Quiet && Options.Verbose)
outs() << " [cached].\n";
return true;
@@ -1928,7 +1926,7 @@ bool DWARFLinker::registerModuleReference(
ClangModules.insert({PCMfile, DwoId});
if (Error E =
- loadClangModule(CUDie, PCMfile, Name, DwoId, OF, StringPool,
+ loadClangModule(CUDie, PCMfile, Name, DwoId, File, StringPool,
UniquingStringPool, ODRContexts, ModulesEndOffset,
UnitID, IsLittleEndian, Indent + 2, Quiet)) {
consumeError(std::move(E));
@@ -1939,7 +1937,7 @@ bool DWARFLinker::registerModuleReference(
Error DWARFLinker::loadClangModule(
DWARFDie CUDie, StringRef Filename, StringRef ModuleName, uint64_t DwoId,
- const DwarfLinkerObjFile &OF, OffsetsStringPool &StringPool,
+ const DwarfFile &File, OffsetsStringPool &StringPool,
UniquingStringPool &UniquingStringPool, DeclContextTree &ODRContexts,
uint64_t ModulesEndOffset, unsigned &UnitID, bool IsLittleEndian,
unsigned Indent, bool Quiet) {
@@ -1954,30 +1952,27 @@ Error DWARFLinker::loadClangModule(
if (Options.ObjFileLoader == nullptr)
return Error::success();
- auto ErrOrObj = Options.ObjFileLoader(OF.FileName, Path);
+ auto ErrOrObj = Options.ObjFileLoader(File.FileName, Path);
if (!ErrOrObj)
return Error::success();
std::unique_ptr<CompileUnit> Unit;
- // Setup access to the debug info.
- auto DwarfContext = DWARFContext::create(*ErrOrObj->ObjFile);
-
- for (const auto &CU : DwarfContext->compile_units()) {
+ for (const auto &CU : ErrOrObj->Dwarf->compile_units()) {
updateDwarfVersion(CU->getVersion());
// Recursively get all modules imported by this one.
auto CUDie = CU->getUnitDIE(false);
if (!CUDie)
continue;
- if (!registerModuleReference(CUDie, *CU, OF, StringPool, UniquingStringPool,
- ODRContexts, ModulesEndOffset, UnitID,
- IsLittleEndian, Indent, Quiet)) {
+ if (!registerModuleReference(
+ CUDie, *CU, File, StringPool, UniquingStringPool, ODRContexts,
+ ModulesEndOffset, UnitID, IsLittleEndian, Indent, Quiet)) {
if (Unit) {
std::string Err =
(Filename +
": Clang modules are expected to have exactly 1 compile unit.\n")
.str();
- reportError(Err, OF);
+ reportError(Err, File);
return make_error<StringError>(Err, inconvertibleErrorCode());
}
// FIXME: Until PR27449 (https://llvm.org/bugs/show_bug.cgi?id=27449) is
@@ -1990,7 +1985,7 @@ Error DWARFLinker::loadClangModule(
Twine("hash mismatch: this object file was built against a "
"
diff erent version of the module ") +
Filename,
- OF);
+ File);
// Update the cache entry with the DwoId of the module loaded from disk.
ClangModules[Filename] = PCMDwoId;
}
@@ -2003,7 +1998,7 @@ Error DWARFLinker::loadClangModule(
UniquingStringPool, ODRContexts, ModulesEndOffset,
Options.ParseableSwiftInterfaces,
[&](const Twine &Warning, const DWARFDie &DIE) {
- reportWarning(Warning, OF, &DIE);
+ reportWarning(Warning, File, &DIE);
});
// Keep everything.
Unit->markEverythingAsKept();
@@ -2021,12 +2016,13 @@ Error DWARFLinker::loadClangModule(
assert(TheDwarfEmitter);
DIECloner(*this, TheDwarfEmitter, *ErrOrObj, DIEAlloc, CompileUnits,
Options.Update)
- .cloneAllCompileUnits(*DwarfContext, OF, StringPool, IsLittleEndian);
+ .cloneAllCompileUnits(*(ErrOrObj->Dwarf), File, StringPool,
+ IsLittleEndian);
return Error::success();
}
void DWARFLinker::DIECloner::cloneAllCompileUnits(DWARFContext &DwarfContext,
- const DwarfLinkerObjFile &OF,
+ const DwarfFile &File,
OffsetsStringPool &StringPool,
bool IsLittleEndian) {
uint64_t OutputDebugInfoSize =
@@ -2042,7 +2038,7 @@ void DWARFLinker::DIECloner::cloneAllCompileUnits(DWARFContext &DwarfContext,
// Clone the InputDIE into your Unit DIE in our compile unit since it
// already has a DIE inside of it.
CurrentUnit->createOutputDIE();
- cloneDIE(InputDIE, OF, *CurrentUnit, StringPool, 0 /* PC offset */,
+ cloneDIE(InputDIE, File, *CurrentUnit, StringPool, 0 /* PC offset */,
11 /* Unit Header size */, 0, IsLittleEndian,
CurrentUnit->getOutputUnitDIE());
}
@@ -2054,14 +2050,14 @@ void DWARFLinker::DIECloner::cloneAllCompileUnits(DWARFContext &DwarfContext,
if (LLVM_LIKELY(!Linker.Options.Update) ||
Linker.needToTranslateStrings())
- Linker.patchLineTableForUnit(*CurrentUnit, DwarfContext, OF);
+ Linker.patchLineTableForUnit(*CurrentUnit, DwarfContext, File);
Linker.emitAcceleratorEntriesForUnit(*CurrentUnit);
if (LLVM_UNLIKELY(Linker.Options.Update))
continue;
- Linker.patchRangesForUnit(*CurrentUnit, DwarfContext, OF);
+ Linker.patchRangesForUnit(*CurrentUnit, DwarfContext, File);
auto ProcessExpr = [&](StringRef Bytes,
SmallVectorImpl<uint8_t> &Buffer) {
DWARFUnit &OrigUnit = CurrentUnit->getOrigUnit();
@@ -2069,7 +2065,7 @@ void DWARFLinker::DIECloner::cloneAllCompileUnits(DWARFContext &DwarfContext,
OrigUnit.getAddressByteSize());
cloneExpression(Data,
DWARFExpression(Data, OrigUnit.getAddressByteSize()),
- OF, *CurrentUnit, Buffer);
+ File, *CurrentUnit, Buffer);
};
Emitter->emitLocationsForUnit(*CurrentUnit, DwarfContext, ProcessExpr);
}
@@ -2116,11 +2112,10 @@ void DWARFLinker::updateAccelKind(DWARFContext &Dwarf) {
}
}
-bool DWARFLinker::emitPaperTrailWarnings(const DwarfLinkerObjFile &OF,
+bool DWARFLinker::emitPaperTrailWarnings(const DwarfFile &File,
OffsetsStringPool &StringPool) {
- if (OF.Warnings.empty() || (OF.ObjFile && (OF.ObjFile->symbols().begin() !=
- OF.ObjFile->symbols().end())))
+ if (File.Warnings.empty())
return false;
DIE *CUDie = DIE::get(DIEAlloc, dwarf::DW_TAG_compile_unit);
@@ -2140,19 +2135,19 @@ bool DWARFLinker::emitPaperTrailWarnings(const DwarfLinkerObjFile &OF,
break;
}
- StringRef File = StringPool.internString(OF.FileName);
+ StringRef FileName = StringPool.internString(File.FileName);
CUDie->addValue(DIEAlloc, dwarf::DW_AT_producer, dwarf::DW_FORM_strp,
DIEInteger(StringPool.getStringOffset(Producer)));
DIEBlock *String = new (DIEAlloc) DIEBlock();
DIEBlocks.push_back(String);
- for (auto &C : File)
+ for (auto &C : FileName)
String->addValue(DIEAlloc, dwarf::Attribute(0), dwarf::DW_FORM_data1,
DIEInteger(C));
String->addValue(DIEAlloc, dwarf::Attribute(0), dwarf::DW_FORM_data1,
DIEInteger(0));
CUDie->addValue(DIEAlloc, dwarf::DW_AT_name, dwarf::DW_FORM_string, String);
- for (const auto &Warning : OF.Warnings) {
+ for (const auto &Warning : File.Warnings) {
DIE &ConstDie = CUDie->addChild(DIE::get(DIEAlloc, dwarf::DW_TAG_constant));
ConstDie.addValue(DIEAlloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp,
DIEInteger(StringPool.getStringOffset(WarningHeader)));
@@ -2161,8 +2156,8 @@ bool DWARFLinker::emitPaperTrailWarnings(const DwarfLinkerObjFile &OF,
ConstDie.addValue(DIEAlloc, dwarf::DW_AT_const_value, dwarf::DW_FORM_strp,
DIEInteger(StringPool.getStringOffset(Warning)));
}
- unsigned Size = 4 /* FORM_strp */ + File.size() + 1 +
- OF.Warnings.size() * (4 + 1 + 4) + 1 /* End of children */;
+ unsigned Size = 4 /* FORM_strp */ + FileName.size() + 1 +
+ File.Warnings.size() * (4 + 1 + 4) + 1 /* End of children */;
DIEAbbrev Abbrev = CUDie->generateAbbrev();
assignAbbrev(Abbrev);
CUDie->setAbbrevNumber(Abbrev.getNumber());
@@ -2180,20 +2175,25 @@ bool DWARFLinker::emitPaperTrailWarnings(const DwarfLinkerObjFile &OF,
return true;
}
-void DWARFLinker::copyInvariantDebugSection(const object::ObjectFile &Obj) {
+void DWARFLinker::copyInvariantDebugSection(DWARFContext &Dwarf) {
if (!needToTranslateStrings())
- TheDwarfEmitter->emitSectionContents(Obj, "debug_line");
- TheDwarfEmitter->emitSectionContents(Obj, "debug_loc");
- TheDwarfEmitter->emitSectionContents(Obj, "debug_ranges");
- TheDwarfEmitter->emitSectionContents(Obj, "debug_frame");
- TheDwarfEmitter->emitSectionContents(Obj, "debug_aranges");
+ TheDwarfEmitter->emitSectionContents(
+ Dwarf.getDWARFObj().getLineSection().Data, "debug_line");
+ TheDwarfEmitter->emitSectionContents(Dwarf.getDWARFObj().getLocSection().Data,
+ "debug_loc");
+ TheDwarfEmitter->emitSectionContents(
+ Dwarf.getDWARFObj().getRangesSection().Data, "debug_ranges");
+ TheDwarfEmitter->emitSectionContents(
+ Dwarf.getDWARFObj().getFrameSection().Data, "debug_frame");
+ TheDwarfEmitter->emitSectionContents(Dwarf.getDWARFObj().getArangesSection(),
+ "debug_aranges");
}
-void DWARFLinker::addObjectFile(DwarfLinkerObjFile &ObjFile) {
- ObjectContexts.emplace_back(LinkContext(ObjFile));
+void DWARFLinker::addObjectFile(DwarfFile &File) {
+ ObjectContexts.emplace_back(LinkContext(File));
- if (ObjectContexts.back().DwarfContext)
- updateAccelKind(*ObjectContexts.back().DwarfContext);
+ if (ObjectContexts.back().File.Dwarf)
+ updateAccelKind(*ObjectContexts.back().File.Dwarf);
}
bool DWARFLinker::link() {
@@ -2234,23 +2234,22 @@ bool DWARFLinker::link() {
for (LinkContext &OptContext : ObjectContexts) {
if (Options.Verbose) {
if (DwarfLinkerClientID == DwarfLinkerClient::Dsymutil)
- outs() << "DEBUG MAP OBJECT: " << OptContext.ObjectFile.FileName
- << "\n";
+ outs() << "DEBUG MAP OBJECT: " << OptContext.File.FileName << "\n";
else
- outs() << "OBJECT FILE: " << OptContext.ObjectFile.FileName << "\n";
+ outs() << "OBJECT FILE: " << OptContext.File.FileName << "\n";
}
- if (emitPaperTrailWarnings(OptContext.ObjectFile, OffsetsStringPool))
+ if (emitPaperTrailWarnings(OptContext.File, OffsetsStringPool))
continue;
- if (!OptContext.ObjectFile.ObjFile)
+ if (!OptContext.File.Dwarf)
continue;
// Look for relocations that correspond to address map entries.
// there was findvalidrelocations previously ... probably we need to gather
// info here
if (LLVM_LIKELY(!Options.Update) &&
- !OptContext.ObjectFile.Addresses->hasValidRelocs()) {
+ !OptContext.File.Addresses->hasValidRelocs()) {
if (Options.Verbose)
outs() << "No valid relocations found. Skipping.\n";
@@ -2261,14 +2260,14 @@ bool DWARFLinker::link() {
}
// Setup access to the debug info.
- if (!OptContext.DwarfContext)
+ if (!OptContext.File.Dwarf)
continue;
// In a first phase, just read in the debug info and load all clang modules.
OptContext.CompileUnits.reserve(
- OptContext.DwarfContext->getNumCompileUnits());
+ OptContext.File.Dwarf->getNumCompileUnits());
- for (const auto &CU : OptContext.DwarfContext->compile_units()) {
+ for (const auto &CU : OptContext.File.Dwarf->compile_units()) {
updateDwarfVersion(CU->getVersion());
auto CUDie = CU->getUnitDIE(false);
if (Options.Verbose) {
@@ -2279,10 +2278,9 @@ bool DWARFLinker::link() {
CUDie.dump(outs(), 0, DumpOpts);
}
if (CUDie && !LLVM_UNLIKELY(Options.Update))
- registerModuleReference(CUDie, *CU, OptContext.ObjectFile,
- OffsetsStringPool, UniquingStringPool,
- ODRContexts, 0, UnitID,
- OptContext.DwarfContext->isLittleEndian());
+ registerModuleReference(CUDie, *CU, OptContext.File, OffsetsStringPool,
+ UniquingStringPool, ODRContexts, 0, UnitID,
+ OptContext.File.Dwarf->isLittleEndian());
}
}
@@ -2309,10 +2307,10 @@ bool DWARFLinker::link() {
auto AnalyzeLambda = [&](size_t I) {
auto &Context = ObjectContexts[I];
- if (Context.Skip || !Context.DwarfContext)
+ if (Context.Skip || !Context.File.Dwarf)
return;
- for (const auto &CU : Context.DwarfContext->compile_units()) {
+ for (const auto &CU : Context.File.Dwarf->compile_units()) {
updateDwarfVersion(CU->getVersion());
// The !registerModuleReference() condition effectively skips
// over fully resolved skeleton units. This second pass of
@@ -2322,10 +2320,9 @@ bool DWARFLinker::link() {
bool Quiet = true;
auto CUDie = CU->getUnitDIE(false);
if (!CUDie || LLVM_UNLIKELY(Options.Update) ||
- !registerModuleReference(CUDie, *CU, Context.ObjectFile,
- OffsetsStringPool, UniquingStringPool,
- ODRContexts, ModulesEndOffset, UnitID,
- Quiet)) {
+ !registerModuleReference(CUDie, *CU, Context.File, OffsetsStringPool,
+ UniquingStringPool, ODRContexts,
+ ModulesEndOffset, UnitID, Quiet)) {
Context.CompileUnits.push_back(std::make_unique<CompileUnit>(
*CU, UnitID++, !Options.NoODR && !Options.Update, ""));
}
@@ -2341,7 +2338,7 @@ bool DWARFLinker::link() {
UniquingStringPool, ODRContexts, ModulesEndOffset,
Options.ParseableSwiftInterfaces,
[&](const Twine &Warning, const DWARFDie &DIE) {
- reportWarning(Warning, Context.ObjectFile, &DIE);
+ reportWarning(Warning, Context.File, &DIE);
});
}
};
@@ -2352,7 +2349,7 @@ bool DWARFLinker::link() {
// than those processed by analyzeContextInfo.
auto CloneLambda = [&](size_t I) {
auto &OptContext = ObjectContexts[I];
- if (OptContext.Skip || !OptContext.ObjectFile.ObjFile)
+ if (OptContext.Skip || !OptContext.File.Dwarf)
return;
// Then mark all the DIEs that need to be present in the generated output
@@ -2363,33 +2360,32 @@ bool DWARFLinker::link() {
if (LLVM_UNLIKELY(Options.Update)) {
for (auto &CurrentUnit : OptContext.CompileUnits)
CurrentUnit->markEverythingAsKept();
- copyInvariantDebugSection(*OptContext.ObjectFile.ObjFile);
+ copyInvariantDebugSection(*OptContext.File.Dwarf);
} else {
for (auto &CurrentUnit : OptContext.CompileUnits)
- lookForDIEsToKeep(
- *OptContext.ObjectFile.Addresses,
- OptContext.ObjectFile.Addresses->getValidAddressRanges(),
- OptContext.CompileUnits, CurrentUnit->getOrigUnit().getUnitDIE(),
- OptContext.ObjectFile, *CurrentUnit, 0);
+ lookForDIEsToKeep(*OptContext.File.Addresses,
+ OptContext.File.Addresses->getValidAddressRanges(),
+ OptContext.CompileUnits,
+ CurrentUnit->getOrigUnit().getUnitDIE(),
+ OptContext.File, *CurrentUnit, 0);
}
// 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 (OptContext.ObjectFile.Addresses->hasValidRelocs() ||
+ if (OptContext.File.Addresses->hasValidRelocs() ||
LLVM_UNLIKELY(Options.Update)) {
- DIECloner(*this, TheDwarfEmitter, OptContext.ObjectFile, DIEAlloc,
+ DIECloner(*this, TheDwarfEmitter, OptContext.File, DIEAlloc,
OptContext.CompileUnits, Options.Update)
- .cloneAllCompileUnits(*OptContext.DwarfContext, OptContext.ObjectFile,
+ .cloneAllCompileUnits(*OptContext.File.Dwarf, OptContext.File,
OffsetsStringPool,
- OptContext.DwarfContext->isLittleEndian());
+ OptContext.File.Dwarf->isLittleEndian());
}
if (!Options.NoOutput && !OptContext.CompileUnits.empty() &&
LLVM_LIKELY(!Options.Update))
patchFrameInfoForObject(
- OptContext.ObjectFile,
- OptContext.ObjectFile.Addresses->getValidAddressRanges(),
- *OptContext.DwarfContext,
+ OptContext.File, OptContext.File.Addresses->getValidAddressRanges(),
+ *OptContext.File.Dwarf,
OptContext.CompileUnits[0]->getOrigUnit().getAddressByteSize());
// Clean-up before starting working on the next object.
diff --git a/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp b/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp
index 330a95d0daf6..51912c78769b 100644
--- a/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp
+++ b/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp
@@ -252,21 +252,24 @@ static Error emitRemarks(const LinkOptions &Options, StringRef BinaryPath,
return Error::success();
}
-ErrorOr<DwarfLinkerObjFile &>
+ErrorOr<DwarfFile &>
DwarfLinkerForBinary::loadObject(const DebugMapObject &Obj,
const DebugMap &DebugMap,
remarks::RemarkLinker &RL) {
auto ErrorOrObj = loadObject(Obj, DebugMap.getTriple());
if (ErrorOrObj) {
- ObjectsForLinking.push_back(
- std::unique_ptr<DwarfLinkerObjFile>(new DwarfLinkerObjFile(
- Obj.getObjectFilename(), &*ErrorOrObj, Obj.getWarnings())));
+ ContextForLinking.push_back(
+ std::unique_ptr<DWARFContext>(DWARFContext::create(*ErrorOrObj)));
+ AddressMapForLinking.push_back(
+ std::make_unique<AddressManager>(*this, *ErrorOrObj, Obj));
- ObjectsForLinking.back()->Addresses.reset(
- new AddressManager(*this, *ErrorOrObj, Obj));
+ ObjectsForLinking.push_back(std::make_unique<DwarfFile>(
+ Obj.getObjectFilename(), ContextForLinking.back().get(),
+ AddressMapForLinking.back().get(),
+ Obj.empty() ? Obj.getWarnings() : EmptyWarnings));
- Error E = RL.link(*ObjectsForLinking.back()->ObjFile);
+ Error E = RL.link(*ErrorOrObj);
if (Error NewE = handleErrors(
std::move(E), [&](std::unique_ptr<FileError> EC) -> Error {
return remarksErrorHandler(Obj, *this, std::move(EC));
@@ -284,6 +287,8 @@ bool DwarfLinkerForBinary::link(const DebugMap &Map) {
return false;
ObjectsForLinking.clear();
+ ContextForLinking.clear();
+ AddressMapForLinking.clear();
DebugMap DebugMap(Map.getTriple(), Map.getBinaryPath());
@@ -317,7 +322,7 @@ bool DwarfLinkerForBinary::link(const DebugMap &Map) {
});
GeneralLinker.setObjFileLoader(
[&DebugMap, &RL, this](StringRef ContainerName,
- StringRef Path) -> ErrorOr<DwarfLinkerObjFile &> {
+ StringRef Path) -> ErrorOr<DwarfFile &> {
auto &Obj = DebugMap.addDebugMapObject(
Path, sys::TimePoint<std::chrono::seconds>(), MachO::N_OSO);
@@ -412,9 +417,9 @@ bool DwarfLinkerForBinary::link(const DebugMap &Map) {
if (auto ErrorOrObj = loadObject(*Obj, Map, RL))
GeneralLinker.addObjectFile(*ErrorOrObj);
else {
- ObjectsForLinking.push_back(
- std::unique_ptr<DwarfLinkerObjFile>(new DwarfLinkerObjFile(
- Obj->getObjectFilename(), nullptr, Obj->getWarnings())));
+ ObjectsForLinking.push_back(std::make_unique<DwarfFile>(
+ Obj->getObjectFilename(), nullptr, nullptr,
+ Obj->empty() ? Obj->getWarnings() : EmptyWarnings));
GeneralLinker.addObjectFile(*ObjectsForLinking.back());
}
}
diff --git a/llvm/tools/dsymutil/DwarfLinkerForBinary.h b/llvm/tools/dsymutil/DwarfLinkerForBinary.h
index f9f7c2abcb00..9b7d9c5b55fe 100644
--- a/llvm/tools/dsymutil/DwarfLinkerForBinary.h
+++ b/llvm/tools/dsymutil/DwarfLinkerForBinary.h
@@ -167,15 +167,18 @@ class DwarfLinkerForBinary {
/// Attempt to load a debug object from disk.
ErrorOr<const object::ObjectFile &> loadObject(const DebugMapObject &Obj,
const Triple &triple);
- ErrorOr<DwarfLinkerObjFile &> loadObject(const DebugMapObject &Obj,
- const DebugMap &DebugMap,
- remarks::RemarkLinker &RL);
+ ErrorOr<DwarfFile &> loadObject(const DebugMapObject &Obj,
+ const DebugMap &DebugMap,
+ remarks::RemarkLinker &RL);
raw_fd_ostream &OutFile;
BinaryHolder &BinHolder;
LinkOptions Options;
std::unique_ptr<DwarfStreamer> Streamer;
- std::vector<std::unique_ptr<DwarfLinkerObjFile>> ObjectsForLinking;
+ std::vector<std::unique_ptr<DwarfFile>> ObjectsForLinking;
+ std::vector<std::unique_ptr<DWARFContext>> ContextForLinking;
+ std::vector<std::unique_ptr<AddressManager>> AddressMapForLinking;
+ std::vector<std::string> EmptyWarnings;
/// A list of all .swiftinterface files referenced by the debug
/// info, mapping Module name to path on disk. The entries need to
diff --git a/llvm/tools/dsymutil/DwarfStreamer.cpp b/llvm/tools/dsymutil/DwarfStreamer.cpp
index d256087d2596..d000c454fd4f 100644
--- a/llvm/tools/dsymutil/DwarfStreamer.cpp
+++ b/llvm/tools/dsymutil/DwarfStreamer.cpp
@@ -194,8 +194,7 @@ void DwarfStreamer::emitDIE(DIE &Die) {
}
/// Emit contents of section SecName From Obj.
-void DwarfStreamer::emitSectionContents(const object::ObjectFile &Obj,
- StringRef SecName) {
+void DwarfStreamer::emitSectionContents(StringRef SecData, StringRef SecName) {
MCSection *Section =
StringSwitch<MCSection *>(SecName)
.Case("debug_line", MC->getObjectFileInfo()->getDwarfLineSection())
@@ -210,12 +209,7 @@ void DwarfStreamer::emitSectionContents(const object::ObjectFile &Obj,
if (Section) {
MS->SwitchSection(Section);
- if (auto Sec = getSectionByName(Obj, SecName)) {
- if (Expected<StringRef> E = Sec->getContents())
- MS->emitBytes(*E);
- else
- consumeError(E.takeError());
- }
+ MS->emitBytes(SecData);
}
}
@@ -721,25 +715,6 @@ void DwarfStreamer::translateLineTable(DataExtractor Data, uint64_t Offset) {
Offset = UnitEnd;
}
-void DwarfStreamer::copyInvariantDebugSection(const object::ObjectFile &Obj) {
- if (!Options.Translator) {
- MS->SwitchSection(MC->getObjectFileInfo()->getDwarfLineSection());
- emitSectionContents(Obj, "debug_line");
- }
-
- MS->SwitchSection(MC->getObjectFileInfo()->getDwarfLocSection());
- emitSectionContents(Obj, "debug_loc");
-
- MS->SwitchSection(MC->getObjectFileInfo()->getDwarfRangesSection());
- emitSectionContents(Obj, "debug_ranges");
-
- MS->SwitchSection(MC->getObjectFileInfo()->getDwarfFrameSection());
- emitSectionContents(Obj, "debug_frame");
-
- MS->SwitchSection(MC->getObjectFileInfo()->getDwarfARangesSection());
- emitSectionContents(Obj, "debug_aranges");
-}
-
/// Emit the pubnames or pubtypes section contribution for \p
/// Unit into \p Sec. The data is provided in \p Names.
void DwarfStreamer::emitPubSectionForUnit(
diff --git a/llvm/tools/dsymutil/DwarfStreamer.h b/llvm/tools/dsymutil/DwarfStreamer.h
index 285732aa3e96..1084a28532af 100644
--- a/llvm/tools/dsymutil/DwarfStreamer.h
+++ b/llvm/tools/dsymutil/DwarfStreamer.h
@@ -76,8 +76,7 @@ class DwarfStreamer : public DwarfEmitter {
void emitPaperTrailWarningsDie(DIE &Die) override;
/// Emit contents of section SecName From Obj.
- void emitSectionContents(const object::ObjectFile &Obj,
- StringRef SecName) override;
+ void emitSectionContents(StringRef SecData, StringRef SecName) override;
/// Emit the string table described by \p Pool.
void emitStrings(const NonRelocatableStringpool &Pool) override;
@@ -118,9 +117,6 @@ class DwarfStreamer : public DwarfEmitter {
/// file names and directories.
void translateLineTable(DataExtractor LineData, uint64_t Offset) override;
- /// Copy over the debug sections that are not modified when updating.
- void copyInvariantDebugSection(const object::ObjectFile &Obj);
-
uint64_t getLineSectionSize() const override { return LineSectionSize; }
/// Emit the .debug_pubnames contribution for \p Unit.
More information about the llvm-commits
mailing list