LCOV - code coverage report
Current view: top level - /usr/lib/llvm-19/include/llvm/IR - DebugProgramInstruction.h (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 0.0 % 4 0
Test Date: 2026-02-27 05:14:50 Functions: 0.0 % 3 0
Legend: Lines:     hit not hit

            Line data    Source code
       1              : //===-- llvm/DebugProgramInstruction.h - Stream of debug info ---*- C++ -*-===//
       2              : //
       3              : // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
       4              : // See https://llvm.org/LICENSE.txt for license information.
       5              : // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
       6              : //
       7              : //===----------------------------------------------------------------------===//
       8              : //
       9              : // Data structures for storing variable assignment information in LLVM. In the
      10              : // dbg.value design, a dbg.value intrinsic specifies the position in a block
      11              : // a source variable take on an LLVM Value:
      12              : //
      13              : //    %foo = add i32 1, %0
      14              : //    dbg.value(metadata i32 %foo, ...)
      15              : //    %bar = void call @ext(%foo);
      16              : //
      17              : // and all information is stored in the Value / Metadata hierachy defined
      18              : // elsewhere in LLVM. In the "DbgRecord" design, each instruction /may/ have a
      19              : // connection with a DbgMarker, which identifies a position immediately before
      20              : // the instruction, and each DbgMarker /may/ then have connections to DbgRecords
      21              : // which record the variable assignment information. To illustrate:
      22              : //
      23              : //    %foo = add i32 1, %0
      24              : //       ; foo->DebugMarker == nullptr
      25              : //       ;; There are no variable assignments / debug records "in front" of
      26              : //       ;; the instruction for %foo, therefore it has no DebugMarker.
      27              : //    %bar = void call @ext(%foo)
      28              : //       ; bar->DebugMarker = {
      29              : //       ;   StoredDbgRecords = {
      30              : //       ;     DbgVariableRecord(metadata i32 %foo, ...)
      31              : //       ;   }
      32              : //       ; }
      33              : //       ;; There is a debug-info record in front of the %bar instruction,
      34              : //       ;; thus it points at a DbgMarker object. That DbgMarker contains a
      35              : //       ;; DbgVariableRecord in its ilist, storing the equivalent information
      36              : //       ;; to the dbg.value above: the Value, DILocalVariable, etc.
      37              : //
      38              : // This structure separates the two concerns of the position of the debug-info
      39              : // in the function, and the Value that it refers to. It also creates a new
      40              : // "place" in-between the Value / Metadata hierachy where we can customise
      41              : // storage and allocation techniques to better suite debug-info workloads.
      42              : // NB: as of the initial prototype, none of that has actually been attempted
      43              : // yet.
      44              : //
      45              : //===----------------------------------------------------------------------===//
      46              : 
      47              : #ifndef LLVM_IR_DEBUGPROGRAMINSTRUCTION_H
      48              : #define LLVM_IR_DEBUGPROGRAMINSTRUCTION_H
      49              : 
      50              : #include "llvm/ADT/ilist.h"
      51              : #include "llvm/ADT/ilist_node.h"
      52              : #include "llvm/ADT/iterator.h"
      53              : #include "llvm/IR/DbgVariableFragmentInfo.h"
      54              : #include "llvm/IR/DebugLoc.h"
      55              : #include "llvm/IR/Instruction.h"
      56              : #include "llvm/IR/SymbolTableListTraits.h"
      57              : #include "llvm/Support/Casting.h"
      58              : 
      59              : namespace llvm {
      60              : 
      61              : class Instruction;
      62              : class BasicBlock;
      63              : class MDNode;
      64              : class Module;
      65              : class DbgVariableIntrinsic;
      66              : class DbgInfoIntrinsic;
      67              : class DbgLabelInst;
      68              : class DIAssignID;
      69              : class DbgMarker;
      70              : class DbgVariableRecord;
      71              : class raw_ostream;
      72              : 
      73              : /// A typed tracking MDNode reference that does not require a definition for its
      74              : /// parameter type. Necessary to avoid including DebugInfoMetadata.h, which has
      75              : /// a significant impact on compile times if included in this file.
      76              : template <typename T> class DbgRecordParamRef {
      77              :   TrackingMDNodeRef Ref;
      78              : 
      79              : public:
      80              : public:
      81              :   DbgRecordParamRef() = default;
      82              : 
      83              :   /// Construct from the templated type.
      84              :   DbgRecordParamRef(const T *Param);
      85              : 
      86              :   /// Construct from an \a MDNode.
      87              :   ///
      88              :   /// Note: if \c Param does not have the template type, a verifier check will
      89              :   /// fail, and accessors will crash.  However, construction from other nodes
      90              :   /// is supported in order to handle forward references when reading textual
      91              :   /// IR.
      92              :   explicit DbgRecordParamRef(const MDNode *Param);
      93              : 
      94              :   /// Get the underlying type.
      95              :   ///
      96              :   /// \pre !*this or \c isa<T>(getAsMDNode()).
      97              :   /// @{
      98              :   T *get() const;
      99              :   operator T *() const { return get(); }
     100              :   T *operator->() const { return get(); }
     101              :   T &operator*() const { return *get(); }
     102              :   /// @}
     103              : 
     104              :   /// Check for null.
     105              :   ///
     106              :   /// Check for null in a way that is safe with broken debug info.
     107              :   explicit operator bool() const { return Ref; }
     108              : 
     109              :   /// Return \c this as a \a MDNode.
     110              :   MDNode *getAsMDNode() const { return Ref; }
     111              : 
     112              :   bool operator==(const DbgRecordParamRef &Other) const {
     113              :     return Ref == Other.Ref;
     114              :   }
     115              :   bool operator!=(const DbgRecordParamRef &Other) const {
     116              :     return Ref != Other.Ref;
     117              :   }
     118              : };
     119              : 
     120              : /// Base class for non-instruction debug metadata records that have positions
     121              : /// within IR. Features various methods copied across from the Instruction
     122              : /// class to aid ease-of-use. DbgRecords should always be linked into a
     123              : /// DbgMarker's StoredDbgRecords list. The marker connects a DbgRecord back to
     124              : /// its position in the BasicBlock.
     125              : ///
     126              : /// We need a discriminator for dyn/isa casts. In order to avoid paying for a
     127              : /// vtable for "virtual" functions too, subclasses must add a new discriminator
     128              : /// value (RecordKind) and cases to a few functions in the base class:
     129              : ///   deleteRecord
     130              : ///   clone
     131              : ///   isIdenticalToWhenDefined
     132              : ///   both print methods
     133              : ///   createDebugIntrinsic
     134              : class DbgRecord : public ilist_node<DbgRecord> {
     135              : public:
     136              :   /// Marker that this DbgRecord is linked into.
     137              :   DbgMarker *Marker = nullptr;
     138              :   /// Subclass discriminator.
     139              :   enum Kind : uint8_t { ValueKind, LabelKind };
     140              : 
     141              : protected:
     142              :   DebugLoc DbgLoc;
     143              :   Kind RecordKind; ///< Subclass discriminator.
     144              : 
     145              : public:
     146              :   DbgRecord(Kind RecordKind, DebugLoc DL)
     147              :       : DbgLoc(DL), RecordKind(RecordKind) {}
     148              : 
     149              :   /// Methods that dispatch to subclass implementations. These need to be
     150              :   /// manually updated when a new subclass is added.
     151              :   ///@{
     152              :   void deleteRecord();
     153              :   DbgRecord *clone() const;
     154              :   void print(raw_ostream &O, bool IsForDebug = false) const;
     155              :   void print(raw_ostream &O, ModuleSlotTracker &MST, bool IsForDebug) const;
     156              :   bool isIdenticalToWhenDefined(const DbgRecord &R) const;
     157              :   /// Convert this DbgRecord back into an appropriate llvm.dbg.* intrinsic.
     158              :   /// \p InsertBefore Optional position to insert this intrinsic.
     159              :   /// \returns A new llvm.dbg.* intrinsic representiung this DbgRecord.
     160              :   DbgInfoIntrinsic *createDebugIntrinsic(Module *M,
     161              :                                          Instruction *InsertBefore) const;
     162              :   ///@}
     163              : 
     164              :   /// Same as isIdenticalToWhenDefined but checks DebugLoc too.
     165              :   bool isEquivalentTo(const DbgRecord &R) const;
     166              : 
     167            0 :   Kind getRecordKind() const { return RecordKind; }
     168              : 
     169              :   void setMarker(DbgMarker *M) { Marker = M; }
     170              : 
     171              :   DbgMarker *getMarker() { return Marker; }
     172              :   const DbgMarker *getMarker() const { return Marker; }
     173              : 
     174              :   BasicBlock *getBlock();
     175              :   const BasicBlock *getBlock() const;
     176              : 
     177              :   Function *getFunction();
     178              :   const Function *getFunction() const;
     179              : 
     180              :   Module *getModule();
     181              :   const Module *getModule() const;
     182              : 
     183              :   LLVMContext &getContext();
     184              :   const LLVMContext &getContext() const;
     185              : 
     186              :   const Instruction *getInstruction() const;
     187              :   const BasicBlock *getParent() const;
     188              :   BasicBlock *getParent();
     189              : 
     190              :   void removeFromParent();
     191              :   void eraseFromParent();
     192              : 
     193              :   DbgRecord *getNextNode() { return &*std::next(getIterator()); }
     194              :   DbgRecord *getPrevNode() { return &*std::prev(getIterator()); }
     195              :   void insertBefore(DbgRecord *InsertBefore);
     196              :   void insertAfter(DbgRecord *InsertAfter);
     197              :   void moveBefore(DbgRecord *MoveBefore);
     198              :   void moveAfter(DbgRecord *MoveAfter);
     199              : 
     200              :   DebugLoc getDebugLoc() const { return DbgLoc; }
     201              :   void setDebugLoc(DebugLoc Loc) { DbgLoc = std::move(Loc); }
     202              : 
     203              :   void dump() const;
     204              : 
     205              :   using self_iterator = simple_ilist<DbgRecord>::iterator;
     206              :   using const_self_iterator = simple_ilist<DbgRecord>::const_iterator;
     207              : 
     208              : protected:
     209              :   /// Similarly to Value, we avoid paying the cost of a vtable
     210              :   /// by protecting the dtor and having deleteRecord dispatch
     211              :   /// cleanup.
     212              :   /// Use deleteRecord to delete a generic record.
     213              :   ~DbgRecord() = default;
     214              : };
     215              : 
     216              : inline raw_ostream &operator<<(raw_ostream &OS, const DbgRecord &R) {
     217              :   R.print(OS);
     218              :   return OS;
     219              : }
     220              : 
     221              : /// Records a position in IR for a source label (DILabel). Corresponds to the
     222              : /// llvm.dbg.label intrinsic.
     223              : class DbgLabelRecord : public DbgRecord {
     224              :   DbgRecordParamRef<DILabel> Label;
     225              : 
     226              :   /// This constructor intentionally left private, so that it is only called via
     227              :   /// "createUnresolvedDbgLabelRecord", which clearly expresses that it is for
     228              :   /// parsing only.
     229              :   DbgLabelRecord(MDNode *Label, MDNode *DL);
     230              : 
     231              : public:
     232              :   DbgLabelRecord(DILabel *Label, DebugLoc DL);
     233              : 
     234              :   /// For use during parsing; creates a DbgLabelRecord from as-of-yet unresolved
     235              :   /// MDNodes. Trying to access the resulting DbgLabelRecord's fields before
     236              :   /// they are resolved, or if they resolve to the wrong type, will result in a
     237              :   /// crash.
     238              :   static DbgLabelRecord *createUnresolvedDbgLabelRecord(MDNode *Label,
     239              :                                                         MDNode *DL);
     240              : 
     241              :   DbgLabelRecord *clone() const;
     242              :   void print(raw_ostream &O, bool IsForDebug = false) const;
     243              :   void print(raw_ostream &ROS, ModuleSlotTracker &MST, bool IsForDebug) const;
     244              :   DbgLabelInst *createDebugIntrinsic(Module *M,
     245              :                                      Instruction *InsertBefore) const;
     246              : 
     247              :   void setLabel(DILabel *NewLabel) { Label = NewLabel; }
     248              :   DILabel *getLabel() const { return Label.get(); }
     249              :   MDNode *getRawLabel() const { return Label.getAsMDNode(); };
     250              : 
     251              :   /// Support type inquiry through isa, cast, and dyn_cast.
     252              :   static bool classof(const DbgRecord *E) {
     253              :     return E->getRecordKind() == LabelKind;
     254              :   }
     255              : };
     256              : 
     257              : /// Record of a variable value-assignment, aka a non instruction representation
     258              : /// of the dbg.value intrinsic.
     259              : ///
     260              : /// This class inherits from DebugValueUser to allow LLVM's metadata facilities
     261              : /// to update our references to metadata beneath our feet.
     262              : class DbgVariableRecord : public DbgRecord, protected DebugValueUser {
     263              :   friend class DebugValueUser;
     264              : 
     265              : public:
     266              :   enum class LocationType : uint8_t {
     267              :     Declare,
     268              :     Value,
     269              :     Assign,
     270              : 
     271              :     End, ///< Marks the end of the concrete types.
     272              :     Any, ///< To indicate all LocationTypes in searches.
     273              :   };
     274              :   /// Classification of the debug-info record that this DbgVariableRecord
     275              :   /// represents. Essentially, "does this correspond to a dbg.value,
     276              :   /// dbg.declare, or dbg.assign?".
     277              :   /// FIXME: We could use spare padding bits from DbgRecord for this.
     278              :   LocationType Type;
     279              : 
     280              :   // NB: there is no explicit "Value" field in this class, it's effectively the
     281              :   // DebugValueUser superclass instead. The referred to Value can either be a
     282              :   // ValueAsMetadata or a DIArgList.
     283              : 
     284              :   DbgRecordParamRef<DILocalVariable> Variable;
     285              :   DbgRecordParamRef<DIExpression> Expression;
     286              :   DbgRecordParamRef<DIExpression> AddressExpression;
     287              : 
     288              : public:
     289              :   /// Create a new DbgVariableRecord representing the intrinsic \p DVI, for
     290              :   /// example the assignment represented by a dbg.value.
     291              :   DbgVariableRecord(const DbgVariableIntrinsic *DVI);
     292              :   DbgVariableRecord(const DbgVariableRecord &DVR);
     293              :   /// Directly construct a new DbgVariableRecord representing a dbg.value
     294              :   /// intrinsic assigning \p Location to the DV / Expr / DI variable.
     295              :   DbgVariableRecord(Metadata *Location, DILocalVariable *DV, DIExpression *Expr,
     296              :                     const DILocation *DI,
     297              :                     LocationType Type = LocationType::Value);
     298              :   DbgVariableRecord(Metadata *Value, DILocalVariable *Variable,
     299              :                     DIExpression *Expression, DIAssignID *AssignID,
     300              :                     Metadata *Address, DIExpression *AddressExpression,
     301              :                     const DILocation *DI);
     302              : 
     303              : private:
     304              :   /// Private constructor for creating new instances during parsing only. Only
     305              :   /// called through `createUnresolvedDbgVariableRecord` below, which makes
     306              :   /// clear that this is used for parsing only, and will later return a subclass
     307              :   /// depending on which Type is passed.
     308              :   DbgVariableRecord(LocationType Type, Metadata *Val, MDNode *Variable,
     309              :                     MDNode *Expression, MDNode *AssignID, Metadata *Address,
     310              :                     MDNode *AddressExpression, MDNode *DI);
     311              : 
     312              : public:
     313              :   /// Used to create DbgVariableRecords during parsing, where some metadata
     314              :   /// references may still be unresolved. Although for some fields a generic
     315              :   /// `Metadata*` argument is accepted for forward type-references, the verifier
     316              :   /// and accessors will reject incorrect types later on. The function is used
     317              :   /// for all types of DbgVariableRecords for simplicity while parsing, but
     318              :   /// asserts if any necessary fields are empty or unused fields are not empty,
     319              :   /// i.e. if the #dbg_assign fields are used for a non-dbg-assign type.
     320              :   static DbgVariableRecord *
     321              :   createUnresolvedDbgVariableRecord(LocationType Type, Metadata *Val,
     322              :                                     MDNode *Variable, MDNode *Expression,
     323              :                                     MDNode *AssignID, Metadata *Address,
     324              :                                     MDNode *AddressExpression, MDNode *DI);
     325              : 
     326              :   static DbgVariableRecord *
     327              :   createDVRAssign(Value *Val, DILocalVariable *Variable,
     328              :                   DIExpression *Expression, DIAssignID *AssignID,
     329              :                   Value *Address, DIExpression *AddressExpression,
     330              :                   const DILocation *DI);
     331              :   static DbgVariableRecord *
     332              :   createLinkedDVRAssign(Instruction *LinkedInstr, Value *Val,
     333              :                         DILocalVariable *Variable, DIExpression *Expression,
     334              :                         Value *Address, DIExpression *AddressExpression,
     335              :                         const DILocation *DI);
     336              : 
     337              :   static DbgVariableRecord *createDbgVariableRecord(Value *Location,
     338              :                                                     DILocalVariable *DV,
     339              :                                                     DIExpression *Expr,
     340              :                                                     const DILocation *DI);
     341              :   static DbgVariableRecord *
     342              :   createDbgVariableRecord(Value *Location, DILocalVariable *DV,
     343              :                           DIExpression *Expr, const DILocation *DI,
     344              :                           DbgVariableRecord &InsertBefore);
     345              :   static DbgVariableRecord *createDVRDeclare(Value *Address,
     346              :                                              DILocalVariable *DV,
     347              :                                              DIExpression *Expr,
     348              :                                              const DILocation *DI);
     349              :   static DbgVariableRecord *
     350              :   createDVRDeclare(Value *Address, DILocalVariable *DV, DIExpression *Expr,
     351              :                    const DILocation *DI, DbgVariableRecord &InsertBefore);
     352              : 
     353              :   /// Iterator for ValueAsMetadata that internally uses direct pointer iteration
     354              :   /// over either a ValueAsMetadata* or a ValueAsMetadata**, dereferencing to the
     355              :   /// ValueAsMetadata .
     356              :   class location_op_iterator
     357              :       : public iterator_facade_base<location_op_iterator,
     358              :                                     std::bidirectional_iterator_tag, Value *> {
     359              :     PointerUnion<ValueAsMetadata *, ValueAsMetadata **> I;
     360              : 
     361              :   public:
     362              :     location_op_iterator(ValueAsMetadata *SingleIter) : I(SingleIter) {}
     363              :     location_op_iterator(ValueAsMetadata **MultiIter) : I(MultiIter) {}
     364              : 
     365              :     location_op_iterator(const location_op_iterator &R) : I(R.I) {}
     366              :     location_op_iterator &operator=(const location_op_iterator &R) {
     367              :       I = R.I;
     368              :       return *this;
     369              :     }
     370              :     bool operator==(const location_op_iterator &RHS) const {
     371              :       return I == RHS.I;
     372              :     }
     373              :     const Value *operator*() const {
     374              :       ValueAsMetadata *VAM = I.is<ValueAsMetadata *>()
     375              :                                  ? I.get<ValueAsMetadata *>()
     376              :                                  : *I.get<ValueAsMetadata **>();
     377              :       return VAM->getValue();
     378              :     };
     379              :     Value *operator*() {
     380              :       ValueAsMetadata *VAM = I.is<ValueAsMetadata *>()
     381              :                                  ? I.get<ValueAsMetadata *>()
     382              :                                  : *I.get<ValueAsMetadata **>();
     383              :       return VAM->getValue();
     384              :     }
     385              :     location_op_iterator &operator++() {
     386              :       if (I.is<ValueAsMetadata *>())
     387              :         I = I.get<ValueAsMetadata *>() + 1;
     388              :       else
     389              :         I = I.get<ValueAsMetadata **>() + 1;
     390              :       return *this;
     391              :     }
     392              :     location_op_iterator &operator--() {
     393              :       if (I.is<ValueAsMetadata *>())
     394              :         I = I.get<ValueAsMetadata *>() - 1;
     395              :       else
     396              :         I = I.get<ValueAsMetadata **>() - 1;
     397              :       return *this;
     398              :     }
     399              :   };
     400              : 
     401              :   bool isDbgDeclare() { return Type == LocationType::Declare; }
     402              :   bool isDbgValue() { return Type == LocationType::Value; }
     403              : 
     404              :   /// Get the locations corresponding to the variable referenced by the debug
     405              :   /// info intrinsic.  Depending on the intrinsic, this could be the
     406              :   /// variable's value or its address.
     407              :   iterator_range<location_op_iterator> location_ops() const;
     408              : 
     409              :   Value *getVariableLocationOp(unsigned OpIdx) const;
     410              : 
     411              :   void replaceVariableLocationOp(Value *OldValue, Value *NewValue,
     412              :                                  bool AllowEmpty = false);
     413              :   void replaceVariableLocationOp(unsigned OpIdx, Value *NewValue);
     414              :   /// Adding a new location operand will always result in this intrinsic using
     415              :   /// an ArgList, and must always be accompanied by a new expression that uses
     416              :   /// the new operand.
     417              :   void addVariableLocationOps(ArrayRef<Value *> NewValues,
     418              :                               DIExpression *NewExpr);
     419              : 
     420              :   unsigned getNumVariableLocationOps() const;
     421              : 
     422              :   bool hasArgList() const { return isa<DIArgList>(getRawLocation()); }
     423              :   /// Returns true if this DbgVariableRecord has no empty MDNodes in its
     424              :   /// location list.
     425              :   bool hasValidLocation() const { return getVariableLocationOp(0) != nullptr; }
     426              : 
     427              :   /// Does this describe the address of a local variable. True for dbg.addr
     428              :   /// and dbg.declare, but not dbg.value, which describes its value.
     429              :   bool isAddressOfVariable() const { return Type == LocationType::Declare; }
     430              :   LocationType getType() const { return Type; }
     431              : 
     432              :   void setKillLocation();
     433              :   bool isKillLocation() const;
     434              : 
     435              :   void setVariable(DILocalVariable *NewVar) { Variable = NewVar; }
     436              :   DILocalVariable *getVariable() const { return Variable.get(); };
     437              :   MDNode *getRawVariable() const { return Variable.getAsMDNode(); }
     438              : 
     439              :   void setExpression(DIExpression *NewExpr) { Expression = NewExpr; }
     440              :   DIExpression *getExpression() const { return Expression.get(); }
     441              :   MDNode *getRawExpression() const { return Expression.getAsMDNode(); }
     442              : 
     443              :   /// Returns the metadata operand for the first location description. i.e.,
     444              :   /// dbg intrinsic dbg.value,declare operand and dbg.assign 1st location
     445              :   /// operand (the "value componenet"). Note the operand (singular) may be
     446              :   /// a DIArgList which is a list of values.
     447              :   Metadata *getRawLocation() const { return DebugValues[0]; }
     448              : 
     449              :   Value *getValue(unsigned OpIdx = 0) const {
     450              :     return getVariableLocationOp(OpIdx);
     451              :   }
     452              : 
     453              :   /// Use of this should generally be avoided; instead,
     454              :   /// replaceVariableLocationOp and addVariableLocationOps should be used where
     455              :   /// possible to avoid creating invalid state.
     456              :   void setRawLocation(Metadata *NewLocation) {
     457              :     assert((isa<ValueAsMetadata>(NewLocation) || isa<DIArgList>(NewLocation) ||
     458              :             isa<MDNode>(NewLocation)) &&
     459              :            "Location for a DbgVariableRecord must be either ValueAsMetadata or "
     460              :            "DIArgList");
     461              :     resetDebugValue(0, NewLocation);
     462              :   }
     463              : 
     464              :   std::optional<DbgVariableFragmentInfo> getFragment() const;
     465              :   /// Get the FragmentInfo for the variable if it exists, otherwise return a
     466              :   /// FragmentInfo that covers the entire variable if the variable size is
     467              :   /// known, otherwise return a zero-sized fragment.
     468              :   DbgVariableFragmentInfo getFragmentOrEntireVariable() const {
     469              :     if (auto Frag = getFragment())
     470              :       return *Frag;
     471              :     if (auto Sz = getFragmentSizeInBits())
     472              :       return {*Sz, 0};
     473              :     return {0, 0};
     474              :   }
     475              :   /// Get the size (in bits) of the variable, or fragment of the variable that
     476              :   /// is described.
     477              :   std::optional<uint64_t> getFragmentSizeInBits() const;
     478              : 
     479              :   bool isEquivalentTo(const DbgVariableRecord &Other) const {
     480              :     return DbgLoc == Other.DbgLoc && isIdenticalToWhenDefined(Other);
     481              :   }
     482              :   // Matches the definition of the Instruction version, equivalent to above but
     483              :   // without checking DbgLoc.
     484              :   bool isIdenticalToWhenDefined(const DbgVariableRecord &Other) const {
     485              :     return std::tie(Type, DebugValues, Variable, Expression,
     486              :                     AddressExpression) ==
     487              :            std::tie(Other.Type, Other.DebugValues, Other.Variable,
     488              :                     Other.Expression, Other.AddressExpression);
     489              :   }
     490              : 
     491              :   /// @name DbgAssign Methods
     492              :   /// @{
     493              :   bool isDbgAssign() const { return getType() == LocationType::Assign; }
     494              : 
     495              :   Value *getAddress() const;
     496              :   Metadata *getRawAddress() const {
     497              :     return isDbgAssign() ? DebugValues[1] : DebugValues[0];
     498              :   }
     499              :   Metadata *getRawAssignID() const { return DebugValues[2]; }
     500              :   DIAssignID *getAssignID() const;
     501              :   DIExpression *getAddressExpression() const { return AddressExpression.get(); }
     502              :   MDNode *getRawAddressExpression() const {
     503              :     return AddressExpression.getAsMDNode();
     504              :   }
     505              :   void setAddressExpression(DIExpression *NewExpr) {
     506              :     AddressExpression = NewExpr;
     507              :   }
     508              :   void setAssignId(DIAssignID *New);
     509              :   void setAddress(Value *V) { resetDebugValue(1, ValueAsMetadata::get(V)); }
     510              :   /// Kill the address component.
     511              :   void setKillAddress();
     512              :   /// Check whether this kills the address component. This doesn't take into
     513              :   /// account the position of the intrinsic, therefore a returned value of false
     514              :   /// does not guarentee the address is a valid location for the variable at the
     515              :   /// intrinsic's position in IR.
     516              :   bool isKillAddress() const;
     517              : 
     518              :   /// @}
     519              : 
     520              :   DbgVariableRecord *clone() const;
     521              :   /// Convert this DbgVariableRecord back into a dbg.value intrinsic.
     522              :   /// \p InsertBefore Optional position to insert this intrinsic.
     523              :   /// \returns A new dbg.value intrinsic representiung this DbgVariableRecord.
     524              :   DbgVariableIntrinsic *createDebugIntrinsic(Module *M,
     525              :                                              Instruction *InsertBefore) const;
     526              : 
     527              :   /// Handle changes to the location of the Value(s) that we refer to happening
     528              :   /// "under our feet".
     529              :   void handleChangedLocation(Metadata *NewLocation);
     530              : 
     531              :   void print(raw_ostream &O, bool IsForDebug = false) const;
     532              :   void print(raw_ostream &ROS, ModuleSlotTracker &MST, bool IsForDebug) const;
     533              : 
     534              :   /// Support type inquiry through isa, cast, and dyn_cast.
     535            0 :   static bool classof(const DbgRecord *E) {
     536            0 :     return E->getRecordKind() == ValueKind;
     537              :   }
     538              : };
     539              : 
     540              : /// Filter the DbgRecord range to DbgVariableRecord types only and downcast.
     541              : static inline auto
     542              : filterDbgVars(iterator_range<simple_ilist<DbgRecord>::iterator> R) {
     543              :   return map_range(
     544              :       make_filter_range(R,
     545            0 :                         [](DbgRecord &E) { return isa<DbgVariableRecord>(E); }),
     546              :       [](DbgRecord &E) { return std::ref(cast<DbgVariableRecord>(E)); });
     547              : }
     548              : 
     549              : /// Per-instruction record of debug-info. If an Instruction is the position of
     550              : /// some debugging information, it points at a DbgMarker storing that info. Each
     551              : /// marker points back at the instruction that owns it. Various utilities are
     552              : /// provided for manipulating the DbgRecords contained within this marker.
     553              : ///
     554              : /// This class has a rough surface area, because it's needed to preserve the
     555              : /// one arefact that we can't yet eliminate from the intrinsic / dbg.value
     556              : /// debug-info design: the order of records is significant, and duplicates can
     557              : /// exist. Thus, if one has a run of debug-info records such as:
     558              : ///    dbg.value(...
     559              : ///    %foo = barinst
     560              : ///    dbg.value(...
     561              : /// and remove barinst, then the dbg.values must be preserved in the correct
     562              : /// order. Hence, the use of iterators to select positions to insert things
     563              : /// into, or the occasional InsertAtHead parameter indicating that new records
     564              : /// should go at the start of the list.
     565              : ///
     566              : /// There are only five or six places in LLVM that truly rely on this ordering,
     567              : /// which we can improve in the future. Additionally, many improvements in the
     568              : /// way that debug-info is stored can be achieved in this class, at a future
     569              : /// date.
     570              : class DbgMarker {
     571              : public:
     572              :   DbgMarker() {}
     573              :   /// Link back to the Instruction that owns this marker. Can be null during
     574              :   /// operations that move a marker from one instruction to another.
     575              :   Instruction *MarkedInstr = nullptr;
     576              : 
     577              :   /// List of DbgRecords, the non-instruction equivalent of llvm.dbg.*
     578              :   /// intrinsics. There is a one-to-one relationship between each debug
     579              :   /// intrinsic in a block and each DbgRecord once the representation has been
     580              :   /// converted, and the ordering is meaningful in the same way.
     581              :   simple_ilist<DbgRecord> StoredDbgRecords;
     582              :   bool empty() const { return StoredDbgRecords.empty(); }
     583              : 
     584              :   const BasicBlock *getParent() const;
     585              :   BasicBlock *getParent();
     586              : 
     587              :   /// Handle the removal of a marker: the position of debug-info has gone away,
     588              :   /// but the stored debug records should not. Drop them onto the next
     589              :   /// instruction, or otherwise work out what to do with them.
     590              :   void removeMarker();
     591              :   void dump() const;
     592              : 
     593              :   void removeFromParent();
     594              :   void eraseFromParent();
     595              : 
     596              :   /// Implement operator<< on DbgMarker.
     597              :   void print(raw_ostream &O, bool IsForDebug = false) const;
     598              :   void print(raw_ostream &ROS, ModuleSlotTracker &MST, bool IsForDebug) const;
     599              : 
     600              :   /// Produce a range over all the DbgRecords in this Marker.
     601              :   iterator_range<simple_ilist<DbgRecord>::iterator> getDbgRecordRange();
     602              :   iterator_range<simple_ilist<DbgRecord>::const_iterator>
     603              :   getDbgRecordRange() const;
     604              :   /// Transfer any DbgRecords from \p Src into this DbgMarker. If \p
     605              :   /// InsertAtHead is true, place them before existing DbgRecords, otherwise
     606              :   /// afterwards.
     607              :   void absorbDebugValues(DbgMarker &Src, bool InsertAtHead);
     608              :   /// Transfer the DbgRecords in \p Range from \p Src into this DbgMarker. If
     609              :   /// \p InsertAtHead is true, place them before existing DbgRecords, otherwise
     610              :   // afterwards.
     611              :   void absorbDebugValues(iterator_range<DbgRecord::self_iterator> Range,
     612              :                          DbgMarker &Src, bool InsertAtHead);
     613              :   /// Insert a DbgRecord into this DbgMarker, at the end of the list. If
     614              :   /// \p InsertAtHead is true, at the start.
     615              :   void insertDbgRecord(DbgRecord *New, bool InsertAtHead);
     616              :   /// Insert a DbgRecord prior to a DbgRecord contained within this marker.
     617              :   void insertDbgRecord(DbgRecord *New, DbgRecord *InsertBefore);
     618              :   /// Insert a DbgRecord after a DbgRecord contained within this marker.
     619              :   void insertDbgRecordAfter(DbgRecord *New, DbgRecord *InsertAfter);
     620              :   /// Clone all DbgMarkers from \p From into this marker. There are numerous
     621              :   /// options to customise the source/destination, due to gnarliness, see class
     622              :   /// comment.
     623              :   /// \p FromHere If non-null, copy from FromHere to the end of From's
     624              :   /// DbgRecords
     625              :   /// \p InsertAtHead Place the cloned DbgRecords at the start of
     626              :   /// StoredDbgRecords
     627              :   /// \returns Range over all the newly cloned DbgRecords
     628              :   iterator_range<simple_ilist<DbgRecord>::iterator>
     629              :   cloneDebugInfoFrom(DbgMarker *From,
     630              :                      std::optional<simple_ilist<DbgRecord>::iterator> FromHere,
     631              :                      bool InsertAtHead = false);
     632              :   /// Erase all DbgRecords in this DbgMarker.
     633              :   void dropDbgRecords();
     634              :   /// Erase a single DbgRecord from this marker. In an ideal future, we would
     635              :   /// never erase an assignment in this way, but it's the equivalent to
     636              :   /// erasing a debug intrinsic from a block.
     637              :   void dropOneDbgRecord(DbgRecord *DR);
     638              : 
     639              :   /// We generally act like all llvm Instructions have a range of DbgRecords
     640              :   /// attached to them, but in reality sometimes we don't allocate the DbgMarker
     641              :   /// to save time and memory, but still have to return ranges of DbgRecords.
     642              :   /// When we need to describe such an unallocated DbgRecord range, use this
     643              :   /// static markers range instead. This will bite us if someone tries to insert
     644              :   /// a DbgRecord in that range, but they should be using the Official (TM) API
     645              :   /// for that.
     646              :   static DbgMarker EmptyDbgMarker;
     647              :   static iterator_range<simple_ilist<DbgRecord>::iterator>
     648              :   getEmptyDbgRecordRange() {
     649              :     return make_range(EmptyDbgMarker.StoredDbgRecords.end(),
     650              :                       EmptyDbgMarker.StoredDbgRecords.end());
     651              :   }
     652              : };
     653              : 
     654              : inline raw_ostream &operator<<(raw_ostream &OS, const DbgMarker &Marker) {
     655              :   Marker.print(OS);
     656              :   return OS;
     657              : }
     658              : 
     659              : /// Inline helper to return a range of DbgRecords attached to a marker. It needs
     660              : /// to be inlined as it's frequently called, but also come after the declaration
     661              : /// of DbgMarker. Thus: it's pre-declared by users like Instruction, then an
     662              : /// inlineable body defined here.
     663              : inline iterator_range<simple_ilist<DbgRecord>::iterator>
     664              : getDbgRecordRange(DbgMarker *DebugMarker) {
     665              :   if (!DebugMarker)
     666              :     return DbgMarker::getEmptyDbgRecordRange();
     667              :   return DebugMarker->getDbgRecordRange();
     668              : }
     669              : 
     670              : DEFINE_ISA_CONVERSION_FUNCTIONS(DbgRecord, LLVMDbgRecordRef)
     671              : 
     672              : /// Used to temporarily set the debug info format of a function, module, or
     673              : /// basic block for the duration of this object's lifetime, after which the
     674              : /// prior state will be restored.
     675              : template <typename T> class ScopedDbgInfoFormatSetter {
     676              :   T &Obj;
     677              :   bool OldState;
     678              : 
     679              : public:
     680              :   ScopedDbgInfoFormatSetter(T &Obj, bool NewState)
     681              :       : Obj(Obj), OldState(Obj.IsNewDbgInfoFormat) {
     682              :     Obj.setIsNewDbgInfoFormat(NewState);
     683              :   }
     684              :   ~ScopedDbgInfoFormatSetter() { Obj.setIsNewDbgInfoFormat(OldState); }
     685              : };
     686              : 
     687              : template <typename T>
     688              : ScopedDbgInfoFormatSetter(T &Obj,
     689              :                           bool NewState) -> ScopedDbgInfoFormatSetter<T>;
     690              : 
     691              : } // namespace llvm
     692              : 
     693              : #endif // LLVM_IR_DEBUGPROGRAMINSTRUCTION_H
        

Generated by: LCOV version 2.0-1