Home | History | Annotate | Download | only in CodeView
      1 //===- DebugInlineeLinesSubsection.h ----------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef LLVM_DEBUGINFO_CODEVIEW_DEBUGINLINEELINESSUBSECTION_H
     11 #define LLVM_DEBUGINFO_CODEVIEW_DEBUGINLINEELINESSUBSECTION_H
     12 
     13 #include "llvm/ADT/StringRef.h"
     14 #include "llvm/DebugInfo/CodeView/CodeView.h"
     15 #include "llvm/DebugInfo/CodeView/DebugSubsection.h"
     16 #include "llvm/DebugInfo/CodeView/Line.h"
     17 #include "llvm/DebugInfo/CodeView/TypeIndex.h"
     18 #include "llvm/Support/BinaryStreamArray.h"
     19 #include "llvm/Support/BinaryStreamReader.h"
     20 #include "llvm/Support/BinaryStreamRef.h"
     21 #include "llvm/Support/Endian.h"
     22 #include "llvm/Support/Error.h"
     23 #include <cstdint>
     24 #include <vector>
     25 
     26 namespace llvm {
     27 
     28 namespace codeview {
     29 
     30 class DebugChecksumsSubsection;
     31 
     32 enum class InlineeLinesSignature : uint32_t {
     33   Normal,    // CV_INLINEE_SOURCE_LINE_SIGNATURE
     34   ExtraFiles // CV_INLINEE_SOURCE_LINE_SIGNATURE_EX
     35 };
     36 
     37 struct InlineeSourceLineHeader {
     38   TypeIndex Inlinee;                  // ID of the function that was inlined.
     39   support::ulittle32_t FileID;        // Offset into FileChecksums subsection.
     40   support::ulittle32_t SourceLineNum; // First line of inlined code.
     41                                       // If extra files present:
     42                                       //   ulittle32_t ExtraFileCount;
     43                                       //   ulittle32_t Files[];
     44 };
     45 
     46 struct InlineeSourceLine {
     47   const InlineeSourceLineHeader *Header;
     48   FixedStreamArray<support::ulittle32_t> ExtraFiles;
     49 };
     50 
     51 } // end namespace codeview
     52 
     53 template <> struct VarStreamArrayExtractor<codeview::InlineeSourceLine> {
     54   Error operator()(BinaryStreamRef Stream, uint32_t &Len,
     55                    codeview::InlineeSourceLine &Item);
     56 
     57   bool HasExtraFiles = false;
     58 };
     59 
     60 namespace codeview {
     61 
     62 class DebugInlineeLinesSubsectionRef final : public DebugSubsectionRef {
     63   using LinesArray = VarStreamArray<InlineeSourceLine>;
     64   using Iterator = LinesArray::Iterator;
     65 
     66 public:
     67   DebugInlineeLinesSubsectionRef();
     68 
     69   static bool classof(const DebugSubsectionRef *S) {
     70     return S->kind() == DebugSubsectionKind::InlineeLines;
     71   }
     72 
     73   Error initialize(BinaryStreamReader Reader);
     74   bool hasExtraFiles() const;
     75 
     76   Iterator begin() const { return Lines.begin(); }
     77   Iterator end() const { return Lines.end(); }
     78 
     79 private:
     80   InlineeLinesSignature Signature;
     81   VarStreamArray<InlineeSourceLine> Lines;
     82 };
     83 
     84 class DebugInlineeLinesSubsection final : public DebugSubsection {
     85 public:
     86   struct Entry {
     87     std::vector<support::ulittle32_t> ExtraFiles;
     88     InlineeSourceLineHeader Header;
     89   };
     90 
     91   DebugInlineeLinesSubsection(DebugChecksumsSubsection &Checksums,
     92                               bool HasExtraFiles = false);
     93 
     94   static bool classof(const DebugSubsection *S) {
     95     return S->kind() == DebugSubsectionKind::InlineeLines;
     96   }
     97 
     98   Error commit(BinaryStreamWriter &Writer) const override;
     99   uint32_t calculateSerializedSize() const override;
    100 
    101   void addInlineSite(TypeIndex FuncId, StringRef FileName, uint32_t SourceLine);
    102   void addExtraFile(StringRef FileName);
    103 
    104   bool hasExtraFiles() const { return HasExtraFiles; }
    105   void setHasExtraFiles(bool Has) { HasExtraFiles = Has; }
    106 
    107   std::vector<Entry>::const_iterator begin() const { return Entries.begin(); }
    108   std::vector<Entry>::const_iterator end() const { return Entries.end(); }
    109 
    110 private:
    111   DebugChecksumsSubsection &Checksums;
    112   bool HasExtraFiles = false;
    113   uint32_t ExtraFileCount = 0;
    114   std::vector<Entry> Entries;
    115 };
    116 
    117 } // end namespace codeview
    118 
    119 } // end namespace llvm
    120 
    121 #endif // LLVM_DEBUGINFO_CODEVIEW_DEBUGINLINEELINESSUBSECTION_H
    122