1 //=== DWARFLinker.cpp -----------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/DWARFLinker/Classic/DWARFLinker.h"
10 #include "llvm/ADT/ArrayRef.h"
11 #include "llvm/ADT/BitVector.h"
12 #include "llvm/ADT/STLExtras.h"
13 #include "llvm/ADT/StringExtras.h"
14 #include "llvm/CodeGen/NonRelocatableStringpool.h"
15 #include "llvm/DWARFLinker/Classic/DWARFLinkerDeclContext.h"
16 #include "llvm/DWARFLinker/Classic/DWARFStreamer.h"
17 #include "llvm/DWARFLinker/Utils.h"
18 #include "llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h"
19 #include "llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h"
20 #include "llvm/DebugInfo/DWARF/DWARFContext.h"
21 #include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h"
22 #include "llvm/DebugInfo/DWARF/DWARFDebugLine.h"
23 #include "llvm/DebugInfo/DWARF/DWARFDebugMacro.h"
24 #include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h"
25 #include "llvm/DebugInfo/DWARF/DWARFDie.h"
26 #include "llvm/DebugInfo/DWARF/DWARFExpression.h"
27 #include "llvm/DebugInfo/DWARF/DWARFFormValue.h"
28 #include "llvm/DebugInfo/DWARF/DWARFSection.h"
29 #include "llvm/DebugInfo/DWARF/DWARFUnit.h"
30 #include "llvm/MC/MCDwarf.h"
31 #include "llvm/Support/DataExtractor.h"
32 #include "llvm/Support/Error.h"
33 #include "llvm/Support/ErrorHandling.h"
34 #include "llvm/Support/ErrorOr.h"
35 #include "llvm/Support/FormatVariadic.h"
36 #include "llvm/Support/LEB128.h"
37 #include "llvm/Support/Path.h"
38 #include "llvm/Support/ThreadPool.h"
43 using namespace dwarf_linker
;
44 using namespace dwarf_linker::classic
;
46 /// Hold the input and output of the debug info size in bytes.
47 struct DebugInfoSize
{
52 /// Compute the total size of the debug info.
53 static uint64_t getDebugInfoSize(DWARFContext
&Dwarf
) {
55 for (auto &Unit
: Dwarf
.compile_units()) {
56 Size
+= Unit
->getLength();
61 /// Similar to DWARFUnitSection::getUnitForOffset(), but returning our
62 /// CompileUnit object instead.
63 static CompileUnit
*getUnitForOffset(const UnitListTy
&Units
, uint64_t Offset
) {
64 auto CU
= llvm::upper_bound(
65 Units
, Offset
, [](uint64_t LHS
, const std::unique_ptr
<CompileUnit
> &RHS
) {
66 return LHS
< RHS
->getOrigUnit().getNextUnitOffset();
68 return CU
!= Units
.end() ? CU
->get() : nullptr;
71 /// Resolve the DIE attribute reference that has been extracted in \p RefValue.
72 /// The resulting DIE might be in another CompileUnit which is stored into \p
73 /// ReferencedCU. \returns null if resolving fails for any reason.
74 DWARFDie
DWARFLinker::resolveDIEReference(const DWARFFile
&File
,
75 const UnitListTy
&Units
,
76 const DWARFFormValue
&RefValue
,
78 CompileUnit
*&RefCU
) {
79 assert(RefValue
.isFormClass(DWARFFormValue::FC_Reference
));
81 if (std::optional
<uint64_t> Off
= RefValue
.getAsRelativeReference()) {
82 RefOffset
= RefValue
.getUnit()->getOffset() + *Off
;
83 } else if (Off
= RefValue
.getAsDebugInfoReference(); Off
) {
86 reportWarning("Unsupported reference type", File
, &DIE
);
89 if ((RefCU
= getUnitForOffset(Units
, RefOffset
)))
90 if (const auto RefDie
= RefCU
->getOrigUnit().getDIEForOffset(RefOffset
)) {
91 // In a file with broken references, an attribute might point to a NULL
97 reportWarning("could not find referenced DIE", File
, &DIE
);
101 /// \returns whether the passed \a Attr type might contain a DIE reference
102 /// suitable for ODR uniquing.
103 static bool isODRAttribute(uint16_t Attr
) {
107 case dwarf::DW_AT_type
:
108 case dwarf::DW_AT_containing_type
:
109 case dwarf::DW_AT_specification
:
110 case dwarf::DW_AT_abstract_origin
:
111 case dwarf::DW_AT_import
:
114 llvm_unreachable("Improper attribute.");
117 static bool isTypeTag(uint16_t Tag
) {
119 case dwarf::DW_TAG_array_type
:
120 case dwarf::DW_TAG_class_type
:
121 case dwarf::DW_TAG_enumeration_type
:
122 case dwarf::DW_TAG_pointer_type
:
123 case dwarf::DW_TAG_reference_type
:
124 case dwarf::DW_TAG_string_type
:
125 case dwarf::DW_TAG_structure_type
:
126 case dwarf::DW_TAG_subroutine_type
:
127 case dwarf::DW_TAG_template_alias
:
128 case dwarf::DW_TAG_typedef
:
129 case dwarf::DW_TAG_union_type
:
130 case dwarf::DW_TAG_ptr_to_member_type
:
131 case dwarf::DW_TAG_set_type
:
132 case dwarf::DW_TAG_subrange_type
:
133 case dwarf::DW_TAG_base_type
:
134 case dwarf::DW_TAG_const_type
:
135 case dwarf::DW_TAG_constant
:
136 case dwarf::DW_TAG_file_type
:
137 case dwarf::DW_TAG_namelist
:
138 case dwarf::DW_TAG_packed_type
:
139 case dwarf::DW_TAG_volatile_type
:
140 case dwarf::DW_TAG_restrict_type
:
141 case dwarf::DW_TAG_atomic_type
:
142 case dwarf::DW_TAG_interface_type
:
143 case dwarf::DW_TAG_unspecified_type
:
144 case dwarf::DW_TAG_shared_type
:
145 case dwarf::DW_TAG_immutable_type
:
153 bool DWARFLinker::DIECloner::getDIENames(const DWARFDie
&Die
,
154 AttributesInfo
&Info
,
155 OffsetsStringPool
&StringPool
,
156 bool StripTemplate
) {
157 // This function will be called on DIEs having low_pcs and
158 // ranges. As getting the name might be more expansive, filter out
160 if (Die
.getTag() == dwarf::DW_TAG_lexical_block
)
163 if (!Info
.MangledName
)
164 if (const char *MangledName
= Die
.getLinkageName())
165 Info
.MangledName
= StringPool
.getEntry(MangledName
);
168 if (const char *Name
= Die
.getShortName())
169 Info
.Name
= StringPool
.getEntry(Name
);
171 if (!Info
.MangledName
)
172 Info
.MangledName
= Info
.Name
;
174 if (StripTemplate
&& Info
.Name
&& Info
.MangledName
!= Info
.Name
) {
175 StringRef Name
= Info
.Name
.getString();
176 if (std::optional
<StringRef
> StrippedName
= StripTemplateParameters(Name
))
177 Info
.NameWithoutTemplate
= StringPool
.getEntry(*StrippedName
);
180 return Info
.Name
|| Info
.MangledName
;
183 /// Resolve the relative path to a build artifact referenced by DWARF by
184 /// applying DW_AT_comp_dir.
185 static void resolveRelativeObjectPath(SmallVectorImpl
<char> &Buf
, DWARFDie CU
) {
186 sys::path::append(Buf
, dwarf::toString(CU
.find(dwarf::DW_AT_comp_dir
), ""));
189 /// Collect references to parseable Swift interfaces in imported
190 /// DW_TAG_module blocks.
191 static void analyzeImportedModule(
192 const DWARFDie
&DIE
, CompileUnit
&CU
,
193 DWARFLinkerBase::SwiftInterfacesMapTy
*ParseableSwiftInterfaces
,
194 std::function
<void(const Twine
&, const DWARFDie
&)> ReportWarning
) {
195 if (CU
.getLanguage() != dwarf::DW_LANG_Swift
)
198 if (!ParseableSwiftInterfaces
)
201 StringRef Path
= dwarf::toStringRef(DIE
.find(dwarf::DW_AT_LLVM_include_path
));
202 if (!Path
.ends_with(".swiftinterface"))
204 // Don't track interfaces that are part of the SDK.
205 StringRef SysRoot
= dwarf::toStringRef(DIE
.find(dwarf::DW_AT_LLVM_sysroot
));
207 SysRoot
= CU
.getSysRoot();
208 if (!SysRoot
.empty() && Path
.starts_with(SysRoot
))
210 // Don't track interfaces that are part of the toolchain.
211 // For example: Swift, _Concurrency, ...
212 StringRef DeveloperDir
= guessDeveloperDir(SysRoot
);
213 if (!DeveloperDir
.empty() && Path
.starts_with(DeveloperDir
))
215 if (isInToolchainDir(Path
))
217 std::optional
<const char *> Name
=
218 dwarf::toString(DIE
.find(dwarf::DW_AT_name
));
221 auto &Entry
= (*ParseableSwiftInterfaces
)[*Name
];
222 // The prepend path is applied later when copying.
223 DWARFDie CUDie
= CU
.getOrigUnit().getUnitDIE();
224 SmallString
<128> ResolvedPath
;
225 if (sys::path::is_relative(Path
))
226 resolveRelativeObjectPath(ResolvedPath
, CUDie
);
227 sys::path::append(ResolvedPath
, Path
);
228 if (!Entry
.empty() && Entry
!= ResolvedPath
)
229 ReportWarning(Twine("Conflicting parseable interfaces for Swift Module ") +
230 *Name
+ ": " + Entry
+ " and " + Path
,
232 Entry
= std::string(ResolvedPath
);
235 /// The distinct types of work performed by the work loop in
236 /// analyzeContextInfo.
237 enum class ContextWorklistItemType
: uint8_t {
243 /// This class represents an item in the work list. The type defines what kind
244 /// of work needs to be performed when processing the current item. Everything
245 /// but the Type and Die fields are optional based on the type.
246 struct ContextWorklistItem
{
250 CompileUnit::DIEInfo
*OtherInfo
;
251 DeclContext
*Context
;
253 ContextWorklistItemType Type
;
254 bool InImportedModule
;
256 ContextWorklistItem(DWARFDie Die
, ContextWorklistItemType T
,
257 CompileUnit::DIEInfo
*OtherInfo
= nullptr)
258 : Die(Die
), ParentIdx(0), OtherInfo(OtherInfo
), Type(T
),
259 InImportedModule(false) {}
261 ContextWorklistItem(DWARFDie Die
, DeclContext
*Context
, unsigned ParentIdx
,
262 bool InImportedModule
)
263 : Die(Die
), ParentIdx(ParentIdx
), Context(Context
),
264 Type(ContextWorklistItemType::AnalyzeContextInfo
),
265 InImportedModule(InImportedModule
) {}
268 static bool updatePruning(const DWARFDie
&Die
, CompileUnit
&CU
,
269 uint64_t ModulesEndOffset
) {
270 CompileUnit::DIEInfo
&Info
= CU
.getInfo(Die
);
272 // Prune this DIE if it is either a forward declaration inside a
273 // DW_TAG_module or a DW_TAG_module that contains nothing but
274 // forward declarations.
275 Info
.Prune
&= (Die
.getTag() == dwarf::DW_TAG_module
) ||
276 (isTypeTag(Die
.getTag()) &&
277 dwarf::toUnsigned(Die
.find(dwarf::DW_AT_declaration
), 0));
279 // Only prune forward declarations inside a DW_TAG_module for which a
280 // definition exists elsewhere.
281 if (ModulesEndOffset
== 0)
282 Info
.Prune
&= Info
.Ctxt
&& Info
.Ctxt
->getCanonicalDIEOffset();
284 Info
.Prune
&= Info
.Ctxt
&& Info
.Ctxt
->getCanonicalDIEOffset() > 0 &&
285 Info
.Ctxt
->getCanonicalDIEOffset() <= ModulesEndOffset
;
290 static void updateChildPruning(const DWARFDie
&Die
, CompileUnit
&CU
,
291 CompileUnit::DIEInfo
&ChildInfo
) {
292 CompileUnit::DIEInfo
&Info
= CU
.getInfo(Die
);
293 Info
.Prune
&= ChildInfo
.Prune
;
296 /// Recursive helper to build the global DeclContext information and
297 /// gather the child->parent relationships in the original compile unit.
299 /// This function uses the same work list approach as lookForDIEsToKeep.
301 /// \return true when this DIE and all of its children are only
302 /// forward declarations to types defined in external clang modules
303 /// (i.e., forward declarations that are children of a DW_TAG_module).
304 static void analyzeContextInfo(
305 const DWARFDie
&DIE
, unsigned ParentIdx
, CompileUnit
&CU
,
306 DeclContext
*CurrentDeclContext
, DeclContextTree
&Contexts
,
307 uint64_t ModulesEndOffset
,
308 DWARFLinkerBase::SwiftInterfacesMapTy
*ParseableSwiftInterfaces
,
309 std::function
<void(const Twine
&, const DWARFDie
&)> ReportWarning
) {
311 std::vector
<ContextWorklistItem
> Worklist
;
312 Worklist
.emplace_back(DIE
, CurrentDeclContext
, ParentIdx
, false);
314 while (!Worklist
.empty()) {
315 ContextWorklistItem Current
= Worklist
.back();
318 switch (Current
.Type
) {
319 case ContextWorklistItemType::UpdatePruning
:
320 updatePruning(Current
.Die
, CU
, ModulesEndOffset
);
322 case ContextWorklistItemType::UpdateChildPruning
:
323 updateChildPruning(Current
.Die
, CU
, *Current
.OtherInfo
);
325 case ContextWorklistItemType::AnalyzeContextInfo
:
329 unsigned Idx
= CU
.getOrigUnit().getDIEIndex(Current
.Die
);
330 CompileUnit::DIEInfo
&Info
= CU
.getInfo(Idx
);
332 // Clang imposes an ODR on modules(!) regardless of the language:
333 // "The module-id should consist of only a single identifier,
334 // which provides the name of the module being defined. Each
335 // module shall have a single definition."
337 // This does not extend to the types inside the modules:
338 // "[I]n C, this implies that if two structs are defined in
339 // different submodules with the same name, those two types are
340 // distinct types (but may be compatible types if their
341 // definitions match)."
343 // We treat non-C++ modules like namespaces for this reason.
344 if (Current
.Die
.getTag() == dwarf::DW_TAG_module
&&
345 Current
.ParentIdx
== 0 &&
346 dwarf::toString(Current
.Die
.find(dwarf::DW_AT_name
), "") !=
347 CU
.getClangModuleName()) {
348 Current
.InImportedModule
= true;
349 analyzeImportedModule(Current
.Die
, CU
, ParseableSwiftInterfaces
,
353 Info
.ParentIdx
= Current
.ParentIdx
;
354 Info
.InModuleScope
= CU
.isClangModule() || Current
.InImportedModule
;
355 if (CU
.hasODR() || Info
.InModuleScope
) {
356 if (Current
.Context
) {
357 auto PtrInvalidPair
= Contexts
.getChildDeclContext(
358 *Current
.Context
, Current
.Die
, CU
, Info
.InModuleScope
);
359 Current
.Context
= PtrInvalidPair
.getPointer();
361 PtrInvalidPair
.getInt() ? nullptr : PtrInvalidPair
.getPointer();
363 Info
.Ctxt
->setDefinedInClangModule(Info
.InModuleScope
);
365 Info
.Ctxt
= Current
.Context
= nullptr;
368 Info
.Prune
= Current
.InImportedModule
;
369 // Add children in reverse order to the worklist to effectively process
371 Worklist
.emplace_back(Current
.Die
, ContextWorklistItemType::UpdatePruning
);
372 for (auto Child
: reverse(Current
.Die
.children())) {
373 CompileUnit::DIEInfo
&ChildInfo
= CU
.getInfo(Child
);
374 Worklist
.emplace_back(
375 Current
.Die
, ContextWorklistItemType::UpdateChildPruning
, &ChildInfo
);
376 Worklist
.emplace_back(Child
, Current
.Context
, Idx
,
377 Current
.InImportedModule
);
382 static bool dieNeedsChildrenToBeMeaningful(uint32_t Tag
) {
386 case dwarf::DW_TAG_class_type
:
387 case dwarf::DW_TAG_common_block
:
388 case dwarf::DW_TAG_lexical_block
:
389 case dwarf::DW_TAG_structure_type
:
390 case dwarf::DW_TAG_subprogram
:
391 case dwarf::DW_TAG_subroutine_type
:
392 case dwarf::DW_TAG_union_type
:
395 llvm_unreachable("Invalid Tag");
398 void DWARFLinker::cleanupAuxiliarryData(LinkContext
&Context
) {
401 for (DIEBlock
*I
: DIEBlocks
)
403 for (DIELoc
*I
: DIELocs
)
411 static bool isTlsAddressCode(uint8_t DW_OP_Code
) {
412 return DW_OP_Code
== dwarf::DW_OP_form_tls_address
||
413 DW_OP_Code
== dwarf::DW_OP_GNU_push_tls_address
;
416 std::pair
<bool, std::optional
<int64_t>>
417 DWARFLinker::getVariableRelocAdjustment(AddressesMap
&RelocMgr
,
418 const DWARFDie
&DIE
) {
419 assert((DIE
.getTag() == dwarf::DW_TAG_variable
||
420 DIE
.getTag() == dwarf::DW_TAG_constant
) &&
421 "Wrong type of input die");
423 const auto *Abbrev
= DIE
.getAbbreviationDeclarationPtr();
425 // Check if DIE has DW_AT_location attribute.
426 DWARFUnit
*U
= DIE
.getDwarfUnit();
427 std::optional
<uint32_t> LocationIdx
=
428 Abbrev
->findAttributeIndex(dwarf::DW_AT_location
);
430 return std::make_pair(false, std::nullopt
);
432 // Get offset to the DW_AT_location attribute.
433 uint64_t AttrOffset
=
434 Abbrev
->getAttributeOffsetFromIndex(*LocationIdx
, DIE
.getOffset(), *U
);
436 // Get value of the DW_AT_location attribute.
437 std::optional
<DWARFFormValue
> LocationValue
=
438 Abbrev
->getAttributeValueFromOffset(*LocationIdx
, AttrOffset
, *U
);
440 return std::make_pair(false, std::nullopt
);
442 // Check that DW_AT_location attribute is of 'exprloc' class.
443 // Handling value of location expressions for attributes of 'loclist'
444 // class is not implemented yet.
445 std::optional
<ArrayRef
<uint8_t>> Expr
= LocationValue
->getAsBlock();
447 return std::make_pair(false, std::nullopt
);
449 // Parse 'exprloc' expression.
450 DataExtractor
Data(toStringRef(*Expr
), U
->getContext().isLittleEndian(),
451 U
->getAddressByteSize());
452 DWARFExpression
Expression(Data
, U
->getAddressByteSize(),
453 U
->getFormParams().Format
);
455 bool HasLocationAddress
= false;
456 uint64_t CurExprOffset
= 0;
457 for (DWARFExpression::iterator It
= Expression
.begin();
458 It
!= Expression
.end(); ++It
) {
459 DWARFExpression::iterator NextIt
= It
;
462 const DWARFExpression::Operation
&Op
= *It
;
463 switch (Op
.getCode()) {
464 case dwarf::DW_OP_const2u
:
465 case dwarf::DW_OP_const4u
:
466 case dwarf::DW_OP_const8u
:
467 case dwarf::DW_OP_const2s
:
468 case dwarf::DW_OP_const4s
:
469 case dwarf::DW_OP_const8s
:
470 if (NextIt
== Expression
.end() || !isTlsAddressCode(NextIt
->getCode()))
473 case dwarf::DW_OP_addr
: {
474 HasLocationAddress
= true;
475 // Check relocation for the address.
476 if (std::optional
<int64_t> RelocAdjustment
=
477 RelocMgr
.getExprOpAddressRelocAdjustment(
478 *U
, Op
, AttrOffset
+ CurExprOffset
,
479 AttrOffset
+ Op
.getEndOffset(), Options
.Verbose
))
480 return std::make_pair(HasLocationAddress
, *RelocAdjustment
);
482 case dwarf::DW_OP_constx
:
483 case dwarf::DW_OP_addrx
: {
484 HasLocationAddress
= true;
485 if (std::optional
<uint64_t> AddressOffset
=
486 DIE
.getDwarfUnit()->getIndexedAddressOffset(
487 Op
.getRawOperand(0))) {
488 // Check relocation for the address.
489 if (std::optional
<int64_t> RelocAdjustment
=
490 RelocMgr
.getExprOpAddressRelocAdjustment(
491 *U
, Op
, *AddressOffset
,
492 *AddressOffset
+ DIE
.getDwarfUnit()->getAddressByteSize(),
494 return std::make_pair(HasLocationAddress
, *RelocAdjustment
);
501 CurExprOffset
= Op
.getEndOffset();
504 return std::make_pair(HasLocationAddress
, std::nullopt
);
507 /// Check if a variable describing DIE should be kept.
508 /// \returns updated TraversalFlags.
509 unsigned DWARFLinker::shouldKeepVariableDIE(AddressesMap
&RelocMgr
,
511 CompileUnit::DIEInfo
&MyInfo
,
513 const auto *Abbrev
= DIE
.getAbbreviationDeclarationPtr();
515 // Global variables with constant value can always be kept.
516 if (!(Flags
& TF_InFunctionScope
) &&
517 Abbrev
->findAttributeIndex(dwarf::DW_AT_const_value
)) {
518 MyInfo
.InDebugMap
= true;
519 return Flags
| TF_Keep
;
522 // See if there is a relocation to a valid debug map entry inside this
523 // variable's location. The order is important here. We want to always check
524 // if the variable has a valid relocation, so that the DIEInfo is filled.
525 // However, we don't want a static variable in a function to force us to keep
526 // the enclosing function, unless requested explicitly.
527 std::pair
<bool, std::optional
<int64_t>> LocExprAddrAndRelocAdjustment
=
528 getVariableRelocAdjustment(RelocMgr
, DIE
);
530 if (LocExprAddrAndRelocAdjustment
.first
)
531 MyInfo
.HasLocationExpressionAddr
= true;
533 if (!LocExprAddrAndRelocAdjustment
.second
)
536 MyInfo
.AddrAdjust
= *LocExprAddrAndRelocAdjustment
.second
;
537 MyInfo
.InDebugMap
= true;
539 if (((Flags
& TF_InFunctionScope
) &&
540 !LLVM_UNLIKELY(Options
.KeepFunctionForStatic
)))
543 if (Options
.Verbose
) {
544 outs() << "Keeping variable DIE:";
545 DIDumpOptions DumpOpts
;
546 DumpOpts
.ChildRecurseDepth
= 0;
547 DumpOpts
.Verbose
= Options
.Verbose
;
548 DIE
.dump(outs(), 8 /* Indent */, DumpOpts
);
551 return Flags
| TF_Keep
;
554 /// Check if a function describing DIE should be kept.
555 /// \returns updated TraversalFlags.
556 unsigned DWARFLinker::shouldKeepSubprogramDIE(
557 AddressesMap
&RelocMgr
, const DWARFDie
&DIE
, const DWARFFile
&File
,
558 CompileUnit
&Unit
, CompileUnit::DIEInfo
&MyInfo
, unsigned Flags
) {
559 Flags
|= TF_InFunctionScope
;
561 auto LowPc
= dwarf::toAddress(DIE
.find(dwarf::DW_AT_low_pc
));
565 assert(LowPc
&& "low_pc attribute is not an address.");
566 std::optional
<int64_t> RelocAdjustment
=
567 RelocMgr
.getSubprogramRelocAdjustment(DIE
, Options
.Verbose
);
568 if (!RelocAdjustment
)
571 MyInfo
.AddrAdjust
= *RelocAdjustment
;
572 MyInfo
.InDebugMap
= true;
574 if (Options
.Verbose
) {
575 outs() << "Keeping subprogram DIE:";
576 DIDumpOptions DumpOpts
;
577 DumpOpts
.ChildRecurseDepth
= 0;
578 DumpOpts
.Verbose
= Options
.Verbose
;
579 DIE
.dump(outs(), 8 /* Indent */, DumpOpts
);
582 if (DIE
.getTag() == dwarf::DW_TAG_label
) {
583 if (Unit
.hasLabelAt(*LowPc
))
586 DWARFUnit
&OrigUnit
= Unit
.getOrigUnit();
587 // FIXME: dsymutil-classic compat. dsymutil-classic doesn't consider labels
588 // that don't fall into the CU's aranges. This is wrong IMO. Debug info
589 // generation bugs aside, this is really wrong in the case of labels, where
590 // a label marking the end of a function will have a PC == CU's high_pc.
591 if (dwarf::toAddress(OrigUnit
.getUnitDIE().find(dwarf::DW_AT_high_pc
))
592 .value_or(UINT64_MAX
) <= LowPc
)
594 Unit
.addLabelLowPc(*LowPc
, MyInfo
.AddrAdjust
);
595 return Flags
| TF_Keep
;
600 std::optional
<uint64_t> HighPc
= DIE
.getHighPC(*LowPc
);
602 reportWarning("Function without high_pc. Range will be discarded.\n", File
,
606 if (*LowPc
> *HighPc
) {
607 reportWarning("low_pc greater than high_pc. Range will be discarded.\n",
612 // Replace the debug map range with a more accurate one.
613 Unit
.addFunctionRange(*LowPc
, *HighPc
, MyInfo
.AddrAdjust
);
617 /// Check if a DIE should be kept.
618 /// \returns updated TraversalFlags.
619 unsigned DWARFLinker::shouldKeepDIE(AddressesMap
&RelocMgr
, const DWARFDie
&DIE
,
620 const DWARFFile
&File
, CompileUnit
&Unit
,
621 CompileUnit::DIEInfo
&MyInfo
,
623 switch (DIE
.getTag()) {
624 case dwarf::DW_TAG_constant
:
625 case dwarf::DW_TAG_variable
:
626 return shouldKeepVariableDIE(RelocMgr
, DIE
, MyInfo
, Flags
);
627 case dwarf::DW_TAG_subprogram
:
628 case dwarf::DW_TAG_label
:
629 return shouldKeepSubprogramDIE(RelocMgr
, DIE
, File
, Unit
, MyInfo
, Flags
);
630 case dwarf::DW_TAG_base_type
:
631 // DWARF Expressions may reference basic types, but scanning them
632 // is expensive. Basic types are tiny, so just keep all of them.
633 case dwarf::DW_TAG_imported_module
:
634 case dwarf::DW_TAG_imported_declaration
:
635 case dwarf::DW_TAG_imported_unit
:
636 // We always want to keep these.
637 return Flags
| TF_Keep
;
645 /// Helper that updates the completeness of the current DIE based on the
646 /// completeness of one of its children. It depends on the incompleteness of
647 /// the children already being computed.
648 static void updateChildIncompleteness(const DWARFDie
&Die
, CompileUnit
&CU
,
649 CompileUnit::DIEInfo
&ChildInfo
) {
650 switch (Die
.getTag()) {
651 case dwarf::DW_TAG_structure_type
:
652 case dwarf::DW_TAG_class_type
:
653 case dwarf::DW_TAG_union_type
:
659 CompileUnit::DIEInfo
&MyInfo
= CU
.getInfo(Die
);
661 if (ChildInfo
.Incomplete
|| ChildInfo
.Prune
)
662 MyInfo
.Incomplete
= true;
665 /// Helper that updates the completeness of the current DIE based on the
666 /// completeness of the DIEs it references. It depends on the incompleteness of
667 /// the referenced DIE already being computed.
668 static void updateRefIncompleteness(const DWARFDie
&Die
, CompileUnit
&CU
,
669 CompileUnit::DIEInfo
&RefInfo
) {
670 switch (Die
.getTag()) {
671 case dwarf::DW_TAG_typedef
:
672 case dwarf::DW_TAG_member
:
673 case dwarf::DW_TAG_reference_type
:
674 case dwarf::DW_TAG_ptr_to_member_type
:
675 case dwarf::DW_TAG_pointer_type
:
681 CompileUnit::DIEInfo
&MyInfo
= CU
.getInfo(Die
);
683 if (MyInfo
.Incomplete
)
686 if (RefInfo
.Incomplete
)
687 MyInfo
.Incomplete
= true;
690 /// Look at the children of the given DIE and decide whether they should be
692 void DWARFLinker::lookForChildDIEsToKeep(
693 const DWARFDie
&Die
, CompileUnit
&CU
, unsigned Flags
,
694 SmallVectorImpl
<WorklistItem
> &Worklist
) {
695 // The TF_ParentWalk flag tells us that we are currently walking up the
696 // parent chain of a required DIE, and we don't want to mark all the children
697 // of the parents as kept (consider for example a DW_TAG_namespace node in
698 // the parent chain). There are however a set of DIE types for which we want
699 // to ignore that directive and still walk their children.
700 if (dieNeedsChildrenToBeMeaningful(Die
.getTag()))
701 Flags
&= ~DWARFLinker::TF_ParentWalk
;
703 // We're finished if this DIE has no children or we're walking the parent
705 if (!Die
.hasChildren() || (Flags
& DWARFLinker::TF_ParentWalk
))
708 // Add children in reverse order to the worklist to effectively process them
710 for (auto Child
: reverse(Die
.children())) {
711 // Add a worklist item before every child to calculate incompleteness right
712 // after the current child is processed.
713 CompileUnit::DIEInfo
&ChildInfo
= CU
.getInfo(Child
);
714 Worklist
.emplace_back(Die
, CU
, WorklistItemType::UpdateChildIncompleteness
,
716 Worklist
.emplace_back(Child
, CU
, Flags
);
720 static bool isODRCanonicalCandidate(const DWARFDie
&Die
, CompileUnit
&CU
) {
721 CompileUnit::DIEInfo
&Info
= CU
.getInfo(Die
);
723 if (!Info
.Ctxt
|| (Die
.getTag() == dwarf::DW_TAG_namespace
))
726 if (!CU
.hasODR() && !Info
.InModuleScope
)
729 return !Info
.Incomplete
&& Info
.Ctxt
!= CU
.getInfo(Info
.ParentIdx
).Ctxt
;
732 void DWARFLinker::markODRCanonicalDie(const DWARFDie
&Die
, CompileUnit
&CU
) {
733 CompileUnit::DIEInfo
&Info
= CU
.getInfo(Die
);
735 Info
.ODRMarkingDone
= true;
736 if (Info
.Keep
&& isODRCanonicalCandidate(Die
, CU
) &&
737 !Info
.Ctxt
->hasCanonicalDIE())
738 Info
.Ctxt
->setHasCanonicalDIE();
741 /// Look at DIEs referenced by the given DIE and decide whether they should be
742 /// kept. All DIEs referenced though attributes should be kept.
743 void DWARFLinker::lookForRefDIEsToKeep(
744 const DWARFDie
&Die
, CompileUnit
&CU
, unsigned Flags
,
745 const UnitListTy
&Units
, const DWARFFile
&File
,
746 SmallVectorImpl
<WorklistItem
> &Worklist
) {
747 bool UseOdr
= (Flags
& DWARFLinker::TF_DependencyWalk
)
748 ? (Flags
& DWARFLinker::TF_ODR
)
750 DWARFUnit
&Unit
= CU
.getOrigUnit();
751 DWARFDataExtractor Data
= Unit
.getDebugInfoExtractor();
752 const auto *Abbrev
= Die
.getAbbreviationDeclarationPtr();
753 uint64_t Offset
= Die
.getOffset() + getULEB128Size(Abbrev
->getCode());
755 SmallVector
<std::pair
<DWARFDie
, CompileUnit
&>, 4> ReferencedDIEs
;
756 for (const auto &AttrSpec
: Abbrev
->attributes()) {
757 DWARFFormValue
Val(AttrSpec
.Form
);
758 if (!Val
.isFormClass(DWARFFormValue::FC_Reference
) ||
759 AttrSpec
.Attr
== dwarf::DW_AT_sibling
) {
760 DWARFFormValue::skipValue(AttrSpec
.Form
, Data
, &Offset
,
761 Unit
.getFormParams());
765 Val
.extractValue(Data
, &Offset
, Unit
.getFormParams(), &Unit
);
766 CompileUnit
*ReferencedCU
;
768 resolveDIEReference(File
, Units
, Val
, Die
, ReferencedCU
)) {
769 CompileUnit::DIEInfo
&Info
= ReferencedCU
->getInfo(RefDie
);
770 // If the referenced DIE has a DeclContext that has already been
771 // emitted, then do not keep the one in this CU. We'll link to
772 // the canonical DIE in cloneDieReferenceAttribute.
774 // FIXME: compatibility with dsymutil-classic. UseODR shouldn't
775 // be necessary and could be advantageously replaced by
776 // ReferencedCU->hasODR() && CU.hasODR().
778 // FIXME: compatibility with dsymutil-classic. There is no
779 // reason not to unique ref_addr references.
780 if (AttrSpec
.Form
!= dwarf::DW_FORM_ref_addr
&&
781 isODRAttribute(AttrSpec
.Attr
) && Info
.Ctxt
&&
782 Info
.Ctxt
->hasCanonicalDIE())
785 // Keep a module forward declaration if there is no definition.
786 if (!(isODRAttribute(AttrSpec
.Attr
) && Info
.Ctxt
&&
787 Info
.Ctxt
->hasCanonicalDIE()))
789 ReferencedDIEs
.emplace_back(RefDie
, *ReferencedCU
);
793 unsigned ODRFlag
= UseOdr
? DWARFLinker::TF_ODR
: 0;
795 // Add referenced DIEs in reverse order to the worklist to effectively
796 // process them in order.
797 for (auto &P
: reverse(ReferencedDIEs
)) {
798 // Add a worklist item before every child to calculate incompleteness right
799 // after the current child is processed.
800 CompileUnit::DIEInfo
&Info
= P
.second
.getInfo(P
.first
);
801 Worklist
.emplace_back(Die
, CU
, WorklistItemType::UpdateRefIncompleteness
,
803 Worklist
.emplace_back(P
.first
, P
.second
,
804 DWARFLinker::TF_Keep
|
805 DWARFLinker::TF_DependencyWalk
| ODRFlag
);
809 /// Look at the parent of the given DIE and decide whether they should be kept.
810 void DWARFLinker::lookForParentDIEsToKeep(
811 unsigned AncestorIdx
, CompileUnit
&CU
, unsigned Flags
,
812 SmallVectorImpl
<WorklistItem
> &Worklist
) {
813 // Stop if we encounter an ancestor that's already marked as kept.
814 if (CU
.getInfo(AncestorIdx
).Keep
)
817 DWARFUnit
&Unit
= CU
.getOrigUnit();
818 DWARFDie ParentDIE
= Unit
.getDIEAtIndex(AncestorIdx
);
819 Worklist
.emplace_back(CU
.getInfo(AncestorIdx
).ParentIdx
, CU
, Flags
);
820 Worklist
.emplace_back(ParentDIE
, CU
, Flags
);
823 /// Recursively walk the \p DIE tree and look for DIEs to keep. Store that
824 /// information in \p CU's DIEInfo.
826 /// This function is the entry point of the DIE selection algorithm. It is
827 /// expected to walk the DIE tree in file order and (though the mediation of
828 /// its helper) call hasValidRelocation() on each DIE that might be a 'root
829 /// DIE' (See DwarfLinker class comment).
831 /// While walking the dependencies of root DIEs, this function is also called,
832 /// but during these dependency walks the file order is not respected. The
833 /// TF_DependencyWalk flag tells us which kind of traversal we are currently
836 /// The recursive algorithm is implemented iteratively as a work list because
837 /// very deep recursion could exhaust the stack for large projects. The work
838 /// list acts as a scheduler for different types of work that need to be
841 /// The recursive nature of the algorithm is simulated by running the "main"
842 /// algorithm (LookForDIEsToKeep) followed by either looking at more DIEs
843 /// (LookForChildDIEsToKeep, LookForRefDIEsToKeep, LookForParentDIEsToKeep) or
844 /// fixing up a computed property (UpdateChildIncompleteness,
845 /// UpdateRefIncompleteness).
847 /// The return value indicates whether the DIE is incomplete.
848 void DWARFLinker::lookForDIEsToKeep(AddressesMap
&AddressesMap
,
849 const UnitListTy
&Units
,
850 const DWARFDie
&Die
, const DWARFFile
&File
,
851 CompileUnit
&Cu
, unsigned Flags
) {
853 SmallVector
<WorklistItem
, 4> Worklist
;
854 Worklist
.emplace_back(Die
, Cu
, Flags
);
856 while (!Worklist
.empty()) {
857 WorklistItem Current
= Worklist
.pop_back_val();
859 // Look at the worklist type to decide what kind of work to perform.
860 switch (Current
.Type
) {
861 case WorklistItemType::UpdateChildIncompleteness
:
862 updateChildIncompleteness(Current
.Die
, Current
.CU
, *Current
.OtherInfo
);
864 case WorklistItemType::UpdateRefIncompleteness
:
865 updateRefIncompleteness(Current
.Die
, Current
.CU
, *Current
.OtherInfo
);
867 case WorklistItemType::LookForChildDIEsToKeep
:
868 lookForChildDIEsToKeep(Current
.Die
, Current
.CU
, Current
.Flags
, Worklist
);
870 case WorklistItemType::LookForRefDIEsToKeep
:
871 lookForRefDIEsToKeep(Current
.Die
, Current
.CU
, Current
.Flags
, Units
, File
,
874 case WorklistItemType::LookForParentDIEsToKeep
:
875 lookForParentDIEsToKeep(Current
.AncestorIdx
, Current
.CU
, Current
.Flags
,
878 case WorklistItemType::MarkODRCanonicalDie
:
879 markODRCanonicalDie(Current
.Die
, Current
.CU
);
881 case WorklistItemType::LookForDIEsToKeep
:
885 unsigned Idx
= Current
.CU
.getOrigUnit().getDIEIndex(Current
.Die
);
886 CompileUnit::DIEInfo
&MyInfo
= Current
.CU
.getInfo(Idx
);
889 // We're walking the dependencies of a module forward declaration that was
890 // kept because there is no definition.
891 if (Current
.Flags
& TF_DependencyWalk
)
892 MyInfo
.Prune
= false;
897 // If the Keep flag is set, we are marking a required DIE's dependencies.
898 // If our target is already marked as kept, we're all set.
899 bool AlreadyKept
= MyInfo
.Keep
;
900 if ((Current
.Flags
& TF_DependencyWalk
) && AlreadyKept
)
903 if (!(Current
.Flags
& TF_DependencyWalk
))
904 Current
.Flags
= shouldKeepDIE(AddressesMap
, Current
.Die
, File
, Current
.CU
,
905 MyInfo
, Current
.Flags
);
907 // We need to mark context for the canonical die in the end of normal
908 // traversing(not TF_DependencyWalk) or after normal traversing if die
909 // was not marked as kept.
910 if (!(Current
.Flags
& TF_DependencyWalk
) ||
911 (MyInfo
.ODRMarkingDone
&& !MyInfo
.Keep
)) {
912 if (Current
.CU
.hasODR() || MyInfo
.InModuleScope
)
913 Worklist
.emplace_back(Current
.Die
, Current
.CU
,
914 WorklistItemType::MarkODRCanonicalDie
);
917 // Finish by looking for child DIEs. Because of the LIFO worklist we need
918 // to schedule that work before any subsequent items are added to the
920 Worklist
.emplace_back(Current
.Die
, Current
.CU
, Current
.Flags
,
921 WorklistItemType::LookForChildDIEsToKeep
);
923 if (AlreadyKept
|| !(Current
.Flags
& TF_Keep
))
926 // If it is a newly kept DIE mark it as well as all its dependencies as
930 // We're looking for incomplete types.
932 Current
.Die
.getTag() != dwarf::DW_TAG_subprogram
&&
933 Current
.Die
.getTag() != dwarf::DW_TAG_member
&&
934 dwarf::toUnsigned(Current
.Die
.find(dwarf::DW_AT_declaration
), 0);
936 // After looking at the parent chain, look for referenced DIEs. Because of
937 // the LIFO worklist we need to schedule that work before any subsequent
938 // items are added to the worklist.
939 Worklist
.emplace_back(Current
.Die
, Current
.CU
, Current
.Flags
,
940 WorklistItemType::LookForRefDIEsToKeep
);
942 bool UseOdr
= (Current
.Flags
& TF_DependencyWalk
) ? (Current
.Flags
& TF_ODR
)
943 : Current
.CU
.hasODR();
944 unsigned ODRFlag
= UseOdr
? TF_ODR
: 0;
945 unsigned ParFlags
= TF_ParentWalk
| TF_Keep
| TF_DependencyWalk
| ODRFlag
;
947 // Now schedule the parent walk.
948 Worklist
.emplace_back(MyInfo
.ParentIdx
, Current
.CU
, ParFlags
);
953 /// A broken link in the keep chain. By recording both the parent and the child
954 /// we can show only broken links for DIEs with multiple children.
956 BrokenLink(DWARFDie Parent
, DWARFDie Child
) : Parent(Parent
), Child(Child
) {}
961 /// Verify the keep chain by looking for DIEs that are kept but who's parent
963 static void verifyKeepChain(CompileUnit
&CU
) {
964 std::vector
<DWARFDie
> Worklist
;
965 Worklist
.push_back(CU
.getOrigUnit().getUnitDIE());
967 // List of broken links.
968 std::vector
<BrokenLink
> BrokenLinks
;
970 while (!Worklist
.empty()) {
971 const DWARFDie Current
= Worklist
.back();
974 const bool CurrentDieIsKept
= CU
.getInfo(Current
).Keep
;
976 for (DWARFDie Child
: reverse(Current
.children())) {
977 Worklist
.push_back(Child
);
979 const bool ChildDieIsKept
= CU
.getInfo(Child
).Keep
;
980 if (!CurrentDieIsKept
&& ChildDieIsKept
)
981 BrokenLinks
.emplace_back(Current
, Child
);
985 if (!BrokenLinks
.empty()) {
986 for (BrokenLink Link
: BrokenLinks
) {
987 WithColor::error() << formatv(
988 "Found invalid link in keep chain between {0:x} and {1:x}\n",
989 Link
.Parent
.getOffset(), Link
.Child
.getOffset());
992 Link
.Parent
.dump(errs(), 0, {});
993 CU
.getInfo(Link
.Parent
).dump();
996 Link
.Child
.dump(errs(), 2, {});
997 CU
.getInfo(Link
.Child
).dump();
999 report_fatal_error("invalid keep chain");
1004 /// Assign an abbreviation number to \p Abbrev.
1006 /// Our DIEs get freed after every DebugMapObject has been processed,
1007 /// thus the FoldingSet we use to unique DIEAbbrevs cannot refer to
1008 /// the instances hold by the DIEs. When we encounter an abbreviation
1009 /// that we don't know, we create a permanent copy of it.
1010 void DWARFLinker::assignAbbrev(DIEAbbrev
&Abbrev
) {
1011 // Check the set for priors.
1012 FoldingSetNodeID ID
;
1015 DIEAbbrev
*InSet
= AbbreviationsSet
.FindNodeOrInsertPos(ID
, InsertToken
);
1017 // If it's newly added.
1019 // Assign existing abbreviation number.
1020 Abbrev
.setNumber(InSet
->getNumber());
1022 // Add to abbreviation list.
1023 Abbreviations
.push_back(
1024 std::make_unique
<DIEAbbrev
>(Abbrev
.getTag(), Abbrev
.hasChildren()));
1025 for (const auto &Attr
: Abbrev
.getData())
1026 Abbreviations
.back()->AddAttribute(Attr
);
1027 AbbreviationsSet
.InsertNode(Abbreviations
.back().get(), InsertToken
);
1028 // Assign the unique abbreviation number.
1029 Abbrev
.setNumber(Abbreviations
.size());
1030 Abbreviations
.back()->setNumber(Abbreviations
.size());
1034 unsigned DWARFLinker::DIECloner::cloneStringAttribute(DIE
&Die
,
1035 AttributeSpec AttrSpec
,
1036 const DWARFFormValue
&Val
,
1038 AttributesInfo
&Info
) {
1039 std::optional
<const char *> String
= dwarf::toString(Val
);
1042 DwarfStringPoolEntryRef StringEntry
;
1043 if (AttrSpec
.Form
== dwarf::DW_FORM_line_strp
) {
1044 StringEntry
= DebugLineStrPool
.getEntry(*String
);
1046 StringEntry
= DebugStrPool
.getEntry(*String
);
1048 if (AttrSpec
.Attr
== dwarf::DW_AT_APPLE_origin
) {
1049 Info
.HasAppleOrigin
= true;
1050 if (std::optional
<StringRef
> FileName
=
1051 ObjFile
.Addresses
->getLibraryInstallName()) {
1052 StringEntry
= DebugStrPool
.getEntry(*FileName
);
1056 // Update attributes info.
1057 if (AttrSpec
.Attr
== dwarf::DW_AT_name
)
1058 Info
.Name
= StringEntry
;
1059 else if (AttrSpec
.Attr
== dwarf::DW_AT_MIPS_linkage_name
||
1060 AttrSpec
.Attr
== dwarf::DW_AT_linkage_name
)
1061 Info
.MangledName
= StringEntry
;
1062 if (U
.getVersion() >= 5) {
1063 // Switch everything to DW_FORM_strx strings.
1064 auto StringOffsetIndex
=
1065 StringOffsetPool
.getValueIndex(StringEntry
.getOffset());
1067 .addValue(DIEAlloc
, dwarf::Attribute(AttrSpec
.Attr
),
1068 dwarf::DW_FORM_strx
, DIEInteger(StringOffsetIndex
))
1069 ->sizeOf(U
.getFormParams());
1071 // Switch everything to out of line strings.
1072 AttrSpec
.Form
= dwarf::DW_FORM_strp
;
1074 Die
.addValue(DIEAlloc
, dwarf::Attribute(AttrSpec
.Attr
), AttrSpec
.Form
,
1075 DIEInteger(StringEntry
.getOffset()));
1079 unsigned DWARFLinker::DIECloner::cloneDieReferenceAttribute(
1080 DIE
&Die
, const DWARFDie
&InputDIE
, AttributeSpec AttrSpec
,
1081 unsigned AttrSize
, const DWARFFormValue
&Val
, const DWARFFile
&File
,
1082 CompileUnit
&Unit
) {
1083 const DWARFUnit
&U
= Unit
.getOrigUnit();
1085 if (std::optional
<uint64_t> Off
= Val
.getAsRelativeReference())
1086 Ref
= Val
.getUnit()->getOffset() + *Off
;
1087 else if (Off
= Val
.getAsDebugInfoReference(); Off
)
1092 DIE
*NewRefDie
= nullptr;
1093 CompileUnit
*RefUnit
= nullptr;
1096 Linker
.resolveDIEReference(File
, CompileUnits
, Val
, InputDIE
, RefUnit
);
1098 // If the referenced DIE is not found, drop the attribute.
1099 if (!RefDie
|| AttrSpec
.Attr
== dwarf::DW_AT_sibling
)
1102 CompileUnit::DIEInfo
&RefInfo
= RefUnit
->getInfo(RefDie
);
1104 // If we already have emitted an equivalent DeclContext, just point
1106 if (isODRAttribute(AttrSpec
.Attr
) && RefInfo
.Ctxt
&&
1107 RefInfo
.Ctxt
->getCanonicalDIEOffset()) {
1108 assert(RefInfo
.Ctxt
->hasCanonicalDIE() &&
1109 "Offset to canonical die is set, but context is not marked");
1110 DIEInteger
Attr(RefInfo
.Ctxt
->getCanonicalDIEOffset());
1111 Die
.addValue(DIEAlloc
, dwarf::Attribute(AttrSpec
.Attr
),
1112 dwarf::DW_FORM_ref_addr
, Attr
);
1113 return U
.getRefAddrByteSize();
1116 if (!RefInfo
.Clone
) {
1117 // We haven't cloned this DIE yet. Just create an empty one and
1118 // store it. It'll get really cloned when we process it.
1119 RefInfo
.UnclonedReference
= true;
1120 RefInfo
.Clone
= DIE::get(DIEAlloc
, dwarf::Tag(RefDie
.getTag()));
1122 NewRefDie
= RefInfo
.Clone
;
1124 if (AttrSpec
.Form
== dwarf::DW_FORM_ref_addr
||
1125 (Unit
.hasODR() && isODRAttribute(AttrSpec
.Attr
))) {
1126 // We cannot currently rely on a DIEEntry to emit ref_addr
1127 // references, because the implementation calls back to DwarfDebug
1128 // to find the unit offset. (We don't have a DwarfDebug)
1129 // FIXME: we should be able to design DIEEntry reliance on
1132 if (Ref
< InputDIE
.getOffset() && !RefInfo
.UnclonedReference
) {
1133 // We have already cloned that DIE.
1134 uint32_t NewRefOffset
=
1135 RefUnit
->getStartOffset() + NewRefDie
->getOffset();
1136 Attr
= NewRefOffset
;
1137 Die
.addValue(DIEAlloc
, dwarf::Attribute(AttrSpec
.Attr
),
1138 dwarf::DW_FORM_ref_addr
, DIEInteger(Attr
));
1140 // A forward reference. Note and fixup later.
1142 Unit
.noteForwardReference(
1143 NewRefDie
, RefUnit
, RefInfo
.Ctxt
,
1144 Die
.addValue(DIEAlloc
, dwarf::Attribute(AttrSpec
.Attr
),
1145 dwarf::DW_FORM_ref_addr
, DIEInteger(Attr
)));
1147 return U
.getRefAddrByteSize();
1150 Die
.addValue(DIEAlloc
, dwarf::Attribute(AttrSpec
.Attr
),
1151 dwarf::Form(AttrSpec
.Form
), DIEEntry(*NewRefDie
));
1156 void DWARFLinker::DIECloner::cloneExpression(
1157 DataExtractor
&Data
, DWARFExpression Expression
, const DWARFFile
&File
,
1158 CompileUnit
&Unit
, SmallVectorImpl
<uint8_t> &OutputBuffer
,
1159 int64_t AddrRelocAdjustment
, bool IsLittleEndian
) {
1160 using Encoding
= DWARFExpression::Operation::Encoding
;
1162 uint8_t OrigAddressByteSize
= Unit
.getOrigUnit().getAddressByteSize();
1164 uint64_t OpOffset
= 0;
1165 for (auto &Op
: Expression
) {
1166 auto Desc
= Op
.getDescription();
1167 // DW_OP_const_type is variable-length and has 3
1168 // operands. Thus far we only support 2.
1169 if ((Desc
.Op
.size() == 2 && Desc
.Op
[0] == Encoding::BaseTypeRef
) ||
1170 (Desc
.Op
.size() == 2 && Desc
.Op
[1] == Encoding::BaseTypeRef
&&
1171 Desc
.Op
[0] != Encoding::Size1
))
1172 Linker
.reportWarning("Unsupported DW_OP encoding.", File
);
1174 if ((Desc
.Op
.size() == 1 && Desc
.Op
[0] == Encoding::BaseTypeRef
) ||
1175 (Desc
.Op
.size() == 2 && Desc
.Op
[1] == Encoding::BaseTypeRef
&&
1176 Desc
.Op
[0] == Encoding::Size1
)) {
1177 // This code assumes that the other non-typeref operand fits into 1 byte.
1178 assert(OpOffset
< Op
.getEndOffset());
1179 uint32_t ULEBsize
= Op
.getEndOffset() - OpOffset
- 1;
1180 assert(ULEBsize
<= 16);
1182 // Copy over the operation.
1183 assert(!Op
.getSubCode() && "SubOps not yet supported");
1184 OutputBuffer
.push_back(Op
.getCode());
1186 if (Desc
.Op
.size() == 1) {
1187 RefOffset
= Op
.getRawOperand(0);
1189 OutputBuffer
.push_back(Op
.getRawOperand(0));
1190 RefOffset
= Op
.getRawOperand(1);
1192 uint32_t Offset
= 0;
1193 // Look up the base type. For DW_OP_convert, the operand may be 0 to
1194 // instead indicate the generic type. The same holds for
1195 // DW_OP_reinterpret, which is currently not supported.
1196 if (RefOffset
> 0 || Op
.getCode() != dwarf::DW_OP_convert
) {
1197 RefOffset
+= Unit
.getOrigUnit().getOffset();
1198 auto RefDie
= Unit
.getOrigUnit().getDIEForOffset(RefOffset
);
1199 CompileUnit::DIEInfo
&Info
= Unit
.getInfo(RefDie
);
1200 if (DIE
*Clone
= Info
.Clone
)
1201 Offset
= Clone
->getOffset();
1203 Linker
.reportWarning(
1204 "base type ref doesn't point to DW_TAG_base_type.", File
);
1207 unsigned RealSize
= encodeULEB128(Offset
, ULEB
, ULEBsize
);
1208 if (RealSize
> ULEBsize
) {
1209 // Emit the generic type as a fallback.
1210 RealSize
= encodeULEB128(0, ULEB
, ULEBsize
);
1211 Linker
.reportWarning("base type ref doesn't fit.", File
);
1213 assert(RealSize
== ULEBsize
&& "padding failed");
1214 ArrayRef
<uint8_t> ULEBbytes(ULEB
, ULEBsize
);
1215 OutputBuffer
.append(ULEBbytes
.begin(), ULEBbytes
.end());
1216 } else if (!Linker
.Options
.Update
&& Op
.getCode() == dwarf::DW_OP_addrx
) {
1217 if (std::optional
<object::SectionedAddress
> SA
=
1218 Unit
.getOrigUnit().getAddrOffsetSectionItem(
1219 Op
.getRawOperand(0))) {
1220 // DWARFLinker does not use addrx forms since it generates relocated
1221 // addresses. Replace DW_OP_addrx with DW_OP_addr here.
1222 // Argument of DW_OP_addrx should be relocated here as it is not
1223 // processed by applyValidRelocs.
1224 OutputBuffer
.push_back(dwarf::DW_OP_addr
);
1225 uint64_t LinkedAddress
= SA
->Address
+ AddrRelocAdjustment
;
1226 if (IsLittleEndian
!= sys::IsLittleEndianHost
)
1227 sys::swapByteOrder(LinkedAddress
);
1228 ArrayRef
<uint8_t> AddressBytes(
1229 reinterpret_cast<const uint8_t *>(&LinkedAddress
),
1230 OrigAddressByteSize
);
1231 OutputBuffer
.append(AddressBytes
.begin(), AddressBytes
.end());
1233 Linker
.reportWarning("cannot read DW_OP_addrx operand.", File
);
1234 } else if (!Linker
.Options
.Update
&& Op
.getCode() == dwarf::DW_OP_constx
) {
1235 if (std::optional
<object::SectionedAddress
> SA
=
1236 Unit
.getOrigUnit().getAddrOffsetSectionItem(
1237 Op
.getRawOperand(0))) {
1238 // DWARFLinker does not use constx forms since it generates relocated
1239 // addresses. Replace DW_OP_constx with DW_OP_const[*]u here.
1240 // Argument of DW_OP_constx should be relocated here as it is not
1241 // processed by applyValidRelocs.
1242 std::optional
<uint8_t> OutOperandKind
;
1243 switch (OrigAddressByteSize
) {
1245 OutOperandKind
= dwarf::DW_OP_const4u
;
1248 OutOperandKind
= dwarf::DW_OP_const8u
;
1251 Linker
.reportWarning(
1252 formatv(("unsupported address size: {0}."), OrigAddressByteSize
),
1257 if (OutOperandKind
) {
1258 OutputBuffer
.push_back(*OutOperandKind
);
1259 uint64_t LinkedAddress
= SA
->Address
+ AddrRelocAdjustment
;
1260 if (IsLittleEndian
!= sys::IsLittleEndianHost
)
1261 sys::swapByteOrder(LinkedAddress
);
1262 ArrayRef
<uint8_t> AddressBytes(
1263 reinterpret_cast<const uint8_t *>(&LinkedAddress
),
1264 OrigAddressByteSize
);
1265 OutputBuffer
.append(AddressBytes
.begin(), AddressBytes
.end());
1268 Linker
.reportWarning("cannot read DW_OP_constx operand.", File
);
1270 // Copy over everything else unmodified.
1271 StringRef Bytes
= Data
.getData().slice(OpOffset
, Op
.getEndOffset());
1272 OutputBuffer
.append(Bytes
.begin(), Bytes
.end());
1274 OpOffset
= Op
.getEndOffset();
1278 unsigned DWARFLinker::DIECloner::cloneBlockAttribute(
1279 DIE
&Die
, const DWARFDie
&InputDIE
, const DWARFFile
&File
,
1280 CompileUnit
&Unit
, AttributeSpec AttrSpec
, const DWARFFormValue
&Val
,
1281 bool IsLittleEndian
) {
1284 DIELoc
*Loc
= nullptr;
1285 DIEBlock
*Block
= nullptr;
1286 if (AttrSpec
.Form
== dwarf::DW_FORM_exprloc
) {
1287 Loc
= new (DIEAlloc
) DIELoc
;
1288 Linker
.DIELocs
.push_back(Loc
);
1290 Block
= new (DIEAlloc
) DIEBlock
;
1291 Linker
.DIEBlocks
.push_back(Block
);
1293 Attr
= Loc
? static_cast<DIEValueList
*>(Loc
)
1294 : static_cast<DIEValueList
*>(Block
);
1296 DWARFUnit
&OrigUnit
= Unit
.getOrigUnit();
1297 // If the block is a DWARF Expression, clone it into the temporary
1298 // buffer using cloneExpression(), otherwise copy the data directly.
1299 SmallVector
<uint8_t, 32> Buffer
;
1300 ArrayRef
<uint8_t> Bytes
= *Val
.getAsBlock();
1301 if (DWARFAttribute::mayHaveLocationExpr(AttrSpec
.Attr
) &&
1302 (Val
.isFormClass(DWARFFormValue::FC_Block
) ||
1303 Val
.isFormClass(DWARFFormValue::FC_Exprloc
))) {
1304 DataExtractor
Data(StringRef((const char *)Bytes
.data(), Bytes
.size()),
1305 IsLittleEndian
, OrigUnit
.getAddressByteSize());
1306 DWARFExpression
Expr(Data
, OrigUnit
.getAddressByteSize(),
1307 OrigUnit
.getFormParams().Format
);
1308 cloneExpression(Data
, Expr
, File
, Unit
, Buffer
,
1309 Unit
.getInfo(InputDIE
).AddrAdjust
, IsLittleEndian
);
1312 for (auto Byte
: Bytes
)
1313 Attr
->addValue(DIEAlloc
, static_cast<dwarf::Attribute
>(0),
1314 dwarf::DW_FORM_data1
, DIEInteger(Byte
));
1316 // FIXME: If DIEBlock and DIELoc just reuses the Size field of
1317 // the DIE class, this "if" could be replaced by
1318 // Attr->setSize(Bytes.size()).
1320 Loc
->setSize(Bytes
.size());
1322 Block
->setSize(Bytes
.size());
1325 Value
= DIEValue(dwarf::Attribute(AttrSpec
.Attr
),
1326 dwarf::Form(AttrSpec
.Form
), Loc
);
1328 // The expression location data might be updated and exceed the original
1329 // size. Check whether the new data fits into the original form.
1330 if ((AttrSpec
.Form
== dwarf::DW_FORM_block1
&&
1331 (Bytes
.size() > UINT8_MAX
)) ||
1332 (AttrSpec
.Form
== dwarf::DW_FORM_block2
&&
1333 (Bytes
.size() > UINT16_MAX
)) ||
1334 (AttrSpec
.Form
== dwarf::DW_FORM_block4
&& (Bytes
.size() > UINT32_MAX
)))
1335 AttrSpec
.Form
= dwarf::DW_FORM_block
;
1337 Value
= DIEValue(dwarf::Attribute(AttrSpec
.Attr
),
1338 dwarf::Form(AttrSpec
.Form
), Block
);
1341 return Die
.addValue(DIEAlloc
, Value
)->sizeOf(OrigUnit
.getFormParams());
1344 unsigned DWARFLinker::DIECloner::cloneAddressAttribute(
1345 DIE
&Die
, const DWARFDie
&InputDIE
, AttributeSpec AttrSpec
,
1346 unsigned AttrSize
, const DWARFFormValue
&Val
, const CompileUnit
&Unit
,
1347 AttributesInfo
&Info
) {
1348 if (AttrSpec
.Attr
== dwarf::DW_AT_low_pc
)
1349 Info
.HasLowPc
= true;
1351 if (LLVM_UNLIKELY(Linker
.Options
.Update
)) {
1352 Die
.addValue(DIEAlloc
, dwarf::Attribute(AttrSpec
.Attr
),
1353 dwarf::Form(AttrSpec
.Form
), DIEInteger(Val
.getRawUValue()));
1357 // Cloned Die may have address attributes relocated to a
1358 // totally unrelated value. This can happen:
1359 // - If high_pc is an address (Dwarf version == 2), then it might have been
1360 // relocated to a totally unrelated value (because the end address in the
1361 // object file might be start address of another function which got moved
1362 // independently by the linker).
1363 // - If address relocated in an inline_subprogram that happens at the
1364 // beginning of its inlining function.
1365 // To avoid above cases and to not apply relocation twice (in
1366 // applyValidRelocs and here), read address attribute from InputDIE and apply
1367 // Info.PCOffset here.
1369 std::optional
<DWARFFormValue
> AddrAttribute
= InputDIE
.find(AttrSpec
.Attr
);
1371 llvm_unreachable("Cann't find attribute.");
1373 std::optional
<uint64_t> Addr
= AddrAttribute
->getAsAddress();
1375 Linker
.reportWarning("Cann't read address attribute value.", ObjFile
);
1379 if (InputDIE
.getTag() == dwarf::DW_TAG_compile_unit
&&
1380 AttrSpec
.Attr
== dwarf::DW_AT_low_pc
) {
1381 if (std::optional
<uint64_t> LowPC
= Unit
.getLowPc())
1385 } else if (InputDIE
.getTag() == dwarf::DW_TAG_compile_unit
&&
1386 AttrSpec
.Attr
== dwarf::DW_AT_high_pc
) {
1387 if (uint64_t HighPc
= Unit
.getHighPc())
1392 *Addr
+= Info
.PCOffset
;
1395 if (AttrSpec
.Form
== dwarf::DW_FORM_addr
) {
1396 Die
.addValue(DIEAlloc
, static_cast<dwarf::Attribute
>(AttrSpec
.Attr
),
1397 AttrSpec
.Form
, DIEInteger(*Addr
));
1398 return Unit
.getOrigUnit().getAddressByteSize();
1401 auto AddrIndex
= AddrPool
.getValueIndex(*Addr
);
1404 .addValue(DIEAlloc
, static_cast<dwarf::Attribute
>(AttrSpec
.Attr
),
1405 dwarf::Form::DW_FORM_addrx
, DIEInteger(AddrIndex
))
1406 ->sizeOf(Unit
.getOrigUnit().getFormParams());
1409 unsigned DWARFLinker::DIECloner::cloneScalarAttribute(
1410 DIE
&Die
, const DWARFDie
&InputDIE
, const DWARFFile
&File
,
1411 CompileUnit
&Unit
, AttributeSpec AttrSpec
, const DWARFFormValue
&Val
,
1412 unsigned AttrSize
, AttributesInfo
&Info
) {
1415 // We don't emit any skeleton CUs with dsymutil. So avoid emitting
1416 // a redundant DW_AT_GNU_dwo_id on the non-skeleton CU.
1417 if (AttrSpec
.Attr
== dwarf::DW_AT_GNU_dwo_id
||
1418 AttrSpec
.Attr
== dwarf::DW_AT_dwo_id
)
1421 // Check for the offset to the macro table. If offset is incorrect then we
1422 // need to remove the attribute.
1423 if (AttrSpec
.Attr
== dwarf::DW_AT_macro_info
) {
1424 if (std::optional
<uint64_t> Offset
= Val
.getAsSectionOffset()) {
1425 const llvm::DWARFDebugMacro
*Macro
= File
.Dwarf
->getDebugMacinfo();
1426 if (Macro
== nullptr || !Macro
->hasEntryForOffset(*Offset
))
1431 if (AttrSpec
.Attr
== dwarf::DW_AT_macros
) {
1432 if (std::optional
<uint64_t> Offset
= Val
.getAsSectionOffset()) {
1433 const llvm::DWARFDebugMacro
*Macro
= File
.Dwarf
->getDebugMacro();
1434 if (Macro
== nullptr || !Macro
->hasEntryForOffset(*Offset
))
1439 if (AttrSpec
.Attr
== dwarf::DW_AT_str_offsets_base
) {
1440 // DWARFLinker generates common .debug_str_offsets table used for all
1441 // compile units. The offset to the common .debug_str_offsets table is 8 on
1443 Info
.AttrStrOffsetBaseSeen
= true;
1445 .addValue(DIEAlloc
, dwarf::DW_AT_str_offsets_base
,
1446 dwarf::DW_FORM_sec_offset
, DIEInteger(8))
1447 ->sizeOf(Unit
.getOrigUnit().getFormParams());
1450 if (LLVM_UNLIKELY(Linker
.Options
.Update
)) {
1451 if (auto OptionalValue
= Val
.getAsUnsignedConstant())
1452 Value
= *OptionalValue
;
1453 else if (auto OptionalValue
= Val
.getAsSignedConstant())
1454 Value
= *OptionalValue
;
1455 else if (auto OptionalValue
= Val
.getAsSectionOffset())
1456 Value
= *OptionalValue
;
1458 Linker
.reportWarning(
1459 "Unsupported scalar attribute form. Dropping attribute.", File
,
1463 if (AttrSpec
.Attr
== dwarf::DW_AT_declaration
&& Value
)
1464 Info
.IsDeclaration
= true;
1466 if (AttrSpec
.Form
== dwarf::DW_FORM_loclistx
)
1467 Die
.addValue(DIEAlloc
, dwarf::Attribute(AttrSpec
.Attr
),
1468 dwarf::Form(AttrSpec
.Form
), DIELocList(Value
));
1470 Die
.addValue(DIEAlloc
, dwarf::Attribute(AttrSpec
.Attr
),
1471 dwarf::Form(AttrSpec
.Form
), DIEInteger(Value
));
1475 [[maybe_unused
]] dwarf::Form OriginalForm
= AttrSpec
.Form
;
1476 if (AttrSpec
.Form
== dwarf::DW_FORM_rnglistx
) {
1477 // DWARFLinker does not generate .debug_addr table. Thus we need to change
1478 // all "addrx" related forms to "addr" version. Change DW_FORM_rnglistx
1479 // to DW_FORM_sec_offset here.
1480 std::optional
<uint64_t> Index
= Val
.getAsSectionOffset();
1482 Linker
.reportWarning("Cannot read the attribute. Dropping.", File
,
1486 std::optional
<uint64_t> Offset
=
1487 Unit
.getOrigUnit().getRnglistOffset(*Index
);
1489 Linker
.reportWarning("Cannot read the attribute. Dropping.", File
,
1495 AttrSpec
.Form
= dwarf::DW_FORM_sec_offset
;
1496 AttrSize
= Unit
.getOrigUnit().getFormParams().getDwarfOffsetByteSize();
1497 } else if (AttrSpec
.Form
== dwarf::DW_FORM_loclistx
) {
1498 // DWARFLinker does not generate .debug_addr table. Thus we need to change
1499 // all "addrx" related forms to "addr" version. Change DW_FORM_loclistx
1500 // to DW_FORM_sec_offset here.
1501 std::optional
<uint64_t> Index
= Val
.getAsSectionOffset();
1503 Linker
.reportWarning("Cannot read the attribute. Dropping.", File
,
1507 std::optional
<uint64_t> Offset
=
1508 Unit
.getOrigUnit().getLoclistOffset(*Index
);
1510 Linker
.reportWarning("Cannot read the attribute. Dropping.", File
,
1516 AttrSpec
.Form
= dwarf::DW_FORM_sec_offset
;
1517 AttrSize
= Unit
.getOrigUnit().getFormParams().getDwarfOffsetByteSize();
1518 } else if (AttrSpec
.Attr
== dwarf::DW_AT_high_pc
&&
1519 Die
.getTag() == dwarf::DW_TAG_compile_unit
) {
1520 std::optional
<uint64_t> LowPC
= Unit
.getLowPc();
1523 // Dwarf >= 4 high_pc is an size, not an address.
1524 Value
= Unit
.getHighPc() - *LowPC
;
1525 } else if (AttrSpec
.Form
== dwarf::DW_FORM_sec_offset
)
1526 Value
= *Val
.getAsSectionOffset();
1527 else if (AttrSpec
.Form
== dwarf::DW_FORM_sdata
)
1528 Value
= *Val
.getAsSignedConstant();
1529 else if (auto OptionalValue
= Val
.getAsUnsignedConstant())
1530 Value
= *OptionalValue
;
1532 Linker
.reportWarning(
1533 "Unsupported scalar attribute form. Dropping attribute.", File
,
1538 DIE::value_iterator Patch
=
1539 Die
.addValue(DIEAlloc
, dwarf::Attribute(AttrSpec
.Attr
),
1540 dwarf::Form(AttrSpec
.Form
), DIEInteger(Value
));
1541 if (AttrSpec
.Attr
== dwarf::DW_AT_ranges
||
1542 AttrSpec
.Attr
== dwarf::DW_AT_start_scope
) {
1543 Unit
.noteRangeAttribute(Die
, Patch
);
1544 Info
.HasRanges
= true;
1545 } else if (DWARFAttribute::mayHaveLocationList(AttrSpec
.Attr
) &&
1546 dwarf::doesFormBelongToClass(AttrSpec
.Form
,
1547 DWARFFormValue::FC_SectionOffset
,
1548 Unit
.getOrigUnit().getVersion())) {
1550 CompileUnit::DIEInfo
&LocationDieInfo
= Unit
.getInfo(InputDIE
);
1551 Unit
.noteLocationAttribute({Patch
, LocationDieInfo
.InDebugMap
1552 ? LocationDieInfo
.AddrAdjust
1554 } else if (AttrSpec
.Attr
== dwarf::DW_AT_declaration
&& Value
)
1555 Info
.IsDeclaration
= true;
1557 // check that all dwarf::DW_FORM_rnglistx are handled previously.
1558 assert((Info
.HasRanges
|| (OriginalForm
!= dwarf::DW_FORM_rnglistx
)) &&
1559 "Unhandled DW_FORM_rnglistx attribute");
1564 /// Clone \p InputDIE's attribute described by \p AttrSpec with
1565 /// value \p Val, and add it to \p Die.
1566 /// \returns the size of the cloned attribute.
1567 unsigned DWARFLinker::DIECloner::cloneAttribute(
1568 DIE
&Die
, const DWARFDie
&InputDIE
, const DWARFFile
&File
,
1569 CompileUnit
&Unit
, const DWARFFormValue
&Val
, const AttributeSpec AttrSpec
,
1570 unsigned AttrSize
, AttributesInfo
&Info
, bool IsLittleEndian
) {
1571 const DWARFUnit
&U
= Unit
.getOrigUnit();
1573 switch (AttrSpec
.Form
) {
1574 case dwarf::DW_FORM_strp
:
1575 case dwarf::DW_FORM_line_strp
:
1576 case dwarf::DW_FORM_string
:
1577 case dwarf::DW_FORM_strx
:
1578 case dwarf::DW_FORM_strx1
:
1579 case dwarf::DW_FORM_strx2
:
1580 case dwarf::DW_FORM_strx3
:
1581 case dwarf::DW_FORM_strx4
:
1582 return cloneStringAttribute(Die
, AttrSpec
, Val
, U
, Info
);
1583 case dwarf::DW_FORM_ref_addr
:
1584 case dwarf::DW_FORM_ref1
:
1585 case dwarf::DW_FORM_ref2
:
1586 case dwarf::DW_FORM_ref4
:
1587 case dwarf::DW_FORM_ref8
:
1588 return cloneDieReferenceAttribute(Die
, InputDIE
, AttrSpec
, AttrSize
, Val
,
1590 case dwarf::DW_FORM_block
:
1591 case dwarf::DW_FORM_block1
:
1592 case dwarf::DW_FORM_block2
:
1593 case dwarf::DW_FORM_block4
:
1594 case dwarf::DW_FORM_exprloc
:
1595 return cloneBlockAttribute(Die
, InputDIE
, File
, Unit
, AttrSpec
, Val
,
1597 case dwarf::DW_FORM_addr
:
1598 case dwarf::DW_FORM_addrx
:
1599 case dwarf::DW_FORM_addrx1
:
1600 case dwarf::DW_FORM_addrx2
:
1601 case dwarf::DW_FORM_addrx3
:
1602 case dwarf::DW_FORM_addrx4
:
1603 return cloneAddressAttribute(Die
, InputDIE
, AttrSpec
, AttrSize
, Val
, Unit
,
1605 case dwarf::DW_FORM_data1
:
1606 case dwarf::DW_FORM_data2
:
1607 case dwarf::DW_FORM_data4
:
1608 case dwarf::DW_FORM_data8
:
1609 case dwarf::DW_FORM_udata
:
1610 case dwarf::DW_FORM_sdata
:
1611 case dwarf::DW_FORM_sec_offset
:
1612 case dwarf::DW_FORM_flag
:
1613 case dwarf::DW_FORM_flag_present
:
1614 case dwarf::DW_FORM_rnglistx
:
1615 case dwarf::DW_FORM_loclistx
:
1616 case dwarf::DW_FORM_implicit_const
:
1617 return cloneScalarAttribute(Die
, InputDIE
, File
, Unit
, AttrSpec
, Val
,
1620 Linker
.reportWarning("Unsupported attribute form " +
1621 dwarf::FormEncodingString(AttrSpec
.Form
) +
1622 " in cloneAttribute. Dropping.",
1629 void DWARFLinker::DIECloner::addObjCAccelerator(CompileUnit
&Unit
,
1631 DwarfStringPoolEntryRef Name
,
1632 OffsetsStringPool
&StringPool
,
1633 bool SkipPubSection
) {
1634 std::optional
<ObjCSelectorNames
> Names
=
1635 getObjCNamesIfSelector(Name
.getString());
1638 Unit
.addNameAccelerator(Die
, StringPool
.getEntry(Names
->Selector
),
1640 Unit
.addObjCAccelerator(Die
, StringPool
.getEntry(Names
->ClassName
),
1642 if (Names
->ClassNameNoCategory
)
1643 Unit
.addObjCAccelerator(
1644 Die
, StringPool
.getEntry(*Names
->ClassNameNoCategory
), SkipPubSection
);
1645 if (Names
->MethodNameNoCategory
)
1646 Unit
.addNameAccelerator(
1647 Die
, StringPool
.getEntry(*Names
->MethodNameNoCategory
), SkipPubSection
);
1651 shouldSkipAttribute(bool Update
,
1652 DWARFAbbreviationDeclaration::AttributeSpec AttrSpec
,
1654 switch (AttrSpec
.Attr
) {
1657 case dwarf::DW_AT_low_pc
:
1658 case dwarf::DW_AT_high_pc
:
1659 case dwarf::DW_AT_ranges
:
1660 return !Update
&& SkipPC
;
1661 case dwarf::DW_AT_rnglists_base
:
1662 // In case !Update the .debug_addr table is not generated/preserved.
1663 // Thus instead of DW_FORM_rnglistx the DW_FORM_sec_offset is used.
1664 // Since DW_AT_rnglists_base is used for only DW_FORM_rnglistx the
1665 // DW_AT_rnglists_base is removed.
1667 case dwarf::DW_AT_loclists_base
:
1668 // In case !Update the .debug_addr table is not generated/preserved.
1669 // Thus instead of DW_FORM_loclistx the DW_FORM_sec_offset is used.
1670 // Since DW_AT_loclists_base is used for only DW_FORM_loclistx the
1671 // DW_AT_loclists_base is removed.
1673 case dwarf::DW_AT_location
:
1674 case dwarf::DW_AT_frame_base
:
1675 return !Update
&& SkipPC
;
1679 struct AttributeLinkedOffsetFixup
{
1680 int64_t LinkedOffsetFixupVal
;
1681 uint64_t InputAttrStartOffset
;
1682 uint64_t InputAttrEndOffset
;
1685 DIE
*DWARFLinker::DIECloner::cloneDIE(const DWARFDie
&InputDIE
,
1686 const DWARFFile
&File
, CompileUnit
&Unit
,
1687 int64_t PCOffset
, uint32_t OutOffset
,
1688 unsigned Flags
, bool IsLittleEndian
,
1690 DWARFUnit
&U
= Unit
.getOrigUnit();
1691 unsigned Idx
= U
.getDIEIndex(InputDIE
);
1692 CompileUnit::DIEInfo
&Info
= Unit
.getInfo(Idx
);
1694 // Should the DIE appear in the output?
1695 if (!Unit
.getInfo(Idx
).Keep
)
1698 uint64_t Offset
= InputDIE
.getOffset();
1699 assert(!(Die
&& Info
.Clone
) && "Can't supply a DIE and a cloned DIE");
1701 // The DIE might have been already created by a forward reference
1702 // (see cloneDieReferenceAttribute()).
1704 Info
.Clone
= DIE::get(DIEAlloc
, dwarf::Tag(InputDIE
.getTag()));
1708 assert(Die
->getTag() == InputDIE
.getTag());
1709 Die
->setOffset(OutOffset
);
1710 if (isODRCanonicalCandidate(InputDIE
, Unit
) && Info
.Ctxt
&&
1711 (Info
.Ctxt
->getCanonicalDIEOffset() == 0)) {
1712 if (!Info
.Ctxt
->hasCanonicalDIE())
1713 Info
.Ctxt
->setHasCanonicalDIE();
1714 // We are about to emit a DIE that is the root of its own valid
1715 // DeclContext tree. Make the current offset the canonical offset
1716 // for this context.
1717 Info
.Ctxt
->setCanonicalDIEOffset(OutOffset
+ Unit
.getStartOffset());
1720 // Extract and clone every attribute.
1721 DWARFDataExtractor Data
= U
.getDebugInfoExtractor();
1722 // Point to the next DIE (generally there is always at least a NULL
1723 // entry after the current one). If this is a lone
1724 // DW_TAG_compile_unit without any children, point to the next unit.
1725 uint64_t NextOffset
= (Idx
+ 1 < U
.getNumDIEs())
1726 ? U
.getDIEAtIndex(Idx
+ 1).getOffset()
1727 : U
.getNextUnitOffset();
1728 AttributesInfo AttrInfo
;
1730 // We could copy the data only if we need to apply a relocation to it. After
1731 // testing, it seems there is no performance downside to doing the copy
1732 // unconditionally, and it makes the code simpler.
1733 SmallString
<40> DIECopy(Data
.getData().substr(Offset
, NextOffset
- Offset
));
1735 DWARFDataExtractor(DIECopy
, Data
.isLittleEndian(), Data
.getAddressSize());
1737 // Modify the copy with relocated addresses.
1738 ObjFile
.Addresses
->applyValidRelocs(DIECopy
, Offset
, Data
.isLittleEndian());
1740 // Reset the Offset to 0 as we will be working on the local copy of
1744 const auto *Abbrev
= InputDIE
.getAbbreviationDeclarationPtr();
1745 Offset
+= getULEB128Size(Abbrev
->getCode());
1747 // We are entering a subprogram. Get and propagate the PCOffset.
1748 if (Die
->getTag() == dwarf::DW_TAG_subprogram
)
1749 PCOffset
= Info
.AddrAdjust
;
1750 AttrInfo
.PCOffset
= PCOffset
;
1752 if (Abbrev
->getTag() == dwarf::DW_TAG_subprogram
) {
1753 Flags
|= TF_InFunctionScope
;
1754 if (!Info
.InDebugMap
&& LLVM_LIKELY(!Update
))
1756 } else if (Abbrev
->getTag() == dwarf::DW_TAG_variable
) {
1757 // Function-local globals could be in the debug map even when the function
1758 // is not, e.g., inlined functions.
1759 if ((Flags
& TF_InFunctionScope
) && Info
.InDebugMap
)
1760 Flags
&= ~TF_SkipPC
;
1761 // Location expressions referencing an address which is not in debug map
1762 // should be deleted.
1763 else if (!Info
.InDebugMap
&& Info
.HasLocationExpressionAddr
&&
1764 LLVM_LIKELY(!Update
))
1768 std::optional
<StringRef
> LibraryInstallName
=
1769 ObjFile
.Addresses
->getLibraryInstallName();
1770 SmallVector
<AttributeLinkedOffsetFixup
> AttributesFixups
;
1771 for (const auto &AttrSpec
: Abbrev
->attributes()) {
1772 if (shouldSkipAttribute(Update
, AttrSpec
, Flags
& TF_SkipPC
)) {
1773 DWARFFormValue::skipValue(AttrSpec
.Form
, Data
, &Offset
,
1778 AttributeLinkedOffsetFixup CurAttrFixup
;
1779 CurAttrFixup
.InputAttrStartOffset
= InputDIE
.getOffset() + Offset
;
1780 CurAttrFixup
.LinkedOffsetFixupVal
=
1781 Unit
.getStartOffset() + OutOffset
- CurAttrFixup
.InputAttrStartOffset
;
1783 DWARFFormValue Val
= AttrSpec
.getFormValue();
1784 uint64_t AttrSize
= Offset
;
1785 Val
.extractValue(Data
, &Offset
, U
.getFormParams(), &U
);
1786 CurAttrFixup
.InputAttrEndOffset
= InputDIE
.getOffset() + Offset
;
1787 AttrSize
= Offset
- AttrSize
;
1789 uint64_t FinalAttrSize
=
1790 cloneAttribute(*Die
, InputDIE
, File
, Unit
, Val
, AttrSpec
, AttrSize
,
1791 AttrInfo
, IsLittleEndian
);
1792 if (FinalAttrSize
!= 0 && ObjFile
.Addresses
->needToSaveValidRelocs())
1793 AttributesFixups
.push_back(CurAttrFixup
);
1795 OutOffset
+= FinalAttrSize
;
1798 uint16_t Tag
= InputDIE
.getTag();
1799 // Add the DW_AT_APPLE_origin attribute to Compile Unit die if we have
1800 // an install name and the DWARF doesn't have the attribute yet.
1801 const bool NeedsAppleOrigin
= (Tag
== dwarf::DW_TAG_compile_unit
) &&
1802 LibraryInstallName
.has_value() &&
1803 !AttrInfo
.HasAppleOrigin
;
1804 if (NeedsAppleOrigin
) {
1805 auto StringEntry
= DebugStrPool
.getEntry(LibraryInstallName
.value());
1806 Die
->addValue(DIEAlloc
, dwarf::Attribute(dwarf::DW_AT_APPLE_origin
),
1807 dwarf::DW_FORM_strp
, DIEInteger(StringEntry
.getOffset()));
1808 AttrInfo
.Name
= StringEntry
;
1812 // Look for accelerator entries.
1813 // FIXME: This is slightly wrong. An inline_subroutine without a
1814 // low_pc, but with AT_ranges might be interesting to get into the
1815 // accelerator tables too. For now stick with dsymutil's behavior.
1816 if ((Info
.InDebugMap
|| AttrInfo
.HasLowPc
|| AttrInfo
.HasRanges
) &&
1817 Tag
!= dwarf::DW_TAG_compile_unit
&&
1818 getDIENames(InputDIE
, AttrInfo
, DebugStrPool
,
1819 Tag
!= dwarf::DW_TAG_inlined_subroutine
)) {
1820 if (AttrInfo
.MangledName
&& AttrInfo
.MangledName
!= AttrInfo
.Name
)
1821 Unit
.addNameAccelerator(Die
, AttrInfo
.MangledName
,
1822 Tag
== dwarf::DW_TAG_inlined_subroutine
);
1823 if (AttrInfo
.Name
) {
1824 if (AttrInfo
.NameWithoutTemplate
)
1825 Unit
.addNameAccelerator(Die
, AttrInfo
.NameWithoutTemplate
,
1826 /* SkipPubSection */ true);
1827 Unit
.addNameAccelerator(Die
, AttrInfo
.Name
,
1828 Tag
== dwarf::DW_TAG_inlined_subroutine
);
1831 addObjCAccelerator(Unit
, Die
, AttrInfo
.Name
, DebugStrPool
,
1832 /* SkipPubSection =*/true);
1834 } else if (Tag
== dwarf::DW_TAG_namespace
) {
1836 AttrInfo
.Name
= DebugStrPool
.getEntry("(anonymous namespace)");
1837 Unit
.addNamespaceAccelerator(Die
, AttrInfo
.Name
);
1838 } else if (Tag
== dwarf::DW_TAG_imported_declaration
&& AttrInfo
.Name
) {
1839 Unit
.addNamespaceAccelerator(Die
, AttrInfo
.Name
);
1840 } else if (isTypeTag(Tag
) && !AttrInfo
.IsDeclaration
) {
1841 bool Success
= getDIENames(InputDIE
, AttrInfo
, DebugStrPool
);
1842 uint64_t RuntimeLang
=
1843 dwarf::toUnsigned(InputDIE
.find(dwarf::DW_AT_APPLE_runtime_class
))
1845 bool ObjCClassIsImplementation
=
1846 (RuntimeLang
== dwarf::DW_LANG_ObjC
||
1847 RuntimeLang
== dwarf::DW_LANG_ObjC_plus_plus
) &&
1848 dwarf::toUnsigned(InputDIE
.find(dwarf::DW_AT_APPLE_objc_complete_type
))
1850 if (Success
&& AttrInfo
.Name
&& !AttrInfo
.Name
.getString().empty()) {
1851 uint32_t Hash
= hashFullyQualifiedName(InputDIE
, Unit
, File
);
1852 Unit
.addTypeAccelerator(Die
, AttrInfo
.Name
, ObjCClassIsImplementation
,
1856 // For Swift, mangled names are put into DW_AT_linkage_name.
1857 if (Success
&& AttrInfo
.MangledName
&&
1858 RuntimeLang
== dwarf::DW_LANG_Swift
&&
1859 !AttrInfo
.MangledName
.getString().empty() &&
1860 AttrInfo
.MangledName
!= AttrInfo
.Name
) {
1861 auto Hash
= djbHash(AttrInfo
.MangledName
.getString().data());
1862 Unit
.addTypeAccelerator(Die
, AttrInfo
.MangledName
,
1863 ObjCClassIsImplementation
, Hash
);
1867 // Determine whether there are any children that we want to keep.
1868 bool HasChildren
= false;
1869 for (auto Child
: InputDIE
.children()) {
1870 unsigned Idx
= U
.getDIEIndex(Child
);
1871 if (Unit
.getInfo(Idx
).Keep
) {
1877 if (Unit
.getOrigUnit().getVersion() >= 5 && !AttrInfo
.AttrStrOffsetBaseSeen
&&
1878 Die
->getTag() == dwarf::DW_TAG_compile_unit
) {
1879 // No DW_AT_str_offsets_base seen, add it to the DIE.
1880 Die
->addValue(DIEAlloc
, dwarf::DW_AT_str_offsets_base
,
1881 dwarf::DW_FORM_sec_offset
, DIEInteger(8));
1885 DIEAbbrev NewAbbrev
= Die
->generateAbbrev();
1887 NewAbbrev
.setChildrenFlag(dwarf::DW_CHILDREN_yes
);
1888 // Assign a permanent abbrev number
1889 Linker
.assignAbbrev(NewAbbrev
);
1890 Die
->setAbbrevNumber(NewAbbrev
.getNumber());
1892 uint64_t AbbrevNumberSize
= getULEB128Size(Die
->getAbbrevNumber());
1894 // Add the size of the abbreviation number to the output offset.
1895 OutOffset
+= AbbrevNumberSize
;
1897 // Update fixups with the size of the abbreviation number
1898 for (AttributeLinkedOffsetFixup
&F
: AttributesFixups
)
1899 F
.LinkedOffsetFixupVal
+= AbbrevNumberSize
;
1901 for (AttributeLinkedOffsetFixup
&F
: AttributesFixups
)
1902 ObjFile
.Addresses
->updateAndSaveValidRelocs(
1903 Unit
.getOrigUnit().getVersion() >= 5, Unit
.getOrigUnit().getOffset(),
1904 F
.LinkedOffsetFixupVal
, F
.InputAttrStartOffset
, F
.InputAttrEndOffset
);
1908 Die
->setSize(OutOffset
- Die
->getOffset());
1912 // Recursively clone children.
1913 for (auto Child
: InputDIE
.children()) {
1914 if (DIE
*Clone
= cloneDIE(Child
, File
, Unit
, PCOffset
, OutOffset
, Flags
,
1916 Die
->addChild(Clone
);
1917 OutOffset
= Clone
->getOffset() + Clone
->getSize();
1921 // Account for the end of children marker.
1922 OutOffset
+= sizeof(int8_t);
1924 Die
->setSize(OutOffset
- Die
->getOffset());
1928 /// Patch the input object file relevant debug_ranges or debug_rnglists
1929 /// entries and emit them in the output file. Update the relevant attributes
1930 /// to point at the new entries.
1931 void DWARFLinker::generateUnitRanges(CompileUnit
&Unit
, const DWARFFile
&File
,
1932 DebugDieValuePool
&AddrPool
) const {
1933 if (LLVM_UNLIKELY(Options
.Update
))
1936 const auto &FunctionRanges
= Unit
.getFunctionRanges();
1938 // Build set of linked address ranges for unit function ranges.
1939 AddressRanges LinkedFunctionRanges
;
1940 for (const AddressRangeValuePair
&Range
: FunctionRanges
)
1941 LinkedFunctionRanges
.insert(
1942 {Range
.Range
.start() + Range
.Value
, Range
.Range
.end() + Range
.Value
});
1944 // Emit LinkedFunctionRanges into .debug_aranges
1945 if (!LinkedFunctionRanges
.empty())
1946 TheDwarfEmitter
->emitDwarfDebugArangesTable(Unit
, LinkedFunctionRanges
);
1948 RngListAttributesTy AllRngListAttributes
= Unit
.getRangesAttributes();
1949 std::optional
<PatchLocation
> UnitRngListAttribute
=
1950 Unit
.getUnitRangesAttribute();
1952 if (!AllRngListAttributes
.empty() || UnitRngListAttribute
) {
1953 std::optional
<AddressRangeValuePair
> CachedRange
;
1954 MCSymbol
*EndLabel
= TheDwarfEmitter
->emitDwarfDebugRangeListHeader(Unit
);
1956 // Read original address ranges, apply relocation value, emit linked address
1958 for (PatchLocation
&AttributePatch
: AllRngListAttributes
) {
1959 // Get ranges from the source DWARF corresponding to the current
1961 AddressRanges LinkedRanges
;
1962 if (Expected
<DWARFAddressRangesVector
> OriginalRanges
=
1963 Unit
.getOrigUnit().findRnglistFromOffset(AttributePatch
.get())) {
1964 // Apply relocation adjustment.
1965 for (const auto &Range
: *OriginalRanges
) {
1966 if (!CachedRange
|| !CachedRange
->Range
.contains(Range
.LowPC
))
1967 CachedRange
= FunctionRanges
.getRangeThatContains(Range
.LowPC
);
1969 // All range entries should lie in the function range.
1971 reportWarning("inconsistent range data.", File
);
1975 // Store range for emiting.
1976 LinkedRanges
.insert({Range
.LowPC
+ CachedRange
->Value
,
1977 Range
.HighPC
+ CachedRange
->Value
});
1980 llvm::consumeError(OriginalRanges
.takeError());
1981 reportWarning("invalid range list ignored.", File
);
1984 // Emit linked ranges.
1985 TheDwarfEmitter
->emitDwarfDebugRangeListFragment(
1986 Unit
, LinkedRanges
, AttributePatch
, AddrPool
);
1989 // Emit ranges for Unit AT_ranges attribute.
1990 if (UnitRngListAttribute
.has_value())
1991 TheDwarfEmitter
->emitDwarfDebugRangeListFragment(
1992 Unit
, LinkedFunctionRanges
, *UnitRngListAttribute
, AddrPool
);
1994 // Emit ranges footer.
1995 TheDwarfEmitter
->emitDwarfDebugRangeListFooter(Unit
, EndLabel
);
1999 void DWARFLinker::DIECloner::generateUnitLocations(
2000 CompileUnit
&Unit
, const DWARFFile
&File
,
2001 ExpressionHandlerRef ExprHandler
) {
2002 if (LLVM_UNLIKELY(Linker
.Options
.Update
))
2005 const LocListAttributesTy
&AllLocListAttributes
=
2006 Unit
.getLocationAttributes();
2008 if (AllLocListAttributes
.empty())
2011 // Emit locations list table header.
2012 MCSymbol
*EndLabel
= Emitter
->emitDwarfDebugLocListHeader(Unit
);
2014 for (auto &CurLocAttr
: AllLocListAttributes
) {
2015 // Get location expressions vector corresponding to the current attribute
2016 // from the source DWARF.
2017 Expected
<DWARFLocationExpressionsVector
> OriginalLocations
=
2018 Unit
.getOrigUnit().findLoclistFromOffset(CurLocAttr
.get());
2020 if (!OriginalLocations
) {
2021 llvm::consumeError(OriginalLocations
.takeError());
2022 Linker
.reportWarning("Invalid location attribute ignored.", File
);
2026 DWARFLocationExpressionsVector LinkedLocationExpressions
;
2027 for (DWARFLocationExpression
&CurExpression
: *OriginalLocations
) {
2028 DWARFLocationExpression LinkedExpression
;
2030 if (CurExpression
.Range
) {
2031 // Relocate address range.
2032 LinkedExpression
.Range
= {
2033 CurExpression
.Range
->LowPC
+ CurLocAttr
.RelocAdjustment
,
2034 CurExpression
.Range
->HighPC
+ CurLocAttr
.RelocAdjustment
};
2037 // Clone expression.
2038 LinkedExpression
.Expr
.reserve(CurExpression
.Expr
.size());
2039 ExprHandler(CurExpression
.Expr
, LinkedExpression
.Expr
,
2040 CurLocAttr
.RelocAdjustment
);
2042 LinkedLocationExpressions
.push_back(LinkedExpression
);
2045 // Emit locations list table fragment corresponding to the CurLocAttr.
2046 Emitter
->emitDwarfDebugLocListFragment(Unit
, LinkedLocationExpressions
,
2047 CurLocAttr
, AddrPool
);
2050 // Emit locations list table footer.
2051 Emitter
->emitDwarfDebugLocListFooter(Unit
, EndLabel
);
2054 static void patchAddrBase(DIE
&Die
, DIEInteger Offset
) {
2055 for (auto &V
: Die
.values())
2056 if (V
.getAttribute() == dwarf::DW_AT_addr_base
) {
2057 V
= DIEValue(V
.getAttribute(), V
.getForm(), Offset
);
2061 llvm_unreachable("Didn't find a DW_AT_addr_base in cloned DIE!");
2064 void DWARFLinker::DIECloner::emitDebugAddrSection(
2065 CompileUnit
&Unit
, const uint16_t DwarfVersion
) const {
2067 if (LLVM_UNLIKELY(Linker
.Options
.Update
))
2070 if (DwarfVersion
< 5)
2073 if (AddrPool
.getValues().empty())
2076 MCSymbol
*EndLabel
= Emitter
->emitDwarfDebugAddrsHeader(Unit
);
2077 patchAddrBase(*Unit
.getOutputUnitDIE(),
2078 DIEInteger(Emitter
->getDebugAddrSectionSize()));
2079 Emitter
->emitDwarfDebugAddrs(AddrPool
.getValues(),
2080 Unit
.getOrigUnit().getAddressByteSize());
2081 Emitter
->emitDwarfDebugAddrsFooter(Unit
, EndLabel
);
2084 /// Insert the new line info sequence \p Seq into the current
2085 /// set of already linked line info \p Rows.
2086 static void insertLineSequence(std::vector
<DWARFDebugLine::Row
> &Seq
,
2087 std::vector
<DWARFDebugLine::Row
> &Rows
) {
2091 if (!Rows
.empty() && Rows
.back().Address
< Seq
.front().Address
) {
2092 llvm::append_range(Rows
, Seq
);
2097 object::SectionedAddress Front
= Seq
.front().Address
;
2098 auto InsertPoint
= partition_point(
2099 Rows
, [=](const DWARFDebugLine::Row
&O
) { return O
.Address
< Front
; });
2101 // FIXME: this only removes the unneeded end_sequence if the
2102 // sequences have been inserted in order. Using a global sort like
2103 // described in generateLineTableForUnit() and delaying the end_sequene
2104 // elimination to emitLineTableForUnit() we can get rid of all of them.
2105 if (InsertPoint
!= Rows
.end() && InsertPoint
->Address
== Front
&&
2106 InsertPoint
->EndSequence
) {
2107 *InsertPoint
= Seq
.front();
2108 Rows
.insert(InsertPoint
+ 1, Seq
.begin() + 1, Seq
.end());
2110 Rows
.insert(InsertPoint
, Seq
.begin(), Seq
.end());
2116 static void patchStmtList(DIE
&Die
, DIEInteger Offset
) {
2117 for (auto &V
: Die
.values())
2118 if (V
.getAttribute() == dwarf::DW_AT_stmt_list
) {
2119 V
= DIEValue(V
.getAttribute(), V
.getForm(), Offset
);
2123 llvm_unreachable("Didn't find DW_AT_stmt_list in cloned DIE!");
2126 void DWARFLinker::DIECloner::rememberUnitForMacroOffset(CompileUnit
&Unit
) {
2127 DWARFUnit
&OrigUnit
= Unit
.getOrigUnit();
2128 DWARFDie OrigUnitDie
= OrigUnit
.getUnitDIE();
2130 if (std::optional
<uint64_t> MacroAttr
=
2131 dwarf::toSectionOffset(OrigUnitDie
.find(dwarf::DW_AT_macros
))) {
2132 UnitMacroMap
.insert(std::make_pair(*MacroAttr
, &Unit
));
2136 if (std::optional
<uint64_t> MacroAttr
=
2137 dwarf::toSectionOffset(OrigUnitDie
.find(dwarf::DW_AT_macro_info
))) {
2138 UnitMacroMap
.insert(std::make_pair(*MacroAttr
, &Unit
));
2143 void DWARFLinker::DIECloner::generateLineTableForUnit(CompileUnit
&Unit
) {
2144 if (LLVM_UNLIKELY(Emitter
== nullptr))
2147 // Check whether DW_AT_stmt_list attribute is presented.
2148 DWARFDie CUDie
= Unit
.getOrigUnit().getUnitDIE();
2149 auto StmtList
= dwarf::toSectionOffset(CUDie
.find(dwarf::DW_AT_stmt_list
));
2153 // Update the cloned DW_AT_stmt_list with the correct debug_line offset.
2154 if (auto *OutputDIE
= Unit
.getOutputUnitDIE())
2155 patchStmtList(*OutputDIE
, DIEInteger(Emitter
->getLineSectionSize()));
2157 if (const DWARFDebugLine::LineTable
*LT
=
2158 ObjFile
.Dwarf
->getLineTableForUnit(&Unit
.getOrigUnit())) {
2160 DWARFDebugLine::LineTable LineTable
;
2162 // Set Line Table header.
2163 LineTable
.Prologue
= LT
->Prologue
;
2165 // Set Line Table Rows.
2166 if (Linker
.Options
.Update
) {
2167 LineTable
.Rows
= LT
->Rows
;
2168 // If all the line table contains is a DW_LNE_end_sequence, clear the line
2169 // table rows, it will be inserted again in the DWARFStreamer.
2170 if (LineTable
.Rows
.size() == 1 && LineTable
.Rows
[0].EndSequence
)
2171 LineTable
.Rows
.clear();
2173 LineTable
.Sequences
= LT
->Sequences
;
2175 // This vector is the output line table.
2176 std::vector
<DWARFDebugLine::Row
> NewRows
;
2177 NewRows
.reserve(LT
->Rows
.size());
2179 // Current sequence of rows being extracted, before being inserted
2181 std::vector
<DWARFDebugLine::Row
> Seq
;
2183 const auto &FunctionRanges
= Unit
.getFunctionRanges();
2184 std::optional
<AddressRangeValuePair
> CurrRange
;
2186 // FIXME: This logic is meant to generate exactly the same output as
2187 // Darwin's classic dsymutil. There is a nicer way to implement this
2188 // by simply putting all the relocated line info in NewRows and simply
2189 // sorting NewRows before passing it to emitLineTableForUnit. This
2190 // should be correct as sequences for a function should stay
2191 // together in the sorted output. There are a few corner cases that
2192 // look suspicious though, and that required to implement the logic
2193 // this way. Revisit that once initial validation is finished.
2195 // Iterate over the object file line info and extract the sequences
2196 // that correspond to linked functions.
2197 for (DWARFDebugLine::Row Row
: LT
->Rows
) {
2198 // Check whether we stepped out of the range. The range is
2199 // half-open, but consider accept the end address of the range if
2200 // it is marked as end_sequence in the input (because in that
2201 // case, the relocation offset is accurate and that entry won't
2202 // serve as the start of another function).
2203 if (!CurrRange
|| !CurrRange
->Range
.contains(Row
.Address
.Address
)) {
2204 // We just stepped out of a known range. Insert a end_sequence
2205 // corresponding to the end of the range.
2206 uint64_t StopAddress
=
2207 CurrRange
? CurrRange
->Range
.end() + CurrRange
->Value
: -1ULL;
2208 CurrRange
= FunctionRanges
.getRangeThatContains(Row
.Address
.Address
);
2209 if (StopAddress
!= -1ULL && !Seq
.empty()) {
2210 // Insert end sequence row with the computed end address, but
2211 // the same line as the previous one.
2212 auto NextLine
= Seq
.back();
2213 NextLine
.Address
.Address
= StopAddress
;
2214 NextLine
.EndSequence
= 1;
2215 NextLine
.PrologueEnd
= 0;
2216 NextLine
.BasicBlock
= 0;
2217 NextLine
.EpilogueBegin
= 0;
2218 Seq
.push_back(NextLine
);
2219 insertLineSequence(Seq
, NewRows
);
2226 // Ignore empty sequences.
2227 if (Row
.EndSequence
&& Seq
.empty())
2230 // Relocate row address and add it to the current sequence.
2231 Row
.Address
.Address
+= CurrRange
->Value
;
2232 Seq
.emplace_back(Row
);
2234 if (Row
.EndSequence
)
2235 insertLineSequence(Seq
, NewRows
);
2238 LineTable
.Rows
= std::move(NewRows
);
2241 Emitter
->emitLineTableForUnit(LineTable
, Unit
, DebugStrPool
,
2244 Linker
.reportWarning("Cann't load line table.", ObjFile
);
2247 void DWARFLinker::emitAcceleratorEntriesForUnit(CompileUnit
&Unit
) {
2248 for (AccelTableKind AccelTableKind
: Options
.AccelTables
) {
2249 switch (AccelTableKind
) {
2250 case AccelTableKind::Apple
: {
2252 for (const auto &Namespace
: Unit
.getNamespaces())
2253 AppleNamespaces
.addName(Namespace
.Name
, Namespace
.Die
->getOffset() +
2254 Unit
.getStartOffset());
2256 for (const auto &Pubname
: Unit
.getPubnames())
2257 AppleNames
.addName(Pubname
.Name
,
2258 Pubname
.Die
->getOffset() + Unit
.getStartOffset());
2260 for (const auto &Pubtype
: Unit
.getPubtypes())
2262 Pubtype
.Name
, Pubtype
.Die
->getOffset() + Unit
.getStartOffset(),
2263 Pubtype
.Die
->getTag(),
2264 Pubtype
.ObjcClassImplementation
? dwarf::DW_FLAG_type_implementation
2266 Pubtype
.QualifiedNameHash
);
2268 for (const auto &ObjC
: Unit
.getObjC())
2269 AppleObjc
.addName(ObjC
.Name
,
2270 ObjC
.Die
->getOffset() + Unit
.getStartOffset());
2272 case AccelTableKind::Pub
: {
2273 TheDwarfEmitter
->emitPubNamesForUnit(Unit
);
2274 TheDwarfEmitter
->emitPubTypesForUnit(Unit
);
2276 case AccelTableKind::DebugNames
: {
2277 for (const auto &Namespace
: Unit
.getNamespaces())
2279 Namespace
.Name
, Namespace
.Die
->getOffset(),
2280 DWARF5AccelTableData::getDefiningParentDieOffset(*Namespace
.Die
),
2281 Namespace
.Die
->getTag(), Unit
.getUniqueID(),
2282 Unit
.getTag() == dwarf::DW_TAG_type_unit
);
2283 for (const auto &Pubname
: Unit
.getPubnames())
2285 Pubname
.Name
, Pubname
.Die
->getOffset(),
2286 DWARF5AccelTableData::getDefiningParentDieOffset(*Pubname
.Die
),
2287 Pubname
.Die
->getTag(), Unit
.getUniqueID(),
2288 Unit
.getTag() == dwarf::DW_TAG_type_unit
);
2289 for (const auto &Pubtype
: Unit
.getPubtypes())
2291 Pubtype
.Name
, Pubtype
.Die
->getOffset(),
2292 DWARF5AccelTableData::getDefiningParentDieOffset(*Pubtype
.Die
),
2293 Pubtype
.Die
->getTag(), Unit
.getUniqueID(),
2294 Unit
.getTag() == dwarf::DW_TAG_type_unit
);
2300 /// Read the frame info stored in the object, and emit the
2301 /// patched frame descriptions for the resulting file.
2303 /// This is actually pretty easy as the data of the CIEs and FDEs can
2304 /// be considered as black boxes and moved as is. The only thing to do
2305 /// is to patch the addresses in the headers.
2306 void DWARFLinker::patchFrameInfoForObject(LinkContext
&Context
) {
2307 DWARFContext
&OrigDwarf
= *Context
.File
.Dwarf
;
2308 unsigned SrcAddrSize
= OrigDwarf
.getDWARFObj().getAddressSize();
2310 StringRef FrameData
= OrigDwarf
.getDWARFObj().getFrameSection().Data
;
2311 if (FrameData
.empty())
2314 RangesTy AllUnitsRanges
;
2315 for (std::unique_ptr
<CompileUnit
> &Unit
: Context
.CompileUnits
) {
2316 for (auto CurRange
: Unit
->getFunctionRanges())
2317 AllUnitsRanges
.insert(CurRange
.Range
, CurRange
.Value
);
2320 DataExtractor
Data(FrameData
, OrigDwarf
.isLittleEndian(), 0);
2321 uint64_t InputOffset
= 0;
2323 // Store the data of the CIEs defined in this object, keyed by their
2325 DenseMap
<uint64_t, StringRef
> LocalCIES
;
2327 while (Data
.isValidOffset(InputOffset
)) {
2328 uint64_t EntryOffset
= InputOffset
;
2329 uint32_t InitialLength
= Data
.getU32(&InputOffset
);
2330 if (InitialLength
== 0xFFFFFFFF)
2331 return reportWarning("Dwarf64 bits no supported", Context
.File
);
2333 uint32_t CIEId
= Data
.getU32(&InputOffset
);
2334 if (CIEId
== 0xFFFFFFFF) {
2335 // This is a CIE, store it.
2336 StringRef CIEData
= FrameData
.substr(EntryOffset
, InitialLength
+ 4);
2337 LocalCIES
[EntryOffset
] = CIEData
;
2338 // The -4 is to account for the CIEId we just read.
2339 InputOffset
+= InitialLength
- 4;
2343 uint64_t Loc
= Data
.getUnsigned(&InputOffset
, SrcAddrSize
);
2345 // Some compilers seem to emit frame info that doesn't start at
2346 // the function entry point, thus we can't just lookup the address
2347 // in the debug map. Use the AddressInfo's range map to see if the FDE
2348 // describes something that we can relocate.
2349 std::optional
<AddressRangeValuePair
> Range
=
2350 AllUnitsRanges
.getRangeThatContains(Loc
);
2352 // The +4 is to account for the size of the InitialLength field itself.
2353 InputOffset
= EntryOffset
+ InitialLength
+ 4;
2357 // This is an FDE, and we have a mapping.
2358 // Have we already emitted a corresponding CIE?
2359 StringRef CIEData
= LocalCIES
[CIEId
];
2360 if (CIEData
.empty())
2361 return reportWarning("Inconsistent debug_frame content. Dropping.",
2364 // Look if we already emitted a CIE that corresponds to the
2365 // referenced one (the CIE data is the key of that lookup).
2366 auto IteratorInserted
= EmittedCIEs
.insert(
2367 std::make_pair(CIEData
, TheDwarfEmitter
->getFrameSectionSize()));
2368 // If there is no CIE yet for this ID, emit it.
2369 if (IteratorInserted
.second
) {
2370 LastCIEOffset
= TheDwarfEmitter
->getFrameSectionSize();
2371 IteratorInserted
.first
->getValue() = LastCIEOffset
;
2372 TheDwarfEmitter
->emitCIE(CIEData
);
2375 // Emit the FDE with updated address and CIE pointer.
2376 // (4 + AddrSize) is the size of the CIEId + initial_location
2377 // fields that will get reconstructed by emitFDE().
2378 unsigned FDERemainingBytes
= InitialLength
- (4 + SrcAddrSize
);
2379 TheDwarfEmitter
->emitFDE(IteratorInserted
.first
->getValue(), SrcAddrSize
,
2381 FrameData
.substr(InputOffset
, FDERemainingBytes
));
2382 InputOffset
+= FDERemainingBytes
;
2386 uint32_t DWARFLinker::DIECloner::hashFullyQualifiedName(DWARFDie DIE
,
2388 const DWARFFile
&File
,
2389 int ChildRecurseDepth
) {
2390 const char *Name
= nullptr;
2391 DWARFUnit
*OrigUnit
= &U
.getOrigUnit();
2392 CompileUnit
*CU
= &U
;
2393 std::optional
<DWARFFormValue
> Ref
;
2396 if (const char *CurrentName
= DIE
.getName(DINameKind::ShortName
))
2399 if (!(Ref
= DIE
.find(dwarf::DW_AT_specification
)) &&
2400 !(Ref
= DIE
.find(dwarf::DW_AT_abstract_origin
)))
2403 if (!Ref
->isFormClass(DWARFFormValue::FC_Reference
))
2408 Linker
.resolveDIEReference(File
, CompileUnits
, *Ref
, DIE
, RefCU
)) {
2410 OrigUnit
= &RefCU
->getOrigUnit();
2415 unsigned Idx
= OrigUnit
->getDIEIndex(DIE
);
2416 if (!Name
&& DIE
.getTag() == dwarf::DW_TAG_namespace
)
2417 Name
= "(anonymous namespace)";
2419 if (CU
->getInfo(Idx
).ParentIdx
== 0 ||
2420 // FIXME: dsymutil-classic compatibility. Ignore modules.
2421 CU
->getOrigUnit().getDIEAtIndex(CU
->getInfo(Idx
).ParentIdx
).getTag() ==
2422 dwarf::DW_TAG_module
)
2423 return djbHash(Name
? Name
: "", djbHash(ChildRecurseDepth
? "" : "::"));
2425 DWARFDie Die
= OrigUnit
->getDIEAtIndex(CU
->getInfo(Idx
).ParentIdx
);
2428 djbHash((Name
? "::" : ""),
2429 hashFullyQualifiedName(Die
, *CU
, File
, ++ChildRecurseDepth
)));
2432 static uint64_t getDwoId(const DWARFDie
&CUDie
) {
2433 auto DwoId
= dwarf::toUnsigned(
2434 CUDie
.find({dwarf::DW_AT_dwo_id
, dwarf::DW_AT_GNU_dwo_id
}));
2441 remapPath(StringRef Path
,
2442 const DWARFLinkerBase::ObjectPrefixMapTy
&ObjectPrefixMap
) {
2443 if (ObjectPrefixMap
.empty())
2446 SmallString
<256> p
= Path
;
2447 for (const auto &Entry
: ObjectPrefixMap
)
2448 if (llvm::sys::path::replace_path_prefix(p
, Entry
.first
, Entry
.second
))
2450 return p
.str().str();
2454 getPCMFile(const DWARFDie
&CUDie
,
2455 const DWARFLinkerBase::ObjectPrefixMapTy
*ObjectPrefixMap
) {
2456 std::string PCMFile
= dwarf::toString(
2457 CUDie
.find({dwarf::DW_AT_dwo_name
, dwarf::DW_AT_GNU_dwo_name
}), "");
2459 if (PCMFile
.empty())
2462 if (ObjectPrefixMap
)
2463 PCMFile
= remapPath(PCMFile
, *ObjectPrefixMap
);
2468 std::pair
<bool, bool> DWARFLinker::isClangModuleRef(const DWARFDie
&CUDie
,
2469 std::string
&PCMFile
,
2470 LinkContext
&Context
,
2473 if (PCMFile
.empty())
2474 return std::make_pair(false, false);
2476 // Clang module DWARF skeleton CUs abuse this for the path to the module.
2477 uint64_t DwoId
= getDwoId(CUDie
);
2479 std::string Name
= dwarf::toString(CUDie
.find(dwarf::DW_AT_name
), "");
2482 reportWarning("Anonymous module skeleton CU for " + PCMFile
,
2484 return std::make_pair(true, true);
2487 if (!Quiet
&& Options
.Verbose
) {
2488 outs().indent(Indent
);
2489 outs() << "Found clang module reference " << PCMFile
;
2492 auto Cached
= ClangModules
.find(PCMFile
);
2493 if (Cached
!= ClangModules
.end()) {
2494 // FIXME: Until PR27449 (https://llvm.org/bugs/show_bug.cgi?id=27449) is
2495 // fixed in clang, only warn about DWO_id mismatches in verbose mode.
2496 // ASTFileSignatures will change randomly when a module is rebuilt.
2497 if (!Quiet
&& Options
.Verbose
&& (Cached
->second
!= DwoId
))
2498 reportWarning(Twine("hash mismatch: this object file was built against a "
2499 "different version of the module ") +
2502 if (!Quiet
&& Options
.Verbose
)
2503 outs() << " [cached].\n";
2504 return std::make_pair(true, true);
2507 return std::make_pair(true, false);
2510 bool DWARFLinker::registerModuleReference(const DWARFDie
&CUDie
,
2511 LinkContext
&Context
,
2512 ObjFileLoaderTy Loader
,
2513 CompileUnitHandlerTy OnCUDieLoaded
,
2515 std::string PCMFile
= getPCMFile(CUDie
, Options
.ObjectPrefixMap
);
2516 std::pair
<bool, bool> IsClangModuleRef
=
2517 isClangModuleRef(CUDie
, PCMFile
, Context
, Indent
, false);
2519 if (!IsClangModuleRef
.first
)
2522 if (IsClangModuleRef
.second
)
2525 if (Options
.Verbose
)
2528 // Cyclic dependencies are disallowed by Clang, but we still
2529 // shouldn't run into an infinite loop, so mark it as processed now.
2530 ClangModules
.insert({PCMFile
, getDwoId(CUDie
)});
2532 if (Error E
= loadClangModule(Loader
, CUDie
, PCMFile
, Context
, OnCUDieLoaded
,
2534 consumeError(std::move(E
));
2540 Error
DWARFLinker::loadClangModule(
2541 ObjFileLoaderTy Loader
, const DWARFDie
&CUDie
, const std::string
&PCMFile
,
2542 LinkContext
&Context
, CompileUnitHandlerTy OnCUDieLoaded
, unsigned Indent
) {
2544 uint64_t DwoId
= getDwoId(CUDie
);
2545 std::string ModuleName
= dwarf::toString(CUDie
.find(dwarf::DW_AT_name
), "");
2547 /// Using a SmallString<0> because loadClangModule() is recursive.
2548 SmallString
<0> Path(Options
.PrependPath
);
2549 if (sys::path::is_relative(PCMFile
))
2550 resolveRelativeObjectPath(Path
, CUDie
);
2551 sys::path::append(Path
, PCMFile
);
2552 // Don't use the cached binary holder because we have no thread-safety
2553 // guarantee and the lifetime is limited.
2555 if (Loader
== nullptr) {
2556 reportError("Could not load clang module: loader is not specified.\n",
2558 return Error::success();
2561 auto ErrOrObj
= Loader(Context
.File
.FileName
, Path
);
2563 return Error::success();
2565 std::unique_ptr
<CompileUnit
> Unit
;
2566 for (const auto &CU
: ErrOrObj
->Dwarf
->compile_units()) {
2568 // Recursively get all modules imported by this one.
2569 auto ChildCUDie
= CU
->getUnitDIE();
2572 if (!registerModuleReference(ChildCUDie
, Context
, Loader
, OnCUDieLoaded
,
2577 ": Clang modules are expected to have exactly 1 compile unit.\n");
2578 reportError(Err
, Context
.File
);
2579 return make_error
<StringError
>(Err
, inconvertibleErrorCode());
2581 // FIXME: Until PR27449 (https://llvm.org/bugs/show_bug.cgi?id=27449) is
2582 // fixed in clang, only warn about DWO_id mismatches in verbose mode.
2583 // ASTFileSignatures will change randomly when a module is rebuilt.
2584 uint64_t PCMDwoId
= getDwoId(ChildCUDie
);
2585 if (PCMDwoId
!= DwoId
) {
2586 if (Options
.Verbose
)
2588 Twine("hash mismatch: this object file was built against a "
2589 "different version of the module ") +
2592 // Update the cache entry with the DwoId of the module loaded from disk.
2593 ClangModules
[PCMFile
] = PCMDwoId
;
2597 Unit
= std::make_unique
<CompileUnit
>(*CU
, UniqueUnitID
++, !Options
.NoODR
,
2603 Context
.ModuleUnits
.emplace_back(RefModuleUnit
{*ErrOrObj
, std::move(Unit
)});
2605 return Error::success();
2608 uint64_t DWARFLinker::DIECloner::cloneAllCompileUnits(
2609 DWARFContext
&DwarfContext
, const DWARFFile
&File
, bool IsLittleEndian
) {
2610 uint64_t OutputDebugInfoSize
=
2611 (Emitter
== nullptr) ? 0 : Emitter
->getDebugInfoSectionSize();
2612 const uint64_t StartOutputDebugInfoSize
= OutputDebugInfoSize
;
2614 for (auto &CurrentUnit
: CompileUnits
) {
2615 const uint16_t DwarfVersion
= CurrentUnit
->getOrigUnit().getVersion();
2616 const uint32_t UnitHeaderSize
= DwarfVersion
>= 5 ? 12 : 11;
2617 auto InputDIE
= CurrentUnit
->getOrigUnit().getUnitDIE();
2618 CurrentUnit
->setStartOffset(OutputDebugInfoSize
);
2620 OutputDebugInfoSize
= CurrentUnit
->computeNextUnitOffset(DwarfVersion
);
2623 if (CurrentUnit
->getInfo(0).Keep
) {
2624 // Clone the InputDIE into your Unit DIE in our compile unit since it
2625 // already has a DIE inside of it.
2626 CurrentUnit
->createOutputDIE();
2627 rememberUnitForMacroOffset(*CurrentUnit
);
2628 cloneDIE(InputDIE
, File
, *CurrentUnit
, 0 /* PC offset */, UnitHeaderSize
,
2629 0, IsLittleEndian
, CurrentUnit
->getOutputUnitDIE());
2632 OutputDebugInfoSize
= CurrentUnit
->computeNextUnitOffset(DwarfVersion
);
2634 if (Emitter
!= nullptr) {
2636 generateLineTableForUnit(*CurrentUnit
);
2638 Linker
.emitAcceleratorEntriesForUnit(*CurrentUnit
);
2640 if (LLVM_UNLIKELY(Linker
.Options
.Update
))
2643 Linker
.generateUnitRanges(*CurrentUnit
, File
, AddrPool
);
2645 auto ProcessExpr
= [&](SmallVectorImpl
<uint8_t> &SrcBytes
,
2646 SmallVectorImpl
<uint8_t> &OutBytes
,
2647 int64_t RelocAdjustment
) {
2648 DWARFUnit
&OrigUnit
= CurrentUnit
->getOrigUnit();
2649 DataExtractor
Data(SrcBytes
, IsLittleEndian
,
2650 OrigUnit
.getAddressByteSize());
2651 cloneExpression(Data
,
2652 DWARFExpression(Data
, OrigUnit
.getAddressByteSize(),
2653 OrigUnit
.getFormParams().Format
),
2654 File
, *CurrentUnit
, OutBytes
, RelocAdjustment
,
2657 generateUnitLocations(*CurrentUnit
, File
, ProcessExpr
);
2658 emitDebugAddrSection(*CurrentUnit
, DwarfVersion
);
2663 if (Emitter
!= nullptr) {
2665 // Emit macro tables.
2666 Emitter
->emitMacroTables(File
.Dwarf
.get(), UnitMacroMap
, DebugStrPool
);
2668 // Emit all the compile unit's debug information.
2669 for (auto &CurrentUnit
: CompileUnits
) {
2670 CurrentUnit
->fixupForwardReferences();
2672 if (!CurrentUnit
->getOutputUnitDIE())
2675 unsigned DwarfVersion
= CurrentUnit
->getOrigUnit().getVersion();
2677 assert(Emitter
->getDebugInfoSectionSize() ==
2678 CurrentUnit
->getStartOffset());
2679 Emitter
->emitCompileUnitHeader(*CurrentUnit
, DwarfVersion
);
2680 Emitter
->emitDIE(*CurrentUnit
->getOutputUnitDIE());
2681 assert(Emitter
->getDebugInfoSectionSize() ==
2682 CurrentUnit
->computeNextUnitOffset(DwarfVersion
));
2686 return OutputDebugInfoSize
- StartOutputDebugInfoSize
;
2689 void DWARFLinker::copyInvariantDebugSection(DWARFContext
&Dwarf
) {
2690 TheDwarfEmitter
->emitSectionContents(Dwarf
.getDWARFObj().getLocSection().Data
,
2691 DebugSectionKind::DebugLoc
);
2692 TheDwarfEmitter
->emitSectionContents(
2693 Dwarf
.getDWARFObj().getRangesSection().Data
,
2694 DebugSectionKind::DebugRange
);
2695 TheDwarfEmitter
->emitSectionContents(
2696 Dwarf
.getDWARFObj().getFrameSection().Data
, DebugSectionKind::DebugFrame
);
2697 TheDwarfEmitter
->emitSectionContents(Dwarf
.getDWARFObj().getArangesSection(),
2698 DebugSectionKind::DebugARanges
);
2699 TheDwarfEmitter
->emitSectionContents(
2700 Dwarf
.getDWARFObj().getAddrSection().Data
, DebugSectionKind::DebugAddr
);
2701 TheDwarfEmitter
->emitSectionContents(
2702 Dwarf
.getDWARFObj().getRnglistsSection().Data
,
2703 DebugSectionKind::DebugRngLists
);
2704 TheDwarfEmitter
->emitSectionContents(
2705 Dwarf
.getDWARFObj().getLoclistsSection().Data
,
2706 DebugSectionKind::DebugLocLists
);
2709 void DWARFLinker::addObjectFile(DWARFFile
&File
, ObjFileLoaderTy Loader
,
2710 CompileUnitHandlerTy OnCUDieLoaded
) {
2711 ObjectContexts
.emplace_back(LinkContext(File
));
2713 if (ObjectContexts
.back().File
.Dwarf
) {
2714 for (const std::unique_ptr
<DWARFUnit
> &CU
:
2715 ObjectContexts
.back().File
.Dwarf
->compile_units()) {
2716 DWARFDie CUDie
= CU
->getUnitDIE();
2723 if (!LLVM_UNLIKELY(Options
.Update
))
2724 registerModuleReference(CUDie
, ObjectContexts
.back(), Loader
,
2730 Error
DWARFLinker::link() {
2731 assert((Options
.TargetDWARFVersion
!= 0) &&
2732 "TargetDWARFVersion should be set");
2734 // First populate the data structure we need for each iteration of the
2736 unsigned NumObjects
= ObjectContexts
.size();
2738 // This Dwarf string pool which is used for emission. It must be used
2739 // serially as the order of calling getStringOffset matters for
2741 OffsetsStringPool
DebugStrPool(true);
2742 OffsetsStringPool
DebugLineStrPool(false);
2743 DebugDieValuePool StringOffsetPool
;
2745 // ODR Contexts for the optimize.
2746 DeclContextTree ODRContexts
;
2748 for (LinkContext
&OptContext
: ObjectContexts
) {
2749 if (Options
.Verbose
)
2750 outs() << "DEBUG MAP OBJECT: " << OptContext
.File
.FileName
<< "\n";
2752 if (!OptContext
.File
.Dwarf
)
2755 if (Options
.VerifyInputDWARF
)
2756 verifyInput(OptContext
.File
);
2758 // Look for relocations that correspond to address map entries.
2760 // there was findvalidrelocations previously ... probably we need to gather
2762 if (LLVM_LIKELY(!Options
.Update
) &&
2763 !OptContext
.File
.Addresses
->hasValidRelocs()) {
2764 if (Options
.Verbose
)
2765 outs() << "No valid relocations found. Skipping.\n";
2767 // Set "Skip" flag as a signal to other loops that we should not
2768 // process this iteration.
2769 OptContext
.Skip
= true;
2773 // Setup access to the debug info.
2774 if (!OptContext
.File
.Dwarf
)
2777 // Check whether type units are presented.
2778 if (!OptContext
.File
.Dwarf
->types_section_units().empty()) {
2779 reportWarning("type units are not currently supported: file will "
2782 OptContext
.Skip
= true;
2786 // Clone all the clang modules with requires extracting the DIE units. We
2787 // don't need the full debug info until the Analyze phase.
2788 OptContext
.CompileUnits
.reserve(
2789 OptContext
.File
.Dwarf
->getNumCompileUnits());
2790 for (const auto &CU
: OptContext
.File
.Dwarf
->compile_units()) {
2791 auto CUDie
= CU
->getUnitDIE(/*ExtractUnitDIEOnly=*/true);
2792 if (Options
.Verbose
) {
2793 outs() << "Input compilation unit:";
2794 DIDumpOptions DumpOpts
;
2795 DumpOpts
.ChildRecurseDepth
= 0;
2796 DumpOpts
.Verbose
= Options
.Verbose
;
2797 CUDie
.dump(outs(), 0, DumpOpts
);
2801 for (auto &CU
: OptContext
.ModuleUnits
) {
2802 if (Error Err
= cloneModuleUnit(OptContext
, CU
, ODRContexts
, DebugStrPool
,
2803 DebugLineStrPool
, StringOffsetPool
))
2804 reportWarning(toString(std::move(Err
)), CU
.File
);
2808 // At this point we know how much data we have emitted. We use this value to
2809 // compare canonical DIE offsets in analyzeContextInfo to see if a definition
2810 // is already emitted, without being affected by canonical die offsets set
2811 // later. This prevents undeterminism when analyze and clone execute
2812 // concurrently, as clone set the canonical DIE offset and analyze reads it.
2813 const uint64_t ModulesEndOffset
=
2814 (TheDwarfEmitter
== nullptr) ? 0
2815 : TheDwarfEmitter
->getDebugInfoSectionSize();
2817 // These variables manage the list of processed object files.
2818 // The mutex and condition variable are to ensure that this is thread safe.
2819 std::mutex ProcessedFilesMutex
;
2820 std::condition_variable ProcessedFilesConditionVariable
;
2821 BitVector
ProcessedFiles(NumObjects
, false);
2823 // Analyzing the context info is particularly expensive so it is executed in
2824 // parallel with emitting the previous compile unit.
2825 auto AnalyzeLambda
= [&](size_t I
) {
2826 auto &Context
= ObjectContexts
[I
];
2828 if (Context
.Skip
|| !Context
.File
.Dwarf
)
2831 for (const auto &CU
: Context
.File
.Dwarf
->compile_units()) {
2832 // Previously we only extracted the unit DIEs. We need the full debug info
2834 auto CUDie
= CU
->getUnitDIE(/*ExtractUnitDIEOnly=*/false);
2835 std::string PCMFile
= getPCMFile(CUDie
, Options
.ObjectPrefixMap
);
2837 if (!CUDie
|| LLVM_UNLIKELY(Options
.Update
) ||
2838 !isClangModuleRef(CUDie
, PCMFile
, Context
, 0, true).first
) {
2839 Context
.CompileUnits
.push_back(std::make_unique
<CompileUnit
>(
2840 *CU
, UniqueUnitID
++, !Options
.NoODR
&& !Options
.Update
, ""));
2844 // Now build the DIE parent links that we will use during the next phase.
2845 for (auto &CurrentUnit
: Context
.CompileUnits
) {
2846 auto CUDie
= CurrentUnit
->getOrigUnit().getUnitDIE();
2849 analyzeContextInfo(CurrentUnit
->getOrigUnit().getUnitDIE(), 0,
2850 *CurrentUnit
, &ODRContexts
.getRoot(), ODRContexts
,
2851 ModulesEndOffset
, Options
.ParseableSwiftInterfaces
,
2852 [&](const Twine
&Warning
, const DWARFDie
&DIE
) {
2853 reportWarning(Warning
, Context
.File
, &DIE
);
2858 // For each object file map how many bytes were emitted.
2859 StringMap
<DebugInfoSize
> SizeByObject
;
2861 // And then the remaining work in serial again.
2862 // Note, although this loop runs in serial, it can run in parallel with
2863 // the analyzeContextInfo loop so long as we process files with indices >=
2864 // than those processed by analyzeContextInfo.
2865 auto CloneLambda
= [&](size_t I
) {
2866 auto &OptContext
= ObjectContexts
[I
];
2867 if (OptContext
.Skip
|| !OptContext
.File
.Dwarf
)
2870 // Then mark all the DIEs that need to be present in the generated output
2871 // and collect some information about them.
2872 // Note that this loop can not be merged with the previous one because
2873 // cross-cu references require the ParentIdx to be setup for every CU in
2874 // the object file before calling this.
2875 if (LLVM_UNLIKELY(Options
.Update
)) {
2876 for (auto &CurrentUnit
: OptContext
.CompileUnits
)
2877 CurrentUnit
->markEverythingAsKept();
2878 copyInvariantDebugSection(*OptContext
.File
.Dwarf
);
2880 for (auto &CurrentUnit
: OptContext
.CompileUnits
) {
2881 lookForDIEsToKeep(*OptContext
.File
.Addresses
, OptContext
.CompileUnits
,
2882 CurrentUnit
->getOrigUnit().getUnitDIE(),
2883 OptContext
.File
, *CurrentUnit
, 0);
2885 verifyKeepChain(*CurrentUnit
);
2890 // The calls to applyValidRelocs inside cloneDIE will walk the reloc
2891 // array again (in the same way findValidRelocsInDebugInfo() did). We
2892 // need to reset the NextValidReloc index to the beginning.
2893 if (OptContext
.File
.Addresses
->hasValidRelocs() ||
2894 LLVM_UNLIKELY(Options
.Update
)) {
2895 SizeByObject
[OptContext
.File
.FileName
].Input
=
2896 getDebugInfoSize(*OptContext
.File
.Dwarf
);
2897 SizeByObject
[OptContext
.File
.FileName
].Output
=
2898 DIECloner(*this, TheDwarfEmitter
, OptContext
.File
, DIEAlloc
,
2899 OptContext
.CompileUnits
, Options
.Update
, DebugStrPool
,
2900 DebugLineStrPool
, StringOffsetPool
)
2901 .cloneAllCompileUnits(*OptContext
.File
.Dwarf
, OptContext
.File
,
2902 OptContext
.File
.Dwarf
->isLittleEndian());
2904 if ((TheDwarfEmitter
!= nullptr) && !OptContext
.CompileUnits
.empty() &&
2905 LLVM_LIKELY(!Options
.Update
))
2906 patchFrameInfoForObject(OptContext
);
2908 // Clean-up before starting working on the next object.
2909 cleanupAuxiliarryData(OptContext
);
2912 auto EmitLambda
= [&]() {
2913 // Emit everything that's global.
2914 if (TheDwarfEmitter
!= nullptr) {
2915 TheDwarfEmitter
->emitAbbrevs(Abbreviations
, Options
.TargetDWARFVersion
);
2916 TheDwarfEmitter
->emitStrings(DebugStrPool
);
2917 TheDwarfEmitter
->emitStringOffsets(StringOffsetPool
.getValues(),
2918 Options
.TargetDWARFVersion
);
2919 TheDwarfEmitter
->emitLineStrings(DebugLineStrPool
);
2920 for (AccelTableKind TableKind
: Options
.AccelTables
) {
2921 switch (TableKind
) {
2922 case AccelTableKind::Apple
:
2923 TheDwarfEmitter
->emitAppleNamespaces(AppleNamespaces
);
2924 TheDwarfEmitter
->emitAppleNames(AppleNames
);
2925 TheDwarfEmitter
->emitAppleTypes(AppleTypes
);
2926 TheDwarfEmitter
->emitAppleObjc(AppleObjc
);
2928 case AccelTableKind::Pub
:
2929 // Already emitted by emitAcceleratorEntriesForUnit.
2930 // Already emitted by emitAcceleratorEntriesForUnit.
2932 case AccelTableKind::DebugNames
:
2933 TheDwarfEmitter
->emitDebugNames(DebugNames
);
2940 auto AnalyzeAll
= [&]() {
2941 for (unsigned I
= 0, E
= NumObjects
; I
!= E
; ++I
) {
2944 std::unique_lock
<std::mutex
> LockGuard(ProcessedFilesMutex
);
2945 ProcessedFiles
.set(I
);
2946 ProcessedFilesConditionVariable
.notify_one();
2950 auto CloneAll
= [&]() {
2951 for (unsigned I
= 0, E
= NumObjects
; I
!= E
; ++I
) {
2953 std::unique_lock
<std::mutex
> LockGuard(ProcessedFilesMutex
);
2954 if (!ProcessedFiles
[I
]) {
2955 ProcessedFilesConditionVariable
.wait(
2956 LockGuard
, [&]() { return ProcessedFiles
[I
]; });
2965 // To limit memory usage in the single threaded case, analyze and clone are
2966 // run sequentially so the OptContext is freed after processing each object
2967 // in endDebugObject.
2968 if (Options
.Threads
== 1) {
2969 for (unsigned I
= 0, E
= NumObjects
; I
!= E
; ++I
) {
2975 DefaultThreadPool
Pool(hardware_concurrency(2));
2976 Pool
.async(AnalyzeAll
);
2977 Pool
.async(CloneAll
);
2981 if (Options
.Statistics
) {
2982 // Create a vector sorted in descending order by output size.
2983 std::vector
<std::pair
<StringRef
, DebugInfoSize
>> Sorted
;
2984 for (auto &E
: SizeByObject
)
2985 Sorted
.emplace_back(E
.first(), E
.second
);
2986 llvm::sort(Sorted
, [](auto &LHS
, auto &RHS
) {
2987 return LHS
.second
.Output
> RHS
.second
.Output
;
2990 auto ComputePercentange
= [](int64_t Input
, int64_t Output
) -> float {
2991 const float Difference
= Output
- Input
;
2992 const float Sum
= Input
+ Output
;
2995 return (Difference
/ (Sum
/ 2));
2998 int64_t InputTotal
= 0;
2999 int64_t OutputTotal
= 0;
3000 const char *FormatStr
= "{0,-45} {1,10}b {2,10}b {3,8:P}\n";
3003 outs() << ".debug_info section size (in bytes)\n";
3004 outs() << "----------------------------------------------------------------"
3005 "---------------\n";
3006 outs() << "Filename Object "
3008 outs() << "----------------------------------------------------------------"
3009 "---------------\n";
3012 for (auto &E
: Sorted
) {
3013 InputTotal
+= E
.second
.Input
;
3014 OutputTotal
+= E
.second
.Output
;
3015 llvm::outs() << formatv(
3016 FormatStr
, sys::path::filename(E
.first
).take_back(45), E
.second
.Input
,
3017 E
.second
.Output
, ComputePercentange(E
.second
.Input
, E
.second
.Output
));
3019 // Print total and footer.
3020 outs() << "----------------------------------------------------------------"
3021 "---------------\n";
3022 llvm::outs() << formatv(FormatStr
, "Total", InputTotal
, OutputTotal
,
3023 ComputePercentange(InputTotal
, OutputTotal
));
3024 outs() << "----------------------------------------------------------------"
3025 "---------------\n\n";
3028 return Error::success();
3031 Error
DWARFLinker::cloneModuleUnit(LinkContext
&Context
, RefModuleUnit
&Unit
,
3032 DeclContextTree
&ODRContexts
,
3033 OffsetsStringPool
&DebugStrPool
,
3034 OffsetsStringPool
&DebugLineStrPool
,
3035 DebugDieValuePool
&StringOffsetPool
,
3037 assert(Unit
.Unit
.get() != nullptr);
3039 if (!Unit
.Unit
->getOrigUnit().getUnitDIE().hasChildren())
3040 return Error::success();
3042 if (Options
.Verbose
) {
3043 outs().indent(Indent
);
3044 outs() << "cloning .debug_info from " << Unit
.File
.FileName
<< "\n";
3047 // Analyze context for the module.
3048 analyzeContextInfo(Unit
.Unit
->getOrigUnit().getUnitDIE(), 0, *(Unit
.Unit
),
3049 &ODRContexts
.getRoot(), ODRContexts
, 0,
3050 Options
.ParseableSwiftInterfaces
,
3051 [&](const Twine
&Warning
, const DWARFDie
&DIE
) {
3052 reportWarning(Warning
, Context
.File
, &DIE
);
3055 Unit
.Unit
->markEverythingAsKept();
3058 UnitListTy CompileUnits
;
3059 CompileUnits
.emplace_back(std::move(Unit
.Unit
));
3060 assert(TheDwarfEmitter
);
3061 DIECloner(*this, TheDwarfEmitter
, Unit
.File
, DIEAlloc
, CompileUnits
,
3062 Options
.Update
, DebugStrPool
, DebugLineStrPool
, StringOffsetPool
)
3063 .cloneAllCompileUnits(*Unit
.File
.Dwarf
, Unit
.File
,
3064 Unit
.File
.Dwarf
->isLittleEndian());
3065 return Error::success();
3068 void DWARFLinker::verifyInput(const DWARFFile
&File
) {
3072 raw_string_ostream
OS(Buffer
);
3073 DIDumpOptions DumpOpts
;
3074 if (!File
.Dwarf
->verify(OS
, DumpOpts
.noImplicitRecursion())) {
3075 if (Options
.InputVerificationHandler
)
3076 Options
.InputVerificationHandler(File
, OS
.str());