| //===-- llvm/GlobalObject.h - Class to represent global objects -*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This represents an independent object. That is, a function or a global | |
| // variable, but not an alias. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_IR_GLOBALOBJECT_H | |
| #define LLVM_IR_GLOBALOBJECT_H | |
| #include "llvm/ADT/StringRef.h" | |
| #include "llvm/IR/GlobalValue.h" | |
| #include "llvm/IR/Value.h" | |
| #include <string> | |
| #include <utility> | |
| namespace llvm { | |
| class Comdat; | |
| class MDNode; | |
| class Metadata; | |
| class GlobalObject : public GlobalValue { | |
| protected: | |
| GlobalObject(Type *Ty, ValueTy VTy, Use *Ops, unsigned NumOps, | |
| LinkageTypes Linkage, const Twine &Name, | |
| unsigned AddressSpace = 0) | |
| : GlobalValue(Ty, VTy, Ops, NumOps, Linkage, Name, AddressSpace), | |
| ObjComdat(nullptr) { | |
| setGlobalValueSubClassData(0); | |
| } | |
| std::string Section; // Section to emit this into, empty means default | |
| Comdat *ObjComdat; | |
| enum { | |
| LastAlignmentBit = 4, | |
| HasMetadataHashEntryBit, | |
| GlobalObjectBits, | |
| }; | |
| static const unsigned GlobalObjectSubClassDataBits = | |
| GlobalValueSubClassDataBits - GlobalObjectBits; | |
| private: | |
| static const unsigned AlignmentBits = LastAlignmentBit + 1; | |
| static const unsigned AlignmentMask = (1 << AlignmentBits) - 1; | |
| static const unsigned GlobalObjectMask = (1 << GlobalObjectBits) - 1; | |
| public: | |
| GlobalObject(const GlobalObject &) = delete; | |
| unsigned getAlignment() const { | |
| unsigned Data = getGlobalValueSubClassData(); | |
| unsigned AlignmentData = Data & AlignmentMask; | |
| return (1u << AlignmentData) >> 1; | |
| } | |
| void setAlignment(unsigned Align); | |
| unsigned getGlobalObjectSubClassData() const; | |
| void setGlobalObjectSubClassData(unsigned Val); | |
| bool hasSection() const { return !getSection().empty(); } | |
| StringRef getSection() const { return Section; } | |
| void setSection(StringRef S); | |
| bool hasComdat() const { return getComdat() != nullptr; } | |
| const Comdat *getComdat() const { return ObjComdat; } | |
| Comdat *getComdat() { return ObjComdat; } | |
| void setComdat(Comdat *C) { ObjComdat = C; } | |
| /// Check if this has any metadata. | |
| bool hasMetadata() const { return hasMetadataHashEntry(); } | |
| /// Get the current metadata attachments for the given kind, if any. | |
| /// | |
| /// These functions require that the function have at most a single attachment | |
| /// of the given kind, and return \c nullptr if such an attachment is missing. | |
| /// @{ | |
| MDNode *getMetadata(unsigned KindID) const; | |
| MDNode *getMetadata(StringRef Kind) const; | |
| /// @} | |
| /// Appends all attachments with the given ID to \c MDs in insertion order. | |
| /// If the global has no attachments with the given ID, or if ID is invalid, | |
| /// leaves MDs unchanged. | |
| /// @{ | |
| void getMetadata(unsigned KindID, SmallVectorImpl<MDNode *> &MDs) const; | |
| void getMetadata(StringRef Kind, SmallVectorImpl<MDNode *> &MDs) const; | |
| /// @} | |
| /// Set a particular kind of metadata attachment. | |
| /// | |
| /// Sets the given attachment to \c MD, erasing it if \c MD is \c nullptr or | |
| /// replacing it if it already exists. | |
| /// @{ | |
| void setMetadata(unsigned KindID, MDNode *MD); | |
| void setMetadata(StringRef Kind, MDNode *MD); | |
| /// @} | |
| /// Add a metadata attachment. | |
| /// @{ | |
| void addMetadata(unsigned KindID, MDNode &MD); | |
| void addMetadata(StringRef Kind, MDNode &MD); | |
| /// @} | |
| /// Appends all attachments for the global to \c MDs, sorting by attachment | |
| /// ID. Attachments with the same ID appear in insertion order. | |
| void | |
| getAllMetadata(SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const; | |
| /// Erase all metadata attachments with the given kind. | |
| void eraseMetadata(unsigned KindID); | |
| /// Copy metadata from Src, adjusting offsets by Offset. | |
| void copyMetadata(const GlobalObject *Src, unsigned Offset); | |
| void addTypeMetadata(unsigned Offset, Metadata *TypeID); | |
| void copyAttributesFrom(const GlobalValue *Src) override; | |
| // Methods for support type inquiry through isa, cast, and dyn_cast: | |
| static inline bool classof(const Value *V) { | |
| return V->getValueID() == Value::FunctionVal || | |
| V->getValueID() == Value::GlobalVariableVal; | |
| } | |
| void clearMetadata(); | |
| private: | |
| bool hasMetadataHashEntry() const { | |
| return getGlobalValueSubClassData() & (1 << HasMetadataHashEntryBit); | |
| } | |
| void setHasMetadataHashEntry(bool HasEntry) { | |
| unsigned Mask = 1 << HasMetadataHashEntryBit; | |
| setGlobalValueSubClassData((~Mask & getGlobalValueSubClassData()) | | |
| (HasEntry ? Mask : 0u)); | |
| } | |
| }; | |
| } // end namespace llvm | |
| #endif // LLVM_IR_GLOBALOBJECT_H |