diff options
Diffstat (limited to 'lib/CodeGen')
| -rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 20 | ||||
| -rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.h | 5 | ||||
| -rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfExpression.cpp | 7 | ||||
| -rw-r--r-- | lib/CodeGen/LiveIntervalAnalysis.cpp | 10 | ||||
| -rw-r--r-- | lib/CodeGen/MachineRegisterInfo.cpp | 18 | ||||
| -rw-r--r-- | lib/CodeGen/MachineVerifier.cpp | 2 | 
6 files changed, 47 insertions, 15 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index 676c48fe5c67..333d14a11af5 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -621,6 +621,7 @@ void DwarfCompileUnit::constructAbstractSubprogramScopeDIE(    auto *SP = cast<DISubprogram>(Scope->getScopeNode());    DIE *ContextDIE; +  DwarfCompileUnit *ContextCU = this;    if (includeMinimalInlineScopes())      ContextDIE = &getUnitDie(); @@ -631,18 +632,23 @@ void DwarfCompileUnit::constructAbstractSubprogramScopeDIE(    else if (auto *SPDecl = SP->getDeclaration()) {      ContextDIE = &getUnitDie();      getOrCreateSubprogramDIE(SPDecl); -  } else +  } else {      ContextDIE = getOrCreateContextDIE(resolve(SP->getScope())); +    // The scope may be shared with a subprogram that has already been +    // constructed in another CU, in which case we need to construct this +    // subprogram in the same CU. +    ContextCU = DD->lookupCU(ContextDIE->getUnitDie()); +  }    // Passing null as the associated node because the abstract definition    // shouldn't be found by lookup. -  AbsDef = &createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, nullptr); -  applySubprogramAttributesToDefinition(SP, *AbsDef); +  AbsDef = &ContextCU->createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, nullptr); +  ContextCU->applySubprogramAttributesToDefinition(SP, *AbsDef); -  if (!includeMinimalInlineScopes()) -    addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined); -  if (DIE *ObjectPointer = createAndAddScopeChildren(Scope, *AbsDef)) -    addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer); +  if (!ContextCU->includeMinimalInlineScopes()) +    ContextCU->addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined); +  if (DIE *ObjectPointer = ContextCU->createAndAddScopeChildren(Scope, *AbsDef)) +    ContextCU->addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);  }  DIE *DwarfCompileUnit::constructImportedEntityDIE( diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 5dfe06c64ec2..78ee9a162029 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -283,7 +283,7 @@ class DwarfDebug : public DebugHandlerBase {    // 0, referencing the comp_dir of all the type units that use it.    MCDwarfDwoLineTable SplitTypeUnitFileTable;    /// @} -   +    /// True iff there are multiple CUs in this module.    bool SingleCU;    bool IsDarwin; @@ -562,6 +562,9 @@ public:    bool isLexicalScopeDIENull(LexicalScope *Scope);    bool hasDwarfPubSections(bool includeMinimalInlineScopes) const; + +  /// Find the matching DwarfCompileUnit for the given CU DIE. +  DwarfCompileUnit *lookupCU(const DIE *Die) { return CUDieMap.lookup(Die); }  };  } // End of namespace llvm diff --git a/lib/CodeGen/AsmPrinter/DwarfExpression.cpp b/lib/CodeGen/AsmPrinter/DwarfExpression.cpp index fe38ee805682..3a8568cf39ae 100644 --- a/lib/CodeGen/AsmPrinter/DwarfExpression.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfExpression.cpp @@ -131,13 +131,12 @@ bool DwarfExpression::addMachineReg(const TargetRegisterInfo &TRI,      // Intersection between the bits we already emitted and the bits      // covered by this subregister. -    SmallBitVector Intersection(RegSize, false); -    Intersection.set(Offset, Offset + Size); -    Intersection ^= Coverage; +    SmallBitVector CurSubReg(RegSize, false); +    CurSubReg.set(Offset, Offset + Size);      // If this sub-register has a DWARF number and we haven't covered      // its range, emit a DWARF piece for it. -    if (Reg >= 0 && Intersection.any()) { +    if (Reg >= 0 && CurSubReg.test(Coverage)) {        // Emit a piece for any gap in the coverage.        if (Offset > CurPos)          DwarfRegs.push_back({-1, Offset - CurPos, nullptr}); diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index 471dcea4bb39..0e240f482a19 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -269,8 +269,9 @@ void LiveIntervals::computeRegUnitRange(LiveRange &LR, unsigned Unit) {    // may share super-registers. That's OK because createDeadDefs() is    // idempotent. It is very rare for a register unit to have multiple roots, so    // uniquing super-registers is probably not worthwhile. -  bool IsReserved = true; +  bool IsReserved = false;    for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) { +    bool IsRootReserved = true;      for (MCSuperRegIterator Super(*Root, TRI, /*IncludeSelf=*/true);           Super.isValid(); ++Super) {        unsigned Reg = *Super; @@ -279,9 +280,12 @@ void LiveIntervals::computeRegUnitRange(LiveRange &LR, unsigned Unit) {        // A register unit is considered reserved if all its roots and all their        // super registers are reserved.        if (!MRI->isReserved(Reg)) -        IsReserved = false; +        IsRootReserved = false;      } +    IsReserved |= IsRootReserved;    } +  assert(IsReserved == MRI->isReservedRegUnit(Unit) && +         "reserved computation mismatch");    // Now extend LR to reach all uses.    // Ignore uses of reserved registers. We only track defs of those. @@ -924,7 +928,7 @@ public:    // kill flags. This is wasteful. Eventually, LiveVariables will strip all kill    // flags, and postRA passes will use a live register utility instead.    LiveRange *getRegUnitLI(unsigned Unit) { -    if (UpdateFlags) +    if (UpdateFlags && !MRI.isReservedRegUnit(Unit))        return &LIS.getRegUnit(Unit);      return LIS.getCachedRegUnit(Unit);    } diff --git a/lib/CodeGen/MachineRegisterInfo.cpp b/lib/CodeGen/MachineRegisterInfo.cpp index 9a92ee279cdc..be06053f0040 100644 --- a/lib/CodeGen/MachineRegisterInfo.cpp +++ b/lib/CodeGen/MachineRegisterInfo.cpp @@ -601,3 +601,21 @@ void MachineRegisterInfo::setCalleeSavedRegs(ArrayRef<MCPhysReg> CSRs) {    UpdatedCSRs.push_back(0);    IsUpdatedCSRsInitialized = true;  } + +bool MachineRegisterInfo::isReservedRegUnit(unsigned Unit) const { +  const TargetRegisterInfo *TRI = getTargetRegisterInfo(); +  for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) { +    bool IsRootReserved = true; +    for (MCSuperRegIterator Super(*Root, TRI, /*IncludeSelf=*/true); +         Super.isValid(); ++Super) { +      unsigned Reg = *Super; +      if (!isReserved(Reg)) { +        IsRootReserved = false; +        break; +      } +    } +    if (IsRootReserved) +      return true; +  } +  return false; +} diff --git a/lib/CodeGen/MachineVerifier.cpp b/lib/CodeGen/MachineVerifier.cpp index fcb544806dda..c50a95a06505 100644 --- a/lib/CodeGen/MachineVerifier.cpp +++ b/lib/CodeGen/MachineVerifier.cpp @@ -1316,6 +1316,8 @@ void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) {        // Check the cached regunit intervals.        if (TargetRegisterInfo::isPhysicalRegister(Reg) && !isReserved(Reg)) {          for (MCRegUnitIterator Units(Reg, TRI); Units.isValid(); ++Units) { +          if (MRI->isReservedRegUnit(*Units)) +            continue;            if (const LiveRange *LR = LiveInts->getCachedRegUnit(*Units))              checkLivenessAtUse(MO, MONum, UseIdx, *LR, *Units);          }  | 
