[llvm] r287839 - Rely on a single DWARF version instead of having two copies

Robinson, Paul via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 28 10:17:35 PST 2016



> -----Original Message-----
> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On Behalf
> Of Greg Clayton via llvm-commits
> Sent: Wednesday, November 23, 2016 3:31 PM
> To: llvm-commits at lists.llvm.org
> Subject: [llvm] r287839 - Rely on a single DWARF version instead of having
> two copies
> 
> Author: gclayton
> Date: Wed Nov 23 17:30:37 2016
> New Revision: 287839
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=287839&view=rev
> Log:
> Rely on a single DWARF version instead of having two copies
> 
> This patch makes AsmPrinter less reliant on DwarfDebug by relying on the
> DWARF version in the AsmPrinter's MCStreamer's MCContext. This allows us
> to remove the redundant DWARF version from DwarfDebug. It also lets us
> change code that used to access the AsmPrinter's DwarfDebug just to get to
> the DWARF version by changing the DWARF version accessor on AsmPrinter so
> that it grabs the version from its MCStreamer's MCContext.
> 
> Differential Revision: https://reviews.llvm.org/D27032
> 
> Modified:
>     llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
>     llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
> 
> Modified: llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/include/llvm/CodeGen/AsmPrinter.h?rev=287839&r1=287838&
> r2=287839&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/include/llvm/CodeGen/AsmPrinter.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/AsmPrinter.h Wed Nov 23 17:30:37 2016
> @@ -149,6 +149,9 @@ public:
>    DwarfDebug *getDwarfDebug() { return DD; }
>    DwarfDebug *getDwarfDebug() const { return DD; }
> 
> +  uint16_t getDwarfVersion() const;
> +  void setDwarfVersion(uint16_t Version);
> +
>    bool isPositionIndependent() const;
> 
>    /// Return true if assembly output should contain comments.
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=287839&r1=287
> 838&r2=287839&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Wed Nov 23 17:30:37
> 2016
> @@ -2620,3 +2620,11 @@ void AsmPrinter::recordSled(MCSymbol *Sl
>    Sleds.emplace_back(
>      XRayFunctionEntry{ Sled, CurrentFnSym, Kind, AlwaysInstrument, Fn });
>  }
> +
> +uint16_t AsmPrinter::getDwarfVersion() const {
> +  return OutStreamer->getContext().getDwarfVersion();
> +}
> +
> +void AsmPrinter::setDwarfVersion(uint16_t Version) {
> +  OutStreamer->getContext().setDwarfVersion(Version);
> +}
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp?rev=287839&r
> 1=287838&r2=287839&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp Wed Nov 23
> 17:30:37 2016
> @@ -177,7 +177,7 @@ void AsmPrinter::emitDwarfStringOffset(D
>  /// EmitDwarfRegOp - Emit dwarf register operation.
>  void AsmPrinter::EmitDwarfRegOp(ByteStreamer &Streamer,
>                                  const MachineLocation &MLoc) const {
> -  DebugLocDwarfExpression Expr(getDwarfDebug()->getDwarfVersion(),
> Streamer);
> +  DebugLocDwarfExpression Expr(getDwarfVersion(), Streamer);
>    const MCRegisterInfo *MRI = MMI->getContext().getRegisterInfo();
>    int Reg = MRI->getDwarfRegNum(MLoc.getReg(), false);
>    if (Reg < 0) {
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp?rev=287839&r1=287838&r2=
> 287839&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp Wed Nov 23 17:30:37 2016
> @@ -298,7 +298,7 @@ unsigned DIEInteger::SizeOf(const AsmPri
>    case dwarf::DW_FORM_addr:
>      return AP->getPointerSize();
>    case dwarf::DW_FORM_ref_addr:
> -    if (AP->OutStreamer->getContext().getDwarfVersion() == 2)
> +    if (AP->getDwarfVersion() == 2)
>        return AP->getPointerSize();
>      return sizeof(int32_t);
>    default: llvm_unreachable("DIE Value form not supported yet");
> @@ -466,9 +466,7 @@ unsigned DIEEntry::getRefAddrSize(const
>    // specified to be four bytes in the DWARF 32-bit format and eight
> bytes
>    // in the DWARF 64-bit format, while DWARF Version 2 specifies that
> such
>    // references have the same size as an address on the target system.
> -  const DwarfDebug *DD = AP->getDwarfDebug();
> -  assert(DD && "Expected Dwarf Debug info to be available");
> -  if (DD->getDwarfVersion() == 2)
> +  if (AP->getDwarfVersion() == 2)
>      return AP->getPointerSize();
>    return sizeof(int32_t);
>  }
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=287839&r1=287
> 838&r2=287839&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Wed Nov 23 17:30:37
> 2016
> @@ -256,7 +256,7 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Mo
>      UseAllLinkageNames = DwarfLinkageNames == AllLinkageNames;
> 
>    unsigned DwarfVersionNumber = Asm->TM.Options.MCOptions.DwarfVersion;
> -  DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber
> +  unsigned DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber
>                                      : MMI->getModule()-
> >getDwarfVersion();
>    // Use dwarf 4 by default if nothing is requested.
>    DwarfVersion = DwarfVersion ? DwarfVersion : dwarf::DWARF_VERSION;

This all looks funny, now that DwarfDebug is not caching its own notion of the
DWARF version.  At the time this constructor runs, is Asm->getDwarfVersion()
not going to return a consistently useful answer?
--paulr

> @@ -1197,7 +1197,7 @@ void DwarfDebug::recordSourceLine(unsign
>      Fn = Scope->getFilename();
>      Dir = Scope->getDirectory();
>      if (auto *LBF = dyn_cast<DILexicalBlockFile>(Scope))
> -      if (DwarfVersion >= 4)
> +      if (getDwarfVersion() >= 4)
>          Discriminator = LBF->getDiscriminator();
> 
>      unsigned CUID = Asm->OutStreamer-
> >getContext().getDwarfCompileUnitID();
> @@ -1415,8 +1415,7 @@ static void emitDebugLocValue(const AsmP
>                                const DebugLocEntry::Value &Value,
>                                unsigned PieceOffsetInBits) {
>    DIExpressionCursor ExprCursor(Value.getExpression());
> -  DebugLocDwarfExpression DwarfExpr(AP.getDwarfDebug()-
> >getDwarfVersion(),
> -                                    Streamer);
> +  DebugLocDwarfExpression DwarfExpr(AP.getDwarfVersion(), Streamer);
>    // Regular entry.
>    if (Value.isInt()) {
>      if (BT && (BT->getEncoding() == dwarf::DW_ATE_signed ||
> @@ -1467,8 +1466,7 @@ void DebugLocEntry::finalize(const AsmPr
>        assert(Offset <= PieceOffset && "overlapping or duplicate pieces");
>        if (Offset < PieceOffset) {
>          // The DWARF spec seriously mandates pieces with no locations for
> gaps.
> -        DebugLocDwarfExpression Expr(AP.getDwarfDebug()-
> >getDwarfVersion(),
> -                                     Streamer);
> +        DebugLocDwarfExpression Expr(AP.getDwarfVersion(), Streamer);
>          Expr.AddOpPiece(PieceOffset-Offset, 0);
>          Offset += PieceOffset-Offset;
>        }
> @@ -1983,3 +1981,7 @@ void DwarfDebug::addAccelType(StringRef
>      return;
>    AccelTypes.AddName(InfoHolder.getStringPool().getEntry(*Asm, Name),
> &Die);
>  }
> +
> +uint16_t DwarfDebug::getDwarfVersion() const {
> +  return Asm->OutStreamer->getContext().getDwarfVersion();
> +}
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=287839&r1=28783
> 8&r2=287839&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Wed Nov 23 17:30:37
> 2016
> @@ -254,9 +254,6 @@ class DwarfDebug : public DebugHandlerBa
>    /// Whether to emit all linkage names, or just abstract subprograms.
>    bool UseAllLinkageNames;
> 
> -  /// Version of dwarf we're emitting.
> -  unsigned DwarfVersion;
> -
>    /// DWARF5 Experimental Options
>    /// @{
>    bool HasDwarfAccelTables;
> @@ -515,7 +512,7 @@ public:
>    bool useSplitDwarf() const { return HasSplitDwarf; }
> 
>    /// Returns the Dwarf Version.
> -  unsigned getDwarfVersion() const { return DwarfVersion; }
> +  uint16_t getDwarfVersion() const;
> 
>    /// Returns the previous CU that was being updated
>    const DwarfCompileUnit *getPrevCU() const { return PrevCU; }
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=287839&r1=2878
> 38&r2=287839&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Wed Nov 23 17:30:37
> 2016
> @@ -51,7 +51,7 @@ GenerateDwarfTypeUnits("generate-type-un
> 
>  DIEDwarfExpression::DIEDwarfExpression(const AsmPrinter &AP, DwarfUnit
> &DU,
>                                         DIELoc &DIE)
> -    : DwarfExpression(AP.getDwarfDebug()->getDwarfVersion()), AP(AP),
> DU(DU),
> +    : DwarfExpression(AP.getDwarfVersion()), AP(AP), DU(DU),
>        DIE(DIE) {}
> 
>  void DIEDwarfExpression::EmitOp(uint8_t Op, const char* Comment) {
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list