Commit 8f3d47c5 authored by Igor Kudrin's avatar Igor Kudrin
Browse files

[DWARF] Do not pass Version to DWARFExpression. NFCI.

The Version was used only to determine the size of an operand of
DW_OP_call_ref. The size was 4 for all versions apart from 2, but
the DW_OP_call_ref operation was introduced only in DWARF3. Thus,
the code may be simplified and using of Version may be eliminated.

Differential Revision: https://reviews.llvm.org/D73264
parent 548553ea
Loading
Loading
Loading
Loading
+5 −7
Original line number Diff line number Diff line
@@ -87,8 +87,7 @@ public:
    uint64_t getRawOperand(unsigned Idx) { return Operands[Idx]; }
    uint64_t getOperandEndOffset(unsigned Idx) { return OperandEndOffsets[Idx]; }
    uint64_t getEndOffset() { return EndOffset; }
    bool extract(DataExtractor Data, uint16_t Version, uint8_t AddressSize,
                 uint64_t Offset);
    bool extract(DataExtractor Data, uint8_t AddressSize, uint64_t Offset);
    bool isError() { return Error; }
    bool print(raw_ostream &OS, const DWARFExpression *Expr,
               const MCRegisterInfo *RegInfo, DWARFUnit *U, bool isEH);
@@ -107,7 +106,7 @@ public:
        : Expr(Expr), Offset(Offset) {
      Op.Error =
          Offset >= Expr->Data.getData().size() ||
          !Op.extract(Expr->Data, Expr->Version, Expr->AddressSize, Offset);
          !Op.extract(Expr->Data, Expr->AddressSize, Offset);
    }

  public:
@@ -115,7 +114,7 @@ public:
      Offset = Op.isError() ? Expr->Data.getData().size() : Op.EndOffset;
      Op.Error =
          Offset >= Expr->Data.getData().size() ||
          !Op.extract(Expr->Data, Expr->Version, Expr->AddressSize, Offset);
          !Op.extract(Expr->Data, Expr->AddressSize, Offset);
      return Op;
    }

@@ -127,8 +126,8 @@ public:
    friend bool operator==(const iterator &, const iterator &);
  };

  DWARFExpression(DataExtractor Data, uint16_t Version, uint8_t AddressSize)
      : Data(Data), Version(Version), AddressSize(AddressSize) {
  DWARFExpression(DataExtractor Data, uint8_t AddressSize)
      : Data(Data), AddressSize(AddressSize) {
    assert(AddressSize == 8 || AddressSize == 4 || AddressSize == 2);
  }

@@ -142,7 +141,6 @@ public:

private:
  DataExtractor Data;
  uint16_t Version;
  uint8_t AddressSize;
};

+1 −1
Original line number Diff line number Diff line
@@ -2210,7 +2210,7 @@ void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer,
  DWARFDataExtractor Data(StringRef(DebugLocs.getBytes(Entry).data(),
                                    DebugLocs.getBytes(Entry).size()),
                          Asm->getDataLayout().isLittleEndian(), PtrSize);
  DWARFExpression Expr(Data, getDwarfVersion(), PtrSize);
  DWARFExpression Expr(Data, PtrSize);

  using Encoding = DWARFExpression::Operation::Encoding;
  uint64_t Offset = 0;
+2 −4
Original line number Diff line number Diff line
@@ -953,8 +953,7 @@ unsigned DWARFLinker::DIECloner::cloneBlockAttribute(
    DWARFUnit &OrigUnit = Unit.getOrigUnit();
    DataExtractor Data(StringRef((const char *)Bytes.data(), Bytes.size()),
                       IsLittleEndian, OrigUnit.getAddressByteSize());
    DWARFExpression Expr(Data, OrigUnit.getVersion(),
                         OrigUnit.getAddressByteSize());
    DWARFExpression Expr(Data, OrigUnit.getAddressByteSize());
    cloneExpression(Data, Expr, OF, Unit, Buffer);
    Bytes = Buffer;
  }
@@ -2059,8 +2058,7 @@ void DWARFLinker::DIECloner::cloneAllCompileUnits(DWARFContext &DwarfContext,
        DataExtractor Data(Bytes, IsLittleEndian,
                           OrigUnit.getAddressByteSize());
        cloneExpression(Data,
                        DWARFExpression(Data, OrigUnit.getVersion(),
                                        OrigUnit.getAddressByteSize()),
                        DWARFExpression(Data, OrigUnit.getAddressByteSize()),
                        OF, *CurrentUnit, Buffer);
      };
      Emitter->emitLocationsForUnit(*CurrentUnit, DwarfContext, ProcessExpr);
+4 −4
Original line number Diff line number Diff line
@@ -130,8 +130,8 @@ Error CFIProgram::parse(DWARFDataExtractor Data, uint64_t *Offset,
          DataExtractor Extractor(
              Data.getData().slice(*Offset, *Offset + ExprLength),
              Data.isLittleEndian(), Data.getAddressSize());
          Instructions.back().Expression = DWARFExpression(
              Extractor, Data.getAddressSize(), dwarf::DWARF_VERSION);
          Instructions.back().Expression =
              DWARFExpression(Extractor, Data.getAddressSize());
          *Offset += ExprLength;
          break;
        }
@@ -143,8 +143,8 @@ Error CFIProgram::parse(DWARFDataExtractor Data, uint64_t *Offset,
          DataExtractor Extractor(
              Data.getData().slice(*Offset, *Offset + BlockLength),
              Data.isLittleEndian(), Data.getAddressSize());
          Instructions.back().Expression = DWARFExpression(
              Extractor, Data.getAddressSize(), dwarf::DWARF_VERSION);
          Instructions.back().Expression =
              DWARFExpression(Extractor, Data.getAddressSize());
          *Offset += BlockLength;
          break;
        }
+1 −6
Original line number Diff line number Diff line
@@ -106,16 +106,11 @@ DWARFLocationInterpreter::Interpret(const DWARFLocationEntry &E) {
  }
}

// When directly dumping the .debug_loc without a compile unit, we have to guess
// at the DWARF version. This only affects DW_OP_call_ref, which is a rare
// expression that LLVM doesn't produce. Guessing the wrong version means we
// won't be able to pretty print expressions in DWARF2 binaries produced by
// non-LLVM tools.
static void dumpExpression(raw_ostream &OS, ArrayRef<uint8_t> Data,
                           bool IsLittleEndian, unsigned AddressSize,
                           const MCRegisterInfo *MRI, DWARFUnit *U) {
  DWARFDataExtractor Extractor(toStringRef(Data), IsLittleEndian, AddressSize);
  DWARFExpression(Extractor, dwarf::DWARF_VERSION, AddressSize).print(OS, MRI, U);
  DWARFExpression(Extractor, AddressSize).print(OS, MRI, U);
}

bool DWARFLocationTable::dumpLocationList(uint64_t *Offset, raw_ostream &OS,
Loading