diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2016-07-23 20:41:05 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2016-07-23 20:41:05 +0000 | 
| commit | 01095a5d43bbfde13731688ddcf6048ebb8b7721 (patch) | |
| tree | 4def12e759965de927d963ac65840d663ef9d1ea /include/llvm/MC/MCFragment.h | |
| parent | f0f4822ed4b66e3579e92a89f368f8fb860e218e (diff) | |
Diffstat (limited to 'include/llvm/MC/MCFragment.h')
| -rw-r--r-- | include/llvm/MC/MCFragment.h | 107 | 
1 files changed, 83 insertions, 24 deletions
| diff --git a/include/llvm/MC/MCFragment.h b/include/llvm/MC/MCFragment.h index 7d6db525ce614..e0a2bfc237476 100644 --- a/include/llvm/MC/MCFragment.h +++ b/include/llvm/MC/MCFragment.h @@ -40,6 +40,8 @@ public:      FT_DwarfFrame,      FT_LEB,      FT_SafeSEH, +    FT_CVInlineLines, +    FT_CVDefRange,      FT_Dummy    }; @@ -210,7 +212,8 @@ public:    static bool classof(const MCFragment *F) {      MCFragment::FragmentType Kind = F->getKind(); -    return Kind == MCFragment::FT_Relaxable || Kind == MCFragment::FT_Data; +    return Kind == MCFragment::FT_Relaxable || Kind == MCFragment::FT_Data || +           Kind == MCFragment::FT_CVDefRange;    }  }; @@ -321,36 +324,19 @@ public:  class MCFillFragment : public MCFragment { -  /// Value - Value to use for filling bytes. -  int64_t Value; - -  /// ValueSize - The size (in bytes) of \p Value to use when filling, or 0 if -  /// this is a virtual fill fragment. -  unsigned ValueSize; +  /// Value to use for filling bytes. +  uint8_t Value; -  /// Size - The number of bytes to insert. +  /// The number of bytes to insert.    uint64_t Size;  public: -  MCFillFragment(int64_t Value, unsigned ValueSize, uint64_t Size, -                 MCSection *Sec = nullptr) -      : MCFragment(FT_Fill, false, 0, Sec), Value(Value), ValueSize(ValueSize), -        Size(Size) { -    assert((!ValueSize || (Size % ValueSize) == 0) && -           "Fill size must be a multiple of the value size!"); -  } - -  /// \name Accessors -  /// @{ - -  int64_t getValue() const { return Value; } - -  unsigned getValueSize() const { return ValueSize; } +  MCFillFragment(uint8_t Value, uint64_t Size, MCSection *Sec = nullptr) +      : MCFragment(FT_Fill, false, 0, Sec), Value(Value), Size(Size) {} +  uint8_t getValue() const { return Value; }    uint64_t getSize() const { return Size; } -  /// @} -    static bool classof(const MCFragment *F) {      return F->getKind() == MCFragment::FT_Fill;    } @@ -501,6 +487,79 @@ public:    }  }; +/// Fragment representing the binary annotations produced by the +/// .cv_inline_linetable directive. +class MCCVInlineLineTableFragment : public MCFragment { +  unsigned SiteFuncId; +  unsigned StartFileId; +  unsigned StartLineNum; +  const MCSymbol *FnStartSym; +  const MCSymbol *FnEndSym; +  SmallVector<unsigned, 3> SecondaryFuncs; +  SmallString<8> Contents; + +  /// CodeViewContext has the real knowledge about this format, so let it access +  /// our members. +  friend class CodeViewContext; + +public: +  MCCVInlineLineTableFragment(unsigned SiteFuncId, unsigned StartFileId, +                              unsigned StartLineNum, const MCSymbol *FnStartSym, +                              const MCSymbol *FnEndSym, +                              ArrayRef<unsigned> SecondaryFuncs, +                              MCSection *Sec = nullptr) +      : MCFragment(FT_CVInlineLines, false, 0, Sec), SiteFuncId(SiteFuncId), +        StartFileId(StartFileId), StartLineNum(StartLineNum), +        FnStartSym(FnStartSym), FnEndSym(FnEndSym), +        SecondaryFuncs(SecondaryFuncs.begin(), SecondaryFuncs.end()) {} + +  /// \name Accessors +  /// @{ + +  const MCSymbol *getFnStartSym() const { return FnStartSym; } +  const MCSymbol *getFnEndSym() const { return FnEndSym; } + +  SmallString<8> &getContents() { return Contents; } +  const SmallString<8> &getContents() const { return Contents; } + +  /// @} + +  static bool classof(const MCFragment *F) { +    return F->getKind() == MCFragment::FT_CVInlineLines; +  } +}; + +/// Fragment representing the .cv_def_range directive. +class MCCVDefRangeFragment : public MCEncodedFragmentWithFixups<32, 4> { +  SmallVector<std::pair<const MCSymbol *, const MCSymbol *>, 2> Ranges; +  SmallString<32> FixedSizePortion; + +  /// CodeViewContext has the real knowledge about this format, so let it access +  /// our members. +  friend class CodeViewContext; + +public: +  MCCVDefRangeFragment( +      ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges, +      StringRef FixedSizePortion, MCSection *Sec = nullptr) +      : MCEncodedFragmentWithFixups<32, 4>(FT_CVDefRange, false, Sec), +        Ranges(Ranges.begin(), Ranges.end()), +        FixedSizePortion(FixedSizePortion) {} + +  /// \name Accessors +  /// @{ +  ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> getRanges() const { +    return Ranges; +  } + +  StringRef getFixedSizePortion() const { return FixedSizePortion; } +  /// @} + +  static bool classof(const MCFragment *F) { +    return F->getKind() == MCFragment::FT_CVDefRange; +  } +}; +  } // end namespace llvm  #endif | 
