• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- llvm/GlobalObject.h - Class to represent global objects -*- 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 // This represents an independent object. That is, a function or a global
11 // variable, but not an alias.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_IR_GLOBALOBJECT_H
16 #define LLVM_IR_GLOBALOBJECT_H
17 
18 #include "llvm/IR/DerivedTypes.h"
19 #include "llvm/IR/GlobalValue.h"
20 
21 namespace llvm {
22 class Comdat;
23 class MDNode;
24 class Metadata;
25 class Module;
26 
27 class GlobalObject : public GlobalValue {
28   GlobalObject(const GlobalObject &) = delete;
29 
30 protected:
31   GlobalObject(Type *Ty, ValueTy VTy, Use *Ops, unsigned NumOps,
32                LinkageTypes Linkage, const Twine &Name,
33                unsigned AddressSpace = 0)
GlobalValue(Ty,VTy,Ops,NumOps,Linkage,Name,AddressSpace)34       : GlobalValue(Ty, VTy, Ops, NumOps, Linkage, Name, AddressSpace),
35         ObjComdat(nullptr) {
36     setGlobalValueSubClassData(0);
37   }
38 
39   std::string Section;     // Section to emit this into, empty means default
40   Comdat *ObjComdat;
41   enum {
42     LastAlignmentBit = 4,
43     HasMetadataHashEntryBit,
44 
45     GlobalObjectBits,
46   };
47   static const unsigned GlobalObjectSubClassDataBits =
48       GlobalValueSubClassDataBits - GlobalObjectBits;
49 
50 private:
51   static const unsigned AlignmentBits = LastAlignmentBit + 1;
52   static const unsigned AlignmentMask = (1 << AlignmentBits) - 1;
53   static const unsigned GlobalObjectMask = (1 << GlobalObjectBits) - 1;
54 
55 public:
getAlignment()56   unsigned getAlignment() const {
57     unsigned Data = getGlobalValueSubClassData();
58     unsigned AlignmentData = Data & AlignmentMask;
59     return (1u << AlignmentData) >> 1;
60   }
61   void setAlignment(unsigned Align);
62 
63   unsigned getGlobalObjectSubClassData() const;
64   void setGlobalObjectSubClassData(unsigned Val);
65 
hasSection()66   bool hasSection() const { return !getSection().empty(); }
getSection()67   StringRef getSection() const { return Section; }
68   void setSection(StringRef S);
69 
hasComdat()70   bool hasComdat() const { return getComdat() != nullptr; }
getComdat()71   const Comdat *getComdat() const { return ObjComdat; }
getComdat()72   Comdat *getComdat() { return ObjComdat; }
setComdat(Comdat * C)73   void setComdat(Comdat *C) { ObjComdat = C; }
74 
75   /// Check if this has any metadata.
hasMetadata()76   bool hasMetadata() const { return hasMetadataHashEntry(); }
77 
78   /// Get the current metadata attachments for the given kind, if any.
79   ///
80   /// These functions require that the function have at most a single attachment
81   /// of the given kind, and return \c nullptr if such an attachment is missing.
82   /// @{
83   MDNode *getMetadata(unsigned KindID) const;
84   MDNode *getMetadata(StringRef Kind) const;
85   /// @}
86 
87   /// Appends all attachments with the given ID to \c MDs in insertion order.
88   /// If the global has no attachments with the given ID, or if ID is invalid,
89   /// leaves MDs unchanged.
90   /// @{
91   void getMetadata(unsigned KindID, SmallVectorImpl<MDNode *> &MDs) const;
92   void getMetadata(StringRef Kind, SmallVectorImpl<MDNode *> &MDs) const;
93   /// @}
94 
95   /// Set a particular kind of metadata attachment.
96   ///
97   /// Sets the given attachment to \c MD, erasing it if \c MD is \c nullptr or
98   /// replacing it if it already exists.
99   /// @{
100   void setMetadata(unsigned KindID, MDNode *MD);
101   void setMetadata(StringRef Kind, MDNode *MD);
102   /// @}
103 
104   /// Add a metadata attachment.
105   /// @{
106   void addMetadata(unsigned KindID, MDNode &MD);
107   void addMetadata(StringRef Kind, MDNode &MD);
108   /// @}
109 
110   /// Appends all attachments for the global to \c MDs, sorting by attachment
111   /// ID. Attachments with the same ID appear in insertion order.
112   void
113   getAllMetadata(SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const;
114 
115   /// Erase all metadata attachments with the given kind.
116   void eraseMetadata(unsigned KindID);
117 
118   /// Copy metadata from Src, adjusting offsets by Offset.
119   void copyMetadata(const GlobalObject *Src, unsigned Offset);
120 
121   void addTypeMetadata(unsigned Offset, Metadata *TypeID);
122 
123   void copyAttributesFrom(const GlobalValue *Src) override;
124 
125   // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const Value * V)126   static inline bool classof(const Value *V) {
127     return V->getValueID() == Value::FunctionVal ||
128            V->getValueID() == Value::GlobalVariableVal;
129   }
130 
131   void clearMetadata();
132 
133 private:
hasMetadataHashEntry()134   bool hasMetadataHashEntry() const {
135     return getGlobalValueSubClassData() & (1 << HasMetadataHashEntryBit);
136   }
setHasMetadataHashEntry(bool HasEntry)137   void setHasMetadataHashEntry(bool HasEntry) {
138     unsigned Mask = 1 << HasMetadataHashEntryBit;
139     setGlobalValueSubClassData((~Mask & getGlobalValueSubClassData()) |
140                                (HasEntry ? Mask : 0u));
141   }
142 };
143 
144 } // End llvm namespace
145 
146 #endif
147