diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-07-29 20:15:26 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-07-29 20:15:26 +0000 |
| commit | 344a3780b2e33f6ca763666c380202b18aab72a3 (patch) | |
| tree | f0b203ee6eb71d7fdd792373e3c81eb18d6934dd /llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | |
| parent | b60736ec1405bb0a8dd40989f67ef4c93da068ab (diff) | |
vendor/llvm-project/llvmorg-13-init-16847-g88e66fa60ae5vendor/llvm-project/llvmorg-12.0.1-rc2-0-ge7dac564cd0evendor/llvm-project/llvmorg-12.0.1-0-gfed41342a82f
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 237 |
1 files changed, 132 insertions, 105 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 118b5fcc3bf6..344d30fad347 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -100,10 +100,10 @@ DwarfTypeUnit::DwarfTypeUnit(DwarfCompileUnit &CU, AsmPrinter *A, } DwarfUnit::~DwarfUnit() { - for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j) - DIEBlocks[j]->~DIEBlock(); - for (unsigned j = 0, M = DIELocs.size(); j < M; ++j) - DIELocs[j]->~DIELoc(); + for (DIEBlock *B : DIEBlocks) + B->~DIEBlock(); + for (DIELoc *L : DIELocs) + L->~DIELoc(); } int64_t DwarfUnit::getDefaultLowerBound() const { @@ -219,11 +219,9 @@ void DwarfUnit::insertDIE(DIE *D) { void DwarfUnit::addFlag(DIE &Die, dwarf::Attribute Attribute) { if (DD->getDwarfVersion() >= 4) - Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_flag_present, - DIEInteger(1)); + addAttribute(Die, Attribute, dwarf::DW_FORM_flag_present, DIEInteger(1)); else - Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_flag, - DIEInteger(1)); + addAttribute(Die, Attribute, dwarf::DW_FORM_flag, DIEInteger(1)); } void DwarfUnit::addUInt(DIEValueList &Die, dwarf::Attribute Attribute, @@ -232,7 +230,7 @@ void DwarfUnit::addUInt(DIEValueList &Die, dwarf::Attribute Attribute, Form = DIEInteger::BestForm(false, Integer); assert(Form != dwarf::DW_FORM_implicit_const && "DW_FORM_implicit_const is used only for signed integers"); - Die.addValue(DIEValueAllocator, Attribute, *Form, DIEInteger(Integer)); + addAttribute(Die, Attribute, *Form, DIEInteger(Integer)); } void DwarfUnit::addUInt(DIEValueList &Block, dwarf::Form Form, @@ -244,7 +242,7 @@ void DwarfUnit::addSInt(DIEValueList &Die, dwarf::Attribute Attribute, Optional<dwarf::Form> Form, int64_t Integer) { if (!Form) Form = DIEInteger::BestForm(true, Integer); - Die.addValue(DIEValueAllocator, Attribute, *Form, DIEInteger(Integer)); + addAttribute(Die, Attribute, *Form, DIEInteger(Integer)); } void DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form, @@ -258,7 +256,7 @@ void DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute, return; if (DD->useInlineStrings()) { - Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_string, + addAttribute(Die, Attribute, dwarf::DW_FORM_string, new (DIEValueAllocator) DIEInlineString(String, DIEValueAllocator)); return; @@ -282,15 +280,12 @@ void DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute, else if (Index > 0xff) IxForm = dwarf::DW_FORM_strx2; } - Die.addValue(DIEValueAllocator, Attribute, IxForm, - DIEString(StringPoolEntry)); + addAttribute(Die, Attribute, IxForm, DIEString(StringPoolEntry)); } -DIEValueList::value_iterator DwarfUnit::addLabel(DIEValueList &Die, - dwarf::Attribute Attribute, - dwarf::Form Form, - const MCSymbol *Label) { - return Die.addValue(DIEValueAllocator, Attribute, Form, DIELabel(Label)); +void DwarfUnit::addLabel(DIEValueList &Die, dwarf::Attribute Attribute, + dwarf::Form Form, const MCSymbol *Label) { + addAttribute(Die, Attribute, Form, DIELabel(Label)); } void DwarfUnit::addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label) { @@ -315,17 +310,39 @@ unsigned DwarfTypeUnit::getOrCreateSourceID(const DIFile *File) { Asm->OutContext.getDwarfVersion(), File->getSource()); } -void DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) { +void DwarfUnit::addPoolOpAddress(DIEValueList &Die, const MCSymbol *Label) { + bool UseAddrOffsetFormOrExpressions = + DD->useAddrOffsetForm() || DD->useAddrOffsetExpressions(); + + const MCSymbol *Base = nullptr; + if (Label->isInSection() && UseAddrOffsetFormOrExpressions) + Base = DD->getSectionLabel(&Label->getSection()); + + uint32_t Index = DD->getAddressPool().getIndex(Base ? Base : Label); + if (DD->getDwarfVersion() >= 5) { addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addrx); - addUInt(Die, dwarf::DW_FORM_addrx, DD->getAddressPool().getIndex(Sym)); + addUInt(Die, dwarf::DW_FORM_addrx, Index); + } else { + addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index); + addUInt(Die, dwarf::DW_FORM_GNU_addr_index, Index); + } + + if (Base && Base != Label) { + addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_const4u); + addLabelDelta(Die, (dwarf::Attribute)0, Label, Base); + addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); + } +} + +void DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) { + if (DD->getDwarfVersion() >= 5) { + addPoolOpAddress(Die, Sym); return; } if (DD->useSplitDwarf()) { - addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index); - addUInt(Die, dwarf::DW_FORM_GNU_addr_index, - DD->getAddressPool().getIndex(Sym)); + addPoolOpAddress(Die, Sym); return; } @@ -333,9 +350,9 @@ void DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) { addLabel(Die, dwarf::DW_FORM_addr, Sym); } -void DwarfUnit::addLabelDelta(DIE &Die, dwarf::Attribute Attribute, +void DwarfUnit::addLabelDelta(DIEValueList &Die, dwarf::Attribute Attribute, const MCSymbol *Hi, const MCSymbol *Lo) { - Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_data4, + addAttribute(Die, Attribute, dwarf::DW_FORM_data4, new (DIEValueAllocator) DIEDelta(Hi, Lo)); } @@ -350,8 +367,8 @@ void DwarfUnit::addDIETypeSignature(DIE &Die, uint64_t Signature) { // and think this is a full definition. addFlag(Die, dwarf::DW_AT_declaration); - Die.addValue(DIEValueAllocator, dwarf::DW_AT_signature, - dwarf::DW_FORM_ref_sig8, DIEInteger(Signature)); + addAttribute(Die, dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8, + DIEInteger(Signature)); } void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, @@ -363,13 +380,13 @@ void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, CU = getUnitDie().getUnit(); if (!EntryCU) EntryCU = getUnitDie().getUnit(); - Die.addValue(DIEValueAllocator, Attribute, + addAttribute(Die, Attribute, EntryCU == CU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr, Entry); } -DIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, const DINode *N) { - DIE &Die = Parent.addChild(DIE::get(DIEValueAllocator, (dwarf::Tag)Tag)); +DIE &DwarfUnit::createAndAddDIE(dwarf::Tag Tag, DIE &Parent, const DINode *N) { + DIE &Die = Parent.addChild(DIE::get(DIEValueAllocator, Tag)); if (N) insertDIE(N, &Die); return Die; @@ -378,15 +395,19 @@ DIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, const DINode *N) { void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc) { Loc->ComputeSize(Asm); DIELocs.push_back(Loc); // Memoize so we can call the destructor later on. - Die.addValue(DIEValueAllocator, Attribute, - Loc->BestForm(DD->getDwarfVersion()), Loc); + addAttribute(Die, Attribute, Loc->BestForm(DD->getDwarfVersion()), Loc); } -void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, +void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, dwarf::Form Form, DIEBlock *Block) { Block->ComputeSize(Asm); DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on. - Die.addValue(DIEValueAllocator, Attribute, Block->BestForm(), Block); + addAttribute(Die, Attribute, Form, Block); +} + +void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, + DIEBlock *Block) { + addBlock(Die, Attribute, Block->BestForm(), Block); } void DwarfUnit::addSourceLine(DIE &Die, unsigned Line, const DIFile *File) { @@ -918,14 +939,17 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DICompositeType *CTy) { addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type); // Add the type's non-standard calling convention. - uint8_t CC = 0; - if (CTy->isTypePassByValue()) - CC = dwarf::DW_CC_pass_by_value; - else if (CTy->isTypePassByReference()) - CC = dwarf::DW_CC_pass_by_reference; - if (CC) - addUInt(Buffer, dwarf::DW_AT_calling_convention, dwarf::DW_FORM_data1, - CC); + // DW_CC_pass_by_value/DW_CC_pass_by_reference are introduced in DWARF 5. + if (!Asm->TM.Options.DebugStrictDwarf || DD->getDwarfVersion() >= 5) { + uint8_t CC = 0; + if (CTy->isTypePassByValue()) + CC = dwarf::DW_CC_pass_by_value; + else if (CTy->isTypePassByReference()) + CC = dwarf::DW_CC_pass_by_reference; + if (CC) + addUInt(Buffer, dwarf::DW_AT_calling_convention, dwarf::DW_FORM_data1, + CC); + } break; } default: @@ -1106,32 +1130,34 @@ DIE *DwarfUnit::getOrCreateSubprogramDIE(const DISubprogram *SP, bool Minimal) { } bool DwarfUnit::applySubprogramDefinitionAttributes(const DISubprogram *SP, - DIE &SPDie) { + DIE &SPDie, bool Minimal) { DIE *DeclDie = nullptr; StringRef DeclLinkageName; if (auto *SPDecl = SP->getDeclaration()) { - DITypeRefArray DeclArgs, DefinitionArgs; - DeclArgs = SPDecl->getType()->getTypeArray(); - DefinitionArgs = SP->getType()->getTypeArray(); + if (!Minimal) { + DITypeRefArray DeclArgs, DefinitionArgs; + DeclArgs = SPDecl->getType()->getTypeArray(); + DefinitionArgs = SP->getType()->getTypeArray(); - if (DeclArgs.size() && DefinitionArgs.size()) - if (DefinitionArgs[0] != NULL && DeclArgs[0] != DefinitionArgs[0]) - addType(SPDie, DefinitionArgs[0]); + if (DeclArgs.size() && DefinitionArgs.size()) + if (DefinitionArgs[0] != NULL && DeclArgs[0] != DefinitionArgs[0]) + addType(SPDie, DefinitionArgs[0]); - DeclDie = getDIE(SPDecl); - assert(DeclDie && "This DIE should've already been constructed when the " - "definition DIE was created in " - "getOrCreateSubprogramDIE"); - // Look at the Decl's linkage name only if we emitted it. - if (DD->useAllLinkageNames()) - DeclLinkageName = SPDecl->getLinkageName(); - unsigned DeclID = getOrCreateSourceID(SPDecl->getFile()); - unsigned DefID = getOrCreateSourceID(SP->getFile()); - if (DeclID != DefID) - addUInt(SPDie, dwarf::DW_AT_decl_file, None, DefID); + DeclDie = getDIE(SPDecl); + assert(DeclDie && "This DIE should've already been constructed when the " + "definition DIE was created in " + "getOrCreateSubprogramDIE"); + // Look at the Decl's linkage name only if we emitted it. + if (DD->useAllLinkageNames()) + DeclLinkageName = SPDecl->getLinkageName(); + unsigned DeclID = getOrCreateSourceID(SPDecl->getFile()); + unsigned DefID = getOrCreateSourceID(SP->getFile()); + if (DeclID != DefID) + addUInt(SPDie, dwarf::DW_AT_decl_file, None, DefID); - if (SP->getLine() != SPDecl->getLine()) - addUInt(SPDie, dwarf::DW_AT_decl_line, None, SP->getLine()); + if (SP->getLine() != SPDecl->getLine()) + addUInt(SPDie, dwarf::DW_AT_decl_line, None, SP->getLine()); + } } // Add function template parameters. @@ -1163,7 +1189,7 @@ void DwarfUnit::applySubprogramAttributes(const DISubprogram *SP, DIE &SPDie, bool SkipSPSourceLocation = SkipSPAttributes && !CUNode->getDebugInfoForProfiling(); if (!SkipSPSourceLocation) - if (applySubprogramDefinitionAttributes(SP, SPDie)) + if (applySubprogramDefinitionAttributes(SP, SPDie, SkipSPAttributes)) return; // Constructors and operators for anonymous aggregates do not have names. @@ -1286,9 +1312,6 @@ void DwarfUnit::constructSubrangeDIE(DIE &Buffer, const DISubrange *SR, // Count == -1 then the array is unbounded and we do not emit // DW_AT_lower_bound and DW_AT_count attributes. int64_t DefaultLowerBound = getDefaultLowerBound(); - int64_t Count = -1; - if (auto *CI = SR->getCount().dyn_cast<ConstantInt*>()) - Count = CI->getSExtValue(); auto AddBoundTypeEntry = [&](dwarf::Attribute Attr, DISubrange::BoundType Bound) -> void { @@ -1302,19 +1325,18 @@ void DwarfUnit::constructSubrangeDIE(DIE &Buffer, const DISubrange *SR, DwarfExpr.addExpression(BE); addBlock(DW_Subrange, Attr, DwarfExpr.finalize()); } else if (auto *BI = Bound.dyn_cast<ConstantInt *>()) { - if (Attr != dwarf::DW_AT_lower_bound || DefaultLowerBound == -1 || - BI->getSExtValue() != DefaultLowerBound) + if (Attr == dwarf::DW_AT_count) { + if (BI->getSExtValue() != -1) + addUInt(DW_Subrange, Attr, None, BI->getSExtValue()); + } else if (Attr != dwarf::DW_AT_lower_bound || DefaultLowerBound == -1 || + BI->getSExtValue() != DefaultLowerBound) addSInt(DW_Subrange, Attr, dwarf::DW_FORM_sdata, BI->getSExtValue()); } }; AddBoundTypeEntry(dwarf::DW_AT_lower_bound, SR->getLowerBound()); - if (auto *CV = SR->getCount().dyn_cast<DIVariable*>()) { - if (auto *CountVarDIE = getDIE(CV)) - addDIEEntry(DW_Subrange, dwarf::DW_AT_count, *CountVarDIE); - } else if (Count != -1) - addUInt(DW_Subrange, dwarf::DW_AT_count, None, Count); + AddBoundTypeEntry(dwarf::DW_AT_count, SR->getCount()); AddBoundTypeEntry(dwarf::DW_AT_upper_bound, SR->getUpperBound()); @@ -1336,7 +1358,9 @@ void DwarfUnit::constructGenericSubrangeDIE(DIE &Buffer, if (auto *VarDIE = getDIE(BV)) addDIEEntry(DwGenericSubrange, Attr, *VarDIE); } else if (auto *BE = Bound.dyn_cast<DIExpression *>()) { - if (BE->isSignedConstant()) { + if (BE->isConstant() && + DIExpression::SignedOrUnsignedConstant::SignedConstant == + *BE->isConstant()) { if (Attr != dwarf::DW_AT_lower_bound || DefaultLowerBound == -1 || static_cast<int64_t>(BE->getElement(1)) != DefaultLowerBound) addSInt(DwGenericSubrange, Attr, dwarf::DW_FORM_sdata, @@ -1462,9 +1486,9 @@ void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, const DICompositeType *CTy) { // Add subranges to array type. DINodeArray Elements = CTy->getElements(); - for (unsigned i = 0, N = Elements.size(); i < N; ++i) { + for (DINode *E : Elements) { // FIXME: Should this really be such a loose cast? - if (auto *Element = dyn_cast_or_null<DINode>(Elements[i])) { + if (auto *Element = dyn_cast_or_null<DINode>(E)) { if (Element->getTag() == dwarf::DW_TAG_subrange_type) constructSubrangeDIE(Buffer, cast<DISubrange>(Element), IdxTy); else if (Element->getTag() == dwarf::DW_TAG_generic_subrange) @@ -1490,8 +1514,8 @@ void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, const DICompositeType *CTy) { DINodeArray Elements = CTy->getElements(); // Add enumerators to enumeration type. - for (unsigned i = 0, N = Elements.size(); i < N; ++i) { - auto *Enum = dyn_cast_or_null<DIEnumerator>(Elements[i]); + for (const DINode *E : Elements) { + auto *Enum = dyn_cast_or_null<DIEnumerator>(E); if (Enum) { DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer); StringRef Name = Enum->getName(); @@ -1504,10 +1528,9 @@ void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, const DICompositeType *CTy) { } void DwarfUnit::constructContainingTypeDIEs() { - for (auto CI = ContainingTypeMap.begin(), CE = ContainingTypeMap.end(); - CI != CE; ++CI) { - DIE &SPDie = *CI->first; - const DINode *D = CI->second; + for (auto &P : ContainingTypeMap) { + DIE &SPDie = *P.first; + const DINode *D = P.second; if (!D) continue; DIE *NDie = getDIE(D); @@ -1595,9 +1618,18 @@ DIE &DwarfUnit::constructMemberDIE(DIE &Buffer, const DIDerivedType *DT) { addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes); addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie); - } else if (!IsBitfield || DD->useDWARF2Bitfields()) - addUInt(MemberDie, dwarf::DW_AT_data_member_location, None, - OffsetInBytes); + } else if (!IsBitfield || DD->useDWARF2Bitfields()) { + // In DWARF v3, DW_FORM_data4/8 in DW_AT_data_member_location are + // interpreted as location-list pointers. Interpreting constants as + // pointers is not expected, so we use DW_FORM_udata to encode the + // constants here. + if (DD->getDwarfVersion() == 3) + addUInt(MemberDie, dwarf::DW_AT_data_member_location, + dwarf::DW_FORM_udata, OffsetInBytes); + else + addUInt(MemberDie, dwarf::DW_AT_data_member_location, None, + OffsetInBytes); + } } if (DT->isProtected()) @@ -1617,8 +1649,8 @@ DIE &DwarfUnit::constructMemberDIE(DIE &Buffer, const DIDerivedType *DT) { // Objective-C properties. if (DINode *PNode = DT->getObjCProperty()) if (DIE *PDie = getDIE(PNode)) - MemberDie.addValue(DIEValueAllocator, dwarf::DW_AT_APPLE_property, - dwarf::DW_FORM_ref4, DIEEntry(*PDie)); + addAttribute(MemberDie, dwarf::DW_AT_APPLE_property, + dwarf::DW_FORM_ref4, DIEEntry(*PDie)); if (DT->isArtificial()) addFlag(MemberDie, dwarf::DW_AT_artificial); @@ -1675,13 +1707,10 @@ DIE *DwarfUnit::getOrCreateStaticMemberDIE(const DIDerivedType *DT) { void DwarfUnit::emitCommonHeader(bool UseOffsets, dwarf::UnitType UT) { // Emit size of content not including length itself - if (!DD->useSectionsAsReferences()) { - StringRef Prefix = isDwoUnit() ? "debug_info_dwo_" : "debug_info_"; - MCSymbol *BeginLabel = Asm->createTempSymbol(Prefix + "start"); - EndLabel = Asm->createTempSymbol(Prefix + "end"); - Asm->emitDwarfUnitLength(EndLabel, BeginLabel, "Length of Unit"); - Asm->OutStreamer->emitLabel(BeginLabel); - } else + if (!DD->useSectionsAsReferences()) + EndLabel = Asm->emitDwarfUnitLength( + isDwoUnit() ? "debug_info_dwo" : "debug_info", "Length of Unit"); + else Asm->emitDwarfUnitLength(getHeaderSize() + getUnitDie().getSize(), "Length of Unit"); @@ -1725,20 +1754,18 @@ void DwarfTypeUnit::emitHeader(bool UseOffsets) { Asm->emitDwarfLengthOrOffset(Ty ? Ty->getOffset() : 0); } -DIE::value_iterator -DwarfUnit::addSectionDelta(DIE &Die, dwarf::Attribute Attribute, - const MCSymbol *Hi, const MCSymbol *Lo) { - return Die.addValue(DIEValueAllocator, Attribute, - DD->getDwarfSectionOffsetForm(), - new (DIEValueAllocator) DIEDelta(Hi, Lo)); +void DwarfUnit::addSectionDelta(DIE &Die, dwarf::Attribute Attribute, + const MCSymbol *Hi, const MCSymbol *Lo) { + addAttribute(Die, Attribute, DD->getDwarfSectionOffsetForm(), + new (DIEValueAllocator) DIEDelta(Hi, Lo)); } -DIE::value_iterator -DwarfUnit::addSectionLabel(DIE &Die, dwarf::Attribute Attribute, - const MCSymbol *Label, const MCSymbol *Sec) { +void DwarfUnit::addSectionLabel(DIE &Die, dwarf::Attribute Attribute, + const MCSymbol *Label, const MCSymbol *Sec) { if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) - return addLabel(Die, Attribute, DD->getDwarfSectionOffsetForm(), Label); - return addSectionDelta(Die, Attribute, Label, Sec); + addLabel(Die, Attribute, DD->getDwarfSectionOffsetForm(), Label); + else + addSectionDelta(Die, Attribute, Label, Sec); } bool DwarfTypeUnit::isDwoUnit() const { |
